From b3d375f19e05a41dc91cb599582b6834e03109d3 Mon Sep 17 00:00:00 2001 From: Jonathan Clem Date: Mon, 4 May 2020 14:29:37 -0400 Subject: [PATCH] Initial commit --- .babelrc | 14 + .dockerignore | 2 + .env.build.example | 1 + .env.example | 14 + .gitattributes | 1 + .github/workflows/db-migrate.yml | 25 + .github/workflows/deploy.yml | 24 + .github/workflows/fetch-recorded-data.yml | 39 + .github/workflows/lint.yml | 23 + .github/workflows/test.yml | 23 + .github/workflows/validate-models.yml | 21 + .gitignore | 7 + .vscode/settings.json | 16 + CODE_OF_CONDUCT.md | 128 + CONTRIBUTING.md | 35 + Dockerfile | 8 + LICENSE | 21 + PROJECT-INTENT.md | 26 + README.md | 181 + SECURITY.md | 3 + components/AppFrame.tsx | 17 + components/Button.module.css | 16 + components/Button.tsx | 18 + components/CaseSummary.tsx | 95 + components/ChartWrapper.tsx | 236 + components/Disclaimer.tsx | 48 + components/IncompleteSimulation.tsx | 17 + components/LocalDate.tsx | 18 + components/LocalTime.tsx | 18 + components/ModelInfo.module.css | 50 + components/ModelInfo.tsx | 56 + components/ModelSelect.tsx | 27 + components/NavBar.module.css | 16 + components/NavBar.tsx | 29 + components/OutboundLink.tsx | 11 + components/OutcomeChart/Interventions.tsx | 267 + components/OutcomeChart/LegendSparkline.tsx | 138 + components/OutcomeChart/OutcomeChart.tsx | 721 + .../OutcomeChart/OutcomeChartActual.tsx | 47 + components/OutcomeChart/OutcomeChartFlag.tsx | 47 + components/OutcomeChart/OutcomeChartHover.tsx | 98 + .../OutcomeChartInterventions.tsx | 38 + .../OutcomeChart/OutcomeChartLegendBlock.tsx | 123 + components/OutcomeChart/OutcomeChartLine.tsx | 88 + components/OutcomeChart/OutcomeChartXAxis.tsx | 74 + components/OutcomeChart/OutcomeChartYAxis.tsx | 66 + components/OutcomeChart/SVGLinePattern.tsx | 38 + components/OutcomeChart/chartColors.ts | 11 + components/ResultTable.module.css | 31 + components/ResultTable.tsx | 32 + components/ResultTables.tsx | 91 + components/ResultViewSettings.tsx | 61 + components/SimulationInputsTable.module.css | 37 + components/SimulationInputsTable.tsx | 80 + components/SimulationList.module.css | 66 + components/SimulationList.tsx | 80 + components/StatusBlock.module.css | 8 + components/StatusBlock.tsx | 18 + components/StatusIcon.module.css | 12 + components/StatusIcon.tsx | 41 + components/Table.module.css | 60 + components/Table.tsx | 19 + .../ApplicationComponent.module.css | 17 + .../simulation-form/ApplicationComponent.tsx | 14 + components/simulation-form/DateInput.tsx | 59 + components/simulation-form/ErrorMessage.tsx | 80 + .../simulation-form/FormSection.module.css | 29 + components/simulation-form/FormSection.tsx | 29 + .../simulation-form/Important.module.css | 6 + components/simulation-form/Important.tsx | 6 + .../InterventionGuidanceLink.module.css | 22 + .../InterventionGuidanceLink.tsx | 19 + .../InterventionPeriodSection.module.css | 106 + .../InterventionPeriodSection.tsx | 242 + .../NewSimulationForm.module.css | 31 + .../simulation-form/NewSimulationForm.tsx | 367 + .../simulation-form/RangeInput.module.css | 19 + components/simulation-form/RangeInput.tsx | 66 + .../StrategyConfiguration.module.css | 52 + .../SupportedParameters.module.css | 76 + .../simulation-form/SupportedParameters.tsx | 59 + components/styles/box.module.css | 15 + components/styles/button.module.css | 25 + components/styles/form.module.css | 26 + components/styles/select.module.css | 36 + components/table/TableHeader.tsx | 12 + css/app.css | 11 + data/hospitals/us.json | 563 + data/regions.json | 214 + data/result-stub.json | 16679 +++++++++++++++ database.json | 28 + default-contact-reduction.xlsx | Bin 0 -> 9774 bytes docker-compose.db.yml | 35 + docker-compose.yml | 42 + env.yml | 73 + hooks/use-abort.ts | 27 + hooks/use-safe-dimensions.ts | 21 + lib/BaltimoreCyberTrustRoot.crt.pem | 22 + lib/arrayMath.ts | 26 + lib/assertions.ts | 29 + lib/dateFunctions.ts | 50 + lib/db.ts | 512 + lib/default-contact-reduction.ts | 108 + lib/github.ts | 92 + lib/handle-error.ts | 32 + lib/logging.ts | 55 + lib/models.ts | 54 + lib/mysql.ts | 70 + lib/new-simulation-state.ts | 405 + lib/redirect.ts | 18 + lib/regionEmoji.ts | 9 + lib/sentry.ts | 97 + lib/session.ts | 125 + lib/simulation-schema.ts | 105 + lib/simulation-types.ts | 69 + migrations/.gitkeep | 0 ...331170118-create-simulations-runs-table.js | 59 + .../20200331210801-create-locations-table.js | 53 + ...dd-github-user-login-to-simulation-runs.js | 59 + ...9-drop-location-id-from-simulation-runs.js | 59 + .../20200402165728-create-regions-table.js | 59 + ...d-iso-region-columns-to-simulation-runs.js | 59 + .../20200402172411-drop-locations-table.js | 59 + .../20200402181839-insert-default-region.js | 59 + ...-add-workflow-run-id-to-simulation-runs.js | 53 + ...github-user-id-index-to-simulation-runs.js | 53 + migrations/20200406180709-rename-uk-to-gb.js | 53 + .../20200406183238-create-authorized-users.js | 53 + .../20200406191215-insert-us-subregions.js | 53 + migrations/20200406222239-insert-ak-hi.js | 53 + .../20200407175551-create-case-data-table.js | 53 + ...41342-add-model-runs-to-simulation-runs.js | 53 + ...416174456-add-admin-to-authorized-users.js | 53 + ...21201526-add-config-to-authorized-users.js | 53 + ...0422153859-add-label-to-simulation-runs.js | 59 + ...27195151-create-intervention-data-table.js | 56 + .../20200430164001-add-new-europe-regions.js | 53 + ...118-create-simulations-runs-table-down.sql | 1 + ...70118-create-simulations-runs-table-up.sql | 22 + ...0331210801-create-locations-table-down.sql | 1 + ...200331210801-create-locations-table-up.sql | 12 + ...hub-user-login-to-simulation-runs-down.sql | 1 + ...ithub-user-login-to-simulation-runs-up.sql | 1 + ...-location-id-from-simulation-runs-down.sql | 1 + ...op-location-id-from-simulation-runs-up.sql | 1 + ...200402165728-create-regions-table-down.sql | 1 + ...20200402165728-create-regions-table-up.sql | 9 + ...region-columns-to-simulation-runs-down.sql | 5 + ...o-region-columns-to-simulation-runs-up.sql | 7 + ...200402172411-drop-locations-table-down.sql | 12 + ...20200402172411-drop-locations-table-up.sql | 1 + ...00402181839-insert-default-region-down.sql | 1 + ...0200402181839-insert-default-region-up.sql | 1 + ...orkflow-run-id-to-simulation-runs-down.sql | 1 + ...-workflow-run-id-to-simulation-runs-up.sql | 1 + ...-user-id-index-to-simulation-runs-down.sql | 1 + ...ub-user-id-index-to-simulation-runs-up.sql | 1 + .../20200406180709-rename-uk-to-gb-down.sql | 1 + .../20200406180709-rename-uk-to-gb-up.sql | 1 + ...406183238-create-authorized-users-down.sql | 1 + ...00406183238-create-authorized-users-up.sql | 6 + ...200406191215-insert-us-subregions-down.sql | 1 + ...20200406191215-insert-us-subregions-up.sql | 51 + .../sqls/20200406222239-insert-ak-hi-down.sql | 1 + .../sqls/20200406222239-insert-ak-hi-up.sql | 3 + ...0407175551-create-case-data-table-down.sql | 1 + ...200407175551-create-case-data-table-up.sql | 14 + ...add-model-runs-to-simulation-runs-down.sql | 21 + ...2-add-model-runs-to-simulation-runs-up.sql | 14 + ...456-add-admin-to-authorized-users-down.sql | 1 + ...74456-add-admin-to-authorized-users-up.sql | 1 + ...26-add-config-to-authorized-users-down.sql | 1 + ...1526-add-config-to-authorized-users-up.sql | 1 + ...3859-add-label-to-simulation-runs-down.sql | 1 + ...153859-add-label-to-simulation-runs-up.sql | 1 + ...51-create-intervention-data-table-down.sql | 1 + ...5151-create-intervention-data-table-up.sql | 17 + ...0430164001-add-new-europe-regions-down.sql | 42 + ...200430164001-add-new-europe-regions-up.sql | 41 + models.yml | 55 + next-env.d.ts | 2 + next.config.js | 80 + now.json | 38 + now.prod.json | 38 + package-lock.json | 16768 ++++++++++++++++ package.json | 177 + pages/_app.tsx | 101 + pages/_document.tsx | 19 + pages/about.module.css | 30 + pages/about.tsx | 98 + pages/api/callback.ts | 69 + pages/api/login.ts | 24 + pages/api/logout.ts | 15 + pages/api/simulations/[id]/case-summary.ts | 106 + pages/api/simulations/[id]/download.ts | 68 + pages/api/simulations/[id]/index.ts | 59 + pages/api/simulations/index.ts | 137 + pages/api/types/async-next-api-handler.ts | 5 + pages/api/user/accept-disclaimer.ts | 17 + pages/api/util/blob-storage.ts | 41 + pages/api/util/dispatch.ts | 57 + pages/api/util/require-session.ts | 16 + pages/index.module.css | 17 + pages/index.tsx | 20 + pages/logout.tsx | 11 + pages/meta/_boom.tsx | 100 + pages/simulations/[id].tsx | 322 + pages/simulations/index.module.css | 9 + pages/simulations/index.tsx | 62 + pages/simulations/new.module.css | 77 + pages/simulations/new.tsx | 43 + pages/simulations/simulation.module.css | 65 + pages/unauthorized.tsx | 14 + postcss.config.js | 16 + public/images/google.png | Bin 0 -> 1236 bytes script/authorize-local-user | 14 + script/db-console | 5 + script/db-create | 5 + script/db-migrate | 5 + script/fetch-recorded-data | 282 + script/server | 5 + script/setup | 95 + script/staging-alias | 5 + svg/Check.svg | 3 + svg/Chevron.svg | 3 + svg/CircleCheck.svg | 3 + svg/Clock.svg | 4 + svg/Code.svg | 3 + svg/Cross.svg | 3 + svg/Descartes.svg | 8 + svg/Dot.svg | 1 + svg/Download.svg | 3 + svg/Failure.svg | 4 + svg/Fork.svg | 3 + svg/GitHub.svg | 3 + svg/Info.svg | 3 + svg/Link.svg | 3 + svg/Plus.svg | 4 + svg/Pushpin.svg | 7 + svg/Share.svg | 3 + svg/SocialDistancingGraphic.svg | 17 + svg/StatusSpinner.svg | 4 + svg/Success.svg | 3 + svg/Trash.svg | 3 + svg/Unacast.svg | 22 + svg/Warn.svg | 3 + svg/Zip.svg | 3 + tailwind.config.js | 102 + test/dateFunctions.test.ts | 73 + test/new-simulation-state.test.ts | 337 + test/tsconfig.json | 5 + tsconfig.json | 20 + types/case-data.ts | 12 + types/hospital-data.ts | 12 + types/index.d.ts | 1 + types/model-runner.ts | 149 + types/regions.d.ts | 41 + 257 files changed, 46187 insertions(+) create mode 100644 .babelrc create mode 100644 .dockerignore create mode 100644 .env.build.example create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .github/workflows/db-migrate.yml create mode 100644 .github/workflows/deploy.yml create mode 100644 .github/workflows/fetch-recorded-data.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/test.yml create mode 100644 .github/workflows/validate-models.yml create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 PROJECT-INTENT.md create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 components/AppFrame.tsx create mode 100644 components/Button.module.css create mode 100644 components/Button.tsx create mode 100644 components/CaseSummary.tsx create mode 100644 components/ChartWrapper.tsx create mode 100644 components/Disclaimer.tsx create mode 100644 components/IncompleteSimulation.tsx create mode 100644 components/LocalDate.tsx create mode 100644 components/LocalTime.tsx create mode 100644 components/ModelInfo.module.css create mode 100644 components/ModelInfo.tsx create mode 100644 components/ModelSelect.tsx create mode 100644 components/NavBar.module.css create mode 100644 components/NavBar.tsx create mode 100644 components/OutboundLink.tsx create mode 100644 components/OutcomeChart/Interventions.tsx create mode 100644 components/OutcomeChart/LegendSparkline.tsx create mode 100644 components/OutcomeChart/OutcomeChart.tsx create mode 100644 components/OutcomeChart/OutcomeChartActual.tsx create mode 100644 components/OutcomeChart/OutcomeChartFlag.tsx create mode 100644 components/OutcomeChart/OutcomeChartHover.tsx create mode 100644 components/OutcomeChart/OutcomeChartInterventions.tsx create mode 100644 components/OutcomeChart/OutcomeChartLegendBlock.tsx create mode 100644 components/OutcomeChart/OutcomeChartLine.tsx create mode 100644 components/OutcomeChart/OutcomeChartXAxis.tsx create mode 100644 components/OutcomeChart/OutcomeChartYAxis.tsx create mode 100644 components/OutcomeChart/SVGLinePattern.tsx create mode 100644 components/OutcomeChart/chartColors.ts create mode 100644 components/ResultTable.module.css create mode 100644 components/ResultTable.tsx create mode 100644 components/ResultTables.tsx create mode 100644 components/ResultViewSettings.tsx create mode 100644 components/SimulationInputsTable.module.css create mode 100644 components/SimulationInputsTable.tsx create mode 100644 components/SimulationList.module.css create mode 100644 components/SimulationList.tsx create mode 100644 components/StatusBlock.module.css create mode 100644 components/StatusBlock.tsx create mode 100644 components/StatusIcon.module.css create mode 100644 components/StatusIcon.tsx create mode 100644 components/Table.module.css create mode 100644 components/Table.tsx create mode 100644 components/simulation-form/ApplicationComponent.module.css create mode 100644 components/simulation-form/ApplicationComponent.tsx create mode 100644 components/simulation-form/DateInput.tsx create mode 100644 components/simulation-form/ErrorMessage.tsx create mode 100644 components/simulation-form/FormSection.module.css create mode 100644 components/simulation-form/FormSection.tsx create mode 100644 components/simulation-form/Important.module.css create mode 100644 components/simulation-form/Important.tsx create mode 100644 components/simulation-form/InterventionGuidanceLink.module.css create mode 100644 components/simulation-form/InterventionGuidanceLink.tsx create mode 100644 components/simulation-form/InterventionPeriodSection.module.css create mode 100644 components/simulation-form/InterventionPeriodSection.tsx create mode 100644 components/simulation-form/NewSimulationForm.module.css create mode 100644 components/simulation-form/NewSimulationForm.tsx create mode 100644 components/simulation-form/RangeInput.module.css create mode 100644 components/simulation-form/RangeInput.tsx create mode 100644 components/simulation-form/StrategyConfiguration.module.css create mode 100644 components/simulation-form/SupportedParameters.module.css create mode 100644 components/simulation-form/SupportedParameters.tsx create mode 100644 components/styles/box.module.css create mode 100644 components/styles/button.module.css create mode 100644 components/styles/form.module.css create mode 100644 components/styles/select.module.css create mode 100644 components/table/TableHeader.tsx create mode 100644 css/app.css create mode 100644 data/hospitals/us.json create mode 100644 data/regions.json create mode 100644 data/result-stub.json create mode 100644 database.json create mode 100644 default-contact-reduction.xlsx create mode 100644 docker-compose.db.yml create mode 100644 docker-compose.yml create mode 100644 env.yml create mode 100644 hooks/use-abort.ts create mode 100644 hooks/use-safe-dimensions.ts create mode 100644 lib/BaltimoreCyberTrustRoot.crt.pem create mode 100644 lib/arrayMath.ts create mode 100644 lib/assertions.ts create mode 100644 lib/dateFunctions.ts create mode 100644 lib/db.ts create mode 100644 lib/default-contact-reduction.ts create mode 100644 lib/github.ts create mode 100644 lib/handle-error.ts create mode 100644 lib/logging.ts create mode 100644 lib/models.ts create mode 100644 lib/mysql.ts create mode 100644 lib/new-simulation-state.ts create mode 100644 lib/redirect.ts create mode 100644 lib/regionEmoji.ts create mode 100644 lib/sentry.ts create mode 100644 lib/session.ts create mode 100644 lib/simulation-schema.ts create mode 100644 lib/simulation-types.ts create mode 100644 migrations/.gitkeep create mode 100644 migrations/20200331170118-create-simulations-runs-table.js create mode 100644 migrations/20200331210801-create-locations-table.js create mode 100644 migrations/20200331233621-add-github-user-login-to-simulation-runs.js create mode 100644 migrations/20200402165609-drop-location-id-from-simulation-runs.js create mode 100644 migrations/20200402165728-create-regions-table.js create mode 100644 migrations/20200402165838-add-iso-region-columns-to-simulation-runs.js create mode 100644 migrations/20200402172411-drop-locations-table.js create mode 100644 migrations/20200402181839-insert-default-region.js create mode 100644 migrations/20200404153055-add-workflow-run-id-to-simulation-runs.js create mode 100644 migrations/20200406164833-add-github-user-id-index-to-simulation-runs.js create mode 100644 migrations/20200406180709-rename-uk-to-gb.js create mode 100644 migrations/20200406183238-create-authorized-users.js create mode 100644 migrations/20200406191215-insert-us-subregions.js create mode 100644 migrations/20200406222239-insert-ak-hi.js create mode 100644 migrations/20200407175551-create-case-data-table.js create mode 100644 migrations/20200415141342-add-model-runs-to-simulation-runs.js create mode 100644 migrations/20200416174456-add-admin-to-authorized-users.js create mode 100644 migrations/20200421201526-add-config-to-authorized-users.js create mode 100644 migrations/20200422153859-add-label-to-simulation-runs.js create mode 100644 migrations/20200427195151-create-intervention-data-table.js create mode 100644 migrations/20200430164001-add-new-europe-regions.js create mode 100644 migrations/sqls/20200331170118-create-simulations-runs-table-down.sql create mode 100644 migrations/sqls/20200331170118-create-simulations-runs-table-up.sql create mode 100644 migrations/sqls/20200331210801-create-locations-table-down.sql create mode 100644 migrations/sqls/20200331210801-create-locations-table-up.sql create mode 100644 migrations/sqls/20200331233621-add-github-user-login-to-simulation-runs-down.sql create mode 100644 migrations/sqls/20200331233621-add-github-user-login-to-simulation-runs-up.sql create mode 100644 migrations/sqls/20200402165609-drop-location-id-from-simulation-runs-down.sql create mode 100644 migrations/sqls/20200402165609-drop-location-id-from-simulation-runs-up.sql create mode 100644 migrations/sqls/20200402165728-create-regions-table-down.sql create mode 100644 migrations/sqls/20200402165728-create-regions-table-up.sql create mode 100644 migrations/sqls/20200402165838-add-iso-region-columns-to-simulation-runs-down.sql create mode 100644 migrations/sqls/20200402165838-add-iso-region-columns-to-simulation-runs-up.sql create mode 100644 migrations/sqls/20200402172411-drop-locations-table-down.sql create mode 100644 migrations/sqls/20200402172411-drop-locations-table-up.sql create mode 100644 migrations/sqls/20200402181839-insert-default-region-down.sql create mode 100644 migrations/sqls/20200402181839-insert-default-region-up.sql create mode 100644 migrations/sqls/20200404153055-add-workflow-run-id-to-simulation-runs-down.sql create mode 100644 migrations/sqls/20200404153055-add-workflow-run-id-to-simulation-runs-up.sql create mode 100644 migrations/sqls/20200406164833-add-github-user-id-index-to-simulation-runs-down.sql create mode 100644 migrations/sqls/20200406164833-add-github-user-id-index-to-simulation-runs-up.sql create mode 100644 migrations/sqls/20200406180709-rename-uk-to-gb-down.sql create mode 100644 migrations/sqls/20200406180709-rename-uk-to-gb-up.sql create mode 100644 migrations/sqls/20200406183238-create-authorized-users-down.sql create mode 100644 migrations/sqls/20200406183238-create-authorized-users-up.sql create mode 100644 migrations/sqls/20200406191215-insert-us-subregions-down.sql create mode 100644 migrations/sqls/20200406191215-insert-us-subregions-up.sql create mode 100644 migrations/sqls/20200406222239-insert-ak-hi-down.sql create mode 100644 migrations/sqls/20200406222239-insert-ak-hi-up.sql create mode 100644 migrations/sqls/20200407175551-create-case-data-table-down.sql create mode 100644 migrations/sqls/20200407175551-create-case-data-table-up.sql create mode 100644 migrations/sqls/20200415141342-add-model-runs-to-simulation-runs-down.sql create mode 100644 migrations/sqls/20200415141342-add-model-runs-to-simulation-runs-up.sql create mode 100644 migrations/sqls/20200416174456-add-admin-to-authorized-users-down.sql create mode 100644 migrations/sqls/20200416174456-add-admin-to-authorized-users-up.sql create mode 100644 migrations/sqls/20200421201526-add-config-to-authorized-users-down.sql create mode 100644 migrations/sqls/20200421201526-add-config-to-authorized-users-up.sql create mode 100644 migrations/sqls/20200422153859-add-label-to-simulation-runs-down.sql create mode 100644 migrations/sqls/20200422153859-add-label-to-simulation-runs-up.sql create mode 100644 migrations/sqls/20200427195151-create-intervention-data-table-down.sql create mode 100644 migrations/sqls/20200427195151-create-intervention-data-table-up.sql create mode 100644 migrations/sqls/20200430164001-add-new-europe-regions-down.sql create mode 100644 migrations/sqls/20200430164001-add-new-europe-regions-up.sql create mode 100644 models.yml create mode 100644 next-env.d.ts create mode 100644 next.config.js create mode 100644 now.json create mode 100644 now.prod.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pages/_app.tsx create mode 100644 pages/_document.tsx create mode 100644 pages/about.module.css create mode 100644 pages/about.tsx create mode 100644 pages/api/callback.ts create mode 100644 pages/api/login.ts create mode 100644 pages/api/logout.ts create mode 100644 pages/api/simulations/[id]/case-summary.ts create mode 100644 pages/api/simulations/[id]/download.ts create mode 100644 pages/api/simulations/[id]/index.ts create mode 100644 pages/api/simulations/index.ts create mode 100644 pages/api/types/async-next-api-handler.ts create mode 100644 pages/api/user/accept-disclaimer.ts create mode 100644 pages/api/util/blob-storage.ts create mode 100644 pages/api/util/dispatch.ts create mode 100644 pages/api/util/require-session.ts create mode 100644 pages/index.module.css create mode 100644 pages/index.tsx create mode 100644 pages/logout.tsx create mode 100644 pages/meta/_boom.tsx create mode 100644 pages/simulations/[id].tsx create mode 100644 pages/simulations/index.module.css create mode 100644 pages/simulations/index.tsx create mode 100644 pages/simulations/new.module.css create mode 100644 pages/simulations/new.tsx create mode 100644 pages/simulations/simulation.module.css create mode 100644 pages/unauthorized.tsx create mode 100644 postcss.config.js create mode 100644 public/images/google.png create mode 100755 script/authorize-local-user create mode 100755 script/db-console create mode 100755 script/db-create create mode 100755 script/db-migrate create mode 100755 script/fetch-recorded-data create mode 100755 script/server create mode 100755 script/setup create mode 100755 script/staging-alias create mode 100644 svg/Check.svg create mode 100644 svg/Chevron.svg create mode 100644 svg/CircleCheck.svg create mode 100644 svg/Clock.svg create mode 100644 svg/Code.svg create mode 100644 svg/Cross.svg create mode 100644 svg/Descartes.svg create mode 100644 svg/Dot.svg create mode 100644 svg/Download.svg create mode 100644 svg/Failure.svg create mode 100644 svg/Fork.svg create mode 100644 svg/GitHub.svg create mode 100644 svg/Info.svg create mode 100644 svg/Link.svg create mode 100644 svg/Plus.svg create mode 100644 svg/Pushpin.svg create mode 100644 svg/Share.svg create mode 100644 svg/SocialDistancingGraphic.svg create mode 100644 svg/StatusSpinner.svg create mode 100644 svg/Success.svg create mode 100644 svg/Trash.svg create mode 100644 svg/Unacast.svg create mode 100644 svg/Warn.svg create mode 100644 svg/Zip.svg create mode 100644 tailwind.config.js create mode 100644 test/dateFunctions.test.ts create mode 100644 test/new-simulation-state.test.ts create mode 100644 test/tsconfig.json create mode 100644 tsconfig.json create mode 100644 types/case-data.ts create mode 100644 types/hospital-data.ts create mode 100644 types/index.d.ts create mode 100644 types/model-runner.ts create mode 100644 types/regions.d.ts diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..0cae859 --- /dev/null +++ b/.babelrc @@ -0,0 +1,14 @@ +{ + "presets": [ + [ + "next/babel", + { + "preset-env": {}, + "transform-runtime": {}, + "styled-jsx": {}, + "class-properties": {} + } + ] + ], + "plugins": ["inline-react-svg"] +} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..55890fe --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +/.next/ +/node_modules/ diff --git a/.env.build.example b/.env.build.example new file mode 100644 index 0000000..691928d --- /dev/null +++ b/.env.build.example @@ -0,0 +1 @@ +GITHUB_CLIENT_ID=$LOCALHOST_GITHUB_CLIENT_ID diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9aabd19 --- /dev/null +++ b/.env.example @@ -0,0 +1,14 @@ +GITHUB_CLIENT_ID=$LOCALHOST_GITHUB_CLIENT_ID +GITHUB_CLIENT_SECRET=$LOCALHOST_GITHUB_CLIENT_SECRET +GITHUB_API_TOKEN=$GITHUB_PERSONAL_ACCESS_TOKEN_WITH_REPO_SCOPE +RUNNER_SHARED_SECRET=runner-shared-secret +RUNNER_CALLBACK_URL=$RUNNER_CALLBACK_PROXY_URL +CONTROL_REPO_NWO=covid-modeling/prod-covid19-control-plane +CONTROL_REPO_EVENT_TYPE=test-run-simulation +BLOB_STORAGE_ACCOUNT=$BLOB_STORAGE_ACCOUNT +BLOB_STORAGE_KEY=$BLOB_STORAGE_KEY +# Arbitrary session secret generated via `openssl rand -hex 32` +OAUTH_SECRET=9984beb4f8c53cea0dd4bb8c59c747f49bb5622d16dac8040228d2b0669c0385 +# Arbitrary session secret generated via `openssl rand -hex 32` +SESSION_SECRET=4afd67b10fadfa8d4216425343120541c5c65f23b1d188230bf32a97d1a54e15 +LOCAL_MODE=true diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..b4e0121 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +migrations/*.js linguist-generated=true diff --git a/.github/workflows/db-migrate.yml b/.github/workflows/db-migrate.yml new file mode 100644 index 0000000..f587de2 --- /dev/null +++ b/.github/workflows/db-migrate.yml @@ -0,0 +1,25 @@ +on: + repository_dispatch: + types: db-migrate + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: | + echo "Client Payload:" + echo '${{toJson(github.event.client_payload)}}' + - run: | + docker-compose -f docker-compose.yml -f docker-compose.db.yml run \ + -e DB_USERNAME="${{secrets.DB_USERNAME}}" \ + -e DB_PASSWORD="${{secrets.DB_PASSWORD}}" \ + -e DB_HOST="${{secrets.DB_HOST}}" \ + -e DB_DATABASE="${{secrets.DB_DATABASE}}" \ + -e DB_USERNAME_STAGING="${{secrets.DB_USERNAME_STAGING}}" \ + -e DB_PASSWORD_STAGING="${{secrets.DB_PASSWORD_STAGING}}" \ + -e DB_HOST_STAGING="${{secrets.DB_HOST_STAGING}}" \ + -e DB_DATABASE_STAGING="${{secrets.DB_DATABASE_STAGING}}" \ + db-migrate ${{github.event.client_payload.direction}} \ + --env ${{github.event.client_payload.env}} \ + --count ${{github.event.client_payload.count}} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..fdebbe4 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,24 @@ +on: + repository_dispatch: + types: deploy + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/cache@v1 + with: + path: ~/.npm + key: ${{runner.os}}-deploy-${{hashFiles('**/package-lock.json')}} + - run: npm ci + - run: | + mkdir .now + echo '{"projectId":"${{secrets.ZEIT_PROJECT_ID}}","orgId":"${{secrets.ZEIT_ORG_ID}}"}' > .now/project.json + - run: npx now --token ${{secrets.ZEIT_TOKEN}} -b GITHUB_SHA=${{github.sha}} --prod -A now.prod.json + - run: | + npx sentry-cli \ + --auth-token "${{secrets.SENTRY_AUTH_TOKEN}}" \ + releases --org github-disease-modelling \ + deploys "${{github.sha}}" \ + new -e production diff --git a/.github/workflows/fetch-recorded-data.yml b/.github/workflows/fetch-recorded-data.yml new file mode 100644 index 0000000..32ee208 --- /dev/null +++ b/.github/workflows/fetch-recorded-data.yml @@ -0,0 +1,39 @@ +on: + schedule: + # covidtracking.com updates at 4pm, we run at 5pm for some wiggle room. + - cron: '0 21 * * *' + repository_dispatch: + types: fetch-recorded-data + +jobs: + fetch-recorded-data: + name: Fetch recorded case and intervention data + runs-on: ubuntu-latest + env: + NODE_ENV: production + steps: + - uses: actions/checkout@v2 + - uses: actions/cache@v1 + with: + path: ~/.npm + key: ${{runner.os}}-deploy-${{hashFiles('**/package-lock.json')}} + - uses: actions/setup-node@v1 + with: + node-version: 13.x + - run: npm ci + - run: | + echo "Updating recorded data in staging database..." + script/fetch-recorded-data + env: + DB_USERNAME: ${{ secrets.DB_USERNAME_STAGING }} + DB_PASSWORD: ${{ secrets.DB_PASSWORD_STAGING }} + DB_HOST: ${{ secrets.DB_HOST_STAGING }} + DB_DATABASE: ${{ secrets.DB_DATABASE_STAGING }} + - run: | + echo "Updating recorded data in production database..." + script/fetch-recorded-data + env: + DB_USERNAME: ${{ secrets.DB_USERNAME }} + DB_PASSWORD: ${{ secrets.DB_PASSWORD }} + DB_HOST: ${{ secrets.DB_HOST }} + DB_DATABASE: ${{ secrets.DB_DATABASE }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..1ec6941 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,23 @@ +name: Lint + +on: + pull_request: + branches: master + +jobs: + lint: + name: Run lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/cache@v1 + with: + path: ~/.npm + key: ${{runner.os}}-deploy-${{hashFiles('**/package-lock.json')}} + - uses: actions/setup-node@v1 + with: + node-version: 13.x + - run: npm ci + - run: npx tsc --noEmit + - run: git fetch --no-tags --prune --depth=1 origin +refs/heads/master + - run: npx eslint $(git diff-index --name-only --diff-filter=AM origin/master -- "*.js" "*.jsx" "*.ts" "*.tsx") diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..461f244 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,23 @@ +name: Test + +on: + pull_request: + branches: master + +jobs: + lint: + name: Run Tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/cache@v1 + with: + path: ~/.npm + key: ${{runner.os}}-deploy-${{hashFiles('**/package-lock.json')}} + - uses: actions/setup-node@v1 + with: + node-version: 13.x + - run: npm ci + - run: npx tsc --noEmit + - run: git fetch --no-tags --prune --depth=1 origin +refs/heads/master + - run: npm test diff --git a/.github/workflows/validate-models.yml b/.github/workflows/validate-models.yml new file mode 100644 index 0000000..d09e348 --- /dev/null +++ b/.github/workflows/validate-models.yml @@ -0,0 +1,21 @@ +name: Validate Models + +on: + push: {branches: master} + pull_request: {branches: master} + +jobs: + validate_models: + name: Validate Models + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/cache@v1 + with: + path: ~/.npm + key: ${{runner.os}}-deploy-${{hashFiles('**/package-lock.json')}} + - run: npm ci + - run: | + npx ts-json-schema-generator -p lib/models.ts -t ModelMap -o schema.json + npx js-yaml models.yml > models.json + npx ajv validate -s schema.json -d models.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4fd2347 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/.next/ +/node_modules/ +!/.vscode/ +.now +.env +.env.build +now.local.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f9fa2f9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,16 @@ +{ + "editor.codeActionsOnSave": { + "source.organizeImports": true + }, + "editor.formatOnSave": true, + "files.exclude": { + "**/.next": true + }, + "search.exclude": { + "**/.next": true + }, + "files.watcherExclude": {}, + "prettier.semi": false, + "prettier.singleQuote": true, + "prettier.bracketSpacing": false +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..bb64741 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or + advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email + address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +opensource@github.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html]. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq]. Translations are available at +[https://www.contributor-covenant.org/translations]. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..330daa2 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,35 @@ +## Contributing + +[fork]: https://github.com/covid-modeling/web/fork +[pr]: https://github.com/covid-modeling/web/compare +[style]: https://github.com/google/gts +[code-of-conduct]: CODE_OF_CONDUCT.md + +Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. + +Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) to the public under the [MIT license](LICENSE). + +Please note that this project is released with a [Contributor Code of Conduct][code-of-conduct]. By participating in this project you agree to abide by its terms. + +## Submitting a pull request + +0. [Fork][fork] and clone the repository +1. Configure and install the dependencies. +2. Make sure the tests pass on your machine. +3. Create a new branch: `git checkout -b my-branch-name` +4. Make your change, add tests, and make sure the tests still pass +5. Push to your fork and [submit a pull request][pr] +6. Pat your self on the back and wait for your pull request to be reviewed and merged. + +Here are a few things you can do that will increase the likelihood of your pull request being accepted: + +- Follow the [style guide][style]. +- Write tests. +- Keep your change as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as separate pull requests. +- Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). + +## Resources + +- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) +- [Using Pull Requests](https://help.github.com/articles/about-pull-requests/) +- [GitHub Help](https://help.github.com) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..98384f6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM node:13-alpine + +WORKDIR /app +COPY script script +COPY package*.json ./ +RUN npm ci + +CMD ["npm", "run", "dev"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5b2d1ff --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 GitHub + +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/PROJECT-INTENT.md b/PROJECT-INTENT.md new file mode 100644 index 0000000..53d0c98 --- /dev/null +++ b/PROJECT-INTENT.md @@ -0,0 +1,26 @@ +# Covid modeling UI + +## What +The Covid modeling UI is a tool for policy makers to experiment with mitigation strategies, running each strategy through several models and comparing the projections. The mitigation strategies specify what policies are in force at any given time, and the models project the likely number of deaths, infections, hospitalisations and ICU use. + +## Why? +By examining the projections of multiple models, policy makers can gain an understanding of the level of uncertainty and divergence of expert opinion. In cases where models disagree, this can provide the basis for informed discussion between policy makers and epidemiologists on the deeper reasons for such discrepancies. + +## Who +The UI was originally designed in a collaboration between potential users, modeling experts, a team of engineers at GitHub, and the AI+Cloud strategy team at Microsoft. + +## Goals +The code is made available here to enable modelers to extend the breadth and depth of the information provided to policy makers, in particular by adding: +- models, to give the broadest coverage of epidemiological expertise, +- intervention types, such as various testing strategies and contact tracing, +- data sources for displaying “ground truth” alongside future projections, such as past intervention policies and mobility data, +- geographies not currently supported by the models that have already been integrated, +- ways to compare models, for example through new visualisations or by scoring their fit to the ground truth. + +We welcome contributions in all five of these areas. See [CONTRIBUTING.md](CONTRIBUTING.md). + +Currently the service running the simulations has restricted access because some of the simulations are compute-intensive to run. We are however firm believers in the need to share the data, and we’d therefore welcome contributions to make pre-computed projections for common scenarios visible to the general public. + + +## Non-goals +Of course there are other potential applications of this code, such as a more sophisticated UI for experts to experiment with all the advanced parameters of a particular model. We’d be glad to see those applications in forks of this repository. diff --git a/README.md b/README.md new file mode 100644 index 0000000..007f7e5 --- /dev/null +++ b/README.md @@ -0,0 +1,181 @@ +# GitHub COVID Modelling Web UI [![.github/workflows/deploy.yml](https://github.com/covid-modeling/web/workflows/.github/workflows/deploy.yml/badge.svg?branch=master)](https://github.com/covid-modeling/web/actions?query=branch%3Amaster) + +This is a [Next.js][nextjs] application that serves the GitHub +COVID modelling web interface. It is hosted on [Vercel][vercel]. + +The needs of the unified modelling project are changing rapidly, and so we do +not have a set-in-stone development roadmap. This application is built with +the goal of it hopefully being not too difficult to alter or even rewrite +parts of it as requirements change. + +To learn more about this project's goals, please see [PROJECT-INTENT.md](PROJECT-INTENT.md) + +## Local Development + +This app has two development modes: "local" and "advanced" mode. The "local" +mode is a much easier development setup, but does not actually queue +simulation runs with the development control plane. Instead, it uses a +stubbed result. The "advanced" mode is for maintainers only—it requires +access to some shared credentials and accounts. + +### Shared Setup (for both local and advanced modes) + +1. Install and start [Docker][docker]. +1. Get the [GitHub OAuth development app][oauth] client ID and secret. You'll be prompted for them shortly. +1. Clone this repository: + + ```shell + > git clone https://github.com/covid-modeling/web + > cd web + ``` + +1. Install dependencies: + + ```shell + > npm install + ``` + +### Local Mode Setup + +1. Run the environment setup script: + + ```shell + > script/setup + ``` + + This script will ask you a series of questions—you'll want to answer that + yes, you do want to run in local mode. + +1. Start the server: + + ```shell + > script/server + ``` + +1. Fetch case data: + + This script requires some environment variables (see + `script/fetch-recorded-data --help`), but if you've already got your .env + set up, you can run the script with [foreman][foreman] to avoid manually + setting them: + + ```shell + > npx foreman run script/fetch-recorded-data + ``` + +1. Authorize your local user to log in: + + ```shell + > script/authorize-local-user $my_github_username + ``` + +### Advanced Mode Setup (Maintainers Only) + +Advanced mode requires a number of secrets documented in [env.yml](env.yml), +whose development values can be accessed by following instructions in the +private [maintainers-only documentation][maintainer-docs]. + +1. Start an HTTP [ngrok proxy][ngrok] pointing to port 3000 and + note its URL (such as "https://e028f3f1.ngrok.io"): + + ```shell + > ngrok http 3000 + ``` + +1. Run the environment setup script: + + ```shell + > script/setup + ``` + + This script will ask you a series of questions—you'll want to answer that + no, you don't want to run in local mode. + + This script will now ask for a number of environment variables, each of + which can be accessed by following instructions in the [maintainer + docs][maintainer-docs]. + + It'll also ask you for a `RUNNER_CALLBACK_URL`, which should be the value of + your ngrok proxy. + +1. Start the server: + + ```shell + > script/server + ``` + +1. Fetch case data: + + This script requires some environment variables (see + `script/fetch-recorded-data --help`), but if you've already got your .env + set up, you can run the script with [foreman][foreman] to avoid manually + setting them: + + ```shell + > npx foreman run script/fetch-recorded-data + ``` + +1. Authorize your local user to log in: + + ```shell + > script/authorize-local-user $my_github_username + ``` + +### Database & Migrations + +In development, database migrations are run automatically when the web +container starts. + +To create a database migration: + +```shell +# Create a migration +> script/db-migrate create name-of-migration --sql-file +``` + +We pass the `--sql-file` here because we write migrations in plain SQL in +this project. + +### Environment Variables + +Environment variables are documented in [env.yml](env.yml). + +## Architecture + +- Pages are in `pages/{route}.tsx`. +- Components are in `components/{Component}.tsx`. +- API functions are in `pages/api/{route}.tsx`. + +### Useful Documentation + +- [Next.js pages](https://nextjs.org/docs/basic-features/pages) +- [Next.js API routes](https://nextjs.org/docs/api-routes/introduction) +- [Vercel serverless functions](https://zeit.co/docs/v2/serverless-functions/introduction) +- [Vercel environment variables and secrets](https://zeit.co/docs/v2/serverless-functions/env-and-secrets) +- [React documentation](https://reactjs.org/docs/getting-started.html) + +## Updating Case Data and Intervention Data + +The `case_data` and `intervention_data` tables are populated by the `fetch-recorded-data` script. +This is run nightly on staging and production. + +## Contributing + +We welcome contributions to this project from the community. See +[CONTRIBUTING.md](CONTRIBUTING.md). + +## License + +This project is licensed under the MIT license. See [LICENSE](LICENSE). + +[docker]: https://app.datadoghq.com/logs?saved_view=86476 +[dpx]: https://npm.im/dpx +[foreman]: https://npm.im/foreman +[maintainer-docs]: https://github.com/covid-modeling/project-docs-internal/blob/master/docs/web-operations.md +[nextjs]: https://nextjs.org +[ngrok]: https://ngrok.com/ +[oauth]: https://github.com/organizations/covid-modeling/settings/applications/1253529 +[prod]: https://covid-modeling.org +[staging]: https://staging.covid-modeling.org +[vercel]: https://vercel.com +[vercel-org]: https://zeit.co/covid-modeling diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..2218838 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,3 @@ +If you discover a security issue in this repo, please submit it through the [GitHub Security Bug Bounty](https://hackerone.com/github) + +Thanks for helping make Covid Modeling safe for everyone. diff --git a/components/AppFrame.tsx b/components/AppFrame.tsx new file mode 100644 index 0000000..6b9e30b --- /dev/null +++ b/components/AppFrame.tsx @@ -0,0 +1,17 @@ +import {PropsWithChildren} from 'react' +import NavBar from './NavBar' + +type Props = { + loggedIn: boolean +} + +export default function AppFrame(props: PropsWithChildren) { + return ( +
+
+ +
+
{props.children}
+
+ ) +} diff --git a/components/Button.module.css b/components/Button.module.css new file mode 100644 index 0000000..d4c516c --- /dev/null +++ b/components/Button.module.css @@ -0,0 +1,16 @@ +.Button { + @apply inline-block; +} + +.ButtonContent { + @apply flex items-center justify-center; + @apply bg-black; + @apply rounded; + @apply text-sm text-white; + + padding: 0.9rem 1rem; +} + +.Button svg { + @apply mr-4; +} diff --git a/components/Button.tsx b/components/Button.tsx new file mode 100644 index 0000000..0212e9e --- /dev/null +++ b/components/Button.tsx @@ -0,0 +1,18 @@ +import styles from './Button.module.css' + +type Props = { + icon?: JSX.Element + text: string + className?: string +} + +export default function Button(props: Props) { + return ( + + + {props.icon} + {props.text} + + + ) +} diff --git a/components/CaseSummary.tsx b/components/CaseSummary.tsx new file mode 100644 index 0000000..8bd2311 --- /dev/null +++ b/components/CaseSummary.tsx @@ -0,0 +1,95 @@ +import {AxiosError} from 'axios' +import useSWR from 'swr' +import models from '../lib/models' +import {CaseSummary as CaseSummaryType} from '../pages/api/simulations/[id]/case-summary' +import LocalDate from './LocalDate' +import StatusBlock from './StatusBlock' +import Table from './Table' + +type Props = { + simulationID: number +} + +export default function CaseSummary(props: Props) { + const {data, error} = useSWR, AxiosError>( + `/api/simulations/${props.simulationID}/case-summary`, + { + revalidateOnFocus: false, + revalidateOnReconnect: false + } + ) + + if (error) { + return ( +
+ +

+ Error loading simulation case summary. +

+
+
+ ) + } + + if (!data) { + return ( +
+ +

Loading simulation case summary...

+
+
+ ) + } + + return ( + + + + + {Object.keys(data).map(modelSlug => ( + + ))} + + + + + + + {Object.entries(data).map(([slug, summary]) => ( + + ))} + + + + + {Object.entries(data).map(([slug, summary]) => ( + + ))} + + + + + {Object.entries(data).map(([slug, summary]) => ( + + ))} + + + + + {Object.entries(data).map(([slug, summary]) => ( + + ))} + + + + + {Object.entries(data).map(([slug, summary]) => ( + + ))} + + +
Summary{models[modelSlug].name}
Cumulative confirmed cases{summary.cConf.toLocaleString()}
Cumulative hospitalizations{summary.cHosp.toLocaleString()}
Cumulative deaths{summary.cDeaths.toLocaleString()}
Peak deaths date + +
Peak daily deaths{summary.peakDailyDeath.toLocaleString()}
+ ) +} diff --git a/components/ChartWrapper.tsx b/components/ChartWrapper.tsx new file mode 100644 index 0000000..25891e1 --- /dev/null +++ b/components/ChartWrapper.tsx @@ -0,0 +1,236 @@ +import {DateTime} from 'luxon' +import {useMemo, useState} from 'react' +import {animated, useSpring} from 'react-spring' +import USCapacityData from '../data/hospitals/us.json' +import {cumsum, elementSum} from '../lib/arrayMath' +import {ModelRun, Simulation} from '../lib/db' +import {CaseData} from '../types/case-data' +import {ModelOutput, RunStatus, SeverityMetrics} from '../types/model-runner' +import ModelSelect from './ModelSelect' +import OutcomeChart, { + OutcomeChartConfiguration, + ScaleXDomainMonths, + ScaleYType +} from './OutcomeChart/OutcomeChart' +import ResultViewSettings from './ResultViewSettings' + +const AnimatedOutcomeChart = animated(OutcomeChart) + +export type ToggleGroupOption = { + label: string + value: number | string | null + disabled?: boolean +} + +interface Props { + regionID: string + regionName: string + subregionID: string | undefined + subregionName: string | undefined + simulation: Simulation + modelRun: ModelRun + result: ModelOutput + caseData: CaseData + onChangeModel: (slug: string) => void +} + +export default function ChartWrapper(props: Props) { + const {result} = props + + // figure out what timerange options to offer + const t0 = DateTime.fromISO(result.time.t0, {zone: 'utc'}) + const extentEnd = result.time.extent[1] + + // Figure out which time toggle options to offer + // and which to choose by default + const [timeToggleOptions, defaultTimeToggleValue]: [ + ToggleGroupOption[], + number | null + ] = useMemo(() => { + const tMaxEverything = t0.plus({days: extentEnd}) + const tMaxDiff = tMaxEverything.diff(t0, 'months') + const timeToggleOptions = [ + { + label: '6 Months', + value: 6, + disabled: tMaxDiff.months < 6 + }, + { + label: '12 Months', + value: 12, + disabled: tMaxDiff.months < 12 + }, + { + label: 'Full Range', + value: null, + disabled: false + } + ] + let defaultTimeToggleValue: number | null = null + // default to the first not-disabled one + for (const o of timeToggleOptions) { + if (!o.disabled) { + defaultTimeToggleValue = o.value as number | null + break + } + } + return [timeToggleOptions, defaultTimeToggleValue] + }, [t0, extentEnd]) + + const config: OutcomeChartConfiguration[][] = useMemo(() => { + let normalBedsCapacity, icuBedsCapacity + if (result.metadata.region === 'US' && result.metadata.subregion) { + const stateAbbr = result.metadata.subregion.slice(-2) + const state = USCapacityData.find(s => s.abbr === stateAbbr) + if (state) { + normalBedsCapacity = Math.floor( + (state.total_beds - state.icu_beds) * (1 - state.utilization) + ) + icuBedsCapacity = Math.floor(state.icu_beds * (1 - state.utilization)) + } + } + return [ + [ + { + title: 'Deaths', + color: 'black', + projected: { + values: 'incDeath', + cumulative: (metrics: SeverityMetrics) => cumsum(metrics.incDeath) + }, + actual: { + values: 'deaths', + cumulative: 'cumulativeDeaths' + } + } + ], + [ + { + title: 'Infections', + color: 'blue', + projected: { + values: (metrics: SeverityMetrics) => + elementSum([ + metrics.Mild, + metrics.ILI, + metrics.SARI, + metrics.Critical + ]), + cumulative: (metrics: SeverityMetrics) => + elementSum([ + metrics.cumMild, + metrics.cumILI, + metrics.cumSARI, + metrics.cumCritical + ]) + }, + actual: { + values: 'confirmed', + cumulative: 'cumulativeConfirmed', + name: 'Confirmed' + } + } + ], + [ + { + title: 'Normal Hospital Beds', + color: 'purple', + projected: { + values: (metrics: SeverityMetrics) => + elementSum([metrics.SARI, metrics.CritRecov]), + cumulative: (metrics: SeverityMetrics) => + elementSum([metrics.cumSARI, metrics.cumCritRecov]) + }, + capacity: normalBedsCapacity + }, + { + title: 'Intensive Care Beds', + color: 'orange', + projected: { + values: 'Critical', + cumulative: 'cumCritical' + }, + capacity: icuBedsCapacity + }, + { + title: 'Ventilators Required', + color: 'pink', + projected: { + values: (metrics: SeverityMetrics) => + metrics.Critical.map(m => m / 2), + cumulative: (metrics: SeverityMetrics) => + metrics.cumCritical.map(m => m / 2) + } + } + ] + ] + }, [result]) + + // Shared chart state + const [hoverX, setHoverX] = useState(null) + const [hoverInterventionIdx, setHoverIntervention] = useState( + null + ) + const [pinnedInterventionIdx, setPinnedIntervention] = useState< + number | null + >(null) + const [scaleYType, setScaleYType] = useState('linear') + const [cumulative, setCumulative] = useState(false) + const [scaleXDomainMonths, setScaleXDomainMonths] = useState< + ScaleXDomainMonths + >(defaultTimeToggleValue) + + const tMax = t0 + .plus( + scaleXDomainMonths + ? {months: scaleXDomainMonths} + : {days: result.time.extent[1]} + ) + .toMillis() + const {tMaxMillis} = useSpring({ + tMaxMillis: tMax + }) + + const sharedHandlerState = { + hoverX, + onHoverX: setHoverX, + hoverInterventionIdx, + onHoverIntervention: setHoverIntervention, + pinnedInterventionIdx, + onPinIntervention: setPinnedIntervention, + scaleYType, + cumulative, + scaleXDomainMonths + } + + return ( +
+
+ r.model_slug)} + onChange={props.onChangeModel} + /> + + +
+ + +
+ ) +} diff --git a/components/Disclaimer.tsx b/components/Disclaimer.tsx new file mode 100644 index 0000000..e0f2944 --- /dev/null +++ b/components/Disclaimer.tsx @@ -0,0 +1,48 @@ +import Axios from 'axios' +import {useRouter} from 'next/router' +import {useContext, useState} from 'react' +import {SentryContext} from '../pages/_app' +import CircleCheck from '../svg/CircleCheck.svg' +import btnStyles from './styles/button.module.css' + +export default function Disclaimer() { + const router = useRouter() + const {captureException} = useContext(SentryContext) + const [error, setError] = useState(null) + + // TODO: Currently this is only a UI block—the API will still return results. + const acceptDisclaimer = async () => { + try { + setError(null) + await Axios.post('/api/user/accept-disclaimer') + router.reload() + } catch (err) { + captureException(err) + setError('An unexpected error occurred.') + } + } + + return ( +
+ {error ?

{error}

: null} +

+ These results are based on simulations from different modeling groups. + Results are subject to change as real world situations change over time and more data is available. + These results are not medical predictors and are provided as-is. + The models themselves, their underlying assumptions, and their weaknesses + should be reviewed carefully before making any decisions. +

+ + +
+ ) +} diff --git a/components/IncompleteSimulation.tsx b/components/IncompleteSimulation.tsx new file mode 100644 index 0000000..83a5aab --- /dev/null +++ b/components/IncompleteSimulation.tsx @@ -0,0 +1,17 @@ +import {RunStatus} from '../types/model-runner' +import StatusBlock from './StatusBlock' + +interface Props { + status: RunStatus.Pending | RunStatus.InProgress | RunStatus.Failed + title: string + message: string +} + +export default function IncompleteSimulation(props: Props) { + return ( + +

{props.title}

+

{props.message}

+
+ ) +} diff --git a/components/LocalDate.tsx b/components/LocalDate.tsx new file mode 100644 index 0000000..062f6ad --- /dev/null +++ b/components/LocalDate.tsx @@ -0,0 +1,18 @@ +import {DateTime} from 'luxon' +import {ISODate} from '../types/model-runner' + +type Props = { + isoDate: ISODate +} + +export default function LocalDate(props: Props) { + return ( + + ) +} diff --git a/components/LocalTime.tsx b/components/LocalTime.tsx new file mode 100644 index 0000000..e608af0 --- /dev/null +++ b/components/LocalTime.tsx @@ -0,0 +1,18 @@ +type Props = { + time: Date + options?: Intl.DateTimeFormatOptions +} + +export default function LocalTime(props: Props) { + return ( + + ) +} diff --git a/components/ModelInfo.module.css b/components/ModelInfo.module.css new file mode 100644 index 0000000..0e90c7e --- /dev/null +++ b/components/ModelInfo.module.css @@ -0,0 +1,50 @@ +.largecontainer { + @apply flex flex-col; + @apply mr-6; + @apply p-4; + @apply w-full; + @apply rounded; + @apply border; + @apply shadow-sm; + min-height: 310px; + background-image: linear-gradient(180deg, #ffffff 0%, #fbfbfc 100%); +} + +.minimalcontainer { + @apply flex; + @apply mr-6; + @apply w-full; +} + +.container:nth-child(2) { + @apply mr-0; +} + +.container h1, +.container h2 { + @apply leading-relaxed; +} + +.container p { + @apply flex-1; + @apply mt-4; + @apply text-sm; + color: #2f3037; +} + +.largecontainer .links { + @apply mt-12; +} + +.container .links a { + @apply mr-4; + @apply inline-block; +} +.container .links a svg { + @apply mr-3; + @apply inline; + @apply relative; + @apply align-middle; + bottom: 1px; + color: #9194a1; +} diff --git a/components/ModelInfo.tsx b/components/ModelInfo.tsx new file mode 100644 index 0000000..b39b1a0 --- /dev/null +++ b/components/ModelInfo.tsx @@ -0,0 +1,56 @@ +import {MinimalModelSpec, ModelSpec} from '../lib/models' +import Code from '../svg/Code.svg' +import Link from '../svg/Link.svg' +import styles from './ModelInfo.module.css' +import OutboundLink from './OutboundLink' +import btnStyles from './styles/button.module.css' + +type Props = { + modelSpec: ModelSpec | MinimalModelSpec + minimal?: boolean +} + +export default function ModelInfo(props: Props) { + const spec = props.modelSpec + const fullSpec = spec as ModelSpec + const links = spec.metaURLs + + return ( +
+ {!props.minimal && ( + <> +

{fullSpec.name}

+

{fullSpec.origin}

+

{fullSpec.description}

+ + )} + +
+ {links?.paper ? ( + + + Read the paper + + ) : null} + + {links?.website ? ( + + + Website + + ) : null} + + {links?.code ? ( + + + Code + + ) : null} +
+
+ ) +} diff --git a/components/ModelSelect.tsx b/components/ModelSelect.tsx new file mode 100644 index 0000000..594ccbb --- /dev/null +++ b/components/ModelSelect.tsx @@ -0,0 +1,27 @@ +import models from '../lib/models' +import selectStyle from './styles/select.module.css' + +type Props = { + modelSlug: keyof typeof models + modelOpts: (keyof typeof models)[] + onChange: (modelSlug: string) => void +} + +export default function ModelSelect(props: Props) { + return ( + + ) +} diff --git a/components/NavBar.module.css b/components/NavBar.module.css new file mode 100644 index 0000000..21b8735 --- /dev/null +++ b/components/NavBar.module.css @@ -0,0 +1,16 @@ +.NavBar { + @apply flex items-center; + @apply h-14 w-full; + @apply px-8; + @apply bg-black; + @apply text-sm text-white; +} + +.NavBar h1 { + @apply uppercase; + @apply mr-5; +} + +.NavBarContent { + @apply flex-1; +} diff --git a/components/NavBar.tsx b/components/NavBar.tsx new file mode 100644 index 0000000..c2479b3 --- /dev/null +++ b/components/NavBar.tsx @@ -0,0 +1,29 @@ +import Link from 'next/link' +import {PropsWithChildren} from 'react' +import styles from './NavBar.module.css' + +type Props = { + loggedIn: boolean +} + +export default function NavBar(props: PropsWithChildren) { + return ( +
+

+ + Covid Simulator + +

+ +
{props.children}
+ +

+ + About + +

+ + {props.loggedIn && Log out} +
+ ) +} diff --git a/components/OutboundLink.tsx b/components/OutboundLink.tsx new file mode 100644 index 0000000..fb74254 --- /dev/null +++ b/components/OutboundLink.tsx @@ -0,0 +1,11 @@ +import {PropsWithChildren} from 'react' + +type Props = Omit + +const OutboundLink = (props: PropsWithChildren) => ( + + {props.children} + +) + +export default OutboundLink diff --git a/components/OutcomeChart/Interventions.tsx b/components/OutcomeChart/Interventions.tsx new file mode 100644 index 0000000..78970a8 --- /dev/null +++ b/components/OutcomeChart/Interventions.tsx @@ -0,0 +1,267 @@ +import {DateTime} from 'luxon' +import React, {FunctionComponent, useMemo} from 'react' +import {Intervention} from './OutcomeChart' + +type InterventionsProps = { + interventions: Intervention[] + trackHeight: number + scaleX: d3.ScaleTime + hoverDate: DateTime + pinnedInterventionIdx: number | null + hoverInterventionIdx: number | null + height: number + width: number + chartsHeight: number +} + +const Interventions: FunctionComponent = ({ + interventions, + trackHeight, + scaleX, + hoverDate, + pinnedInterventionIdx, + hoverInterventionIdx, + height, + width, + chartsHeight +}) => { + const separators = useMemo( + () => ( + + {interventions.map((i, idx) => { + const y = chartsHeight + idx * trackHeight + return ( + + ) + })} + + ), + [interventions, width, chartsHeight, trackHeight] + ) + + const hoverLine = useMemo(() => { + const hoverDateX = scaleX(hoverDate) + return ( + + ) + }, [scaleX, hoverDate, chartsHeight, height]) + + const [hoverSpans, hoverSpines] = useMemo(() => { + let spans: JSX.Element[] = [] + let spines: JSX.Element[] = [] + for (let iIdx = 0; iIdx < interventions.length; iIdx++) { + const intervention = interventions[iIdx] + const hovering = iIdx === hoverInterventionIdx + const pinned = iIdx === pinnedInterventionIdx + const display = pinned || (hovering && pinnedInterventionIdx === null) + const y = chartsHeight + iIdx * trackHeight + + spans = spans.concat( + intervention.ranges.map((r, rIdx) => { + const startX = scaleX(r.start.toMillis()) + const endX = scaleX(r.end.toMillis()) + return ( + + ) + }) + ) + spines = spines.concat( + intervention.ranges.map((r, rIdx) => { + const startX = scaleX(r.start.toMillis()) + return ( + + ) + }) + ) + } + return [spans, spines] + }, [ + chartsHeight, + height, + hoverInterventionIdx, + interventions, + pinnedInterventionIdx, + scaleX, + trackHeight + ]) + + const [interventionSpans, interventionSpines] = useMemo(() => { + let spans: JSX.Element[] = [] + let spines: JSX.Element[] = [] + for (let iIdx = 0; iIdx < interventions.length; iIdx++) { + const intervention = interventions[iIdx] + const y = chartsHeight + iIdx * trackHeight + const deemphasized = + (hoverInterventionIdx ?? pinnedInterventionIdx) !== null && + iIdx !== hoverInterventionIdx && + iIdx !== pinnedInterventionIdx + spans = spans.concat( + intervention.ranges.map((r, rIdx) => { + const startX = scaleX(r.start.toMillis()) + const endX = scaleX(r.end.toMillis()) + return ( + + ) + }) + ) + spines = spines.concat( + intervention.ranges.map((r, rIdx) => { + const startX = scaleX(r.start.toMillis()) + return ( + + ) + }) + ) + } + return [spans, spines] + }, [ + chartsHeight, + hoverInterventionIdx, + interventions, + pinnedInterventionIdx, + scaleX, + trackHeight + ]) + + const label = useMemo(() => { + const idx = pinnedInterventionIdx ?? hoverInterventionIdx + if (idx === null) { + return + } + const intervention = interventions[idx] + const y = chartsHeight + idx * trackHeight + return intervention.ranges.map((range, i) => { + const startX = scaleX(range.start.toMillis()) + if (hoverDate >= range.start && hoverDate < range.end) + return ( + + {range.start.toFormat('d LLL')} + + ) + }) + }, [ + chartsHeight, + hoverDate, + hoverInterventionIdx, + interventions, + pinnedInterventionIdx, + scaleX, + trackHeight + ]) + + return ( + + {/* render separators between tracks */} + {separators} + + {/* render bg hover spans */} + {hoverSpans} + + {/* render intervention spans */} + {interventionSpans} + + {/* render spines and hover spines */} + {interventionSpines} + {hoverSpines} + + {/* render label */} + {label} + + {/* render hover line */} + {hoverLine} + + ) +} + +export default React.memo(Interventions) diff --git a/components/OutcomeChart/LegendSparkline.tsx b/components/OutcomeChart/LegendSparkline.tsx new file mode 100644 index 0000000..bcfb7f8 --- /dev/null +++ b/components/OutcomeChart/LegendSparkline.tsx @@ -0,0 +1,138 @@ +import * as d3 from 'd3' +import {curveMonotoneX, ScaleLinear, ScaleLogarithmic, ScaleTime} from 'd3' +import React, {FunctionComponent, useMemo} from 'react' +import useSafeDimensions from '../../hooks/use-safe-dimensions' +import {ChartColors, ChartColorsType} from './chartColors' +import {Datum} from './OutcomeChart' + +type LegendSparklineProps = { + data: Datum[] + scaleX: ScaleTime + scaleY: + | ScaleLinear + | ScaleLogarithmic + tMax: number + color: ChartColorsType + hoverIdx: number +} + +const LegendSparkline: FunctionComponent = props => { + const {ref, dimensions} = useSafeDimensions() + + const [scaleX, tMaxX] = useMemo(() => { + // get a copy of the scale but set the range (pixels) + // for this component's dimensions + const sx = props.scaleX.copy().range([0, dimensions.width]) + // We want to grab a copy of the domain + // This sparkline will always display the full range of data + // but right now the domain max is affected by the time selector. + // The domain max is also animated over time when changing. + // We can cache the value of it here. + const visibleDomain = sx.domain() + // Set the domain to include the entirety of the data + sx.domain([visibleDomain[0], props.tMax]) + // return the scale with the new domain and the x coord of the + // max visible timestamp from the full chart + return [sx, sx(visibleDomain[1])] + }, [props.scaleX, props.tMax, dimensions]) + + const scaleY = useMemo( + () => props.scaleY.copy().rangeRound([dimensions.height - 3, 1.5]), + [props.scaleY, dimensions] + ) + + const line = useMemo( + () => + d3 + .line() + .curve(curveMonotoneX) + // Typescript seems to think that Number.isFinite(null) is wrong + // But actually Typescript is wrong and should feel wrong. + .defined(d => Number.isFinite(d.y as number)) + .x(d => scaleX(d.x)) + // Well, the type definitions for line.y are simply wrong + // D3 has a built-in notion of undefined handling, see .defined + // but .y()'s typedef signature expects an fn that returns a number + .y(d => scaleY(d.y as number)), + [scaleX, scaleY] + ) + + const hover = useMemo(() => { + const hoverY = props.data[props.hoverIdx].y + if (hoverY !== null) { + return ( + + ) + } + }, [scaleX, scaleY, props.data, props.color, props.hoverIdx]) + + const bg = useMemo( + () => ( + + ), + [dimensions] + ) + + const visibleIndicator = useMemo( + () => ( + + ), + [tMaxX, dimensions] + ) + + const path = useMemo( + () => ( + + ), + [line, props.data, props.color] + ) + + return ( +
+ + {bg} + {visibleIndicator} + {path} + {hover} + +
+ ) +} + +export default React.memo(LegendSparkline) diff --git a/components/OutcomeChart/OutcomeChart.tsx b/components/OutcomeChart/OutcomeChart.tsx new file mode 100644 index 0000000..461dec7 --- /dev/null +++ b/components/OutcomeChart/OutcomeChart.tsx @@ -0,0 +1,721 @@ +import classNames from 'classnames' +import * as d3 from 'd3' +import {ScaleLinear, ScaleLogarithmic, ScaleTime} from 'd3' +import {DateTime} from 'luxon' +import {FunctionComponent, useMemo} from 'react' +import useSafeDimensions from '../../hooks/use-safe-dimensions' +import {maxIndex} from '../../lib/arrayMath' +import {StrategyDescriptions, StrategyKey} from '../../lib/new-simulation-state' +import Pushpin from '../../svg/Pushpin.svg' +import {CaseData} from '../../types/case-data' +import {Intensity, ModelOutput, SeverityMetrics} from '../../types/model-runner' +import {ChartColors, ChartColorsType} from './chartColors' +import Interventions from './Interventions' +import OutcomeChartActual from './OutcomeChartActual' +import OutcomeChartFlag from './OutcomeChartFlag' +import OutcomeChartHover from './OutcomeChartHover' +import OutcomeChartLegendBlock from './OutcomeChartLegendBlock' +import OutcomeChartLine from './OutcomeChartLine' +import OutcomeChartXAxis from './OutcomeChartXAxis' +import OutcomeChartYAxis from './OutcomeChartYAxis' +import SVGLinePattern from './SVGLinePattern' + +type KeyOrMetricsAccessor = string | ((m: SeverityMetrics) => number[]) +type KeyOrCaseDataAccessor = string | ((m: CaseData) => number[]) +export type ScaleYType = 'linear' | 'logarithmic' +export type ScaleXDomainMonths = number | null + +export type OutcomeChartConfiguration = { + title: string + color: ChartColorsType + projected: { + values: KeyOrMetricsAccessor + cumulative: KeyOrMetricsAccessor + variance?: KeyOrMetricsAccessor + incidence?: KeyOrMetricsAccessor + } + actual?: { + values: KeyOrCaseDataAccessor + cumulative: KeyOrCaseDataAccessor + name?: string + } + capacity?: number +} + +export type PreparedMetricsSeries = { + title: string + color: ChartColorsType + projectedPeak: DateTime + projected: { + values: Datum[] + cumulative: Datum[] + variance?: Datum[] + incidence?: Datum[] + } + actual?: { + values: Datum[] + cumulative: Datum[] + name?: string + } + capacity?: number + y: number +} + +type OutcomeChartProps = { + result: ModelOutput + caseData?: CaseData + title?: string + config: OutcomeChartConfiguration[][] + hoverX: number | null + hoverInterventionIdx: number | null + pinnedInterventionIdx: number | null + scaleYType: ScaleYType + cumulative: boolean + scaleXDomainMonths: ScaleXDomainMonths + scaleXAnimatedMax: number + onHoverX: (x: number | null) => void + onHoverIntervention: (idx: number | null) => void + onPinIntervention: (idx: number | null) => void +} + +export type Intervention = { + title: string + ranges: { + start: DateTime + end: DateTime + degree: Intensity + }[] +} + +export type Datum = { + x: number + y: number | null +} + +const interventionTrackHeight = 25 +const seriesHeight = 128 + +const OutcomeChart: FunctionComponent = ({ + result, + config, + hoverX, + hoverInterventionIdx, + pinnedInterventionIdx, + scaleYType, + cumulative, + scaleXAnimatedMax, + onHoverX, + onHoverIntervention, + onPinIntervention, + caseData +}) => { + const {ref, dimensions} = useSafeDimensions() + + // We want to use naïve dates everywhere + // So actually using UTC dates + // "Today" is whatever today's date is for the user + // But we need the same 'wall calendar' date in UTC + // so convert to string and reparse :facepalm: + const today = DateTime.fromISO( + DateTime.local() + .startOf('day') + .toISODate(), + {zone: 'utc'} + ) + + const t0 = useMemo(() => DateTime.fromISO(result.time.t0, {zone: 'utc'}), [ + result.time.t0 + ]) + + const tEnd = useMemo(() => t0.plus({days: result.time.extent[1]}), [ + t0, + result.time.extent + ]) + + // Prepare interventions + const interventions: Intervention[] = useMemo(() => { + const interventionPeriods = result.metadata.parameters.interventionPeriods + const interventions: Record = { + schoolClosure: {title: 'School Closures', ranges: []}, + socialDistancing: {title: 'Social Distancing', ranges: []}, + caseIsolation: {title: 'Case Isolation', ranges: []}, + voluntaryHomeQuarantine: { + title: 'Voluntary Home Quarantine', + ranges: [] + } + } + for (let i = 0; i < interventionPeriods.length; i++) { + const period = interventionPeriods[i] + const end = + i + 1 === interventionPeriods.length + ? tEnd + : DateTime.fromISO(interventionPeriods[i + 1].startDate, { + zone: 'utc' + }) + const start = DateTime.fromISO(period.startDate, { + zone: 'utc' + }) + + Object.keys(StrategyDescriptions).forEach(k => { + const degree = period[k as StrategyKey] + if (degree) { + interventions[k as StrategyKey].ranges.push({ + start, + end, + degree + }) + } + }) + } + return Object.values(interventions) + }, [result, tEnd]) + + // intervention rows are each interventionTrackHeight pixels tall + const chartsHeight = + dimensions.height === 0 + ? 0 + : dimensions.height - interventions.length * interventionTrackHeight + + // converts a numeric array into date/value tuples + // Configs are an array of groups. Each group will render a chart. + // Each group can contain one or more series. Each series will render a line. + const prepared: PreparedMetricsSeries[][] = useMemo(() => { + // Map()able fn to convert a number[] into datum[] + const datumize = (d: number | null, i: number) => ({ + x: t0.plus({days: result.time.timestamps[i]}).toMillis(), + // guard against negative numbers here + // They sometimes happen in fatality data from JHU + y: typeof d === 'number' ? (!(d < 0) ? d : 0) : d + }) + + // Locate the peak date for a given series + const peakDate = (arr: (number | null)[]) => + t0.plus({ + days: result.time.timestamps[maxIndex(arr)] + }) + + const prepareProjected = (k: KeyOrMetricsAccessor): Datum[] => { + // if it's a key name, pluck that metric and datumize + // if we were handed an accessor, use that to fetch the series to datumize + switch (typeof k) { + case 'string': + return result.aggregate.metrics[k as keyof SeverityMetrics].map( + datumize + ) + + case 'function': + return k(result.aggregate.metrics).map(datumize) + } + } + + const prepareActual = (k: KeyOrCaseDataAccessor): Datum[] => { + if (!caseData) + throw 'Tried to prepare actual casedata but it was not available.' + switch (typeof k) { + case 'string': + return caseData[k as keyof CaseData].map(datumize) + case 'function': + return k(caseData).map(datumize) + } + } + + // a memo for the y offset of each series + // because there are G groups each containing S series + // calculating the top offset of each series requires doing + // seriesHeight * total number of previous series in previous groups + // this is super side-effect-y but practical ¯\_(ツ)_/¯ + let y = 0 + return config.map(group => + group.map(series => { + const projected = { + values: prepareProjected(series.projected.values), + cumulative: prepareProjected(series.projected.cumulative), + variance: series.projected.variance + ? prepareProjected(series.projected.variance) + : undefined, + incidence: series.projected.incidence + ? prepareProjected(series.projected.incidence) + : undefined + } + let actual + if (series.actual) { + actual = { + values: prepareActual(series.actual.values), + cumulative: prepareActual(series.actual.cumulative), + name: series.actual.name + } + } + + const preparedSeries: PreparedMetricsSeries = { + title: series.title, + color: series.color, + capacity: series.capacity, + projectedPeak: peakDate(projected.values.map(d => d.y)), + projected, + actual, + y + } + y += seriesHeight + return preparedSeries + }) + ) + }, [config, caseData, result.aggregate.metrics, result.time.timestamps, t0]) + + // compute the extent of the values across all series in a group + // assumes that there's some data + const extents = useMemo( + () => + prepared.map(group => + d3.extent( + group + .map(series => + cumulative + ? [series.projected.cumulative, series?.actual?.cumulative] + : [series.projected.values, series?.actual?.values] + ) + .flat(2) + .filter(d => d !== undefined), + d => d.y + ) + ), + [prepared, cumulative] + ) as [[number, number]] + + // prepare scales + // X is shared across everything + const scaleX: ScaleTime = useMemo( + () => + d3 + .scaleUtc() + .domain([ + t0.plus({days: result.time.extent[0]}).toMillis(), + scaleXAnimatedMax + ]) + .range([0, dimensions.width]), + [t0, result, dimensions, scaleXAnimatedMax] + ) + + // Y is shared within a group + const scalesY: + | ScaleLinear[] + | ScaleLogarithmic[] = useMemo( + () => + extents.map(e => { + switch (scaleYType) { + case 'linear': + return d3 + .scaleLinear() + .domain(e) + .range([seriesHeight, 0]) + .nice() + case 'logarithmic': + return ( + d3 + .scaleLog() + // log10(0) = -infinity + // that sucks from a rendering perspective + // and our lower extent is almost always 0 + // so force it to be 1, and clamp all input values + // e.g. force scaleY(v) to be scaleY(1) for v < 1 + .domain([e[0] === 0 ? 1 : e[0], e[1]]) + .range([seriesHeight, 0]) + .clamp(true) + .nice() + ) + } + }), + [extents, scaleYType] + ) + + // compute X hover index and date + // hoverIdx is the index into the array of metrics + // hoverDate is the date computed using the index and the array of + // timestamp offsets + const [hoverIdx, hoverDate] = useMemo(() => { + // We are using "UTC Dates" as a kind of zoneless date everywhere + // lalala I can't see no timezones can't hear you + // d3 scaleTime.invert returns a JS Date, which we don't want + // but the millis since epoch is correct since that's UTC + // use them to index into our array of timestamps + // and then use that index to generate the appropriate UTC Date + const hoverDate = hoverX ? +scaleX.invert(hoverX) : today.toMillis() + const i = d3.bisectLeft( + prepared[0][0].projected.values.map(d => d.x), + hoverDate + ) + // we deal in round dates + // coerce hoverdates to the start of the relevant day + return [i, t0.plus({days: result.time.timestamps[i]}).startOf('day')] + }, [hoverX, scaleX, prepared, today, result.time.timestamps, t0]) + + const todayX = useMemo(() => scaleX(today.toMillis()), [today, scaleX]) + + const whichIntervention = ( + e: React.MouseEvent + ) => { + const rect = e.currentTarget.getBoundingClientRect() + const localY = e.clientY - rect.y + return localY > chartsHeight + ? Math.floor((localY - chartsHeight) / interventionTrackHeight) + : null + } + + const handleMouseX = (e: React.MouseEvent) => { + switch (e.type) { + case 'mouseleave': + onHoverX(null) + break + + default: + onHoverX(e.clientX - e.currentTarget.getBoundingClientRect().x) + break + } + } + + const handleMouseXY = (e: React.MouseEvent) => { + switch (e.type) { + case 'mouseleave': + onHoverX(null) + onHoverIntervention(null) + break + + default: + const rect = e.currentTarget.getBoundingClientRect() + onHoverX(e.clientX - rect.x) + onHoverIntervention(whichIntervention(e)) + break + } + } + + const handleMouseClick = ( + e: React.MouseEvent + ) => { + const intervention = whichIntervention(e) + if (intervention !== null) { + // unpin if clicked, otherwise pin the one that's clicked. + onPinIntervention( + intervention === pinnedInterventionIdx ? null : intervention + ) + } + } + + return ( +
+
+
+
+ {!hoverX && ( +
+ Today + {hoverDate.toFormat('LLL d, yyyy')} +
+ )} +   +
+ {prepared.map((group, i) => + group.map(series => ( +
+ +
+ )) + )} + +
+ {interventions.map((i, idx) => { + const hovering = idx === hoverInterventionIdx + const pinned = idx == pinnedInterventionIdx + return ( +
onHoverIntervention(idx)} + onMouseLeave={() => onHoverIntervention(null)} + onClick={() => onPinIntervention(pinned ? null : idx)} + > +
{i.title}
+
+ +
+
+ ) + })} +
+
+
+ + +
+ + + + + + + {/* + Draw interventions part of the chart + They're at the bottom (Y) of the chart, + but we want them to render behind everything else + So we're rendering them earlier in the SVG. + */} + + + {/* Render the today line and line shading of the past */} + + + + {/* + Draw each chart group + For ease of math, draw in a that is translated to the right y coord + so each chart can pretend it is drawing from 0,0 + + But actually... + Do this three times so we draw all the different layers + SVG doesn't respect z-index, only drawn order (later = above) + + So, draw: + - All the separator lines & Y axes + - All the data lines + - All the hovers + */} + + {/* Separator lines & Y axes */} + {prepared.map((group, groupIdx) => + group.map(series => { + const capacityY = + !cumulative && series.capacity + ? scalesY[groupIdx](series.capacity) + : undefined + return ( + + + + {!!capacityY && + capacityY > 0 && + capacityY < seriesHeight && ( + + + + Capacity + + + )} + + ) + }) + )} + + {/* Draw series projected + actuals data */} + {prepared.map((group, groupIdx) => + group.map(series => ( + + return ( + + {series.actual && ( + + )} + + + ) + + )) + )} + + {/* Draw hovers */} + {prepared + .map((group, groupIdx) => + group + .map((series, seriesIdx) => ( + + + + )) + .reverse() + ) + .reverse()} + +
+
+ +
+
+
+
+ ) +} + +export default OutcomeChart diff --git a/components/OutcomeChart/OutcomeChartActual.tsx b/components/OutcomeChart/OutcomeChartActual.tsx new file mode 100644 index 0000000..1686ce9 --- /dev/null +++ b/components/OutcomeChart/OutcomeChartActual.tsx @@ -0,0 +1,47 @@ +import * as d3 from 'd3' +import {curveMonotoneX, ScaleLinear, ScaleLogarithmic, ScaleTime} from 'd3' +import React, {FunctionComponent} from 'react' +import {ChartColorsType} from './chartColors' +import {Datum} from './OutcomeChart' + +type OutcomeChartActualProps = { + data: Datum[] + scaleX: ScaleTime + scaleY: + | ScaleLinear + | ScaleLogarithmic + height: number + color?: ChartColorsType +} + +const OutcomeChartActual: FunctionComponent = ({ + data, + scaleX, + scaleY, + height, + color = 'purple' +}) => { + const area = d3 + .area() + .curve(curveMonotoneX) + // Typescript seems to think that Number.isFinite(null) is wrong + // But actually Typescript is wrong and should feel wrong. + .defined(d => Number.isFinite(d.y as number)) + .x(d => scaleX(d.x)) + .y0(height) + // Well, the type definitions for line.y are simply wrong + // D3 has a built-in notion of undefined handling, see .defined + // but .y()'s typedef signature expects an fn that returns a number + .y1(d => scaleY(d.y as number)) + return ( + + + + ) +} + +export default React.memo(OutcomeChartActual) diff --git a/components/OutcomeChart/OutcomeChartFlag.tsx b/components/OutcomeChart/OutcomeChartFlag.tsx new file mode 100644 index 0000000..d0b95ee --- /dev/null +++ b/components/OutcomeChart/OutcomeChartFlag.tsx @@ -0,0 +1,47 @@ +import {DateTime} from 'luxon' +import React, {FunctionComponent} from 'react' +import useSafeDimensions from '../../hooks/use-safe-dimensions' + +type OutcomeChartFlagProps = { + scaleX: d3.ScaleTime + width: number + hoverDate: DateTime + today: DateTime +} + +const OutcomeChartFlag: FunctionComponent = ({ + scaleX, + width, + hoverDate, + today +}) => { + const {ref, dimensions} = useSafeDimensions() + const text = hoverDate.hasSame(today, 'day') + ? 'Today' + : hoverDate.toFormat('LLL d, yyyy') + const x = scaleX(hoverDate.toMillis()) + const left = x >= width - dimensions.width - 10 + return ( +
+
+ Today +
+
+ {text} +
+
+ ) +} + +export default React.memo(OutcomeChartFlag) diff --git a/components/OutcomeChart/OutcomeChartHover.tsx b/components/OutcomeChart/OutcomeChartHover.tsx new file mode 100644 index 0000000..1f045a1 --- /dev/null +++ b/components/OutcomeChart/OutcomeChartHover.tsx @@ -0,0 +1,98 @@ +import {ScaleLinear, ScaleLogarithmic, ScaleTime} from 'd3' +import React, {FunctionComponent} from 'react' +import {ChartColors} from './chartColors' +import {PreparedMetricsSeries} from './OutcomeChart' + +type OutcomeChartHoverProps = { + hoverIdx: number + scaleX: ScaleTime + scaleY: + | ScaleLinear + | ScaleLogarithmic + height: number + selector: 'cumulative' | 'values' + metrics: PreparedMetricsSeries +} + +const OutcomeChartHover: FunctionComponent = ({ + hoverIdx, + scaleX, + scaleY, + height, + metrics, + selector +}) => { + const hoverX = scaleX(metrics.projected[selector][hoverIdx].x) + + const yProjected = metrics.projected[selector][hoverIdx].y + const projectedMark = + yProjected === null ? ( + undefined + ) : ( + + + + + ) + + const yActual = metrics.actual?.[selector][hoverIdx].y + const actualMark = + typeof yActual === 'number' ? ( + + + + + ) : ( + undefined + ) + + return ( + + + {actualMark} + {projectedMark} + + ) +} + +export default React.memo(OutcomeChartHover) diff --git a/components/OutcomeChart/OutcomeChartInterventions.tsx b/components/OutcomeChart/OutcomeChartInterventions.tsx new file mode 100644 index 0000000..bc58363 --- /dev/null +++ b/components/OutcomeChart/OutcomeChartInterventions.tsx @@ -0,0 +1,38 @@ +import {ScaleTime} from 'd3' +import React, {FunctionComponent} from 'react' + +type OutcomeChartInterventionProps = { + dates: {start: Date; end: Date}[] + scaleX: ScaleTime + height: number +} + +const OutcomeChartIntervention: FunctionComponent = ({ + dates, + scaleX, + height +}) => { + return ( + + {dates.map(d => { + const x0 = scaleX(+d.start) + const x1 = scaleX(+d.end) + return ( + + ) + })} + + ) +} + +export default React.memo(OutcomeChartIntervention) diff --git a/components/OutcomeChart/OutcomeChartLegendBlock.tsx b/components/OutcomeChart/OutcomeChartLegendBlock.tsx new file mode 100644 index 0000000..0687406 --- /dev/null +++ b/components/OutcomeChart/OutcomeChartLegendBlock.tsx @@ -0,0 +1,123 @@ +import classNames from 'classnames' +import {ScaleLinear, ScaleLogarithmic, ScaleTime} from 'd3' +import numbro from 'numbro' +import React, {FunctionComponent, useMemo} from 'react' +import LegendSparkline from './LegendSparkline' +import {PreparedMetricsSeries} from './OutcomeChart' + +type OutcomeChartLegendBlockProps = { + series: PreparedMetricsSeries + selector: 'cumulative' | 'values' + hoverIdx: number + scaleX: ScaleTime + scaleY: + | ScaleLinear + | ScaleLogarithmic + tMax: number +} + +const OutcomeChartLegendBlock: FunctionComponent = ({ + series, + selector, + hoverIdx, + scaleX, + scaleY, + tMax +}) => { + const cumulative = selector === 'cumulative' + const [projectionExcess, projectedText] = useMemo(() => { + const projection = series.projected[selector][hoverIdx].y + let projectionExcess + if ( + !!projection && + !!series.capacity && + !cumulative && + projection > series.capacity + ) { + projectionExcess = numbro(projection - series.capacity).format({ + average: true, + totalLength: 3 + }) + } + const projectedText = + projection !== null + ? numbro(projection).format({ + thousandSeparated: true, + trimMantissa: true, + mantissa: 0 + }) + : 'No Data' + return [projectionExcess, projectedText] + }, [series, hoverIdx, cumulative, selector]) + + const [actualValueText, actualExcess] = useMemo(() => { + let actualValueText, actualExcess + if (series.actual) { + const actual = series.actual[selector][hoverIdx].y + if (actual !== undefined && actual !== null) { + actualValueText = numbro(actual).format({ + thousandSeparated: true, + trimMantissa: true, + mantissa: 0 + }) + if (!!series.capacity && !cumulative && actual > series.capacity) + actualExcess = numbro(actual - series.capacity).format({ + average: true, + totalLength: 3 + }) + } + } + return [actualValueText, actualExcess] + }, [series, hoverIdx, cumulative, selector]) + + return ( +
+
{'\u00A0'}
+
+
{series.title}
+
+ +
+
+
+ Projected +
+
{projectedText}
+ {projectionExcess && ( +
+ {projectionExcess} over +
+ )} +
+ {series.actual && ( +
+
+ {series.actual.name || 'Actual'} +
+
+ {actualValueText || 'No Data'} +
+ {actualExcess && ( +
+ {actualExcess} over +
+ )} +
+ )} +
+
+ ) +} + +export default React.memo(OutcomeChartLegendBlock) diff --git a/components/OutcomeChart/OutcomeChartLine.tsx b/components/OutcomeChart/OutcomeChartLine.tsx new file mode 100644 index 0000000..6f14776 --- /dev/null +++ b/components/OutcomeChart/OutcomeChartLine.tsx @@ -0,0 +1,88 @@ +import * as d3 from 'd3' +import {curveMonotoneX, ScaleLinear, ScaleLogarithmic, ScaleTime} from 'd3' +import React, {FunctionComponent, useMemo} from 'react' +import {ChartColors, ChartColorsType} from './chartColors' +import {Datum} from './OutcomeChart' + +type OutcomeChartLineProps = { + data: Datum[] + scaleX: ScaleTime + scaleY: + | ScaleLinear + | ScaleLogarithmic + color?: ChartColorsType + capacity?: number + cumulative: boolean +} + +const OutcomeChartLine: FunctionComponent = ({ + data, + scaleX, + scaleY, + color = 'purple', + capacity, + cumulative +}) => { + const line = useMemo(() => { + return ( + d3 + .line() + .curve(curveMonotoneX) + // Typescript seems to think that Number.isFinite(null) is wrong + // But actually Typescript is wrong and should feel wrong. + .defined(d => Number.isFinite(d.y as number)) + .x(d => scaleX(d.x)) + // Well, the type definitions for line.y are simply wrong + // D3 has a built-in notion of undefined handling, see .defined + // but .y()'s typedef signature expects an fn that returns a number + .y(d => scaleY(d.y as number)) + ) + }, [scaleX, scaleY]) + + const excess = useMemo(() => { + if (capacity && !cumulative) { + return d3 + .area() + .curve(curveMonotoneX) + .defined( + d => Number.isFinite(d.y as number) && (d.y as number) >= capacity + ) + .x(d => scaleX(d.x)) + .y1(d => scaleY(d.y as number)) + .y0(scaleY(capacity)) + } + }, [scaleX, scaleY, capacity, cumulative]) + + return ( + + {excess && ( + + + + + )} + + + ) +} + +export default React.memo(OutcomeChartLine) diff --git a/components/OutcomeChart/OutcomeChartXAxis.tsx b/components/OutcomeChart/OutcomeChartXAxis.tsx new file mode 100644 index 0000000..439ff80 --- /dev/null +++ b/components/OutcomeChart/OutcomeChartXAxis.tsx @@ -0,0 +1,74 @@ +import {ScaleTime, TimeInterval, timeMonth} from 'd3' +import {DateTime} from 'luxon' +import React, {FunctionComponent} from 'react' + +type OutcomeChartXAxisProps = { + scaleX: ScaleTime +} + +const OutcomeChartXAxis: FunctionComponent = ({ + scaleX +}) => { + const xTicksRaw = scaleX.ticks(timeMonth.every(1) as TimeInterval) + const xTicks = xTicksRaw.map((t, i) => { + const x = scaleX(t) + const dt = DateTime.fromJSDate(t) + let year + if (i === 0 || dt.year !== DateTime.fromJSDate(xTicksRaw[i - 1]).year) { + // if it's the first tick + // or the previous tick is from another year + // display the year on this tick + year = ( + + {dt.year} + + ) + } + return ( + + + + {DateTime.fromJSDate(t).toFormat('LLL')} + + {year} + + ) + }) + const height = 40 + return ( +
+ + {xTicks} + +
+ ) +} + +export default React.memo(OutcomeChartXAxis) diff --git a/components/OutcomeChart/OutcomeChartYAxis.tsx b/components/OutcomeChart/OutcomeChartYAxis.tsx new file mode 100644 index 0000000..4344e23 --- /dev/null +++ b/components/OutcomeChart/OutcomeChartYAxis.tsx @@ -0,0 +1,66 @@ +import {ScaleLinear, ScaleLogarithmic} from 'd3' +import numbro from 'numbro' +import React, {FunctionComponent} from 'react' +import {ScaleYType} from './OutcomeChart' + +type OutcomeChartYAxisProps = { + width: number + scaleY: + | ScaleLinear + | ScaleLogarithmic + type: ScaleYType +} + +const OutcomeChartYAxis: FunctionComponent = ({ + width, + scaleY, + type +}) => { + const yTicks = scaleY.ticks(5).map(t => { + const y = scaleY(t) + // for log scales, "round" ticks mean order-of-magnitude values + // e.g. 10, 100, 1000 + // log10(t) % 1 will be zero for these + // linear scale ticks will always be treated as "round" and rendered + // log scale ticks get special treatment only if round + const isRound = type === 'linear' ? true : !(Math.log10(t) % 1) + // if y is 0, we're drawing a tick above the top of the chart + // for 2nd chart groups and on, that bleeds into the chart above + // don't do that + if (y === 0) return + return ( + + + {isRound && ( + + {numbro(t).format({thousandSeparated: true})} + + )} + + ) + }) + + return {yTicks} +} + +export default React.memo(OutcomeChartYAxis) diff --git a/components/OutcomeChart/SVGLinePattern.tsx b/components/OutcomeChart/SVGLinePattern.tsx new file mode 100644 index 0000000..e6df517 --- /dev/null +++ b/components/OutcomeChart/SVGLinePattern.tsx @@ -0,0 +1,38 @@ +import React, {FunctionComponent} from 'react' + +type SVGLinePatternProps = { + id: string + spacingPx: number + rotationDeg: number + lineWidth?: number + color?: string +} + +const SVGLinePattern: FunctionComponent = props => { + const s = props.spacingPx + 0.5 + return ( + + + + ) +} + +SVGLinePattern.defaultProps = { + lineWidth: 1, + color: '#000' +} + +export default React.memo(SVGLinePattern) diff --git a/components/OutcomeChart/chartColors.ts b/components/OutcomeChart/chartColors.ts new file mode 100644 index 0000000..dc715c9 --- /dev/null +++ b/components/OutcomeChart/chartColors.ts @@ -0,0 +1,11 @@ +export const ChartColors = { + purple: '#6F42C1', + red: '#D73A49', + green: '#28A745', + orange: '#F66A0A', + blue: '#0366D6', + black: '#050505', + pink: '#D03592' +} + +export type ChartColorsType = keyof typeof ChartColors diff --git a/components/ResultTable.module.css b/components/ResultTable.module.css new file mode 100644 index 0000000..944645c --- /dev/null +++ b/components/ResultTable.module.css @@ -0,0 +1,31 @@ +.Title { + @apply p-2; + @apply border-b; + @apply font-medium; + @apply text-sm; +} + +.Row { + @apply flex; + @apply flex-row; + border-bottom: 1px solid #dbdbdb; + @apply font-mono; +} + +.EvenRow { + composes: Row; + background-color: #fbfbfc; +} + +.Label { + @apply p-2; + @apply w-64; +} + +.Value { + composes: Label; + border-color: #dbdbdb; + @apply border-l; + @apply flex-auto; + font-feature-settings: 'tnum'; +} diff --git a/components/ResultTable.tsx b/components/ResultTable.tsx new file mode 100644 index 0000000..f608594 --- /dev/null +++ b/components/ResultTable.tsx @@ -0,0 +1,32 @@ +import classNames from 'classnames' +import numbro from 'numbro' +import React, {FunctionComponent} from 'react' +import styles from './ResultTable.module.css' + +type ResultTableProps = { + title: string + rows: {label: string; value: string | number}[] +} + +const ResultTable: FunctionComponent = ({title, rows}) => { + return ( +
+
{title}
+ {rows.map((r, i) => ( +
+
{r.label}
+
+ {typeof r.value === 'number' + ? numbro(r.value).format({thousandSeparated: true}) + : r.value} +
+
+ ))} +
+ ) +} + +export default ResultTable diff --git a/components/ResultTables.tsx b/components/ResultTables.tsx new file mode 100644 index 0000000..dd3915b --- /dev/null +++ b/components/ResultTables.tsx @@ -0,0 +1,91 @@ +import {DateTime} from 'luxon' +import {cumsum, elementSum, last, maxIndex} from '../lib/arrayMath' +import {ModelOutput} from '../types/model-runner' +import ResultTable from './ResultTable' + +type Props = { + result: ModelOutput +} + +export default function ResultTables(props: Props) { + const {result} = props + const t0 = DateTime.fromISO(result.time.t0, {zone: 'utc'}) + + const peakDate = (arr: number[]) => + t0 + .plus({ + days: result.time.timestamps[maxIndex(arr)] + }) + .toFormat('LLL d, yyyy') + + const estimates = [ + { + label: 'Infected', + value: [ + result.aggregate.metrics.cumMild, + result.aggregate.metrics.cumILI, + result.aggregate.metrics.cumSARI, + result.aggregate.metrics.cumCritical + ] + .map(last) + .reduce((m, v) => m + v, 0) + }, + { + label: 'Hospitalized', + value: [ + result.aggregate.metrics.cumSARI, + result.aggregate.metrics.cumCritical + ] + .map(last) + .reduce((m, i) => m + i) + }, + { + label: 'Require Intensive Care', + value: last(result.aggregate.metrics.cumCritical) + }, + { + label: 'Require Ventilator', + value: Math.ceil(last(result.aggregate.metrics.cumCritical) / 2) + }, + { + label: 'Deaths', + value: last(cumsum(result.aggregate.metrics.incDeath)) + } + ] + + const peaks = [ + { + label: 'Peak Hospital Bed Demand', + value: peakDate( + elementSum([ + result.aggregate.metrics.SARI, + result.aggregate.metrics.Critical, + result.aggregate.metrics.CritRecov + ]) + ) + }, + { + label: 'Peak Intensive Care Demand', + value: peakDate(result.aggregate.metrics.Critical) + }, + { + // vent usage is 50% of total ICU usage according to Silvana (teams chat), + // so just return the same value here. + label: 'Peak Ventilator Demand', + value: peakDate(result.aggregate.metrics.Critical) + }, + { + label: 'Peak Daily Deaths', + value: peakDate(result.aggregate.metrics.incDeath) + } + ] + + return ( +
+
+ +
+ +
+ ) +} diff --git a/components/ResultViewSettings.tsx b/components/ResultViewSettings.tsx new file mode 100644 index 0000000..d8fd1b9 --- /dev/null +++ b/components/ResultViewSettings.tsx @@ -0,0 +1,61 @@ +import {ToggleGroupOption} from './ChartWrapper' +import {ScaleXDomainMonths, ScaleYType} from './OutcomeChart/OutcomeChart' +import selectStyle from './styles/select.module.css' + +type Props = { + disabled: boolean + cumulative: boolean + setCumulative: (isCumulative: boolean) => void + scaleYType: ScaleYType + setScaleYType: (scaleYType: ScaleYType) => void + scaleXDomainMonths: ScaleXDomainMonths + setScaleXDomainMonths: (scaleXDomainMonths: ScaleXDomainMonths) => void + timeToggleOptions: ToggleGroupOption[] +} + +export default function ResultViewSettings(props: Props) { + return ( + <> + + + + + ) +} diff --git a/components/SimulationInputsTable.module.css b/components/SimulationInputsTable.module.css new file mode 100644 index 0000000..29edaa0 --- /dev/null +++ b/components/SimulationInputsTable.module.css @@ -0,0 +1,37 @@ +.h1 { + @apply mt-8 mb-4; + @apply font-bold text-3.25xl; +} + +.h2 { + @apply mt-4; + @apply font-semibold text-lg; +} + +.table td.mild { + @apply bg-severity-mild; + @apply text-severitytext-mild; +} + +.table td.moderate { + @apply bg-severity-moderate; + @apply text-severitytext-moderate; +} + +.table td.aggressive { + @apply bg-severity-aggressive; + @apply text-severitytext-aggressive; +} + +.table td:not(:first-child):not(.socialDistancing) { + @apply text-center; +} + +.Inputs { + @apply flex; +} + +.Inputs .Name { + @apply font-semibold; + @apply pr-3; +} diff --git a/components/SimulationInputsTable.tsx b/components/SimulationInputsTable.tsx new file mode 100644 index 0000000..c06d20c --- /dev/null +++ b/components/SimulationInputsTable.tsx @@ -0,0 +1,80 @@ +import {StrategyDescriptions} from '../lib/new-simulation-state' +import Check from '../svg/Check.svg' +import {InterventionPeriod, ModelInput} from '../types/model-runner' +import LocalDate from './LocalDate' +import styles from './SimulationInputsTable.module.css' +import Table from './Table' + +type Props = { + inputs: ModelInput +} + +export default function SimulationInputsTable(props: Props) { + const inputs = props.inputs + + return ( + <> +

Simulation Inputs

+ + + + + + + {Object.entries(StrategyDescriptions).map(([key, desc]) => ( + + ))} + + + + + + + {inputs.parameters.interventionPeriods.map((pd, i) => ( + + + {Object.keys(StrategyDescriptions).map(strat => { + const intensity = String( + pd[strat as keyof InterventionPeriod] || '' + ) + + return ( + + ) + })} + + + + ))} + +
Starting On + {desc.label} + Contact Reduction
+ + + {strat !== 'socialDistancing' ? ( + intensity ? ( + + ) : null + ) : ( + intensity.charAt(0).toUpperCase() + intensity.slice(1) + )} + {pd.reductionPopulationContact}%
+ +

Other Parameters

+
+
+ R0: +
+
+ {props.inputs.parameters.r0 ?? 'Default'} +
+
+ + ) +} diff --git a/components/SimulationList.module.css b/components/SimulationList.module.css new file mode 100644 index 0000000..ea286b2 --- /dev/null +++ b/components/SimulationList.module.css @@ -0,0 +1,66 @@ +.list { + @apply rounded; + @apply border border-gray-400; + @apply shadow-sm; +} + +.listItem { + @apply border-b; + @apply border-gray-300; + @apply bg-white; + @apply text-sm; +} + +.listItem a { + @apply block; + @apply py-3 px-4; +} + +.listItem:first-child { + @apply rounded-t; +} + +.listItem:last-child { + @apply rounded-b; + @apply border-none; +} + +.listItem .customTitle { + @apply mb-2; + @apply font-bold; +} + +.listItem .region { + @apply block; + @apply mb-2; +} + +.listItem time { + @apply block; + @apply text-gray-600; +} + +.listItem.active { + @apply bg-blue; + @apply text-white; + border-bottom-color: #0356b4; +} + +.listItem.active time { + color: #c8e1ff; +} + +.listItem time svg { + @apply mr-2; + @apply relative; + @apply inline; + bottom: 1px; +} + +.listItem.showMore { + @apply py-3 px-4; + @apply bg-gray-100; + @apply font-bold; + @apply text-gray-800; + @apply cursor-pointer; +} diff --git a/components/SimulationList.tsx b/components/SimulationList.tsx new file mode 100644 index 0000000..44ffecd --- /dev/null +++ b/components/SimulationList.tsx @@ -0,0 +1,80 @@ +import {AxiosError} from 'axios' +import {DateTime} from 'luxon' +import Link from 'next/link' +import {useState} from 'react' +import useSWR from 'swr' +import {SimulationSummary} from '../lib/db' +import flagAndName from '../lib/regionEmoji' +import Clock from '../svg/Clock.svg' +import simListStyle from './SimulationList.module.css' + +type Props = { + activeSimulationID: number + initialData: SimulationSummary[] +} + +export default function SimulationList(props: Props) { + const {data, error} = useSWR( + '/api/simulations', + { + initialData: props.initialData, + shouldRetryOnError: true, + refreshInterval: 30_000 + } + ) + + const [summaryCount, setSummaryCount] = useState(5) + const hasMore = data && summaryCount < data.length + + if (error) { + return

Error loading simulation list.

+ } + + if (!data) { + return

Loading simulation summaries...

+ } + + return ( + + ) +} + +function getRelativeTime(dateTime: string) { + // https://github.com/moment/luxon/issues/478 + const dt = DateTime.fromISO(dateTime).toRelative() + return dt === 'in 0 seconds' ? 'Just now' : dt +} diff --git a/components/StatusBlock.module.css b/components/StatusBlock.module.css new file mode 100644 index 0000000..715827a --- /dev/null +++ b/components/StatusBlock.module.css @@ -0,0 +1,8 @@ +.loadingBlock { + @apply border; + @apply rounded; + @apply flex flex-col items-center justify-center; + @apply shadow-sm; + min-height: 375px; + background-image: linear-gradient(180deg, #ffffff 0%, #fbfbfc 100%); +} diff --git a/components/StatusBlock.tsx b/components/StatusBlock.tsx new file mode 100644 index 0000000..71a17cd --- /dev/null +++ b/components/StatusBlock.tsx @@ -0,0 +1,18 @@ +import {PropsWithChildren} from 'react' +import styles from './StatusBlock.module.css' +import StatusIcon from './StatusIcon' + +type Props = { + statusKey: string +} + +export default function StatusBlock(props: PropsWithChildren) { + return ( +
+
+ +
+
{props.children}
+
+ ) +} diff --git a/components/StatusIcon.module.css b/components/StatusIcon.module.css new file mode 100644 index 0000000..76aea00 --- /dev/null +++ b/components/StatusIcon.module.css @@ -0,0 +1,12 @@ +.svg-rotate { + animation: infinite-rotate 2s linear infinite; +} + +@keyframes infinite-rotate { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/components/StatusIcon.tsx b/components/StatusIcon.tsx new file mode 100644 index 0000000..63a10d7 --- /dev/null +++ b/components/StatusIcon.tsx @@ -0,0 +1,41 @@ +import Dot from '../svg/Dot.svg' +import Failure from '../svg/Failure.svg' +import StatusSpinner from '../svg/StatusSpinner.svg' +import Success from '../svg/Success.svg' +import styles from './StatusIcon.module.css' + +interface Props { + statusKey: string +} + +export default function StatusIcon(props: Props) { + switch (props.statusKey) { + case 'pending': + return ( +
+ +
+ ) + case 'in-progress': + return ( +
+ +
+ ) + case 'failed': + return ( +
+ +
+ ) + case 'complete': + return ( +
+ +
+ ) + default: + // no icon + return
+ } +} diff --git a/components/Table.module.css b/components/Table.module.css new file mode 100644 index 0000000..dbf9624 --- /dev/null +++ b/components/Table.module.css @@ -0,0 +1,60 @@ +.table { + @apply w-full; + @apply rounded; + @apply border-separate; + @apply bg-white; + @apply shadow-sm; + @apply text-left text-sm; +} + +.table.fixed { + @apply table-fixed; +} + +.table.auto { + @apply table-auto; +} + +.table th, +.table td { + @apply p-3; +} + +.table th { + @apply border; + @apply font-semibold; + border-right: none; + border-bottom-color: black; +} + +.table th:first-child { + @apply rounded-tl; +} + +.table th:last-child { + @apply border-r; + @apply rounded-tr; + border-right: 1px solid #e0e0e0; +} + +.table td { + @apply font-mono; + @apply border-b border-l; + border-top: none; +} + +.table td:not(:first-child) { + border-color: rgba(0, 0, 0, 0.16); +} + +.table td:last-child { + border-right-width: 1px; +} + +.table tr:last-child td:first-child { + @apply rounded-bl; +} + +.table tr:last-child td:last-child { + @apply rounded-br; +} diff --git a/components/Table.tsx b/components/Table.tsx new file mode 100644 index 0000000..94d0448 --- /dev/null +++ b/components/Table.tsx @@ -0,0 +1,19 @@ +import styles from './Table.module.css' + +type Props = JSX.IntrinsicElements['table'] & { + fixed?: boolean +} + +export default function Table(props: Props) { + const layout = props.fixed ? 'fixed' : 'auto' + + return ( + + {props.children} +
+ ) +} diff --git a/components/simulation-form/ApplicationComponent.module.css b/components/simulation-form/ApplicationComponent.module.css new file mode 100644 index 0000000..0832fb9 --- /dev/null +++ b/components/simulation-form/ApplicationComponent.module.css @@ -0,0 +1,17 @@ +.Content { + @apply flex-1; + @apply p-3; + @apply rounded; + + background-color: #f7f7f9; + border: 1px solid #e2e8f0; +} + +.Heading h3 { + @apply font-semibold; +} + +.Heading p, +.Content p { + color: #52555F; +} diff --git a/components/simulation-form/ApplicationComponent.tsx b/components/simulation-form/ApplicationComponent.tsx new file mode 100644 index 0000000..a0bdc10 --- /dev/null +++ b/components/simulation-form/ApplicationComponent.tsx @@ -0,0 +1,14 @@ +import {PropsWithChildren} from 'react' +import styles from './ApplicationComponent.module.css' + +export default function ApplicationComponent(props: PropsWithChildren<{}>) { + return ( +
+
+

Continuous application

+

Strategy is enforced for a specific period of time.

+
+ {props.children} +
+ ) +} diff --git a/components/simulation-form/DateInput.tsx b/components/simulation-form/DateInput.tsx new file mode 100644 index 0000000..17bdc1e --- /dev/null +++ b/components/simulation-form/DateInput.tsx @@ -0,0 +1,59 @@ +import {CleaveOptions} from 'cleave.js/options' +import Cleave from 'cleave.js/react' +import {useMemo, useState} from 'react' +import {isValidDate, toYYYYMMDD} from '../../lib/dateFunctions' +import formStyle from '../styles/form.module.css' + +interface Props { + value: string | Date + max?: string | Date + min?: string | Date + onChange?: (newDate: string) => void +} + +/** + * A component that displays a platform native date picker + * and allows a user to choose a date within a given range. + * + * Dates are expected and returned in yyyy-mm-dd format. + * + */ +export default function DateInput(props: Props): JSX.Element { + const [error, setError] = useState(false) + const value: string = useMemo( + () => (props.value instanceof Date ? toYYYYMMDD(props.value) : props.value), + [props.value] + ) + const min: string | undefined = useMemo( + () => (props.min instanceof Date ? toYYYYMMDD(props.min) : props.min), + [props.min] + ) + const max: string | undefined = useMemo( + () => (props.max instanceof Date ? toYYYYMMDD(props.max) : props.max), + [props.max] + ) + return ( + { + props.onChange && props.onChange(e.target.value) + setError(!isValidDate(e.target.value)) + }} + options={ + { + date: true, + datePattern: ['Y', 'm', 'd'], + delimiters: ['-'], + dateMin: min, + dateMax: max + } as CleaveOptions // DefinitelyTyped def is out of date + } + /> + ) +} diff --git a/components/simulation-form/ErrorMessage.tsx b/components/simulation-form/ErrorMessage.tsx new file mode 100644 index 0000000..b5f83fc --- /dev/null +++ b/components/simulation-form/ErrorMessage.tsx @@ -0,0 +1,80 @@ +import Joi from '@hapi/joi' +import isEqual from 'lodash/isEqual' +import boxStyle from '../styles/box.module.css' + +type Path = Joi.ValidationErrorItem['path'] + +type Props = { + error: Joi.ValidationError | null + path: Path + children: (errors: Joi.ValidationErrorItem[]) => JSX.Element +} + +/** + * Render the children once per error if there's an error for the given path on the validation + * error. + * + * {details => ( + *
    {details.map((d, i) =>
  • {d.message}
  • )}
+ * )}
+ */ +export default function ErrorMessage(props: Props) { + const details = props.error?.details ?? [] + const relevantErrors = getRelevantErrors(details, props.path) + + if (!relevantErrors.length) { + return null + } + + return props.children(relevantErrors) +} + +export function ErrorList( + props: Omit & {className?: string} +) { + return ( + + {details => ( +
    + {details.map((d, i) => ( +
  • {d.message}
  • + ))} +
+ )} +
+ ) +} + +/** + * A helper to get a CSS class when an error exists for a given path + * + * @param error The validation error (or null) + * @param path The path to check errors at + * @param ifError The value to return if at least one error is present + */ +export function errorClass( + error: Joi.ValidationError | null, + path: Path, + ifError: string +): string { + const details = error?.details ?? [] + + if (getRelevantErrors(details, path).length > 0) { + return ifError + } + + return '' +} + +function getRelevantErrors( + details: Joi.ValidationErrorItem[], + path: Path +): Joi.ValidationErrorItem[] { + return details.reduce((errors, detail) => { + if (isEqual(detail.path, path)) { + errors.push(detail) + } + + return errors + }, []) +} diff --git a/components/simulation-form/FormSection.module.css b/components/simulation-form/FormSection.module.css new file mode 100644 index 0000000..7c066fe --- /dev/null +++ b/components/simulation-form/FormSection.module.css @@ -0,0 +1,29 @@ +.FormSection { + @apply mb-4; + @apply p-4; + @apply rounded; + @apply border; + @apply bg-white; + @apply shadow-sm; + @apply text-sm; + border-color: rgba(65, 67, 78, 0.25); +} + +.FormSectionHeader { + @apply pb-4; +} + +.FormSectionHeader h2 { + @apply font-semibold; + @apply text-base; +} + +.FormSectionHeader p { + @apply mt-2; + @apply text-light-gray; +} + +.FormSectionError { + background-color: #ffeef0; + border-color: #f97583; +} diff --git a/components/simulation-form/FormSection.tsx b/components/simulation-form/FormSection.tsx new file mode 100644 index 0000000..b285908 --- /dev/null +++ b/components/simulation-form/FormSection.tsx @@ -0,0 +1,29 @@ +import {PropsWithChildren} from 'react' +import styles from './FormSection.module.css' + +type Props = { + title?: string + description?: string + isError?: boolean +} + +export default function FormSection(props: PropsWithChildren) { + return ( +
+ {props.title && ( +
+ {props.title &&

{props.title}

} + {props.description &&

{props.description}

} +
+ )} + + {props.children} +
+ ) +} diff --git a/components/simulation-form/Important.module.css b/components/simulation-form/Important.module.css new file mode 100644 index 0000000..51f7c4f --- /dev/null +++ b/components/simulation-form/Important.module.css @@ -0,0 +1,6 @@ +.Important { + @apply pl-2; + @apply my-2; + + border-left: solid red 4px; +} diff --git a/components/simulation-form/Important.tsx b/components/simulation-form/Important.tsx new file mode 100644 index 0000000..8d2b973 --- /dev/null +++ b/components/simulation-form/Important.tsx @@ -0,0 +1,6 @@ +import {PropsWithChildren} from 'react' +import styles from './Important.module.css' + +export default function Important(props: PropsWithChildren<{}>): JSX.Element { + return

{props.children}

+} diff --git a/components/simulation-form/InterventionGuidanceLink.module.css b/components/simulation-form/InterventionGuidanceLink.module.css new file mode 100644 index 0000000..4935150 --- /dev/null +++ b/components/simulation-form/InterventionGuidanceLink.module.css @@ -0,0 +1,22 @@ +.link { + @apply flex; + @apply items-center justify-center; + @apply rounded; + @apply mt-2; + @apply p-3; + + background-color: #f7f7f9; +} + +.link .logo { + width: 16px; +} + +.link .text { + @apply flex-1; + @apply m-0 p-0 ml-3; +} + +.link .chevron { + @apply transform -rotate-90; +} diff --git a/components/simulation-form/InterventionGuidanceLink.tsx b/components/simulation-form/InterventionGuidanceLink.tsx new file mode 100644 index 0000000..5b1fe66 --- /dev/null +++ b/components/simulation-form/InterventionGuidanceLink.tsx @@ -0,0 +1,19 @@ +import Chevron from '../../svg/Chevron.svg' +import OutboundLink from '../OutboundLink' +import styles from './InterventionGuidanceLink.module.css' + +type Props = { + logo: JSX.Element + href: string + text: string +} + +export default function InterventionGuidanceLink(props: Props) { + return ( + +
{props.logo}
+

{props.text}

+ +
+ ) +} diff --git a/components/simulation-form/InterventionPeriodSection.module.css b/components/simulation-form/InterventionPeriodSection.module.css new file mode 100644 index 0000000..5b729f2 --- /dev/null +++ b/components/simulation-form/InterventionPeriodSection.module.css @@ -0,0 +1,106 @@ +.InterventionPeriodSection { + position: relative; +} + +.AutoGenMessage { + @apply p-4; + @apply flex; + background-color: #f1f8ff; +} + +.AutoGenMessage div { + @apply text-xs; + @apply m-0; +} + +.AutoGenMessage svg { + @apply mr-2; + width: 2rem; +} + +.StrategyList, +.StrategyList > li, +.Intensity { + border-color: #ccc; +} + +.StrategyList { + @apply rounded; + @apply border; + @apply shadow-sm; + background-image: linear-gradient(180deg, #ffffff 0%, #fbfbfc 100%); +} + +.StrategyList > li { + @apply border-b; +} + +.StrategyList > li:last-child { + @apply border-none; +} + +.Strategy, +.Intensity { + @apply w-full flex; + @apply p-4 pb-2; +} + +.Intensity { + @apply pl-8; + @apply border-t; + @apply text-gray-800; +} + +.Strategy input, +.Intensity input { + @apply mr-3; +} + +.Strategy label, +.Intensity label { + position: relative; + bottom: 0.25rem; +} + +.Intensities { + background-color: #f7f7f9; +} + +.RemoveButton { + @apply bg-white; + color: #cb2431; + position: absolute; + top: 1.3rem; + right: 1.3rem; +} + +.PercInput { + @apply flex; +} + +.PercInput input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.PercInput .PercSign { + @apply border-t border-r border-b; + @apply rounded-r; + @apply px-4 py-3; + background-image: linear-gradient(180deg, #ffffff 0%, #fbfbfc 100%); +} + +.PercInput .PercSign.warn { + @apply border-orange; + @apply bg-orange; + opacity: 50; + color: #a04100; + background-color: #ffebda; + background-image: none; +} + +.InterventionPeriodSection h3 { + @apply mb-3; + @apply mt-6; + @apply font-semibold; +} diff --git a/components/simulation-form/InterventionPeriodSection.tsx b/components/simulation-form/InterventionPeriodSection.tsx new file mode 100644 index 0000000..7a49fea --- /dev/null +++ b/components/simulation-form/InterventionPeriodSection.tsx @@ -0,0 +1,242 @@ +import Joi from '@hapi/joi' +import {useMemo} from 'react' +import {SupportedParameter} from '../../lib/models' +import { + Intensity, + InterventionPeriod, + StrategyDescriptions, + StrategyKey +} from '../../lib/new-simulation-state' +import Descartes from '../../svg/Descartes.svg' +import SocialDistancingGraphic from '../../svg/SocialDistancingGraphic.svg' +import Trash from '../../svg/Trash.svg' +import Unacast from '../../svg/Unacast.svg' +import Warn from '../../svg/Warn.svg' +import {ISODate} from '../../types/model-runner' +import formStyle from '../styles/form.module.css' +import DateInput from './DateInput' +import {ErrorList} from './ErrorMessage' +import FormSection from './FormSection' +import InterventionGuidanceLink from './InterventionGuidanceLink' +import styles from './InterventionPeriodSection.module.css' +import {SupportedParameters} from './SupportedParameters' + +interface Props { + period: InterventionPeriod + isFirst: boolean + onChange: (config: Partial) => void + onChangeIntervention: (update: Pick) => void + remove: () => void + priorPeriodStartDate: ISODate | undefined + error: Joi.ValidationError | null + index: number +} + +const autoGeneratedPeriodText = `This intervention start date and policy settings were populated +based on the latest known real-world data. You may modify this to run +simulations, or correct this data by editing below.` + +function enforceBounds(strNumber: number | string): number | '' { + const num = + typeof strNumber === 'number' ? strNumber : parseInt(strNumber, 10) + return Number.isNaN(num) ? '' : num < 0 ? 0 : num > 100 ? 100 : num +} + +// TODO Need to constrain the start date of the period to ensure it fits within the range +export default function InterventionPeriodSection(props: Props) { + const contactReduction = enforceBounds( + props.period.reductionPopulationContact + ) + return ( +
+ + {!props.isFirst && ( + + )} + {props.period.isAutoGenerated && ( +
+ +
{autoGeneratedPeriodText}
+
+ )} + {props.isFirst ? ( +

Intervention policies started on

+ ) : ( +

Starting on

+ )} + + props.onChange({ + startDate + }) + } + /> + + + +

+ Intervention strategies{' '} + +

+ +
    + {Object.entries(StrategyDescriptions).map( + ([strategyKey, description]) => ( + + props.onChangeIntervention({ + [strategyKey]: enabled ? intensity : undefined + }) + } + /> + ) + )} +
+ +

+ Contact reduction{' '} + +

+

+ Based on the intervention strategies selected above, what is the + estimated reduction in population contact? +

+
+ { + const reductionPopulationContact = enforceBounds(e.target.value) + props.onChange({reductionPopulationContact}) + }} + /> +
+ % +
+
+ + + +

+ +

+

+ Estimating this reduction is not an exact science. It is recommended + to familiarize yourself with the latest contact reduction rates from + the following data sources: +

+ + } + href="https://www.google.com/covid19/mobility/" + text="Google’s COVID-19 Community Mobility Reports" + /> + + } + href="https://www.descarteslabs.com/mobility/" + text="Descartes Labs - Changes in US Mobility Report" + /> + + } + href="https://www.unacast.com/covid19/social-distancing-scoreboard" + text="Unacast Social Distancing Scoreboard" + /> +
+
+ ) +} + +interface StrategyProps { + enabled: boolean + label: string + descriptions?: Record + intensity: Intensity + onChange: (enabled: boolean, intensity: Intensity) => void +} + +function Strategy(props: StrategyProps) { + const randomID = () => + Math.random() + .toString(36) + .substring(2, 15) + + const idBase = useMemo(() => `${randomID()}${randomID()}`, []) + + return ( +
  • +
    + props.onChange(e.target.checked, props.intensity)} + /> + +
    + {props.descriptions && props.enabled && ( +
      + {Object.entries(Intensity).map(([label, intensity]) => ( +
    • + props.onChange(true, intensity)} + /> + +
    • + ))} +
    + )} +
  • + ) +} diff --git a/components/simulation-form/NewSimulationForm.module.css b/components/simulation-form/NewSimulationForm.module.css new file mode 100644 index 0000000..a60e237 --- /dev/null +++ b/components/simulation-form/NewSimulationForm.module.css @@ -0,0 +1,31 @@ +.NewSimulationForm { + @apply mx-auto; + margin-top: 49px; + max-width: 595px; +} + +.NewSimulationForm h1 { + @apply mt-2 mb-14; + @apply font-bold; + @apply text-2xl; +} + +.SimulationLabel { + @apply border; + @apply rounded; + @apply text-black; + @apply py-3 px-4; + @apply my-2; + + border-color: #cccccc; + width: 100%; + text-align: left; +} + +.NewSimulationForm p { + @apply mt-4 mb-2; +} + +.ButtonMessage { + @apply px-2; +} diff --git a/components/simulation-form/NewSimulationForm.tsx b/components/simulation-form/NewSimulationForm.tsx new file mode 100644 index 0000000..0c9f365 --- /dev/null +++ b/components/simulation-form/NewSimulationForm.tsx @@ -0,0 +1,367 @@ +import Joi from '@hapi/joi' +import Link from 'next/link' +import {useRouter} from 'next/router' +import {useContext, useMemo, useReducer, useState} from 'react' +import {cache} from 'swr' +import useAbort from '../../hooks/use-abort' +import {SupportedParameter} from '../../lib/models' +import { + createFormBody, + getInterventionsEnd, + getNextInterventionPeriodStart, + initializeSimulationState, + InterventionPeriod, + reducer, + StrategyKey, + validateSchema +} from '../../lib/new-simulation-state' +import flagAndName from '../../lib/regionEmoji' +import {InterventionMap} from '../../lib/simulation-types' +import {SentryContext} from '../../pages/_app' +import Plus from '../../svg/Plus.svg' +import {Region, RegionMap, TopLevelRegion} from '../../types/regions' +import btnStyles from '../styles/button.module.css' +import formStyle from '../styles/form.module.css' +import selectStyles from '../styles/select.module.css' +import {errorClass, ErrorList} from './ErrorMessage' +import FormSection from './FormSection' +import InterventionPeriodSection from './InterventionPeriodSection' +import styles from './NewSimulationForm.module.css' +import {SupportedParameters} from './SupportedParameters' + +interface Props { + regions: RegionMap + interventions: InterventionMap +} + +export default function NewSimulationForm(props: Props) { + const {captureException} = useContext(SentryContext) + const initialRegion = useMemo( + () => ({ + region: props.regions.US, + subregion: Object.values(props.regions.US.regions)[0] + }), + [props.regions] + ) + const [disableSubmit, setDisableSubmit] = useState(false) + const [showingAdvanced, setShowingAdvanced] = useState(false) + + const [state, dispatch] = useReducer( + reducer, + initializeSimulationState(initialRegion, props.interventions) + ) + const abortSignal = useAbort() + const router = useRouter() + const [errorMsg, setErrorMsg] = useState() + const [ + validationError, + setValidationError + ] = useState(null) + + const setRegion = (region: TopLevelRegion) => + dispatch({type: 'SET_REGION', region, interventions: props.interventions}) + const setSubregion = (subregion: Region) => + dispatch({ + type: 'SET_SUBREGION', + subregion, + interventions: props.interventions + }) + const setLabel = (label: string) => dispatch({type: 'SET_LABEL', label}) + const setR0 = (r0: number | undefined) => dispatch({type: 'SET_R0', r0}) + const updatePeriod = ( + period: InterventionPeriod, + newPeriod: Partial + ) => dispatch({type: 'UPDATE_PERIOD', period, newPeriod}) + const updatePeriodIntervention = ( + period: InterventionPeriod, + update: Pick + ) => dispatch({type: 'UPDATE_PERIOD_INTERVENTIONS', period, update}) + const removePeriod = (period: InterventionPeriod) => + dispatch({type: 'REMOVE_PERIOD', period}) + + const addInterventionPeriod = () => + dispatch({ + type: 'ADD_PERIOD', + period: { + ...state.interventionPeriods[state.interventionPeriods.length - 1], + reductionPopulationContact: '', + startDate: getNextInterventionPeriodStart(state.interventionPeriods), + isAutoGenerated: false + } + }) + + const addInterventionPeriodEnd = () => + dispatch({ + type: 'ADD_PERIOD', + period: { + startDate: getInterventionsEnd(state.interventionPeriods), + isAutoGenerated: false, + reductionPopulationContact: 0 + } + }) + + const topLevelregions = useMemo( + () => + Object.values(props.regions).sort((r1, r2) => + r1.name.localeCompare(r2.name) + ), + [props.regions] + ) + + const subregions = useMemo( + () => + Object.values(state.region.regions).sort((r1, r2) => + r1.name.localeCompare(r2.name) + ), + [state.region.regions] + ) + + const handleValidationError = (err: Joi.ValidationError | null) => { + if (!err) { + setValidationError(null) + setErrorMsg('') + return + } + + setValidationError(err) + setErrorMsg('Please correct the errors in the form above.') + } + + const onSubmit = async () => { + try { + setDisableSubmit(true) + handleValidationError(null) + const input = createFormBody(state) + const error = validateSchema(input) + + if (error) { + throw error + } + + const res = await fetch('/api/simulations', { + method: 'POST', + signal: abortSignal, + body: JSON.stringify(input) + }) + + if (res.status === 200) { + const {id}: {id: number} = await res.json() + cache.delete('/api/simulations') + router.push('/simulations/[id]', `/simulations/${id}`) + window.scrollTo(0, 0) + } else { + const error = await res.json() + throw new Error(error.error) + } + } catch (err) { + console.error(err) + if (err.name === 'ValidationError') { + handleValidationError(err) + } else { + setErrorMsg(err.message) + captureException(err) + } + } finally { + setDisableSubmit(false) + } + } + + const hasSubregions = + Object.keys(state.region.regions).length > 1 || + Object.keys(state.region.regions)[0] !== '_self' + + return ( +
    e.preventDefault()} + > + + ← Return to simulation list + + +

    Create Simulation

    + + +

    + Choose a region and subregion for this simulation. Simulations will + provide more accurate results as the location becomes more specific. +

    +
    + +
    + {hasSubregions ? ( +
    + +
    + ) : null} +
    + + +

    + Add a memorable name to make this simulation easier to find in the + future. +

    + { + setLabel(e.target.value) + }} + /> + + +
    + + {state.interventionPeriods.map((period, i) => ( + ) => + updatePeriod(period, newPeriod) + } + onChangeIntervention={( + update: Pick + ) => updatePeriodIntervention(period, update)} + remove={() => removePeriod(period)} + /> + ))} + +
    + + +
    + + + setShowingAdvanced(!showingAdvanced)} + className="cursor-pointer font-semibold" + > + {showingAdvanced ? 'Hide' : 'View'} advanced controls + + + {showingAdvanced && ( +
    +

    + + +

    + +
    + { + setR0(Number(e.target.value) || undefined) + }} + onBlur={e => + (e.target.value = + typeof state.r0 === 'number' ? state.r0.toFixed(1) : '') + } + /> +
    + +

    + The estimated number of new infections that will be caused for + each existing infection. Leave this field blank to let each model + decide its own R0. +

    +
    + )} +
    + + {errorMsg && ( + + {validationError && ( +
      + {validationError.details.map((d, i) => ( +
    • + {d.message} +
    • + ))} +
    + )} + +

    {errorMsg}

    +
    + )} + +
    + +
    + + ) +} diff --git a/components/simulation-form/RangeInput.module.css b/components/simulation-form/RangeInput.module.css new file mode 100644 index 0000000..fe4820c --- /dev/null +++ b/components/simulation-form/RangeInput.module.css @@ -0,0 +1,19 @@ +.RangeInput { + @apply flex; +} + +.RangeInput input[type='number'] { + @apply mr-4; + @apply pl-5 py-3; + @apply border; + @apply rounded; + border-color: #cccccc; +} + +.RangeInput input[type='number']:focus { + @apply outline-none; +} + +.RangeInput input[type='range'] { + @apply flex-grow; +} diff --git a/components/simulation-form/RangeInput.tsx b/components/simulation-form/RangeInput.tsx new file mode 100644 index 0000000..2c0e323 --- /dev/null +++ b/components/simulation-form/RangeInput.tsx @@ -0,0 +1,66 @@ +import styles from './RangeInput.module.css' + +type Props = { + value: number + min: number + max: number + disabled?: boolean + onChange: (value: number) => void +} + +export default function RangeInput(props: Props) { + // handle the case where the min/max has changed + if (props.value < props.min) { + props.onChange(props.min) + } + if (props.value > props.max) { + props.onChange(props.max) + } + + return ( +
    + { + const value = parseValue(e.target.value, props.min, props.max) + props.onChange(value) + }} + /> + { + const value = parseValue(e.target.value, props.min, props.max) + props.onChange(value) + }} + /> +
    + ) +} + +function parseValue(value: string, min: number, max: number): number { + const parsed = parseInt(value, 10) + + if (isNaN(parsed)) { + return min + } + + if (parsed < min) { + return min + } + + if (parsed > max) { + return max + } + + return parsed +} diff --git a/components/simulation-form/StrategyConfiguration.module.css b/components/simulation-form/StrategyConfiguration.module.css new file mode 100644 index 0000000..be8d6bd --- /dev/null +++ b/components/simulation-form/StrategyConfiguration.module.css @@ -0,0 +1,52 @@ +.StrategyConfigurationParam { + @apply flex-1; + @apply mr-4; + @apply mt-4; +} + +.ConfigurableInput { + @apply flex; + @apply items-start; + @apply text-sm; +} + +.ConfigurableInput + .ConfigurableInput { + @apply pt-3; +} + +.ConfigurableInputSubsection { + @apply flex; + @apply items-start; + @apply text-sm; + @apply pt-1; + @apply w-full; + padding-left: 1.3rem; +} + +.ConfigurableInputSubsection + .ConfigurableInputSubsection { + @apply pl-10; +} + +.Content { + @apply flex-1; + @apply ml-3; +} + +.Heading h3 { + @apply font-semibold; + @apply text-lg; +} + +/* Nested Configurable elements have a smaller header */ +.ConfigurableInputSubsection .ConfigurableInput .Heading h3 { + @apply text-base; +} + +.ConfigurableInputSubsection .ConfigurableInput .Heading p { + @apply text-sm; +} + +.ConfigurableInput p { + @apply text-base; + color: #52555f; +} diff --git a/components/simulation-form/SupportedParameters.module.css b/components/simulation-form/SupportedParameters.module.css new file mode 100644 index 0000000..e2d3587 --- /dev/null +++ b/components/simulation-form/SupportedParameters.module.css @@ -0,0 +1,76 @@ +.SupportedParameters { + @apply inline; + @apply relative; + @apply ml-3; + @apply mr-10; + + top: 0.25rem; + z-index: 1; +} + +.UsedByButton { + @apply inline-flex; + @apply text-xxs; + @apply bg-gray-lightest; + @apply rounded-full; + @apply px-3 py-1; +} + +.UsedByButton:focus { + outline: none; +} + +.UsedByButton svg { + @apply mr-2; + + width: 16px; + height: 16px; +} + +.PopUp { + @apply border border-solid rounded; + @apply absolute; + @apply bg-white; + @apply p-2; + + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.5); + left: -3.9rem; + top: 25px; +} + +.PopUp:before { + content: ' '; + top: -6px; + left: 77px; + height: 8px; + width: 8px; + + border: 2px solid #e0e0e0; + border-right: none; + border-top: none; + background: white; + position: absolute; + pointer-events: none; + transform: rotate(135deg); +} + +.Hidden { + display: none; +} + +.PopUp h4 { + @apply font-semibold; + + text-align: left; +} + +.PopUp li { + @apply my-2; + + text-align: left; + display: flex; +} + +.PopUp li svg { + color: green; +} diff --git a/components/simulation-form/SupportedParameters.tsx b/components/simulation-form/SupportedParameters.tsx new file mode 100644 index 0000000..1e7a549 --- /dev/null +++ b/components/simulation-form/SupportedParameters.tsx @@ -0,0 +1,59 @@ +import {useState} from 'react' +import models, { + SupportedParameter, + supportedParameterDesc +} from '../../lib/models' +import Check from '../../svg/Check.svg' +import Info from '../../svg/Info.svg' +import styles from './SupportedParameters.module.css' + +interface Props { + parameterId: SupportedParameter +} + +export function SupportedParameters(props: Props) { + const [show, setShow] = useState(false) + const [stickyShow, setStickyShow] = useState(false) + + return ( +
    + +
    + ) +} + +function getUsedByCount(parameterId: SupportedParameter) { + return Object.values(models).reduce( + (cnt, model) => + model.supportedParameters.includes(parameterId) ? cnt + 1 : cnt, + 0 + ) +} + +function getUsedByNames(parameterId: SupportedParameter): JSX.Element[] { + return Object.values(models) + .filter(model => model.supportedParameters.includes(parameterId)) + .map(model => ( +
  • + + {model.name} +
  • + )) +} diff --git a/components/styles/box.module.css b/components/styles/box.module.css new file mode 100644 index 0000000..874e9a4 --- /dev/null +++ b/components/styles/box.module.css @@ -0,0 +1,15 @@ +.box { + @apply mb-4; + @apply p-4; + @apply rounded; + @apply border; + @apply bg-white; + @apply shadow-sm; + @apply text-sm; + border-color: rgba(65, 67, 78, 0.25); +} + +.box.error { + background-color: #ffeef0; + border-color: #f97583; +} diff --git a/components/styles/button.module.css b/components/styles/button.module.css new file mode 100644 index 0000000..13268ae --- /dev/null +++ b/components/styles/button.module.css @@ -0,0 +1,25 @@ +.button { + @apply px-4 py-3; + @apply rounded; + @apply border border-gray-400; + @apply text-sm; + @apply shadow-sm; + @apply bg-white; + @apply text-center; +} + +.button:focus { + @apply outline-none; +} + +.button.orange { + @apply bg-orange-300; + @apply text-white; + @apply border-none; +} + +.button.blue { + @apply bg-blue; + @apply text-white; + @apply border-none; +} diff --git a/components/styles/form.module.css b/components/styles/form.module.css new file mode 100644 index 0000000..8b1b1eb --- /dev/null +++ b/components/styles/form.module.css @@ -0,0 +1,26 @@ +.textInput { + @apply rounded; + @apply py-3 px-4; + border: 1px solid rgba(0, 0, 0, 0.16); + background-color: #fbfbfc; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.12); +} + +.textInput:focus { + @apply outline-none; + @apply shadow-outline; +} + +.textInput.error { + @apply border border-red; +} + +.textInput.warn { + @apply border border-orange; + color: #A04100; + background-color: #FFF8F2; +} + +.textInput.warn::placeholder { + color: #A04100; +} diff --git a/components/styles/select.module.css b/components/styles/select.module.css new file mode 100644 index 0000000..8fbfbdf --- /dev/null +++ b/components/styles/select.module.css @@ -0,0 +1,36 @@ +.select { + @apply pl-4 pr-8 py-3; + @apply appearance-none; + @apply border border-gray-400; + @apply border-gray-300; + @apply bg-white; + @apply rounded; + @apply outline-none; + @apply shadow-sm; + + background-image: url('../../svg/Chevron.svg'), + linear-gradient(180deg, #ffffff 0%, #fbfbfc 100%); + background-repeat: no-repeat, repeat; + background-position: right 0.75rem center, top left; +} + +.selectGroup { + @apply rounded; + @apply border border-gray-400; + @apply shadow-sm; +} + +.selectGroup .select { + @apply border-none border-b; + @apply rounded-none; + @apply shadow-none; +} + +.selectGroup .select:first-child { + @apply rounded-t; +} + +.selectGroup .select:last-child { + @apply rounded-b; + @apply border-none; +} diff --git a/components/table/TableHeader.tsx b/components/table/TableHeader.tsx new file mode 100644 index 0000000..e2c2ffb --- /dev/null +++ b/components/table/TableHeader.tsx @@ -0,0 +1,12 @@ +import {SortIndicator, TableHeaderProps} from 'react-virtualized' + +export default function TableHeader(props: TableHeaderProps) { + return ( + <> + {props.label} + {props.sortBy === props.dataKey && ( + + )} + + ) +} diff --git a/css/app.css b/css/app.css new file mode 100644 index 0000000..f326031 --- /dev/null +++ b/css/app.css @@ -0,0 +1,11 @@ +/* purgecss start ignore */ +@import url('https://fonts.googleapis.com/css2?family=Anonymous+Pro&display=swap'); +@tailwind base; +@tailwind components; +/* purgecss end ignore */ + +@tailwind utilities; + +body { + @apply bg-gray; +} diff --git a/data/hospitals/us.json b/data/hospitals/us.json new file mode 100644 index 0000000..1d7cfff --- /dev/null +++ b/data/hospitals/us.json @@ -0,0 +1,563 @@ +[ + { + "id": 1, + "name": "Alaska", + "abbr": "AK", + "population": 731545, + "licensed_beds": 1760, + "total_beds": 1542, + "icu_beds": 106, + "utilization": 0.380437458, + "pct_icu": 6.87 + }, + { + "id": 2, + "name": "Alabama", + "abbr": "AL", + "population": 4903185, + "licensed_beds": 18667, + "total_beds": 14974, + "icu_beds": 1105, + "utilization": 0.47099424, + "pct_icu": 7.38 + }, + { + "id": 3, + "name": "Arkansas", + "abbr": "AR", + "population": 3017825, + "licensed_beds": 12869, + "total_beds": 9990, + "icu_beds": 667, + "utilization": 0.435393057, + "pct_icu": 6.68 + }, + { + "id": 4, + "name": "Arizona", + "abbr": "AZ", + "population": 7278717, + "licensed_beds": 17163, + "total_beds": 15379, + "icu_beds": 1263, + "utilization": 0.514369816, + "pct_icu": 8.21 + }, + { + "id": 5, + "name": "California", + "abbr": "CA", + "population": 39512223, + "licensed_beds": 85161, + "total_beds": 80802, + "icu_beds": 6925, + "utilization": 0.54043979, + "pct_icu": 8.57 + }, + { + "id": 6, + "name": "Colorado", + "abbr": "CO", + "population": 5758736, + "licensed_beds": 12955, + "total_beds": 10659, + "icu_beds": 962, + "utilization": 0.465875256, + "pct_icu": 9.03 + }, + { + "id": 7, + "name": "Connecticut", + "abbr": "CT", + "population": 3565287, + "licensed_beds": 8185, + "total_beds": 8047, + "icu_beds": 572, + "utilization": 0.608170065, + "pct_icu": 7.11 + }, + { + "id": 8, + "name": "Delaware", + "abbr": "DE", + "population": 973764, + "licensed_beds": 3034, + "total_beds": 2636, + "icu_beds": 140, + "utilization": 0.675049733, + "pct_icu": 5.31 + }, + { + "id": 9, + "name": "Florida", + "abbr": "FL", + "population": 21477737, + "licensed_beds": 61827, + "total_beds": 54821, + "icu_beds": 4979, + "utilization": 0.586008503, + "pct_icu": 9.08 + }, + { + "id": 10, + "name": "Georgia", + "abbr": "GA", + "population": 10617423, + "licensed_beds": 27525, + "total_beds": 23227, + "icu_beds": 2365, + "utilization": 0.545817284, + "pct_icu": 10.18 + }, + { + "id": 11, + "name": "Hawaii", + "abbr": "HI", + "population": 1415872, + "licensed_beds": 3840, + "total_beds": 3361, + "icu_beds": 189, + "utilization": 0.566713418, + "pct_icu": 5.62 + }, + { + "id": 12, + "name": "Iowa", + "abbr": "IA", + "population": 3155070, + "licensed_beds": 11647, + "total_beds": 7749, + "icu_beds": 405, + "utilization": 0.300301859, + "pct_icu": 5.23 + }, + { + "id": 13, + "name": "Idaho", + "abbr": "ID", + "population": 1787147, + "licensed_beds": 3729, + "total_beds": 3325, + "icu_beds": 300, + "utilization": 0.370703648, + "pct_icu": 9.02 + }, + { + "id": 14, + "name": "Illinois", + "abbr": "IL", + "population": 12671821, + "licensed_beds": 36911, + "total_beds": 31103, + "icu_beds": 2589, + "utilization": 0.459973565, + "pct_icu": 8.32 + }, + { + "id": 15, + "name": "Indiana", + "abbr": "IN", + "population": 6732219, + "licensed_beds": 17570, + "total_beds": 17559, + "icu_beds": 1571, + "utilization": 0.469576774, + "pct_icu": 8.95 + }, + { + "id": 16, + "name": "Kansas", + "abbr": "KS", + "population": 2913314, + "licensed_beds": 12507, + "total_beds": 8701, + "icu_beds": 737, + "utilization": 0.379706044, + "pct_icu": 8.47 + }, + { + "id": 17, + "name": "Kentucky", + "abbr": "KY", + "population": 4467673, + "licensed_beds": 16537, + "total_beds": 12975, + "icu_beds": 1303, + "utilization": 0.465596826, + "pct_icu": 10.04 + }, + { + "id": 18, + "name": "Louisiana", + "abbr": "LA", + "population": 4648794, + "licensed_beds": 20245, + "total_beds": 17280, + "icu_beds": 1221, + "utilization": 0.49202741, + "pct_icu": 7.07 + }, + { + "id": 19, + "name": "Massachusetts", + "abbr": "MA", + "population": 6949503, + "licensed_beds": 19240, + "total_beds": 18360, + "icu_beds": 1223, + "utilization": 0.661852196, + "pct_icu": 6.66 + }, + { + "id": 20, + "name": "Maryland", + "abbr": "MD", + "population": 6045680, + "licensed_beds": 12853, + "total_beds": 10873, + "icu_beds": 923, + "utilization": 0.675218296, + "pct_icu": 8.49 + }, + { + "id": 21, + "name": "Maine", + "abbr": "ME", + "population": 1344212, + "licensed_beds": 3887, + "total_beds": 3073, + "icu_beds": 212, + "utilization": 0.528423503, + "pct_icu": 6.9 + }, + { + "id": 22, + "name": "Michigan", + "abbr": "MI", + "population": 9986857, + "licensed_beds": 26132, + "total_beds": 24236, + "icu_beds": 1932, + "utilization": 0.45971872, + "pct_icu": 7.97 + }, + { + "id": 23, + "name": "Minnesota", + "abbr": "MN", + "population": 5639632, + "licensed_beds": 16943, + "total_beds": 11861, + "icu_beds": 925, + "utilization": 0.381379374, + "pct_icu": 7.8 + }, + { + "id": 24, + "name": "Missouri", + "abbr": "MO", + "population": 6137428, + "licensed_beds": 22268, + "total_beds": 19149, + "icu_beds": 1665, + "utilization": 0.499069939, + "pct_icu": 8.69 + }, + { + "id": 25, + "name": "Mississippi", + "abbr": "MS", + "population": 2976149, + "licensed_beds": 14253, + "total_beds": 10538, + "icu_beds": 653, + "utilization": 0.433930804, + "pct_icu": 6.2 + }, + { + "id": 26, + "name": "Montana", + "abbr": "MT", + "population": 1068778, + "licensed_beds": 3362, + "total_beds": 2950, + "icu_beds": 165, + "utilization": 0.466292422, + "pct_icu": 5.59 + }, + { + "id": 27, + "name": "North Carolina", + "abbr": "NC", + "population": 10488084, + "licensed_beds": 28480, + "total_beds": 24777, + "icu_beds": 1773, + "utilization": 0.537633151, + "pct_icu": 7.16 + }, + { + "id": 28, + "name": "North Dakota", + "abbr": "ND", + "population": 762062, + "licensed_beds": 3264, + "total_beds": 3230, + "icu_beds": 208, + "utilization": 0.36541652, + "pct_icu": 6.44 + }, + { + "id": 29, + "name": "Nebraska", + "abbr": "NE", + "population": 1934408, + "licensed_beds": 6436, + "total_beds": 5753, + "icu_beds": 431, + "utilization": 0.293164769, + "pct_icu": 7.49 + }, + { + "id": 30, + "name": "New Hampshire", + "abbr": "NH", + "population": 1359711, + "licensed_beds": 3481, + "total_beds": 2789, + "icu_beds": 240, + "utilization": 0.5802499, + "pct_icu": 8.61 + }, + { + "id": 31, + "name": "New Jersey", + "abbr": "NJ", + "population": 8882190, + "licensed_beds": 26674, + "total_beds": 21365, + "icu_beds": 1437, + "utilization": 0.658698189, + "pct_icu": 6.73 + }, + { + "id": 32, + "name": "New Mexico", + "abbr": "NM", + "population": 2096829, + "licensed_beds": 4867, + "total_beds": 4459, + "icu_beds": 321, + "utilization": 0.423301022, + "pct_icu": 7.2 + }, + { + "id": 33, + "name": "Nevada", + "abbr": "NV", + "population": 3080156, + "licensed_beds": 9119, + "total_beds": 7775, + "icu_beds": 776, + "utilization": 0.552320511, + "pct_icu": 9.98 + }, + { + "id": 34, + "name": "New York", + "abbr": "NY", + "population": 19453561, + "licensed_beds": 54240, + "total_beds": 46491, + "icu_beds": 3109, + "utilization": 0.634998149, + "pct_icu": 6.69 + }, + { + "id": 35, + "name": "Ohio", + "abbr": "OH", + "population": 11689100, + "licensed_beds": 41916, + "total_beds": 32888, + "icu_beds": 2423, + "utilization": 0.503855332, + "pct_icu": 7.37 + }, + { + "id": 36, + "name": "Oklahoma", + "abbr": "OK", + "population": 3956971, + "licensed_beds": 15375, + "total_beds": 12009, + "icu_beds": 859, + "utilization": 0.406408841, + "pct_icu": 7.15 + }, + { + "id": 37, + "name": "Oregon", + "abbr": "OR", + "population": 4217737, + "licensed_beds": 9230, + "total_beds": 7508, + "icu_beds": 652, + "utilization": 0.488090287, + "pct_icu": 8.68 + }, + { + "id": 38, + "name": "Pennsylvania", + "abbr": "PA", + "population": 12801989, + "licensed_beds": 42422, + "total_beds": 37087, + "icu_beds": 2441, + "utilization": 0.5453312, + "pct_icu": 6.58 + }, + { + "id": 39, + "name": "Rhode Island", + "abbr": "RI", + "population": 1059361, + "licensed_beds": 3413, + "total_beds": 2992, + "icu_beds": 246, + "utilization": 0.528377538, + "pct_icu": 8.22 + }, + { + "id": 40, + "name": "South Carolina", + "abbr": "SC", + "population": 5148714, + "licensed_beds": 14508, + "total_beds": 12394, + "icu_beds": 975, + "utilization": 0.538621409, + "pct_icu": 7.87 + }, + { + "id": 41, + "name": "South Dakota", + "abbr": "SD", + "population": 884659, + "licensed_beds": 3269, + "total_beds": 2890, + "icu_beds": 150, + "utilization": 0.280047741, + "pct_icu": 5.19 + }, + { + "id": 42, + "name": "Tennessee", + "abbr": "TN", + "population": 6833174, + "licensed_beds": 22734, + "total_beds": 18259, + "icu_beds": 1653, + "utilization": 0.48065024, + "pct_icu": 9.05 + }, + { + "id": 43, + "name": "Texas", + "abbr": "TX", + "population": 28995881, + "licensed_beds": 80080, + "total_beds": 71175, + "icu_beds": 5623, + "utilization": 0.477313674, + "pct_icu": 7.9 + }, + { + "id": 44, + "name": "Utah", + "abbr": "UT", + "population": 3205958, + "licensed_beds": 6834, + "total_beds": 5636, + "icu_beds": 513, + "utilization": 0.410344995, + "pct_icu": 9.1 + }, + { + "id": 45, + "name": "Virginia", + "abbr": "VA", + "population": 8535519, + "licensed_beds": 18144, + "total_beds": 18144, + "icu_beds": 1306, + "utilization": 0.549241343, + "pct_icu": 7.2 + }, + { + "id": 46, + "name": "Vermont", + "abbr": "VT", + "population": 623989, + "licensed_beds": 1646, + "total_beds": 1131, + "icu_beds": 69, + "utilization": 0.6131128, + "pct_icu": 6.1 + }, + { + "id": 47, + "name": "Washington", + "abbr": "WA", + "population": 7614893, + "licensed_beds": 14088, + "total_beds": 13468, + "icu_beds": 1344, + "utilization": 0.558186283, + "pct_icu": 9.98 + }, + { + "id": 48, + "name": "Wisconsin", + "abbr": "WI", + "population": 5822434, + "licensed_beds": 17407, + "total_beds": 13101, + "icu_beds": 1225, + "utilization": 0.413157521, + "pct_icu": 9.35 + }, + { + "id": 49, + "name": "West Virginia", + "abbr": "WV", + "population": 1792065, + "licensed_beds": 7803, + "total_beds": 6477, + "icu_beds": 458, + "utilization": 0.458130535, + "pct_icu": 7.07 + }, + { + "id": 50, + "name": "Wyoming", + "abbr": "WY", + "population": 578759, + "licensed_beds": 1656, + "total_beds": 1459, + "icu_beds": 102, + "utilization": 0.346542983, + "pct_icu": 6.99 + }, + { + "id": 51, + "name": "District of Columbia", + "abbr": "DC", + "population": 705749, + "licensed_beds": 4143, + "total_beds": 3077, + "icu_beds": 237, + "utilization": 0.66136165, + "pct_icu": "7.7" + } +] diff --git a/data/regions.json b/data/regions.json new file mode 100644 index 0000000..e8fbf9d --- /dev/null +++ b/data/regions.json @@ -0,0 +1,214 @@ +{ + "GB": { + "name": "Great Britain", + "id": "GB", + "regions": { + "_self": { + "name": "All Regions", + "id": "_self" + } + } + }, + "US": { + "name": "United States", + "id": "US", + "regions": { + "US-AL": { + "id": "US-AL", + "name": "Alabama" + }, + "US-AZ": { + "id": "US-AZ", + "name": "Arizona" + }, + "US-AR": { + "id": "US-AR", + "name": "Arkansas" + }, + "US-CA": { + "id": "US-CA", + "name": "California" + }, + "US-CO": { + "id": "US-CO", + "name": "Colorado" + }, + "US-CT": { + "id": "US-CT", + "name": "Connecticut" + }, + "US-DE": { + "id": "US-DE", + "name": "Delaware" + }, + "US-FL": { + "id": "US-FL", + "name": "Florida" + }, + "US-GA": { + "id": "US-GA", + "name": "Georgia" + }, + "US-ID": { + "id": "US-ID", + "name": "Idaho" + }, + "US-IL": { + "id": "US-IL", + "name": "Illinois" + }, + "US-IN": { + "id": "US-IN", + "name": "Indiana" + }, + "US-IA": { + "id": "US-IA", + "name": "Iowa" + }, + "US-KS": { + "id": "US-KS", + "name": "Kansas" + }, + "US-KY": { + "id": "US-KY", + "name": "Kentucky" + }, + "US-LA": { + "id": "US-LA", + "name": "Louisiana" + }, + "US-ME": { + "id": "US-ME", + "name": "Maine" + }, + "US-MD": { + "id": "US-MD", + "name": "Maryland" + }, + "US-MA": { + "id": "US-MA", + "name": "Massachusetts" + }, + "US-MI": { + "id": "US-MI", + "name": "Michigan" + }, + "US-MN": { + "id": "US-MN", + "name": "Minnesota" + }, + "US-MS": { + "id": "US-MS", + "name": "Mississippi" + }, + "US-MO": { + "id": "US-MO", + "name": "Missouri" + }, + "US-MT": { + "id": "US-MT", + "name": "Montana" + }, + "US-NE": { + "id": "US-NE", + "name": "Nebraska" + }, + "US-NV": { + "id": "US-NV", + "name": "Nevada" + }, + "US-NH": { + "id": "US-NH", + "name": "New Hampshire" + }, + "US-NJ": { + "id": "US-NJ", + "name": "New Jersey" + }, + "US-NM": { + "id": "US-NM", + "name": "New Mexico" + }, + "US-NY": { + "id": "US-NY", + "name": "New York" + }, + "US-NC": { + "id": "US-NC", + "name": "North Carolina" + }, + "US-ND": { + "id": "US-ND", + "name": "North Dakota" + }, + "US-OH": { + "id": "US-OH", + "name": "Ohio" + }, + "US-OK": { + "id": "US-OK", + "name": "Oklahoma" + }, + "US-OR": { + "id": "US-OR", + "name": "Oregon" + }, + "US-PA": { + "id": "US-PA", + "name": "Pennsylvania" + }, + "US-RI": { + "id": "US-RI", + "name": "Rhode Island" + }, + "US-SC": { + "id": "US-SC", + "name": "South Carolina" + }, + "US-SD": { + "id": "US-SD", + "name": "South Dakota" + }, + "US-TN": { + "id": "US-TN", + "name": "Tennessee" + }, + "US-TX": { + "id": "US-TX", + "name": "Texas" + }, + "US-UT": { + "id": "US-UT", + "name": "Utah" + }, + "US-VT": { + "id": "US-VT", + "name": "Vermont" + }, + "US-VA": { + "id": "US-VA", + "name": "Virginia" + }, + "US-WA": { + "id": "US-WA", + "name": "Washington" + }, + "US-WV": { + "id": "US-WV", + "name": "West Virginia" + }, + "US-WI": { + "id": "US-WI", + "name": "Wisconsin" + }, + "US-WY": { + "id": "US-WY", + "name": "Wyoming" + }, + "US-DC": { + "id": "US-DC", + "name": "District of Columbia" + } + } + } +} diff --git a/data/result-stub.json b/data/result-stub.json new file mode 100644 index 0000000..31243a6 --- /dev/null +++ b/data/result-stub.json @@ -0,0 +1,16679 @@ +{ + "metadata": { + "parameters": { + "calibrationCaseCount": 43464, + "calibrationDate": "2020-04-27", + "calibrationDeathCount": 1755, + "interventionPeriods": [ + { + "caseIsolation": "aggressive", + "reductionPopulationContact": 38, + "schoolClosure": "aggressive", + "startDate": "2020-03-13", + "voluntaryHomeQuarantine": "aggressive" + }, + { + "caseIsolation": "aggressive", + "reductionPopulationContact": 57, + "schoolClosure": "aggressive", + "socialDistancing": "moderate", + "startDate": "2020-03-19", + "voluntaryHomeQuarantine": "aggressive" + } + ] + }, + "region": "US", + "subregion": "US-CA", + "model": { + "imageURL": "docker.pkg.github.com/covid-modeling/model-runner/mrc-ide-covidsim-connector:0.7.0", + "slug": "mrc-ide-covid-sim" + } + }, + "time": { + "t0": "2020-01-01", + "timestamps": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720 + ], + "extent": [0, 720] + }, + "aggregate": { + "iso_country": "US", + "metrics": { + "Mild": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 10, + 17, + 25, + 40, + 51, + 66, + 84, + 109, + 135, + 169, + 204, + 247, + 304, + 375, + 443, + 560, + 686, + 838, + 999, + 1223, + 1489, + 1788, + 2119, + 2490, + 2865, + 3358, + 3895, + 4537, + 5328, + 6103, + 6908, + 7849, + 8921, + 10265, + 11794, + 13577, + 15475, + 17799, + 20442, + 23142, + 25732, + 28227, + 30521, + 32515, + 34315, + 35909, + 37388, + 38810, + 40019, + 40882, + 41936, + 42973, + 43906, + 44860, + 45785, + 46497, + 47080, + 47875, + 48866, + 49973, + 50870, + 51890, + 52934, + 53946, + 54862, + 56076, + 57012, + 57877, + 58831, + 60051, + 61366, + 62449, + 63621, + 64837, + 65920, + 67404, + 68415, + 69760, + 71219, + 72450, + 73782, + 75290, + 76817, + 78179, + 79790, + 81006, + 82230, + 83992, + 85361, + 86863, + 88340, + 89994, + 91463, + 93116, + 94873, + 96825, + 98343, + 99847, + 101800, + 103684, + 105604, + 107427, + 108762, + 110738, + 112689, + 114496, + 116273, + 117992, + 119804, + 121603, + 123303, + 124756, + 126239, + 127866, + 129589, + 131140, + 132689, + 134136, + 135684, + 137689, + 138965, + 140669, + 141793, + 143255, + 144318, + 145993, + 147379, + 148946, + 150409, + 151837, + 153213, + 154526, + 155753, + 156901, + 157846, + 158959, + 159946, + 160588, + 161416, + 162270, + 163011, + 163732, + 164768, + 165403, + 166173, + 167324, + 168085, + 168618, + 169225, + 169867, + 170753, + 171172, + 171466, + 171790, + 171954, + 172304, + 172640, + 172766, + 173166, + 173315, + 173362, + 173587, + 173262, + 172933, + 172735, + 172727, + 172538, + 171964, + 171712, + 171170, + 170520, + 169948, + 169481, + 168601, + 167880, + 167040, + 165905, + 165226, + 164561, + 163944, + 162695, + 161798, + 160906, + 159540, + 158703, + 157362, + 156510, + 155501, + 154683, + 153468, + 152472, + 151222, + 150260, + 149306, + 148320, + 146797, + 145643, + 144583, + 143270, + 141993, + 140708, + 139522, + 138194, + 136603, + 135102, + 133671, + 131951, + 130260, + 128907, + 127419, + 126297, + 124818, + 123246, + 121471, + 119977, + 118611, + 117367, + 116190, + 114462, + 113171, + 111796, + 110289, + 108716, + 107117, + 105758, + 104354, + 102995, + 101374, + 100114, + 98809, + 97588, + 95918, + 94769, + 93276, + 91748, + 90581, + 89357, + 88005, + 86921, + 85673, + 84348, + 82938, + 81604, + 80405, + 79505, + 78340, + 77012, + 75893, + 74877, + 73885, + 72594, + 71326, + 69924, + 68758, + 67498, + 66522, + 65316, + 64343, + 63322, + 62154, + 61107, + 59900, + 58868, + 58097, + 57055, + 56118, + 55358, + 54470, + 53463, + 52522, + 51572, + 50450, + 49542, + 48667, + 47948, + 47011, + 46167, + 45208, + 44491, + 43651, + 42842, + 42155, + 41616, + 40920, + 40337, + 39658, + 39005, + 38149, + 37451, + 36684, + 36028, + 35457, + 34782, + 34046, + 33551, + 32911, + 32218, + 31819, + 31463, + 30946, + 30388, + 29869, + 29205, + 28628, + 28100, + 27421, + 26862, + 26252, + 25761, + 25139, + 24524, + 23923, + 23275, + 22732, + 22298, + 21890, + 21550, + 21186, + 20637, + 20191, + 19795, + 19407, + 19049, + 18603, + 18342, + 18037, + 17703, + 17345, + 17014, + 16665, + 16266, + 15956, + 15584, + 15283, + 14945, + 14747, + 14367, + 14034, + 13738, + 13340, + 13144, + 12858, + 12704, + 12394, + 12034, + 11827, + 11472, + 11147, + 10896, + 10638, + 10473, + 10268, + 10055, + 9839, + 9637, + 9540, + 9299, + 9143, + 8818, + 8704, + 8607, + 8411, + 8149, + 7991, + 7825, + 7657, + 7572, + 7436, + 7231, + 7109, + 6994, + 6832, + 6652, + 6527, + 6380, + 6281, + 6194, + 6084, + 5992, + 5908, + 5819, + 5638, + 5510, + 5337, + 5215, + 5035, + 4877, + 4733, + 4655, + 4557, + 4518, + 4378, + 4240, + 4156, + 4055, + 3954, + 3850, + 3763, + 3659, + 3619, + 3531, + 3475, + 3417, + 3327, + 3219, + 3113, + 3057, + 2986, + 2908, + 2854, + 2818, + 2771, + 2678, + 2615, + 2566, + 2490, + 2462, + 2423, + 2352, + 2340, + 2286, + 2257, + 2196, + 2143, + 2103, + 2028, + 1978, + 1971, + 1924, + 1905, + 1867, + 1830, + 1800, + 1787, + 1741, + 1704, + 1665, + 1601, + 1572, + 1542, + 1542, + 1535, + 1501, + 1490, + 1476, + 1465, + 1466, + 1474, + 1463, + 1477, + 1448, + 1447, + 1380, + 1368, + 1325, + 1278, + 1226, + 1192, + 1148, + 1108, + 1079, + 1053, + 1020, + 985, + 995, + 988, + 945, + 941, + 934, + 943, + 940, + 939, + 942, + 952, + 914, + 889, + 846, + 830, + 805, + 805, + 786, + 779, + 763, + 738, + 720, + 711, + 676, + 653, + 664, + 666, + 651, + 644, + 657, + 659, + 644, + 653, + 654, + 624, + 621, + 582, + 556, + 536, + 522, + 484, + 472, + 451, + 441, + 417, + 399, + 398, + 390, + 378, + 389, + 384, + 352, + 336, + 334, + 343, + 336, + 329, + 326, + 305, + 305, + 309, + 308, + 305, + 292, + 266, + 275, + 281, + 274, + 262, + 257, + 247, + 235, + 227, + 220, + 220, + 222, + 219, + 224, + 211, + 213, + 208, + 204, + 211, + 219, + 218, + 211, + 205, + 203, + 204, + 203, + 200, + 204, + 196, + 190, + 194, + 208, + 202, + 202, + 197, + 191, + 182, + 166, + 167, + 168, + 181, + 178, + 177, + 172, + 171, + 164, + 156, + 162, + 151, + 149, + 141, + 129, + 130, + 136, + 130, + 137, + 133, + 122, + 131, + 136, + 125, + 116, + 118, + 109, + 110, + 104, + 91, + 93, + 87, + 87, + 90, + 88, + 83, + 84, + 85, + 80, + 78, + 77, + 84, + 82, + 76, + 78, + 70, + 69, + 63, + 65, + 62, + 56, + 58, + 53, + 56, + 54, + 54, + 51, + 58, + 57, + 56, + 54, + 52, + 49, + 49, + 45, + 44, + 38, + 42, + 35, + 33, + 36, + 33, + 31, + 33, + 32, + 31, + 26, + 25, + 26, + 27, + 27, + 32, + 30, + 30, + 30, + 32, + 31, + 30, + 32, + 32, + 40, + 37, + 36, + 39, + 42, + 47, + 49, + 48, + 48, + 51, + 59, + 59 + ], + "ILI": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 11, + 14, + 18, + 22, + 23, + 34, + 48, + 67, + 82, + 106, + 147, + 174, + 219, + 260, + 313, + 406, + 468, + 553, + 636, + 748, + 920, + 1112, + 1299, + 1540, + 1796, + 2096, + 2415, + 2762, + 3153, + 3578, + 4180, + 4728, + 5518, + 6319, + 7280, + 8318, + 9569, + 10892, + 12307, + 13675, + 15030, + 16249, + 17045, + 17869, + 18716, + 19554, + 20249, + 20812, + 21524, + 22120, + 22672, + 23227, + 23650, + 24241, + 24703, + 25133, + 25609, + 26030, + 26504, + 27013, + 27400, + 27884, + 28487, + 28970, + 29586, + 30304, + 31007, + 31638, + 32144, + 32775, + 33320, + 33964, + 34684, + 35175, + 35830, + 36532, + 37246, + 38028, + 38586, + 39301, + 39933, + 40578, + 41390, + 42458, + 43227, + 43829, + 44634, + 45536, + 46121, + 46827, + 47765, + 48792, + 49537, + 50562, + 51545, + 52504, + 53553, + 54462, + 55435, + 56457, + 57188, + 58336, + 59346, + 60256, + 61160, + 62030, + 63022, + 63442, + 64281, + 65123, + 66014, + 66744, + 67907, + 68634, + 69529, + 70356, + 71374, + 72223, + 72909, + 73775, + 74794, + 75680, + 76307, + 76793, + 77592, + 78254, + 78974, + 79416, + 80462, + 81171, + 82042, + 82670, + 83256, + 84063, + 84705, + 85358, + 85576, + 86097, + 86541, + 87076, + 87536, + 87772, + 88187, + 88632, + 89151, + 89347, + 89909, + 90164, + 90579, + 90948, + 91361, + 91636, + 91751, + 91900, + 92102, + 92284, + 92467, + 92155, + 92042, + 92179, + 92231, + 92141, + 92050, + 91802, + 91705, + 91673, + 91470, + 91189, + 90928, + 90887, + 90256, + 90025, + 89650, + 89320, + 89016, + 88623, + 88169, + 87756, + 87011, + 86640, + 86314, + 85797, + 85088, + 84366, + 83954, + 83417, + 82699, + 82255, + 81699, + 81386, + 80834, + 80178, + 79776, + 79147, + 78317, + 77311, + 76582, + 75910, + 75301, + 74556, + 73817, + 73136, + 72369, + 71626, + 70431, + 69833, + 69288, + 68598, + 67549, + 66727, + 65948, + 65218, + 64700, + 63930, + 63074, + 62206, + 61316, + 60618, + 59621, + 59089, + 58496, + 57832, + 57102, + 56344, + 55509, + 54667, + 53842, + 53118, + 52386, + 51793, + 51186, + 50478, + 49868, + 49287, + 48484, + 47828, + 47030, + 46434, + 45675, + 45140, + 44479, + 43790, + 42849, + 42165, + 41578, + 40639, + 40069, + 39454, + 38941, + 38266, + 37718, + 36983, + 36475, + 36001, + 35444, + 34762, + 34039, + 33500, + 32963, + 32439, + 31911, + 31297, + 30805, + 30279, + 29659, + 29090, + 28654, + 28074, + 27627, + 27248, + 26709, + 26307, + 25822, + 25419, + 24963, + 24449, + 24070, + 23627, + 23253, + 22817, + 22348, + 21874, + 21503, + 21126, + 20662, + 20271, + 19919, + 19625, + 19340, + 19057, + 18688, + 18410, + 18119, + 17776, + 17487, + 17205, + 16852, + 16532, + 16193, + 15829, + 15484, + 15219, + 14899, + 14587, + 14344, + 14103, + 14002, + 13788, + 13550, + 13252, + 12933, + 12746, + 12505, + 12215, + 11922, + 11714, + 11388, + 11175, + 10886, + 10650, + 10404, + 10175, + 9983, + 9785, + 9613, + 9428, + 9311, + 9174, + 9079, + 8800, + 8595, + 8395, + 8235, + 8008, + 7810, + 7650, + 7435, + 7273, + 7153, + 6996, + 6862, + 6690, + 6637, + 6479, + 6236, + 6093, + 5890, + 5806, + 5687, + 5600, + 5449, + 5299, + 5127, + 5063, + 5019, + 4874, + 4784, + 4657, + 4553, + 4478, + 4416, + 4333, + 4217, + 4131, + 4061, + 4017, + 3889, + 3811, + 3710, + 3686, + 3619, + 3566, + 3480, + 3404, + 3306, + 3236, + 3161, + 3097, + 3032, + 3019, + 2945, + 2858, + 2786, + 2712, + 2636, + 2558, + 2497, + 2424, + 2331, + 2220, + 2172, + 2138, + 2110, + 2112, + 2083, + 2073, + 2013, + 1989, + 1911, + 1892, + 1851, + 1845, + 1797, + 1746, + 1695, + 1701, + 1676, + 1629, + 1587, + 1523, + 1477, + 1419, + 1373, + 1375, + 1346, + 1279, + 1250, + 1239, + 1236, + 1208, + 1185, + 1161, + 1123, + 1123, + 1113, + 1078, + 1042, + 1019, + 1012, + 995, + 988, + 966, + 942, + 943, + 930, + 905, + 914, + 886, + 856, + 858, + 853, + 856, + 830, + 810, + 801, + 781, + 771, + 746, + 718, + 708, + 713, + 722, + 707, + 698, + 687, + 679, + 676, + 641, + 640, + 628, + 609, + 581, + 567, + 559, + 546, + 540, + 515, + 518, + 482, + 482, + 488, + 476, + 470, + 462, + 458, + 434, + 423, + 420, + 429, + 414, + 403, + 392, + 381, + 360, + 346, + 345, + 352, + 354, + 344, + 352, + 356, + 365, + 358, + 356, + 347, + 342, + 339, + 327, + 315, + 303, + 296, + 281, + 295, + 286, + 289, + 275, + 270, + 262, + 247, + 240, + 220, + 218, + 203, + 206, + 209, + 201, + 205, + 189, + 194, + 195, + 203, + 195, + 182, + 185, + 178, + 170, + 160, + 146, + 141, + 141, + 135, + 145, + 145, + 132, + 134, + 131, + 120, + 116, + 109, + 108, + 107, + 104, + 98, + 92, + 93, + 96, + 102, + 109, + 111, + 111, + 112, + 114, + 111, + 116, + 124, + 120, + 110, + 102, + 98, + 101, + 102, + 92, + 88, + 80, + 86, + 79, + 69, + 74, + 76, + 77, + 80, + 80, + 76, + 82, + 78, + 76, + 74, + 76, + 82, + 86, + 77, + 79, + 79, + 81, + 84, + 81, + 75, + 64, + 65, + 66, + 61, + 58, + 54, + 53, + 58, + 53, + 51, + 44, + 32, + 34, + 37, + 35, + 35, + 34, + 38, + 38, + 37, + 36, + 33, + 35, + 32, + 30, + 32, + 27, + 26, + 27, + 23, + 22, + 21, + 22, + 24, + 25, + 22, + 21, + 19, + 20, + 18, + 21, + 22, + 23, + 18, + 17, + 17, + 18, + 14, + 17, + 18, + 23, + 21, + 20, + 22, + 17, + 20, + 25, + 22, + 20, + 21, + 18, + 19, + 17, + 17, + 14, + 18, + 21, + 23, + 23, + 28, + 28, + 27, + 23, + 22, + 18, + 18, + 21, + 24 + ], + "SARI": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 3, + 4, + 6, + 9, + 11, + 20, + 31, + 36, + 40, + 43, + 50, + 56, + 62, + 76, + 87, + 99, + 121, + 136, + 165, + 210, + 231, + 248, + 299, + 337, + 377, + 439, + 505, + 545, + 592, + 637, + 734, + 822, + 938, + 1038, + 1112, + 1170, + 1217, + 1290, + 1377, + 1471, + 1524, + 1561, + 1597, + 1635, + 1734, + 1732, + 1752, + 1809, + 1866, + 1877, + 1924, + 1944, + 1973, + 2015, + 2077, + 2145, + 2165, + 2208, + 2227, + 2304, + 2349, + 2390, + 2403, + 2475, + 2506, + 2601, + 2649, + 2721, + 2708, + 2780, + 2827, + 2858, + 2930, + 2988, + 3054, + 3116, + 3195, + 3226, + 3275, + 3344, + 3387, + 3459, + 3511, + 3593, + 3691, + 3715, + 3747, + 3851, + 3863, + 3932, + 4047, + 4090, + 4191, + 4288, + 4380, + 4438, + 4497, + 4514, + 4621, + 4722, + 4806, + 4870, + 4960, + 5047, + 5160, + 5231, + 5265, + 5365, + 5411, + 5439, + 5536, + 5696, + 5703, + 5828, + 5877, + 5911, + 5998, + 6009, + 6081, + 6114, + 6111, + 6154, + 6177, + 6167, + 6279, + 6353, + 6369, + 6375, + 6419, + 6580, + 6665, + 6665, + 6689, + 6763, + 6780, + 6786, + 6804, + 6852, + 6898, + 6945, + 6945, + 7064, + 7089, + 7146, + 7168, + 7251, + 7210, + 7196, + 7249, + 7216, + 7244, + 7246, + 7266, + 7336, + 7311, + 7397, + 7411, + 7422, + 7366, + 7271, + 7193, + 7141, + 7092, + 7093, + 7174, + 7171, + 7190, + 7187, + 7166, + 7177, + 7158, + 7070, + 7022, + 7015, + 7005, + 6957, + 6875, + 6899, + 6859, + 6805, + 6729, + 6688, + 6647, + 6595, + 6523, + 6419, + 6454, + 6386, + 6300, + 6262, + 6293, + 6219, + 6189, + 6208, + 6162, + 6028, + 5968, + 5892, + 5826, + 5747, + 5733, + 5702, + 5589, + 5529, + 5489, + 5387, + 5310, + 5211, + 5173, + 5155, + 5174, + 5127, + 5065, + 4984, + 4912, + 4861, + 4796, + 4763, + 4711, + 4665, + 4551, + 4512, + 4476, + 4373, + 4367, + 4379, + 4337, + 4251, + 4216, + 4129, + 4117, + 4007, + 3924, + 3853, + 3763, + 3665, + 3616, + 3564, + 3494, + 3447, + 3399, + 3343, + 3255, + 3204, + 3148, + 3129, + 3020, + 3011, + 2976, + 2930, + 2846, + 2825, + 2765, + 2721, + 2698, + 2621, + 2588, + 2565, + 2504, + 2432, + 2372, + 2349, + 2329, + 2281, + 2255, + 2214, + 2153, + 2101, + 2058, + 2059, + 2004, + 2000, + 1991, + 1944, + 1933, + 1937, + 1888, + 1833, + 1824, + 1821, + 1778, + 1733, + 1718, + 1663, + 1669, + 1641, + 1598, + 1560, + 1534, + 1482, + 1460, + 1435, + 1413, + 1351, + 1326, + 1304, + 1260, + 1231, + 1234, + 1204, + 1181, + 1184, + 1159, + 1114, + 1112, + 1089, + 1055, + 1037, + 1040, + 1040, + 1019, + 985, + 935, + 922, + 905, + 881, + 864, + 845, + 852, + 836, + 805, + 792, + 768, + 767, + 758, + 743, + 724, + 696, + 666, + 666, + 678, + 650, + 630, + 628, + 600, + 581, + 539, + 525, + 549, + 546, + 525, + 524, + 539, + 506, + 501, + 480, + 465, + 447, + 440, + 435, + 427, + 428, + 418, + 411, + 403, + 391, + 383, + 363, + 333, + 328, + 319, + 313, + 299, + 298, + 295, + 301, + 307, + 285, + 278, + 283, + 277, + 264, + 268, + 265, + 259, + 252, + 240, + 239, + 221, + 211, + 224, + 208, + 215, + 193, + 189, + 176, + 174, + 176, + 176, + 180, + 178, + 190, + 183, + 178, + 177, + 172, + 171, + 173, + 166, + 168, + 173, + 172, + 170, + 152, + 138, + 136, + 132, + 130, + 123, + 118, + 112, + 103, + 107, + 105, + 105, + 102, + 104, + 102, + 98, + 93, + 104, + 103, + 102, + 97, + 95, + 92, + 100, + 98, + 94, + 85, + 83, + 80, + 74, + 75, + 70, + 68, + 60, + 59, + 55, + 60, + 67, + 66, + 70, + 68, + 67, + 62, + 57, + 57, + 55, + 57, + 56, + 51, + 49, + 58, + 54, + 50, + 52, + 48, + 48, + 44, + 43, + 38, + 35, + 38, + 37, + 35, + 29, + 31, + 38, + 37, + 39, + 37, + 44, + 41, + 40, + 36, + 33, + 31, + 27, + 28, + 26, + 24, + 27, + 26, + 28, + 26, + 29, + 33, + 30, + 29, + 26, + 28, + 26, + 23, + 20, + 20, + 18, + 18, + 18, + 18, + 17, + 19, + 20, + 21, + 18, + 20, + 20, + 19, + 16, + 15, + 14, + 13, + 15, + 17, + 17, + 15, + 14, + 15, + 18, + 19, + 18, + 14, + 13, + 14, + 12, + 11, + 11, + 10, + 12, + 12, + 13, + 11, + 9, + 8, + 7, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 7, + 8, + 11, + 12, + 14, + 12, + 13, + 12, + 15, + 14, + 13, + 13, + 11, + 9, + 7, + 7, + 7, + 7, + 8, + 10, + 8, + 7, + 6, + 6, + 5, + 4, + 5, + 6, + 5, + 6, + 7, + 8, + 9, + 8, + 11, + 9, + 9, + 11, + 10, + 11, + 7, + 8, + 8, + 7, + 7, + 6, + 6, + 7, + 7, + 6, + 4, + 4, + 4, + 4, + 4, + 4, + 3, + 3, + 3, + 4, + 2, + 1, + 2, + 2, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 2, + 1, + 1, + 2, + 3, + 2, + 2, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ], + "Critical": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 2, + 3, + 6, + 9, + 12, + 16, + 19, + 18, + 24, + 33, + 46, + 51, + 54, + 59, + 65, + 83, + 95, + 104, + 118, + 137, + 171, + 204, + 217, + 232, + 242, + 257, + 300, + 336, + 365, + 370, + 383, + 373, + 374, + 383, + 417, + 431, + 448, + 458, + 484, + 489, + 508, + 518, + 528, + 548, + 552, + 551, + 559, + 600, + 603, + 586, + 603, + 614, + 623, + 661, + 678, + 690, + 714, + 750, + 763, + 764, + 798, + 815, + 821, + 847, + 832, + 876, + 875, + 890, + 893, + 912, + 925, + 913, + 929, + 944, + 970, + 1011, + 1029, + 1036, + 1058, + 1049, + 1115, + 1140, + 1140, + 1149, + 1170, + 1166, + 1206, + 1236, + 1258, + 1282, + 1263, + 1280, + 1303, + 1341, + 1355, + 1400, + 1424, + 1440, + 1458, + 1488, + 1470, + 1484, + 1525, + 1501, + 1527, + 1523, + 1540, + 1556, + 1557, + 1598, + 1622, + 1674, + 1712, + 1728, + 1693, + 1707, + 1767, + 1756, + 1782, + 1793, + 1779, + 1789, + 1778, + 1807, + 1824, + 1852, + 1880, + 1907, + 1893, + 1888, + 1907, + 1918, + 1905, + 1902, + 1941, + 1965, + 1972, + 1959, + 2049, + 2075, + 2066, + 2063, + 2092, + 2084, + 2076, + 2091, + 2064, + 2088, + 2090, + 2103, + 2117, + 2105, + 2080, + 2079, + 2069, + 2059, + 2055, + 2093, + 2085, + 2038, + 2041, + 2070, + 2059, + 2050, + 2029, + 2038, + 2014, + 1998, + 1998, + 1962, + 1959, + 1930, + 1883, + 1877, + 1843, + 1866, + 1853, + 1862, + 1810, + 1786, + 1800, + 1790, + 1789, + 1854, + 1858, + 1792, + 1772, + 1777, + 1753, + 1733, + 1698, + 1677, + 1589, + 1581, + 1565, + 1544, + 1542, + 1527, + 1542, + 1492, + 1461, + 1446, + 1436, + 1417, + 1445, + 1436, + 1462, + 1444, + 1413, + 1371, + 1336, + 1322, + 1355, + 1308, + 1281, + 1276, + 1235, + 1222, + 1247, + 1220, + 1184, + 1165, + 1126, + 1085, + 1105, + 1055, + 1069, + 1075, + 1066, + 1034, + 998, + 1012, + 989, + 981, + 977, + 954, + 936, + 924, + 918, + 909, + 894, + 881, + 867, + 864, + 863, + 830, + 816, + 804, + 775, + 740, + 740, + 736, + 735, + 716, + 712, + 698, + 692, + 654, + 648, + 631, + 622, + 602, + 591, + 590, + 568, + 566, + 542, + 538, + 528, + 517, + 513, + 518, + 519, + 479, + 468, + 467, + 470, + 458, + 446, + 446, + 448, + 456, + 451, + 432, + 420, + 405, + 388, + 375, + 372, + 365, + 371, + 369, + 368, + 366, + 362, + 356, + 356, + 343, + 321, + 312, + 296, + 294, + 290, + 279, + 269, + 264, + 255, + 237, + 218, + 212, + 208, + 203, + 213, + 230, + 219, + 228, + 222, + 207, + 203, + 189, + 182, + 166, + 153, + 146, + 138, + 143, + 154, + 155, + 161, + 154, + 152, + 149, + 152, + 142, + 139, + 139, + 131, + 128, + 124, + 117, + 122, + 116, + 118, + 115, + 112, + 114, + 115, + 123, + 109, + 99, + 100, + 92, + 92, + 100, + 92, + 83, + 75, + 80, + 73, + 76, + 77, + 77, + 74, + 69, + 68, + 63, + 62, + 59, + 61, + 60, + 61, + 65, + 64, + 66, + 64, + 60, + 53, + 54, + 51, + 48, + 47, + 43, + 35, + 37, + 39, + 38, + 38, + 38, + 39, + 36, + 33, + 34, + 33, + 33, + 30, + 40, + 35, + 31, + 31, + 33, + 32, + 33, + 32, + 35, + 31, + 31, + 28, + 23, + 26, + 29, + 27, + 29, + 27, + 27, + 23, + 27, + 29, + 26, + 27, + 26, + 22, + 22, + 18, + 14, + 14, + 16, + 16, + 16, + 16, + 14, + 17, + 20, + 22, + 24, + 27, + 25, + 25, + 25, + 22, + 20, + 21, + 18, + 18, + 16, + 16, + 15, + 14, + 15, + 14, + 13, + 14, + 15, + 16, + 14, + 14, + 13, + 12, + 13, + 10, + 8, + 9, + 9, + 6, + 7, + 6, + 6, + 8, + 9, + 9, + 10, + 10, + 8, + 12, + 10, + 7, + 7, + 6, + 5, + 3, + 2, + 2, + 3, + 6, + 6, + 5, + 4, + 4, + 4, + 3, + 5, + 5, + 5, + 4, + 4, + 4, + 4, + 6, + 5, + 5, + 6, + 6, + 4, + 4, + 4, + 2, + 1, + 1, + 2, + 2, + 3, + 3, + 5, + 5, + 3, + 3, + 4, + 3, + 4, + 4, + 4, + 3, + 3, + 2, + 2, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 0, + 0, + 0, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 0, + 0, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "CritRecov": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 3, + 2, + 1, + 1, + 1, + 6, + 8, + 8, + 12, + 13, + 11, + 14, + 12, + 15, + 20, + 19, + 26, + 27, + 33, + 33, + 36, + 43, + 45, + 58, + 59, + 65, + 74, + 67, + 63, + 53, + 68, + 73, + 75, + 76, + 90, + 84, + 87, + 88, + 98, + 98, + 101, + 105, + 102, + 101, + 113, + 103, + 95, + 89, + 85, + 79, + 83, + 95, + 120, + 117, + 123, + 115, + 117, + 120, + 115, + 116, + 134, + 150, + 141, + 118, + 130, + 137, + 132, + 139, + 156, + 159, + 162, + 177, + 168, + 161, + 155, + 167, + 172, + 175, + 180, + 178, + 187, + 173, + 170, + 185, + 205, + 187, + 180, + 202, + 204, + 202, + 184, + 200, + 202, + 227, + 239, + 216, + 216, + 233, + 255, + 241, + 251, + 248, + 235, + 240, + 254, + 274, + 279, + 282, + 259, + 247, + 246, + 257, + 283, + 283, + 283, + 276, + 286, + 268, + 254, + 271, + 268, + 282, + 294, + 308, + 306, + 329, + 308, + 304, + 299, + 298, + 291, + 259, + 277, + 315, + 337, + 336, + 343, + 382, + 347, + 328, + 326, + 340, + 351, + 338, + 344, + 346, + 343, + 347, + 336, + 345, + 324, + 321, + 334, + 355, + 350, + 347, + 352, + 338, + 319, + 328, + 327, + 336, + 321, + 317, + 307, + 309, + 311, + 310, + 284, + 291, + 308, + 300, + 314, + 299, + 284, + 269, + 257, + 262, + 278, + 290, + 271, + 272, + 264, + 256, + 263, + 277, + 252, + 283, + 274, + 259, + 248, + 236, + 244, + 268, + 235, + 232, + 228, + 228, + 220, + 225, + 229, + 236, + 230, + 222, + 213, + 201, + 199, + 220, + 226, + 219, + 214, + 214, + 209, + 200, + 193, + 179, + 186, + 179, + 180, + 162, + 162, + 161, + 160, + 157, + 153, + 168, + 160, + 156, + 152, + 146, + 133, + 139, + 143, + 155, + 152, + 140, + 125, + 126, + 148, + 135, + 136, + 147, + 135, + 122, + 120, + 109, + 122, + 117, + 127, + 140, + 140, + 129, + 141, + 137, + 124, + 119, + 94, + 95, + 78, + 104, + 97, + 94, + 96, + 83, + 73, + 69, + 76, + 76, + 72, + 65, + 72, + 78, + 68, + 69, + 59, + 64, + 70, + 60, + 67, + 76, + 63, + 63, + 62, + 61, + 50, + 50, + 51, + 47, + 52, + 46, + 51, + 55, + 49, + 40, + 48, + 49, + 52, + 54, + 44, + 38, + 43, + 51, + 43, + 40, + 31, + 34, + 29, + 35, + 32, + 39, + 41, + 38, + 36, + 25, + 29, + 31, + 23, + 25, + 24, + 27, + 25, + 28, + 25, + 21, + 22, + 21, + 22, + 21, + 16, + 22, + 23, + 20, + 18, + 22, + 24, + 23, + 23, + 22, + 23, + 19, + 17, + 15, + 18, + 23, + 12, + 11, + 11, + 18, + 23, + 22, + 18, + 18, + 15, + 11, + 13, + 12, + 9, + 12, + 13, + 12, + 12, + 9, + 11, + 7, + 8, + 12, + 9, + 11, + 10, + 14, + 13, + 15, + 15, + 16, + 12, + 13, + 11, + 10, + 9, + 12, + 9, + 11, + 7, + 9, + 7, + 6, + 5, + 5, + 3, + 3, + 4, + 3, + 5, + 9, + 7, + 7, + 4, + 5, + 4, + 6, + 5, + 5, + 2, + 3, + 2, + 3, + 3, + 6, + 4, + 2, + 4, + 4, + 3, + 4, + 2, + 1, + 3, + 2, + 3, + 3, + 3, + 3, + 2, + 2, + 1, + 2, + 4, + 1, + 0, + 1, + 2, + 6, + 6, + 2, + 3, + 3, + 3, + 3, + 4, + 2, + 4, + 3, + 3, + 4, + 4, + 3, + 2, + 2, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 3, + 3, + 3, + 3, + 2, + 0, + 1, + 2, + 3, + 3, + 2, + 3, + 3, + 2, + 1, + 3, + 2, + 2, + 2, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 3, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 2, + 3, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "incDeath": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 1, + 4, + 7, + 6, + 9, + 5, + 8, + 6, + 9, + 8, + 11, + 16, + 11, + 19, + 14, + 23, + 29, + 32, + 32, + 35, + 37, + 48, + 49, + 63, + 70, + 64, + 75, + 75, + 72, + 87, + 94, + 83, + 91, + 82, + 98, + 110, + 101, + 112, + 99, + 116, + 116, + 112, + 106, + 109, + 97, + 144, + 126, + 132, + 116, + 141, + 126, + 139, + 144, + 170, + 135, + 148, + 159, + 164, + 172, + 174, + 158, + 188, + 168, + 177, + 176, + 178, + 192, + 206, + 207, + 197, + 216, + 209, + 179, + 232, + 229, + 233, + 223, + 232, + 230, + 216, + 238, + 238, + 220, + 248, + 273, + 268, + 278, + 264, + 267, + 264, + 272, + 269, + 278, + 302, + 314, + 336, + 318, + 308, + 330, + 299, + 332, + 325, + 343, + 332, + 322, + 359, + 366, + 333, + 379, + 343, + 358, + 390, + 377, + 342, + 380, + 398, + 378, + 376, + 375, + 377, + 386, + 403, + 391, + 399, + 416, + 389, + 417, + 426, + 422, + 432, + 400, + 402, + 393, + 401, + 447, + 426, + 435, + 442, + 398, + 437, + 421, + 405, + 433, + 454, + 411, + 468, + 445, + 442, + 463, + 470, + 429, + 477, + 443, + 406, + 440, + 417, + 417, + 413, + 418, + 430, + 443, + 467, + 439, + 430, + 455, + 396, + 384, + 428, + 415, + 432, + 394, + 429, + 379, + 374, + 387, + 404, + 420, + 369, + 356, + 363, + 361, + 376, + 414, + 373, + 375, + 370, + 389, + 334, + 348, + 387, + 310, + 343, + 355, + 317, + 321, + 314, + 317, + 330, + 330, + 300, + 335, + 301, + 305, + 277, + 307, + 292, + 295, + 300, + 266, + 267, + 293, + 268, + 263, + 267, + 242, + 241, + 279, + 262, + 263, + 247, + 268, + 226, + 238, + 232, + 233, + 240, + 230, + 214, + 206, + 204, + 212, + 206, + 223, + 199, + 172, + 200, + 171, + 178, + 186, + 182, + 168, + 171, + 173, + 181, + 184, + 196, + 164, + 151, + 167, + 165, + 147, + 130, + 152, + 124, + 160, + 148, + 138, + 111, + 120, + 123, + 115, + 105, + 122, + 110, + 125, + 121, + 112, + 120, + 107, + 124, + 117, + 132, + 113, + 91, + 83, + 112, + 102, + 79, + 85, + 74, + 106, + 89, + 99, + 83, + 80, + 87, + 83, + 63, + 84, + 79, + 82, + 58, + 67, + 55, + 63, + 78, + 64, + 67, + 54, + 74, + 62, + 64, + 54, + 55, + 61, + 47, + 56, + 54, + 43, + 58, + 34, + 63, + 54, + 40, + 45, + 37, + 47, + 48, + 42, + 27, + 49, + 42, + 31, + 32, + 36, + 31, + 40, + 35, + 30, + 32, + 32, + 26, + 39, + 27, + 33, + 31, + 26, + 24, + 29, + 25, + 24, + 23, + 21, + 24, + 28, + 30, + 31, + 19, + 23, + 17, + 18, + 16, + 16, + 20, + 17, + 22, + 16, + 19, + 13, + 23, + 20, + 16, + 12, + 14, + 17, + 15, + 13, + 10, + 10, + 7, + 10, + 12, + 15, + 13, + 16, + 11, + 9, + 4, + 12, + 14, + 8, + 9, + 10, + 10, + 6, + 10, + 11, + 4, + 13, + 8, + 3, + 11, + 10, + 18, + 5, + 10, + 7, + 10, + 9, + 9, + 5, + 6, + 6, + 6, + 16, + 2, + 5, + 13, + 5, + 2, + 4, + 6, + 5, + 5, + 5, + 4, + 9, + 9, + 5, + 6, + 8, + 4, + 3, + 4, + 3, + 6, + 5, + 3, + 0, + 4, + 5, + 1, + 7, + 5, + 4, + 4, + 5, + 5, + 4, + 4, + 6, + 4, + 3, + 6, + 2, + 2, + 4, + 4, + 2, + 2, + 3, + 5, + 5, + 3, + 2, + 3, + 4, + 0, + 4, + 2, + 3, + 0, + 2, + 3, + 3, + 3, + 1, + 3, + 2, + 0, + 1, + 1, + 3, + 1, + 2, + 2, + 0, + 1, + 2, + 1, + 1, + 2, + 4, + 3, + 0, + 2, + 0, + 0, + 2, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 2, + 1, + 1, + 0, + 2, + 0, + 0, + 0, + 3, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 0, + 1, + 2, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 1, + 1, + 0, + 2, + 1, + 0, + 2, + 0, + 0, + 2, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 2, + 1, + 0, + 1, + 0, + 1, + 0, + 3, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 2, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "cumMild": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 10, + 18, + 26, + 42, + 54, + 77, + 103, + 131, + 167, + 211, + 262, + 326, + 409, + 505, + 612, + 767, + 940, + 1158, + 1408, + 1725, + 2117, + 2552, + 3067, + 3623, + 4268, + 5060, + 5961, + 7010, + 8240, + 9569, + 11074, + 12825, + 14788, + 17085, + 19703, + 22766, + 26183, + 30165, + 34727, + 39693, + 44835, + 50178, + 55767, + 61407, + 67218, + 73075, + 79173, + 85386, + 91824, + 98155, + 104757, + 111485, + 118318, + 125206, + 132249, + 139398, + 146510, + 153963, + 161490, + 169388, + 177089, + 185080, + 193269, + 201628, + 210080, + 218826, + 227580, + 236411, + 245447, + 254852, + 264481, + 274091, + 283810, + 293869, + 304031, + 314361, + 324818, + 335663, + 346787, + 358096, + 369357, + 380935, + 392900, + 404825, + 417262, + 429703, + 442193, + 455318, + 468345, + 481796, + 495172, + 509112, + 523211, + 537628, + 552350, + 567331, + 582380, + 597531, + 613450, + 629464, + 645753, + 662215, + 678655, + 695871, + 713242, + 730643, + 748411, + 766267, + 784518, + 803012, + 821532, + 840281, + 859368, + 878736, + 898269, + 918103, + 938272, + 958345, + 978738, + 999626, + 1020133, + 1041229, + 1062459, + 1083843, + 1105177, + 1127325, + 1149271, + 1171524, + 1193929, + 1216398, + 1239129, + 1262165, + 1285207, + 1308546, + 1331661, + 1355090, + 1378850, + 1402280, + 1426111, + 1449834, + 1473694, + 1497673, + 1522011, + 1546321, + 1570709, + 1595581, + 1620151, + 1644799, + 1669414, + 1694420, + 1719431, + 1744037, + 1768940, + 1793957, + 1818800, + 1843756, + 1868790, + 1893647, + 1918905, + 1943879, + 1968908, + 1994034, + 2018866, + 2043604, + 2068365, + 2093175, + 2117812, + 2142397, + 2167104, + 2191559, + 2215828, + 2239858, + 2263875, + 2287605, + 2311436, + 2334955, + 2358460, + 2381846, + 2405153, + 2428308, + 2451099, + 2473896, + 2496577, + 2518896, + 2541230, + 2563210, + 2585308, + 2607198, + 2629117, + 2650626, + 2671811, + 2692947, + 2714006, + 2734969, + 2755866, + 2776226, + 2796828, + 2817104, + 2836875, + 2856518, + 2876014, + 2895323, + 2914490, + 2933327, + 2952094, + 2970246, + 2988282, + 3006140, + 3024087, + 3041561, + 3059105, + 3076292, + 3093250, + 3110039, + 3126345, + 3142870, + 3158946, + 3174914, + 3190569, + 3206073, + 3221313, + 3236364, + 3251378, + 3265955, + 3280457, + 3294713, + 3308860, + 3322668, + 3336243, + 3349797, + 3363139, + 3376059, + 3389078, + 3401747, + 3414176, + 3426613, + 3438805, + 3450606, + 3462499, + 3474264, + 3485752, + 3496914, + 3508132, + 3519088, + 3529917, + 3540558, + 3550910, + 3561172, + 3571271, + 3581274, + 3591043, + 3600548, + 3610027, + 3619230, + 3628329, + 3637457, + 3646157, + 3654928, + 3663479, + 3671723, + 3679968, + 3687962, + 3695984, + 3703933, + 3711630, + 3719099, + 3726616, + 3734010, + 3741186, + 3748225, + 3755156, + 3761824, + 3768631, + 3775242, + 3781762, + 3787920, + 3794158, + 3800131, + 3806163, + 3811987, + 3817745, + 3823430, + 3829149, + 3834703, + 3840236, + 3845550, + 3850694, + 3855798, + 3860834, + 3865715, + 3870567, + 3875325, + 3879964, + 3884517, + 3889095, + 3893466, + 3897767, + 3902198, + 3906477, + 3910574, + 3914648, + 3918643, + 3922481, + 3926260, + 3930055, + 3933643, + 3937205, + 3940645, + 3944019, + 3947273, + 3950540, + 3953729, + 3956764, + 3959822, + 3962834, + 3965785, + 3968664, + 3971489, + 3974230, + 3976834, + 3979495, + 3982100, + 3984652, + 3987069, + 3989602, + 3991981, + 3994310, + 3996689, + 3998955, + 4001171, + 4003348, + 4005472, + 4007499, + 4009581, + 4011546, + 4013573, + 4015439, + 4017300, + 4019142, + 4020904, + 4022700, + 4024455, + 4026162, + 4027781, + 4029344, + 4030868, + 4032393, + 4033867, + 4035354, + 4036742, + 4038160, + 4039568, + 4040898, + 4042220, + 4043490, + 4044822, + 4046058, + 4047275, + 4048387, + 4049548, + 4050732, + 4051796, + 4052844, + 4053893, + 4054952, + 4055972, + 4056957, + 4057974, + 4058895, + 4059860, + 4060778, + 4061693, + 4062556, + 4063441, + 4064291, + 4065111, + 4065928, + 4066731, + 4067526, + 4068358, + 4069155, + 4069831, + 4070547, + 4071219, + 4071864, + 4072510, + 4073126, + 4073742, + 4074388, + 4074972, + 4075586, + 4076151, + 4076693, + 4077254, + 4077786, + 4078307, + 4078837, + 4079339, + 4079806, + 4080326, + 4080804, + 4081284, + 4081743, + 4082170, + 4082599, + 4083014, + 4083420, + 4083788, + 4084178, + 4084556, + 4084943, + 4085286, + 4085602, + 4085951, + 4086298, + 4086608, + 4086972, + 4087341, + 4087648, + 4087977, + 4088270, + 4088573, + 4088872, + 4089161, + 4089435, + 4089706, + 4089987, + 4090264, + 4090507, + 4090747, + 4091013, + 4091267, + 4091520, + 4091755, + 4091987, + 4092215, + 4092436, + 4092629, + 4092848, + 4093073, + 4093293, + 4093517, + 4093704, + 4093904, + 4094117, + 4094312, + 4094510, + 4094736, + 4094944, + 4095159, + 4095355, + 4095552, + 4095706, + 4095905, + 4096082, + 4096236, + 4096395, + 4096538, + 4096689, + 4096832, + 4096967, + 4097109, + 4097261, + 4097378, + 4097519, + 4097654, + 4097775, + 4097909, + 4098050, + 4098186, + 4098315, + 4098453, + 4098582, + 4098717, + 4098821, + 4098922, + 4099022, + 4099145, + 4099244, + 4099361, + 4099460, + 4099571, + 4099676, + 4099757, + 4099853, + 4099957, + 4100048, + 4100134, + 4100248, + 4100342, + 4100437, + 4100532, + 4100631, + 4100721, + 4100805, + 4100899, + 4100991, + 4101061, + 4101141, + 4101211, + 4101273, + 4101326, + 4101392, + 4101446, + 4101506, + 4101562, + 4101625, + 4101679, + 4101744, + 4101803, + 4101851, + 4101905, + 4101962, + 4102009, + 4102045, + 4102090, + 4102142, + 4102195, + 4102239, + 4102283, + 4102330, + 4102362, + 4102408, + 4102452, + 4102500, + 4102538, + 4102574, + 4102597, + 4102646, + 4102688, + 4102718, + 4102750, + 4102790, + 4102817, + 4102849, + 4102886, + 4102912, + 4102941, + 4102966, + 4102996, + 4103030, + 4103047, + 4103085, + 4103108, + 4103139, + 4103174, + 4103210, + 4103240, + 4103264, + 4103294, + 4103325, + 4103353, + 4103382, + 4103409, + 4103438, + 4103465, + 4103493, + 4103525, + 4103562, + 4103591, + 4103619, + 4103646, + 4103671, + 4103699, + 4103716, + 4103734, + 4103758, + 4103787, + 4103813, + 4103834, + 4103854, + 4103874, + 4103897, + 4103918, + 4103944, + 4103961, + 4103977, + 4103992, + 4104004, + 4104025, + 4104048, + 4104066, + 4104090, + 4104108, + 4104125, + 4104147, + 4104169, + 4104180, + 4104195, + 4104209, + 4104219, + 4104228, + 4104240, + 4104245, + 4104260, + 4104271, + 4104282, + 4104294, + 4104312, + 4104317, + 4104329, + 4104343, + 4104355, + 4104364, + 4104372, + 4104387, + 4104395, + 4104400, + 4104410, + 4104413, + 4104421, + 4104426, + 4104434, + 4104442, + 4104445, + 4104456, + 4104464, + 4104473, + 4104480, + 4104489, + 4104494, + 4104505, + 4104510, + 4104516, + 4104522, + 4104527, + 4104531, + 4104540, + 4104543, + 4104546, + 4104547, + 4104553, + 4104557, + 4104559, + 4104566, + 4104568, + 4104573, + 4104577, + 4104579, + 4104582, + 4104587, + 4104589, + 4104594, + 4104597, + 4104602, + 4104610, + 4104612, + 4104617, + 4104623, + 4104628, + 4104633, + 4104634, + 4104643, + 4104647, + 4104656, + 4104660, + 4104665, + 4104669, + 4104677, + 4104683, + 4104690, + 4104697, + 4104703, + 4104713, + 4104725, + 4104737 + ], + "cumILI": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 11, + 15, + 20, + 25, + 28, + 41, + 57, + 79, + 100, + 130, + 180, + 223, + 283, + 343, + 421, + 541, + 641, + 778, + 927, + 1108, + 1354, + 1645, + 1972, + 2341, + 2774, + 3253, + 3805, + 4434, + 5153, + 5961, + 6974, + 8039, + 9337, + 10755, + 12440, + 14308, + 16517, + 18985, + 21633, + 24364, + 27315, + 30342, + 33247, + 36267, + 39467, + 42776, + 46120, + 49492, + 53034, + 56572, + 60216, + 63941, + 67645, + 71426, + 75345, + 79246, + 83312, + 87360, + 91611, + 95893, + 100184, + 104580, + 109077, + 113621, + 118341, + 123225, + 128244, + 133224, + 138255, + 143283, + 148595, + 154053, + 159596, + 165055, + 170685, + 176498, + 182432, + 188475, + 194471, + 200661, + 206935, + 213405, + 220026, + 226811, + 233567, + 240385, + 247386, + 254609, + 261763, + 269085, + 276770, + 284588, + 292262, + 300254, + 308317, + 316628, + 325213, + 333633, + 342293, + 351238, + 360109, + 369313, + 378684, + 387977, + 397495, + 407022, + 416607, + 426274, + 436250, + 446388, + 456640, + 466939, + 477576, + 488064, + 498797, + 509708, + 520853, + 532015, + 543242, + 554673, + 566176, + 577832, + 589325, + 600929, + 612760, + 624797, + 636856, + 648762, + 661151, + 673596, + 686162, + 698731, + 711276, + 724066, + 736849, + 749763, + 762512, + 775568, + 788530, + 801700, + 814686, + 827734, + 840962, + 854309, + 867901, + 881207, + 894752, + 908164, + 921744, + 935371, + 949074, + 962709, + 976267, + 989947, + 1003466, + 1017191, + 1030883, + 1044434, + 1058160, + 1071835, + 1085464, + 1099087, + 1112592, + 1126013, + 1139443, + 1152863, + 1166294, + 1179567, + 1192910, + 1206196, + 1219268, + 1232355, + 1245266, + 1258292, + 1271223, + 1284044, + 1296744, + 1309479, + 1321808, + 1334403, + 1347044, + 1359249, + 1371395, + 1383504, + 1395685, + 1407740, + 1419647, + 1431523, + 1443157, + 1454895, + 1466453, + 1477974, + 1489399, + 1500750, + 1511815, + 1522687, + 1533704, + 1544487, + 1555288, + 1565896, + 1576413, + 1586919, + 1597230, + 1607455, + 1617326, + 1627350, + 1637230, + 1646845, + 1656285, + 1665631, + 1674922, + 1684259, + 1693591, + 1702709, + 1711475, + 1720121, + 1728772, + 1737358, + 1745701, + 1754103, + 1762405, + 1770594, + 1778567, + 1786451, + 1794055, + 1801725, + 1809270, + 1816705, + 1824075, + 1831448, + 1838771, + 1845811, + 1852818, + 1859736, + 1866480, + 1873196, + 1879874, + 1886439, + 1892873, + 1899076, + 1905253, + 1911355, + 1917300, + 1923101, + 1928885, + 1934341, + 1940082, + 1945480, + 1951033, + 1956338, + 1961612, + 1966755, + 1971853, + 1976937, + 1981880, + 1986662, + 1991344, + 1996008, + 2000596, + 2005037, + 2009493, + 2013776, + 2018009, + 2022154, + 2026215, + 2030319, + 2034403, + 2038286, + 2042129, + 2045931, + 2049623, + 2053260, + 2056859, + 2060388, + 2063834, + 2067180, + 2070542, + 2073821, + 2076935, + 2080041, + 2083129, + 2086105, + 2089130, + 2092045, + 2094862, + 2097679, + 2100485, + 2103279, + 2105975, + 2108576, + 2111182, + 2113786, + 2116279, + 2118674, + 2121078, + 2123472, + 2125787, + 2128011, + 2130182, + 2132386, + 2134514, + 2136590, + 2138620, + 2140596, + 2142547, + 2144511, + 2146474, + 2148354, + 2150208, + 2151997, + 2153728, + 2155480, + 2157213, + 2158922, + 2160548, + 2162142, + 2163653, + 2165166, + 2166656, + 2168138, + 2169531, + 2170880, + 2172221, + 2173543, + 2174841, + 2176137, + 2177459, + 2178752, + 2180023, + 2181180, + 2182382, + 2183511, + 2184606, + 2185721, + 2186761, + 2187815, + 2188804, + 2189796, + 2190792, + 2191725, + 2192665, + 2193585, + 2194522, + 2195327, + 2196148, + 2197008, + 2197773, + 2198600, + 2199333, + 2200095, + 2200832, + 2201573, + 2202285, + 2202991, + 2203707, + 2204360, + 2205010, + 2205655, + 2206273, + 2206898, + 2207530, + 2208127, + 2208711, + 2209277, + 2209844, + 2210422, + 2210931, + 2211448, + 2211942, + 2212457, + 2212933, + 2213407, + 2213852, + 2214333, + 2214769, + 2215222, + 2215643, + 2216075, + 2216498, + 2216912, + 2217286, + 2217672, + 2218063, + 2218435, + 2218786, + 2219097, + 2219433, + 2219769, + 2220052, + 2220339, + 2220657, + 2220944, + 2221241, + 2221568, + 2221867, + 2222135, + 2222393, + 2222664, + 2222917, + 2223213, + 2223451, + 2223698, + 2223942, + 2224178, + 2224387, + 2224646, + 2224872, + 2225065, + 2225274, + 2225475, + 2225650, + 2225824, + 2226013, + 2226223, + 2226403, + 2226560, + 2226738, + 2226906, + 2227098, + 2227265, + 2227440, + 2227583, + 2227735, + 2227897, + 2228047, + 2228183, + 2228320, + 2228458, + 2228604, + 2228738, + 2228883, + 2229002, + 2229134, + 2229279, + 2229410, + 2229534, + 2229670, + 2229780, + 2229902, + 2230040, + 2230162, + 2230285, + 2230398, + 2230497, + 2230608, + 2230709, + 2230805, + 2230901, + 2231000, + 2231107, + 2231200, + 2231315, + 2231404, + 2231493, + 2231589, + 2231668, + 2231757, + 2231832, + 2231931, + 2232017, + 2232091, + 2232164, + 2232259, + 2232335, + 2232410, + 2232486, + 2232548, + 2232636, + 2232692, + 2232763, + 2232825, + 2232887, + 2232955, + 2233017, + 2233079, + 2233124, + 2233188, + 2233245, + 2233309, + 2233367, + 2233410, + 2233464, + 2233521, + 2233568, + 2233616, + 2233664, + 2233710, + 2233764, + 2233811, + 2233876, + 2233929, + 2233980, + 2234028, + 2234073, + 2234125, + 2234170, + 2234213, + 2234262, + 2234302, + 2234347, + 2234387, + 2234418, + 2234473, + 2234511, + 2234554, + 2234583, + 2234615, + 2234639, + 2234667, + 2234697, + 2234718, + 2234748, + 2234768, + 2234805, + 2234841, + 2234865, + 2234896, + 2234915, + 2234945, + 2234968, + 2235001, + 2235020, + 2235038, + 2235062, + 2235088, + 2235111, + 2235127, + 2235142, + 2235159, + 2235185, + 2235204, + 2235229, + 2235245, + 2235257, + 2235274, + 2235290, + 2235300, + 2235313, + 2235327, + 2235342, + 2235361, + 2235373, + 2235385, + 2235398, + 2235413, + 2235426, + 2235444, + 2235459, + 2235481, + 2235495, + 2235510, + 2235526, + 2235541, + 2235562, + 2235583, + 2235592, + 2235613, + 2235624, + 2235636, + 2235648, + 2235663, + 2235675, + 2235685, + 2235691, + 2235709, + 2235718, + 2235724, + 2235741, + 2235755, + 2235764, + 2235775, + 2235788, + 2235798, + 2235815, + 2235821, + 2235832, + 2235842, + 2235853, + 2235869, + 2235879, + 2235888, + 2235904, + 2235915, + 2235924, + 2235933, + 2235945, + 2235952, + 2235957, + 2235968, + 2235978, + 2235984, + 2235989, + 2235997, + 2236004, + 2236014, + 2236019, + 2236026, + 2236029, + 2236032, + 2236040, + 2236046, + 2236051, + 2236057, + 2236060, + 2236067, + 2236069, + 2236074, + 2236078, + 2236082, + 2236086, + 2236087, + 2236092, + 2236095, + 2236101, + 2236104, + 2236107, + 2236110, + 2236115, + 2236116, + 2236119, + 2236123, + 2236126, + 2236127, + 2236129, + 2236131, + 2236134, + 2236137, + 2236141, + 2236145, + 2236146, + 2236146, + 2236147, + 2236150, + 2236151, + 2236152, + 2236157, + 2236161, + 2236167, + 2236168, + 2236169, + 2236172, + 2236174, + 2236178, + 2236183, + 2236186, + 2236187, + 2236193, + 2236194, + 2236200, + 2236202, + 2236204, + 2236206, + 2236211, + 2236214, + 2236218, + 2236220, + 2236228, + 2236230, + 2236232, + 2236233, + 2236235, + 2236236, + 2236238, + 2236244, + 2236249 + ], + "cumSARI": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 3, + 4, + 5, + 7, + 10, + 14, + 23, + 35, + 41, + 50, + 58, + 71, + 86, + 100, + 128, + 152, + 182, + 220, + 268, + 328, + 397, + 448, + 497, + 582, + 668, + 766, + 881, + 1018, + 1150, + 1309, + 1469, + 1652, + 1856, + 2094, + 2330, + 2573, + 2828, + 3062, + 3316, + 3593, + 3868, + 4139, + 4424, + 4702, + 4984, + 5317, + 5584, + 5900, + 6219, + 6559, + 6879, + 7216, + 7544, + 7898, + 8240, + 8577, + 8966, + 9320, + 9662, + 10045, + 10453, + 10851, + 11264, + 11646, + 12080, + 12509, + 12971, + 13421, + 13905, + 14355, + 14850, + 15314, + 15797, + 16286, + 16794, + 17291, + 17822, + 18341, + 18862, + 19418, + 19990, + 20544, + 21142, + 21748, + 22360, + 23029, + 23638, + 24278, + 24934, + 25572, + 26254, + 26915, + 27596, + 28319, + 29036, + 29791, + 30558, + 31316, + 32060, + 32837, + 33645, + 34412, + 35206, + 36023, + 36862, + 37726, + 38594, + 39484, + 40349, + 41175, + 42049, + 42974, + 43923, + 44779, + 45703, + 46642, + 47564, + 48512, + 49483, + 50449, + 51435, + 52365, + 53327, + 54334, + 55278, + 56310, + 57332, + 58353, + 59324, + 60307, + 61409, + 62451, + 63478, + 64519, + 65607, + 66626, + 67691, + 68724, + 69821, + 70942, + 72043, + 73128, + 74256, + 75338, + 76435, + 77536, + 78700, + 79802, + 80894, + 82085, + 83174, + 84294, + 85385, + 86507, + 87658, + 88797, + 89911, + 91056, + 92175, + 93295, + 94362, + 95430, + 96517, + 97610, + 98708, + 99858, + 100947, + 102026, + 103098, + 104125, + 105213, + 106304, + 107339, + 108399, + 109496, + 110549, + 111572, + 112558, + 113567, + 114574, + 115558, + 116525, + 117493, + 118489, + 119454, + 120426, + 121346, + 122308, + 123259, + 124151, + 125069, + 126021, + 126931, + 127853, + 128828, + 129703, + 130515, + 131360, + 132184, + 132990, + 133816, + 134648, + 135453, + 136222, + 137019, + 137823, + 138547, + 139327, + 140036, + 140808, + 141561, + 142316, + 143059, + 143788, + 144493, + 145197, + 145918, + 146606, + 147272, + 147951, + 148598, + 149214, + 149850, + 150485, + 151085, + 151724, + 152371, + 152979, + 153547, + 154138, + 154698, + 155268, + 155781, + 156331, + 156840, + 157374, + 157883, + 158413, + 158905, + 159363, + 159859, + 160340, + 160805, + 161259, + 161709, + 162141, + 162589, + 163007, + 163455, + 163887, + 164305, + 164686, + 165092, + 165462, + 165837, + 166248, + 166613, + 166980, + 167338, + 167675, + 168004, + 168333, + 168676, + 169008, + 169326, + 169634, + 169934, + 170235, + 170504, + 170783, + 171088, + 171371, + 171649, + 171892, + 172163, + 172441, + 172741, + 172984, + 173211, + 173486, + 173758, + 173998, + 174215, + 174462, + 174681, + 174921, + 175128, + 175342, + 175571, + 175797, + 175983, + 176187, + 176388, + 176566, + 176724, + 176900, + 177068, + 177238, + 177416, + 177588, + 177737, + 177897, + 178096, + 178241, + 178400, + 178552, + 178692, + 178825, + 178974, + 179123, + 179267, + 179402, + 179529, + 179632, + 179762, + 179873, + 179973, + 180069, + 180197, + 180323, + 180430, + 180531, + 180650, + 180760, + 180881, + 180991, + 181081, + 181177, + 181259, + 181331, + 181421, + 181518, + 181587, + 181676, + 181765, + 181838, + 181910, + 181967, + 182034, + 182133, + 182209, + 182281, + 182352, + 182434, + 182499, + 182559, + 182618, + 182674, + 182730, + 182790, + 182858, + 182917, + 182973, + 183031, + 183084, + 183136, + 183187, + 183231, + 183272, + 183311, + 183349, + 183390, + 183437, + 183477, + 183520, + 183563, + 183615, + 183653, + 183678, + 183716, + 183759, + 183796, + 183827, + 183872, + 183903, + 183932, + 183960, + 183992, + 184027, + 184051, + 184081, + 184120, + 184142, + 184178, + 184189, + 184212, + 184239, + 184264, + 184297, + 184321, + 184343, + 184360, + 184398, + 184426, + 184445, + 184471, + 184488, + 184518, + 184540, + 184558, + 184585, + 184611, + 184625, + 184648, + 184666, + 184682, + 184700, + 184718, + 184735, + 184750, + 184769, + 184782, + 184791, + 184809, + 184822, + 184836, + 184853, + 184871, + 184882, + 184896, + 184903, + 184917, + 184931, + 184943, + 184956, + 184969, + 184982, + 185003, + 185018, + 185025, + 185033, + 185043, + 185054, + 185064, + 185076, + 185082, + 185089, + 185096, + 185104, + 185111, + 185120, + 185134, + 185146, + 185159, + 185169, + 185179, + 185192, + 185198, + 185207, + 185214, + 185223, + 185228, + 185232, + 185238, + 185252, + 185257, + 185261, + 185268, + 185273, + 185283, + 185287, + 185291, + 185296, + 185301, + 185310, + 185317, + 185319, + 185321, + 185327, + 185336, + 185343, + 185350, + 185355, + 185364, + 185368, + 185373, + 185376, + 185380, + 185384, + 185389, + 185392, + 185396, + 185398, + 185405, + 185409, + 185412, + 185413, + 185419, + 185423, + 185425, + 185427, + 185430, + 185435, + 185438, + 185440, + 185443, + 185446, + 185447, + 185451, + 185452, + 185455, + 185457, + 185459, + 185462, + 185465, + 185467, + 185471, + 185473, + 185475, + 185475, + 185477, + 185478, + 185478, + 185482, + 185486, + 185489, + 185491, + 185491, + 185495, + 185498, + 185501, + 185501, + 185501, + 185501, + 185503, + 185504, + 185505, + 185507, + 185509, + 185511, + 185512, + 185513, + 185514, + 185514, + 185517, + 185518, + 185519, + 185520, + 185521, + 185522, + 185522, + 185523, + 185524, + 185525, + 185526, + 185529, + 185531, + 185533, + 185533, + 185535, + 185538, + 185543, + 185545, + 185546, + 185547, + 185547, + 185547, + 185548, + 185548, + 185549, + 185550, + 185552, + 185555, + 185555, + 185556, + 185557, + 185558, + 185559, + 185559, + 185560, + 185562, + 185563, + 185565, + 185567, + 185569, + 185571, + 185571, + 185575, + 185576, + 185578, + 185580, + 185580, + 185581, + 185581, + 185582, + 185582, + 185583, + 185583, + 185583, + 185583, + 185584, + 185585, + 185586, + 185586, + 185586, + 185586, + 185587, + 185587, + 185587, + 185587, + 185587, + 185587, + 185588, + 185589, + 185589, + 185590, + 185590, + 185590, + 185590, + 185590, + 185590, + 185590, + 185590, + 185590, + 185590, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185592, + 185593, + 185593, + 185594, + 185595, + 185596, + 185596, + 185596, + 185596, + 185596, + 185596, + 185596, + 185596, + 185596, + 185596, + 185596, + 185597, + 185597, + 185597, + 185597 + ], + "cumCritical": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 4, + 8, + 11, + 14, + 18, + 22, + 27, + 35, + 46, + 59, + 67, + 79, + 94, + 109, + 133, + 152, + 175, + 204, + 237, + 287, + 336, + 375, + 419, + 465, + 516, + 581, + 658, + 731, + 791, + 852, + 898, + 972, + 1039, + 1123, + 1198, + 1272, + 1353, + 1449, + 1521, + 1610, + 1700, + 1789, + 1879, + 1962, + 2053, + 2146, + 2252, + 2356, + 2444, + 2556, + 2661, + 2768, + 2881, + 2982, + 3089, + 3216, + 3347, + 3461, + 3583, + 3730, + 3858, + 3980, + 4119, + 4238, + 4393, + 4527, + 4664, + 4803, + 4950, + 5088, + 5231, + 5382, + 5527, + 5690, + 5862, + 6040, + 6204, + 6388, + 6540, + 6752, + 6933, + 7113, + 7284, + 7473, + 7654, + 7867, + 8088, + 8284, + 8505, + 8694, + 8884, + 9080, + 9296, + 9521, + 9763, + 9990, + 10210, + 10466, + 10695, + 10906, + 11154, + 11401, + 11599, + 11862, + 12081, + 12318, + 12569, + 12808, + 13079, + 13335, + 13638, + 13915, + 14168, + 14412, + 14676, + 14970, + 15252, + 15546, + 15819, + 16074, + 16357, + 16612, + 16898, + 17191, + 17481, + 17781, + 18079, + 18365, + 18644, + 18961, + 19262, + 19543, + 19837, + 20150, + 20441, + 20736, + 21036, + 21392, + 21728, + 22030, + 22328, + 22659, + 22942, + 23258, + 23582, + 23894, + 24219, + 24554, + 24872, + 25194, + 25526, + 25843, + 26146, + 26464, + 26769, + 27061, + 27420, + 27736, + 28013, + 28329, + 28653, + 28959, + 29263, + 29544, + 29840, + 30133, + 30430, + 30724, + 30985, + 31271, + 31573, + 31837, + 32110, + 32407, + 32698, + 32965, + 33255, + 33497, + 33756, + 34031, + 34291, + 34553, + 34861, + 35129, + 35377, + 35625, + 35884, + 36138, + 36396, + 36614, + 36857, + 37073, + 37286, + 37526, + 37744, + 37964, + 38177, + 38405, + 38610, + 38828, + 39051, + 39252, + 39461, + 39710, + 39915, + 40146, + 40348, + 40550, + 40737, + 40920, + 41101, + 41319, + 41467, + 41660, + 41846, + 42007, + 42187, + 42386, + 42555, + 42710, + 42870, + 43010, + 43169, + 43357, + 43489, + 43634, + 43803, + 43960, + 44101, + 44230, + 44391, + 44531, + 44661, + 44804, + 44943, + 45079, + 45203, + 45330, + 45461, + 45590, + 45728, + 45853, + 45977, + 46094, + 46203, + 46313, + 46431, + 46542, + 46647, + 46756, + 46862, + 46959, + 47055, + 47147, + 47249, + 47332, + 47423, + 47527, + 47608, + 47695, + 47770, + 47849, + 47917, + 47977, + 48063, + 48149, + 48226, + 48293, + 48361, + 48441, + 48513, + 48595, + 48655, + 48721, + 48787, + 48858, + 48915, + 48982, + 49044, + 49110, + 49170, + 49225, + 49283, + 49339, + 49394, + 49440, + 49494, + 49556, + 49597, + 49644, + 49694, + 49749, + 49815, + 49857, + 49911, + 49960, + 49995, + 50029, + 50065, + 50094, + 50133, + 50182, + 50225, + 50262, + 50294, + 50322, + 50348, + 50368, + 50402, + 50438, + 50464, + 50508, + 50545, + 50578, + 50623, + 50651, + 50676, + 50705, + 50724, + 50742, + 50759, + 50778, + 50800, + 50816, + 50841, + 50870, + 50894, + 50922, + 50942, + 50959, + 50979, + 51004, + 51021, + 51041, + 51060, + 51077, + 51097, + 51114, + 51122, + 51143, + 51161, + 51181, + 51193, + 51209, + 51228, + 51243, + 51267, + 51276, + 51290, + 51309, + 51317, + 51326, + 51342, + 51354, + 51363, + 51371, + 51384, + 51393, + 51407, + 51421, + 51431, + 51441, + 51453, + 51464, + 51471, + 51481, + 51488, + 51498, + 51505, + 51511, + 51523, + 51533, + 51541, + 51550, + 51557, + 51564, + 51574, + 51581, + 51590, + 51596, + 51601, + 51604, + 51613, + 51618, + 51621, + 51629, + 51636, + 51645, + 51649, + 51655, + 51663, + 51669, + 51673, + 51674, + 51687, + 51689, + 51691, + 51694, + 51700, + 51706, + 51713, + 51720, + 51723, + 51725, + 51730, + 51732, + 51736, + 51742, + 51746, + 51750, + 51755, + 51757, + 51762, + 51764, + 51768, + 51774, + 51779, + 51785, + 51791, + 51791, + 51794, + 51795, + 51797, + 51798, + 51801, + 51805, + 51809, + 51812, + 51814, + 51817, + 51820, + 51825, + 51830, + 51834, + 51835, + 51838, + 51842, + 51846, + 51848, + 51852, + 51853, + 51854, + 51855, + 51856, + 51859, + 51861, + 51864, + 51866, + 51867, + 51871, + 51874, + 51876, + 51877, + 51878, + 51880, + 51882, + 51884, + 51884, + 51884, + 51885, + 51888, + 51888, + 51891, + 51891, + 51892, + 51894, + 51896, + 51897, + 51899, + 51900, + 51901, + 51905, + 51905, + 51906, + 51907, + 51907, + 51908, + 51908, + 51908, + 51909, + 51910, + 51913, + 51914, + 51914, + 51914, + 51914, + 51914, + 51915, + 51917, + 51917, + 51919, + 51919, + 51919, + 51920, + 51920, + 51922, + 51922, + 51922, + 51924, + 51924, + 51924, + 51924, + 51924, + 51924, + 51924, + 51924, + 51925, + 51925, + 51926, + 51926, + 51928, + 51928, + 51928, + 51928, + 51929, + 51929, + 51930, + 51931, + 51932, + 51932, + 51932, + 51932, + 51932, + 51932, + 51932, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51934, + 51934, + 51936, + 51936, + 51936, + 51936, + 51936, + 51938, + 51938, + 51938, + 51938, + 51939, + 51939, + 51939, + 51939, + 51939, + 51940, + 51941, + 51942, + 51942, + 51942, + 51942, + 51942, + 51943, + 51943, + 51944, + 51944, + 51944, + 51945, + 51945, + 51945, + 51947, + 51947, + 51947, + 51947, + 51948, + 51948, + 51948, + 51948, + 51948, + 51948, + 51948, + 51948, + 51948, + 51948, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950 + ], + "cumCritRecov": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 5, + 5, + 6, + 6, + 6, + 13, + 19, + 22, + 26, + 30, + 37, + 44, + 52, + 60, + 70, + 81, + 99, + 115, + 132, + 142, + 162, + 185, + 211, + 239, + 270, + 307, + 338, + 361, + 390, + 415, + 447, + 484, + 518, + 549, + 602, + 645, + 681, + 719, + 769, + 809, + 845, + 892, + 945, + 993, + 1041, + 1087, + 1125, + 1160, + 1201, + 1236, + 1281, + 1335, + 1392, + 1445, + 1499, + 1551, + 1609, + 1658, + 1708, + 1774, + 1847, + 1916, + 1974, + 2025, + 2100, + 2170, + 2231, + 2298, + 2364, + 2442, + 2516, + 2603, + 2668, + 2742, + 2814, + 2906, + 2993, + 3079, + 3166, + 3236, + 3329, + 3415, + 3507, + 3609, + 3694, + 3780, + 3871, + 3978, + 4066, + 4158, + 4247, + 4364, + 4451, + 4559, + 4671, + 4775, + 4870, + 4985, + 5092, + 5201, + 5321, + 5431, + 5540, + 5657, + 5768, + 5883, + 5993, + 6128, + 6238, + 6352, + 6492, + 6604, + 6737, + 6868, + 6996, + 7122, + 7253, + 7375, + 7491, + 7622, + 7742, + 7890, + 8014, + 8159, + 8284, + 8423, + 8561, + 8699, + 8835, + 8964, + 9104, + 9220, + 9369, + 9529, + 9686, + 9828, + 9980, + 10164, + 10305, + 10468, + 10602, + 10752, + 10895, + 11052, + 11206, + 11355, + 11511, + 11673, + 11811, + 11956, + 12098, + 12248, + 12413, + 12570, + 12721, + 12889, + 13050, + 13183, + 13311, + 13462, + 13594, + 13732, + 13866, + 14001, + 14166, + 14304, + 14437, + 14585, + 14711, + 14845, + 14997, + 15132, + 15263, + 15388, + 15526, + 15647, + 15756, + 15879, + 16027, + 16147, + 16264, + 16392, + 16517, + 16637, + 16772, + 16907, + 17019, + 17151, + 17262, + 17379, + 17479, + 17574, + 17695, + 17816, + 17918, + 18006, + 18106, + 18210, + 18313, + 18420, + 18536, + 18655, + 18763, + 18860, + 18962, + 19053, + 19140, + 19246, + 19343, + 19445, + 19536, + 19632, + 19722, + 19810, + 19894, + 19984, + 20070, + 20150, + 20229, + 20293, + 20376, + 20443, + 20523, + 20597, + 20665, + 20750, + 20807, + 20872, + 20935, + 21008, + 21072, + 21135, + 21209, + 21284, + 21351, + 21411, + 21467, + 21518, + 21591, + 21642, + 21695, + 21762, + 21822, + 21873, + 21924, + 21965, + 22030, + 22082, + 22139, + 22188, + 22249, + 22304, + 22358, + 22410, + 22454, + 22503, + 22533, + 22577, + 22610, + 22672, + 22709, + 22743, + 22778, + 22817, + 22848, + 22881, + 22928, + 22964, + 22992, + 23023, + 23059, + 23098, + 23123, + 23160, + 23183, + 23214, + 23251, + 23276, + 23310, + 23341, + 23365, + 23392, + 23416, + 23434, + 23452, + 23476, + 23498, + 23521, + 23551, + 23574, + 23601, + 23623, + 23645, + 23665, + 23688, + 23706, + 23733, + 23757, + 23773, + 23793, + 23813, + 23832, + 23850, + 23868, + 23881, + 23895, + 23911, + 23930, + 23944, + 23963, + 23981, + 23997, + 24010, + 24019, + 24034, + 24051, + 24060, + 24072, + 24084, + 24096, + 24107, + 24119, + 24131, + 24137, + 24147, + 24158, + 24170, + 24181, + 24188, + 24202, + 24212, + 24221, + 24232, + 24240, + 24253, + 24262, + 24271, + 24280, + 24289, + 24296, + 24304, + 24311, + 24324, + 24334, + 24340, + 24347, + 24353, + 24365, + 24373, + 24381, + 24384, + 24388, + 24394, + 24399, + 24404, + 24411, + 24417, + 24425, + 24434, + 24440, + 24443, + 24446, + 24449, + 24451, + 24456, + 24463, + 24467, + 24474, + 24478, + 24486, + 24493, + 24498, + 24507, + 24513, + 24514, + 24519, + 24523, + 24525, + 24526, + 24529, + 24533, + 24538, + 24540, + 24548, + 24551, + 24555, + 24558, + 24560, + 24561, + 24564, + 24567, + 24568, + 24571, + 24575, + 24577, + 24580, + 24580, + 24584, + 24585, + 24587, + 24589, + 24591, + 24591, + 24593, + 24594, + 24596, + 24599, + 24602, + 24602, + 24603, + 24607, + 24609, + 24610, + 24612, + 24613, + 24616, + 24620, + 24620, + 24621, + 24622, + 24624, + 24627, + 24628, + 24628, + 24628, + 24629, + 24631, + 24632, + 24632, + 24634, + 24635, + 24640, + 24641, + 24641, + 24642, + 24642, + 24644, + 24644, + 24646, + 24647, + 24649, + 24650, + 24652, + 24653, + 24655, + 24655, + 24657, + 24657, + 24657, + 24657, + 24657, + 24658, + 24659, + 24659, + 24661, + 24662, + 24664, + 24665, + 24666, + 24666, + 24666, + 24667, + 24668, + 24669, + 24670, + 24670, + 24671, + 24674, + 24674, + 24674, + 24676, + 24677, + 24678, + 24679, + 24679, + 24679, + 24680, + 24680, + 24680, + 24680, + 24680, + 24682, + 24682, + 24682, + 24683, + 24683, + 24683, + 24683, + 24683, + 24683, + 24684, + 24684, + 24685, + 24685, + 24686, + 24686, + 24686, + 24687, + 24687, + 24687, + 24687, + 24687, + 24687, + 24687, + 24687, + 24687, + 24688, + 24688, + 24688, + 24689, + 24689, + 24690, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24692, + 24692, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695 + ] + } + }, + "regions": [ + { + "iso_country": "US", + "metrics": { + "Mild": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 10, + 17, + 25, + 40, + 51, + 66, + 84, + 109, + 135, + 169, + 204, + 247, + 304, + 375, + 443, + 560, + 686, + 838, + 999, + 1223, + 1489, + 1788, + 2119, + 2490, + 2865, + 3358, + 3895, + 4537, + 5328, + 6103, + 6908, + 7849, + 8921, + 10265, + 11794, + 13577, + 15475, + 17799, + 20442, + 23142, + 25732, + 28227, + 30521, + 32515, + 34315, + 35909, + 37388, + 38810, + 40019, + 40882, + 41936, + 42973, + 43906, + 44860, + 45785, + 46497, + 47080, + 47875, + 48866, + 49973, + 50870, + 51890, + 52934, + 53946, + 54862, + 56076, + 57012, + 57877, + 58831, + 60051, + 61366, + 62449, + 63621, + 64837, + 65920, + 67404, + 68415, + 69760, + 71219, + 72450, + 73782, + 75290, + 76817, + 78179, + 79790, + 81006, + 82230, + 83992, + 85361, + 86863, + 88340, + 89994, + 91463, + 93116, + 94873, + 96825, + 98343, + 99847, + 101800, + 103684, + 105604, + 107427, + 108762, + 110738, + 112689, + 114496, + 116273, + 117992, + 119804, + 121603, + 123303, + 124756, + 126239, + 127866, + 129589, + 131140, + 132689, + 134136, + 135684, + 137689, + 138965, + 140669, + 141793, + 143255, + 144318, + 145993, + 147379, + 148946, + 150409, + 151837, + 153213, + 154526, + 155753, + 156901, + 157846, + 158959, + 159946, + 160588, + 161416, + 162270, + 163011, + 163732, + 164768, + 165403, + 166173, + 167324, + 168085, + 168618, + 169225, + 169867, + 170753, + 171172, + 171466, + 171790, + 171954, + 172304, + 172640, + 172766, + 173166, + 173315, + 173362, + 173587, + 173262, + 172933, + 172735, + 172727, + 172538, + 171964, + 171712, + 171170, + 170520, + 169948, + 169481, + 168601, + 167880, + 167040, + 165905, + 165226, + 164561, + 163944, + 162695, + 161798, + 160906, + 159540, + 158703, + 157362, + 156510, + 155501, + 154683, + 153468, + 152472, + 151222, + 150260, + 149306, + 148320, + 146797, + 145643, + 144583, + 143270, + 141993, + 140708, + 139522, + 138194, + 136603, + 135102, + 133671, + 131951, + 130260, + 128907, + 127419, + 126297, + 124818, + 123246, + 121471, + 119977, + 118611, + 117367, + 116190, + 114462, + 113171, + 111796, + 110289, + 108716, + 107117, + 105758, + 104354, + 102995, + 101374, + 100114, + 98809, + 97588, + 95918, + 94769, + 93276, + 91748, + 90581, + 89357, + 88005, + 86921, + 85673, + 84348, + 82938, + 81604, + 80405, + 79505, + 78340, + 77012, + 75893, + 74877, + 73885, + 72594, + 71326, + 69924, + 68758, + 67498, + 66522, + 65316, + 64343, + 63322, + 62154, + 61107, + 59900, + 58868, + 58097, + 57055, + 56118, + 55358, + 54470, + 53463, + 52522, + 51572, + 50450, + 49542, + 48667, + 47948, + 47011, + 46167, + 45208, + 44491, + 43651, + 42842, + 42155, + 41616, + 40920, + 40337, + 39658, + 39005, + 38149, + 37451, + 36684, + 36028, + 35457, + 34782, + 34046, + 33551, + 32911, + 32218, + 31819, + 31463, + 30946, + 30388, + 29869, + 29205, + 28628, + 28100, + 27421, + 26862, + 26252, + 25761, + 25139, + 24524, + 23923, + 23275, + 22732, + 22298, + 21890, + 21550, + 21186, + 20637, + 20191, + 19795, + 19407, + 19049, + 18603, + 18342, + 18037, + 17703, + 17345, + 17014, + 16665, + 16266, + 15956, + 15584, + 15283, + 14945, + 14747, + 14367, + 14034, + 13738, + 13340, + 13144, + 12858, + 12704, + 12394, + 12034, + 11827, + 11472, + 11147, + 10896, + 10638, + 10473, + 10268, + 10055, + 9839, + 9637, + 9540, + 9299, + 9143, + 8818, + 8704, + 8607, + 8411, + 8149, + 7991, + 7825, + 7657, + 7572, + 7436, + 7231, + 7109, + 6994, + 6832, + 6652, + 6527, + 6380, + 6281, + 6194, + 6084, + 5992, + 5908, + 5819, + 5638, + 5510, + 5337, + 5215, + 5035, + 4877, + 4733, + 4655, + 4557, + 4518, + 4378, + 4240, + 4156, + 4055, + 3954, + 3850, + 3763, + 3659, + 3619, + 3531, + 3475, + 3417, + 3327, + 3219, + 3113, + 3057, + 2986, + 2908, + 2854, + 2818, + 2771, + 2678, + 2615, + 2566, + 2490, + 2462, + 2423, + 2352, + 2340, + 2286, + 2257, + 2196, + 2143, + 2103, + 2028, + 1978, + 1971, + 1924, + 1905, + 1867, + 1830, + 1800, + 1787, + 1741, + 1704, + 1665, + 1601, + 1572, + 1542, + 1542, + 1535, + 1501, + 1490, + 1476, + 1465, + 1466, + 1474, + 1463, + 1477, + 1448, + 1447, + 1380, + 1368, + 1325, + 1278, + 1226, + 1192, + 1148, + 1108, + 1079, + 1053, + 1020, + 985, + 995, + 988, + 945, + 941, + 934, + 943, + 940, + 939, + 942, + 952, + 914, + 889, + 846, + 830, + 805, + 805, + 786, + 779, + 763, + 738, + 720, + 711, + 676, + 653, + 664, + 666, + 651, + 644, + 657, + 659, + 644, + 653, + 654, + 624, + 621, + 582, + 556, + 536, + 522, + 484, + 472, + 451, + 441, + 417, + 399, + 398, + 390, + 378, + 389, + 384, + 352, + 336, + 334, + 343, + 336, + 329, + 326, + 305, + 305, + 309, + 308, + 305, + 292, + 266, + 275, + 281, + 274, + 262, + 257, + 247, + 235, + 227, + 220, + 220, + 222, + 219, + 224, + 211, + 213, + 208, + 204, + 211, + 219, + 218, + 211, + 205, + 203, + 204, + 203, + 200, + 204, + 196, + 190, + 194, + 208, + 202, + 202, + 197, + 191, + 182, + 166, + 167, + 168, + 181, + 178, + 177, + 172, + 171, + 164, + 156, + 162, + 151, + 149, + 141, + 129, + 130, + 136, + 130, + 137, + 133, + 122, + 131, + 136, + 125, + 116, + 118, + 109, + 110, + 104, + 91, + 93, + 87, + 87, + 90, + 88, + 83, + 84, + 85, + 80, + 78, + 77, + 84, + 82, + 76, + 78, + 70, + 69, + 63, + 65, + 62, + 56, + 58, + 53, + 56, + 54, + 54, + 51, + 58, + 57, + 56, + 54, + 52, + 49, + 49, + 45, + 44, + 38, + 42, + 35, + 33, + 36, + 33, + 31, + 33, + 32, + 31, + 26, + 25, + 26, + 27, + 27, + 32, + 30, + 30, + 30, + 32, + 31, + 30, + 32, + 32, + 40, + 37, + 36, + 39, + 42, + 47, + 49, + 48, + 48, + 51, + 59, + 59 + ], + "ILI": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 11, + 14, + 18, + 22, + 23, + 34, + 48, + 67, + 82, + 106, + 147, + 174, + 219, + 260, + 313, + 406, + 468, + 553, + 636, + 748, + 920, + 1112, + 1299, + 1540, + 1796, + 2096, + 2415, + 2762, + 3153, + 3578, + 4180, + 4728, + 5518, + 6319, + 7280, + 8318, + 9569, + 10892, + 12307, + 13675, + 15030, + 16249, + 17045, + 17869, + 18716, + 19554, + 20249, + 20812, + 21524, + 22120, + 22672, + 23227, + 23650, + 24241, + 24703, + 25133, + 25609, + 26030, + 26504, + 27013, + 27400, + 27884, + 28487, + 28970, + 29586, + 30304, + 31007, + 31638, + 32144, + 32775, + 33320, + 33964, + 34684, + 35175, + 35830, + 36532, + 37246, + 38028, + 38586, + 39301, + 39933, + 40578, + 41390, + 42458, + 43227, + 43829, + 44634, + 45536, + 46121, + 46827, + 47765, + 48792, + 49537, + 50562, + 51545, + 52504, + 53553, + 54462, + 55435, + 56457, + 57188, + 58336, + 59346, + 60256, + 61160, + 62030, + 63022, + 63442, + 64281, + 65123, + 66014, + 66744, + 67907, + 68634, + 69529, + 70356, + 71374, + 72223, + 72909, + 73775, + 74794, + 75680, + 76307, + 76793, + 77592, + 78254, + 78974, + 79416, + 80462, + 81171, + 82042, + 82670, + 83256, + 84063, + 84705, + 85358, + 85576, + 86097, + 86541, + 87076, + 87536, + 87772, + 88187, + 88632, + 89151, + 89347, + 89909, + 90164, + 90579, + 90948, + 91361, + 91636, + 91751, + 91900, + 92102, + 92284, + 92467, + 92155, + 92042, + 92179, + 92231, + 92141, + 92050, + 91802, + 91705, + 91673, + 91470, + 91189, + 90928, + 90887, + 90256, + 90025, + 89650, + 89320, + 89016, + 88623, + 88169, + 87756, + 87011, + 86640, + 86314, + 85797, + 85088, + 84366, + 83954, + 83417, + 82699, + 82255, + 81699, + 81386, + 80834, + 80178, + 79776, + 79147, + 78317, + 77311, + 76582, + 75910, + 75301, + 74556, + 73817, + 73136, + 72369, + 71626, + 70431, + 69833, + 69288, + 68598, + 67549, + 66727, + 65948, + 65218, + 64700, + 63930, + 63074, + 62206, + 61316, + 60618, + 59621, + 59089, + 58496, + 57832, + 57102, + 56344, + 55509, + 54667, + 53842, + 53118, + 52386, + 51793, + 51186, + 50478, + 49868, + 49287, + 48484, + 47828, + 47030, + 46434, + 45675, + 45140, + 44479, + 43790, + 42849, + 42165, + 41578, + 40639, + 40069, + 39454, + 38941, + 38266, + 37718, + 36983, + 36475, + 36001, + 35444, + 34762, + 34039, + 33500, + 32963, + 32439, + 31911, + 31297, + 30805, + 30279, + 29659, + 29090, + 28654, + 28074, + 27627, + 27248, + 26709, + 26307, + 25822, + 25419, + 24963, + 24449, + 24070, + 23627, + 23253, + 22817, + 22348, + 21874, + 21503, + 21126, + 20662, + 20271, + 19919, + 19625, + 19340, + 19057, + 18688, + 18410, + 18119, + 17776, + 17487, + 17205, + 16852, + 16532, + 16193, + 15829, + 15484, + 15219, + 14899, + 14587, + 14344, + 14103, + 14002, + 13788, + 13550, + 13252, + 12933, + 12746, + 12505, + 12215, + 11922, + 11714, + 11388, + 11175, + 10886, + 10650, + 10404, + 10175, + 9983, + 9785, + 9613, + 9428, + 9311, + 9174, + 9079, + 8800, + 8595, + 8395, + 8235, + 8008, + 7810, + 7650, + 7435, + 7273, + 7153, + 6996, + 6862, + 6690, + 6637, + 6479, + 6236, + 6093, + 5890, + 5806, + 5687, + 5600, + 5449, + 5299, + 5127, + 5063, + 5019, + 4874, + 4784, + 4657, + 4553, + 4478, + 4416, + 4333, + 4217, + 4131, + 4061, + 4017, + 3889, + 3811, + 3710, + 3686, + 3619, + 3566, + 3480, + 3404, + 3306, + 3236, + 3161, + 3097, + 3032, + 3019, + 2945, + 2858, + 2786, + 2712, + 2636, + 2558, + 2497, + 2424, + 2331, + 2220, + 2172, + 2138, + 2110, + 2112, + 2083, + 2073, + 2013, + 1989, + 1911, + 1892, + 1851, + 1845, + 1797, + 1746, + 1695, + 1701, + 1676, + 1629, + 1587, + 1523, + 1477, + 1419, + 1373, + 1375, + 1346, + 1279, + 1250, + 1239, + 1236, + 1208, + 1185, + 1161, + 1123, + 1123, + 1113, + 1078, + 1042, + 1019, + 1012, + 995, + 988, + 966, + 942, + 943, + 930, + 905, + 914, + 886, + 856, + 858, + 853, + 856, + 830, + 810, + 801, + 781, + 771, + 746, + 718, + 708, + 713, + 722, + 707, + 698, + 687, + 679, + 676, + 641, + 640, + 628, + 609, + 581, + 567, + 559, + 546, + 540, + 515, + 518, + 482, + 482, + 488, + 476, + 470, + 462, + 458, + 434, + 423, + 420, + 429, + 414, + 403, + 392, + 381, + 360, + 346, + 345, + 352, + 354, + 344, + 352, + 356, + 365, + 358, + 356, + 347, + 342, + 339, + 327, + 315, + 303, + 296, + 281, + 295, + 286, + 289, + 275, + 270, + 262, + 247, + 240, + 220, + 218, + 203, + 206, + 209, + 201, + 205, + 189, + 194, + 195, + 203, + 195, + 182, + 185, + 178, + 170, + 160, + 146, + 141, + 141, + 135, + 145, + 145, + 132, + 134, + 131, + 120, + 116, + 109, + 108, + 107, + 104, + 98, + 92, + 93, + 96, + 102, + 109, + 111, + 111, + 112, + 114, + 111, + 116, + 124, + 120, + 110, + 102, + 98, + 101, + 102, + 92, + 88, + 80, + 86, + 79, + 69, + 74, + 76, + 77, + 80, + 80, + 76, + 82, + 78, + 76, + 74, + 76, + 82, + 86, + 77, + 79, + 79, + 81, + 84, + 81, + 75, + 64, + 65, + 66, + 61, + 58, + 54, + 53, + 58, + 53, + 51, + 44, + 32, + 34, + 37, + 35, + 35, + 34, + 38, + 38, + 37, + 36, + 33, + 35, + 32, + 30, + 32, + 27, + 26, + 27, + 23, + 22, + 21, + 22, + 24, + 25, + 22, + 21, + 19, + 20, + 18, + 21, + 22, + 23, + 18, + 17, + 17, + 18, + 14, + 17, + 18, + 23, + 21, + 20, + 22, + 17, + 20, + 25, + 22, + 20, + 21, + 18, + 19, + 17, + 17, + 14, + 18, + 21, + 23, + 23, + 28, + 28, + 27, + 23, + 22, + 18, + 18, + 21, + 24 + ], + "SARI": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 3, + 4, + 6, + 9, + 11, + 20, + 31, + 36, + 40, + 43, + 50, + 56, + 62, + 76, + 87, + 99, + 121, + 136, + 165, + 210, + 231, + 248, + 299, + 337, + 377, + 439, + 505, + 545, + 592, + 637, + 734, + 822, + 938, + 1038, + 1112, + 1170, + 1217, + 1290, + 1377, + 1471, + 1524, + 1561, + 1597, + 1635, + 1734, + 1732, + 1752, + 1809, + 1866, + 1877, + 1924, + 1944, + 1973, + 2015, + 2077, + 2145, + 2165, + 2208, + 2227, + 2304, + 2349, + 2390, + 2403, + 2475, + 2506, + 2601, + 2649, + 2721, + 2708, + 2780, + 2827, + 2858, + 2930, + 2988, + 3054, + 3116, + 3195, + 3226, + 3275, + 3344, + 3387, + 3459, + 3511, + 3593, + 3691, + 3715, + 3747, + 3851, + 3863, + 3932, + 4047, + 4090, + 4191, + 4288, + 4380, + 4438, + 4497, + 4514, + 4621, + 4722, + 4806, + 4870, + 4960, + 5047, + 5160, + 5231, + 5265, + 5365, + 5411, + 5439, + 5536, + 5696, + 5703, + 5828, + 5877, + 5911, + 5998, + 6009, + 6081, + 6114, + 6111, + 6154, + 6177, + 6167, + 6279, + 6353, + 6369, + 6375, + 6419, + 6580, + 6665, + 6665, + 6689, + 6763, + 6780, + 6786, + 6804, + 6852, + 6898, + 6945, + 6945, + 7064, + 7089, + 7146, + 7168, + 7251, + 7210, + 7196, + 7249, + 7216, + 7244, + 7246, + 7266, + 7336, + 7311, + 7397, + 7411, + 7422, + 7366, + 7271, + 7193, + 7141, + 7092, + 7093, + 7174, + 7171, + 7190, + 7187, + 7166, + 7177, + 7158, + 7070, + 7022, + 7015, + 7005, + 6957, + 6875, + 6899, + 6859, + 6805, + 6729, + 6688, + 6647, + 6595, + 6523, + 6419, + 6454, + 6386, + 6300, + 6262, + 6293, + 6219, + 6189, + 6208, + 6162, + 6028, + 5968, + 5892, + 5826, + 5747, + 5733, + 5702, + 5589, + 5529, + 5489, + 5387, + 5310, + 5211, + 5173, + 5155, + 5174, + 5127, + 5065, + 4984, + 4912, + 4861, + 4796, + 4763, + 4711, + 4665, + 4551, + 4512, + 4476, + 4373, + 4367, + 4379, + 4337, + 4251, + 4216, + 4129, + 4117, + 4007, + 3924, + 3853, + 3763, + 3665, + 3616, + 3564, + 3494, + 3447, + 3399, + 3343, + 3255, + 3204, + 3148, + 3129, + 3020, + 3011, + 2976, + 2930, + 2846, + 2825, + 2765, + 2721, + 2698, + 2621, + 2588, + 2565, + 2504, + 2432, + 2372, + 2349, + 2329, + 2281, + 2255, + 2214, + 2153, + 2101, + 2058, + 2059, + 2004, + 2000, + 1991, + 1944, + 1933, + 1937, + 1888, + 1833, + 1824, + 1821, + 1778, + 1733, + 1718, + 1663, + 1669, + 1641, + 1598, + 1560, + 1534, + 1482, + 1460, + 1435, + 1413, + 1351, + 1326, + 1304, + 1260, + 1231, + 1234, + 1204, + 1181, + 1184, + 1159, + 1114, + 1112, + 1089, + 1055, + 1037, + 1040, + 1040, + 1019, + 985, + 935, + 922, + 905, + 881, + 864, + 845, + 852, + 836, + 805, + 792, + 768, + 767, + 758, + 743, + 724, + 696, + 666, + 666, + 678, + 650, + 630, + 628, + 600, + 581, + 539, + 525, + 549, + 546, + 525, + 524, + 539, + 506, + 501, + 480, + 465, + 447, + 440, + 435, + 427, + 428, + 418, + 411, + 403, + 391, + 383, + 363, + 333, + 328, + 319, + 313, + 299, + 298, + 295, + 301, + 307, + 285, + 278, + 283, + 277, + 264, + 268, + 265, + 259, + 252, + 240, + 239, + 221, + 211, + 224, + 208, + 215, + 193, + 189, + 176, + 174, + 176, + 176, + 180, + 178, + 190, + 183, + 178, + 177, + 172, + 171, + 173, + 166, + 168, + 173, + 172, + 170, + 152, + 138, + 136, + 132, + 130, + 123, + 118, + 112, + 103, + 107, + 105, + 105, + 102, + 104, + 102, + 98, + 93, + 104, + 103, + 102, + 97, + 95, + 92, + 100, + 98, + 94, + 85, + 83, + 80, + 74, + 75, + 70, + 68, + 60, + 59, + 55, + 60, + 67, + 66, + 70, + 68, + 67, + 62, + 57, + 57, + 55, + 57, + 56, + 51, + 49, + 58, + 54, + 50, + 52, + 48, + 48, + 44, + 43, + 38, + 35, + 38, + 37, + 35, + 29, + 31, + 38, + 37, + 39, + 37, + 44, + 41, + 40, + 36, + 33, + 31, + 27, + 28, + 26, + 24, + 27, + 26, + 28, + 26, + 29, + 33, + 30, + 29, + 26, + 28, + 26, + 23, + 20, + 20, + 18, + 18, + 18, + 18, + 17, + 19, + 20, + 21, + 18, + 20, + 20, + 19, + 16, + 15, + 14, + 13, + 15, + 17, + 17, + 15, + 14, + 15, + 18, + 19, + 18, + 14, + 13, + 14, + 12, + 11, + 11, + 10, + 12, + 12, + 13, + 11, + 9, + 8, + 7, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 7, + 8, + 11, + 12, + 14, + 12, + 13, + 12, + 15, + 14, + 13, + 13, + 11, + 9, + 7, + 7, + 7, + 7, + 8, + 10, + 8, + 7, + 6, + 6, + 5, + 4, + 5, + 6, + 5, + 6, + 7, + 8, + 9, + 8, + 11, + 9, + 9, + 11, + 10, + 11, + 7, + 8, + 8, + 7, + 7, + 6, + 6, + 7, + 7, + 6, + 4, + 4, + 4, + 4, + 4, + 4, + 3, + 3, + 3, + 4, + 2, + 1, + 2, + 2, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 2, + 1, + 1, + 2, + 3, + 2, + 2, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ], + "Critical": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 2, + 3, + 6, + 9, + 12, + 16, + 19, + 18, + 24, + 33, + 46, + 51, + 54, + 59, + 65, + 83, + 95, + 104, + 118, + 137, + 171, + 204, + 217, + 232, + 242, + 257, + 300, + 336, + 365, + 370, + 383, + 373, + 374, + 383, + 417, + 431, + 448, + 458, + 484, + 489, + 508, + 518, + 528, + 548, + 552, + 551, + 559, + 600, + 603, + 586, + 603, + 614, + 623, + 661, + 678, + 690, + 714, + 750, + 763, + 764, + 798, + 815, + 821, + 847, + 832, + 876, + 875, + 890, + 893, + 912, + 925, + 913, + 929, + 944, + 970, + 1011, + 1029, + 1036, + 1058, + 1049, + 1115, + 1140, + 1140, + 1149, + 1170, + 1166, + 1206, + 1236, + 1258, + 1282, + 1263, + 1280, + 1303, + 1341, + 1355, + 1400, + 1424, + 1440, + 1458, + 1488, + 1470, + 1484, + 1525, + 1501, + 1527, + 1523, + 1540, + 1556, + 1557, + 1598, + 1622, + 1674, + 1712, + 1728, + 1693, + 1707, + 1767, + 1756, + 1782, + 1793, + 1779, + 1789, + 1778, + 1807, + 1824, + 1852, + 1880, + 1907, + 1893, + 1888, + 1907, + 1918, + 1905, + 1902, + 1941, + 1965, + 1972, + 1959, + 2049, + 2075, + 2066, + 2063, + 2092, + 2084, + 2076, + 2091, + 2064, + 2088, + 2090, + 2103, + 2117, + 2105, + 2080, + 2079, + 2069, + 2059, + 2055, + 2093, + 2085, + 2038, + 2041, + 2070, + 2059, + 2050, + 2029, + 2038, + 2014, + 1998, + 1998, + 1962, + 1959, + 1930, + 1883, + 1877, + 1843, + 1866, + 1853, + 1862, + 1810, + 1786, + 1800, + 1790, + 1789, + 1854, + 1858, + 1792, + 1772, + 1777, + 1753, + 1733, + 1698, + 1677, + 1589, + 1581, + 1565, + 1544, + 1542, + 1527, + 1542, + 1492, + 1461, + 1446, + 1436, + 1417, + 1445, + 1436, + 1462, + 1444, + 1413, + 1371, + 1336, + 1322, + 1355, + 1308, + 1281, + 1276, + 1235, + 1222, + 1247, + 1220, + 1184, + 1165, + 1126, + 1085, + 1105, + 1055, + 1069, + 1075, + 1066, + 1034, + 998, + 1012, + 989, + 981, + 977, + 954, + 936, + 924, + 918, + 909, + 894, + 881, + 867, + 864, + 863, + 830, + 816, + 804, + 775, + 740, + 740, + 736, + 735, + 716, + 712, + 698, + 692, + 654, + 648, + 631, + 622, + 602, + 591, + 590, + 568, + 566, + 542, + 538, + 528, + 517, + 513, + 518, + 519, + 479, + 468, + 467, + 470, + 458, + 446, + 446, + 448, + 456, + 451, + 432, + 420, + 405, + 388, + 375, + 372, + 365, + 371, + 369, + 368, + 366, + 362, + 356, + 356, + 343, + 321, + 312, + 296, + 294, + 290, + 279, + 269, + 264, + 255, + 237, + 218, + 212, + 208, + 203, + 213, + 230, + 219, + 228, + 222, + 207, + 203, + 189, + 182, + 166, + 153, + 146, + 138, + 143, + 154, + 155, + 161, + 154, + 152, + 149, + 152, + 142, + 139, + 139, + 131, + 128, + 124, + 117, + 122, + 116, + 118, + 115, + 112, + 114, + 115, + 123, + 109, + 99, + 100, + 92, + 92, + 100, + 92, + 83, + 75, + 80, + 73, + 76, + 77, + 77, + 74, + 69, + 68, + 63, + 62, + 59, + 61, + 60, + 61, + 65, + 64, + 66, + 64, + 60, + 53, + 54, + 51, + 48, + 47, + 43, + 35, + 37, + 39, + 38, + 38, + 38, + 39, + 36, + 33, + 34, + 33, + 33, + 30, + 40, + 35, + 31, + 31, + 33, + 32, + 33, + 32, + 35, + 31, + 31, + 28, + 23, + 26, + 29, + 27, + 29, + 27, + 27, + 23, + 27, + 29, + 26, + 27, + 26, + 22, + 22, + 18, + 14, + 14, + 16, + 16, + 16, + 16, + 14, + 17, + 20, + 22, + 24, + 27, + 25, + 25, + 25, + 22, + 20, + 21, + 18, + 18, + 16, + 16, + 15, + 14, + 15, + 14, + 13, + 14, + 15, + 16, + 14, + 14, + 13, + 12, + 13, + 10, + 8, + 9, + 9, + 6, + 7, + 6, + 6, + 8, + 9, + 9, + 10, + 10, + 8, + 12, + 10, + 7, + 7, + 6, + 5, + 3, + 2, + 2, + 3, + 6, + 6, + 5, + 4, + 4, + 4, + 3, + 5, + 5, + 5, + 4, + 4, + 4, + 4, + 6, + 5, + 5, + 6, + 6, + 4, + 4, + 4, + 2, + 1, + 1, + 2, + 2, + 3, + 3, + 5, + 5, + 3, + 3, + 4, + 3, + 4, + 4, + 4, + 3, + 3, + 2, + 2, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 0, + 0, + 0, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 0, + 0, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "CritRecov": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 3, + 2, + 1, + 1, + 1, + 6, + 8, + 8, + 12, + 13, + 11, + 14, + 12, + 15, + 20, + 19, + 26, + 27, + 33, + 33, + 36, + 43, + 45, + 58, + 59, + 65, + 74, + 67, + 63, + 53, + 68, + 73, + 75, + 76, + 90, + 84, + 87, + 88, + 98, + 98, + 101, + 105, + 102, + 101, + 113, + 103, + 95, + 89, + 85, + 79, + 83, + 95, + 120, + 117, + 123, + 115, + 117, + 120, + 115, + 116, + 134, + 150, + 141, + 118, + 130, + 137, + 132, + 139, + 156, + 159, + 162, + 177, + 168, + 161, + 155, + 167, + 172, + 175, + 180, + 178, + 187, + 173, + 170, + 185, + 205, + 187, + 180, + 202, + 204, + 202, + 184, + 200, + 202, + 227, + 239, + 216, + 216, + 233, + 255, + 241, + 251, + 248, + 235, + 240, + 254, + 274, + 279, + 282, + 259, + 247, + 246, + 257, + 283, + 283, + 283, + 276, + 286, + 268, + 254, + 271, + 268, + 282, + 294, + 308, + 306, + 329, + 308, + 304, + 299, + 298, + 291, + 259, + 277, + 315, + 337, + 336, + 343, + 382, + 347, + 328, + 326, + 340, + 351, + 338, + 344, + 346, + 343, + 347, + 336, + 345, + 324, + 321, + 334, + 355, + 350, + 347, + 352, + 338, + 319, + 328, + 327, + 336, + 321, + 317, + 307, + 309, + 311, + 310, + 284, + 291, + 308, + 300, + 314, + 299, + 284, + 269, + 257, + 262, + 278, + 290, + 271, + 272, + 264, + 256, + 263, + 277, + 252, + 283, + 274, + 259, + 248, + 236, + 244, + 268, + 235, + 232, + 228, + 228, + 220, + 225, + 229, + 236, + 230, + 222, + 213, + 201, + 199, + 220, + 226, + 219, + 214, + 214, + 209, + 200, + 193, + 179, + 186, + 179, + 180, + 162, + 162, + 161, + 160, + 157, + 153, + 168, + 160, + 156, + 152, + 146, + 133, + 139, + 143, + 155, + 152, + 140, + 125, + 126, + 148, + 135, + 136, + 147, + 135, + 122, + 120, + 109, + 122, + 117, + 127, + 140, + 140, + 129, + 141, + 137, + 124, + 119, + 94, + 95, + 78, + 104, + 97, + 94, + 96, + 83, + 73, + 69, + 76, + 76, + 72, + 65, + 72, + 78, + 68, + 69, + 59, + 64, + 70, + 60, + 67, + 76, + 63, + 63, + 62, + 61, + 50, + 50, + 51, + 47, + 52, + 46, + 51, + 55, + 49, + 40, + 48, + 49, + 52, + 54, + 44, + 38, + 43, + 51, + 43, + 40, + 31, + 34, + 29, + 35, + 32, + 39, + 41, + 38, + 36, + 25, + 29, + 31, + 23, + 25, + 24, + 27, + 25, + 28, + 25, + 21, + 22, + 21, + 22, + 21, + 16, + 22, + 23, + 20, + 18, + 22, + 24, + 23, + 23, + 22, + 23, + 19, + 17, + 15, + 18, + 23, + 12, + 11, + 11, + 18, + 23, + 22, + 18, + 18, + 15, + 11, + 13, + 12, + 9, + 12, + 13, + 12, + 12, + 9, + 11, + 7, + 8, + 12, + 9, + 11, + 10, + 14, + 13, + 15, + 15, + 16, + 12, + 13, + 11, + 10, + 9, + 12, + 9, + 11, + 7, + 9, + 7, + 6, + 5, + 5, + 3, + 3, + 4, + 3, + 5, + 9, + 7, + 7, + 4, + 5, + 4, + 6, + 5, + 5, + 2, + 3, + 2, + 3, + 3, + 6, + 4, + 2, + 4, + 4, + 3, + 4, + 2, + 1, + 3, + 2, + 3, + 3, + 3, + 3, + 2, + 2, + 1, + 2, + 4, + 1, + 0, + 1, + 2, + 6, + 6, + 2, + 3, + 3, + 3, + 3, + 4, + 2, + 4, + 3, + 3, + 4, + 4, + 3, + 2, + 2, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 3, + 3, + 3, + 3, + 2, + 0, + 1, + 2, + 3, + 3, + 2, + 3, + 3, + 2, + 1, + 3, + 2, + 2, + 2, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 2, + 2, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 3, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 2, + 3, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "incDeath": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 1, + 4, + 7, + 6, + 9, + 5, + 8, + 6, + 9, + 8, + 11, + 16, + 11, + 19, + 14, + 23, + 29, + 32, + 32, + 35, + 37, + 48, + 49, + 63, + 70, + 64, + 75, + 75, + 72, + 87, + 94, + 83, + 91, + 82, + 98, + 110, + 101, + 112, + 99, + 116, + 116, + 112, + 106, + 109, + 97, + 144, + 126, + 132, + 116, + 141, + 126, + 139, + 144, + 170, + 135, + 148, + 159, + 164, + 172, + 174, + 158, + 188, + 168, + 177, + 176, + 178, + 192, + 206, + 207, + 197, + 216, + 209, + 179, + 232, + 229, + 233, + 223, + 232, + 230, + 216, + 238, + 238, + 220, + 248, + 273, + 268, + 278, + 264, + 267, + 264, + 272, + 269, + 278, + 302, + 314, + 336, + 318, + 308, + 330, + 299, + 332, + 325, + 343, + 332, + 322, + 359, + 366, + 333, + 379, + 343, + 358, + 390, + 377, + 342, + 380, + 398, + 378, + 376, + 375, + 377, + 386, + 403, + 391, + 399, + 416, + 389, + 417, + 426, + 422, + 432, + 400, + 402, + 393, + 401, + 447, + 426, + 435, + 442, + 398, + 437, + 421, + 405, + 433, + 454, + 411, + 468, + 445, + 442, + 463, + 470, + 429, + 477, + 443, + 406, + 440, + 417, + 417, + 413, + 418, + 430, + 443, + 467, + 439, + 430, + 455, + 396, + 384, + 428, + 415, + 432, + 394, + 429, + 379, + 374, + 387, + 404, + 420, + 369, + 356, + 363, + 361, + 376, + 414, + 373, + 375, + 370, + 389, + 334, + 348, + 387, + 310, + 343, + 355, + 317, + 321, + 314, + 317, + 330, + 330, + 300, + 335, + 301, + 305, + 277, + 307, + 292, + 295, + 300, + 266, + 267, + 293, + 268, + 263, + 267, + 242, + 241, + 279, + 262, + 263, + 247, + 268, + 226, + 238, + 232, + 233, + 240, + 230, + 214, + 206, + 204, + 212, + 206, + 223, + 199, + 172, + 200, + 171, + 178, + 186, + 182, + 168, + 171, + 173, + 181, + 184, + 196, + 164, + 151, + 167, + 165, + 147, + 130, + 152, + 124, + 160, + 148, + 138, + 111, + 120, + 123, + 115, + 105, + 122, + 110, + 125, + 121, + 112, + 120, + 107, + 124, + 117, + 132, + 113, + 91, + 83, + 112, + 102, + 79, + 85, + 74, + 106, + 89, + 99, + 83, + 80, + 87, + 83, + 63, + 84, + 79, + 82, + 58, + 67, + 55, + 63, + 78, + 64, + 67, + 54, + 74, + 62, + 64, + 54, + 55, + 61, + 47, + 56, + 54, + 43, + 58, + 34, + 63, + 54, + 40, + 45, + 37, + 47, + 48, + 42, + 27, + 49, + 42, + 31, + 32, + 36, + 31, + 40, + 35, + 30, + 32, + 32, + 26, + 39, + 27, + 33, + 31, + 26, + 24, + 29, + 25, + 24, + 23, + 21, + 24, + 28, + 30, + 31, + 19, + 23, + 17, + 18, + 16, + 16, + 20, + 17, + 22, + 16, + 19, + 13, + 23, + 20, + 16, + 12, + 14, + 17, + 15, + 13, + 10, + 10, + 7, + 10, + 12, + 15, + 13, + 16, + 11, + 9, + 4, + 12, + 14, + 8, + 9, + 10, + 10, + 6, + 10, + 11, + 4, + 13, + 8, + 3, + 11, + 10, + 18, + 5, + 10, + 7, + 10, + 9, + 9, + 5, + 6, + 6, + 6, + 16, + 2, + 5, + 13, + 5, + 2, + 4, + 6, + 5, + 5, + 5, + 4, + 9, + 9, + 5, + 6, + 8, + 4, + 3, + 4, + 3, + 6, + 5, + 3, + 0, + 4, + 5, + 1, + 7, + 5, + 4, + 4, + 5, + 5, + 4, + 4, + 6, + 4, + 3, + 6, + 2, + 2, + 4, + 4, + 2, + 2, + 3, + 5, + 5, + 3, + 2, + 3, + 4, + 0, + 4, + 2, + 3, + 0, + 2, + 3, + 3, + 3, + 1, + 3, + 2, + 0, + 1, + 1, + 3, + 1, + 2, + 2, + 0, + 1, + 2, + 1, + 1, + 2, + 4, + 3, + 0, + 2, + 0, + 0, + 2, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 2, + 1, + 1, + 0, + 2, + 0, + 0, + 0, + 3, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 2, + 1, + 0, + 1, + 2, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 2, + 1, + 1, + 0, + 2, + 1, + 0, + 2, + 0, + 0, + 2, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 2, + 1, + 0, + 1, + 0, + 1, + 0, + 3, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 2, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "cumMild": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 10, + 18, + 26, + 42, + 54, + 77, + 103, + 131, + 167, + 211, + 262, + 326, + 409, + 505, + 612, + 767, + 940, + 1158, + 1408, + 1725, + 2117, + 2552, + 3067, + 3623, + 4268, + 5060, + 5961, + 7010, + 8240, + 9569, + 11074, + 12825, + 14788, + 17085, + 19703, + 22766, + 26183, + 30165, + 34727, + 39693, + 44835, + 50178, + 55767, + 61407, + 67218, + 73075, + 79173, + 85386, + 91824, + 98155, + 104757, + 111485, + 118318, + 125206, + 132249, + 139398, + 146510, + 153963, + 161490, + 169388, + 177089, + 185080, + 193269, + 201628, + 210080, + 218826, + 227580, + 236411, + 245447, + 254852, + 264481, + 274091, + 283810, + 293869, + 304031, + 314361, + 324818, + 335663, + 346787, + 358096, + 369357, + 380935, + 392900, + 404825, + 417262, + 429703, + 442193, + 455318, + 468345, + 481796, + 495172, + 509112, + 523211, + 537628, + 552350, + 567331, + 582380, + 597531, + 613450, + 629464, + 645753, + 662215, + 678655, + 695871, + 713242, + 730643, + 748411, + 766267, + 784518, + 803012, + 821532, + 840281, + 859368, + 878736, + 898269, + 918103, + 938272, + 958345, + 978738, + 999626, + 1020133, + 1041229, + 1062459, + 1083843, + 1105177, + 1127325, + 1149271, + 1171524, + 1193929, + 1216398, + 1239129, + 1262165, + 1285207, + 1308546, + 1331661, + 1355090, + 1378850, + 1402280, + 1426111, + 1449834, + 1473694, + 1497673, + 1522011, + 1546321, + 1570709, + 1595581, + 1620151, + 1644799, + 1669414, + 1694420, + 1719431, + 1744037, + 1768940, + 1793957, + 1818800, + 1843756, + 1868790, + 1893647, + 1918905, + 1943879, + 1968908, + 1994034, + 2018866, + 2043604, + 2068365, + 2093175, + 2117812, + 2142397, + 2167104, + 2191559, + 2215828, + 2239858, + 2263875, + 2287605, + 2311436, + 2334955, + 2358460, + 2381846, + 2405153, + 2428308, + 2451099, + 2473896, + 2496577, + 2518896, + 2541230, + 2563210, + 2585308, + 2607198, + 2629117, + 2650626, + 2671811, + 2692947, + 2714006, + 2734969, + 2755866, + 2776226, + 2796828, + 2817104, + 2836875, + 2856518, + 2876014, + 2895323, + 2914490, + 2933327, + 2952094, + 2970246, + 2988282, + 3006140, + 3024087, + 3041561, + 3059105, + 3076292, + 3093250, + 3110039, + 3126345, + 3142870, + 3158946, + 3174914, + 3190569, + 3206073, + 3221313, + 3236364, + 3251378, + 3265955, + 3280457, + 3294713, + 3308860, + 3322668, + 3336243, + 3349797, + 3363139, + 3376059, + 3389078, + 3401747, + 3414176, + 3426613, + 3438805, + 3450606, + 3462499, + 3474264, + 3485752, + 3496914, + 3508132, + 3519088, + 3529917, + 3540558, + 3550910, + 3561172, + 3571271, + 3581274, + 3591043, + 3600548, + 3610027, + 3619230, + 3628329, + 3637457, + 3646157, + 3654928, + 3663479, + 3671723, + 3679968, + 3687962, + 3695984, + 3703933, + 3711630, + 3719099, + 3726616, + 3734010, + 3741186, + 3748225, + 3755156, + 3761824, + 3768631, + 3775242, + 3781762, + 3787920, + 3794158, + 3800131, + 3806163, + 3811987, + 3817745, + 3823430, + 3829149, + 3834703, + 3840236, + 3845550, + 3850694, + 3855798, + 3860834, + 3865715, + 3870567, + 3875325, + 3879964, + 3884517, + 3889095, + 3893466, + 3897767, + 3902198, + 3906477, + 3910574, + 3914648, + 3918643, + 3922481, + 3926260, + 3930055, + 3933643, + 3937205, + 3940645, + 3944019, + 3947273, + 3950540, + 3953729, + 3956764, + 3959822, + 3962834, + 3965785, + 3968664, + 3971489, + 3974230, + 3976834, + 3979495, + 3982100, + 3984652, + 3987069, + 3989602, + 3991981, + 3994310, + 3996689, + 3998955, + 4001171, + 4003348, + 4005472, + 4007499, + 4009581, + 4011546, + 4013573, + 4015439, + 4017300, + 4019142, + 4020904, + 4022700, + 4024455, + 4026162, + 4027781, + 4029344, + 4030868, + 4032393, + 4033867, + 4035354, + 4036742, + 4038160, + 4039568, + 4040898, + 4042220, + 4043490, + 4044822, + 4046058, + 4047275, + 4048387, + 4049548, + 4050732, + 4051796, + 4052844, + 4053893, + 4054952, + 4055972, + 4056957, + 4057974, + 4058895, + 4059860, + 4060778, + 4061693, + 4062556, + 4063441, + 4064291, + 4065111, + 4065928, + 4066731, + 4067526, + 4068358, + 4069155, + 4069831, + 4070547, + 4071219, + 4071864, + 4072510, + 4073126, + 4073742, + 4074388, + 4074972, + 4075586, + 4076151, + 4076693, + 4077254, + 4077786, + 4078307, + 4078837, + 4079339, + 4079806, + 4080326, + 4080804, + 4081284, + 4081743, + 4082170, + 4082599, + 4083014, + 4083420, + 4083788, + 4084178, + 4084556, + 4084943, + 4085286, + 4085602, + 4085951, + 4086298, + 4086608, + 4086972, + 4087341, + 4087648, + 4087977, + 4088270, + 4088573, + 4088872, + 4089161, + 4089435, + 4089706, + 4089987, + 4090264, + 4090507, + 4090747, + 4091013, + 4091267, + 4091520, + 4091755, + 4091987, + 4092215, + 4092436, + 4092629, + 4092848, + 4093073, + 4093293, + 4093517, + 4093704, + 4093904, + 4094117, + 4094312, + 4094510, + 4094736, + 4094944, + 4095159, + 4095355, + 4095552, + 4095706, + 4095905, + 4096082, + 4096236, + 4096395, + 4096538, + 4096689, + 4096832, + 4096967, + 4097109, + 4097261, + 4097378, + 4097519, + 4097654, + 4097775, + 4097909, + 4098050, + 4098186, + 4098315, + 4098453, + 4098582, + 4098717, + 4098821, + 4098922, + 4099022, + 4099145, + 4099244, + 4099361, + 4099460, + 4099571, + 4099676, + 4099757, + 4099853, + 4099957, + 4100048, + 4100134, + 4100248, + 4100342, + 4100437, + 4100532, + 4100631, + 4100721, + 4100805, + 4100899, + 4100991, + 4101061, + 4101141, + 4101211, + 4101273, + 4101326, + 4101392, + 4101446, + 4101506, + 4101562, + 4101625, + 4101679, + 4101744, + 4101803, + 4101851, + 4101905, + 4101962, + 4102009, + 4102045, + 4102090, + 4102142, + 4102195, + 4102239, + 4102283, + 4102330, + 4102362, + 4102408, + 4102452, + 4102500, + 4102538, + 4102574, + 4102597, + 4102646, + 4102688, + 4102718, + 4102750, + 4102790, + 4102817, + 4102849, + 4102886, + 4102912, + 4102941, + 4102966, + 4102996, + 4103030, + 4103047, + 4103085, + 4103108, + 4103139, + 4103174, + 4103210, + 4103240, + 4103264, + 4103294, + 4103325, + 4103353, + 4103382, + 4103409, + 4103438, + 4103465, + 4103493, + 4103525, + 4103562, + 4103591, + 4103619, + 4103646, + 4103671, + 4103699, + 4103716, + 4103734, + 4103758, + 4103787, + 4103813, + 4103834, + 4103854, + 4103874, + 4103897, + 4103918, + 4103944, + 4103961, + 4103977, + 4103992, + 4104004, + 4104025, + 4104048, + 4104066, + 4104090, + 4104108, + 4104125, + 4104147, + 4104169, + 4104180, + 4104195, + 4104209, + 4104219, + 4104228, + 4104240, + 4104245, + 4104260, + 4104271, + 4104282, + 4104294, + 4104312, + 4104317, + 4104329, + 4104343, + 4104355, + 4104364, + 4104372, + 4104387, + 4104395, + 4104400, + 4104410, + 4104413, + 4104421, + 4104426, + 4104434, + 4104442, + 4104445, + 4104456, + 4104464, + 4104473, + 4104480, + 4104489, + 4104494, + 4104505, + 4104510, + 4104516, + 4104522, + 4104527, + 4104531, + 4104540, + 4104543, + 4104546, + 4104547, + 4104553, + 4104557, + 4104559, + 4104566, + 4104568, + 4104573, + 4104577, + 4104579, + 4104582, + 4104587, + 4104589, + 4104594, + 4104597, + 4104602, + 4104610, + 4104612, + 4104617, + 4104623, + 4104628, + 4104633, + 4104634, + 4104643, + 4104647, + 4104656, + 4104660, + 4104665, + 4104669, + 4104677, + 4104683, + 4104690, + 4104697, + 4104703, + 4104713, + 4104725, + 4104737 + ], + "cumILI": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 11, + 15, + 20, + 25, + 28, + 41, + 57, + 79, + 100, + 130, + 180, + 223, + 283, + 343, + 421, + 541, + 641, + 778, + 927, + 1108, + 1354, + 1645, + 1972, + 2341, + 2774, + 3253, + 3805, + 4434, + 5153, + 5961, + 6974, + 8039, + 9337, + 10755, + 12440, + 14308, + 16517, + 18985, + 21633, + 24364, + 27315, + 30342, + 33247, + 36267, + 39467, + 42776, + 46120, + 49492, + 53034, + 56572, + 60216, + 63941, + 67645, + 71426, + 75345, + 79246, + 83312, + 87360, + 91611, + 95893, + 100184, + 104580, + 109077, + 113621, + 118341, + 123225, + 128244, + 133224, + 138255, + 143283, + 148595, + 154053, + 159596, + 165055, + 170685, + 176498, + 182432, + 188475, + 194471, + 200661, + 206935, + 213405, + 220026, + 226811, + 233567, + 240385, + 247386, + 254609, + 261763, + 269085, + 276770, + 284588, + 292262, + 300254, + 308317, + 316628, + 325213, + 333633, + 342293, + 351238, + 360109, + 369313, + 378684, + 387977, + 397495, + 407022, + 416607, + 426274, + 436250, + 446388, + 456640, + 466939, + 477576, + 488064, + 498797, + 509708, + 520853, + 532015, + 543242, + 554673, + 566176, + 577832, + 589325, + 600929, + 612760, + 624797, + 636856, + 648762, + 661151, + 673596, + 686162, + 698731, + 711276, + 724066, + 736849, + 749763, + 762512, + 775568, + 788530, + 801700, + 814686, + 827734, + 840962, + 854309, + 867901, + 881207, + 894752, + 908164, + 921744, + 935371, + 949074, + 962709, + 976267, + 989947, + 1003466, + 1017191, + 1030883, + 1044434, + 1058160, + 1071835, + 1085464, + 1099087, + 1112592, + 1126013, + 1139443, + 1152863, + 1166294, + 1179567, + 1192910, + 1206196, + 1219268, + 1232355, + 1245266, + 1258292, + 1271223, + 1284044, + 1296744, + 1309479, + 1321808, + 1334403, + 1347044, + 1359249, + 1371395, + 1383504, + 1395685, + 1407740, + 1419647, + 1431523, + 1443157, + 1454895, + 1466453, + 1477974, + 1489399, + 1500750, + 1511815, + 1522687, + 1533704, + 1544487, + 1555288, + 1565896, + 1576413, + 1586919, + 1597230, + 1607455, + 1617326, + 1627350, + 1637230, + 1646845, + 1656285, + 1665631, + 1674922, + 1684259, + 1693591, + 1702709, + 1711475, + 1720121, + 1728772, + 1737358, + 1745701, + 1754103, + 1762405, + 1770594, + 1778567, + 1786451, + 1794055, + 1801725, + 1809270, + 1816705, + 1824075, + 1831448, + 1838771, + 1845811, + 1852818, + 1859736, + 1866480, + 1873196, + 1879874, + 1886439, + 1892873, + 1899076, + 1905253, + 1911355, + 1917300, + 1923101, + 1928885, + 1934341, + 1940082, + 1945480, + 1951033, + 1956338, + 1961612, + 1966755, + 1971853, + 1976937, + 1981880, + 1986662, + 1991344, + 1996008, + 2000596, + 2005037, + 2009493, + 2013776, + 2018009, + 2022154, + 2026215, + 2030319, + 2034403, + 2038286, + 2042129, + 2045931, + 2049623, + 2053260, + 2056859, + 2060388, + 2063834, + 2067180, + 2070542, + 2073821, + 2076935, + 2080041, + 2083129, + 2086105, + 2089130, + 2092045, + 2094862, + 2097679, + 2100485, + 2103279, + 2105975, + 2108576, + 2111182, + 2113786, + 2116279, + 2118674, + 2121078, + 2123472, + 2125787, + 2128011, + 2130182, + 2132386, + 2134514, + 2136590, + 2138620, + 2140596, + 2142547, + 2144511, + 2146474, + 2148354, + 2150208, + 2151997, + 2153728, + 2155480, + 2157213, + 2158922, + 2160548, + 2162142, + 2163653, + 2165166, + 2166656, + 2168138, + 2169531, + 2170880, + 2172221, + 2173543, + 2174841, + 2176137, + 2177459, + 2178752, + 2180023, + 2181180, + 2182382, + 2183511, + 2184606, + 2185721, + 2186761, + 2187815, + 2188804, + 2189796, + 2190792, + 2191725, + 2192665, + 2193585, + 2194522, + 2195327, + 2196148, + 2197008, + 2197773, + 2198600, + 2199333, + 2200095, + 2200832, + 2201573, + 2202285, + 2202991, + 2203707, + 2204360, + 2205010, + 2205655, + 2206273, + 2206898, + 2207530, + 2208127, + 2208711, + 2209277, + 2209844, + 2210422, + 2210931, + 2211448, + 2211942, + 2212457, + 2212933, + 2213407, + 2213852, + 2214333, + 2214769, + 2215222, + 2215643, + 2216075, + 2216498, + 2216912, + 2217286, + 2217672, + 2218063, + 2218435, + 2218786, + 2219097, + 2219433, + 2219769, + 2220052, + 2220339, + 2220657, + 2220944, + 2221241, + 2221568, + 2221867, + 2222135, + 2222393, + 2222664, + 2222917, + 2223213, + 2223451, + 2223698, + 2223942, + 2224178, + 2224387, + 2224646, + 2224872, + 2225065, + 2225274, + 2225475, + 2225650, + 2225824, + 2226013, + 2226223, + 2226403, + 2226560, + 2226738, + 2226906, + 2227098, + 2227265, + 2227440, + 2227583, + 2227735, + 2227897, + 2228047, + 2228183, + 2228320, + 2228458, + 2228604, + 2228738, + 2228883, + 2229002, + 2229134, + 2229279, + 2229410, + 2229534, + 2229670, + 2229780, + 2229902, + 2230040, + 2230162, + 2230285, + 2230398, + 2230497, + 2230608, + 2230709, + 2230805, + 2230901, + 2231000, + 2231107, + 2231200, + 2231315, + 2231404, + 2231493, + 2231589, + 2231668, + 2231757, + 2231832, + 2231931, + 2232017, + 2232091, + 2232164, + 2232259, + 2232335, + 2232410, + 2232486, + 2232548, + 2232636, + 2232692, + 2232763, + 2232825, + 2232887, + 2232955, + 2233017, + 2233079, + 2233124, + 2233188, + 2233245, + 2233309, + 2233367, + 2233410, + 2233464, + 2233521, + 2233568, + 2233616, + 2233664, + 2233710, + 2233764, + 2233811, + 2233876, + 2233929, + 2233980, + 2234028, + 2234073, + 2234125, + 2234170, + 2234213, + 2234262, + 2234302, + 2234347, + 2234387, + 2234418, + 2234473, + 2234511, + 2234554, + 2234583, + 2234615, + 2234639, + 2234667, + 2234697, + 2234718, + 2234748, + 2234768, + 2234805, + 2234841, + 2234865, + 2234896, + 2234915, + 2234945, + 2234968, + 2235001, + 2235020, + 2235038, + 2235062, + 2235088, + 2235111, + 2235127, + 2235142, + 2235159, + 2235185, + 2235204, + 2235229, + 2235245, + 2235257, + 2235274, + 2235290, + 2235300, + 2235313, + 2235327, + 2235342, + 2235361, + 2235373, + 2235385, + 2235398, + 2235413, + 2235426, + 2235444, + 2235459, + 2235481, + 2235495, + 2235510, + 2235526, + 2235541, + 2235562, + 2235583, + 2235592, + 2235613, + 2235624, + 2235636, + 2235648, + 2235663, + 2235675, + 2235685, + 2235691, + 2235709, + 2235718, + 2235724, + 2235741, + 2235755, + 2235764, + 2235775, + 2235788, + 2235798, + 2235815, + 2235821, + 2235832, + 2235842, + 2235853, + 2235869, + 2235879, + 2235888, + 2235904, + 2235915, + 2235924, + 2235933, + 2235945, + 2235952, + 2235957, + 2235968, + 2235978, + 2235984, + 2235989, + 2235997, + 2236004, + 2236014, + 2236019, + 2236026, + 2236029, + 2236032, + 2236040, + 2236046, + 2236051, + 2236057, + 2236060, + 2236067, + 2236069, + 2236074, + 2236078, + 2236082, + 2236086, + 2236087, + 2236092, + 2236095, + 2236101, + 2236104, + 2236107, + 2236110, + 2236115, + 2236116, + 2236119, + 2236123, + 2236126, + 2236127, + 2236129, + 2236131, + 2236134, + 2236137, + 2236141, + 2236145, + 2236146, + 2236146, + 2236147, + 2236150, + 2236151, + 2236152, + 2236157, + 2236161, + 2236167, + 2236168, + 2236169, + 2236172, + 2236174, + 2236178, + 2236183, + 2236186, + 2236187, + 2236193, + 2236194, + 2236200, + 2236202, + 2236204, + 2236206, + 2236211, + 2236214, + 2236218, + 2236220, + 2236228, + 2236230, + 2236232, + 2236233, + 2236235, + 2236236, + 2236238, + 2236244, + 2236249 + ], + "cumSARI": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 3, + 4, + 5, + 7, + 10, + 14, + 23, + 35, + 41, + 50, + 58, + 71, + 86, + 100, + 128, + 152, + 182, + 220, + 268, + 328, + 397, + 448, + 497, + 582, + 668, + 766, + 881, + 1018, + 1150, + 1309, + 1469, + 1652, + 1856, + 2094, + 2330, + 2573, + 2828, + 3062, + 3316, + 3593, + 3868, + 4139, + 4424, + 4702, + 4984, + 5317, + 5584, + 5900, + 6219, + 6559, + 6879, + 7216, + 7544, + 7898, + 8240, + 8577, + 8966, + 9320, + 9662, + 10045, + 10453, + 10851, + 11264, + 11646, + 12080, + 12509, + 12971, + 13421, + 13905, + 14355, + 14850, + 15314, + 15797, + 16286, + 16794, + 17291, + 17822, + 18341, + 18862, + 19418, + 19990, + 20544, + 21142, + 21748, + 22360, + 23029, + 23638, + 24278, + 24934, + 25572, + 26254, + 26915, + 27596, + 28319, + 29036, + 29791, + 30558, + 31316, + 32060, + 32837, + 33645, + 34412, + 35206, + 36023, + 36862, + 37726, + 38594, + 39484, + 40349, + 41175, + 42049, + 42974, + 43923, + 44779, + 45703, + 46642, + 47564, + 48512, + 49483, + 50449, + 51435, + 52365, + 53327, + 54334, + 55278, + 56310, + 57332, + 58353, + 59324, + 60307, + 61409, + 62451, + 63478, + 64519, + 65607, + 66626, + 67691, + 68724, + 69821, + 70942, + 72043, + 73128, + 74256, + 75338, + 76435, + 77536, + 78700, + 79802, + 80894, + 82085, + 83174, + 84294, + 85385, + 86507, + 87658, + 88797, + 89911, + 91056, + 92175, + 93295, + 94362, + 95430, + 96517, + 97610, + 98708, + 99858, + 100947, + 102026, + 103098, + 104125, + 105213, + 106304, + 107339, + 108399, + 109496, + 110549, + 111572, + 112558, + 113567, + 114574, + 115558, + 116525, + 117493, + 118489, + 119454, + 120426, + 121346, + 122308, + 123259, + 124151, + 125069, + 126021, + 126931, + 127853, + 128828, + 129703, + 130515, + 131360, + 132184, + 132990, + 133816, + 134648, + 135453, + 136222, + 137019, + 137823, + 138547, + 139327, + 140036, + 140808, + 141561, + 142316, + 143059, + 143788, + 144493, + 145197, + 145918, + 146606, + 147272, + 147951, + 148598, + 149214, + 149850, + 150485, + 151085, + 151724, + 152371, + 152979, + 153547, + 154138, + 154698, + 155268, + 155781, + 156331, + 156840, + 157374, + 157883, + 158413, + 158905, + 159363, + 159859, + 160340, + 160805, + 161259, + 161709, + 162141, + 162589, + 163007, + 163455, + 163887, + 164305, + 164686, + 165092, + 165462, + 165837, + 166248, + 166613, + 166980, + 167338, + 167675, + 168004, + 168333, + 168676, + 169008, + 169326, + 169634, + 169934, + 170235, + 170504, + 170783, + 171088, + 171371, + 171649, + 171892, + 172163, + 172441, + 172741, + 172984, + 173211, + 173486, + 173758, + 173998, + 174215, + 174462, + 174681, + 174921, + 175128, + 175342, + 175571, + 175797, + 175983, + 176187, + 176388, + 176566, + 176724, + 176900, + 177068, + 177238, + 177416, + 177588, + 177737, + 177897, + 178096, + 178241, + 178400, + 178552, + 178692, + 178825, + 178974, + 179123, + 179267, + 179402, + 179529, + 179632, + 179762, + 179873, + 179973, + 180069, + 180197, + 180323, + 180430, + 180531, + 180650, + 180760, + 180881, + 180991, + 181081, + 181177, + 181259, + 181331, + 181421, + 181518, + 181587, + 181676, + 181765, + 181838, + 181910, + 181967, + 182034, + 182133, + 182209, + 182281, + 182352, + 182434, + 182499, + 182559, + 182618, + 182674, + 182730, + 182790, + 182858, + 182917, + 182973, + 183031, + 183084, + 183136, + 183187, + 183231, + 183272, + 183311, + 183349, + 183390, + 183437, + 183477, + 183520, + 183563, + 183615, + 183653, + 183678, + 183716, + 183759, + 183796, + 183827, + 183872, + 183903, + 183932, + 183960, + 183992, + 184027, + 184051, + 184081, + 184120, + 184142, + 184178, + 184189, + 184212, + 184239, + 184264, + 184297, + 184321, + 184343, + 184360, + 184398, + 184426, + 184445, + 184471, + 184488, + 184518, + 184540, + 184558, + 184585, + 184611, + 184625, + 184648, + 184666, + 184682, + 184700, + 184718, + 184735, + 184750, + 184769, + 184782, + 184791, + 184809, + 184822, + 184836, + 184853, + 184871, + 184882, + 184896, + 184903, + 184917, + 184931, + 184943, + 184956, + 184969, + 184982, + 185003, + 185018, + 185025, + 185033, + 185043, + 185054, + 185064, + 185076, + 185082, + 185089, + 185096, + 185104, + 185111, + 185120, + 185134, + 185146, + 185159, + 185169, + 185179, + 185192, + 185198, + 185207, + 185214, + 185223, + 185228, + 185232, + 185238, + 185252, + 185257, + 185261, + 185268, + 185273, + 185283, + 185287, + 185291, + 185296, + 185301, + 185310, + 185317, + 185319, + 185321, + 185327, + 185336, + 185343, + 185350, + 185355, + 185364, + 185368, + 185373, + 185376, + 185380, + 185384, + 185389, + 185392, + 185396, + 185398, + 185405, + 185409, + 185412, + 185413, + 185419, + 185423, + 185425, + 185427, + 185430, + 185435, + 185438, + 185440, + 185443, + 185446, + 185447, + 185451, + 185452, + 185455, + 185457, + 185459, + 185462, + 185465, + 185467, + 185471, + 185473, + 185475, + 185475, + 185477, + 185478, + 185478, + 185482, + 185486, + 185489, + 185491, + 185491, + 185495, + 185498, + 185501, + 185501, + 185501, + 185501, + 185503, + 185504, + 185505, + 185507, + 185509, + 185511, + 185512, + 185513, + 185514, + 185514, + 185517, + 185518, + 185519, + 185520, + 185521, + 185522, + 185522, + 185523, + 185524, + 185525, + 185526, + 185529, + 185531, + 185533, + 185533, + 185535, + 185538, + 185543, + 185545, + 185546, + 185547, + 185547, + 185547, + 185548, + 185548, + 185549, + 185550, + 185552, + 185555, + 185555, + 185556, + 185557, + 185558, + 185559, + 185559, + 185560, + 185562, + 185563, + 185565, + 185567, + 185569, + 185571, + 185571, + 185575, + 185576, + 185578, + 185580, + 185580, + 185581, + 185581, + 185582, + 185582, + 185583, + 185583, + 185583, + 185583, + 185584, + 185585, + 185586, + 185586, + 185586, + 185586, + 185587, + 185587, + 185587, + 185587, + 185587, + 185587, + 185588, + 185589, + 185589, + 185590, + 185590, + 185590, + 185590, + 185590, + 185590, + 185590, + 185590, + 185590, + 185590, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185591, + 185592, + 185593, + 185593, + 185594, + 185595, + 185596, + 185596, + 185596, + 185596, + 185596, + 185596, + 185596, + 185596, + 185596, + 185596, + 185596, + 185597, + 185597, + 185597, + 185597 + ], + "cumCritical": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 4, + 8, + 11, + 14, + 18, + 22, + 27, + 35, + 46, + 59, + 67, + 79, + 94, + 109, + 133, + 152, + 175, + 204, + 237, + 287, + 336, + 375, + 419, + 465, + 516, + 581, + 658, + 731, + 791, + 852, + 898, + 972, + 1039, + 1123, + 1198, + 1272, + 1353, + 1449, + 1521, + 1610, + 1700, + 1789, + 1879, + 1962, + 2053, + 2146, + 2252, + 2356, + 2444, + 2556, + 2661, + 2768, + 2881, + 2982, + 3089, + 3216, + 3347, + 3461, + 3583, + 3730, + 3858, + 3980, + 4119, + 4238, + 4393, + 4527, + 4664, + 4803, + 4950, + 5088, + 5231, + 5382, + 5527, + 5690, + 5862, + 6040, + 6204, + 6388, + 6540, + 6752, + 6933, + 7113, + 7284, + 7473, + 7654, + 7867, + 8088, + 8284, + 8505, + 8694, + 8884, + 9080, + 9296, + 9521, + 9763, + 9990, + 10210, + 10466, + 10695, + 10906, + 11154, + 11401, + 11599, + 11862, + 12081, + 12318, + 12569, + 12808, + 13079, + 13335, + 13638, + 13915, + 14168, + 14412, + 14676, + 14970, + 15252, + 15546, + 15819, + 16074, + 16357, + 16612, + 16898, + 17191, + 17481, + 17781, + 18079, + 18365, + 18644, + 18961, + 19262, + 19543, + 19837, + 20150, + 20441, + 20736, + 21036, + 21392, + 21728, + 22030, + 22328, + 22659, + 22942, + 23258, + 23582, + 23894, + 24219, + 24554, + 24872, + 25194, + 25526, + 25843, + 26146, + 26464, + 26769, + 27061, + 27420, + 27736, + 28013, + 28329, + 28653, + 28959, + 29263, + 29544, + 29840, + 30133, + 30430, + 30724, + 30985, + 31271, + 31573, + 31837, + 32110, + 32407, + 32698, + 32965, + 33255, + 33497, + 33756, + 34031, + 34291, + 34553, + 34861, + 35129, + 35377, + 35625, + 35884, + 36138, + 36396, + 36614, + 36857, + 37073, + 37286, + 37526, + 37744, + 37964, + 38177, + 38405, + 38610, + 38828, + 39051, + 39252, + 39461, + 39710, + 39915, + 40146, + 40348, + 40550, + 40737, + 40920, + 41101, + 41319, + 41467, + 41660, + 41846, + 42007, + 42187, + 42386, + 42555, + 42710, + 42870, + 43010, + 43169, + 43357, + 43489, + 43634, + 43803, + 43960, + 44101, + 44230, + 44391, + 44531, + 44661, + 44804, + 44943, + 45079, + 45203, + 45330, + 45461, + 45590, + 45728, + 45853, + 45977, + 46094, + 46203, + 46313, + 46431, + 46542, + 46647, + 46756, + 46862, + 46959, + 47055, + 47147, + 47249, + 47332, + 47423, + 47527, + 47608, + 47695, + 47770, + 47849, + 47917, + 47977, + 48063, + 48149, + 48226, + 48293, + 48361, + 48441, + 48513, + 48595, + 48655, + 48721, + 48787, + 48858, + 48915, + 48982, + 49044, + 49110, + 49170, + 49225, + 49283, + 49339, + 49394, + 49440, + 49494, + 49556, + 49597, + 49644, + 49694, + 49749, + 49815, + 49857, + 49911, + 49960, + 49995, + 50029, + 50065, + 50094, + 50133, + 50182, + 50225, + 50262, + 50294, + 50322, + 50348, + 50368, + 50402, + 50438, + 50464, + 50508, + 50545, + 50578, + 50623, + 50651, + 50676, + 50705, + 50724, + 50742, + 50759, + 50778, + 50800, + 50816, + 50841, + 50870, + 50894, + 50922, + 50942, + 50959, + 50979, + 51004, + 51021, + 51041, + 51060, + 51077, + 51097, + 51114, + 51122, + 51143, + 51161, + 51181, + 51193, + 51209, + 51228, + 51243, + 51267, + 51276, + 51290, + 51309, + 51317, + 51326, + 51342, + 51354, + 51363, + 51371, + 51384, + 51393, + 51407, + 51421, + 51431, + 51441, + 51453, + 51464, + 51471, + 51481, + 51488, + 51498, + 51505, + 51511, + 51523, + 51533, + 51541, + 51550, + 51557, + 51564, + 51574, + 51581, + 51590, + 51596, + 51601, + 51604, + 51613, + 51618, + 51621, + 51629, + 51636, + 51645, + 51649, + 51655, + 51663, + 51669, + 51673, + 51674, + 51687, + 51689, + 51691, + 51694, + 51700, + 51706, + 51713, + 51720, + 51723, + 51725, + 51730, + 51732, + 51736, + 51742, + 51746, + 51750, + 51755, + 51757, + 51762, + 51764, + 51768, + 51774, + 51779, + 51785, + 51791, + 51791, + 51794, + 51795, + 51797, + 51798, + 51801, + 51805, + 51809, + 51812, + 51814, + 51817, + 51820, + 51825, + 51830, + 51834, + 51835, + 51838, + 51842, + 51846, + 51848, + 51852, + 51853, + 51854, + 51855, + 51856, + 51859, + 51861, + 51864, + 51866, + 51867, + 51871, + 51874, + 51876, + 51877, + 51878, + 51880, + 51882, + 51884, + 51884, + 51884, + 51885, + 51888, + 51888, + 51891, + 51891, + 51892, + 51894, + 51896, + 51897, + 51899, + 51900, + 51901, + 51905, + 51905, + 51906, + 51907, + 51907, + 51908, + 51908, + 51908, + 51909, + 51910, + 51913, + 51914, + 51914, + 51914, + 51914, + 51914, + 51915, + 51917, + 51917, + 51919, + 51919, + 51919, + 51920, + 51920, + 51922, + 51922, + 51922, + 51924, + 51924, + 51924, + 51924, + 51924, + 51924, + 51924, + 51924, + 51925, + 51925, + 51926, + 51926, + 51928, + 51928, + 51928, + 51928, + 51929, + 51929, + 51930, + 51931, + 51932, + 51932, + 51932, + 51932, + 51932, + 51932, + 51932, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51933, + 51934, + 51934, + 51936, + 51936, + 51936, + 51936, + 51936, + 51938, + 51938, + 51938, + 51938, + 51939, + 51939, + 51939, + 51939, + 51939, + 51940, + 51941, + 51942, + 51942, + 51942, + 51942, + 51942, + 51943, + 51943, + 51944, + 51944, + 51944, + 51945, + 51945, + 51945, + 51947, + 51947, + 51947, + 51947, + 51948, + 51948, + 51948, + 51948, + 51948, + 51948, + 51948, + 51948, + 51948, + 51948, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950, + 51950 + ], + "cumCritRecov": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 5, + 5, + 6, + 6, + 6, + 13, + 19, + 22, + 26, + 30, + 37, + 44, + 52, + 60, + 70, + 81, + 99, + 115, + 132, + 142, + 162, + 185, + 211, + 239, + 270, + 307, + 338, + 361, + 390, + 415, + 447, + 484, + 518, + 549, + 602, + 645, + 681, + 719, + 769, + 809, + 845, + 892, + 945, + 993, + 1041, + 1087, + 1125, + 1160, + 1201, + 1236, + 1281, + 1335, + 1392, + 1445, + 1499, + 1551, + 1609, + 1658, + 1708, + 1774, + 1847, + 1916, + 1974, + 2025, + 2100, + 2170, + 2231, + 2298, + 2364, + 2442, + 2516, + 2603, + 2668, + 2742, + 2814, + 2906, + 2993, + 3079, + 3166, + 3236, + 3329, + 3415, + 3507, + 3609, + 3694, + 3780, + 3871, + 3978, + 4066, + 4158, + 4247, + 4364, + 4451, + 4559, + 4671, + 4775, + 4870, + 4985, + 5092, + 5201, + 5321, + 5431, + 5540, + 5657, + 5768, + 5883, + 5993, + 6128, + 6238, + 6352, + 6492, + 6604, + 6737, + 6868, + 6996, + 7122, + 7253, + 7375, + 7491, + 7622, + 7742, + 7890, + 8014, + 8159, + 8284, + 8423, + 8561, + 8699, + 8835, + 8964, + 9104, + 9220, + 9369, + 9529, + 9686, + 9828, + 9980, + 10164, + 10305, + 10468, + 10602, + 10752, + 10895, + 11052, + 11206, + 11355, + 11511, + 11673, + 11811, + 11956, + 12098, + 12248, + 12413, + 12570, + 12721, + 12889, + 13050, + 13183, + 13311, + 13462, + 13594, + 13732, + 13866, + 14001, + 14166, + 14304, + 14437, + 14585, + 14711, + 14845, + 14997, + 15132, + 15263, + 15388, + 15526, + 15647, + 15756, + 15879, + 16027, + 16147, + 16264, + 16392, + 16517, + 16637, + 16772, + 16907, + 17019, + 17151, + 17262, + 17379, + 17479, + 17574, + 17695, + 17816, + 17918, + 18006, + 18106, + 18210, + 18313, + 18420, + 18536, + 18655, + 18763, + 18860, + 18962, + 19053, + 19140, + 19246, + 19343, + 19445, + 19536, + 19632, + 19722, + 19810, + 19894, + 19984, + 20070, + 20150, + 20229, + 20293, + 20376, + 20443, + 20523, + 20597, + 20665, + 20750, + 20807, + 20872, + 20935, + 21008, + 21072, + 21135, + 21209, + 21284, + 21351, + 21411, + 21467, + 21518, + 21591, + 21642, + 21695, + 21762, + 21822, + 21873, + 21924, + 21965, + 22030, + 22082, + 22139, + 22188, + 22249, + 22304, + 22358, + 22410, + 22454, + 22503, + 22533, + 22577, + 22610, + 22672, + 22709, + 22743, + 22778, + 22817, + 22848, + 22881, + 22928, + 22964, + 22992, + 23023, + 23059, + 23098, + 23123, + 23160, + 23183, + 23214, + 23251, + 23276, + 23310, + 23341, + 23365, + 23392, + 23416, + 23434, + 23452, + 23476, + 23498, + 23521, + 23551, + 23574, + 23601, + 23623, + 23645, + 23665, + 23688, + 23706, + 23733, + 23757, + 23773, + 23793, + 23813, + 23832, + 23850, + 23868, + 23881, + 23895, + 23911, + 23930, + 23944, + 23963, + 23981, + 23997, + 24010, + 24019, + 24034, + 24051, + 24060, + 24072, + 24084, + 24096, + 24107, + 24119, + 24131, + 24137, + 24147, + 24158, + 24170, + 24181, + 24188, + 24202, + 24212, + 24221, + 24232, + 24240, + 24253, + 24262, + 24271, + 24280, + 24289, + 24296, + 24304, + 24311, + 24324, + 24334, + 24340, + 24347, + 24353, + 24365, + 24373, + 24381, + 24384, + 24388, + 24394, + 24399, + 24404, + 24411, + 24417, + 24425, + 24434, + 24440, + 24443, + 24446, + 24449, + 24451, + 24456, + 24463, + 24467, + 24474, + 24478, + 24486, + 24493, + 24498, + 24507, + 24513, + 24514, + 24519, + 24523, + 24525, + 24526, + 24529, + 24533, + 24538, + 24540, + 24548, + 24551, + 24555, + 24558, + 24560, + 24561, + 24564, + 24567, + 24568, + 24571, + 24575, + 24577, + 24580, + 24580, + 24584, + 24585, + 24587, + 24589, + 24591, + 24591, + 24593, + 24594, + 24596, + 24599, + 24602, + 24602, + 24603, + 24607, + 24609, + 24610, + 24612, + 24613, + 24616, + 24620, + 24620, + 24621, + 24622, + 24624, + 24627, + 24628, + 24628, + 24628, + 24629, + 24631, + 24632, + 24632, + 24634, + 24635, + 24640, + 24641, + 24641, + 24642, + 24642, + 24644, + 24644, + 24646, + 24647, + 24649, + 24650, + 24652, + 24653, + 24655, + 24655, + 24657, + 24657, + 24657, + 24657, + 24657, + 24658, + 24659, + 24659, + 24661, + 24662, + 24664, + 24665, + 24666, + 24666, + 24666, + 24667, + 24668, + 24669, + 24670, + 24670, + 24671, + 24674, + 24674, + 24674, + 24676, + 24677, + 24678, + 24679, + 24679, + 24679, + 24680, + 24680, + 24680, + 24680, + 24680, + 24682, + 24682, + 24682, + 24683, + 24683, + 24683, + 24683, + 24683, + 24683, + 24684, + 24684, + 24685, + 24685, + 24686, + 24686, + 24686, + 24687, + 24687, + 24687, + 24687, + 24687, + 24687, + 24687, + 24687, + 24687, + 24688, + 24688, + 24688, + 24689, + 24689, + 24690, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24691, + 24692, + 24692, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24693, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24694, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695, + 24695 + ] + }, + "regionId": "California", + "iso_sub": "California" + } + ] +} diff --git a/database.json b/database.json new file mode 100644 index 0000000..f96484c --- /dev/null +++ b/database.json @@ -0,0 +1,28 @@ +{ + "dev": { + "driver": "mysql", + "user": {"ENV": "DB_USERNAME"}, + "password": {"ENV": "DB_PASSWORD"}, + "host": {"ENV": "DB_HOST"}, + "database": {"ENV": "DB_DATABASE"}, + "multipleStatements": true + }, + "prod": { + "driver": "mysql", + "user": {"ENV": "DB_USERNAME"}, + "password": {"ENV": "DB_PASSWORD"}, + "host": {"ENV": "DB_HOST"}, + "database": {"ENV": "DB_DATABASE"}, + "multipleStatements": true, + "ssl": true + }, + "staging": { + "driver": "mysql", + "user": {"ENV": "DB_USERNAME_STAGING"}, + "password": {"ENV": "DB_PASSWORD_STAGING"}, + "host": {"ENV": "DB_HOST_STAGING"}, + "database": {"ENV": "DB_DATABASE_STAGING"}, + "multipleStatements": true, + "ssl": true + } +} diff --git a/default-contact-reduction.xlsx b/default-contact-reduction.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d5444805e17781aabeede31561bcda60593158a9 GIT binary patch literal 9774 zcmeHt^;;a-)^+3V8l2$nZoz{$8X!0{5E_TzL4#Xp+}$MvCs>f6A$V|y;O-FM?aa*m zW+pS=UvO{zQ1w)uTKlOwwb$Oe);>TbICy*jA^;fx08j(6SZy7^FaQ8H0sw#qK!$xO z?O^W;vUfGs@^l2b7_xiV*;3`f!!qUoV4?T_Z~HHvfr^Aq)oxDokfZ0V(upiKwNB5F zE9Xr=;m~tYP|+Teu&Lw;lFrYsTbfIiR7mX=s*~P5b~L%s*BYAFu)$A$O|mtJ(nZt} zE<7l+I2zjekp&_S*6tESqnn4TnLWR?saf#;6jj5PR1q^K;TTgBB4@HHsykO|U@cQH zUA<=1U#|<(K^}eBjEc`C{Phm7Eezc!ERa z?Iwhh9Cc8cOBWm~@V3*VSi0q`v6Jg4Q4y~$(3V=t2M5FSICC|dy+R`6CDE3wFr%UN zE0nVZT(@I&Iy8G|q>)C;E#UN46=icqK3*9(7esF3dLpTuSSnA$3 z7_yK13UwpRgfNpY(RrT)!Tp##Tz%Ko@2SGZ?TDlLaqCB^15u}E0Se}^pZ^h#U9F3n z6n0+7#5*^>yMef($2B}@?+!*F`I6|O)dUCBy&fOo0KmU-v|gK&<{Ubr45c6%l%vMZ zAX^s>_MiLzar3{Jkbimg3W$o@@7(+m+J7~*_zqi2$zAe!3$>Q7zrq4meRMu8>0$>1 z8MYQl5S+YUo9~ao`9;y_-G1uJHQtIyTznCl2KUO4}eG;$LsG9R!<*k6#K;1!aE5Q?P+==ZAVEty?c!AwbM9#n=@ zHwxtJ#*d`?O(zxYU`T`sDesS`67;*6SmH%S_{3ZHp_Are(Gs#Vf*P! zCcOji-iJ*!qhI4GFYYz>hF3KurF(=pq<1SPF76}beUxr0b_*KRPaL-B#ifcQ=QD^Z z+EUY(zfS8|lW4>>Q1LnJEVSm2|ETtOJoFg){5|a~8U|3Ak)EhwXgkmS-dcJC=g1l@ z2@)B?s2f50(k&1orIS!r)Ik2$r-izLPyVfLD`HSG-O#Jvv-aFd5=r>VaM;@#v&@Xq zv>$wq7&z(ewa!bf0H^E5d+Vfg7aPsF`Ej)VK+}!tkP$@hYvH zk~}%vRVQ=KPH!t{PYj2KzVUE;())P&4a=hbZjXA!$T=40VN*^02u~K zyx$YlU+MRsWCa5)B%$~IcW)JtA)6jfblI!mhoG@`C+;`E5GTtqjTF0dUw_90L1ipWfNma6Rw3q6lx9_j9kjrllmYBCt?E4XkhjnS&9IJ`WAkgnhDBvdyGJ zfJ2zsntsvp!X|FL*d$Fnti&t`wtK;$5Pc39O6?>zD_ELw^v-+-Jex0Wrs5o5gf%|G zM6xM0Z(?JahfWh@wQmh-T;_#J_2TNV{agk)hC>^<+xiSsC)Gxh_4E^o98Xe+ zJnz^u(&SRBC}OtCR4LF_?&TI}`Ic<13y-&aY-x_iR6$wav^7BoWTGz(znI?!5a=p+ zUGRSQOD0{@=kp%$gmtLez6zFUE$8rZ`R-H9^SB%3XK=AABw_o-@6Cu?8&#N<$S%9p z;Zjkp2?|H@UE7iHQkEd~{m4QUmXJkCEw@dQ-4_Q70?m=S2C(`wzpefHC!(Zwr`Jd< zx^vt!Z&MK8kMxy!t%YC#W>;!(5Enp@h8r|AJ$2hJNRD9M$1uZd9$QnxD`IiK{YE0b z`tB%7-(|M~TiPLMVX)cDfROjFyK-#N5 zHQ5bCcoBRIbzZ44UD-n9+|$F@QArw^F>KjU zh~H&~hw(R^UeaWV`SB4p91V5WB1gR(10e4{FcB@Hmu$GF)J4(8jk6_R(5PY!&^7eA zbdKvacG090+z!$R$qQol@+aFICfu6s|*^1>ymq zz~9D&wd`11*}4ueINucqr_CFC5JgQvw#5na=W`$};oa8^_q4f^z|88s zRUC4y0GYOnk^wmz>AYGhnYDb8ONIfIK%2LQSh3eD5wMLh2%^HgRXe$z8fA^a-?1}j znUTxz-NZ!Kg7#1spfe*z*=MZymiIuKfeEd;S2c=4=Vs-bI#&4s4RmM(vmkI{k~EW+ z=M%|hP+2T?V~m&X0VT}d4Xfz%84`KH&5~sCn__uTCuRl}uQVBSRNEK!ptC-Zg-{F-nD}S z`bYBeN-&bGK_4RaHdN%Mz%MCAWYTk2^xzP^Wv@-i*`kB~f=fa`u9Mpd3E8FLkR9bf zNVIV(cp07D|G|8!LHp)p7v6mX{qSyINXuSF`=Afam&3E|_3{I>*8OKZ?Igl(SA`bB zy;MI{o!{cAt2M|D#PQqyw@|vTHylYSfZsuMD}nCf{)2BlmTqZf#5R7B)*>^3tiEAi zU5AGo(n^X4ODA-p!B|k3Eaf1UF#Zeoa*SbkhNg0pHr-ZH-wh*D{-Le7 z_$tfS>&*3Jye-8`J_W4{l4RTtJQd4`nn|IZNb&;`$x<+2nLeuTc^6GKVILWJ&{7H^OQA+3F%9I} zD9{Y({f3*GW*;L_(a*cIRc)0kP6{K6ars5r2fEx3>)ka{VZqxPhvd|Ar>0q4A{1-h z<5!HhxW3jmboX0CjU0qyI`lG|h@75;y1$&9p4G+MCY7H-6bYt#n`nY&-`8WfYv7LfC`rZQPsZ2rRm`WAK*HgCyG^ zOe5;=Fv|BeG?jIq3T)~}9de5U{9!d{71jnmqpOV~*EB^k3a#|a(@h}bI)vcTn>1-L zVJK=}zZVa9D58mI;N&hyG&Bj|7tYnWwr>S{36>I!>e^0bz-0^U{dm^wi$#Bxu)A8eGD7oYDMEIh5ZGnKJ{mtp= zPCU`_n~N>ASn|1fGV+vT>hKT8RjcMl^pU0kn0F^I5}7@mQazAoINNR|heQ3aMlY#$ zyIxlxbj_3L_9C>3c7SI;Ql2!^#-zTN`+%@u9_2>tF1%8fHgtUKn5DcJf7Tq{56M zltiw9)sdh%(T17&;cy-i;j_}jxfWtg*Qj1%??!PK-BDAXp{?ez7f($R$@dj2So*(e zUu2lTfFNbyZ%od~$Sk0%lLWhJD+i}Q4?@OpoaKTW5}8FsL&41qEw9WNOqCTr*iFif z$O)!tgl$epONYWY1*doM08ByCb#eF6sQ zk50F<)LK7m@=zxn4k3JQk#c_n-#QkB#91=0{*j^C2IlM2>omR;)`bKbwsj|Z2?p-D z*im$SY0%=Qj0oimEe{_09P@(E*DM6tqm_56XCAT96RK9t6(7?|(GVav9!v(&(#eWN z+xlWhOO=y*zS~;vddY~4vlGOo%9f<+uZh)-F{SX0tlk>Urs|Hl>W%?-lXLauoHkK8 z?Fa}wHZNCX+crZb=OjZc$r85A35x4dTcfH_zoyE0#q*S=!T`-Uc&K7sHD^CMdD^^w zRn{h3z(y10S{uzd&KXFw$|^FPbf?$*F*S6OTdmownbetQHyR5EEc=w9DS)0{bF@dq z{-)jrxsjQM7kq=aP24^0f!Itl`I0D4v&rp=LYDotyJ^xBqMA^d1Yv`C)j>qAxD@Y% z9yVh(zeEh)F|s^6mKXlm;`-}p&sZqaov>X+`aQTiXow7u74-oZo^b;)B*ak{DB-1e7j+6E$@S8*~ z#Op;PFSiOYus!-R*&;0}&afqrn08=m1!?5sG?WLs5$g=yR~ziUX2x1EiBmVgoY=dC zF)$sKb$j)`Z<_sZeUoiC7$-7P+4u`l{p#&nyTPoF(-96;=3V_@j-H*HO|WIX7$ba} zYX0c{H{oET%9lqNUW?UZWTMAyG#Hq3Q})0;0n~cu#+S%8bRge+y%MBEMUj$5()*ly zDi(8-O{O;%?SLzrmWIcF)uKFe{cQ`NVyy-u0D$p(`gL*jv<12R{D&#fwgb=qRHA15 zux}3s-PT!A8ivLvf!n<~&$zdE4j%GgNeDccO%MGLOR3=I?-wNO3F$`BS0P_tnCBK9ZHq+XqQc(FVy}({_dAs zX$aH}3)~6^iS{Xh9QFJV;h8jy57DM|H4pFbX)(K*;u2UysaP#;B&Z;1TMa0RY^1x_ zX=sO+VuW%v1`7@e{H|>NHbg4c;UBGS%qCOKAxn2pV>b%Nbfync9mA`@Mm5Q&PC|tIEZ9al(;K~fyLimah{NSS+L5sLgW3mTo%A$QejitLv`B9}2n2htfEquxifS$(D-9K+C@ z%m}<;SNb*Ijd10o&g2B$*EvwN1uBr5+&1~iIG``eJ8=s?yM62V@mo>gfcVw=_Mm2` z4U!DTvhDq@D_jTofUG3Dn4p-nvgEiBor(c&kSP^A*7vq!ifG0#T8jm3=dc{TTkKRt zFb&w>Np>6(-A9>^G2;*-YxpJ{D~x82s6cHeZd#-}`~Ecnrw|fyoqe;T!F>RyiOym( zLhg%CH|5g;TL}ol>L1b?y2LWYEw63;%m^GnJ`uNF?sFH|PsHc3j7qI{U8=u|=@N73 zs)Id3{Fc}xzPxakCHvB~$(mwNOPj(lr2S6WKDk_*3v2!Oa(Wxaqx<4$xm+|jvc4LY z0>y>#61cWLo4h(^nX^2?I7;D?-8XS;jvFlLL@w89p=i}<>y-&Fi~G5J$HFrie;~~J zbkOQ4tvau$V3tpfqXBp4lzMr-lsQKj{Co$#WQ^jwvuw!+(toQa6-Q>Q+MsTX3Uzk; zKit{c)EQ)<>FWH--s(56wutStf#t%Ny+U}TZf&zTlO6MY)-Rg*X#@1d zTXTO|;Ax>r^45Yk(X{RRS3qN3LCc!sR_kZf!3(m&FRw)pzmo!4vxFrqq|lc8t6$eL zbhDP(hqIkOU61@m=B1oPeK}jM1O>_m? zN0|og`bMi~*i^M2Hb!_HmPn`5C9FPk^zy>L&oLmR8ciR?Y}a(Wp6&1re6Dw=GrywV zDM3HO8<{+34Q^0% zl@_34C!TBuP3Ytzad`lVX5(z!`~6K?e3{usbewxpH;Pcku-PEpi>&dn z8j6Xr!R#qr!KBKM7hzUx6gQTyb*`(`h3+j}pzr$6nFt6}X_kk6bTD)j2P*AZIG6*S z9UNUa%pIITKc@oPe)^xH2X&Ds$S|}uiv9LyYjnfgj6s%7SAiL3H~cAW#Iprf?{v8y zi5kPXb}`lQkY_@Ubyk;WUj}b{IMTQAD$47bfoa(I0c-k`Wz3^PHaN!l{hmee;JQFq z@=v**o}O_o(#;LW7WFWDU`KT-Ci!Nj(Oz$9E;k=INHeXV7WVX<;`i<`of*!DPUcTf zs5MzTc{)YA**N*(aLD5Vv7Xn~s~};MNyFhLxC^Ri{5ZHUDZF#Z(Ueowy9+|ejB)C- z?eunXJTep`c5gAPNq6Ovdcf~sqs(e4bE=#(bb1D27u+OFnQriT`!Sr*q`Y#1xsRrB z(X2beI3)Nz7`ria`MZlWmAkB$Xc(hR{+qb?Q{mV!FTvX2n^VgzsSGn3JDg)kk z53x7=Hh$ExOb-gJxf^MafiMr)1R?P|icP5M_b=XOs(^wW4)s19sIZLvSMM`*bo`(5 zL8t7GEdwIyFwcn|d<1t(iM~iGvW6LmO5Rw?7@*Fg7{s zwHv+R?Qtukut+9seEx3iGcbHJ4<7-Z6ijrP=rOZs=u3bAL8(9CdPW!Hzb0qwqmfRA zXW{IRAP-+5qm-bdk!P37(_|u4J>IkMWR3p_WJ_YT%0HKk2|G|;)0*T+h0HgZyo1kJ z)T6CNiBXwPetqoZu8dwW)tJy)8*-g=TU;w-W?ORYTfLH)5gD=5U}9X8pU<9{(P#sX z4&_7I>-B)ATSnZa_)=XL?ewI6_tjKTVG5e7pNHLxylXpb#0 { + if (process.browser) { + return new AbortController() + } + }, []) + + useEffect(() => { + return () => { + debug('abort') + controller?.abort() + } + }, dependencies) // eslint-disable-line + + return controller?.signal +} diff --git a/hooks/use-safe-dimensions.ts b/hooks/use-safe-dimensions.ts new file mode 100644 index 0000000..6717e52 --- /dev/null +++ b/hooks/use-safe-dimensions.ts @@ -0,0 +1,21 @@ +import {useDimensions} from 'react-dimensions-hook' + +export default function useSafeDimensions() { + if (process.browser) { + return useDimensions() // eslint-disable-line + } else { + return { + ref: () => null, + dimensions: { + x: 0, + y: 0, + left: 0, + top: 0, + right: 0, + bottom: 0, + width: 0, + height: 0 + } + } + } +} diff --git a/lib/BaltimoreCyberTrustRoot.crt.pem b/lib/BaltimoreCyberTrustRoot.crt.pem new file mode 100644 index 0000000..2bd16eb --- /dev/null +++ b/lib/BaltimoreCyberTrustRoot.crt.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + diff --git a/lib/arrayMath.ts b/lib/arrayMath.ts new file mode 100644 index 0000000..595fbe7 --- /dev/null +++ b/lib/arrayMath.ts @@ -0,0 +1,26 @@ +export function cumsum(values: Array) { + let sum = 0 + return Array.from(values, v => (sum += v || 0)) +} + +export function maxIndex(values: Array) { + let max = -Infinity + let maxIndex = -1 + let index = -1 + for (const value of values) { + ++index + if (value != null && max < value) { + ;(max = value), (maxIndex = index) + } + } + return maxIndex +} + +export function elementSum(arrays: Array) { + const filtered = arrays.filter(a => a !== null) as number[][] + return filtered.reduce((memo, arr) => arr!.map((el, i) => memo![i] + el, [])) +} + +export function last(array: number[]) { + return array[array.length - 1] +} diff --git a/lib/assertions.ts b/lib/assertions.ts new file mode 100644 index 0000000..0f12d1f --- /dev/null +++ b/lib/assertions.ts @@ -0,0 +1,29 @@ +/** + * Assert that a value is a string and return the string value. + * + * @param v A value to assert is a string + * @param message A message for a thrown error if the value is not a string + */ +export function assertString(v: unknown, message?: string): string { + if (typeof v !== 'string') { + throw new Error(message ?? 'Expected value to be a string') + } + + return v +} + +/** + * Assert that an enviornment variable exists, and fetch it. + * + * @param k The env var key to get + * @param ignoreLocalMode Whether to ignore absence in local mode, and return an empty string if unset + */ +export function assertEnv(k: string, ignoreLocalMode: boolean = false): string { + const value = process.env[k] + + if (value == null && ignoreLocalMode && process.env.LOCAL_MODE) { + return '' + } + + return assertString(value, `Missing env var "${k}"`) +} diff --git a/lib/dateFunctions.ts b/lib/dateFunctions.ts new file mode 100644 index 0000000..3341f88 --- /dev/null +++ b/lib/dateFunctions.ts @@ -0,0 +1,50 @@ +import {DateTime} from 'luxon' +import {ISODate} from '../types/model-runner' + +export function toYYYYMMDD(date?: Date) { + // ensure UTC date is the same as date in current TZ + if (!date || Number.isNaN(date.getTime())) { + date = new Date() + date.setMinutes(date.getMinutes() - date.getTimezoneOffset()) + } + return date.toISOString().substring(0, 10) +} + +export function isValidDate(d: string): boolean { + return !!(d && d.length === 10 && new Date(d).getTime()) +} + +export function addDays(d: ISODate, days: number): ISODate { + return DateTime.fromISO(d) + .plus({days}) + .toISODate() +} + +/** + * Finds the maximum date of an array of ISO dates. + * + * @param dates ISO Date strings to find the max for + */ +export function maxDate(...dates: ISODate[]): ISODate { + return dates.reduce((greatestDate, date) => { + if (!greatestDate) { + return date + } + + if (!date) { + return greatestDate + } + + return greatestDate.localeCompare(date) > 0 ? greatestDate : date + }, '') +} + +/** + * + * @param subject + * @param object + * @return true if subject is greater than object + */ +export function isGreater(thisDate: ISODate, other: ISODate): boolean { + return thisDate.localeCompare(other) > 0 +} diff --git a/lib/db.ts b/lib/db.ts new file mode 100644 index 0000000..c8d95d1 --- /dev/null +++ b/lib/db.ts @@ -0,0 +1,512 @@ +import omit from 'lodash/omit' +import {DateTime} from 'luxon' +import {ServerlessMysql} from 'serverless-mysql' +import SQL from 'sql-template-strings' +import Models from '../lib/models' +import {CaseData} from '../types/case-data' +import {ISODate, ModelInput, RunStatus} from '../types/model-runner' +import {initSentry} from './sentry' +import {Session} from './session' +import { + InterventionData, + InterventionMap, + ParameterAbbreviations +} from './simulation-types' + +const {captureException} = initSentry() + +export type Simulation = { + id: number + region_name: string + status: RunStatus + subregion_name: string | undefined + region_id: string + subregion_id: string | undefined + github_user_id: number + github_user_login: string + configuration: ModelInput + model_runs: ModelRun[] + label: string + created_at: string + updated_at: string +} + +export type ModelRun = { + model_slug: string + status: RunStatus + results_data: string | null + export_location: string | null +} + +export type SimulationSummary = Omit< + Simulation, + 'configuration' | 'model_runs' +> & { + region: string + status: RunStatus + configurationSummary: string +} + +// RowDataPacket is an un-exported type from the Node.js MySQL lib. +type RowDataPacket = {} + +export async function getFatalityData( + conn: ServerlessMysql, + regionID: string, + subregionID: string | undefined, + t0: string, + extent: [number, number] +): Promise { + const t0Date = new Date(t0) + const earliestDate = new Date(t0Date.getTime()) + earliestDate.setDate(t0Date.getDate() + extent[0]) + const latestDate = new Date(t0Date.getTime()) + latestDate.setDate(t0Date.getDate() + extent[1]) + + const query = SQL` + SELECT + date, confirmed, deaths + FROM case_data + WHERE + region_id = ${regionID} AND` + + if (subregionID) { + query.append(SQL`\nsubregion_id = ${subregionID} AND`) + } + + query.append(SQL`\ndate >= ${earliestDate} AND + date <= ${latestDate} + ORDER BY date ASC`) + + const rows = await conn.query< + {date: string; confirmed: number; deaths: number}[] + >(query) + + // Add one to account for t0 itself, I think... + const deaths = new Array(extent[1] - extent[0] + 1).fill(null) + const cumulativeDeaths = new Array(extent[1] - extent[0] + 1).fill(null) + const confirmed = new Array(extent[1] - extent[0] + 1).fill(null) + const cumulativeConfirmed = new Array(extent[1] - extent[0] + 1).fill(null) + + const msPerDay = 1000 * 60 * 60 * 24 + const numRows = rows.length + + for (let i = 0; i < numRows; i++) { + const row = rows[i] + const lastRow = rows[i - 1] + + const date = new Date(row.date) + + const diffFromStart = Math.floor( + (date.getTime() - earliestDate.getTime()) / msPerDay + ) + + deaths[diffFromStart] = row.deaths - (lastRow?.deaths ?? 0) + confirmed[diffFromStart] = row.confirmed - (lastRow?.confirmed ?? 0) + cumulativeDeaths[diffFromStart] = row.deaths + cumulativeConfirmed[diffFromStart] = row.confirmed + } + + return {deaths, cumulativeDeaths, confirmed, cumulativeConfirmed} +} + +export async function getInterventionData( + conn: ServerlessMysql +): Promise { + type Row = { + region_id: string + subregion_id: string + policy: string + notes?: string + source?: string + issue_date: string + start_date?: string + ease_date?: string + expiration_date?: string + end_date?: string + } + + const rows = await conn.query(SQL` + SELECT + region_id, subregion_id, policy, issue_date, + start_date, expiration_date, end_date + FROM + intervention_data; + `) + + const result: any = {} + for (const row of rows) { + const region = row.region_id + const subregion = row.subregion_id || '_self' + const regionData = result[region] || (result[region] = {}) + const subregionData = regionData[subregion] || (regionData[subregion] = {}) + const policyData = (subregionData[row.policy] = {} as InterventionData) + + // To save bytes when serializing, don't add null values. + if (row.issue_date) policyData.dateIssued = row.issue_date + if (row.start_date) policyData.dateEnacted = row.start_date + if (row.expiration_date) policyData.dateExpiry = row.expiration_date + if (row.end_date) policyData.dateEnded = row.end_date + } + + return result +} + +export async function createSimulation( + conn: ServerlessMysql, + props: { + region_id: string + subregion_id?: string + status: RunStatus + github_user_id: string + github_user_login: string + label: string + configuration: Omit + } +): Promise<{insertId: number}> { + return conn.query(SQL` + INSERT INTO simulation_runs ( + github_user_id, + github_user_login, + label, + configuration, + model_runs, + region_id, + subregion_id, + created_at, + updated_at + ) VALUES ( + ${props.github_user_id}, + ${props.github_user_login}, + ${props.label}, + ${JSON.stringify(props.configuration)}, + ${JSON.stringify( + Object.keys(Models).map(slug => ({ + model_slug: slug, + status: props.status, + results_data: null, + export_location: null + })) + )}, + ${props.region_id}, + ${props.subregion_id}, + ${new Date()}, + ${new Date()} + )`) +} + +export async function updateSimulation( + conn: ServerlessMysql, + id: string, + status: RunStatus, + model: string, + resultsLocation: string, + exportLocation: string, + workflowRunID: string | undefined +): Promise { + console.log( + `Updating simulation ${id}/${model} as ${status} at ${resultsLocation}` + ) + + await conn.query('START TRANSACTION') + + const simulationResult = await conn.query< + {id: number; model_runs: ModelRun[]}[] + >( + SQL`SELECT id, model_runs FROM simulation_runs WHERE simulation_runs.id = ${id} FOR UPDATE` + ) + + let affectedRows + + try { + if (simulationResult.length < 1) { + return false + } + + const simulation = simulationResult[0] + + const newModelRuns = simulation.model_runs.map(modelRun => { + if (modelRun.model_slug === model) { + return { + ...modelRun, + results_data: resultsLocation, + export_location: exportLocation, + status + } + } + + return modelRun + }) + + const query = SQL`UPDATE simulation_runs SET model_runs=${JSON.stringify( + newModelRuns + )}` + + if (workflowRunID) { + query.append(SQL`, workflow_run_id=${workflowRunID}`) + } + + query.append(SQL` WHERE id=${id}`) + + const updateResult = await conn.query<{affectedRows: number}>(query) + affectedRows = updateResult.affectedRows + + await conn.query('COMMIT') + } catch (err) { + await conn.query('ROLLBACK') + throw err + } + + return Boolean(affectedRows) +} + +export async function listSimulationSummaries( + conn: ServerlessMysql, + githubUserID: string, + queryOpts?: {region?: string; limit?: number} +): Promise { + const select = SQL`SELECT + simulation_runs.id, + simulation_runs.github_user_id, + simulation_runs.github_user_login, + regions.name AS region_name, + subregions.name AS subregion_name, + regions.id AS region_id, + subregions.id AS subregion_id, + simulation_runs.configuration, + simulation_runs.model_runs, + simulation_runs.label, + DATE_FORMAT(simulation_runs.created_at, "%Y-%m-%dT%TZ") AS created_at, + DATE_FORMAT(simulation_runs.updated_at, "%Y-%m-%dT%TZ") AS updated_at + FROM simulation_runs + INNER JOIN regions AS regions + ON regions.id = simulation_runs.region_id + LEFT JOIN regions AS subregions + ON subregions.id = simulation_runs.subregion_id + WHERE` + + if (queryOpts?.region) { + select.append(SQL` simulation_runs.region_id = ${queryOpts.region} AND`) + } + + select.append( + SQL` simulation_runs.github_user_id = ${githubUserID} ORDER BY updated_at DESC` + ) + + if (queryOpts?.limit != null) { + select.append(SQL` LIMIT ${queryOpts.limit}`) + } + + const results = await conn.query(select) + return (results as Simulation[]).map(summarizeStrategies) +} + +function summarizeStrategies(simulation: Simulation): SimulationSummary { + const summary = omit(simulation, 'configuration') as SimulationSummary + summary.status = getRunStatus(simulation) + + try { + if (!simulation.configuration) { + summary.configurationSummary = '' + } else { + const input = simulation.configuration as ModelInput + summary.configurationSummary = Object.keys(input.parameters) + .map(key => ParameterAbbreviations[key] || '') + .filter(val => val) + .join(' ') + } + } catch (err) { + captureException(err) + console.error(simulation.configuration) + console.error(err) + summary.configurationSummary = 'Invalid parameters' + } + return summary +} + +export async function getRegionCaseData( + conn: ServerlessMysql, + regionID: string, + subregionID: string | undefined +): Promise<{ + deaths: number | null + confirmed: number | null + endDate: ISODate | null +}> { + const subregionQuery = subregionID + ? SQL`\nAND subregion_id = ${subregionID}` + : '\n' + + // We want the death data for the week starting with the most recent data we have + // This isn't the most efficient way of doing it and we could do this all in one + // query. + const endDateQuery = SQL`SELECT + d.date, d.deaths, d.confirmed + FROM case_data AS d + WHERE + d.region_id = ${regionID}` + .append(subregionQuery) + .append(SQL` ORDER BY d.date DESC LIMIT 1`) + const endDateResult = await conn.query< + {date: string; deaths: number; confirmed: number}[] + >(endDateQuery) + + if (!endDateResult.length) { + return { + deaths: null, + confirmed: null, + endDate: null + } + } + return { + deaths: endDateResult[0].deaths, + confirmed: endDateResult[0].confirmed, + endDate: DateTime.fromSQL(endDateResult[0].date).toISODate() + } +} + +export async function getSimulation( + conn: ServerlessMysql, + githubUser: Session['user'], + queryOpts: {id: number} +): Promise { + const isAdmin = await isAdminUser(conn, githubUser.login) + + const query = SQL`SELECT + simulation_runs.id, + simulation_runs.github_user_id, + simulation_runs.github_user_login, + regions.name AS region_name, + subregions.name AS subregion_name, + regions.id AS region_id, + subregions.id AS subregion_id, + simulation_runs.configuration, + simulation_runs.model_runs, + simulation_runs.label, + DATE_FORMAT(simulation_runs.created_at, "%Y-%m-%dT%TZ") AS created_at, + DATE_FORMAT(simulation_runs.updated_at, "%Y-%m-%dT%TZ") AS updated_at + FROM simulation_runs + INNER JOIN regions AS regions + ON regions.id = simulation_runs.region_id + LEFT JOIN regions AS subregions + ON subregions.id = simulation_runs.subregion_id + WHERE + simulation_runs.id = ${queryOpts.id}` + + if (!isAdmin) { + query.append(SQL`\nAND simulation_runs.github_user_id = ${githubUser.id}`) + } + + const results = await conn.query(query) + + if (results.length < 1) { + return null + } + + if (results.length > 1) { + throw new Error(`Multiple simulations found with same id ${queryOpts.id}.`) + } + + return toSimulation(results[0]) +} + +export async function isAuthorizedUser(conn: ServerlessMysql, login: string) { + const results = await conn.query( + SQL`SELECT 1 FROM authorized_users WHERE github_user_login = ${login} LIMIT 1` + ) + + return results.length > 0 +} + +export async function isAdminUser(conn: ServerlessMysql, login: string) { + const results = await conn.query( + SQL`SELECT 1 FROM authorized_users WHERE github_user_login = ${login} AND admin = 1 LIMIT 1` + ) + return results.length > 0 +} + +export type UserConfig = { + hasAcceptedDisclaimer?: boolean +} + +export async function getUserConfig( + conn: ServerlessMysql, + login: string +): Promise { + const results = await conn.query<{config: UserConfig}[]>( + SQL`SELECT config FROM authorized_users WHERE github_user_login = ${login} LIMIT 1` + ) + + if (!results) { + throw new Error('No such user found') + } + + return results[0].config +} + +export async function updateUserConfig( + conn: ServerlessMysql, + login: string, + cb: (conf: UserConfig) => UserConfig +): Promise { + await conn.query('START TRANSACTION') + + let newConfig: UserConfig + + try { + const results = await conn.query<{config: UserConfig}[]>( + SQL`SELECT config FROM authorized_users WHERE github_user_login = ${login} LIMIT 1 FOR UPDATE` + ) + + if (!results) { + throw new Error('No such user found') + } + + const {config} = results[0] + + newConfig = cb(config) + + await conn.query( + SQL`UPDATE authorized_users SET config = ${JSON.stringify( + newConfig + )} WHERE github_user_login = ${login}` + ) + + await conn.query('COMMIT') + } catch (err) { + await conn.query('ROLLBACK') + throw err + } + + return newConfig +} + +function toSimulation(object: any): Simulation { + const simulation = Object.assign({}, object) + simulation.status = getRunStatus(object) + return simulation +} + +function getRunStatus(simulation: Simulation): RunStatus { + const statuses = simulation.model_runs.map(run => run.status) + + // Fail fast—if any are failed, we are failed. + if (statuses.some(status => status === RunStatus.Failed)) + return RunStatus.Failed + + // In progress if any are in progress. + if (statuses.some(status => status === RunStatus.InProgress)) + return RunStatus.InProgress + + // Complete if all are complete. + if (statuses.every(status => status === RunStatus.Complete)) + return RunStatus.Complete + + // Only pending if all are pending. + if (statuses.every(status => status === RunStatus.Pending)) + return RunStatus.Pending + + // Otherwise, we must be in progress (this could happen when one has + // completed, but all others are still pending). + return RunStatus.InProgress +} diff --git a/lib/default-contact-reduction.ts b/lib/default-contact-reduction.ts new file mode 100644 index 0000000..788221c --- /dev/null +++ b/lib/default-contact-reduction.ts @@ -0,0 +1,108 @@ +import {Intensity} from '../types/model-runner' +import {InterventionPeriod, StrategyKey} from './new-simulation-state' + +/** + * This module calculates default contact reduction for a combination of + * intervention strategies, represented as bits. + * + * Not all combinations have a default reduction value—particularly less likely + * ones. + */ + +// Bit values for interventions = +const interventionValues: Record> = { + schoolClosure: { + [Intensity.Mild]: 1, + [Intensity.Moderate]: 2, + [Intensity.Aggressive]: 4 + }, + voluntaryHomeQuarantine: { + [Intensity.Mild]: 8, + [Intensity.Moderate]: 16, + [Intensity.Aggressive]: 32 + }, + caseIsolation: { + [Intensity.Mild]: 64, + [Intensity.Moderate]: 128, + [Intensity.Aggressive]: 256 + }, + socialDistancing: { + [Intensity.Mild]: 512, + [Intensity.Moderate]: 1024, + [Intensity.Aggressive]: 2048 + } +} + +// Map of intervention combinations to default contact reduction +const contactReductionTable = (() => { + const iv = interventionValues + const sc = 'schoolClosure' + const hq = 'voluntaryHomeQuarantine' + const ci = 'caseIsolation' + const sd = 'socialDistancing' + const Mi = Intensity.Mild + const Mo = Intensity.Moderate + const Ag = Intensity.Aggressive + + /** + * Data provided by Neil Ferguson of Imperial College, roughly based on + * https://journals.plos.org/plosmedicine/article?id=10.1371/journal.pmed.0050074 + * + * This is a literal copy of the data from "default-contact-reduction.xlsx" + * in the root of this repository. + */ + + return new Map([ + /* SC */ /* HQ */ /* CI */ /* SD */ + /* ---------|------------|------------|----------*/ + [0 /* */ | 0 /* */ | 0 /* */ | 0 /* */, 0], + [0 /* */ | 0 /* */ | 0 /* */ | iv[sd][Mi], 0.1], + [0 /* */ | 0 /* */ | 0 /* */ | iv[sd][Mo], 0.3], + [0 /* */ | 0 /* */ | 0 /* */ | iv[sd][Ag], 0.65], + [0 /* */ | 0 /* */ | iv[ci][Ag] | 0 /* */, 0.15], + [0 /* */ | 0 /* */ | iv[ci][Ag] | iv[sd][Mi], 0.235], + [0 /* */ | 0 /* */ | iv[ci][Ag] | iv[sd][Mo], 0.405], + [0 /* */ | 0 /* */ | iv[ci][Ag] | iv[sd][Ag], 0.7025], + [0 /* */ | iv[hq][Ag] | iv[ci][Ag] | 0 /* */, 0.25], + [0 /* */ | iv[hq][Ag] | iv[ci][Ag] | iv[sd][Mi], 0.325], + [0 /* */ | iv[hq][Ag] | iv[ci][Ag] | iv[sd][Mo], 0.475], + [0 /* */ | iv[hq][Ag] | iv[ci][Ag] | iv[sd][Ag], 0.7375], + [iv[sc][Ag] | 0 /* */ | 0 /* */ | 0 /* */, 0.175], + [iv[sc][Ag] | 0 /* */ | 0 /* */ | iv[sd][Mi], 0.2575], + [iv[sc][Ag] | 0 /* */ | 0 /* */ | iv[sd][Mo], 0.4225], + [iv[sc][Ag] | 0 /* */ | 0 /* */ | iv[sd][Ag], 0.71125], + [iv[sc][Ag] | 0 /* */ | iv[ci][Ag] | 0 /* */, 0.29875], + [iv[sc][Ag] | 0 /* */ | iv[ci][Ag] | iv[sd][Mi], 0.368875], + [iv[sc][Ag] | 0 /* */ | iv[ci][Ag] | iv[sd][Mo], 0.509125], + [iv[sc][Ag] | 0 /* */ | iv[ci][Ag] | iv[sd][Ag], 0.7545625], + [iv[sc][Ag] | iv[hq][Ag] | iv[ci][Ag] | 0 /* */, 0.38125], + [iv[sc][Ag] | iv[hq][Ag] | iv[ci][Ag] | iv[sd][Mi], 0.443125], + [iv[sc][Ag] | iv[hq][Ag] | iv[ci][Ag] | iv[sd][Mo], 0.566875], + [iv[sc][Ag] | iv[hq][Ag] | iv[ci][Ag] | iv[sd][Ag], 0.7834375] + ]) +})() + +export function getDefaultContactReduction( + per: Pick +): number | null { + const sc = per.schoolClosure + ? interventionValues.schoolClosure[per.schoolClosure] + : 0 + const hq = per.voluntaryHomeQuarantine + ? interventionValues.voluntaryHomeQuarantine[per.voluntaryHomeQuarantine] + : 0 + const ci = per.caseIsolation + ? interventionValues.caseIsolation[per.caseIsolation] + : 0 + const sd = per.socialDistancing + ? interventionValues.socialDistancing[per.socialDistancing] + : 0 + + const reduction = contactReductionTable.get(sc | hq | ci | sd) + + if (reduction != null) { + return Math.round(reduction * 100) + } else { + return null + } +} diff --git a/lib/github.ts b/lib/github.ts new file mode 100644 index 0000000..f5b08b5 --- /dev/null +++ b/lib/github.ts @@ -0,0 +1,92 @@ +import axios, {AxiosInstance} from 'axios' +import {assertEnv} from './assertions' + +type APIAccessToken = {access_token: string} +type APIUser = {id: string; login: string} +type APITeamMembership = { + url: string + role: string + state: 'active' | 'pending' +} + +const CLIENT_OPTS = { + baseURL: 'https://api.github.com', + timeout: 5_000, + headers: { + accept: 'application/json', + 'content-type': 'application/json' + } +} + +const api = axios.create(CLIENT_OPTS) + +/** + * Create a new GitHub API client. + */ +export function createClient(opts: {token: string}): AxiosInstance { + return axios.create({ + ...CLIENT_OPTS, + headers: { + ...CLIENT_OPTS.headers, + authorization: `Bearer ${opts.token}` + } + }) +} + +export function deleteAccessToken(opts: {token: string}): Promise { + return axios.delete(`/applications/${assertEnv('GITHUB_CLIENT_ID')}/token`, { + ...CLIENT_OPTS, + auth: { + username: assertEnv('GITHUB_CLIENT_ID'), + password: assertEnv('GITHUB_CLIENT_SECRET') + }, + data: { + access_token: opts.token + } + }) +} + +/** + * Exchange an OAuth code for an API access token. + */ +export async function exchangeCode( + code: string +): Promise<[AxiosInstance, string]> { + const accessTokenResp = await api.post( + '/login/oauth/access_token', + { + client_id: assertEnv('GITHUB_CLIENT_ID'), + client_secret: assertEnv('GITHUB_CLIENT_SECRET'), + code + }, + {baseURL: 'https://github.com'} + ) + + const token = accessTokenResp.data.access_token + + return [createClient({token}), token] +} + +/** + * Get the authenticated user. + */ +export async function getUser(client: AxiosInstance): Promise { + const resp = await client.get('/user') + return resp.data +} + +/** + * Create a repository dispatch event. + */ +export async function repositoryDispatch( + client: AxiosInstance, + repoOwner: string, + repoName: string, + type: string, + payload: any +): Promise { + await client.post(`/repos/${repoOwner}/${repoName}/dispatches`, { + event_type: type, + client_payload: payload + }) +} diff --git a/lib/handle-error.ts b/lib/handle-error.ts new file mode 100644 index 0000000..5162319 --- /dev/null +++ b/lib/handle-error.ts @@ -0,0 +1,32 @@ +import {GetServerSideProps} from 'next' +import {initSentry} from './sentry' + +const {captureException} = initSentry() + +let didAttachHandlers = false +export function catchUnhandledErrors() { + if (didAttachHandlers) return + didAttachHandlers = true + + process.on('unhandledRejection', err => { + captureException(err as Error) + }) + + process.on('uncaughtException', err => { + captureException(err) + }) +} + +export default function handleError

    ( + cb: GetServerSideProps

    +): GetServerSideProps

    { + return async ctx => { + try { + const result = await cb(ctx) + return result + } catch (err) { + captureException(err) + throw err + } + } +} diff --git a/lib/logging.ts b/lib/logging.ts new file mode 100644 index 0000000..0568ef7 --- /dev/null +++ b/lib/logging.ts @@ -0,0 +1,55 @@ +type Value = Record | undefined | null + +/** + * Log an object, recursively, expanding only the first level by default. + * + * Safari has insane behavior around nesting, so YMMV there (although the + * logged data is correct). + * + * @param title The title of the group + * @param value The object to log + * @param level The current nesting level + */ +export function logValue(title: string, value: Value, level: number = 0) { + if (!value) { + return + } + + group( + title, + () => { + // Log all non-object values. + table( + {[title]: value}, + Object.keys(value).filter(key => typeof value[key] !== 'object') + ) + + Object.entries(value).forEach(([key, value]) => { + if (typeof value !== 'object') return + logValue(key, value, level + 1) + }) + }, + level !== 1 + ) +} + +export function group( + title: string, + cb: () => void, + collapsed: boolean = true +) { + console[collapsed ? 'groupCollapsed' : 'group']( + `%c${title}`, + 'color: blue; font-weight: bold' + ) + cb() + console.groupEnd() +} + +export function table(...args: any[]) { + if (typeof console.table === 'function') { + console.table(...args) + } else { + console.log(...args) + } +} diff --git a/lib/models.ts b/lib/models.ts new file mode 100644 index 0000000..84ef362 --- /dev/null +++ b/lib/models.ts @@ -0,0 +1,54 @@ +const isProduction = process.env.APP_ENVIRONMENT === 'production' + +const models: ModelMap = require('../models.yml') + +Object.keys(models).forEach(modelId => { + if (isProduction && !models[modelId].isProductionReady) { + delete models[modelId] + } +}) + +export default models + +export type ModelSpec = { + name: string + origin: string + imageURL: string + metaURLs?: { + code?: string + paper?: string + website?: string + } + description: string + supportedParameters: SupportedParameter[] + isProductionReady: boolean +} + +export type MinimalModelSpec = { + metaURLs?: { + code?: string + paper?: string + website?: string + } +} + +export type ModelMap = {[key: string]: ModelSpec} + +export enum SupportedParameter { + ContactReduction = 'contactReduction', + InterventionStrategies = 'interventionStrategies', + R0 = 'r0' +} + +export function supportedParameterDesc(supportedParameter: SupportedParameter) { + switch (supportedParameter) { + case SupportedParameter.ContactReduction: + return 'Contact reduction is used by' + case SupportedParameter.InterventionStrategies: + return 'Intervention strategies are used by' + case SupportedParameter.R0: + return 'Customizable R0 is used by' + default: + throw new Error('Missing case') + } +} diff --git a/lib/mysql.ts b/lib/mysql.ts new file mode 100644 index 0000000..258e74c --- /dev/null +++ b/lib/mysql.ts @@ -0,0 +1,70 @@ +import {captureException, captureMessage, Severity} from '@sentry/node' +import fs from 'fs' +import {ConnectionConfig} from 'mysql' +import mysql, {ServerlessMysql} from 'serverless-mysql' + +// eslint-disable-next-line @typescript-eslint/ban-ts-ignore +// @ts-ignore: Ensure we aren't using WebPack's version of "path". +const path = __non_webpack_require__('path') + +// Cert URL: https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem + +const host = process.env.DB_HOST +const user = process.env.DB_USERNAME +const password = process.env.DB_PASSWORD +const database = process.env.DB_DATABASE +const config: ConnectionConfig = { + host, + user, + password, + database, + dateStrings: true, + typeCast: (field, next) => { + switch (field.type) { + case 'JSON': + return JSON.parse(field.string()) + default: + return next() + } + } +} + +if (process.env.NODE_ENV === 'production') { + config.ssl = { + ca: fs + .readFileSync( + path.join(process.cwd(), 'lib/BaltimoreCyberTrustRoot.crt.pem') + ) + .toString() + } +} + +const db = mysql({ + config, + maxRetries: 5, + onConnectError: (err: Error) => captureException(err), + onError: (err: Error) => captureException(err), + onKillError: (err: Error) => captureException(err) +}) + +type Callback

    , R> = (...args: P) => Promise + +export const withDB =

    , R>( + cb: (conn: ServerlessMysql) => Callback +): Callback => { + return async (...args: P) => { + try { + const result = await cb(db)(...args) + return result + } finally { + try { + await db.end() + } catch (err) { + captureMessage( + `Error closing DB connection ${err.message}`, + Severity.Warning + ) + } + } + } +} diff --git a/lib/new-simulation-state.ts b/lib/new-simulation-state.ts new file mode 100644 index 0000000..cafd08b --- /dev/null +++ b/lib/new-simulation-state.ts @@ -0,0 +1,405 @@ +import Joi from '@hapi/joi' +import Debug from 'debug' +import omit from 'lodash/omit' +import { + Intensity, + InterventionPeriod as RunnerInterventionPeriod +} from '../types/model-runner' +import {Region, TopLevelRegion} from '../types/regions' +import {addDays, maxDate, toYYYYMMDD} from './dateFunctions' +import {getDefaultContactReduction} from './default-contact-reduction' +import {newSimulationSchema} from './simulation-schema' +import {InterventionMap} from './simulation-types' + +export {Intensity} from '../types/model-runner' + +const debug = Debug('app:new-simulation-state') + +// To be moved to shared location +type ISODate = string + +/** + * The state object used in the react page + */ +export interface NewSimulationState { + region: TopLevelRegion + subregion: Region + label: string + r0: number | undefined + interventionPeriods: InterventionPeriod[] +} + +/** + * The data sent from web UI to backend + */ +export interface NewSimulationConfig { + regionID: string + subregionID?: string + label: string + r0: number | undefined + interventionPeriods: RunnerInterventionPeriod[] +} + +export interface StrategyDescription { + label: string + intensities?: Record +} + +export const StrategyDescriptions: Record = { + socialDistancing: { + label: 'Social Distancing', + intensities: { + [Intensity.Aggressive]: + 'Statewide lockdown (Assumes 90% social contact reduction)', + [Intensity.Moderate]: + 'Stay at Home or state curfew (Assumes 75% social contact reduction)', + [Intensity.Mild]: + 'Restrict any mass gatherings (Assumes 50% social contact reduction)' + } + }, + schoolClosure: {label: 'School Closure'}, + caseIsolation: {label: 'Case Isolation'}, + voluntaryHomeQuarantine: {label: 'Voluntary Home Quarantine'} +} + +export type StrategyKey = + | 'socialDistancing' + | 'schoolClosure' + | 'caseIsolation' + | 'voluntaryHomeQuarantine' + +export interface InterventionPeriod + extends Omit { + isAutoGenerated: boolean + // We need to support an empty string for reductionPopulationContact because + // that is the default value for new periods + reductionPopulationContact: number | '' +} + +/** + * + * @param state simulation state from React UI + * + * @return simulation config required by the back end. + */ +export function createFormBody(state: NewSimulationState): NewSimulationConfig { + return { + regionID: state.region.id, + subregionID: + state.subregion.id !== '_self' ? state.subregion.id : undefined, + label: state.label, + r0: state.r0, + interventionPeriods: state.interventionPeriods.map(period => ({ + ...omit(period, 'isAutoGenerated'), + + // note: allow for invalid values since we check for it later + reductionPopulationContact: + typeof period.reductionPopulationContact === 'number' + ? period.reductionPopulationContact + : ((undefined as unknown) as number) + })) + } +} + +type Action = + | { + type: 'SET_LABEL' + label: string + } + | { + type: 'SET_R0' + r0: number | undefined + } + | { + type: 'SET_REGION' + region: TopLevelRegion + interventions: InterventionMap + } + | { + type: 'SET_SUBREGION' + subregion: Region + interventions: InterventionMap + } + | { + type: 'UPDATE_PERIOD' + period: InterventionPeriod + newPeriod: Partial + } + | { + type: 'UPDATE_PERIOD_INTERVENTIONS' + period: InterventionPeriod + update: Pick + } + | { + type: 'ADD_PERIOD' + period: InterventionPeriod + } + | { + type: 'REMOVE_PERIOD' + period: InterventionPeriod + } + +export function initializeSimulationState( + initialState: Pick, + interventions: InterventionMap +): NewSimulationState { + return { + ...initialState, + r0: undefined, + label: `Simulation created on ${toYYYYMMDD()}`, + interventionPeriods: autoFillParameters( + initialState.region, + initialState.subregion, + interventions + ) + } +} + +export function reducer( + state: NewSimulationState, + action: Action +): NewSimulationState { + debug('reducer state=%O action=%o', state, action) + + switch (action.type) { + case 'SET_LABEL': + return {...state, label: action.label} + + case 'SET_R0': + return {...state, r0: action.r0} + + case 'SET_REGION': + return { + ...state, + region: action.region, + subregion: Object.values(action.region.regions)[0], + interventionPeriods: autoFillParameters( + action.region, + Object.values(action.region.regions)[0], + action.interventions + ) + } + + case 'SET_SUBREGION': + return { + ...state, + subregion: action.subregion, + interventionPeriods: autoFillParameters( + state.region, + action.subregion, + action.interventions + ) + } + + case 'ADD_PERIOD': { + const newPeriod: InterventionPeriod = { + ...action.period, + reductionPopulationContact: + getDefaultContactReduction(action.period) ?? '' + } + const periods = [...state.interventionPeriods, newPeriod] + return { + ...state, + interventionPeriods: periods + } + } + case 'REMOVE_PERIOD': { + const periods = state.interventionPeriods.filter( + period => period !== action.period + ) + return { + ...state, + interventionPeriods: periods + } + } + case 'UPDATE_PERIOD': { + const periods = [...state.interventionPeriods] + const index = periods.findIndex(period => period === action.period) + const newPeriod = { + ...action.period, + ...action.newPeriod, + isAutoGenerated: false + } + periods[index] = newPeriod + return { + ...state, + interventionPeriods: periods + } + } + case 'UPDATE_PERIOD_INTERVENTIONS': { + const periods = [...state.interventionPeriods] + const index = periods.findIndex(period => period === action.period) + const newPeriod = { + ...action.period, + ...action.update, + isAutoGenerated: false + } + + const newReduction = getDefaultContactReduction(newPeriod) + newPeriod.reductionPopulationContact = newReduction ?? '' + + periods[index] = {...newPeriod} + return { + ...state, + interventionPeriods: periods + } + } + } +} + +function autoFillParameters( + region: Region, + subregion: Region | undefined, + interventions: InterventionMap +): InterventionPeriod[] { + if (!subregion || region.id !== 'US') { + return [] + } + const regionInterventions = interventions[region.id][subregion.id] + if (!regionInterventions) { + return [] + } + + const rawInterventions = [] as { + type: StrategyKey + startDate: ISODate + intensity: Intensity + }[] + + function addIntervention( + name: string, + type: StrategyKey, + intensity: Intensity + ) { + const namedInterventions = regionInterventions[name] + if (namedInterventions?.dateEnacted) { + rawInterventions.push({ + type, + intensity, + startDate: namedInterventions.dateEnacted + }) + } + } + addIntervention('SchoolClose', 'schoolClosure', Intensity.Aggressive) + addIntervention('GathRestrict10', 'socialDistancing', Intensity.Mild) + addIntervention('StayAtHome', 'socialDistancing', Intensity.Moderate) + addIntervention('StateCurfew', 'socialDistancing', Intensity.Moderate) + + // Sort by start date and create initial interventions set + let interventionPeriods: InterventionPeriod[] = rawInterventions + .sort((i1, i2) => i1.startDate.localeCompare(i2.startDate)) + .map(raw => ({ + startDate: raw.startDate, + reductionPopulationContact: '', + isAutoGenerated: true, + voluntaryHomeQuarantine: Intensity.Aggressive, + caseIsolation: Intensity.Aggressive, + [raw.type]: raw.intensity + })) + + // merge with previous item and dedup + interventionPeriods = interventionPeriods + .reduce((combined, interventionPeriod, i) => { + combined.push({ + ...(combined[i - 1] || {}), + ...interventionPeriod + }) + return combined + }, [] as InterventionPeriod[]) + .filter((current, i, array) => { + // Remove a period if the next one shares a start date + // This happens when multiple interventions are announced on + // the same day. + const next = array[i + 1] + return !next || next.startDate !== current.startDate + }) + + .filter((current, i, array) => { + // Only show the current period if it is different from previous one + // This happens when interventions change, but not in a way that is + // relevant to our heuristics. + const previous = array[i - 1] + return ( + !previous || + previous.socialDistancing !== current.socialDistancing || + previous.schoolClosure !== current.schoolClosure + ) + }) + + // Apply default reduction in contact. + interventionPeriods = interventionPeriods.map(period => { + const reductionPopulationContact = getDefaultContactReduction(period) + + if (reductionPopulationContact != null) { + return {...period, reductionPopulationContact} + } else { + return period + } + }) + + return interventionPeriods +} + +export function validateSchema( + config: NewSimulationConfig +): Joi.ValidationError | undefined { + const {error} = newSimulationSchema.validate(config, { + abortEarly: false, + // eslint-disable-next-line + // @ts-ignore + errors: {wrap: {label: ''}}, // (Joi TS types are wrong) + messages: { + 'interventions.strategyRequired': + 'Interventions must contain at least one active strategy across all periods', + 'interventions.chronology': + "Start date must be after the previous period's start date", + 'reductionPopulationContact.bounds': + 'Estimated population contact reduction must be between 0% and 100%' + } + }) + + return error +} + +/** + * Finds the start date of the next intervention period to add. + * + * The heuristic is that we choose the current date if the last intervention + * period is before the current date. Otherwise, we use the day after the + * last intervention date. + * + * @param interventionPeriods Current list of interventions + */ +export function getNextInterventionPeriodStart( + interventionPeriods: InterventionPeriod[] +): ISODate { + const today = toYYYYMMDD() + if (!interventionPeriods.length) { + return today + } + const dayAfterLastStartDate = addDays( + interventionPeriods[interventionPeriods.length - 1].startDate, + 1 + ) + return maxDate(today, dayAfterLastStartDate) +} + +/** + * Finds a heuristically reasonable end to all interventions. The heuristic is to + * take 90 days after the start date of the last intervention or today (whichever is greater). + * + * @param interventionPeriods Current list of interventions + */ +export function getInterventionsEnd( + interventionPeriods: InterventionPeriod[] +): ISODate { + const threeMonthsLater = addDays(toYYYYMMDD(), 90) + if (!interventionPeriods.length) { + return threeMonthsLater + } + const threeMonthsAfterLastStartDate = addDays( + interventionPeriods[interventionPeriods.length - 1].startDate, + 90 + ) + return maxDate(threeMonthsLater, threeMonthsAfterLastStartDate) +} diff --git a/lib/redirect.ts b/lib/redirect.ts new file mode 100644 index 0000000..dd23193 --- /dev/null +++ b/lib/redirect.ts @@ -0,0 +1,18 @@ +import {ServerResponse} from 'http' + +/** + * Redirect the response to another location. + * + * @param res The response to redirect + * @param location The path to redirect to + * @param statusCode The HTTP status code + */ +export default function redirect( + res: ServerResponse, + location: string, + statusCode: number = 302 +) { + res.setHeader('location', location) + res.statusCode = statusCode + res.end('found') +} diff --git a/lib/regionEmoji.ts b/lib/regionEmoji.ts new file mode 100644 index 0000000..495554c --- /dev/null +++ b/lib/regionEmoji.ts @@ -0,0 +1,9 @@ +import emojiFlags from 'emoji-flags' + +export default function flagAndName( + regionID: string, + regionName: string +): string { + const country = emojiFlags.countryCode(regionID) + return country ? `${country.emoji} ${regionName}` : regionName +} diff --git a/lib/sentry.ts b/lib/sentry.ts new file mode 100644 index 0000000..14221b0 --- /dev/null +++ b/lib/sentry.ts @@ -0,0 +1,97 @@ +import * as Sentry from '@sentry/node' +import {NextPageContext} from 'next' + +export const initSentry = (release = process.env.SENTRY_RELEASE) => { + const sentryOptions: Sentry.NodeOptions = { + dsn: process.env.SENTRY_DSN, + environment: process.env.APP_ENVIRONMENT, + release, + maxBreadcrumbs: 50, + attachStacktrace: true + } + + if (process.env.NODE_ENV !== 'production') { + sentryOptions.beforeSend = () => null + } + + Sentry.init(sentryOptions) + + return { + Sentry, + + captureMessage: ( + message: string, + level?: Sentry.Severity, + extra?: Record + ) => { + Sentry.configureScope(scope => { + if (process.browser) { + scope.setTag('ssr', 'false') + } else { + scope.setTag('ssr', 'true') + } + + if (extra) for (const k in extra) scope.setExtra(k, extra[k]) + }) + + return Sentry.captureMessage(message, level) + }, + + captureException: (err: Error, errorInfo?: Record) => { + console.error(err) + + Sentry.configureScope(scope => { + if (process.browser) { + scope.setTag('ssr', 'false') + } else { + scope.setTag('ssr', 'true') + } + + if (errorInfo) { + for (const key in errorInfo) { + scope.setExtra(key, errorInfo[key]) + } + } + }) + + return Sentry.captureException(err) + }, + + captureContextException: ( + err: NonNullable, + ctx: NextPageContext + ) => { + console.error(err) + + Sentry.configureScope(scope => { + if (err.message) { + scope.setFingerprint([err.message]) + } + + if (err.statusCode) { + scope.setExtra('statusCode', err.statusCode) + } + + if (ctx) { + const {req, res, query, pathname} = ctx + + if (res?.statusCode) { + scope.setExtra('statusCode', res.statusCode) + } + + if (process.browser) { + scope.setTag('ssr', 'false') + scope.setExtra('query', query) + scope.setExtra('pathname', pathname) + } else { + scope.setTag('ssr', 'true') + scope.setExtra('url', req?.url) + scope.setExtra('method', req?.method) + } + } + }) + + return Sentry.captureException(err) + } + } +} diff --git a/lib/session.ts b/lib/session.ts new file mode 100644 index 0000000..eba7765 --- /dev/null +++ b/lib/session.ts @@ -0,0 +1,125 @@ +import Cookies from 'cookies' +import {IncomingMessage, ServerResponse} from 'http' +import {GetServerSideProps} from 'next' +import {assertEnv} from './assertions' +import redirect from './redirect' + +const isProd = process.env.NODE_ENV === 'production' + +const SET_OPTS: Cookies.SetOption = { + maxAge: 60 * 60 * 24 * 7 * 1000, // 1 week + path: '/', + httpOnly: true, + sameSite: 'lax', + secure: isProd, + signed: isProd +} + +const GET_OPTS: Cookies.GetOption = { + signed: isProd +} + +const SESSION_SECRET = assertEnv('SESSION_SECRET') + +export type Session = {user: {id: string; login: string}} + +/** + * Get the session cookie value from the given request. + * + * @param req The session request + */ +export function getSessionCookie( + req: IncomingMessage, + res: ServerResponse +): Session | null { + const sessionValue = getCookieJar(req, res).get('session', GET_OPTS) + + if (!sessionValue) { + return null + } + + try { + const session = JSON.parse(sessionValue) + return session + } catch (err) { + console.error('Error parsing session cookie') + return null + } +} + +/** + * Set a session on the given response. + * + * @param res The response to set the cookie on + * @param value The value of the session + */ +export function setSessionCookie( + req: IncomingMessage, + res: ServerResponse, + value: Session +) { + getCookieJar(req, res).set('session', JSON.stringify(value), SET_OPTS) +} + +/** + * Clear the session from the response. + * + * @param res The response to clear the session from + */ +export function clearSessionCookie(req: IncomingMessage, res: ServerResponse) { + getCookieJar(req, res).set('session', '', {...SET_OPTS, maxAge: 1}) +} + +function getCookieJar(req: IncomingMessage, res: ServerResponse): Cookies { + return new Cookies(req, res, { + secure: isProd, + keys: [SESSION_SECRET] + }) +} + +/** + * Ensure a session is present before calling the given callback. + */ +export function ensureSession

    ( + cb?: ( + ctx: Parameters>[0], + session: Session + ) => ReturnType> +): GetServerSideProps

    { + return async ctx => { + const session = getSessionCookie(ctx.req, ctx.res) + + if (!session) { + redirect(ctx.res, '/') + return {props: {} as any} + } + + if (cb) { + return cb(ctx, session) + } else { + return {props: {}} + } + } +} + +/** + * Ensure a session is not present before calling the given callback. + */ +export function refuteSession

    ( + cb?: GetServerSideProps

    +): GetServerSideProps

    { + return async ctx => { + const session = getSessionCookie(ctx.req, ctx.res) + + if (session) { + redirect(ctx.res, '/simulations') + return {props: {} as any} + } + + if (cb) { + return cb(ctx) + } else { + return {props: {}} + } + } +} diff --git a/lib/simulation-schema.ts b/lib/simulation-schema.ts new file mode 100644 index 0000000..dda0d4f --- /dev/null +++ b/lib/simulation-schema.ts @@ -0,0 +1,105 @@ +import Joi from '@hapi/joi' +import {Intensity, InterventionPeriod, ISODate} from '../types/model-runner' +import {isGreater} from './dateFunctions' + +export const interventionStrategySchema = Joi.object({ + startDate: Joi.string() + .label('Start date') + .required() + .isoDate() + .custom(validatePeriodsChronology), + reductionPopulationContact: Joi.number() + .label('Estimated population contact reduction') + .required() + .integer() + .custom(validateReductionPerc), + socialDistancing: Joi.string() + .label('Social distancing') + .valid(...Object.values(Intensity)), + schoolClosure: Joi.string() + .label('School closure') + .valid(Intensity.Aggressive), + caseIsolation: Joi.string() + .label('Case isolation') + .valid(Intensity.Aggressive), + voluntaryHomeQuarantine: Joi.string() + .label('Voluntary home quarantine') + .valid(Intensity.Aggressive) +}) + +export const newSimulationSchema = Joi.object({ + regionID: Joi.string() + .label('Region') + .required() + .min(2) + .max(64), + subregionID: Joi.string() + .label('Subregion') + .min(2) + .max(64), + label: Joi.string() + .label('Name') + .max(64) + .allow(''), + interventionPeriods: Joi.array() + .label('Intervention periods') + .required() + .max(32) + .items(interventionStrategySchema) + .custom(validateMinimumOneInterventionStrategy), + r0: Joi.number() + .label('Estimated r0') + .greater(0) +}) + +function validateReductionPerc( + perc: number, + helpers: Joi.CustomHelpers +) { + if (perc < 0 || perc > 100) { + return helpers.error('reductionPopulationContact.bounds') + } + + return perc +} + +function validatePeriodsChronology( + startDate: ISODate, + helpers: Joi.CustomHelpers +) { + // This is a little bit of a cheat because Joi doesn't tell us what index + // we're at in the list. + const path = helpers.state?.path ?? [] + const list = helpers.state.ancestors[1] + const selfIndex = (path[1] as unknown) as number + + if (selfIndex > 0 && !isGreater(startDate, list[selfIndex - 1].startDate)) { + return helpers.error('interventions.chronology') + } + + return startDate +} + +function validateMinimumOneInterventionStrategy( + interventionPeriods: InterventionPeriod[], + helpers: Joi.CustomHelpers +) { + let hasAtLeastOneStrategy = false + + for (const period of interventionPeriods) { + let hasStrategy = false + if (period.socialDistancing != null) hasStrategy = true + if (period.schoolClosure != null) hasStrategy = true + if (period.caseIsolation != null) hasStrategy = true + if (period.voluntaryHomeQuarantine != null) hasStrategy = true + + if (hasStrategy) { + hasAtLeastOneStrategy = true + break + } + } + + if (!hasAtLeastOneStrategy) { + return helpers.error('interventions.strategyRequired') + } +} diff --git a/lib/simulation-types.ts b/lib/simulation-types.ts new file mode 100644 index 0000000..7056c0e --- /dev/null +++ b/lib/simulation-types.ts @@ -0,0 +1,69 @@ +export enum Virus { + Covid19 = 'covid19' +} + +export enum SimulationStatus { + Complete = 'complete', + InProgress = 'in-progress', + Failed = 'failed', + Pending = 'pending' +} + +export interface ErrorSimulationData { + error: string + status: SimulationStatus.Failed +} + +export function virusName(virus: Virus): string { + switch (virus) { + case Virus.Covid19: + return 'COVID-19' + } +} + +type ISODate = string + +export const ParameterAbbreviations: Record = { + caseIsolation: 'CI', + schoolClosure: 'SC', + socialDistancing: 'SD', + voluntaryHomeQuarantine: 'VHQ' +} + +export const InterventionNames = { + schoolClosure: 'School Closures', + socialDistancing: 'Social Distancing (Everyone)', + caseIsolation: 'Case Isolation', + voluntaryHomeQuarantine: 'Voluntary Home Quarantine' +} + +export type InterventionName = keyof typeof InterventionNames + +/** + * This is one intervention entry for one state in our interventions data + */ +export interface InterventionData { + dateIssued: ISODate + dateEnacted: ISODate + dateExpiry: ISODate + dateEnded: ISODate + notes: string + source: string +} + +/** + * This is intervention data for an entire state + */ +export interface Interventions { + // The two interventions that we use right now are SchoolClose and StayAtHome + SchoolClose?: InterventionData + StayAtHome?: InterventionData + [key: string]: InterventionData | undefined +} + +/** + * This is all of our interventions data + */ +export interface InterventionMap { + US: Record +} diff --git a/migrations/.gitkeep b/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/migrations/20200331170118-create-simulations-runs-table.js b/migrations/20200331170118-create-simulations-runs-table.js new file mode 100644 index 0000000..3daae18 --- /dev/null +++ b/migrations/20200331170118-create-simulations-runs-table.js @@ -0,0 +1,59 @@ +'use strict' + +var dbm +var type +var seed +var fs = require('fs') +var path = require('path') +var Promise + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate + type = dbm.dataType + seed = seedLink + Promise = options.Promise +} + +exports.up = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200331170118-create-simulations-runs-table-up.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports.down = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200331170118-create-simulations-runs-table-down.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports._meta = { + version: 1 +} diff --git a/migrations/20200331210801-create-locations-table.js b/migrations/20200331210801-create-locations-table.js new file mode 100644 index 0000000..e6cced0 --- /dev/null +++ b/migrations/20200331210801-create-locations-table.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200331210801-create-locations-table-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200331210801-create-locations-table-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/migrations/20200331233621-add-github-user-login-to-simulation-runs.js b/migrations/20200331233621-add-github-user-login-to-simulation-runs.js new file mode 100644 index 0000000..f59b285 --- /dev/null +++ b/migrations/20200331233621-add-github-user-login-to-simulation-runs.js @@ -0,0 +1,59 @@ +'use strict' + +var dbm +var type +var seed +var fs = require('fs') +var path = require('path') +var Promise + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate + type = dbm.dataType + seed = seedLink + Promise = options.Promise +} + +exports.up = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200331233621-add-github-user-login-to-simulation-runs-up.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports.down = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200331233621-add-github-user-login-to-simulation-runs-down.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports._meta = { + version: 1 +} diff --git a/migrations/20200402165609-drop-location-id-from-simulation-runs.js b/migrations/20200402165609-drop-location-id-from-simulation-runs.js new file mode 100644 index 0000000..a5ba610 --- /dev/null +++ b/migrations/20200402165609-drop-location-id-from-simulation-runs.js @@ -0,0 +1,59 @@ +'use strict' + +var dbm +var type +var seed +var fs = require('fs') +var path = require('path') +var Promise + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate + type = dbm.dataType + seed = seedLink + Promise = options.Promise +} + +exports.up = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200402165609-drop-location-id-from-simulation-runs-up.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports.down = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200402165609-drop-location-id-from-simulation-runs-down.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports._meta = { + version: 1 +} diff --git a/migrations/20200402165728-create-regions-table.js b/migrations/20200402165728-create-regions-table.js new file mode 100644 index 0000000..2128eb6 --- /dev/null +++ b/migrations/20200402165728-create-regions-table.js @@ -0,0 +1,59 @@ +'use strict' + +var dbm +var type +var seed +var fs = require('fs') +var path = require('path') +var Promise + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate + type = dbm.dataType + seed = seedLink + Promise = options.Promise +} + +exports.up = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200402165728-create-regions-table-up.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports.down = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200402165728-create-regions-table-down.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports._meta = { + version: 1 +} diff --git a/migrations/20200402165838-add-iso-region-columns-to-simulation-runs.js b/migrations/20200402165838-add-iso-region-columns-to-simulation-runs.js new file mode 100644 index 0000000..4705bc2 --- /dev/null +++ b/migrations/20200402165838-add-iso-region-columns-to-simulation-runs.js @@ -0,0 +1,59 @@ +'use strict' + +var dbm +var type +var seed +var fs = require('fs') +var path = require('path') +var Promise + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate + type = dbm.dataType + seed = seedLink + Promise = options.Promise +} + +exports.up = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200402165838-add-iso-region-columns-to-simulation-runs-up.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports.down = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200402165838-add-iso-region-columns-to-simulation-runs-down.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports._meta = { + version: 1 +} diff --git a/migrations/20200402172411-drop-locations-table.js b/migrations/20200402172411-drop-locations-table.js new file mode 100644 index 0000000..a7917c1 --- /dev/null +++ b/migrations/20200402172411-drop-locations-table.js @@ -0,0 +1,59 @@ +'use strict' + +var dbm +var type +var seed +var fs = require('fs') +var path = require('path') +var Promise + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate + type = dbm.dataType + seed = seedLink + Promise = options.Promise +} + +exports.up = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200402172411-drop-locations-table-up.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports.down = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200402172411-drop-locations-table-down.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports._meta = { + version: 1 +} diff --git a/migrations/20200402181839-insert-default-region.js b/migrations/20200402181839-insert-default-region.js new file mode 100644 index 0000000..0b43248 --- /dev/null +++ b/migrations/20200402181839-insert-default-region.js @@ -0,0 +1,59 @@ +'use strict' + +var dbm +var type +var seed +var fs = require('fs') +var path = require('path') +var Promise + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate + type = dbm.dataType + seed = seedLink + Promise = options.Promise +} + +exports.up = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200402181839-insert-default-region-up.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports.down = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200402181839-insert-default-region-down.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports._meta = { + version: 1 +} diff --git a/migrations/20200404153055-add-workflow-run-id-to-simulation-runs.js b/migrations/20200404153055-add-workflow-run-id-to-simulation-runs.js new file mode 100644 index 0000000..18a28e6 --- /dev/null +++ b/migrations/20200404153055-add-workflow-run-id-to-simulation-runs.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200404153055-add-workflow-run-id-to-simulation-runs-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200404153055-add-workflow-run-id-to-simulation-runs-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/migrations/20200406164833-add-github-user-id-index-to-simulation-runs.js b/migrations/20200406164833-add-github-user-id-index-to-simulation-runs.js new file mode 100644 index 0000000..7d5d369 --- /dev/null +++ b/migrations/20200406164833-add-github-user-id-index-to-simulation-runs.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200406164833-add-github-user-id-index-to-simulation-runs-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200406164833-add-github-user-id-index-to-simulation-runs-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/migrations/20200406180709-rename-uk-to-gb.js b/migrations/20200406180709-rename-uk-to-gb.js new file mode 100644 index 0000000..f5c4571 --- /dev/null +++ b/migrations/20200406180709-rename-uk-to-gb.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200406180709-rename-uk-to-gb-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200406180709-rename-uk-to-gb-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/migrations/20200406183238-create-authorized-users.js b/migrations/20200406183238-create-authorized-users.js new file mode 100644 index 0000000..a01e607 --- /dev/null +++ b/migrations/20200406183238-create-authorized-users.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200406183238-create-authorized-users-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200406183238-create-authorized-users-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/migrations/20200406191215-insert-us-subregions.js b/migrations/20200406191215-insert-us-subregions.js new file mode 100644 index 0000000..0a3f679 --- /dev/null +++ b/migrations/20200406191215-insert-us-subregions.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200406191215-insert-us-subregions-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200406191215-insert-us-subregions-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/migrations/20200406222239-insert-ak-hi.js b/migrations/20200406222239-insert-ak-hi.js new file mode 100644 index 0000000..f845265 --- /dev/null +++ b/migrations/20200406222239-insert-ak-hi.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200406222239-insert-ak-hi-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200406222239-insert-ak-hi-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/migrations/20200407175551-create-case-data-table.js b/migrations/20200407175551-create-case-data-table.js new file mode 100644 index 0000000..dca3437 --- /dev/null +++ b/migrations/20200407175551-create-case-data-table.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200407175551-create-case-data-table-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200407175551-create-case-data-table-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/migrations/20200415141342-add-model-runs-to-simulation-runs.js b/migrations/20200415141342-add-model-runs-to-simulation-runs.js new file mode 100644 index 0000000..76fd197 --- /dev/null +++ b/migrations/20200415141342-add-model-runs-to-simulation-runs.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200415141342-add-model-runs-to-simulation-runs-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200415141342-add-model-runs-to-simulation-runs-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/migrations/20200416174456-add-admin-to-authorized-users.js b/migrations/20200416174456-add-admin-to-authorized-users.js new file mode 100644 index 0000000..cbfa525 --- /dev/null +++ b/migrations/20200416174456-add-admin-to-authorized-users.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200416174456-add-admin-to-authorized-users-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200416174456-add-admin-to-authorized-users-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/migrations/20200421201526-add-config-to-authorized-users.js b/migrations/20200421201526-add-config-to-authorized-users.js new file mode 100644 index 0000000..d9f6dfb --- /dev/null +++ b/migrations/20200421201526-add-config-to-authorized-users.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200421201526-add-config-to-authorized-users-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200421201526-add-config-to-authorized-users-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/migrations/20200422153859-add-label-to-simulation-runs.js b/migrations/20200422153859-add-label-to-simulation-runs.js new file mode 100644 index 0000000..ec45305 --- /dev/null +++ b/migrations/20200422153859-add-label-to-simulation-runs.js @@ -0,0 +1,59 @@ +'use strict' + +var dbm +var type +var seed +var fs = require('fs') +var path = require('path') +var Promise + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate + type = dbm.dataType + seed = seedLink + Promise = options.Promise +} + +exports.up = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200422153859-add-label-to-simulation-runs-up.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports.down = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200422153859-add-label-to-simulation-runs-down.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports._meta = { + version: 1 +} diff --git a/migrations/20200427195151-create-intervention-data-table.js b/migrations/20200427195151-create-intervention-data-table.js new file mode 100644 index 0000000..decd757 --- /dev/null +++ b/migrations/20200427195151-create-intervention-data-table.js @@ -0,0 +1,56 @@ +'use strict' + +const path = require('path') +const fs = require('fs') + +var dbm +var type +var seed + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate + type = dbm.dataType + seed = seedLink +} + +exports.up = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200427195151-create-intervention-data-table-up.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports.down = function(db) { + var filePath = path.join( + __dirname, + 'sqls', + '20200427195151-create-intervention-data-table-down.sql' + ) + return new Promise(function(resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err, data) { + if (err) return reject(err) + console.log('received data: ' + data) + resolve(data) + }) + }).then(function(data) { + return db.runSql(data) + }) +} + +exports._meta = { + version: 1 +} diff --git a/migrations/20200430164001-add-new-europe-regions.js b/migrations/20200430164001-add-new-europe-regions.js new file mode 100644 index 0000000..47b36bd --- /dev/null +++ b/migrations/20200430164001-add-new-europe-regions.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200430164001-add-new-europe-regions-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20200430164001-add-new-europe-regions-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/migrations/sqls/20200331170118-create-simulations-runs-table-down.sql b/migrations/sqls/20200331170118-create-simulations-runs-table-down.sql new file mode 100644 index 0000000..e416643 --- /dev/null +++ b/migrations/sqls/20200331170118-create-simulations-runs-table-down.sql @@ -0,0 +1 @@ +DROP TABLE simulation_runs; diff --git a/migrations/sqls/20200331170118-create-simulations-runs-table-up.sql b/migrations/sqls/20200331170118-create-simulations-runs-table-up.sql new file mode 100644 index 0000000..ada4fd7 --- /dev/null +++ b/migrations/sqls/20200331170118-create-simulations-runs-table-up.sql @@ -0,0 +1,22 @@ +CREATE TABLE simulation_runs( + id INT AUTO_INCREMENT PRIMARY KEY, + + # The location ID of the run + location_id INT NOT NULL, + + # The current run status + status VARCHAR(64) NOT NULL, + + # The ID of the user that prompted the run + github_user_id INT NOT NULL, + + # The configuration of the run + configuration JSON NOT NULL, + + # A URL pointing to the results in blob storage + results_data TEXT, + + # Inserted/updated metadata + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL +); diff --git a/migrations/sqls/20200331210801-create-locations-table-down.sql b/migrations/sqls/20200331210801-create-locations-table-down.sql new file mode 100644 index 0000000..e127c0d --- /dev/null +++ b/migrations/sqls/20200331210801-create-locations-table-down.sql @@ -0,0 +1 @@ +DROP TABLE locations; diff --git a/migrations/sqls/20200331210801-create-locations-table-up.sql b/migrations/sqls/20200331210801-create-locations-table-up.sql new file mode 100644 index 0000000..3cfead5 --- /dev/null +++ b/migrations/sqls/20200331210801-create-locations-table-up.sql @@ -0,0 +1,12 @@ +CREATE TABLE locations( + id INT AUTO_INCREMENT PRIMARY KEY, + location_id INT NOT NULL, + location_name TEXT NOT NULL, + level INT NOT NULL, + parent_id INT NOT NULL, + path_to_top_parent TEXT NOT NULL, + location_ascii_name TEXT NOT NULL, + location_name_short TEXT NOT NULL, + location_type_id INT NOT NULL, + location_type VARCHAR(32) NOT NULL +); diff --git a/migrations/sqls/20200331233621-add-github-user-login-to-simulation-runs-down.sql b/migrations/sqls/20200331233621-add-github-user-login-to-simulation-runs-down.sql new file mode 100644 index 0000000..386dcd6 --- /dev/null +++ b/migrations/sqls/20200331233621-add-github-user-login-to-simulation-runs-down.sql @@ -0,0 +1 @@ +ALTER TABLE simulation_runs DROP COLUMN github_user_login diff --git a/migrations/sqls/20200331233621-add-github-user-login-to-simulation-runs-up.sql b/migrations/sqls/20200331233621-add-github-user-login-to-simulation-runs-up.sql new file mode 100644 index 0000000..2f42d00 --- /dev/null +++ b/migrations/sqls/20200331233621-add-github-user-login-to-simulation-runs-up.sql @@ -0,0 +1 @@ +ALTER TABLE simulation_runs ADD COLUMN github_user_login VARCHAR(40) diff --git a/migrations/sqls/20200402165609-drop-location-id-from-simulation-runs-down.sql b/migrations/sqls/20200402165609-drop-location-id-from-simulation-runs-down.sql new file mode 100644 index 0000000..649e715 --- /dev/null +++ b/migrations/sqls/20200402165609-drop-location-id-from-simulation-runs-down.sql @@ -0,0 +1 @@ +ALTER TABLE simulation_runs ADD COLUMN location_id INT NOT NULL diff --git a/migrations/sqls/20200402165609-drop-location-id-from-simulation-runs-up.sql b/migrations/sqls/20200402165609-drop-location-id-from-simulation-runs-up.sql new file mode 100644 index 0000000..f74cb43 --- /dev/null +++ b/migrations/sqls/20200402165609-drop-location-id-from-simulation-runs-up.sql @@ -0,0 +1 @@ +ALTER TABLE simulation_runs DROP COLUMN location_id; diff --git a/migrations/sqls/20200402165728-create-regions-table-down.sql b/migrations/sqls/20200402165728-create-regions-table-down.sql new file mode 100644 index 0000000..31c106f --- /dev/null +++ b/migrations/sqls/20200402165728-create-regions-table-down.sql @@ -0,0 +1 @@ +DROP TABLE regions; diff --git a/migrations/sqls/20200402165728-create-regions-table-up.sql b/migrations/sqls/20200402165728-create-regions-table-up.sql new file mode 100644 index 0000000..41a7bc1 --- /dev/null +++ b/migrations/sqls/20200402165728-create-regions-table-up.sql @@ -0,0 +1,9 @@ +CREATE TABLE regions( + id VARCHAR(32) PRIMARY KEY, + name TEXT NOT NULL, + parent_id VARCHAR(32), + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL, + + FOREIGN KEY (parent_id) REFERENCES regions(id) ON DELETE CASCADE +) diff --git a/migrations/sqls/20200402165838-add-iso-region-columns-to-simulation-runs-down.sql b/migrations/sqls/20200402165838-add-iso-region-columns-to-simulation-runs-down.sql new file mode 100644 index 0000000..52cbc5f --- /dev/null +++ b/migrations/sqls/20200402165838-add-iso-region-columns-to-simulation-runs-down.sql @@ -0,0 +1,5 @@ +ALTER TABLE simulation_runs + DROP FOREIGN KEY simulation_runs_ibfk_1, + DROP FOREIGN KEY simulation_runs_ibfk_2, + DROP COLUMN region_id, + DROP COLUMN subregion_id; diff --git a/migrations/sqls/20200402165838-add-iso-region-columns-to-simulation-runs-up.sql b/migrations/sqls/20200402165838-add-iso-region-columns-to-simulation-runs-up.sql new file mode 100644 index 0000000..82619c3 --- /dev/null +++ b/migrations/sqls/20200402165838-add-iso-region-columns-to-simulation-runs-up.sql @@ -0,0 +1,7 @@ +ALTER TABLE simulation_runs + ADD region_id VARCHAR(32), + ADD subregion_id VARCHAR(32), + ADD FOREIGN KEY (region_id) REFERENCES regions(id) ON DELETE RESTRICT, + ADD FOREIGN KEY (subregion_id) REFERENCES regions(id) ON DELETE RESTRICT, + ADD INDEX (region_id), + ADD INDEX (subregion_id); diff --git a/migrations/sqls/20200402172411-drop-locations-table-down.sql b/migrations/sqls/20200402172411-drop-locations-table-down.sql new file mode 100644 index 0000000..3cfead5 --- /dev/null +++ b/migrations/sqls/20200402172411-drop-locations-table-down.sql @@ -0,0 +1,12 @@ +CREATE TABLE locations( + id INT AUTO_INCREMENT PRIMARY KEY, + location_id INT NOT NULL, + location_name TEXT NOT NULL, + level INT NOT NULL, + parent_id INT NOT NULL, + path_to_top_parent TEXT NOT NULL, + location_ascii_name TEXT NOT NULL, + location_name_short TEXT NOT NULL, + location_type_id INT NOT NULL, + location_type VARCHAR(32) NOT NULL +); diff --git a/migrations/sqls/20200402172411-drop-locations-table-up.sql b/migrations/sqls/20200402172411-drop-locations-table-up.sql new file mode 100644 index 0000000..e127c0d --- /dev/null +++ b/migrations/sqls/20200402172411-drop-locations-table-up.sql @@ -0,0 +1 @@ +DROP TABLE locations; diff --git a/migrations/sqls/20200402181839-insert-default-region-down.sql b/migrations/sqls/20200402181839-insert-default-region-down.sql new file mode 100644 index 0000000..36a0aca --- /dev/null +++ b/migrations/sqls/20200402181839-insert-default-region-down.sql @@ -0,0 +1 @@ +DELETE FROM regions WHERE id = 'GB'; diff --git a/migrations/sqls/20200402181839-insert-default-region-up.sql b/migrations/sqls/20200402181839-insert-default-region-up.sql new file mode 100644 index 0000000..1cce71a --- /dev/null +++ b/migrations/sqls/20200402181839-insert-default-region-up.sql @@ -0,0 +1 @@ +INSERT INTO regions (id, name, created_at, updated_at) VALUES ('GB', 'United Kingdom', NOW(), NOW()); diff --git a/migrations/sqls/20200404153055-add-workflow-run-id-to-simulation-runs-down.sql b/migrations/sqls/20200404153055-add-workflow-run-id-to-simulation-runs-down.sql new file mode 100644 index 0000000..723217a --- /dev/null +++ b/migrations/sqls/20200404153055-add-workflow-run-id-to-simulation-runs-down.sql @@ -0,0 +1 @@ +ALTER TABLE simulation_runs DROP workflow_run_id; diff --git a/migrations/sqls/20200404153055-add-workflow-run-id-to-simulation-runs-up.sql b/migrations/sqls/20200404153055-add-workflow-run-id-to-simulation-runs-up.sql new file mode 100644 index 0000000..77d39c6 --- /dev/null +++ b/migrations/sqls/20200404153055-add-workflow-run-id-to-simulation-runs-up.sql @@ -0,0 +1 @@ +ALTER TABLE simulation_runs ADD workflow_run_id INT; diff --git a/migrations/sqls/20200406164833-add-github-user-id-index-to-simulation-runs-down.sql b/migrations/sqls/20200406164833-add-github-user-id-index-to-simulation-runs-down.sql new file mode 100644 index 0000000..4aff278 --- /dev/null +++ b/migrations/sqls/20200406164833-add-github-user-id-index-to-simulation-runs-down.sql @@ -0,0 +1 @@ +ALTER TABLE simulation_runs DROP INDEX github_user_id; diff --git a/migrations/sqls/20200406164833-add-github-user-id-index-to-simulation-runs-up.sql b/migrations/sqls/20200406164833-add-github-user-id-index-to-simulation-runs-up.sql new file mode 100644 index 0000000..7bc83c4 --- /dev/null +++ b/migrations/sqls/20200406164833-add-github-user-id-index-to-simulation-runs-up.sql @@ -0,0 +1 @@ +ALTER TABLE simulation_runs ADD INDEX (github_user_id); diff --git a/migrations/sqls/20200406180709-rename-uk-to-gb-down.sql b/migrations/sqls/20200406180709-rename-uk-to-gb-down.sql new file mode 100644 index 0000000..fc73ec6 --- /dev/null +++ b/migrations/sqls/20200406180709-rename-uk-to-gb-down.sql @@ -0,0 +1 @@ +UPDATE regions SET name = 'United Kingdom' WHERE id = 'GB'; diff --git a/migrations/sqls/20200406180709-rename-uk-to-gb-up.sql b/migrations/sqls/20200406180709-rename-uk-to-gb-up.sql new file mode 100644 index 0000000..cf8b63b --- /dev/null +++ b/migrations/sqls/20200406180709-rename-uk-to-gb-up.sql @@ -0,0 +1 @@ +UPDATE regions SET name = 'Great Britain' WHERE id = 'GB'; diff --git a/migrations/sqls/20200406183238-create-authorized-users-down.sql b/migrations/sqls/20200406183238-create-authorized-users-down.sql new file mode 100644 index 0000000..6f791e3 --- /dev/null +++ b/migrations/sqls/20200406183238-create-authorized-users-down.sql @@ -0,0 +1 @@ +DROP TABLE authorized_users; diff --git a/migrations/sqls/20200406183238-create-authorized-users-up.sql b/migrations/sqls/20200406183238-create-authorized-users-up.sql new file mode 100644 index 0000000..2878b8d --- /dev/null +++ b/migrations/sqls/20200406183238-create-authorized-users-up.sql @@ -0,0 +1,6 @@ +CREATE TABLE authorized_users( + id INT AUTO_INCREMENT PRIMARY KEY, + github_user_login VARCHAR(40) UNIQUE NOT NULL, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); diff --git a/migrations/sqls/20200406191215-insert-us-subregions-down.sql b/migrations/sqls/20200406191215-insert-us-subregions-down.sql new file mode 100644 index 0000000..e18fea3 --- /dev/null +++ b/migrations/sqls/20200406191215-insert-us-subregions-down.sql @@ -0,0 +1 @@ +DELETE FROM regions WHERE id = 'US' OR parent_id = 'US'; diff --git a/migrations/sqls/20200406191215-insert-us-subregions-up.sql b/migrations/sqls/20200406191215-insert-us-subregions-up.sql new file mode 100644 index 0000000..5866d61 --- /dev/null +++ b/migrations/sqls/20200406191215-insert-us-subregions-up.sql @@ -0,0 +1,51 @@ +INSERT INTO regions (id, parent_id, name, created_at, updated_at) VALUES + ('US', NULL, 'United States', NOW(), NOW()), + ('US-AL', 'US', 'Alabama', NOW(), NOW()), + ('US-AZ', 'US', 'Arizona', NOW(), NOW()), + ('US-AR', 'US', 'Arkansas', NOW(), NOW()), + ('US-CA', 'US', 'California', NOW(), NOW()), + ('US-CO', 'US', 'Colorado', NOW(), NOW()), + ('US-CT', 'US', 'Connecticut', NOW(), NOW()), + ('US-DE', 'US', 'Delaware', NOW(), NOW()), + ('US-FL', 'US', 'Florida', NOW(), NOW()), + ('US-GA', 'US', 'Georgia', NOW(), NOW()), + ('US-ID', 'US', 'Idaho', NOW(), NOW()), + ('US-IL', 'US', 'Illinois', NOW(), NOW()), + ('US-IN', 'US', 'Indiana', NOW(), NOW()), + ('US-IA', 'US', 'Iowa', NOW(), NOW()), + ('US-KS', 'US', 'Kansas', NOW(), NOW()), + ('US-KY', 'US', 'Kentucky', NOW(), NOW()), + ('US-LA', 'US', 'Louisiana', NOW(), NOW()), + ('US-ME', 'US', 'Maine', NOW(), NOW()), + ('US-MD', 'US', 'Maryland', NOW(), NOW()), + ('US-MA', 'US', 'Massachusetts', NOW(), NOW()), + ('US-MI', 'US', 'Michigan', NOW(), NOW()), + ('US-MN', 'US', 'Minnesota', NOW(), NOW()), + ('US-MS', 'US', 'Mississippi', NOW(), NOW()), + ('US-MO', 'US', 'Missouri', NOW(), NOW()), + ('US-MT', 'US', 'Montana', NOW(), NOW()), + ('US-NE', 'US', 'Nebraska', NOW(), NOW()), + ('US-NV', 'US', 'Nevada', NOW(), NOW()), + ('US-NH', 'US', 'New Hampshire', NOW(), NOW()), + ('US-NJ', 'US', 'New Jersey', NOW(), NOW()), + ('US-NM', 'US', 'New Mexico', NOW(), NOW()), + ('US-NY', 'US', 'New York', NOW(), NOW()), + ('US-NC', 'US', 'North Carolina', NOW(), NOW()), + ('US-ND', 'US', 'North Dakota', NOW(), NOW()), + ('US-OH', 'US', 'Ohio', NOW(), NOW()), + ('US-OK', 'US', 'Oklahoma', NOW(), NOW()), + ('US-OR', 'US', 'Oregon', NOW(), NOW()), + ('US-PA', 'US', 'Pennsylvania', NOW(), NOW()), + ('US-RI', 'US', 'Rhode Island', NOW(), NOW()), + ('US-SC', 'US', 'South Carolina', NOW(), NOW()), + ('US-SD', 'US', 'South Dakota', NOW(), NOW()), + ('US-TN', 'US', 'Tennessee', NOW(), NOW()), + ('US-TX', 'US', 'Texas', NOW(), NOW()), + ('US-UT', 'US', 'Utah', NOW(), NOW()), + ('US-VT', 'US', 'Vermont', NOW(), NOW()), + ('US-VA', 'US', 'Virginia', NOW(), NOW()), + ('US-WA', 'US', 'Washington', NOW(), NOW()), + ('US-WV', 'US', 'West Virginia', NOW(), NOW()), + ('US-WI', 'US', 'Wisconsin', NOW(), NOW()), + ('US-WY', 'US', 'Wyoming', NOW(), NOW()), + ('US-DC', 'US', 'District of Columbia', NOW(), NOW()); diff --git a/migrations/sqls/20200406222239-insert-ak-hi-down.sql b/migrations/sqls/20200406222239-insert-ak-hi-down.sql new file mode 100644 index 0000000..1713786 --- /dev/null +++ b/migrations/sqls/20200406222239-insert-ak-hi-down.sql @@ -0,0 +1 @@ +DELETE FROM regions WHERE id IN ('US-AK', 'US-HI'); diff --git a/migrations/sqls/20200406222239-insert-ak-hi-up.sql b/migrations/sqls/20200406222239-insert-ak-hi-up.sql new file mode 100644 index 0000000..7daf7b1 --- /dev/null +++ b/migrations/sqls/20200406222239-insert-ak-hi-up.sql @@ -0,0 +1,3 @@ +INSERT INTO regions (id, parent_id, name, created_at, updated_at) VALUES + ('US-AK', 'US', 'Alaska', NOW(), NOW()), + ('US-HI', 'US', 'Hawaii', NOW(), NOW()); diff --git a/migrations/sqls/20200407175551-create-case-data-table-down.sql b/migrations/sqls/20200407175551-create-case-data-table-down.sql new file mode 100644 index 0000000..05869a6 --- /dev/null +++ b/migrations/sqls/20200407175551-create-case-data-table-down.sql @@ -0,0 +1 @@ +DROP TABLE case_data diff --git a/migrations/sqls/20200407175551-create-case-data-table-up.sql b/migrations/sqls/20200407175551-create-case-data-table-up.sql new file mode 100644 index 0000000..7feaf5e --- /dev/null +++ b/migrations/sqls/20200407175551-create-case-data-table-up.sql @@ -0,0 +1,14 @@ +CREATE TABLE case_data( + id INT AUTO_INCREMENT PRIMARY KEY, + region_id VARCHAR(32) NOT NULL, + subregion_id VARCHAR(32), + date DATE NOT NULL, + confirmed INT NOT NULL, + recovered INT NOT NULL, + deaths INT NOT NULL, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + INDEX (region_id), + INDEX (subregion_id), + UNIQUE INDEX (region_id, subregion_id, date) +) diff --git a/migrations/sqls/20200415141342-add-model-runs-to-simulation-runs-down.sql b/migrations/sqls/20200415141342-add-model-runs-to-simulation-runs-down.sql new file mode 100644 index 0000000..f70f6ab --- /dev/null +++ b/migrations/sqls/20200415141342-add-model-runs-to-simulation-runs-down.sql @@ -0,0 +1,21 @@ +ALTER TABLE simulation_runs + ADD results_data TEXT, + ADD status VARCHAR(64); + +UPDATE simulation_runs + SET + results_data = IF( + JSON_TYPE(simulation_runs.model_runs->'$[0].results_data') = 'NULL', + NULL, + IF( + simulation_runs.model_runs->>'$[0].results_data' = '', + NULL, + simulation_runs.model_runs->>'$[0].results_data')), + status = simulation_runs.model_runs->>'$[0].status'; + +ALTER TABLE simulation_runs + CHANGE status status VARCHAR(64) NOT NULL; + +ALTER TABLE simulation_runs + DROP model_runs; + diff --git a/migrations/sqls/20200415141342-add-model-runs-to-simulation-runs-up.sql b/migrations/sqls/20200415141342-add-model-runs-to-simulation-runs-up.sql new file mode 100644 index 0000000..eb4e6cc --- /dev/null +++ b/migrations/sqls/20200415141342-add-model-runs-to-simulation-runs-up.sql @@ -0,0 +1,14 @@ +ALTER TABLE simulation_runs ADD model_runs JSON; + +UPDATE simulation_runs + SET model_runs = JSON_ARRAY(JSON_OBJECT( + 'model_slug', 'mrc-ide-covid-sim', + 'status', simulation_runs.status, + 'results_data', simulation_runs.results_data)); + +ALTER TABLE simulation_runs + DROP status, + DROP results_data; + +ALTER TABLE simulation_runs + CHANGE model_runs model_runs JSON NOT NULL; diff --git a/migrations/sqls/20200416174456-add-admin-to-authorized-users-down.sql b/migrations/sqls/20200416174456-add-admin-to-authorized-users-down.sql new file mode 100644 index 0000000..76b0966 --- /dev/null +++ b/migrations/sqls/20200416174456-add-admin-to-authorized-users-down.sql @@ -0,0 +1 @@ +ALTER TABLE authorized_users DROP admin; diff --git a/migrations/sqls/20200416174456-add-admin-to-authorized-users-up.sql b/migrations/sqls/20200416174456-add-admin-to-authorized-users-up.sql new file mode 100644 index 0000000..8fa8f19 --- /dev/null +++ b/migrations/sqls/20200416174456-add-admin-to-authorized-users-up.sql @@ -0,0 +1 @@ +ALTER TABLE authorized_users ADD admin BOOLEAN DEFAULT FALSE; diff --git a/migrations/sqls/20200421201526-add-config-to-authorized-users-down.sql b/migrations/sqls/20200421201526-add-config-to-authorized-users-down.sql new file mode 100644 index 0000000..9a90573 --- /dev/null +++ b/migrations/sqls/20200421201526-add-config-to-authorized-users-down.sql @@ -0,0 +1 @@ +ALTER TABLE authorized_users DROP config; diff --git a/migrations/sqls/20200421201526-add-config-to-authorized-users-up.sql b/migrations/sqls/20200421201526-add-config-to-authorized-users-up.sql new file mode 100644 index 0000000..5eb044c --- /dev/null +++ b/migrations/sqls/20200421201526-add-config-to-authorized-users-up.sql @@ -0,0 +1 @@ +ALTER TABLE authorized_users ADD config JSON NOT NULL DEFAULT (JSON_OBJECT()); diff --git a/migrations/sqls/20200422153859-add-label-to-simulation-runs-down.sql b/migrations/sqls/20200422153859-add-label-to-simulation-runs-down.sql new file mode 100644 index 0000000..951155e --- /dev/null +++ b/migrations/sqls/20200422153859-add-label-to-simulation-runs-down.sql @@ -0,0 +1 @@ +ALTER TABLE simulation_runs DROP label; diff --git a/migrations/sqls/20200422153859-add-label-to-simulation-runs-up.sql b/migrations/sqls/20200422153859-add-label-to-simulation-runs-up.sql new file mode 100644 index 0000000..40ea023 --- /dev/null +++ b/migrations/sqls/20200422153859-add-label-to-simulation-runs-up.sql @@ -0,0 +1 @@ +ALTER TABLE simulation_runs ADD label TEXT NOT NULL; diff --git a/migrations/sqls/20200427195151-create-intervention-data-table-down.sql b/migrations/sqls/20200427195151-create-intervention-data-table-down.sql new file mode 100644 index 0000000..5d576a1 --- /dev/null +++ b/migrations/sqls/20200427195151-create-intervention-data-table-down.sql @@ -0,0 +1 @@ +DROP TABLE intervention_data diff --git a/migrations/sqls/20200427195151-create-intervention-data-table-up.sql b/migrations/sqls/20200427195151-create-intervention-data-table-up.sql new file mode 100644 index 0000000..f70597d --- /dev/null +++ b/migrations/sqls/20200427195151-create-intervention-data-table-up.sql @@ -0,0 +1,17 @@ +CREATE TABLE intervention_data( + id INT AUTO_INCREMENT PRIMARY KEY, + region_id VARCHAR(32) NOT NULL, + subregion_id VARCHAR(32), + policy VARCHAR(255) NOT NULL, + notes TEXT, + source TEXT, + issue_date DATE, + start_date DATE NOT NULL, + ease_date DATE, + expiration_date DATE, + end_date DATE, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + INDEX (region_id), + INDEX (subregion_id) +) diff --git a/migrations/sqls/20200430164001-add-new-europe-regions-down.sql b/migrations/sqls/20200430164001-add-new-europe-regions-down.sql new file mode 100644 index 0000000..b5c0a3c --- /dev/null +++ b/migrations/sqls/20200430164001-add-new-europe-regions-down.sql @@ -0,0 +1,42 @@ +DELETE FROM regions WHERE id IN ( + 'AT', + 'AL', + 'BY', + 'BE', + 'BA', + 'BG', + 'CA', + 'HR', + 'CR', + 'DK', + 'EE', + 'FI', + 'FR', + 'DE', + 'GI', + 'GR', + 'HU', + 'IS', + 'IR', + 'IT', + 'LV', + 'LT', + 'LU', + 'MK', + 'MT', + 'MD', + 'ME', + 'NL', + 'NO', + 'PT', + 'PL', + 'RO', + 'RU', + 'RS', + 'SK', + 'SI', + 'ES', + 'SE', + 'CH', + 'UA' +); diff --git a/migrations/sqls/20200430164001-add-new-europe-regions-up.sql b/migrations/sqls/20200430164001-add-new-europe-regions-up.sql new file mode 100644 index 0000000..ae9b147 --- /dev/null +++ b/migrations/sqls/20200430164001-add-new-europe-regions-up.sql @@ -0,0 +1,41 @@ +INSERT INTO regions (id, parent_id, name, created_at, updated_at) VALUES + ('AT', NULL, 'Austria', NOW(), NOW()), + ('AL', NULL, 'Albania', NOW(), NOW()), + ('BY', NULL, 'Belarus', NOW(), NOW()), + ('BE', NULL, 'Belgium', NOW(), NOW()), + ('BA', NULL, 'Bosnia and Herzegovina', NOW(), NOW()), + ('BG', NULL, 'Bulgaria', NOW(), NOW()), + ('CA', NULL, 'Canada', NOW(), NOW()), + ('HR', NULL, 'Croatia', NOW(), NOW()), + ('CR', NULL, 'Czechia', NOW(), NOW()), + ('DK', NULL, 'Denmark', NOW(), NOW()), + ('EE', NULL, 'Estonia', NOW(), NOW()), + ('FI', NULL, 'Finland', NOW(), NOW()), + ('FR', NULL, 'France', NOW(), NOW()), + ('DE', NULL, 'Germany', NOW(), NOW()), + ('GI', NULL, 'Gibraltar', NOW(), NOW()), + ('GR', NULL, 'Greece', NOW(), NOW()), + ('HU', NULL, 'Hungary', NOW(), NOW()), + ('IS', NULL, 'Iceland', NOW(), NOW()), + ('IR', NULL, 'Ireland', NOW(), NOW()), + ('IT', NULL, 'Italy', NOW(), NOW()), + ('LV', NULL, 'Latvia', NOW(), NOW()), + ('LT', NULL, 'Lithuania', NOW(), NOW()), + ('LU', NULL, 'Luxembourg', NOW(), NOW()), + ('MK', NULL, 'Republic of North Macedonia', NOW(), NOW()), + ('MT', NULL, 'Malta', NOW(), NOW()), + ('MD', NULL, 'Moldova', NOW(), NOW()), + ('ME', NULL, 'Montenegro', NOW(), NOW()), + ('NL', NULL, 'Netherlands', NOW(), NOW()), + ('NO', NULL, 'Norway', NOW(), NOW()), + ('PT', NULL, 'Portugal', NOW(), NOW()), + ('PL', NULL, 'Poland', NOW(), NOW()), + ('RO', NULL, 'Romania', NOW(), NOW()), + ('RU', NULL, 'Russian Federation', NOW(), NOW()), + ('RS', NULL, 'Serbia', NOW(), NOW()), + ('SK', NULL, 'Slovakia', NOW(), NOW()), + ('SI', NULL, 'Slovenia', NOW(), NOW()), + ('ES', NULL, 'Spain', NOW(), NOW()), + ('SE', NULL, 'Sweden', NOW(), NOW()), + ('CH', NULL, 'Switzerland', NOW(), NOW()), + ('UA', NULL, 'Ukraine', NOW(), NOW()); diff --git a/models.yml b/models.yml new file mode 100644 index 0000000..ead91e4 --- /dev/null +++ b/models.yml @@ -0,0 +1,55 @@ +basel: + name: Covid19-Scenarios (Neher) + origin: Neher Lab, Biozentrum Basel + isProductionReady: true + imageURL: docker.pkg.github.com/covid-modeling/model-runner/neherlab-covid-19-scenarios-connector:0.9.1 + metaURLs: + code: https://github.com/neherlab/covid19_scenarios + website: https://covid19-scenarios.org/about + description: | + We implement an age-stratified SEIR model with additional categories + for individuals exposed to the virus that are not yet infectious, severely sick + people in need of hospitalization, people in critical condition, and a fatal category. + The model is currently under active development and the US state level parameters are under review. + supportedParameters: + - contactReduction + - r0 + +mrc-ide-covid-sim: + name: CovidSim (Imperial) + origin: Imperial College + isProductionReady: true + imageURL: docker.pkg.github.com/covid-modeling/model-runner/mrc-ide-covidsim-connector:0.9.2 + metaURLs: + code: https://github.com/mrc-ide/covid-sim + paper: https://www.imperial.ac.uk/media/imperial-college/medicine/sph/ide/gida-fellowships/Imperial-College-COVID19-NPI-modelling-16-03-2020.pdf + description: | + We consider the feasibility and implications of strategies for COVID-19, + looking at a range of NPI measures. It is important to note at the outset + that given SARS-CoV-2 is a newly emergent virus, much remains to be + understood about its transmission. In addition, the impact of many of the + NPIs detailed here depends critically on how people respond to their + introduction, which is highly likely to vary between countries and even + communities. + supportedParameters: + - interventionStrategies + - r0 + +mc19: + name: Modeling Covid-19 + origin: Modeling Covid-19 + imageURL: docker.pkg.github.com/covid-modeling/model-runner/modelingcovid-covidmodel-connector:0.3.0 + isProductionReady: false + metaURLs: + code: https://github.com/modelingcovid/covidmodel + paper: https://dash.harvard.edu/bitstream/handle/1/42638988/Social%20distancing%20strategies%20for%20curbing%20the%20Covid-19%20epidemic.pdf?sequence=1&isAllowed=y + website: https://covidmodel-flax.now.sh/about + description: | + We’ve implemented a model for the spread of the virus which is an enrichment + of the basic SEIR model with adjustments for distancing and adding PCR confirmation + and Fatality states. This allows us to fit the solutions of the system of SEIR equations + to actual data as reported by various states. We then use a combination of parameters + from the fits and literature values to generate Monte Carlo simulations around the + fit expectations to get a sense of our uncertainty in the projections. + supportedParameters: + - contactReduction diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..7b7aa2c --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000..5725c40 --- /dev/null +++ b/next.config.js @@ -0,0 +1,80 @@ +const {DefinePlugin} = require('webpack') + +// This garbage is just to fix intellisense for the import. +const sentryPluginImport = /** @type {any} */ (require('@sentry/webpack-plugin')) +/** @type {typeof import('@sentry/webpack-plugin').default} */ +const SentryWebpackPlugin = sentryPluginImport + +module.exports = { + env: { + GITHUB_CLIENT_ID: process.env.GITHUB_CLIENT_ID, + SENTRY_DSN: process.env.SENTRY_DSN, + APP_ENVIRONMENT: process.env.APP_ENVIRONMENT + }, + + webpack: (config, options) => { + const commit = process.env.NOW_GITHUB_COMMIT_SHA || process.env.GITHUB_SHA + const release = commit || options.buildId + + config.module.rules.push({ + test: /\.ya?ml$/, + use: 'js-yaml-loader' + }) + + config.plugins.push( + new DefinePlugin({ + 'process.env.SENTRY_RELEASE': `"${release}"` + }) + ) + + config = nextSourceMaps(config, options) + + const releaseInfo = { + release, + repo: 'covid-modeling/web', + commit + } + + console.log('Configuring Sentry release:', JSON.stringify(releaseInfo)) + + if (process.env.NODE_ENV === 'production') { + config.plugins.push( + new SentryWebpackPlugin({ + include: ['.', '.next'], + ignore: ['migrations', 'node_modules'], + ...releaseInfo + }) + ) + } + + if (!options.isServer) { + config.resolve.alias['@sentry/node'] = '@sentry/browser' + } + + return config + } +} + +function nextSourceMaps(config, options) { + if (!options.dev) { + config.devtool = 'source-map' + + for (const plugin of config.plugins) { + if (plugin.constructor.name === 'UglifyJsPlugin') { + plugin.options.sourceMap = true + break + } + } + + if (config.optimization && config.optimization.minimizer) { + for (const plugin of config.optimization.minimizer) { + if (plugin.constructor.name === 'TerserPlugin') { + plugin.options.sourceMap = true + break + } + } + } + } + + return config +} diff --git a/now.json b/now.json new file mode 100644 index 0000000..9c96808 --- /dev/null +++ b/now.json @@ -0,0 +1,38 @@ +{ + "regions": ["iad1"], + "alias": "staging.covid-modeling.org", + "build": { + "env": { + "BLOB_STORAGE_ACCOUNT": "@staging-blob-storage-account", + "BLOB_STORAGE_CONTAINER": "@staging-blob-storage-container", + "BLOB_STORAGE_KEY": "@staging-blob-storage-key", + "GITHUB_CLIENT_ID": "@staging-github-client-id", + "SENTRY_DSN": "@prod-sentry-dsn", + "SENTRY_AUTH_TOKEN": "@prod-sentry-token", + "SENTRY_ORG": "github-disease-modelling", + "SENTRY_PROJECT": "web-api-ui", + "APP_ENVIRONMENT": "staging", + "SESSION_SECRET": "@staging-session-secret" + } + }, + "env": { + "GITHUB_CLIENT_ID": "@staging-github-client-id", + "GITHUB_CLIENT_SECRET": "@staging-github-client-secret", + "GITHUB_API_TOKEN": "@prod-github-api-token", + "CONTROL_REPO_NWO": "covid-modeling/staging-covid19-control-plane", + "CONTROL_REPO_EVENT_TYPE": "run-simulation", + "DB_USERNAME": "@staging-mysql-username", + "DB_PASSWORD": "@staging-mysql-password", + "DB_HOST": "@staging-mysql-host", + "DB_DATABASE": "@staging-mysql-database", + "RUNNER_SHARED_SECRET": "@staging-runner-shared-secret", + "RUNNER_CALLBACK_URL": "https://staging.covid-modeling.org", + "BLOB_STORAGE_ACCOUNT": "@staging-blob-storage-account", + "BLOB_STORAGE_CONTAINER": "@staging-blob-storage-container", + "BLOB_STORAGE_KEY": "@staging-blob-storage-key", + "OAUTH_SECRET": "@staging-oauth-secret", + "SESSION_SECRET": "@staging-session-secret", + "SENTRY_DSN": "@prod-sentry-dsn", + "APP_ENVIRONMENT": "staging" + } +} diff --git a/now.prod.json b/now.prod.json new file mode 100644 index 0000000..64b6067 --- /dev/null +++ b/now.prod.json @@ -0,0 +1,38 @@ +{ + "regions": ["iad1"], + "alias": "covid-modeling.org", + "build": { + "env": { + "BLOB_STORAGE_ACCOUNT": "@prod-blob-storage-account", + "BLOB_STORAGE_CONTAINER": "@prod-blob-storage-container", + "BLOB_STORAGE_KEY": "@prod-blob-storage-key", + "GITHUB_CLIENT_ID": "@prod-github-client-id", + "SENTRY_DSN": "@prod-sentry-dsn", + "SENTRY_AUTH_TOKEN": "@prod-sentry-token", + "SENTRY_ORG": "github-disease-modelling", + "SENTRY_PROJECT": "web-api-ui", + "APP_ENVIRONMENT": "production", + "SESSION_SECRET": "@prod-session-secret" + } + }, + "env": { + "GITHUB_CLIENT_ID": "@prod-github-client-id", + "GITHUB_CLIENT_SECRET": "@prod-github-client-secret", + "GITHUB_API_TOKEN": "@prod-github-api-token", + "CONTROL_REPO_NWO": "covid-modeling/prod-covid19-control-plane", + "CONTROL_REPO_EVENT_TYPE": "run-simulation", + "DB_USERNAME": "@prod-mysql-username", + "DB_PASSWORD": "@prod-mysql-password", + "DB_HOST": "@prod-mysql-host", + "DB_DATABASE": "@prod-mysql-database", + "RUNNER_SHARED_SECRET": "@prod-runner-shared-secret", + "RUNNER_CALLBACK_URL": "https://covid-modeling.org", + "BLOB_STORAGE_ACCOUNT": "@prod-blob-storage-account", + "BLOB_STORAGE_CONTAINER": "@prod-blob-storage-container", + "BLOB_STORAGE_KEY": "@prod-blob-storage-key", + "OAUTH_SECRET": "@prod-oauth-secret", + "SESSION_SECRET": "@prod-session-secret", + "SENTRY_DSN": "@prod-sentry-dsn", + "APP_ENVIRONMENT": "production" + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..80f3de3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,16768 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@ampproject/toolbox-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-core/-/toolbox-core-2.0.0.tgz", + "integrity": "sha512-xAJOmh6MPS2mdHNsK8mj1t8TLh6mlehirh0fOBsRhKCNCJXgg4Gfd2u5igy8VFq9sYnuWP/npFyjGX36qpXW5Q==", + "requires": { + "cross-fetch": "3.0.4" + } + }, + "@ampproject/toolbox-optimizer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-optimizer/-/toolbox-optimizer-2.0.1.tgz", + "integrity": "sha512-zroXqrV7mY77+/6hV7kaaWxp4LA85V0B/2vg7WdF+FrwiO9Wior/lIW8UbpRek6INjw0VOp1ED73MmGJkwaDhA==", + "requires": { + "@ampproject/toolbox-core": "^2.0.0", + "@ampproject/toolbox-runtime-version": "^2.0.0", + "@ampproject/toolbox-script-csp": "^2.0.0", + "@ampproject/toolbox-validator-rules": "^2.0.0", + "css": "2.2.4", + "domhandler": "3.0.0", + "domutils": "2.0.0", + "htmlparser2": "4.1.0", + "normalize-html-whitespace": "1.0.0", + "terser": "4.6.7" + }, + "dependencies": { + "terser": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", + "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + } + } + }, + "@ampproject/toolbox-runtime-version": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-2.0.0.tgz", + "integrity": "sha512-7XDlo7l4Ozpc/XWmJeYNF0ZfXCy7Vdh07spN+xEOst8gF99yaavZRNVkdgyTxLR3BpY9RIqqhSs6OxfkOKlRZQ==", + "requires": { + "@ampproject/toolbox-core": "^2.0.0" + } + }, + "@ampproject/toolbox-script-csp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-script-csp/-/toolbox-script-csp-2.0.0.tgz", + "integrity": "sha512-9mW3yiKwjORi0ViuayphVZii9MwiPhneZGZWy+kN44xr3SpN7iQC52/WWWTBOZX9z1zaUh8DqGc//VFY5ILSAw==" + }, + "@ampproject/toolbox-validator-rules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-validator-rules/-/toolbox-validator-rules-2.0.0.tgz", + "integrity": "sha512-5f2IvT1m/zNtqfNXFE9V4ZtKofIttST65QL1wf4lKjBhJsbZgAAeR/u4DgOvftRVRmgn6IpUiWY1pt9xWaI5yA==", + "requires": { + "cross-fetch": "3.0.4" + } + }, + "@azure/abort-controller": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.1.tgz", + "integrity": "sha512-wP2Jw6uPp8DEDy0n4KNidvwzDjyVV2xnycEIq7nPzj1rHyb/r+t3OPeNT1INZePP2wy5ZqlwyuyOMTi0ePyY1A==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@azure/core-asynciterator-polyfill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.0.tgz", + "integrity": "sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg==" + }, + "@azure/core-auth": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.1.1.tgz", + "integrity": "sha512-9Sgl5tFu9s1UKghJUx1VK72CiShSeHbubaaE1xkK/xRc6CU11nU3aEFZBJxWNqBQoR1KmOk53mOQEz4haVLo6w==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-tracing": "1.0.0-preview.7", + "@opentelemetry/types": "^0.2.0", + "tslib": "^1.10.0" + } + }, + "@azure/core-http": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-1.1.0.tgz", + "integrity": "sha512-2H9AU5PxOSpRggWvOwDOSjJ6+Vym7r8nkdm0PQVGXPiyHjhrR/pvYqi5fHKPYDQQL4hm0eQy7LsT0dRIfdeztw==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.1.0", + "@azure/core-tracing": "1.0.0-preview.7", + "@azure/logger": "^1.0.0", + "@opentelemetry/types": "^0.2.0", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.1", + "cross-env": "^6.0.3", + "form-data": "^3.0.0", + "node-fetch": "^2.6.0", + "process": "^0.11.10", + "tough-cookie": "^3.0.1", + "tslib": "^1.10.0", + "tunnel": "^0.0.6", + "uuid": "^3.3.2", + "xml2js": "^0.4.19" + } + }, + "@azure/core-lro": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-1.0.1.tgz", + "integrity": "sha512-RIrM6CTRoYoJEXpCuAr8vanXxlFBCCaHpa/PCSUfcYe6B9pAdSi1DTUZZ+2w2ysNIMHB9MyOLEAkzZ/4NCJIdQ==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^1.0.0", + "@opentelemetry/types": "^0.2.0", + "events": "^3.0.0", + "tslib": "^1.10.0" + } + }, + "@azure/core-paging": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.1.0.tgz", + "integrity": "sha512-Di26joIBaa5E/YAIAcis2LytbNy/LKTmgj+CUYZ8aLnzrN8h9AgVNASYOFXf+weJFD0pyaTAeW4GAt6P9NDFWw==", + "requires": { + "@azure/core-asynciterator-polyfill": "^1.0.0" + } + }, + "@azure/core-tracing": { + "version": "1.0.0-preview.7", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.7.tgz", + "integrity": "sha512-pkFCw6OiJrpR+aH1VQe6DYm3fK2KWCC5Jf3m/Pv1RxF08M1Xm08RCyQ5Qe0YyW5L16yYT2nnV48krVhYZ6SGFA==", + "requires": { + "@opencensus/web-types": "0.0.7", + "@opentelemetry/types": "^0.2.0", + "tslib": "^1.9.3" + } + }, + "@azure/logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.0.tgz", + "integrity": "sha512-g2qLDgvmhyIxR3JVS8N67CyIOeFRKQlX/llxYJQr1OSGQqM3HTpVP8MjmjcEKbL/OIt2N9C9UFaNQuKOw1laOA==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@azure/storage-blob": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.1.1.tgz", + "integrity": "sha512-FhzXfrPe5DZE5KNbFoKXXhGqX362I+dGv0jVINCCQiToqadROZ1tRFtJ3ljnMPs75fZZzwnbq+oIB6NnpBqOzA==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^1.0.3", + "@azure/core-lro": "^1.0.0", + "@azure/core-paging": "^1.1.0", + "@azure/core-tracing": "1.0.0-preview.7", + "@azure/logger": "^1.0.0", + "@opentelemetry/types": "^0.2.0", + "events": "^3.0.0", + "tslib": "^1.10.0" + } + }, + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/core": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.2.tgz", + "integrity": "sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.2", + "@babel/helpers": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.7.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/generator": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "requires": { + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz", + "integrity": "sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/types": "^7.9.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz", + "integrity": "sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-module-imports": "^7.8.3", + "@babel/types": "^7.9.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz", + "integrity": "sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg==", + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-split-export-declaration": "^7.8.3" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", + "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==" + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helpers": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.0.tgz", + "integrity": "sha512-tufDcFA1Vj+eWvwHN+jvMN6QsV5o+vUlytNKrbMiCeDL0F2j92RURzUsUMWE5EJkLyWxjdUslCsMQa9FWth16A==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + }, + "dependencies": { + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + } + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz", + "integrity": "sha512-TbYHmr1Gl1UC7Vo2HVuj/Naci5BEGNZ0AJhzqD2Vpr6QPFWpUmBRLrIDjedzx7/CShq0bRDS2gI4FIs77VHLVQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.7.4" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", + "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.4.tgz", + "integrity": "sha512-JmgaS+ygAWDR/STPe3/7y0lNlHgS+19qZ9aC06nYLwQ/XB7c0q5Xs+ksFU3EDnp9EiEsO0dnRAOKeyLHTZuW3A==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.7.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", + "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.8", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz", + "integrity": "sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", + "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz", + "integrity": "sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", + "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz", + "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz", + "integrity": "sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", + "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", + "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz", + "integrity": "sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==", + "requires": { + "@babel/helper-module-transforms": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.7.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", + "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", + "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz", + "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", + "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz", + "integrity": "sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==", + "requires": { + "@babel/helper-builder-react-jsx": "^7.9.0", + "@babel/helper-builder-react-jsx-experimental": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz", + "integrity": "sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz", + "integrity": "sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", + "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.2.tgz", + "integrity": "sha512-cqULw/QB4yl73cS5Y0TZlQSjDvNkzDbu0FurTZyHlJpWE5T3PCMdnyV+xXoH1opr1ldyHODe3QAX3OMAii5NxA==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz", + "integrity": "sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-typescript": "^7.8.3" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/preset-env": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.1.tgz", + "integrity": "sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==", + "requires": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.7.0", + "@babel/plugin-proposal-dynamic-import": "^7.7.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.6.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-syntax-top-level-await": "^7.7.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.7.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.3", + "@babel/plugin-transform-classes": "^7.7.0", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.7.0", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.7.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.7.0", + "@babel/plugin-transform-modules-systemjs": "^7.7.0", + "@babel/plugin-transform-modules-umd": "^7.7.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.0", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.7.0", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.6.2", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.7.0", + "@babel/types": "^7.7.1", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.1.tgz", + "integrity": "sha512-x/kt2aAZlgcFnP3P851fkkb2s4FmTiyGic58pkWMaRK9Am3u9KkH1ttHGjwlsKu7/TVJsLEBXZnjUxqsid3tww==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.7.0.tgz", + "integrity": "sha512-IXXgSUYBPHUGhUkH+89TR6faMcBtuMW0h5OHbMuVbL3/5wK2g6a2M2BBpkLa+Kw0sAHiZ9dNVgqJMDP/O4GRBA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.7.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0" + } + }, + "@babel/preset-typescript": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.7.2.tgz", + "integrity": "sha512-1B4HthAelaLGfNRyrWqJtBEjXX1ulThCrLQ5B2VOtEAznWFIFXFJahgXImqppy66lx/Oh+cOSCQdJzZqh2Jh5g==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.7.2" + } + }, + "@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/runtime-corejs3": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz", + "integrity": "sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" + }, + "@fullhuman/postcss-purgecss": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.1.0.tgz", + "integrity": "sha512-zmV+cK8pAo/suKMQk1fKzDdols5ltOy86Hk51qwkiJJt4olm3t1MaUrm4U4MlA9fiYeRpLqsNop2xNoEm8DV+w==", + "dev": true, + "requires": { + "postcss": "7.0.27", + "purgecss": "^2.1.0" + } + }, + "@hapi/address": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.0.1.tgz", + "integrity": "sha512-0oEP5UiyV4f3d6cBL8F3Z5S7iWSX39Knnl0lY8i+6gfmmIBj44JCBNtcMgwyS+5v7j3VYavNay0NFHDS+UGQcw==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@hapi/formula": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz", + "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==" + }, + "@hapi/hoek": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.4.tgz", + "integrity": "sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw==" + }, + "@hapi/joi": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-17.1.1.tgz", + "integrity": "sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg==", + "requires": { + "@hapi/address": "^4.0.1", + "@hapi/formula": "^2.0.0", + "@hapi/hoek": "^9.0.0", + "@hapi/pinpoint": "^2.0.0", + "@hapi/topo": "^5.0.0" + } + }, + "@hapi/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==" + }, + "@hapi/topo": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", + "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@jest/console": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz", + "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==", + "dev": true, + "requires": { + "@jest/source-map": "^25.2.6", + "chalk": "^3.0.0", + "jest-util": "^25.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.3.0.tgz", + "integrity": "sha512-+D5a/tFf6pA/Gqft2DLBp/yeSRgXhlJ+Wpst0X/ZkfTRP54qDR3C61VfHwaex+GzZBiTcE9vQeoZ2v5T10+Mqw==", + "dev": true, + "requires": { + "@jest/console": "^25.3.0", + "@jest/reporters": "^25.3.0", + "@jest/test-result": "^25.3.0", + "@jest/transform": "^25.3.0", + "@jest/types": "^25.3.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-changed-files": "^25.3.0", + "jest-config": "^25.3.0", + "jest-haste-map": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.3.0", + "jest-resolve-dependencies": "^25.3.0", + "jest-runner": "^25.3.0", + "jest-runtime": "^25.3.0", + "jest-snapshot": "^25.3.0", + "jest-util": "^25.3.0", + "jest-validate": "^25.3.0", + "jest-watcher": "^25.3.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "realpath-native": "^2.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "@jest/environment": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.3.0.tgz", + "integrity": "sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g==", + "dev": true, + "requires": { + "@jest/fake-timers": "^25.3.0", + "@jest/types": "^25.3.0", + "jest-mock": "^25.3.0" + } + }, + "@jest/fake-timers": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.3.0.tgz", + "integrity": "sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ==", + "dev": true, + "requires": { + "@jest/types": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-mock": "^25.3.0", + "jest-util": "^25.3.0", + "lolex": "^5.0.0" + } + }, + "@jest/reporters": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.3.0.tgz", + "integrity": "sha512-1u0ZBygs0C9DhdYgLCrRfZfNKQa+9+J7Uo+Z9z0RWLHzgsxhoG32lrmMOtUw48yR6bLNELdvzormwUqSk4H4Vg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^25.3.0", + "@jest/test-result": "^25.3.0", + "@jest/transform": "^25.3.0", + "@jest/types": "^25.3.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^25.3.0", + "jest-resolve": "^25.3.0", + "jest-util": "^25.3.0", + "jest-worker": "^25.2.6", + "node-notifier": "^6.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^3.1.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "jest-worker": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", + "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", + "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.3", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz", + "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==", + "dev": true, + "requires": { + "@jest/console": "^25.3.0", + "@jest/types": "^25.3.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.3.0.tgz", + "integrity": "sha512-Xvns3xbji7JCvVcDGvqJ/pf4IpmohPODumoPEZJ0/VgC5gI4XaNVIBET2Dq5Czu6Gk3xFcmhtthh/MBOTljdNg==", + "dev": true, + "requires": { + "@jest/test-result": "^25.3.0", + "jest-haste-map": "^25.3.0", + "jest-runner": "^25.3.0", + "jest-runtime": "^25.3.0" + } + }, + "@jest/transform": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz", + "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^25.3.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.3", + "jest-haste-map": "^25.3.0", + "jest-regex-util": "^25.2.6", + "jest-util": "^25.3.0", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@next/polyfill-nomodule": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@next/polyfill-nomodule/-/polyfill-nomodule-9.3.2.tgz", + "integrity": "sha512-kEa7v3trZmW6iWeTJrhg+ZsE9njae7mLkgyZB5M1r975JHr5PQ69B5aX7hrEAj7aAJYvCKETgAczx4gGR8MOzQ==" + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@opencensus/web-types": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@opencensus/web-types/-/web-types-0.0.7.tgz", + "integrity": "sha512-xB+w7ZDAu3YBzqH44rCmG9/RlrOmFuDPt/bpf17eJr8eZSrLt7nc7LnWdxM9Mmoj/YKMHpxRg28txu3TcpiL+g==" + }, + "@opentelemetry/types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/types/-/types-0.2.0.tgz", + "integrity": "sha512-GtwNB6BNDdsIPAYEdpp3JnOGO/3AJxjPvny53s3HERBdXSJTGQw8IRhiaTEX0b3w9P8+FwFZde4k+qkjn67aVw==" + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, + "@sentry/apm": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/apm/-/apm-5.15.4.tgz", + "integrity": "sha512-gcW225Jls1ShyBXMWN6zZyuVJwBOIQ63sI+URI2NSFsdpBpdpZ8yennIm+oMlSfb25Nzt9SId7TRSjPhlSbTZQ==", + "requires": { + "@sentry/browser": "5.15.4", + "@sentry/hub": "5.15.4", + "@sentry/minimal": "5.15.4", + "@sentry/types": "5.15.4", + "@sentry/utils": "5.15.4", + "tslib": "^1.9.3" + } + }, + "@sentry/browser": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.15.4.tgz", + "integrity": "sha512-l/auT1HtZM3KxjCGQHYO/K51ygnlcuOrM+7Ga8gUUbU9ZXDYw6jRi0+Af9aqXKmdDw1naNxr7OCSy6NBrLWVZw==", + "requires": { + "@sentry/core": "5.15.4", + "@sentry/types": "5.15.4", + "@sentry/utils": "5.15.4", + "tslib": "^1.9.3" + } + }, + "@sentry/cli": { + "version": "1.52.1", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-1.52.1.tgz", + "integrity": "sha512-XocAy3opa7bxWEbYQ9R/whbIb4BAX2YHXvfMoCwZRzLRy9cf85FYGQCMi8JA7wQd5PBmcxUh31AxcX7jAfMPCQ==", + "dev": true, + "requires": { + "fs-copy-file-sync": "^1.1.1", + "https-proxy-agent": "^4.0.0", + "mkdirp": "^0.5.4", + "node-fetch": "^2.1.2", + "progress": "2.0.0", + "proxy-from-env": "^1.0.0" + }, + "dependencies": { + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + } + } + }, + "@sentry/core": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.15.4.tgz", + "integrity": "sha512-9KP4NM4SqfV5NixpvAymC7Nvp36Zj4dU2fowmxiq7OIbzTxGXDhwuN/t0Uh8xiqlkpkQqSECZ1OjSFXrBldetQ==", + "requires": { + "@sentry/hub": "5.15.4", + "@sentry/minimal": "5.15.4", + "@sentry/types": "5.15.4", + "@sentry/utils": "5.15.4", + "tslib": "^1.9.3" + } + }, + "@sentry/hub": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.15.4.tgz", + "integrity": "sha512-1XJ1SVqadkbUT4zLS0TVIVl99si7oHizLmghR8LMFl5wOkGEgehHSoOydQkIAX2C7sJmaF5TZ47ORBHgkqclUg==", + "requires": { + "@sentry/types": "5.15.4", + "@sentry/utils": "5.15.4", + "tslib": "^1.9.3" + } + }, + "@sentry/integrations": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-5.15.4.tgz", + "integrity": "sha512-GaEVQf4R+WBJvTOGptOHIFSylnH1JAvBQZ7c45jGIDBp+upqzeI67KD+HoM4sSNT2Y2i8DLTJCWibe34knz5Kw==", + "requires": { + "@sentry/types": "5.15.4", + "@sentry/utils": "5.15.4", + "tslib": "^1.9.3" + } + }, + "@sentry/minimal": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.15.4.tgz", + "integrity": "sha512-GL4GZ3drS9ge+wmxkHBAMEwulaE7DMvAEfKQPDAjg2p3MfcCMhAYfuY4jJByAC9rg9OwBGGehz7UmhWMFjE0tw==", + "requires": { + "@sentry/hub": "5.15.4", + "@sentry/types": "5.15.4", + "tslib": "^1.9.3" + } + }, + "@sentry/node": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.15.4.tgz", + "integrity": "sha512-OfdhNEvOJZ55ZkCUcVgctjaZkOw7rmLzO5VyDTSgevA4uLsPaTNXSAeK2GSQBXc5J0KdRpNz4sSIyuxOS4Z7Vg==", + "requires": { + "@sentry/apm": "5.15.4", + "@sentry/core": "5.15.4", + "@sentry/hub": "5.15.4", + "@sentry/types": "5.15.4", + "@sentry/utils": "5.15.4", + "cookie": "^0.3.1", + "https-proxy-agent": "^4.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + } + } + }, + "@sentry/types": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.15.4.tgz", + "integrity": "sha512-quPHPpeAuwID48HLPmqBiyXE3xEiZLZ5D3CEbU3c3YuvvAg8qmfOOTI6z4Z3Eedi7flvYpnx3n7N3dXIEz30Eg==" + }, + "@sentry/utils": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.15.4.tgz", + "integrity": "sha512-lO8SLBjrUDGADl0LOkd55R5oL510d/1SaI08/IBHZCxCUwI4TiYo5EPECq8mrj3XGfgCyq9osw33bymRlIDuSQ==", + "requires": { + "@sentry/types": "5.15.4", + "tslib": "^1.9.3" + } + }, + "@sentry/webpack-plugin": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-1.10.0.tgz", + "integrity": "sha512-keT6cH8732bFjdH/v+C/UwbJu6byZ5L8t7QRLjgj+fqDyc/RlVEw9VzIQSJGUtd2XgImpdduWzgxythLkwKJjg==", + "dev": true, + "requires": { + "@sentry/cli": "^1.49.0" + } + }, + "@sinonjs/commons": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", + "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@types/babel__core": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", + "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.10.tgz", + "integrity": "sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/classnames": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.10.tgz", + "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==", + "dev": true + }, + "@types/cleave.js": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@types/cleave.js/-/cleave.js-1.4.1.tgz", + "integrity": "sha512-53CbLKtK58uTfOCFOT1FMVKF5Zt1Onpk5sm37hY5cO3Uy4DfXzhQaU1PNMf53S7DJpEq1hWxZ+d2uN/W6YZh5w==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/connect": { + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/cookie": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", + "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==", + "dev": true + }, + "@types/cookies": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.4.tgz", + "integrity": "sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, + "@types/d3": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-5.7.2.tgz", + "integrity": "sha512-7/wClB8ycneWGy3jdvLfXKTd5SoTg9hji7IdJ0RuO9xTY54YpJ8zlcFADcXhY1J3kCBwxp+/1jeN6a5OMwgYOw==", + "dev": true, + "requires": { + "@types/d3-array": "^1", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-collection": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-voronoi": "*", + "@types/d3-zoom": "*" + } + }, + "@types/d3-array": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.7.tgz", + "integrity": "sha512-51vHWuUyDOi+8XuwPrTw3cFqyh2Slg9y8COYkRfjCPG9TfYqY0hoNPzv/8BrcAy0FeQBzqEo/D/8Nk2caOQJnA==", + "dev": true + }, + "@types/d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-BZISgSD5M8TgURyNtcPAmUB9sk490CO1Thb6/gIn0WZTt3Y50IssX+2Z0vTccoqZksUDTep0b+o4ofXslvNbqg==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-brush": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.1.0.tgz", + "integrity": "sha512-yz5Y94XpUARimOlLk+RWM1cZh1FrtmSGOyDQfCArsMa6kAnhjF3EserSTDnHAuVuNATMoTIOPHa7pjG2iTkPYA==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-chord": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.9.tgz", + "integrity": "sha512-UA6lI9CVW5cT5Ku/RV4hxoFn4mKySHm7HEgodtfRthAj1lt9rKZEPon58vyYfk+HIAm33DtJJgZwMXy2QgyPXw==", + "dev": true + }, + "@types/d3-collection": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.8.tgz", + "integrity": "sha512-y5lGlazdc0HNO0F3UUX2DPE7OmYvd9Kcym4hXwrJcNUkDaypR5pX+apuMikl9LfTxKItJsY9KYvzBulpCKyvuQ==", + "dev": true + }, + "@types/d3-color": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.2.2.tgz", + "integrity": "sha512-6pBxzJ8ZP3dYEQ4YjQ+NVbQaOflfgXq/JbDiS99oLobM2o72uAST4q6yPxHv6FOTCRC/n35ktuo8pvw/S4M7sw==", + "dev": true + }, + "@types/d3-contour": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-1.3.0.tgz", + "integrity": "sha512-AUCUIjEnC5lCGBM9hS+MryRaFLIrPls4Rbv6ktqbd+TK/RXZPwOy9rtBWmGpbeXcSOYCJTUDwNJuEnmYPJRxHQ==", + "dev": true, + "requires": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "@types/d3-dispatch": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.7.tgz", + "integrity": "sha512-M+z84G7UKwK6hEPnGCSccOg8zJ3Nk2hgDQ9sCstHXgsFU0sMxlIZVKqKB5oxUDbALqQG6ucg0G9e8cmOSlishg==", + "dev": true + }, + "@types/d3-drag": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.3.tgz", + "integrity": "sha512-rWB5SPvkYVxW3sqUxHOJUZwifD0KqvKwvt1bhNqcLpW6Azsd0BJgRNcyVW8GAferaAk5r8dzeZnf9zKlg9+xMQ==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-dsv": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.0.36.tgz", + "integrity": "sha512-jbIWQ27QJcBNMZbQv0NSQMHnBDCmxghAxePxgyiPH1XPCRkOsTBei7jcdi3fDrUCGpCV3lKrSZFSlOkhUQVClA==", + "dev": true + }, + "@types/d3-ease": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.9.tgz", + "integrity": "sha512-U5ADevQ+W6fy32FVZZC9EXallcV/Mi12A5Tkd0My5MrC7T8soMQEhlDAg88XUWm0zoCQlB4XV0en/24LvuDB4Q==", + "dev": true + }, + "@types/d3-fetch": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-1.1.5.tgz", + "integrity": "sha512-o9c0ItT5/Gl3wbNuVpzRnYX1t3RghzeWAjHUVLuyZJudiTxC4f/fC0ZPFWLQ2lVY8pAMmxpV8TJ6ETYCgPeI3A==", + "dev": true, + "requires": { + "@types/d3-dsv": "*" + } + }, + "@types/d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-jqK+I36uz4kTBjyk39meed5y31Ab+tXYN/x1dn3nZEus9yOHCLc+VrcIYLc/aSQ0Y7tMPRlIhLetulME76EiiA==", + "dev": true + }, + "@types/d3-format": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.3.1.tgz", + "integrity": "sha512-KAWvReOKMDreaAwOjdfQMm0HjcUMlQG47GwqdVKgmm20vTd2pucj0a70c3gUSHrnsmo6H2AMrkBsZU2UhJLq8A==", + "dev": true + }, + "@types/d3-geo": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.11.1.tgz", + "integrity": "sha512-Ox8WWOG3igDRoep/dNsGbOiSJYdUG3ew/6z0ETvHyAtXZVBjOE0S96zSSmzgl0gqQ3RdZjn2eeJOj9oRcMZPkQ==", + "dev": true, + "requires": { + "@types/geojson": "*" + } + }, + "@types/d3-hierarchy": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.6.tgz", + "integrity": "sha512-vvSaIDf/Ov0o3KwMT+1M8+WbnnlRiGjlGD5uvk83a1mPCTd/E5x12bUJ/oP55+wUY/4Kb5kc67rVpVGJ2KUHxg==", + "dev": true + }, + "@types/d3-interpolate": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.3.1.tgz", + "integrity": "sha512-z8Zmi08XVwe8e62vP6wcA+CNuRhpuUU5XPEfqpG0hRypDE5BWNthQHB1UNWWDB7ojCbGaN4qBdsWp5kWxhT1IQ==", + "dev": true, + "requires": { + "@types/d3-color": "*" + } + }, + "@types/d3-path": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.8.tgz", + "integrity": "sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA==", + "dev": true + }, + "@types/d3-polygon": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.7.tgz", + "integrity": "sha512-Xuw0eSjQQKs8jTiNbntWH0S+Xp+JyhqxmQ0YAQ3rDu6c3kKMFfgsaGN7Jv5u3zG6yVX/AsLP/Xs/QRjmi9g43Q==", + "dev": true + }, + "@types/d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-0ajFawWicfjsaCLh6NzxOyVDYhQAmMFbsiI3MPGLInorauHFEh9/Cl6UHNf+kt/J1jfoxKY/ZJaKAoDpbvde5Q==", + "dev": true + }, + "@types/d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-Jui+Zn28pQw/3EayPKaN4c/PqTvqNbIPjHkgIIFnxne1FdwNjfHtAIsZIBMKlquQNrrMjFzCrlF2gPs3xckqaA==", + "dev": true + }, + "@types/d3-scale": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-2.2.0.tgz", + "integrity": "sha512-oQFanN0/PiR2oySHfj+zAAkK1/p4LD32Nt1TMVmzk+bYHk7vgIg/iTXQWitp1cIkDw4LMdcgvO63wL+mNs47YA==", + "dev": true, + "requires": { + "@types/d3-time": "*" + } + }, + "@types/d3-scale-chromatic": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.3.1.tgz", + "integrity": "sha512-Ny3rLbV5tnmqgW7w/poCcef4kXP8mHPo/p8EjTS5d9OUk8MlqAeRaM8eF7Vyv7QMLiIXNE94Pa1cMLSPkXQBoQ==", + "dev": true + }, + "@types/d3-selection": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.1.tgz", + "integrity": "sha512-bv8IfFYo/xG6dxri9OwDnK3yCagYPeRIjTlrcdYJSx+FDWlCeBDepIHUpqROmhPtZ53jyna0aUajZRk0I3rXNA==", + "dev": true + }, + "@types/d3-shape": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.2.tgz", + "integrity": "sha512-LtD8EaNYCaBRzHzaAiIPrfcL3DdIysc81dkGlQvv7WQP3+YXV7b0JJTtR1U3bzeRieS603KF4wUo+ZkJVenh8w==", + "dev": true, + "requires": { + "@types/d3-path": "*" + } + }, + "@types/d3-time": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.0.10.tgz", + "integrity": "sha512-aKf62rRQafDQmSiv1NylKhIMmznsjRN+MnXRXTqHoqm0U/UZzVpdrtRnSIfdiLS616OuC1soYeX1dBg2n1u8Xw==", + "dev": true + }, + "@types/d3-time-format": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.1.tgz", + "integrity": "sha512-tJSyXta8ZyJ52wDDHA96JEsvkbL6jl7wowGmuf45+fAkj5Y+SQOnz0N7/H68OWmPshPsAaWMQh+GAws44IzH3g==", + "dev": true + }, + "@types/d3-timer": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.9.tgz", + "integrity": "sha512-WvfJ3LFxBbWjqRGz9n7GJt08RrTHPJDVsIwwoCMROlqF+iDacYiAFjf9oqnq0mXpb2juA2N/qjKP+MKdal3YNQ==", + "dev": true + }, + "@types/d3-transition": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.1.6.tgz", + "integrity": "sha512-/F+O2r4oz4G9ATIH3cuSCMGphAnl7VDx7SbENEK0NlI/FE8Jx2oiIrv0uTrpg7yF/AmuWbqp7AGdEHAPIh24Gg==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-voronoi": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz", + "integrity": "sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ==", + "dev": true + }, + "@types/d3-zoom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.7.4.tgz", + "integrity": "sha512-5jnFo/itYhJeB2khO/lKe730kW/h2EbKMOvY0uNp3+7NdPm4w63DwPEMxifQZ7n902xGYK5DdU67FmToSoy4VA==", + "dev": true, + "requires": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", + "dev": true + }, + "@types/emoji-flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/emoji-flags/-/emoji-flags-1.2.0.tgz", + "integrity": "sha512-WzaKFo+ULGvLLmhnRC8E5fWDLROMXWDe7EyvtmmTgpT2nHXOdtPEj/s9GO/MTadJMzvTVzDSEr+jzVegN56jFw==", + "dev": true + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/express": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.4.tgz", + "integrity": "sha512-DO1L53rGqIDUEvOjJKmbMEQ5Z+BM2cIEPy/eV3En+s166Gz+FeuzRerxcab757u/U4v4XF4RYrZPmqKa+aY/2w==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.3.tgz", + "integrity": "sha512-sHEsvEzjqN+zLbqP+8OXTipc10yH1QLR+hnr5uw29gi9AhCAAAdri8ClNV7iMdrJrIzXIQtlkPvq8tJGhj3QJQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/range-parser": "*" + } + }, + "@types/geojson": { + "version": "7946.0.7", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", + "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/hapi__joi": { + "version": "16.0.12", + "resolved": "https://registry.npmjs.org/@types/hapi__joi/-/hapi__joi-16.0.12.tgz", + "integrity": "sha512-xJYifuz59jXdWY5JMS15uvA3ycS3nQYOGqoIIE0+fwQ0qI3/4CxBc6RHsOTp6wk9M0NWEdpcTl02lOQOKMifbQ==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "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": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.2.1.tgz", + "integrity": "sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA==", + "dev": true, + "requires": { + "jest-diff": "^25.2.1", + "pretty-format": "^25.2.1" + } + }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, + "@types/jsonwebtoken": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.3.9.tgz", + "integrity": "sha512-00rI8GbOKuRtoYxltFSRTVUXCRLbuYwln2/nUMPtFU9JGS7if+nnmLjeoFGmqsNCmblPLAaeQ/zMLVsHr6T5bg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/keygrip": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", + "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.149", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", + "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==", + "dev": true + }, + "@types/luxon": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-1.22.0.tgz", + "integrity": "sha512-riAvdx85rU7OXCrjW3f7dIf7fuJDrxck2Dkjd0weh6ul7q+wumrwe6+/tD8v7yOKnZAuEnTFF4FU7b+5W/I3bw==", + "dev": true + }, + "@types/mime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", + "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/mysql": { + "version": "2.15.9", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.9.tgz", + "integrity": "sha512-rB3w3/YEV11oIoL56iP4OPt6uLkcuu6oIqbUy8T2bSm/ZUYN0fvyyzzrZBDNYL//zRStdmSsUPZDtHXjdR1hTA==", + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "12.12.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.31.tgz", + "integrity": "sha512-T+wnJno8uh27G9c+1T+a1/WYCHzLeDqtsGJkoEdSp2X8RTh3oOCZQcUnjAx90CS8cmmADX51O0FI/tu9s0yssg==" + }, + "@types/node-fetch": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.5.tgz", + "integrity": "sha512-IWwjsyYjGw+em3xTvWVQi5MgYKbRs0du57klfTaZkv/B24AEQ/p/IopNeqIYNy3EsfHOpg8ieQSDomPcsYMHpA==", + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "@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/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", + "dev": true + }, + "@types/qs": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.1.tgz", + "integrity": "sha512-lhbQXx9HKZAPgBkISrBcmAcMpZsmpe/Cd/hY7LGZS5OfkySUBItnPZHgQPssWYUET8elF+yCFBbP1Q0RZPTdaw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/react": { + "version": "16.9.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.26.tgz", + "integrity": "sha512-dGuSM+B0Pq1MKXYUMlUQWeS6Jj9IhSAUf9v8Ikaimj+YhkBcQrihWBkmyEhK/1fzkJTwZQkhZp5YhmWa2CH+Rw==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "@types/react-day-picker": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@types/react-day-picker/-/react-day-picker-5.3.0.tgz", + "integrity": "sha1-EOkx+PHYWF9i7kfSEPcIdQeJy/4=", + "dev": true, + "requires": { + "react-day-picker": "*" + } + }, + "@types/react-dom": { + "version": "16.9.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.5.tgz", + "integrity": "sha512-BX6RQ8s9D+2/gDhxrj8OW+YD4R+8hj7FEM/OJHGNR0KipE1h1mSsf39YeyC81qafkq+N3rU3h3RFbLSwE5VqUg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-virtualized": { + "version": "9.21.8", + "resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.21.8.tgz", + "integrity": "sha512-7fZoA0Azd2jLIE9XC37fMZgMqaJe3o3pfzGjvrzphoKjBCdT4oNl6wikvo4dDMESDnpkZ8DvVTc7aSe4DW86Ew==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/react": "*" + } + }, + "@types/serve-static": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", + "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/tunnel": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.1.tgz", + "integrity": "sha512-AOqu6bQu5MSWwYvehMXLukFHnupHrpZ8nvgae5Ggie9UwzDR1CCwoXgSSWNZJuyOlCdfdsWMA5F2LlmvyoTv8A==", + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.23.0.tgz", + "integrity": "sha512-8iA4FvRsz8qTjR0L/nK9RcRUN3QtIHQiOm69FzV7WS3SE+7P7DyGGwh3k4UNR2JBbk+Ej2Io+jLAaqKibNhmtw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.23.0", + "eslint-utils": "^1.4.3", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.23.0.tgz", + "integrity": "sha512-OswxY59RcXH3NNPmq+4Kis2CYZPurRU6mG5xPcn24CjFyfdVli5mySwZz/g/xDbJXgDsYqNGq7enV0IziWGXVQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.23.0", + "eslint-scope": "^5.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.23.0.tgz", + "integrity": "sha512-k61pn/Nepk43qa1oLMiyqApC6x5eP5ddPz6VUYXCAuXxbmRLqkPYzkFRKl42ltxzB2luvejlVncrEpflgQoSUg==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.23.0", + "@typescript-eslint/typescript-estree": "2.23.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.23.0.tgz", + "integrity": "sha512-pmf7IlmvXdlEXvE/JWNNJpEvwBV59wtJqA8MLAxMKLXNKVRC3HZBXR/SlZLPWTCcwOSg9IM7GeRSV3SIerGVqw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", + "dev": true + }, + "adjust-sourcemap-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", + "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "requires": { + "assert": "1.4.1", + "camelcase": "5.0.0", + "loader-utils": "1.2.3", + "object-path": "0.11.4", + "regex-parser": "2.2.10" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "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" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + } + } + }, + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "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" + } + }, + "ajv-cli": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ajv-cli/-/ajv-cli-3.1.0.tgz", + "integrity": "sha512-QSHstRjJin970EspY92Qr8lDGYE9C88AwW7LJYJ/MFhKDsE6I75H2b8WObCeF+2q/1fJiolm0xX7I/VyGmw/JQ==", + "dev": true, + "requires": { + "ajv": "^6.7.0", + "ajv-pack": "^0.3.0", + "fast-json-patch": "^2.0.0", + "glob": "^7.1.0", + "json-schema-migrate": "^0.2.0", + "minimist": "^1.2.0" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "ajv-pack": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ajv-pack/-/ajv-pack-0.3.1.tgz", + "integrity": "sha1-tyxNQhnjko5ihC10Le2Tv1B5ZWA=", + "dev": true, + "requires": { + "js-beautify": "^1.6.4", + "require-from-string": "^1.2.0" + } + }, + "ambi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ambi/-/ambi-7.0.0.tgz", + "integrity": "sha512-rbjgtVCNRHoI6MMcGJOTwt0YE3wEMtO1Mj13VZnvt2Rhg+NfoFr098vIRR0pqgNG0re0MlhY+RyTQyn5JmGOvA==", + "dev": true, + "requires": { + "typechecker": "^6.3.0" + } + }, + "amphtml-validator": { + "version": "1.0.30", + "resolved": "https://registry.npmjs.org/amphtml-validator/-/amphtml-validator-1.0.30.tgz", + "integrity": "sha512-CaEm2ivIi4M4QTiFnCE9t4MRgawCf88iAV/+VsS0zEw6T4VBU6zoXcgn4L+dt6/WZ/NYxKpc38duSoRLqZJhNQ==", + "requires": { + "colors": "1.2.5", + "commander": "2.15.1", + "promise": "8.0.1" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + } + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "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" + } + }, + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "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" + } + }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-types": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", + "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-retry": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", + "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==", + "requires": { + "retry": "0.12.0" + } + }, + "async-sema": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.0.0.tgz", + "integrity": "sha512-zyCMBDl4m71feawrxYcVbHxv/UUkqm4nKJiLu3+l9lfiQha6jQ/9dxhrXLnzzBXVFqCTDwiUkZOz9XFbdEGQsg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autodll-webpack-plugin": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/autodll-webpack-plugin/-/autodll-webpack-plugin-0.4.2.tgz", + "integrity": "sha512-JLrV3ErBNKVkmhi0celM6PJkgYEtztFnXwsNBApjinpVHtIP3g/m2ZZSOvsAe7FoByfJzDhpOXBKFbH3k2UNjw==", + "requires": { + "bluebird": "^3.5.0", + "del": "^3.0.0", + "find-cache-dir": "^1.0.0", + "lodash": "^4.17.4", + "make-dir": "^1.0.0", + "memory-fs": "^0.4.1", + "read-pkg": "^2.0.0", + "tapable": "^1.0.0", + "webpack-merge": "^4.1.0", + "webpack-sources": "^1.0.1" + } + }, + "autoprefixer": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz", + "integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==", + "requires": { + "browserslist": "^4.11.0", + "caniuse-lite": "^1.0.30001036", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.27", + "postcss-value-parser": "^4.0.3" + }, + "dependencies": { + "browserslist": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.0.tgz", + "integrity": "sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==", + "requires": { + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.380", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" + }, + "babel-jest": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.3.0.tgz", + "integrity": "sha512-qiXeX1Cmw4JZ5yQ4H57WpkO0MZ61Qj+YnsVUwAMnDV5ls+yHon11XjarDdgP7H8lTmiEi6biiZA8y3Tmvx6pCg==", + "dev": true, + "requires": { + "@jest/transform": "^25.3.0", + "@jest/types": "^25.3.0", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.3.0", + "chalk": "^3.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "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" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-inline-react-svg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-inline-react-svg/-/babel-plugin-inline-react-svg-1.1.1.tgz", + "integrity": "sha512-KCCzSKJUigDXd/dxJDE6uNyVTYE46FiTt8Md3vpYHtbADeTjOLJq5LkmaVpISplxKCK25VZU8sha2Km6uIEFJA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/parser": "^7.0.0", + "lodash.isplainobject": "^4.0.6", + "resolve": "^1.10.0", + "svgo": "^0.7.2" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz", + "integrity": "sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "babel-plugin-transform-define": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-define/-/babel-plugin-transform-define-2.0.0.tgz", + "integrity": "sha512-0dv5RNRUlUKxGYIIErl01lpvi8b7W2R04Qcl1mCj70ahwZcgiklfXnFlh4FGnRh6aayCfSZKdhiMryVzcq5Dmg==", + "requires": { + "lodash": "^4.17.11", + "traverse": "0.6.6" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "babel-preset-current-node-syntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz", + "integrity": "sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.3.0.tgz", + "integrity": "sha512-tjdvLKNMwDI9r+QWz9sZUQGTq1dpoxjUqFUpEasAc7MOtHg9XuLT2fx0udFG+k1nvMV0WvHHVAN7VmCZ+1Zxbw==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^25.2.6", + "babel-preset-current-node-syntax": "^0.1.2" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "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" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", + "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", + "requires": { + "caniuse-lite": "^1.0.30001017", + "electron-to-chromium": "^1.3.322", + "node-releases": "^1.1.44" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "requires": { + "semver": "^6.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001038", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz", + "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ==" + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "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" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "requires": { + "chalk": "^1.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "cleave.js": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/cleave.js/-/cleave.js-1.5.10.tgz", + "integrity": "sha512-oxKQSQ53r4tgnHH9VhxokKoNcdGV0m+omhuQS8QdrQJWZvSMMjX+VIVk18LuGarOKIaFysKI9hu4Qz/UdKdBkg==" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", + "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==" + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "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 + }, + "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==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.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" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "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": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==" + }, + "columnify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.1.tgz", + "integrity": "sha1-Ff3agDo4dfh/nTArO8goky1mQAM=", + "requires": { + "strip-ansi": "^2.0.1", + "wcwidth": "^1.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", + "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=" + }, + "strip-ansi": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", + "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=", + "requires": { + "ansi-regex": "^1.0.0" + } + } + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "requires": { + "arity-n": "^1.0.4" + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "conf": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-5.0.0.tgz", + "integrity": "sha512-lRNyt+iRD4plYaOSVTxu1zPWpaH0EOxgFIR1l3mpC/DGZ7XzhoGFMKmbl54LAgXcSu6knqWgOwdINkqm58N85A==", + "requires": { + "ajv": "^6.10.0", + "dot-prop": "^5.0.0", + "env-paths": "^2.2.0", + "json-schema-typed": "^7.0.0", + "make-dir": "^3.0.0", + "pkg-up": "^3.0.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "core-js-compat": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", + "requires": { + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "core-js-pure": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz", + "integrity": "sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-env": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", + "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", + "requires": { + "cross-spawn": "^7.0.0" + } + }, + "cross-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.4.tgz", + "integrity": "sha512-MSHgpjQqgbT/94D4CyADeNoYh52zMkCX4pcJvPP5WqPsLFMKjr2TCMg381ox5qI0ii2dPwaLx/00477knXqXVw==", + "requires": { + "node-fetch": "2.6.0", + "whatwg-fetch": "3.0.0" + } + }, + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "css-loader": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.3.0.tgz", + "integrity": "sha512-x9Y1vvHe5RR+4tzwFdWExPueK00uqFTCw7mZy+9aE/X1SKWOArm5luaOrtJ4d05IpOwJ6S86b/tVcIdhw1Bu4A==", + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + }, + "dependencies": { + "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" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", + "dev": true + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano-preset-simple": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-1.0.3.tgz", + "integrity": "sha512-TMtCiUf75Kw+RCyBcYSz14cEmjKb+QI9KDUZbuinqdaZvc7qOuTKU27FTIfnCorbekmA7EGMC3tgN7J4vt1N1Q==", + "requires": { + "postcss": "^7.0.18" + } + }, + "cssnano-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-1.0.0.tgz", + "integrity": "sha512-B7u9vvtXEqeU2rzdt+Kfw5O9Nd46R7KNjJoP7Y5lGQs6c7n1Et5Ilofh2W9OjBV/ZiJV5+7j9ShWgiYNtH/57A==", + "requires": { + "cssnano-preset-simple": "^1.0.0", + "postcss": "^7.0.18" + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", + "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "csstype": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.9.tgz", + "integrity": "sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q==" + }, + "csvjson": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/csvjson/-/csvjson-5.1.0.tgz", + "integrity": "sha512-OqALQHA0k2rEGluOWikwFq5qtkRUDyoWP2u0UJy8uFjFx5FPMjPzx7D2Hn2KjBLpc8jkGrT9HDNgTUfopDlqVg==", + "dev": true + }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "d3": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.15.0.tgz", + "integrity": "sha512-C+E80SL2nLLtmykZ6klwYj5rPqB5nlfN5LdWEAVdWPppqTD8taoJi2PxLZjPeYT8FFRR2yucXq+kBlOnnvZeLg==", + "requires": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz", + "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", + "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", + "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" + }, + "d3-fetch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", + "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", + "requires": { + "d3-dsv": "1" + } + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz", + "integrity": "sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==" + }, + "d3-geo": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.9.tgz", + "integrity": "sha512-9edcH6J3s/Aa3KJITWqFJbyB/8q3mMlA9Fi7z6yy+FAYMnRaxmC7jBhUnsINxVWD14GmqX3DK8uk7nV6/Ekt4A==", + "requires": { + "d3-array": "1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", + "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", + "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "db-migrate": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/db-migrate/-/db-migrate-0.11.6.tgz", + "integrity": "sha512-HdX4V/RFVSFE+9XjiVZ3K6ofTXtd8KAam+IE14ln+1RWLGUJ1Qo8HFjEs6H3u01yRnCzvHGU0/oNkllf+ZtjVA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "bluebird": "^3.1.1", + "db-migrate-shared": "^1.2.0", + "deep-extend": "^0.6.0", + "dotenv": "^5.0.1", + "final-fs": "^1.6.0", + "inflection": "^1.10.0", + "mkdirp": "~0.5.0", + "optimist": "~0.6.1", + "parse-database-url": "~0.3.0", + "pkginfo": "^0.4.0", + "prompt": "^1.0.0", + "rc": "^1.2.8", + "resolve": "^1.1.6", + "semver": "^5.3.0", + "tunnel-ssh": "^4.0.0" + }, + "dependencies": { + "dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==", + "dev": true + } + } + }, + "db-migrate-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/db-migrate-base/-/db-migrate-base-2.1.1.tgz", + "integrity": "sha512-VFqAeVJ1Bf5Vo5Y5RfgXI/E3GuVYVwwATMAy7Cd/1HsE8WPXm0YkRGmywQ5RboqFqaeSCdRf8RmEFoomKCtlMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "db-migrate-mysql": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/db-migrate-mysql/-/db-migrate-mysql-2.1.1.tgz", + "integrity": "sha512-dqyH+N8NyfDP1NSUHmkOuUDBhscTt3obubJ3VKz4BRyKtB/NOdx/hKxREV/rpytFGZbI2LT+ELeINSXU8N5IKQ==", + "dev": true, + "requires": { + "bluebird": "^3.2.1", + "db-migrate-base": "^2.1.1", + "moment": "^2.11.2", + "mysql": "^2.17.1" + } + }, + "db-migrate-shared": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/db-migrate-shared/-/db-migrate-shared-1.2.0.tgz", + "integrity": "sha512-65k86bVeHaMxb2L0Gw3y5V+CgZSRwhVQMwDMydmw5MvIpHHwD6SmBciqIwHsZfzJ9yzV/yYhdRefRM6FV5/siw==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-equal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", + "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "dependency-graph": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.1.tgz", + "integrity": "sha512-g213uqF8fyk40W8SBjm079n3CZB4qSpCrA2ye1fLGzH/4HEgB6tzuW2CbLE7leb4t45/6h44Ud59Su1/ROTfqw==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "devalue": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-2.0.1.tgz", + "integrity": "sha512-I2TiqT5iWBEyB8GRfTDP0hiLZ0YeDJZ+upDxjBfOC2lebO5LezQMv7QvIUTzdb64jQyAKLf1AHADtGN+jw6v8Q==" + }, + "diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-helpers": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.3.tgz", + "integrity": "sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw==", + "requires": { + "@babel/runtime": "^7.6.3", + "csstype": "^2.6.7" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.0.0.tgz", + "integrity": "sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==", + "requires": { + "domelementtype": "^2.0.1" + } + }, + "domutils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.0.0.tgz", + "integrity": "sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg==", + "requires": { + "dom-serializer": "^0.2.1", + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "eachr": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/eachr/-/eachr-4.5.0.tgz", + "integrity": "sha512-9I664RWp6p8jvcHZIwo7bWaiSaUmA1wNSLKwNZEiaYjqiTARq3cGjyRiIunsopZv4QMmX3T5Hs17QoPAzdYxfg==", + "dev": true, + "requires": { + "typechecker": "^6.2.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.386", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.386.tgz", + "integrity": "sha512-M7JHfp32Bq6Am59AWgglh2d3nqe6y8Y94Vcb/AXUsO3DGvKUHYI5ML9+U5oNShfdOEfurrrjKSoSgFt2mz7mpw==" + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/emoji-flags/-/emoji-flags-1.2.0.tgz", + "integrity": "sha1-VrZGKUwYmoo/jRIjOfqIJqSgDO8=", + "requires": { + "columnify": "1.5.1", + "lodash.find": "3.2.1" + } + }, + "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==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "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==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==" + }, + "envfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/envfile/-/envfile-5.0.0.tgz", + "integrity": "sha512-3DYd+6s4mvNMAZrvXeH4csSEJyYdRAVTIDgi7h3CJmcDrWP0n/LDxLa9E+z44sPOcgB/4rpbzDncgT1Znn7uxA==", + "dev": true, + "requires": { + "ambi": "^7.0.0", + "eachr": "^4.5.0", + "typechecker": "^6.3.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "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==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + }, + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz", + "integrity": "sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", + "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", + "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.3", + "object.entries": "^1.1.1", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.15.1", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.2", + "xregexp": "^4.3.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-react-hooks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-3.0.0.tgz", + "integrity": "sha512-EjxTHxjLKIBWFgDJdhKKzLh5q+vjTFrqNZX36uIxWS4OfyXe5DawqPj3U5qeJ1ngLwatjzQnmR0Lz0J0YH3kxw==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + } + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", + "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", + "dev": true, + "requires": { + "estraverse": "^5.0.0" + }, + "dependencies": { + "estraverse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", + "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "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", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "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 + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "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" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expect": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz", + "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==", + "dev": true, + "requires": { + "@jest/types": "^25.3.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-regex-util": "^25.2.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "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 + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "dependencies": { + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + } + } + }, + "fast-json-patch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz", + "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + } + } + }, + "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": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", + "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz", + "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "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" + } + }, + "final-fs": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/final-fs/-/final-fs-1.6.1.tgz", + "integrity": "sha1-1tzZLvb+T+jAer1WjHE1YQ7eMjY=", + "dev": true, + "requires": { + "node-fs": "~0.1.5", + "when": "~2.0.1" + } + }, + "finally-polyfill": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/finally-polyfill/-/finally-polyfill-0.1.0.tgz", + "integrity": "sha512-J1LEcZ5VXe1l3sEO+S//WqL5wcJ/ep7QeKJA6HhNZrcEEFj0eyC8IW3DEZhxySI2bx3r85dwAXz+vYPGuHx5UA==" + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.0.0.tgz", + "integrity": "sha512-zoH7ZWPkRdgwYCDVoQTzqjG8JSPANhtvLhh4KVUHyKnaUJJrNeFmWIkTcNuJmR3GLMEmGYEf2S2bjgx26JTF+Q==", + "requires": { + "locate-path": "^5.0.0" + }, + "dependencies": { + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", + "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "fork-ts-checker-webpack-plugin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", + "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", + "requires": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^3.3.0", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + } + }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-copy-file-sync": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz", + "integrity": "sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ==", + "dev": true + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "dev": true + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "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": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "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-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "requires": { + "agent-base": "5", + "debug": "4" + } + }, + "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 + }, + "husky": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", + "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.5.1", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "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 + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.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==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "i": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", + "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + }, + "ignore-loader": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ignore-loader/-/ignore-loader-0.1.2.tgz", + "integrity": "sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM=" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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" + } + }, + "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 + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "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" + } + }, + "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 + }, + "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==", + "dev": true + }, + "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 + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "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" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "side-channel": "^1.0.2" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "requires": { + "symbol-observable": "^1.1.0" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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 + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.3.0.tgz", + "integrity": "sha512-iKd5ShQSHzFT5IL/6h5RZJhApgqXSoPxhp5HEi94v6OAw9QkF8T7X+liEU2eEHJ1eMFYTHmeWLrpBWulsDpaUg==", + "dev": true, + "requires": { + "@jest/core": "^25.3.0", + "import-local": "^3.0.2", + "jest-cli": "^25.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "jest-cli": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.3.0.tgz", + "integrity": "sha512-XpNQPlW1tzpP7RGG8dxpkRegYDuLjzSiENu92+CYM87nEbmEPb3b4+yo8xcsHOnj0AG7DUt9b3uG8LuHI3MDzw==", + "dev": true, + "requires": { + "@jest/core": "^25.3.0", + "@jest/test-result": "^25.3.0", + "@jest/types": "^25.3.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^25.3.0", + "jest-util": "^25.3.0", + "jest-validate": "^25.3.0", + "prompts": "^2.0.1", + "realpath-native": "^2.0.0", + "yargs": "^15.3.1" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-changed-files": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.3.0.tgz", + "integrity": "sha512-eqd5hyLbUjIVvLlJ3vQ/MoPxsxfESVXG9gvU19XXjKzxr+dXmZIqCXiY0OiYaibwlHZBJl2Vebkc0ADEMzCXew==", + "dev": true, + "requires": { + "@jest/types": "^25.3.0", + "execa": "^3.2.0", + "throat": "^5.0.0" + } + }, + "jest-config": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.3.0.tgz", + "integrity": "sha512-CmF1JnNWFmoCSPC4tnU52wnVBpuxHjilA40qH/03IHxIevkjUInSMwaDeE6ACfxMPTLidBGBCO3EbxvzPbo8wA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^25.3.0", + "@jest/types": "^25.3.0", + "babel-jest": "^25.3.0", + "chalk": "^3.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "jest-environment-jsdom": "^25.3.0", + "jest-environment-node": "^25.3.0", + "jest-get-type": "^25.2.6", + "jest-jasmine2": "^25.3.0", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.3.0", + "jest-util": "^25.3.0", + "jest-validate": "^25.3.0", + "micromatch": "^4.0.2", + "pretty-format": "^25.3.0", + "realpath-native": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz", + "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz", + "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.3.0.tgz", + "integrity": "sha512-aBfS4VOf/Qs95yUlX6d6WBv0szvOcTkTTyCIaLuQGj4bSHsT+Wd9dDngVHrCe5uytxpN8VM+NAloI6nbPjXfXw==", + "dev": true, + "requires": { + "@jest/types": "^25.3.0", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "jest-util": "^25.3.0", + "pretty-format": "^25.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.3.0.tgz", + "integrity": "sha512-jdE4bQN+k2QEZ9sWOxsqDJvMzbdFSCN/4tw8X0TQaCqyzKz58PyEf41oIr4WO7ERdp7WaJGBSUKF7imR3UW1lg==", + "dev": true, + "requires": { + "@jest/environment": "^25.3.0", + "@jest/fake-timers": "^25.3.0", + "@jest/types": "^25.3.0", + "jest-mock": "^25.3.0", + "jest-util": "^25.3.0", + "jsdom": "^15.2.1" + } + }, + "jest-environment-node": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.3.0.tgz", + "integrity": "sha512-XO09S29Nx1NU7TiMPHMoDIkxoGBuKSTbE+sHp0gXbeLDXhIdhysUI25kOqFFSD9AuDgvPvxWCXrvNqiFsOH33g==", + "dev": true, + "requires": { + "@jest/environment": "^25.3.0", + "@jest/fake-timers": "^25.3.0", + "@jest/types": "^25.3.0", + "jest-mock": "^25.3.0", + "jest-util": "^25.3.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "jest-haste-map": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz", + "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==", + "dev": true, + "requires": { + "@jest/types": "^25.3.0", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.3", + "jest-serializer": "^25.2.6", + "jest-util": "^25.3.0", + "jest-worker": "^25.2.6", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7", + "which": "^2.0.2" + }, + "dependencies": { + "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 + }, + "jest-worker": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", + "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-jasmine2": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.3.0.tgz", + "integrity": "sha512-NCYOGE6+HNzYFSui52SefgpsnIzvxjn6KAgqw66BdRp37xpMD/4kujDHLNW5bS5i53os5TcMn6jYrzQRO8VPrQ==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^25.3.0", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.3.0", + "@jest/types": "^25.3.0", + "chalk": "^3.0.0", + "co": "^4.6.0", + "expect": "^25.3.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^25.3.0", + "jest-matcher-utils": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-runtime": "^25.3.0", + "jest-snapshot": "^25.3.0", + "jest-util": "^25.3.0", + "pretty-format": "^25.3.0", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.3.0.tgz", + "integrity": "sha512-jk7k24dMIfk8LUSQQGN8PyOy9+J0NAfHZWiDmUDYVMctY8FLJQ1eQ8+PjMoN8PgwhLIggUqgYJnyRFvUz3jLRw==", + "dev": true, + "requires": { + "jest-get-type": "^25.2.6", + "pretty-format": "^25.3.0" + } + }, + "jest-matcher-utils": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.3.0.tgz", + "integrity": "sha512-ZBUJ2fchNIZt+fyzkuCFBb8SKaU//Rln45augfUtbHaGyVxCO++ANARdBK9oPGXU3hEDgyy7UHnOP/qNOJXFUg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "jest-diff": "^25.3.0", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz", + "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.3.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.3.0.tgz", + "integrity": "sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ==", + "dev": true, + "requires": { + "@jest/types": "^25.3.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true + }, + "jest-regex-util": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", + "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", + "dev": true + }, + "jest-resolve": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz", + "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==", + "dev": true, + "requires": { + "@jest/types": "^25.3.0", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^2.0.0", + "resolve": "^1.15.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.3.0.tgz", + "integrity": "sha512-bDUlLYmHW+f7J7KgcY2lkq8EMRqKonRl0XoD4Wp5SJkgAxKJnsaIOlrrVNTfXYf+YOu3VCjm/Ac2hPF2nfsCIA==", + "dev": true, + "requires": { + "@jest/types": "^25.3.0", + "jest-regex-util": "^25.2.6", + "jest-snapshot": "^25.3.0" + } + }, + "jest-runner": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.3.0.tgz", + "integrity": "sha512-csDqSC9qGHYWDrzrElzEgFbteztFeZJmKhSgY5jlCIcN0+PhActzRNku0DA1Xa1HxGOb0/AfbP1EGJlP4fGPtA==", + "dev": true, + "requires": { + "@jest/console": "^25.3.0", + "@jest/environment": "^25.3.0", + "@jest/test-result": "^25.3.0", + "@jest/types": "^25.3.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-config": "^25.3.0", + "jest-docblock": "^25.3.0", + "jest-haste-map": "^25.3.0", + "jest-jasmine2": "^25.3.0", + "jest-leak-detector": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-resolve": "^25.3.0", + "jest-runtime": "^25.3.0", + "jest-util": "^25.3.0", + "jest-worker": "^25.2.6", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "jest-worker": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", + "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.3.0.tgz", + "integrity": "sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w==", + "dev": true, + "requires": { + "@jest/console": "^25.3.0", + "@jest/environment": "^25.3.0", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.3.0", + "@jest/transform": "^25.3.0", + "@jest/types": "^25.3.0", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.3", + "jest-config": "^25.3.0", + "jest-haste-map": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-mock": "^25.3.0", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.3.0", + "jest-snapshot": "^25.3.0", + "jest-util": "^25.3.0", + "jest-validate": "^25.3.0", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-serializer": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", + "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", + "dev": true + }, + "jest-snapshot": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz", + "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^25.3.0", + "@types/prettier": "^1.19.0", + "chalk": "^3.0.0", + "expect": "^25.3.0", + "jest-diff": "^25.3.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-resolve": "^25.3.0", + "make-dir": "^3.0.0", + "natural-compare": "^1.4.0", + "pretty-format": "^25.3.0", + "semver": "^6.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-util": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", + "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "dev": true, + "requires": { + "@jest/types": "^25.3.0", + "chalk": "^3.0.0", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.3.0.tgz", + "integrity": "sha512-3WuXgIZ4HXUvW6gk9twFFkT9j6zUorKnF2oEY8VEsHb7x5LGvVlN3WUsbqazVKuyXwvikO2zFJ/YTySMsMje2w==", + "dev": true, + "requires": { + "@jest/types": "^25.3.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "leven": "^3.1.0", + "pretty-format": "^25.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.3.0.tgz", + "integrity": "sha512-dtFkfidFCS9Ucv8azOg2hkiY3sgJEHeTLtGFHS+jfBEE7eRtrO6+2r1BokyDkaG2FOD7485r/SgpC1MFAENfeA==", + "dev": true, + "requires": { + "@jest/test-result": "^25.3.0", + "@jest/types": "^25.3.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "jest-util": "^25.3.0", + "string-length": "^3.1.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-beautify": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.11.0.tgz", + "integrity": "sha512-a26B+Cx7USQGSWnz9YxgJNMmML/QG2nqIaL7VVYPCXbqiKz8PN0waSNvroMtvAK6tY7g/wPdNWGEP+JTNIBr6A==", + "dev": true, + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "mkdirp": "~1.0.3", + "nopt": "^4.0.3" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" + }, + "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.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "js-yaml-loader": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/js-yaml-loader/-/js-yaml-loader-1.2.2.tgz", + "integrity": "sha512-H+NeuNrG6uOs/WMjna2SjkaCw13rMWiT/D7l9+9x5n8aq88BDsh2sRmdfxckWPIHtViYHWRG6XiCKYvS1dfyLg==", + "dev": true, + "requires": { + "js-yaml": "^3.13.1", + "loader-utils": "^1.2.3", + "un-eval": "^1.2.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-migrate": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-0.2.0.tgz", + "integrity": "sha1-ukelsAcvxyOWRg4b1gtE1SF4u8Y=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "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-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "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": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "launch-editor": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", + "integrity": "sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==", + "requires": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "lint-staged": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.0.9.tgz", + "integrity": "sha512-NKJHYgRa8oI9c4Ic42ZtF2XA6Ps7lFbXwg3q0ZEP0r55Tw3YWykCW1RzW6vu+QIGqbsy7DxndvKu93Wtr5vPQw==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "commander": "^4.0.1", + "cosmiconfig": "^6.0.0", + "debug": "^4.1.1", + "dedent": "^0.7.0", + "execa": "^3.4.0", + "listr": "^0.14.3", + "log-symbols": "^3.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "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 + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==", + "dev": true, + "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": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + } + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "dependencies": { + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash._basecallback": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lodash._basecallback/-/lodash._basecallback-3.3.1.tgz", + "integrity": "sha1-t7K7Q9whYEJKIczybFfkQ3cqjic=", + "requires": { + "lodash._baseisequal": "^3.0.0", + "lodash._bindcallback": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.pairs": "^3.0.0" + } + }, + "lodash._baseeach": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", + "integrity": "sha1-z4cGVyyhROjZ11InyZDamC+TKvM=", + "requires": { + "lodash.keys": "^3.0.0" + } + }, + "lodash._basefind": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basefind/-/lodash._basefind-3.0.0.tgz", + "integrity": "sha1-srugXMZF+XLeLPkl+iv2Og9gyK4=" + }, + "lodash._basefindindex": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/lodash._basefindindex/-/lodash._basefindindex-3.6.0.tgz", + "integrity": "sha1-8IM2ChsCJBjtgbyJm+sxLiHnSk8=" + }, + "lodash._baseisequal": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz", + "integrity": "sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE=", + "requires": { + "lodash.isarray": "^3.0.0", + "lodash.istypedarray": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.find": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-3.2.1.tgz", + "integrity": "sha1-BG4xnzrOkSrGySRsf2g8XsB7Nq0=", + "requires": { + "lodash._basecallback": "^3.0.0", + "lodash._baseeach": "^3.0.0", + "lodash._basefind": "^3.0.0", + "lodash._basefindindex": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.istypedarray": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", + "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "lodash.pairs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.pairs/-/lodash.pairs-3.0.1.tgz", + "integrity": "sha1-u+CNV4bu6qCaFckevw3LfSvjJqk=", + "requires": { + "lodash.keys": "^3.0.0" + } + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "requires": { + "chalk": "^2.0.1" + } + }, + "log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + } + }, + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.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": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" + }, + "luxon": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.22.2.tgz", + "integrity": "sha512-vq6eSaOOw1fKob+JXwfu0e3/UFUT4G4HTFRJab7dch8J1OdOGW/vXqCiJsY7rm2In+5gKNYx0EtnYT0Tc5V4Qw==" + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "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==" + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", + "dev": true + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mini-css-extract-plugin": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "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" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "dev": true + }, + "mongodb-uri": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/mongodb-uri/-/mongodb-uri-0.9.7.tgz", + "integrity": "sha1-D3ca0W9IOuZfQoeWlCjp+8SqYYE=", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "requires": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", + "requires": { + "querystring": "^0.2.0" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ncp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz", + "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "next": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/next/-/next-9.3.2.tgz", + "integrity": "sha512-KVNnnFyvtO1DwSEyMgt3wtxpkprnGCldEOyMXbt9Zxf8RcCw3YnRImbg8mVgrcXJRzkQpve4bdJKYY5MVwT/RA==", + "requires": { + "@ampproject/toolbox-optimizer": "2.0.1", + "@babel/core": "7.7.2", + "@babel/plugin-proposal-class-properties": "7.7.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.7.4", + "@babel/plugin-proposal-numeric-separator": "7.8.3", + "@babel/plugin-proposal-object-rest-spread": "7.6.2", + "@babel/plugin-proposal-optional-chaining": "7.7.4", + "@babel/plugin-syntax-bigint": "7.8.3", + "@babel/plugin-syntax-dynamic-import": "7.2.0", + "@babel/plugin-transform-modules-commonjs": "7.7.0", + "@babel/plugin-transform-runtime": "7.6.2", + "@babel/preset-env": "7.7.1", + "@babel/preset-modules": "0.1.1", + "@babel/preset-react": "7.7.0", + "@babel/preset-typescript": "7.7.2", + "@babel/runtime": "7.7.2", + "@babel/types": "7.7.4", + "@next/polyfill-nomodule": "9.3.2", + "amphtml-validator": "1.0.30", + "async-retry": "1.2.3", + "async-sema": "3.0.0", + "autodll-webpack-plugin": "0.4.2", + "babel-core": "7.0.0-bridge.0", + "babel-loader": "8.0.6", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-define": "2.0.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24", + "browserslist": "4.8.3", + "cache-loader": "4.1.0", + "chalk": "2.4.2", + "ci-info": "2.0.0", + "compression": "1.7.4", + "conf": "5.0.0", + "content-type": "1.0.4", + "cookie": "0.4.0", + "css-loader": "3.3.0", + "cssnano-simple": "1.0.0", + "devalue": "2.0.1", + "escape-string-regexp": "2.0.0", + "etag": "1.8.1", + "file-loader": "4.2.0", + "finally-polyfill": "0.1.0", + "find-up": "4.0.0", + "fork-ts-checker-webpack-plugin": "3.1.1", + "fresh": "0.5.2", + "gzip-size": "5.1.1", + "http-proxy": "1.18.0", + "ignore-loader": "0.1.2", + "is-docker": "2.0.0", + "is-wsl": "2.1.1", + "jest-worker": "24.9.0", + "json5": "2.1.1", + "jsonwebtoken": "8.5.1", + "launch-editor": "2.2.1", + "loader-utils": "2.0.0", + "lodash.curry": "4.1.1", + "lru-cache": "5.1.1", + "mini-css-extract-plugin": "0.8.0", + "native-url": "0.2.6", + "node-fetch": "2.6.0", + "ora": "3.4.0", + "path-to-regexp": "6.1.0", + "pnp-webpack-plugin": "1.5.0", + "postcss-flexbugs-fixes": "4.2.0", + "postcss-loader": "3.0.0", + "postcss-preset-env": "6.7.0", + "prop-types": "15.7.2", + "prop-types-exact": "1.2.0", + "raw-body": "2.4.0", + "react-error-overlay": "5.1.6", + "react-is": "16.8.6", + "recast": "0.18.5", + "resolve-url-loader": "3.1.1", + "sass-loader": "8.0.2", + "send": "0.17.1", + "source-map": "0.6.1", + "string-hash": "1.1.3", + "strip-ansi": "5.2.0", + "style-loader": "1.0.0", + "styled-jsx": "3.2.5", + "terser": "4.4.2", + "thread-loader": "2.1.3", + "unfetch": "4.1.0", + "url": "0.11.0", + "use-subscription": "1.1.1", + "watchpack": "2.0.0-beta.13", + "webpack": "4.42.0", + "webpack-dev-middleware": "3.7.0", + "webpack-hot-middleware": "2.25.0", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "node-fs": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz", + "integrity": "sha1-MjI8zLRsn78PwRgS1FAhzDHTJbs=", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + } + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", + "shellwords": "^0.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "node-releases": { + "version": "1.1.52", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.52.tgz", + "integrity": "sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-html-whitespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz", + "integrity": "sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", + "dev": true + }, + "now": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/now/-/now-18.0.0.tgz", + "integrity": "sha512-MVskFV3xH1hMkpTewPCb3p0SQ17hL7EI1Zb+Ij2wYiRV3X0a6G91GdE2vvFlhsK6rhRHKHZnDQkZ0AnkpnfzHA==", + "dev": true + }, + "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" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "numbro": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.2.0.tgz", + "integrity": "sha512-qgIU8Zfz2A7Nu9ILL0jV1hfriG5v1G8+b19zyrQNK8spUmJaHcn1YYXzNDRrb7IXBlTrW61ZUsKT/bCijeEGiQ==", + "requires": { + "bignumber.js": "^8.1.1" + }, + "dependencies": { + "bignumber.js": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.1.1.tgz", + "integrity": "sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ==" + } + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "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-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "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==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-database-url": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/parse-database-url/-/parse-database-url-0.3.0.tgz", + "integrity": "sha1-NpZmMh6SfJreY838Gqr2+zdFPQ0=", + "dev": true, + "requires": { + "mongodb-uri": ">= 0.9.7" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "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.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz", + "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } + } + }, + "pkginfo": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", + "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=", + "dev": true + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "pnp-webpack-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-jd9olUr9D7do+RN8Wspzhpxhgp1n6Vd0NtQ4SFkmIACZoEL1nkyAdW9Ygrinjec0vgDcWjscFQQ1gDW8rsfKTg==", + "requires": { + "ts-pnp": "^1.1.2" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-cli": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-7.1.0.tgz", + "integrity": "sha512-tCGK0GO2reu644dUHxks8U2SAtKnzftQTAXN1dwzFPoKXZr0b7VX4vTkQ2Pl2Lunas6+o8uHR56hlcYBm1srZg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "chokidar": "^3.3.0", + "dependency-graph": "^0.8.0", + "fs-extra": "^8.1.0", + "get-stdin": "^7.0.0", + "globby": "^10.0.1", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "postcss-reporter": "^6.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "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==", + "dev": true + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "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 + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-flexbugs-fixes": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.0.tgz", + "integrity": "sha512-QRE0n3hpkxxS/OGvzOa+PDuy4mh/Jg4o9ui22/ko5iGYOG3M5dfJabjnAZjTdh2G9F85c7Hv8hWcEDEKW/xceQ==", + "requires": { + "postcss": "^7.0.26" + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-font-variant": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", + "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-functions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz", + "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=", + "dev": true, + "requires": { + "glob": "^7.1.2", + "object-assign": "^4.1.1", + "postcss": "^6.0.9", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-initial": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", + "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", + "requires": { + "lodash.template": "^4.5.0", + "postcss": "^7.0.2" + } + }, + "postcss-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz", + "integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1", + "postcss": "^7.0.18" + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "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" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-nested": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-4.2.1.tgz", + "integrity": "sha512-AMayXX8tS0HCp4O4lolp4ygj9wBn32DJWXvG6gCv+ZvJrEa00GUxJcJEEzMh87BIe6FrWdYkpR2cuyqHKrxmXw==", + "dev": true, + "requires": { + "postcss": "^7.0.21", + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-reporter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz", + "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "lodash": "^4.17.11", + "log-symbols": "^2.2.0", + "postcss": "^7.0.7" + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-not": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", + "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==" + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", + "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "dev": true, + "requires": { + "@jest/types": "^25.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "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 + }, + "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==", + "dev": true + } + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", + "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prompt": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz", + "integrity": "sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=", + "dev": true, + "requires": { + "colors": "^1.1.2", + "pkginfo": "0.x.x", + "read": "1.0.x", + "revalidator": "0.1.x", + "utile": "0.3.x", + "winston": "2.1.x" + } + }, + "prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "prop-types-exact": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", + "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", + "requires": { + "has": "^1.0.3", + "object.assign": "^4.1.0", + "reflect.ownkeys": "^0.2.0" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "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==" + }, + "purgecss": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.1.0.tgz", + "integrity": "sha512-QnXhowNjeWo9vNnGES2LVzDXdRR/8EvG/O03m4bYOWfAX0ShmG/Pmj7brVtVBy2eaaRAmNy23L+GBc4SpDFUeQ==", + "dev": true, + "requires": { + "commander": "^4.0.0", + "glob": "^7.0.0", + "postcss": "7.0.27", + "postcss-selector-parser": "^6.0.2" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + } + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "react": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-day-picker": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-7.4.0.tgz", + "integrity": "sha512-dqfr96EY7mHSpbW23hJI6of2JvxClDfHLNQ7VqctxBvNsJIzEiwh3zS8hEhqNza7xuR0vC4KN517zxndgb3/fw==", + "requires": { + "prop-types": "^15.6.2" + } + }, + "react-dimensions-hook": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/react-dimensions-hook/-/react-dimensions-hook-1.0.3.tgz", + "integrity": "sha512-ZPODF7vEBgcO6hTn5rWyjcmFzOYYwOPPdl/uvvLHadG+2VfVD0quJa3RIK6J7Tis+UH3jzxn+BYxh8hd/l2pvw==", + "requires": { + "resize-observer-polyfill": "^1.5.1" + } + }, + "react-dom": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + } + }, + "react-error-overlay": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz", + "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==" + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-spring": { + "version": "8.0.27", + "resolved": "https://registry.npmjs.org/react-spring/-/react-spring-8.0.27.tgz", + "integrity": "sha512-nDpWBe3ZVezukNRandTeLSPcwwTMjNVu1IDq9qA/AMiUqHuRN4BeSWvKr3eIxxg1vtiYiOLy4FqdfCP5IoP77g==", + "requires": { + "@babel/runtime": "^7.3.1", + "prop-types": "^15.5.8" + } + }, + "react-virtualized": { + "version": "9.21.2", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.2.tgz", + "integrity": "sha512-oX7I7KYiUM7lVXQzmhtF4Xg/4UA5duSA+/ZcAvdWlTLFCoFYq1SbauJT5gZK9cZS/wdYR6TPGpX/dqzvTqQeBA==", + "requires": { + "babel-runtime": "^6.26.0", + "clsx": "^1.0.1", + "dom-helpers": "^5.0.0", + "loose-envify": "^1.3.0", + "prop-types": "^15.6.0", + "react-lifecycles-compat": "^3.0.4" + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "requires": { + "picomatch": "^2.0.7" + } + }, + "realpath-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true + }, + "recast": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.18.5.tgz", + "integrity": "sha512-sD1WJrpLQAkXGyQZyGzTM75WJvyAd98II5CHdK3IYbt/cZlU0UzCRVU11nUFNXX9fBVEt4E9ajkMjBlUlG+Oog==", + "requires": { + "ast-types": "0.13.2", + "esprima": "~4.0.0", + "private": "^0.1.8", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "reduce-css-calc": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz", + "integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==", + "dev": true, + "requires": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "reflect.ownkeys": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", + "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=" + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + }, + "regenerator-transform": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "requires": { + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regex-parser": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", + "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", + "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "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", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "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" + } + }, + "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" + } + } + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "dev": true, + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "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" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "resolve-url-loader": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", + "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", + "requires": { + "adjust-sourcemap-loader": "2.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.21", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "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" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "revalidator": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", + "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=", + "dev": true + }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "dependencies": { + "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" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "requires": { + "xmlchars": "^2.1.1" + } + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "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" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" + }, + "serverless-mysql": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/serverless-mysql/-/serverless-mysql-1.5.3.tgz", + "integrity": "sha512-ytRbLjSmSN5FvGFDkxN0Zx6NBKdxVqk7gHKPeqWBdOBjAKVzElWfZEE9QBwsKTFo/dC7dqUqOThwMwKckuILkw==", + "requires": { + "@types/mysql": "^2.15.6", + "mysql": "^2.18.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "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==" + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "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" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sql-template-strings": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/sql-template-strings/-/sql-template-strings-2.2.2.tgz", + "integrity": "sha1-PxFQiiWt384hejBCqdMAwxk7lv8=" + }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" + }, + "ssh2": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.5.4.tgz", + "integrity": "sha1-G/a2soyW6u8mf01sRqWiUXpZnic=", + "dev": true, + "requires": { + "ssh2-streams": "~0.1.15" + } + }, + "ssh2-streams": { + "version": "0.1.20", + "resolved": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.1.20.tgz", + "integrity": "sha1-URGNFUVV31Rp7h9n4M8efoosDjo=", + "dev": true, + "requires": { + "asn1": "~0.2.0", + "semver": "^5.1.0", + "streamsearch": "~0.1.2" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "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" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" + }, + "string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "string.prototype.matchall": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", + "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "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.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "style-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "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" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "styled-jsx": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-3.2.5.tgz", + "integrity": "sha512-prEahkYwQHomUljJzXzrFnBmQrSMtWOBbXn8QeEkpfFkqMZQGshxzzp4H8ebBIsbVlHF/3+GSXMnmK/fp7qVYQ==", + "requires": { + "@babel/types": "7.8.3", + "babel-plugin-syntax-jsx": "6.18.0", + "convert-source-map": "1.7.0", + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "string-hash": "1.1.3", + "stylis": "3.5.4", + "stylis-rule-sheet": "0.0.10" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "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" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "stylis": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", + "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" + }, + "stylis-rule-sheet": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", + "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" + }, + "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-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + }, + "dependencies": { + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + } + } + }, + "swr": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/swr/-/swr-0.2.0.tgz", + "integrity": "sha512-8IZCdM0deUPhDiqOmyaj0BsnNjav1fu83nD0d07PEAzOHOn+lxcJOxwXeDBShwF6qCeZ8u8ab+a2yXkjD8yT3A==", + "requires": { + "fast-deep-equal": "2.0.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + } + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "tailwindcss": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.2.0.tgz", + "integrity": "sha512-CKvY0ytB3ze5qvynG7qv4XSpQtFNGPbu9pUn8qFdkqgD8Yo/vGss8mhzbqls44YCXTl4G62p3qVZBj45qrd6FQ==", + "dev": true, + "requires": { + "autoprefixer": "^9.4.5", + "bytes": "^3.0.0", + "chalk": "^3.0.0", + "detective": "^5.2.0", + "fs-extra": "^8.0.0", + "lodash": "^4.17.15", + "node-emoji": "^1.8.1", + "normalize.css": "^8.0.1", + "postcss": "^7.0.11", + "postcss-functions": "^3.0.0", + "postcss-js": "^2.0.0", + "postcss-nested": "^4.1.1", + "postcss-selector-parser": "^6.0.0", + "pretty-hrtime": "^1.0.3", + "reduce-css-calc": "^2.1.6", + "resolve": "^1.14.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "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 + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "terser": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.2.tgz", + "integrity": "sha512-Uufrsvhj9O1ikwgITGsZ5EZS6qPokUOkCegS7fYOdGTv+OA90vndUbU6PEjr5ePqHfNUbGyMO7xyIZv2MhsALQ==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + }, + "dependencies": { + "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" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "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" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" + }, + "ts-json-schema-generator": { + "version": "0.67.1", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-0.67.1.tgz", + "integrity": "sha512-trm0Z8yR0f9aAsobKxfZ0z3JCGjDXHP/U67uJdNlS9ghJZUmSzennqQjUOY+zfYUEkSt3r+ytfHMojNrj2wnIg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "commander": "~5.0.0", + "glob": "~7.1.6", + "json-stable-stringify": "^1.0.1", + "typescript": "~3.8.3" + }, + "dependencies": { + "commander": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", + "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==", + "dev": true + } + } + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tunnel-ssh": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tunnel-ssh/-/tunnel-ssh-4.1.4.tgz", + "integrity": "sha512-CjBqboGvAbM7iXSX2F95kzoI+c2J81YkrHbyyo4SWNKCzU6w5LfEvXBCHu6PPriYaNvfhMKzD8bFf5Vl14YTtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "lodash.defaults": "^4.1.0", + "ssh2": "0.5.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typechecker": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-6.3.0.tgz", + "integrity": "sha512-XZmZISfAzrzGHaC2nAwXyh/O1srpTIw/sFS5K0wGRIoWgc+bpGXJLkpI5VoZg9+2SwV6tFIS3WCb3l0bNitLag==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "dev": true + }, + "un-eval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/un-eval/-/un-eval-1.2.0.tgz", + "integrity": "sha512-Wlj/pum6dQtGTPD/lclDtoVPkSfpjPfy1dwnnKw/sZP5DpBH9fLhBgQfsqNhe5/gS1D+vkZUuB771NRMUPA5CA==", + "dev": true + }, + "unfetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.1.0.tgz", + "integrity": "sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg==" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "use-subscription": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.1.1.tgz", + "integrity": "sha512-gk4fPTYvNhs6Ia7u8/+K7bM7sZ7O7AMfWtS+zPO8luH+zWuiGgGcrW0hL4MRWZSzXo+4ofNorf87wZwBKz2YdQ==" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utile": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz", + "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=", + "dev": true, + "requires": { + "async": "~0.9.0", + "deep-equal": "~0.2.1", + "i": "0.3.x", + "mkdirp": "0.x.x", + "ncp": "1.0.x", + "rimraf": "2.x.x" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "v8-to-istanbul": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz", + "integrity": "sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.0-beta.13.tgz", + "integrity": "sha512-ZEFq2mx/k5qgQwgi6NOm+2ImICb8ngAkA/rZ6oyXZ7SgPn3pncf+nfhYTCrs3lmHwOxnPtGLTOuFLfpSMh1VMA==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", + "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "optional": true, + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "optional": true + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "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" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "watchpack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", + "requires": { + "chokidar": "^2.1.8", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + } + } + }, + "webpack-hot-middleware": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", + "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", + "requires": { + "ansi-html": "0.0.7", + "html-entities": "^1.2.0", + "querystring": "^0.2.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "when": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/when/-/when-2.0.1.tgz", + "integrity": "sha1-jYcv4V5oQkyRtLck6EjggH2rZkI=", + "dev": true + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, + "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-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "winston": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.1.1.tgz", + "integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=", + "dev": true, + "requires": { + "async": "~1.0.0", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "pkginfo": "0.3.x", + "stack-trace": "0.0.x" + }, + "dependencies": { + "async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", + "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==", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xregexp": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", + "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "dev": true, + "requires": { + "@babel/runtime-corejs3": "^7.8.3" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yaml": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", + "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.7" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "yargs-parser": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9250ef2 --- /dev/null +++ b/package.json @@ -0,0 +1,177 @@ +{ + "repository": { + "url": "https://github.com/covid-modeling/web" + }, + "private": true, + "scripts": { + "dev": "next", + "build": "next build", + "start": "next start", + "lint-staged": "lint-staged", + "lint": "eslint \"./**/*.{ts,tsx}\" --ignore-pattern node_modules", + "test": "jest", + "test:debug": "node --inspect node_modules/.bin/jest --runInBand --watch --all" + }, + "license": "MIT", + "dependencies": { + "@azure/storage-blob": "^12.1.1", + "@hapi/joi": "^17.1.1", + "@sentry/browser": "^5.15.4", + "@sentry/integrations": "^5.15.4", + "@sentry/node": "^5.15.4", + "axios": "^0.19.2", + "classnames": "^2.2.6", + "cleave.js": "^1.5.10", + "cookies": "^0.8.0", + "d3": "^5.15.0", + "debug": "^4.1.1", + "emoji-flags": "^1.2.0", + "jsonwebtoken": "^8.5.1", + "lodash": "^4.17.15", + "luxon": "^1.22.2", + "next": "^9.3.2", + "numbro": "^2.2.0", + "react": "^16.13.1", + "react-day-picker": "^7.4.0", + "react-dimensions-hook": "^1.0.3", + "react-dom": "^16.13.1", + "react-spring": "^8.0.27", + "react-virtualized": "^9.21.2", + "serverless-mysql": "^1.5.3", + "source-map-support": "^0.5.16", + "sql-template-strings": "^2.2.2", + "swr": "^0.2.0" + }, + "devDependencies": { + "@fullhuman/postcss-purgecss": "^2.1.0", + "@sentry/cli": "^1.52.1", + "@sentry/webpack-plugin": "^1.10.0", + "@types/classnames": "^2.2.10", + "@types/cleave.js": "^1.4.1", + "@types/cookie": "^0.3.3", + "@types/cookies": "^0.7.4", + "@types/d3": "^5.7.2", + "@types/debug": "^4.1.5", + "@types/emoji-flags": "^1.2.0", + "@types/hapi__joi": "^16.0.12", + "@types/jest": "^25.2.1", + "@types/jsonwebtoken": "^8.3.9", + "@types/lodash": "^4.14.149", + "@types/luxon": "^1.22.0", + "@types/node": "^12.12.31", + "@types/react": "^16.9.26", + "@types/react-day-picker": "^5.3.0", + "@types/react-dom": "^16.9.5", + "@types/react-virtualized": "^9.21.8", + "@typescript-eslint/eslint-plugin": "~2.23.0", + "@typescript-eslint/parser": "~2.23.0", + "JSONStream": "^1.3.5", + "ajv-cli": "^3.1.0", + "autoprefixer": "^9.7.5", + "babel-plugin-inline-react-svg": "^1.1.1", + "csvjson": "^5.1.0", + "db-migrate": "^0.11.6", + "db-migrate-mysql": "^2.1.1", + "envfile": "^5.0.0", + "eslint": "~6.8.0", + "eslint-config-prettier": "^6.10.1", + "eslint-plugin-prettier": "^3.1.2", + "eslint-plugin-react": "~7.19.0", + "eslint-plugin-react-hooks": "^3.0.0", + "husky": "^4.2.3", + "jest": "^25.3.0", + "js-yaml": "^3.13.1", + "js-yaml-loader": "^1.2.2", + "lint-staged": "^10.0.8", + "now": "^18.0.0", + "postcss-cli": "^7.1.0", + "postcss-import": "^12.0.1", + "prettier": "^1.19.1", + "prompts": "^2.3.2", + "source-map": "^0.7.3", + "tailwindcss": "^1.2.0", + "ts-json-schema-generator": "^0.67.1", + "typescript": "^3.8.3" + }, + "eslintConfig": { + "parser": "@typescript-eslint/parser", + "extends": [ + "plugin:react/recommended", + "plugin:@typescript-eslint/recommended", + "prettier/@typescript-eslint", + "plugin:prettier/recommended", + "plugin:react-hooks/recommended" + ], + "ignorePatterns": [ + "migrations/*.js" + ], + "parserOptions": { + "jsx": true, + "ecmaVersion": 2018, + "sourceType": "module" + }, + "rules": { + "react/react-in-jsx-scope": 0, + "react/prop-types": 0, + "@typescript-eslint/explicit-function-return-type": 0, + "@typescript-eslint/no-var-requires": 0, + "@typescript-eslint/no-explicit-any": 0, + "@typescript-eslint/no-empty-interface": 1, + "@typescript-eslint/interface-name-prefix": 1, + "@typescript-eslint/no-inferrable-types": 0, + "@typescript-eslint/no-non-null-assertion": 0, + "@typescript-eslint/camelcase": [ + 2, + { + "properties": "never" + } + ], + "@typescript-eslint/no-use-before-define": [ + 2, + { + "functions": false + } + ] + }, + "settings": { + "react": { + "version": "detect" + } + } + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "husky": { + "hooks": { + "pre-commit": "npm run lint-staged" + } + }, + "lint-staged": { + "./**/*.{json,css,scss,md}": [ + "prettier --write" + ], + "./**/*.{js,jsx,ts,tsx}": [ + "eslint --fix" + ] + }, + "prettier": { + "singleQuote": true, + "tabWidth": 2, + "semi": false, + "bracketSpacing": false + }, + "bugs": { + "url": "https://github.com/covid-modeling/web/issues", + "email": "covid-modeling+opensource@github.com" + } +} diff --git a/pages/_app.tsx b/pages/_app.tsx new file mode 100644 index 0000000..f58ce92 --- /dev/null +++ b/pages/_app.tsx @@ -0,0 +1,101 @@ +import Axios from 'axios' +import App, {AppContext} from 'next/app' +import NextError from 'next/error' +import Head from 'next/head' +import {createContext} from 'react' +import 'react-day-picker/lib/style.css' +import 'react-virtualized/styles.css' +import {SWRConfig} from 'swr' +import '../css/app.css' +import {initSentry} from '../lib/sentry' + +const {captureContextException, captureException, captureMessage} = initSentry() + +export const SentryContext = createContext<{ + captureException: typeof captureException + captureMessage: typeof captureMessage +}>({captureException, captureMessage}) + +const scriptPolicy = + process.env.NODE_ENV === 'production' + ? // In production builds, only allow JS from within the app. + "'self'" + : // In dev builds, allow JS within the app, + // or the inline scripts bundled by Next.js/webpack in dev mode. + "'self' 'unsafe-inline'" + +const contentSecurityPolicy = [ + `default-src 'none'`, + // Allow JS from within the application and its bundled scripts. + `script-src ${scriptPolicy}`, + // Allow stylesheets within the application or hosted by Google. + // We use inline styles in the React components. + `style-src 'self' https://fonts.googleapis.com 'unsafe-inline'`, + // Allow fonts hosted by Google. + `font-src 'self' https://fonts.googleapis.com https://fonts.gstatic.com`, + // Allow fetch calls to the application's own API, and to Sentry for logging. + `connect-src 'self' https://sentry.io`, + // Allow favicon and other local images. + `img-src 'self'`, + // Prevent the site from being included in an iframe. + `frame-ancestors 'none'`, + // Allow prefetching resources within the application. + `prefetch-src 'self'` +].join('; ') + +/** + * The main application frame. + * + * @param appProps Props provided by Next.js + */ +export default class WebApp extends App { + state: {error?: Error & {statusCode?: number}} = {} + + static async getInitialProps(appContext: AppContext) { + const {ctx} = appContext + + if (ctx.err) { + captureContextException(ctx.err, ctx) + } + + if (ctx.res) { + ctx.res.setHeader('Content-Security-Policy', contentSecurityPolicy) + } + + const pageProps = await App.getInitialProps(appContext) + return {pageProps} + } + + componentDidCatch(err: Error, errorInfo: Record) { + captureException(err, errorInfo) + this.setState({error: err}) + } + + render() { + const {Component, pageProps} = this.props + + if (this.state.error) { + return + } + + return ( + <> + + COVID Modeling + + + + + Axios.get(key).then(resp => resp.data)}} + > + + + + + ) + } +} diff --git a/pages/_document.tsx b/pages/_document.tsx new file mode 100644 index 0000000..6f626bf --- /dev/null +++ b/pages/_document.tsx @@ -0,0 +1,19 @@ +import Document, {Head, Html, Main, NextScript} from 'next/document' +import {catchUnhandledErrors} from '../lib/handle-error' + +catchUnhandledErrors() + +export default class WebDocument extends Document { + render() { + return ( + + + + +

    + + + + ) + } +} diff --git a/pages/about.module.css b/pages/about.module.css new file mode 100644 index 0000000..86b8670 --- /dev/null +++ b/pages/about.module.css @@ -0,0 +1,30 @@ +.AboutPage { + @apply mx-auto; + @apply px-10; + margin-top: 49px; + max-width: 615px; +} + +.AboutPage h1 { + @apply mt-8 mb-4; + @apply font-bold text-3.25xl; +} + +.AboutPage .MainDesc { + @apply mt-8 mb-4; + @apply text-lg; +} + +.AboutPage h2 { + @apply mt-8 mb-4; + @apply font-bold text-lg; +} + +.AboutPage h3 { + @apply mt-8 mb-4; + @apply font-bold; +} + +.AboutPage p { + @apply mt-4; +} diff --git a/pages/about.tsx b/pages/about.tsx new file mode 100644 index 0000000..5a14d79 --- /dev/null +++ b/pages/about.tsx @@ -0,0 +1,98 @@ +import AppFrame from '../components/AppFrame' +import ModelInfo from '../components/ModelInfo' +import models, {ModelSpec} from '../lib/models' +import styles from './about.module.css' + +export default function IndexPage() { + return ( + +
    +

    About

    + +

    + The COVID Modeling UI was developed to help policy makers explore + hypothetical intervention strategies to reduce the impact of COVID-19. + It provides a common interface and language to run simulations against + multiple models at the same time. +

    + +

    How it works

    +

    + Taking into account existing real-world data, policy makers can run + hypothetical simulations to test different combinations and durations + of intervention strategies. This application runs the simulation + through multiple epidemiology models and presents a single overview + with the projected outcomes. +

    +

    + The UI is independent of the models and architected to support the + addition of new models in the future. It is also designed to support + new intervention strategies that policy makers may consider in the + future, like testing procedures and contact tracing. +

    + +

    Access

    +

    + Because some of the models require large amounts of computing power, + access to the COVID Modeling UI is invitation-only at this time. In + the future, it is likely that pre-computed outcome views will be + visible to the public. +

    + +

    Open Source

    +

    + All code is open source and the relevant repositories are available + under the covid-modeling organization on GitHub. Please record all + feedback, suggestions, and improvements as issues or pull requests on + those repositories. +

    + +

    Models

    +

    + The UI was designed in a collaboration between modeling teams at the + following institutions (in alphabetical order): +

    + + {models.basel && ( + <> +

    Basel University

    + + + )} + + {models['mrc-ide-covid-sim'] && ( + <> +

    Imperial College

    + + + )} + +

    Institute of Disease Modelling

    + + + {models.cosmc && ( + <> +

    Stanford University

    + + + )} + +

    + Many other modeling teams generously provided input and feedback. + Microsoft and GitHub provided software engineering assistance to the + expert modeling teams. +

    +
    +
    + ) +} diff --git a/pages/api/callback.ts b/pages/api/callback.ts new file mode 100644 index 0000000..b7d9c6a --- /dev/null +++ b/pages/api/callback.ts @@ -0,0 +1,69 @@ +import {Severity} from '@sentry/node' +import JWT from 'jsonwebtoken' +import {NextApiRequest, NextApiResponse} from 'next' +import 'source-map-support/register' +import {assertEnv} from '../../lib/assertions' +import {isAuthorizedUser} from '../../lib/db' +import {deleteAccessToken, exchangeCode, getUser} from '../../lib/github' +import {catchUnhandledErrors} from '../../lib/handle-error' +import {withDB} from '../../lib/mysql' +import redirect from '../../lib/redirect' +import {initSentry} from '../../lib/sentry' +import {setSessionCookie} from '../../lib/session' + +catchUnhandledErrors() + +const {captureMessage} = initSentry() +const OAUTH_SECRET = assertEnv('OAUTH_SECRET') + +/** + * Handle a GitHub OAuth callback redirect. + */ +export default withDB( + conn => async (req: NextApiRequest, res: NextApiResponse) => { + const code = req.query.code as string + const state = req.query.state as string + + try { + JWT.verify(state, OAUTH_SECRET, {algorithms: ['HS256']}) + } catch (err) { + console.error('OAuth state verification error', err) + captureMessage(`Invalid OAuth state: "${err.message}"`, Severity.Warning) + res.status(400).json({error: 'OAuth state invalid'}) + return + } + + try { + const [client, token] = await exchangeCode(code) + const user = await getUser(client) + + try { + await deleteAccessToken({token}) + } catch (err) { + console.error('Unable to delete OAuth access token') + captureMessage('Unable to delete OAuth access token', Severity.Warning) + } + + if (await isAuthorizedUser(conn, user.login.toLowerCase())) { + setSessionCookie(req, res, {user: {id: user.id, login: user.login}}) + redirect(res, '/simulations') + } else { + redirect(res, '/unauthorized') + } + } catch (err) { + if (err.response) { + console.error( + 'OAuth non-2xx response:', + err.response.status, + err.response.data + ) + } else if (err.request) { + console.error('OAuth request error:', err.message) + } else { + console.error('OAuth error', err) + } + + res.status(500).end('Internal server error') + } + } +) diff --git a/pages/api/login.ts b/pages/api/login.ts new file mode 100644 index 0000000..0e756a1 --- /dev/null +++ b/pages/api/login.ts @@ -0,0 +1,24 @@ +import * as crypto from 'crypto' +import JWT from 'jsonwebtoken' +import * as qs from 'querystring' +import {assertEnv} from '../../lib/assertions' +import dispatch from './util/dispatch' + +const GITHUB_CLIENT_ID = assertEnv('GITHUB_CLIENT_ID') +const OAUTH_SECRET = assertEnv('OAUTH_SECRET') + +export default dispatch('GET', async (req, res) => { + const state = JWT.sign( + {nonce: crypto.randomBytes(32).toString('hex')}, + OAUTH_SECRET, + {algorithm: 'HS256', expiresIn: '10m'} + ) + + const params = qs.encode({ + client_id: GITHUB_CLIENT_ID, + state + }) + + const location = `https://github.com/login/oauth/authorize?${params}` + res.writeHead(307, {location}).end('Temporary redirect') +}) diff --git a/pages/api/logout.ts b/pages/api/logout.ts new file mode 100644 index 0000000..676e37a --- /dev/null +++ b/pages/api/logout.ts @@ -0,0 +1,15 @@ +import {NextApiRequest, NextApiResponse} from 'next' +import 'source-map-support/register' +import {catchUnhandledErrors} from '../../lib/handle-error' +import redirect from '../../lib/redirect' +import {clearSessionCookie} from '../../lib/session' + +catchUnhandledErrors() + +/** + * Log the user out. + */ +export default function logout(req: NextApiRequest, res: NextApiResponse) { + clearSessionCookie(req, res) + redirect(res, '/') +} diff --git a/pages/api/simulations/[id]/case-summary.ts b/pages/api/simulations/[id]/case-summary.ts new file mode 100644 index 0000000..75a7712 --- /dev/null +++ b/pages/api/simulations/[id]/case-summary.ts @@ -0,0 +1,106 @@ +import {DateTime} from 'luxon' +import {last} from '../../../../lib/arrayMath' +import * as db from '../../../../lib/db' +import {withDB} from '../../../../lib/mysql' +import { + ISODate, + ModelOutput, + SeverityMetrics +} from '../../../../types/model-runner' +import {getBlob} from '../../util/blob-storage' +import dispatch from '../../util/dispatch' +import requireSession from '../../util/require-session' + +export type CaseSummary = { + cConf: number + cHosp: number + cDeaths: number + peakDeath: ISODate + peakDailyDeath: number +} + +export default withDB(conn => + requireSession(ssn => + dispatch('GET', async (req, res) => { + const id = parseInt(req.query.id as string) + const sim = await db.getSimulation(conn, ssn.user, {id}) + + if (!sim) { + res.status(404).json({error: 'Not found'}) + return + } + const allResults = await fetchSimulationResults(sim) + + const summarizedResults = allResults.reduce>( + (sum, out) => { + const metrics = out.aggregate.metrics + + // maxIndex finds the last peak value, we want the earliest occurrence (rounded) + const peakDailyDeathIdx = metrics.incDeath.reduce( + ([maxI, maxV], v, i) => + Math.round(v) > maxV ? [i, Math.round(v)] : [maxI, maxV], + [0, 0] + )[0] + + const peakDailyDeath = metrics.incDeath[peakDailyDeathIdx] + const peakDailyDeathTs = out.time.timestamps[peakDailyDeathIdx] + const peakDeath = DateTime.fromISO(out.time.t0).plus({ + days: peakDailyDeathTs + }) + + sum[out.metadata.model.slug] = { + cConf: Math.round(getCumulativeConfirmed(metrics)), + cHosp: Math.round(getCumulativeHospitalized(metrics)), + cDeaths: Math.round(getCumulativeDeaths(metrics)), + peakDeath: peakDeath.toISODate(), + peakDailyDeath: Math.round(peakDailyDeath) + } + + return sum + }, + {} + ) + + res.status(200).json(summarizedResults) + }) + ) +) + +async function fetchSimulationResults( + sim: db.Simulation +): Promise { + // Get all the raw results. + const allRaw = await Promise.all( + sim.model_runs.map(run => + run.results_data ? getBlob(run.results_data) : null + ) + ) + + // Parse all the raw results we found. + return allRaw.filter(isResult).map(r => JSON.parse(r) as ModelOutput) +} + +// Sum of all case types. +function getCumulativeConfirmed(met: SeverityMetrics): number { + return ( + last(met.cumMild) + + last(met.cumILI) + + last(met.cumSARI) + + last(met.cumCritical) + ) +} + +// Sum of all deaths. +function getCumulativeDeaths(met: SeverityMetrics): number { + return met.incDeath.reduce((s, m) => s + m, 0) +} + +// Sum of normal and ICU hospital beds. +function getCumulativeHospitalized(met: SeverityMetrics): number { + return last(met.cumSARI) + last(met.cumCritRecov) + last(met.cumCritical) +} + +function isResult(r: unknown): r is string { + // Type predicate helps the `filter/map` + return r != null +} diff --git a/pages/api/simulations/[id]/download.ts b/pages/api/simulations/[id]/download.ts new file mode 100644 index 0000000..ae6217c --- /dev/null +++ b/pages/api/simulations/[id]/download.ts @@ -0,0 +1,68 @@ +import { + ContainerSASPermissions, + generateBlobSASQueryParameters, + SASProtocol +} from '@azure/storage-blob' +import {DateTime} from 'luxon' +import {getSimulation} from '../../../../lib/db' +import {withDB} from '../../../../lib/mysql' +import { + getContainerClient, + getSharedKeyCredential +} from '../../util/blob-storage' +import dispatch from '../../util/dispatch' +import requireSession from '../../util/require-session' + +export default dispatch( + 'GET', + withDB(conn => + requireSession(ssn => async (req, res) => { + const sim = await getSimulation(conn, ssn.user, { + id: parseInt(req.query.id as string) + }) + + if (!sim) { + res.status(404).json({error: 'Not found'}) + return + } + + const modelRun = sim.model_runs.find( + run => + run.model_slug.toLowerCase() === + (req.query.model as string).toLowerCase() + ) + + if (!modelRun || !modelRun.export_location) { + res.status(404).json({error: 'Not found'}) + return + } + + const url = getSharedBlobURL(modelRun.export_location) + res.writeHead(307, {location: url}).end('Temporary redirect') + }) + ) +) + +function getSharedBlobURL(path: string): string { + const now = new Date() + const expires = DateTime.fromJSDate(now) + .plus({minutes: 10}) + .toJSDate() + + const containerClient = getContainerClient() + + const blob = containerClient.getBlobClient(path) + + const containerSAS = generateBlobSASQueryParameters( + { + containerName: containerClient.containerName, + permissions: ContainerSASPermissions.parse('r'), + startsOn: now, + expiresOn: expires, + protocol: SASProtocol.Https + }, + getSharedKeyCredential() + ).toString() + + return `${blob.url}?${containerSAS}` +} diff --git a/pages/api/simulations/[id]/index.ts b/pages/api/simulations/[id]/index.ts new file mode 100644 index 0000000..316485e --- /dev/null +++ b/pages/api/simulations/[id]/index.ts @@ -0,0 +1,59 @@ +import assert from 'assert' +import {NextApiRequest} from 'next' +import 'source-map-support/register' +import {assertEnv} from '../../../../lib/assertions' +import {updateSimulation} from '../../../../lib/db' +import {catchUnhandledErrors} from '../../../../lib/handle-error' +import {withDB} from '../../../../lib/mysql' +import {SimulationStatus} from '../../../../lib/simulation-types' +import dispatch from '../../util/dispatch' + +catchUnhandledErrors() + +const RUNNER_SHARED_SECRET = assertEnv('RUNNER_SHARED_SECRET', true) + +export default withDB(conn => + dispatch('POST', async (req, res) => { + if (!validateRequest(req)) { + res.status(401).json({error: 'Unauthorized'}) + return + } + + try { + verifyStatus(req.body.status) + + const updated = await updateSimulation( + conn, + req.query.id as string, + req.body.status, + req.body.modelSlug, + req.body.resultsLocation, + req.body.exportLocation, + req.body.workflowRunID + ) + + if (updated) { + res.status(204).end() + } else { + res.status(404).end('Not found') + } + } catch (e) { + res.status(400).json({error: `Could not process message: ${e.message}`}) + } + }) +) + +function verifyStatus(status: SimulationStatus) { + assert( + Object.values(SimulationStatus).includes(status), + new Error(`Invalid status: ${status}`) + ) + return status +} + +function validateRequest(req: NextApiRequest) { + const auth = req.headers.authorization + const authToken = + auth?.startsWith('Bearer ') && auth.slice('Bearer '.length).trim() + return authToken === RUNNER_SHARED_SECRET +} diff --git a/pages/api/simulations/index.ts b/pages/api/simulations/index.ts new file mode 100644 index 0000000..be70b6d --- /dev/null +++ b/pages/api/simulations/index.ts @@ -0,0 +1,137 @@ +import {captureException} from '@sentry/node' +import {ServerlessMysql} from 'serverless-mysql' +import 'source-map-support/register' +import SQL from 'sql-template-strings' +import {assertEnv} from '../../../lib/assertions' +import {toYYYYMMDD} from '../../../lib/dateFunctions' +import { + createSimulation, + getRegionCaseData, + listSimulationSummaries, + updateSimulation +} from '../../../lib/db' +import {createClient, repositoryDispatch} from '../../../lib/github' +import {catchUnhandledErrors} from '../../../lib/handle-error' +import models from '../../../lib/models' +import {withDB} from '../../../lib/mysql' +import { + NewSimulationConfig, + validateSchema +} from '../../../lib/new-simulation-state' +import {Session} from '../../../lib/session' +import {ModelInput, RunStatus} from '../../../types/model-runner' +import dispatch from '../util/dispatch' +import requireSession from '../util/require-session' + +catchUnhandledErrors() + +const CONTROL_REPO_NWO = assertEnv('CONTROL_REPO_NWO', true) +const GITHUB_API_TOKEN = assertEnv('GITHUB_API_TOKEN', true) +const RUNNER_CALLBACK_URL = assertEnv('RUNNER_CALLBACK_URL', true) +const CONTROL_REPO_EVENT_TYPE = assertEnv('CONTROL_REPO_EVENT_TYPE', true) + +export default withDB(conn => + requireSession((session: Session) => + dispatch({ + get: async (_req, res) => { + const summaries = await listSimulationSummaries(conn, session.user.id) + res.status(200).json(summaries) + }, + post: async (req, res) => { + const config: NewSimulationConfig = JSON.parse(req.body) + + const error = validateSchema(config) + if (error) { + res.status(422).json(error) + return + } + + try { + const insertId = await createAndDispatchSimulation( + conn, + session.user, + config + ) + res.status(200).json({id: insertId}) + } catch (err) { + console.error(err) + captureException(err) + res.status(500).json({error: 'Error queueing simulation run'}) + } + } + }) + ) +) + +async function createAndDispatchSimulation( + conn: ServerlessMysql, + user: Session['user'], + config: NewSimulationConfig +): Promise { + await conn.query(SQL`START TRANSACTION`) + + // TODO should we be failing the run of there is no case data? + const {endDate, deaths, confirmed} = await getRegionCaseData( + conn, + config.regionID, + config.subregionID + ) + + const modelInput: Omit = { + region: config.regionID, + subregion: config.subregionID, + parameters: { + r0: typeof config.r0 == 'number' ? config.r0 : null, + calibrationCaseCount: confirmed || 0, + calibrationDeathCount: deaths || 0, + calibrationDate: endDate || toYYYYMMDD(), + interventionPeriods: config.interventionPeriods + } + } + + const {insertId} = await createSimulation(conn, { + region_id: config.regionID, + subregion_id: config.subregionID, + status: RunStatus.Pending, + github_user_id: user.id, + github_user_login: user.login, + label: config.label, + configuration: modelInput + }) + + if (process.env.LOCAL_MODE) { + for (const slug in models) { + await updateSimulation( + conn, + insertId.toString(), + RunStatus.Complete, + slug, + `file://${process.cwd()}/data/result-stub.json`, + '', + undefined + ) + } + } else { + const [owner, name] = CONTROL_REPO_NWO.split('/') + const client = createClient({token: GITHUB_API_TOKEN}) + + try { + await repositoryDispatch(client, owner, name, CONTROL_REPO_EVENT_TYPE, { + id: insertId, + models: Object.entries(models).map(([slug, spec]) => ({ + slug, + imageURL: spec.imageURL + })), + configuration: modelInput, + callbackURL: RUNNER_CALLBACK_URL + }) + } catch (err) { + await conn.query('ROLLBACK') + throw err + } + } + + await conn.query('COMMIT') + + return insertId +} diff --git a/pages/api/types/async-next-api-handler.ts b/pages/api/types/async-next-api-handler.ts new file mode 100644 index 0000000..b89e98f --- /dev/null +++ b/pages/api/types/async-next-api-handler.ts @@ -0,0 +1,5 @@ +import {NextApiHandler} from 'next' + +export type AsyncNextApiHandler = ( + ...args: Parameters> +) => Promise>> diff --git a/pages/api/user/accept-disclaimer.ts b/pages/api/user/accept-disclaimer.ts new file mode 100644 index 0000000..d1f4a05 --- /dev/null +++ b/pages/api/user/accept-disclaimer.ts @@ -0,0 +1,17 @@ +import {updateUserConfig} from '../../../lib/db' +import {withDB} from '../../../lib/mysql' +import dispatch from '../util/dispatch' +import requireSession from '../util/require-session' + +export default withDB(conn => + requireSession(session => + dispatch('POST', async (req, res) => { + await updateUserConfig(conn, session.user.login, config => ({ + ...config, + hasAcceptedDisclaimer: true + })) + + res.json({ok: true}) + }) + ) +) diff --git a/pages/api/util/blob-storage.ts b/pages/api/util/blob-storage.ts new file mode 100644 index 0000000..9e0c0e0 --- /dev/null +++ b/pages/api/util/blob-storage.ts @@ -0,0 +1,41 @@ +import { + BlobServiceClient, + StorageSharedKeyCredential +} from '@azure/storage-blob' +import {assertEnv} from '../../../lib/assertions' + +const BLOB_STORAGE_ACCOUNT = assertEnv('BLOB_STORAGE_ACCOUNT', true) +const BLOB_STORAGE_KEY = assertEnv('BLOB_STORAGE_KEY', true) +const BLOB_STORAGE_CONTAINER = assertEnv('BLOB_STORAGE_CONTAINER', true) + +export function getSharedKeyCredential() { + return new StorageSharedKeyCredential(BLOB_STORAGE_ACCOUNT, BLOB_STORAGE_KEY) +} + +export function getContainerClient() { + const client = new BlobServiceClient( + `https://${BLOB_STORAGE_ACCOUNT}.blob.core.windows.net`, + getSharedKeyCredential() + ) + + return client.getContainerClient(BLOB_STORAGE_CONTAINER) +} + +export async function getBlob(path: string): Promise { + if (process.env.LOCAL_MODE) { + return JSON.stringify(require('../../../data/result-stub.json')) + } + + const blob = getContainerClient().getBlobClient(path) + + try { + const buffer = await blob.downloadToBuffer() + return buffer.toString('utf-8') + } catch (err) { + if (err.statusCode === 404) { + return null + } + + throw err + } +} diff --git a/pages/api/util/dispatch.ts b/pages/api/util/dispatch.ts new file mode 100644 index 0000000..7c1611c --- /dev/null +++ b/pages/api/util/dispatch.ts @@ -0,0 +1,57 @@ +import {NextApiRequest, NextApiResponse} from 'next' +import {AsyncNextApiHandler} from '../types/async-next-api-handler' + +export default function dispatch( + method: string, + handler: AsyncNextApiHandler +): AsyncNextApiHandler + +export default function dispatch( + handlers: Record +): AsyncNextApiHandler + +export default function dispatch( + methodOrHandlers: string | Record, + handler?: AsyncNextApiHandler +) { + return (req: NextApiRequest, res: NextApiResponse) => { + if (typeof methodOrHandlers === 'string') { + return dispatchMethod(methodOrHandlers, handler!)(req, res) + } else { + return dispatchMap(methodOrHandlers)(req, res) + } + } +} + +function dispatchMethod( + method: string, + handler: AsyncNextApiHandler +): AsyncNextApiHandler { + return async (req: NextApiRequest, res: NextApiResponse) => { + if (method.toLowerCase() !== req.method!.toLowerCase()) { + notFound(res) + return + } + + return handler(req, res) + } +} + +function dispatchMap( + handlers: Record +): AsyncNextApiHandler { + return async (req: NextApiRequest, res: NextApiResponse) => { + const handler = handlers[req.method!.toLowerCase()] + + if (!handler) { + notFound(res) + return + } + + return handler(req, res) + } +} + +function notFound(res: NextApiResponse) { + res.status(404).end('Not found') +} diff --git a/pages/api/util/require-session.ts b/pages/api/util/require-session.ts new file mode 100644 index 0000000..791b1c5 --- /dev/null +++ b/pages/api/util/require-session.ts @@ -0,0 +1,16 @@ +import {getSessionCookie, Session} from '../../../lib/session' +import {AsyncNextApiHandler} from '../types/async-next-api-handler' + +export default function requireSession( + cb: (session: Session) => AsyncNextApiHandler +): AsyncNextApiHandler { + return async (req, res) => { + const session = getSessionCookie(req, res) + + if (!session) { + res.status(401).end('Unauthorized') + } else { + return cb(session)(req, res) + } + } +} diff --git a/pages/index.module.css b/pages/index.module.css new file mode 100644 index 0000000..f57144a --- /dev/null +++ b/pages/index.module.css @@ -0,0 +1,17 @@ +.IndexContent { + @apply flex items-center justify-center; + @apply flex-1; + height: 100%; +} + +.LoginLink { + @apply flex items-center justify-center; + @apply bg-black; + @apply px-4 py-3; + @apply rounded; + @apply text-sm text-white; +} + +.LoginLink svg { + @apply mr-4; +} diff --git a/pages/index.tsx b/pages/index.tsx new file mode 100644 index 0000000..bca08d8 --- /dev/null +++ b/pages/index.tsx @@ -0,0 +1,20 @@ +import AppFrame from '../components/AppFrame' +import Button from '../components/Button' +import handleError from '../lib/handle-error' +import {refuteSession} from '../lib/session' +import GitHub from '../svg/GitHub.svg' +import styles from './index.module.css' + +export default function IndexPage() { + return ( + + + + ) +} + +export const getServerSideProps = handleError(refuteSession()) diff --git a/pages/logout.tsx b/pages/logout.tsx new file mode 100644 index 0000000..561960d --- /dev/null +++ b/pages/logout.tsx @@ -0,0 +1,11 @@ +import {GetServerSideProps} from 'next' +import handleError from '../lib/handle-error' +import redirect from '../lib/redirect' + +/* eslint-disable-next-line */ +export default function LogoutPage() {} + +export const getServerSideProps: GetServerSideProps = handleError(async ctx => { + redirect(ctx.res, '/api/logout') + return {props: {}} +}) diff --git a/pages/meta/_boom.tsx b/pages/meta/_boom.tsx new file mode 100644 index 0000000..0221da7 --- /dev/null +++ b/pages/meta/_boom.tsx @@ -0,0 +1,100 @@ +import {GetServerSideProps} from 'next' +import {useContext, useState} from 'react' +import Button from '../../components/Button' +import handleError from '../../lib/handle-error' +import {ensureSession} from '../../lib/session' +import {SentryContext} from '../_app' + +const DEFAULT_MESSAGE = 'Test Error' + +export default function MetaBoomPage() { + const {captureException} = useContext(SentryContext) + const [message, setMessage] = useState(DEFAULT_MESSAGE) + const [type, setType] = useState('catch-and-report') + const [rethrow, setRethrow] = useState(false) + + return ( +
    { + console.log('Testing error with', type) + + e.preventDefault() + + if (type === 'catch-and-report') { + try { + throw new Error(message) + } catch (err) { + captureException(err) + + if (rethrow) { + throw err + } + } + } else { + throw new Error(message) + } + }} + > +

    Test Error

    + + setMessage(e.target.value)} + autoFocus + className="block w-full p-4 rounded mb-4 border outline-none focus:shadow-outline" + /> +
    + setType('catch-and-report')} + /> + + {type === 'catch-and-report' && ( + <> + setRethrow(!rethrow)} + id="rethrow" + /> + + + )} + setType('throw')} + /> + +
    + +
    + +
    + ) +} + +export const getServerSideProps: GetServerSideProps = ensureSession( + handleError(async ctx => { + if (ctx.query['throw-ssp']) { + throw new Error(`${ctx.query.message || DEFAULT_MESSAGE}`) + } + + return {props: {}} + }) +) diff --git a/pages/simulations/[id].tsx b/pages/simulations/[id].tsx new file mode 100644 index 0000000..1756b50 --- /dev/null +++ b/pages/simulations/[id].tsx @@ -0,0 +1,322 @@ +import pick from 'lodash/pick' +import {DateTime} from 'luxon' +import {GetServerSideProps} from 'next' +import NextError from 'next/error' +import Link from 'next/link' +import {useRouter} from 'next/router' +import AppFrame from '../../components/AppFrame' +import CaseSummary from '../../components/CaseSummary' +import ChartWrapper from '../../components/ChartWrapper' +import Disclaimer from '../../components/Disclaimer' +import IncompleteSimulation from '../../components/IncompleteSimulation' +import ModelInfo from '../../components/ModelInfo' +import ModelSelect from '../../components/ModelSelect' +import SimulationInputsTable from '../../components/SimulationInputsTable' +import SimulationList from '../../components/SimulationList' +import btnStyles from '../../components/styles/button.module.css' +import { + getFatalityData, + getSimulation, + getUserConfig, + listSimulationSummaries, + ModelRun, + Simulation, + SimulationSummary +} from '../../lib/db' +import handleError from '../../lib/handle-error' +import * as logging from '../../lib/logging' +import models from '../../lib/models' +import {withDB} from '../../lib/mysql' +import flagAndName from '../../lib/regionEmoji' +import {ensureSession} from '../../lib/session' +import Download from '../../svg/Download.svg' +import {CaseData} from '../../types/case-data' +import {ModelOutput, RunStatus} from '../../types/model-runner' +import {getBlob} from '../api/util/blob-storage' +import styles from './simulation.module.css' + +type Props = { + hasAcceptedDisclaimer: boolean + simulation: Simulation | null + summaries: SimulationSummary[] + result: ModelOutput | null + caseData: CaseData | null + modelRun: ModelRun | null + modelSlug: string + showDebug: boolean +} + +export default function AppFrameWrapper(props: Props) { + return ( + + + + ) +} + +function SimulationPage(props: Props) { + const router = useRouter() + + if (!props.simulation || !props.modelRun) { + return + } + + logProps(props) + + const modelSlug = props.modelRun.model_slug + + const changeModel = (modelSlug: string) => { + router.push('/simulations/[id]', { + pathname: `/simulations/${props.simulation!.id}`, + query: {model: modelSlug} + }) + } + + return ( +
    +
    + + +
    + {!props.hasAcceptedDisclaimer ? ( + + ) : ( +
    +
    +
    +
    + {flagAndName( + props.simulation.region_id, + props.simulation.region_name + )}{' '} + {props.simulation.subregion_name + ? `/ ${props.simulation.subregion_name}` + : null}{' '} + · Created{' '} + {DateTime.fromISO(props.simulation.created_at).toRelative()} +
    + +

    + {props.simulation.label || 'Untitled Simulation'} +

    +
    + + {props.modelRun.export_location ? ( + + ) : null} +
    + + {props.modelRun.status !== RunStatus.Complete ? ( +
    + r.model_slug + )} + onChange={changeModel} + /> +
    + ) : null} + + {props.modelRun.status === RunStatus.Pending ? ( + + ) : props.modelRun.status === RunStatus.InProgress ? ( + + ) : props.modelRun.status === RunStatus.Failed ? ( + + ) : !props.result || !props.caseData ? ( + + ) : ( + <> + + + + + )} +
    + )} + + + +

    Model information

    + +
    + {Object.entries(models).map(([slug, modelSpec]) => ( + + ))} +
    +
    +
    +
    + ) +} + +export const getServerSideProps: GetServerSideProps = handleError( + withDB(conn => + ensureSession(async (ctx, session) => { + const id = Number(ctx.params?.id) + const modelSlug = Array.isArray(ctx.query.model) + ? ctx.query.model[0] || 'mrc-ide-covid-sim' + : ctx.query.model || 'mrc-ide-covid-sim' + + const showDebug = Boolean(ctx.query.debug) + + if (id == null || isNaN(id)) { + const props: Props = { + hasAcceptedDisclaimer: false, + simulation: null, + summaries: [], + result: null, + caseData: null, + modelRun: null, + modelSlug, + showDebug + } + + return {props} + } + + const simulation = await getSimulation(conn, session.user, {id}) + const modelRun = simulation?.model_runs.find( + run => run.model_slug === modelSlug + ) + const summaries = await listSimulationSummaries(conn, session.user.id) + + if (!simulation || !modelRun) { + const props: Props = { + hasAcceptedDisclaimer: false, + simulation: null, + summaries: [], + result: null, + caseData: null, + modelRun: null, + modelSlug, + showDebug + } + + return {props} + } + + let result: ModelOutput | null = null + let caseData: CaseData | null = null + if (modelRun.status === RunStatus.Complete) { + const resultsData = simulation.model_runs.find( + run => run.model_slug === modelSlug + )?.results_data + const rawResult = resultsData ? await getBlob(resultsData) : null + + if (rawResult) { + result = JSON.parse(rawResult) as ModelOutput + + caseData = await getFatalityData( + conn, + simulation.region_id, + simulation.subregion_id, + result.time.t0, + result.time.extent + ) + } + } + + if (!Object.keys(models).includes(modelSlug)) { + // invalid model + ctx.res.writeHead(404).end() + } + + const userConf = await getUserConfig(conn, session.user.login) + + const props: Props = { + hasAcceptedDisclaimer: Boolean(userConf.hasAcceptedDisclaimer), + simulation, + summaries, + result, + caseData, + modelRun, + modelSlug, + showDebug + } + + return {props} + }) + ) +) + +function logProps(props: Props) { + if (!process.browser) return + if (!props.showDebug) return + + logging.group(`Simulation Results Data (${props.modelSlug})`, () => { + logging.logValue( + 'Simulation Metadata', + pick(props.simulation, [ + 'id', + 'status', + 'region_name', + 'region_id', + 'subregion_name', + 'subregion_id', + 'github_user_id', + 'github_user_login', + 'created_at', + 'updated_at' + ]) + ) + logging.logValue( + 'Configuration Parameters', + props.simulation?.configuration.parameters + ) + logging.logValue('Models Runs', props.simulation?.model_runs) + logging.logValue('Result Metadata', props.result?.metadata) + + logging.group('Raw Props', () => console.log(props)) + }) +} diff --git a/pages/simulations/index.module.css b/pages/simulations/index.module.css new file mode 100644 index 0000000..be6a005 --- /dev/null +++ b/pages/simulations/index.module.css @@ -0,0 +1,9 @@ +.wrapper { + @apply flex flex-col; + @apply h-full; +} + +.container { + @apply flex flex-col items-center justify-center; + @apply flex-1; +} diff --git a/pages/simulations/index.tsx b/pages/simulations/index.tsx new file mode 100644 index 0000000..c859bd5 --- /dev/null +++ b/pages/simulations/index.tsx @@ -0,0 +1,62 @@ +import {GetServerSideProps} from 'next' +import Link from 'next/link' +import {useRouter} from 'next/router' +import AppFrame from '../../components/AppFrame' +import button from '../../components/styles/button.module.css' +import * as db from '../../lib/db' +import {SimulationSummary} from '../../lib/db' +import handleError from '../../lib/handle-error' +import {withDB} from '../../lib/mysql' +import {ensureSession} from '../../lib/session' +import styles from './index.module.css' + +type Props = { + lastSimulation: SimulationSummary | null +} + +export default function SimulationsIndexPage(props: Props) { + const router = useRouter() + + if (props.lastSimulation && process.browser) { + router.push('/simulations/[id]', `/simulations/${props.lastSimulation.id}`) + return null + } + + return ( + +
    +
    +

    No simulations created yet

    + +

    + Get started by creating a new simulation for this region. After your + first simulation is created, the results will be visible here. +

    + + + + + Create new simulation + + +
    +
    +
    + ) +} + +export const getServerSideProps: GetServerSideProps = handleError( + withDB(conn => + ensureSession(async (ctx, session) => { + const lastSimulation = + ( + await db.listSimulationSummaries(conn, session.user.id, {limit: 1}) + )[0] || null + + return { + props: { + lastSimulation + } + } + }) + ) +) diff --git a/pages/simulations/new.module.css b/pages/simulations/new.module.css new file mode 100644 index 0000000..66f121a --- /dev/null +++ b/pages/simulations/new.module.css @@ -0,0 +1,77 @@ +.NewSimulationPage { + @apply mx-auto; + margin-top: 49px; + max-width: 595px; +} + +.NewSimulationPage h1 { + @apply mt-2 mb-14; + @apply font-bold; + @apply text-2xl; +} + +.ApplicationConfig { + @apply flex items-start; + @apply mb-8; + @apply text-sm; +} + +.ApplicationConfigContent { + @apply flex-1; + @apply ml-3; +} + +.ApplicationConfigContent p { + @apply text-light-gray; +} + +.ApplicationConfig h3 { + @apply font-semibold; +} + +.ApplicationConfigParams { + @apply flex; +} + +.NewSubmit { + width: 100%; +} + +.NewSubmit>span { + width: 100%; +} + +.NewConfigurationTitle { + @apply my-2; + @apply mx-1; +} + +.NewConfigurationTitle h3 { + @apply font-semibold; + @apply text-base; + @apply mt-3; +} + +.NewConfigurationTitle p { + color: #52555F; +} + +.CalibrationControl { + @apply border-solid; + @apply border; + @apply p-3; + @apply mb-2; + display: inline-block; + width: 100%; +} + +.CalibrationControl input, +.CalibrationControl>div { + width: 100%; +} + +.Error.CalibrationControl { + @apply border-solid; + @apply border; + border-color: red; +} diff --git a/pages/simulations/new.tsx b/pages/simulations/new.tsx new file mode 100644 index 0000000..827c21b --- /dev/null +++ b/pages/simulations/new.tsx @@ -0,0 +1,43 @@ +import AppFrame from '../../components/AppFrame' +import NewSimulationForm from '../../components/simulation-form/NewSimulationForm' +import * as db from '../../lib/db' +import handleError from '../../lib/handle-error' +import {withDB} from '../../lib/mysql' +import {ensureSession} from '../../lib/session' +import {InterventionMap} from '../../lib/simulation-types' +import {RegionMap} from '../../types/regions' + +interface Props { + regions: RegionMap + interventions: InterventionMap +} + +export default function NewSimulationPage(props: Props) { + return ( + + + + ) +} + +let interventions: InterventionMap + +export const getServerSideProps = handleError( + withDB(conn => + ensureSession(async () => { + const regions = require('../../data/regions.json') + + // Cache intervention data for the life of the server process + if (!interventions) { + interventions = await db.getInterventionData(conn) + } + + return { + props: { + regions, + interventions + } + } + }) + ) +) diff --git a/pages/simulations/simulation.module.css b/pages/simulations/simulation.module.css new file mode 100644 index 0000000..af5cd18 --- /dev/null +++ b/pages/simulations/simulation.module.css @@ -0,0 +1,65 @@ +.SimulationPage { + @apply mx-auto; + @apply px-8 pt-4 pb-8; + @apply h-full; +} + +.SimulationBody { + @apply flex flex-wrap; + @apply items-stretch; +} + +.SimulationLeft { + @apply mr-8; + @apply flex-none; + @apply w-80; +} + +.SimulationRight { + @apply flex-1; +} + +.Assumptions { + @apply mt-16; +} + +.AssumptionsLinks { + @apply mt-6; +} + +.AssumptionsLinks a { + @apply mr-4 py-3 px-4; + @apply text-sm; + @apply border rounded; +} + +.regionHeading { + @apply text-sm; + @apply text-gray-600; +} + +.modelInfoWrapper { + @apply grid-cols-1; + + display: grid; + grid-column-gap: 1.5rem; + grid-row-gap: 1.5rem; +} + +@screen sm { + .SimulationRight { + @apply min-w-full; + } +} + +@screen md { + .modelInfoWrapper { + @apply grid-cols-2; + } +} + +@screen lg { + .SimulationRight { + @apply min-w-0; + } +} diff --git a/pages/unauthorized.tsx b/pages/unauthorized.tsx new file mode 100644 index 0000000..cb31157 --- /dev/null +++ b/pages/unauthorized.tsx @@ -0,0 +1,14 @@ +import Error from 'next/error' +import handleError from '../lib/handle-error' +import {refuteSession} from '../lib/session' + +export default function RequestAccessPage() { + return ( + + ) +} + +export const getServerSideProps = handleError(refuteSession()) diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..3427537 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,16 @@ +/** @type {(string | [string, object])[]} */ +const plugins = ['postcss-import', 'tailwindcss', 'autoprefixer'] + +if (process.env.NODE_ENV === 'production') { + plugins.push([ + '@fullhuman/postcss-purgecss', + { + content: ['**/*.tsx', '**/*.module.css', 'css/app.css'], + whitelistPatterns: [/^ReactVirtualized/, /bg-*/, /text-severity*/] + } + ]) +} + +module.exports = { + plugins +} diff --git a/public/images/google.png b/public/images/google.png new file mode 100644 index 0000000000000000000000000000000000000000..1bb121c77a675c59f6250b4b7245a5d8012079a3 GIT binary patch literal 1236 zcmV;_1S|WAP)Ko9M8RK*|v8dlo?#_H?zH{!( zH#55kae|79RBr~X1H@{QVih2z%niZ-_ji&7k2!wmJ{^xP#tInQSdbC$TVDdA=Q%hN z;s%`|pm!Z@u8&~81$ZippCf=b5pglhAA>})#?kH?f_Mu!Us{@Fv(rIN{va$2LPW6B z(cbe;%mOY}mE5jr(8gbv!vcZ}aH~QVWVX64hxd!{hOf$*BQt`p|p@cUk zHS7Bbv@8z65ni4a3&Ec}hm+C*i%?P_kg-b^nI+Hd{LO8qHC@1HW$AWy?G}iZ7@NMr6oT(nNZY2#H1;TBylIt)$;HfBCA_es5gCYe=fZdL^o+chZ5Caz~3i1?- zx-Xst<6&>9OglYFK4%QzXu6`VL}b*sib>`A+_clU{YvS05&Ho zxuG9yRn{Y6p5CxJFG705Ac%~BLF#Mh(>!}1fnZO;h8Z24+}hD3wFt00n#2v^MJ zhP9NO?MIz!4?OZqS5ysxHn#AUXffGkGy(ST63;8)WX@#lldyI{ve8H`J-z79_oep2g%n*c)k zV-YztW)FamKi#;_b0Kl-3hG!?|-v7FJ@ z3gWLoL}Rt&0nn1pg5_#HpiCL1pjOebJN>We(Po1R57j;^koGdIzyd)8b3C?@z4!n8 zimf-iKjKt7KdxJ$s`5Ao a.date - b.date) + .map(row => { + const regionID = 'US' + const subregionID = `US-${row.state}` + + // Date is an integer with digits YYYYMMDD + const dateString = row.date.toString() + const date = new Date( + dateString.slice(0, 4), + parseInt(dateString.slice(4, 6), 10) - 1, + dateString.slice(6) + ) + const dateSQL = DateTime.fromJSDate(date).toISODate() + + // Fill in null values with the last non-null value or zero + const current = + metricsByState[row.state] || (metricsByState[row.state] = {}) + current.confirmed = row.positive || current.confirmed || 0 + current.recovered = row.recovered || current.recovered || 0 + current.deaths = row.death || current.deaths || 0 + + return [ + regionID, + subregionID, + dateSQL, + current.confirmed, + current.recovered, + current.deaths + ] + }) + + // Parse the UK case data + const ukCaseRecordsByDate = {} + for (const [metric, csv] of [ + ['confirmed', globalConfirmedCSV], + ['recovered', globalRecoveredCSV], + ['deaths', globalDeathsCSV] + ]) { + // Parse the CSV and find the row that corresponds to the entire UK + const data = parseCSV(csv) + const ukRow = data.findIndex( + row => row[0] === '' && row[1] === 'United Kingdom' + ) + if (ukRow === -1) { + throw new Error(`No United Kingdom row in ${metric} dataset`) + } + + // Combine the data from the per-metric CSVs by building up an object + // whose keys are dates, and whose values contain all the metrics. + const METADATA_COLS = 4 + for (let i = METADATA_COLS; i < data[0].length; i++) { + const dateString = data[0][i] + let record = ukCaseRecordsByDate[dateString] + if (!record) { + // Date is a string with format MM/DD/YY + const [month, day, year] = dateString.split('/') + const date = new Date('20' + year, parseInt(month, 10) - 1, day) + record = ukCaseRecordsByDate[dateString] = { + date: DateTime.fromJSDate(date).toISODate() + } + } + record[metric] = parseFloat(data[ukRow][i], 10) + } + } + const ukCaseRecords = Object.values(ukCaseRecordsByDate).map(r => { + return ['GB', null, r.date, r.confirmed, r.recovered, r.deaths] + }) + + const caseRecords = usCaseRecords.concat(ukCaseRecords) + + // Parse the US intervention data + const usInterventionRecords = [] + for (const row of d3.csvParse(usInterventionsCSV)) { + if (row.StatePolicy && row.StatePostal && row.DateEnacted) { + const regionId = 'US' + const subregionId = `US-${row.StatePostal}` + const policy = row.StatePolicy + const notes = row.PolicyCodingNotes + const source = row.PolicySource || null + const issueDate = row.DateIssued || null + const startDate = row.DateEnacted + const easeDate = row.DateEased || null + const expirationDate = row.DateExpiry || null + const endDate = row.DateEnded || null + usInterventionRecords.push([ + regionId, + subregionId, + policy, + notes, + source, + issueDate, + startDate, + easeDate, + expirationDate, + endDate + ]) + } + } + + if (cacheDir) { + fs.writeFileSync( + path.join(cacheDir, 'case-data.json'), + JSON.stringify(caseRecords, null, 2), + 'utf8' + ) + + fs.writeFileSync( + path.join(cacheDir, 'intervention-data.json'), + JSON.stringify(usInterventionRecords, null, 2), + 'utf8' + ) + } + + try { + await db.query('START TRANSACTION') + + // Populate the case_data table + console.log(`Saving ${caseRecords.length} records to case_data table...`) + await db.query('CREATE TABLE case_data_import LIKE case_data') + await db.query( + ` + INSERT INTO case_data_import + (region_id, subregion_id, date, confirmed, recovered, deaths) + VALUES + ? + `, + [caseRecords] + ) + await db.query( + 'RENAME TABLE case_data TO case_data_old, case_data_import TO case_data' + ) + + // Populate the intervention_data table + await db.query( + 'CREATE TABLE intervention_data_import LIKE intervention_data' + ) + await db.query( + ` + INSERT INTO intervention_data_import + ( + region_id, subregion_id, policy, notes, source, + issue_date, start_date, ease_date, expiration_date, end_date + ) + VALUES + ? + `, + [usInterventionRecords] + ) + await db.query( + 'RENAME TABLE intervention_data TO intervention_data_old, intervention_data_import TO intervention_data' + ) + + await db.query('COMMIT') + } finally { + await db.query('DROP TABLE IF EXISTS case_data_old') + await db.query('DROP TABLE IF EXISTS case_data_import') + await db.query('DROP TABLE IF EXISTS intervention_data_old') + await db.query('DROP TABLE IF EXISTS intervention_data_import') + } +} + +async function fetchCached(url, cacheDir) { + const cacheFilename = path.basename(url) + const cachePath = cacheDir && path.join(cacheDir, cacheFilename) + + if (cachePath && fs.existsSync(cachePath)) { + console.log(`Using existing download ${cachePath}...`) + return fs.readFileSync(cachePath, 'utf8') + } else { + console.log(`Downloading from ${url}...`) + let result = '' + await new Promise((resolve, reject) => { + fetch(url) + function fetch(url) { + https.get(url, res => { + // Follow path redirects + if (res.statusCode === 301 || res.statusCode === 302) { + const oldURL = URL.parse(url) + const locationURL = URL.parse(res.headers.location) + oldURL.path = locationURL.path + oldURL.pathname = locationURL.pathname + oldURL.href = null + const redirectURL = URL.format(oldURL) + console.log(`Redirected\n from ${url}\n to ${redirectURL}...`) + fetch(redirectURL) + } else { + res.on('data', chunk => (result += chunk)) + res.on('end', resolve) + res.on('error', reject) + } + }) + } + }) + if (cachePath) { + console.log(`Saving download to ${cachePath}...`) + fs.writeFileSync(cachePath, result, 'utf8') + } + return result + } +} + +function parseCSV(data) { + return data.split('\n').map(line => line.split(',')) +} + +main() + .then(() => { + process.exit(0) + }) + .catch(error => { + console.error(error) + process.exit(1) + }) diff --git a/script/server b/script/server new file mode 100755 index 0000000..ea5a8c8 --- /dev/null +++ b/script/server @@ -0,0 +1,5 @@ +#!/bin/bash + +set -e + +docker-compose up diff --git a/script/setup b/script/setup new file mode 100755 index 0000000..75fe2f9 --- /dev/null +++ b/script/setup @@ -0,0 +1,95 @@ +#!/usr/bin/env node + +const crypto = require('crypto') +const fs = require('fs') +const path = require('path') +const prompts = require('prompts') +const yaml = require('js-yaml') +const envfile = require('envfile') +const currentEnv = readEnv() + +/** + * @typedef {Object} spec + * @property {string} description + * @property {boolean | undefined} local_mode + * @property {boolean | undefined} secret + * @property {string | undefined} default + * @property {generate | undefined} generate + */ + +/** + * @typedef {Object} generate + * @property {boolean | undefined} secret + */ + +/** + * @type {Record} + */ +const envSpec = yaml.load( + fs.readFileSync(path.join(__dirname, '../env.yml')).toString() +) + +async function main() { + const {LOCAL_MODE} = await prompts({ + type: 'confirm', + name: 'LOCAL_MODE', + message: 'Run in local mode, where remote data is stubbed?' + }) + + const result = LOCAL_MODE ? {...currentEnv, LOCAL_MODE: true} : currentEnv + + for (const key in envSpec) { + const spec = envSpec[key] + + if (key === 'LOCAL_MODE') { + continue + } + + if (LOCAL_MODE && spec.local_mode === false) { + continue + } + + let defaultValue = currentEnv[key] || spec.default + + if (!defaultValue && spec.generate && spec.generate.secret) { + defaultValue = crypto.randomBytes(32).toString('hex') + } + + const response = await prompts({ + type: 'text', + name: key, + message: spec.description, + initial: defaultValue, + style: spec.secret ? 'password' : 'default' + }) + + result[key] = response[key] + } + + const finalEnv = Object.entries(result).reduce( + (dotenv, [key, value]) => dotenv + `${key}=${value}\n`, + `` + ) + + fs.writeFileSync(path.join(__dirname, '../.env'), finalEnv) +} + +main() + .then(() => { + process.exit(0) + }) + .catch(err => { + console.error(err) + process.exit(1) + }) + +function readEnv() { + let env + try { + env = fs.readFileSync(path.join(__dirname, '../.env')).toString() + } catch (err) { + return {} + } + + return envfile.parseSync(env) +} diff --git a/script/staging-alias b/script/staging-alias new file mode 100755 index 0000000..df55117 --- /dev/null +++ b/script/staging-alias @@ -0,0 +1,5 @@ +#!/bin/bash + +set -e + +npx now alias $1 staging.covid-modeling.org diff --git a/svg/Check.svg b/svg/Check.svg new file mode 100644 index 0000000..0bf0edd --- /dev/null +++ b/svg/Check.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/Chevron.svg b/svg/Chevron.svg new file mode 100644 index 0000000..e5eb8e7 --- /dev/null +++ b/svg/Chevron.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/CircleCheck.svg b/svg/CircleCheck.svg new file mode 100644 index 0000000..0625651 --- /dev/null +++ b/svg/CircleCheck.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/Clock.svg b/svg/Clock.svg new file mode 100644 index 0000000..d586111 --- /dev/null +++ b/svg/Clock.svg @@ -0,0 +1,4 @@ + + + + diff --git a/svg/Code.svg b/svg/Code.svg new file mode 100644 index 0000000..5b668ff --- /dev/null +++ b/svg/Code.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/Cross.svg b/svg/Cross.svg new file mode 100644 index 0000000..045dd02 --- /dev/null +++ b/svg/Cross.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/Descartes.svg b/svg/Descartes.svg new file mode 100644 index 0000000..b992850 --- /dev/null +++ b/svg/Descartes.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/svg/Dot.svg b/svg/Dot.svg new file mode 100644 index 0000000..e0aaac1 --- /dev/null +++ b/svg/Dot.svg @@ -0,0 +1 @@ + diff --git a/svg/Download.svg b/svg/Download.svg new file mode 100644 index 0000000..250a1d0 --- /dev/null +++ b/svg/Download.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/Failure.svg b/svg/Failure.svg new file mode 100644 index 0000000..8dc8806 --- /dev/null +++ b/svg/Failure.svg @@ -0,0 +1,4 @@ + + + + diff --git a/svg/Fork.svg b/svg/Fork.svg new file mode 100644 index 0000000..b043b94 --- /dev/null +++ b/svg/Fork.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/GitHub.svg b/svg/GitHub.svg new file mode 100644 index 0000000..b2fd5be --- /dev/null +++ b/svg/GitHub.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/Info.svg b/svg/Info.svg new file mode 100644 index 0000000..6c5936c --- /dev/null +++ b/svg/Info.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/Link.svg b/svg/Link.svg new file mode 100644 index 0000000..c9d3510 --- /dev/null +++ b/svg/Link.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/Plus.svg b/svg/Plus.svg new file mode 100644 index 0000000..1a3fa6c --- /dev/null +++ b/svg/Plus.svg @@ -0,0 +1,4 @@ + + + + diff --git a/svg/Pushpin.svg b/svg/Pushpin.svg new file mode 100644 index 0000000..01fafa3 --- /dev/null +++ b/svg/Pushpin.svg @@ -0,0 +1,7 @@ + + + diff --git a/svg/Share.svg b/svg/Share.svg new file mode 100644 index 0000000..646e53b --- /dev/null +++ b/svg/Share.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/SocialDistancingGraphic.svg b/svg/SocialDistancingGraphic.svg new file mode 100644 index 0000000..c07a008 --- /dev/null +++ b/svg/SocialDistancingGraphic.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/svg/StatusSpinner.svg b/svg/StatusSpinner.svg new file mode 100644 index 0000000..09ad440 --- /dev/null +++ b/svg/StatusSpinner.svg @@ -0,0 +1,4 @@ + + + + diff --git a/svg/Success.svg b/svg/Success.svg new file mode 100644 index 0000000..d87f760 --- /dev/null +++ b/svg/Success.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/Trash.svg b/svg/Trash.svg new file mode 100644 index 0000000..6e5af27 --- /dev/null +++ b/svg/Trash.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/Unacast.svg b/svg/Unacast.svg new file mode 100644 index 0000000..474ad62 --- /dev/null +++ b/svg/Unacast.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/svg/Warn.svg b/svg/Warn.svg new file mode 100644 index 0000000..6956b20 --- /dev/null +++ b/svg/Warn.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/Zip.svg b/svg/Zip.svg new file mode 100644 index 0000000..13c81d5 --- /dev/null +++ b/svg/Zip.svg @@ -0,0 +1,3 @@ + + + diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..d2f4bd1 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,102 @@ +module.exports = { + theme: { + extend: { + screens: { + '2xl': '1408px' + }, + colors: { + black: '#050505', + 'light-blue': '#f1f8ff', + gray: { + default: '#f7f7f9', + light: '#9194A1', + lightest: '#EFF0F5', + '100': '#f5f5f5', + '200': '#eeeeee', + '300': '#e0e0e0', + '400': '#bdbdbd', + '500': '#9e9e9e', + '600': '#757575', + '700': '#616161', + '800': '#424242', + '900': '#212121' + }, + 'light-gray': '#525560', + purple: '#6F42C1', + red: '#D73A49', + green: '#28A745', + orange: { + default: '#f66a0a', + '100': '#fff8f2', + '200': '#eee6d5', + '300': '#d15704', + '400': '#a04100' + }, + blue: { + default: '#0366D6', + light: '#d9e8f9' + }, + pink: '#D03592', + severity: { + mild: '#fffdef', + moderate: '#ffebda', + aggressive: '#ffdce0' + }, + severitytext: { + mild: '#735c0f;', + moderate: '#a04100', + aggressive: '#86181d' + }, + severityhover: { + mild: '#FFF5B1', + moderate: '#FFD1AC', + aggressive: '#FDAEB7' + } + }, + spacing: { + '11': '2.75rem', + '14': '3.5rem', + '59': '14.75rem', + '80': '20rem', + '102': '25.5rem', + '128': '32rem' + }, + maxHeight: { + '128': '32rem' + }, + fontFamily: { + sans: [ + 'system-ui', + '-apple-system', + 'BlinkMacSystemFont', + '"Segoe UI"', + 'Roboto', + '"Helvetica Neue"', + 'Arial', + '"Noto Sans"', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + '"Noto Color Emoji"' + ], + serif: ['Georgia', 'Cambria', '"Times New Roman"', 'Times', 'serif'], + mono: [ + 'Anonymous Pro', + 'Menlo', + 'Monaco', + 'Consolas', + '"Liberation Mono"', + '"Courier New"', + 'monospace' + ] + }, + fontSize: { + xxs: '0.65rem', + '3.2xl': '1.25rem', + '3.25xl': '1.5rem', + '3.5xl': '2rem' + } + } + } +} diff --git a/test/dateFunctions.test.ts b/test/dateFunctions.test.ts new file mode 100644 index 0000000..e2d2261 --- /dev/null +++ b/test/dateFunctions.test.ts @@ -0,0 +1,73 @@ +import {addDays, isValidDate, maxDate, toYYYYMMDD} from '../lib/dateFunctions' + +describe('dateFunctions', () => { + describe('toYYYYMMDD', () => { + for (let i = -11; i <= 12; i++) { + // no matter what time zone we're in, we should return the same date + const mockTzOffset = i * 60 + it(`should handle no arguments (using tz offset ${mockTzOffset})`, () => { + const expectedDate = new Date() + expectedDate.setMinutes(expectedDate.getMinutes() - mockTzOffset) + spyOn(Date.prototype, 'getTimezoneOffset').and.returnValue(mockTzOffset) + expect(toYYYYMMDD()).toBe(expectedDate.toISOString().substring(0, 10)) + }) + + it(`should handle invalid arguments (using tz offset ${mockTzOffset})`, () => { + const expectedDate = new Date() + expectedDate.setMinutes(expectedDate.getMinutes() - mockTzOffset) + spyOn(Date.prototype, 'getTimezoneOffset').and.returnValue(mockTzOffset) + expect(toYYYYMMDD(new Date('hucairz'))).toBe( + expectedDate.toISOString().substring(0, 10) + ) + }) + + it(`should handle an argument (using tz offset ${mockTzOffset})`, () => { + const expectedDate = new Date(0) + const actualDate = toYYYYMMDD(expectedDate) + expect(actualDate).toBe(expectedDate.toISOString().substring(0, 10)) + }) + } + }) + + describe('addDays', () => { + it('should add days to a date', () => { + let date = '2020-02-28' + expect(addDays(date, 1)).toEqual('2020-02-29') + date = '2020-02-29' + expect(addDays(date, 2)).toEqual('2020-03-02') + }) + }) + + describe('isValidDate', () => { + it('should check for a valid dae', () => { + expect(isValidDate('hucairz')).toBe(false) + expect(isValidDate((undefined as unknown) as string)).toBe(false) + expect(isValidDate((null as unknown) as string)).toBe(false) + expect(isValidDate('1234-56-78')).toBe(false) + + expect(isValidDate('2001-09-11')).toBe(true) + }) + }) + + describe('maxDate', () => { + it('should handle empty', () => { + expect(maxDate()).toBe('') + expect(maxDate('')).toBe('') + expect(maxDate('', '')).toBe('') + }) + it('should handle an array of dates', () => { + expect(maxDate('2020-03-01')).toBe('2020-03-01') + expect(maxDate('2020-03-01', '2020-04-01')).toBe('2020-04-01') + expect(maxDate('2020-04-01', '2020-03-01')).toBe('2020-04-01') + expect(maxDate('2020-04-01', '2020-03-01', '2020-03-30')).toBe( + '2020-04-01' + ) + expect( + maxDate('', '2020-04-01', '2020-03-01', '', '2020-03-30', '') + ).toBe('2020-04-01') + }) + }) +}) + +// Avoid tsc from complaining about this file not being a module +export {} diff --git a/test/new-simulation-state.test.ts b/test/new-simulation-state.test.ts new file mode 100644 index 0000000..ed2d252 --- /dev/null +++ b/test/new-simulation-state.test.ts @@ -0,0 +1,337 @@ +import {addDays, toYYYYMMDD} from '../lib/dateFunctions' +import { + getInterventionsEnd, + getNextInterventionPeriodStart, + initializeSimulationState, + Intensity, + NewSimulationState +} from '../lib/new-simulation-state' +import {InterventionMap, Interventions} from '../lib/simulation-types' + +describe('new-simulation-state', () => { + describe('initializeSimulationState', () => { + it('should initialize state with empty interventions', () => { + const state = initializeSimulationState( + createMockRegions(), + createMockInterventions() + ) + expect(state).toEqual({ + interventionPeriods: [], + label: createMockLabel(), + ...createMockRegions() + }) + }) + + it('should initialize state with two interventions of increasing intensity', () => { + const state = initializeSimulationState( + createMockRegions(), + createMockInterventions({ + GathRestrict10: { + dateEnacted: '2020-03-13' + } as any, + StateCurfew: { + dateEnacted: '2020-03-23' + } as any + }) + ) + expect(state).toEqual({ + label: createMockLabel(), + ...createMockRegions(), + interventionPeriods: [ + { + startDate: '2020-03-13', + reductionPopulationContact: 33, + isAutoGenerated: true, + voluntaryHomeQuarantine: Intensity.Aggressive, + caseIsolation: Intensity.Aggressive, + socialDistancing: Intensity.Mild + }, + { + startDate: '2020-03-23', + reductionPopulationContact: 48, + isAutoGenerated: true, + voluntaryHomeQuarantine: Intensity.Aggressive, + caseIsolation: Intensity.Aggressive, + socialDistancing: Intensity.Moderate + } + ] + }) + }) + + it('should initialize state with two interventions second merges with first', () => { + const state = initializeSimulationState( + createMockRegions(), + createMockInterventions({ + GathRestrict10: { + dateEnacted: '2020-03-13' + } as any, + SchoolClose: { + dateEnacted: '2020-03-23' + } as any + }) + ) + expect(state).toEqual({ + label: createMockLabel(), + ...createMockRegions(), + interventionPeriods: [ + { + startDate: '2020-03-13', + reductionPopulationContact: 33, + isAutoGenerated: true, + voluntaryHomeQuarantine: Intensity.Aggressive, + caseIsolation: Intensity.Aggressive, + socialDistancing: Intensity.Mild + }, + { + startDate: '2020-03-23', + reductionPopulationContact: 44, + isAutoGenerated: true, + voluntaryHomeQuarantine: Intensity.Aggressive, + caseIsolation: Intensity.Aggressive, + socialDistancing: Intensity.Mild, + schoolClosure: Intensity.Aggressive + } + ] + }) + }) + + it('should initialize state with two interventions on the same date, second overriding the first', () => { + // multiple periods enacted on same day, just use the most intense. + const state = initializeSimulationState( + createMockRegions(), + createMockInterventions({ + GathRestrict10: { + dateEnacted: '2020-03-13' + } as any, + StateCurfew: { + dateEnacted: '2020-03-13' + } as any + }) + ) + expect(state).toEqual({ + label: createMockLabel(), + ...createMockRegions(), + interventionPeriods: [ + { + startDate: '2020-03-13', + reductionPopulationContact: 48, + isAutoGenerated: true, + voluntaryHomeQuarantine: Intensity.Aggressive, + caseIsolation: Intensity.Aggressive, + socialDistancing: Intensity.Moderate + } + ] + }) + }) + + it('should initialize state with two interventions on the different dates, first overriding the second', () => { + // GathRestrict10 and GathRestrict10 are the same intensity, so our periods have not changed. Just use + // the first period. + const state = initializeSimulationState( + createMockRegions(), + createMockInterventions({ + GathRestrict10: { + dateEnacted: '2020-03-13' + } as any + }) + ) + expect(state).toEqual({ + label: createMockLabel(), + ...createMockRegions(), + interventionPeriods: [ + { + startDate: '2020-03-13', + reductionPopulationContact: 33, + isAutoGenerated: true, + voluntaryHomeQuarantine: Intensity.Aggressive, + caseIsolation: Intensity.Aggressive, + socialDistancing: Intensity.Mild + } + ] + }) + }) + + it('should handle Alabama interventions', () => { + const state = initializeSimulationState( + createMockRegions(), + createMockInterventions(createAlabamaInterventions()) + ) + expect(state).toEqual({ + label: createMockLabel(), + ...createMockRegions(), + interventionPeriods: [ + { + startDate: '2020-03-18', + reductionPopulationContact: 38, + isAutoGenerated: true, + voluntaryHomeQuarantine: 'aggressive', + caseIsolation: 'aggressive', + schoolClosure: 'aggressive' + }, + { + startDate: '2020-03-20', + reductionPopulationContact: 44, + isAutoGenerated: true, + voluntaryHomeQuarantine: 'aggressive', + caseIsolation: 'aggressive', + schoolClosure: 'aggressive', + socialDistancing: 'mild' + }, + { + startDate: '2020-04-04', + reductionPopulationContact: 57, + isAutoGenerated: true, + voluntaryHomeQuarantine: 'aggressive', + caseIsolation: 'aggressive', + schoolClosure: 'aggressive', + socialDistancing: 'moderate' + } + ] + }) + }) + }) + + describe('getNextInterventionPeriodStart', () => { + it('should get start date when there are no interventions', () => { + const today = toYYYYMMDD() + expect(getNextInterventionPeriodStart([])).toBe(today) + }) + + it('should get start date when there are only pre-existing interventions', () => { + const today = toYYYYMMDD() + expect( + getNextInterventionPeriodStart([ + {startDate: addDays(today, -7)} as any, + {startDate: addDays(today, -2)} as any + ]) + ).toBe(today) + }) + + it('should get start date when there are new interventions', () => { + const today = toYYYYMMDD() + expect( + getNextInterventionPeriodStart([ + {startDate: addDays(today, 7)} as any, + {startDate: addDays(today, 20)} as any + ]) + ).toBe(addDays(today, 21)) + }) + }) + + describe('getInterventionsEnd', () => { + it('should get end date when there are no interventions', () => { + const today = toYYYYMMDD() + expect(getInterventionsEnd([])).toBe(addDays(today, 90)) + }) + + it('should get end date when there are only pre-existing interventions', () => { + const today = toYYYYMMDD() + expect( + getInterventionsEnd([ + {startDate: addDays(today, -7)} as any, + {startDate: addDays(today, -2)} as any + ]) + ).toBe(addDays(today, 90)) + }) + + it('should get start date when there are new interventions', () => { + const today = toYYYYMMDD() + expect( + getInterventionsEnd([ + {startDate: addDays(today, 7)} as any, + {startDate: addDays(today, 20)} as any + ]) + ).toBe(addDays(today, 110)) + }) + }) + + function createMockRegions( + regionID = 'US', + subregionID = 'US-AL' + ): Pick { + return { + region: {id: regionID} as any, + subregion: {id: subregionID} as any + } + } + + function createMockLabel() { + return `Simulation created on ${toYYYYMMDD()}` + } + + function createMockInterventions( + interventions: Interventions = {} as any + ): InterventionMap { + return { + US: { + 'US-AL': interventions + } + } + } + + // Actual interventions that was causing an error + function createAlabamaInterventions() { + return { + EmergDec: { + dateIssued: '2020-03-13', + dateEnacted: '2020-03-13', + dateExpiry: '', + dateEnded: '', + notes: 'Public Health Emergency', + source: + 'https://governor.alabama.gov/newsroom/2020/03/third-supplemental-state-of-emergency-coronavirus-covid-19/' + }, + SchoolClose: { + dateIssued: '2020-03-14', + dateEnacted: '2020-03-18', + dateExpiry: '', + dateEnded: '', + notes: + 'in effect 20200318. 20200319 issuance also closed all public/private schools (20200314 is public school)', + source: 'http://alabamapublichealth.gov/legal/assets/420-4-1.13-er.pdf' + }, + GathRestrict25: { + dateIssued: '2020-03-19', + dateEnacted: '2020-03-20', + dateExpiry: '', + dateEnded: '', + notes: 'Announced 20200319, but signed into law 20200320', + source: 'http://alabamapublichealth.gov/legal/assets/420-4-1.13-er.pdf' + }, + GathRestrict10: { + dateIssued: '2020-03-19', + dateEnacted: '2020-03-20', + dateExpiry: '', + dateEnded: '', + notes: 'Announced 20200319, but signed into law 20200320', + source: 'http://alabamapublichealth.gov/legal/assets/420-4-1.13-er.pdf' + }, + OtherBusinessClose: { + dateIssued: '2020-03-27', + dateEnacted: '2020-03-28', + dateExpiry: '2020-04-17', + dateEnded: '', + notes: + 'Non-essential business categories closed included entertainment venues, retail shops, personal care services, and athletic faciltiies. Not considered full NEBusinessClose yet due to only listing of additional types of businsess to close.', + source: 'https://www.alabamapublichealth.gov/news/2020/03/27.html' + }, + RestaurantRestrict: { + dateIssued: '2020-03-19', + dateEnacted: '2020-03-20', + dateExpiry: '', + dateEnded: '', + notes: 'Limited operations required: restaurants, bars, breweries', + source: 'http://alabamapublichealth.gov/legal/assets/420-4-1.13-er.pdf' + }, + StayAtHome: { + dateIssued: '2020-04-03', + dateEnacted: '2020-04-04', + dateExpiry: '2020-04-30', + dateEnded: '', + notes: 'Goes into effect at 5 pm on 20200403', + source: + 'http://www.alabamapublichealth.gov/legal/assets/soe-covid19-stamped-040320.pdf' + } + } + } +}) diff --git a/test/tsconfig.json b/test/tsconfig.json new file mode 100644 index 0000000..5de3cfa --- /dev/null +++ b/test/tsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "noEmit": true + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..161e3a7 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "esnext", + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "sourceMap": true + }, + "exclude": ["node_modules"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"] +} diff --git a/types/case-data.ts b/types/case-data.ts new file mode 100644 index 0000000..d9867c8 --- /dev/null +++ b/types/case-data.ts @@ -0,0 +1,12 @@ +/** + * Time series case data + * + * These arrays contain `null` values where case data does not exist for the + * given time. + */ +export type CaseData = { + deaths: (number | null)[] + cumulativeDeaths: (number | null)[] + confirmed: (number | null)[] + cumulativeConfirmed: (number | null)[] +} diff --git a/types/hospital-data.ts b/types/hospital-data.ts new file mode 100644 index 0000000..b5af991 --- /dev/null +++ b/types/hospital-data.ts @@ -0,0 +1,12 @@ +/** + * This data type is for data/hospitals/us.json + */ +export type HospitalData = { + abbr: string + population: number + licensed_beds: number + total_beds: number + icu_beds: number + utilization: number + pct_icu: number +} diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..63199ce --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1 @@ +declare module '*.svg' diff --git a/types/model-runner.ts b/types/model-runner.ts new file mode 100644 index 0000000..037f4cc --- /dev/null +++ b/types/model-runner.ts @@ -0,0 +1,149 @@ +// +// Section - Outer request bodies +// + +export interface RequestInput { + id: string | number + models: Model[] + configuration: ModelInput + callbackURL: string | null +} + +export enum RunStatus { + Pending = 'pending', + InProgress = 'in-progress', + Complete = 'complete', + Failed = 'failed' +} + +export interface RunOutput { + modelSlug: ModelSlug + status: RunStatus + resultsLocation: string + exportLocation: string + workflowRunID?: string +} + +// The name of an epidemiological model. +export enum ModelSlug { + MRCIDECovidSim = 'mrc-ide-covid-sim', + Basel = 'basel', + COSMC = 'cosmc' +} + +export interface Model { + slug: ModelSlug + imageURL: string +} + +// +// Section - Model Inputs +// + +/** A generalized description of the input to an epidemiological model. */ +export interface ModelInput { + model: Model + region: string + subregion?: string + parameters: ModelParameters +} + +export interface ModelParameters { + // An ISO-8601 string encoding the date of the most recent death data in the region. + calibrationDate: ISODate + + // The total number of confirmed cases in the region before the calibration date. + calibrationCaseCount: number + + // The total number of deaths in the region before the calibration date. + calibrationDeathCount: number + + // A list of time periods, each with a different set of interventions + interventionPeriods: InterventionPeriod[] + + // r0 override for the virus. If undefined then use the model default + r0: number | null +} + +export interface InterventionPeriod { + // ISO-8601 date when these interventions begin + startDate: ISODate + + // Estimated reduction in population contact + reductionPopulationContact: number + + socialDistancing?: Intensity + schoolClosure?: Intensity + caseIsolation?: Intensity + voluntaryHomeQuarantine?: Intensity +} + +export type ISODate = string + +export enum Intensity { + Mild = 'mild', + Moderate = 'moderate', + Aggressive = 'aggressive' +} + +// +// Section - Model Outputs +// + +export interface ModelOutput { + metadata: ModelInput + binaryHash?: string + time: { + /** The starting date within the model simulation. */ + t0: string + /** + * Timestamps for the series of reported metrics in `regions` and `aggregate`. + * Each timestamp indicates the number of days after `t0`. + */ + timestamps: number[] + /** + * The minimum and maximum timestamps for the series of reported metrics + * in `regions` and `aggregate`. + * Each timestamp indicates the number of days after `t0`. + */ + extent: [number, number] + } + aggregate: { + metrics: SeverityMetrics + } +} + +export type MetricType = + | 'Mild' + | 'ILI' + | 'SARI' + | 'Critical' + | 'CritRecov' + | 'Death' + +export interface SeverityMetrics { + /* Current number of mild cases on this day */ + Mild: number[] + /** Current number of influenza-like illness cases on this day (assume represents GP demand) */ + ILI: number[] + /** Current number of Severe Acute Respiratory Illness cases (assume represents hospital demand) */ + SARI: number[] + /** Current number of critical cases (assume represents ICU demand) */ + Critical: number[] + /** Current number of critical cases who are well enough to be out of ICU but still need a hospital bed */ + CritRecov: number[] + + /** Number of deaths occurring on this day */ + incDeath: number[] + + /** Total number of mild cases since the beginning of the epidemic */ + cumMild: number[] + /** Total number of influence-like illnesses since the beginning of the epidemic */ + cumILI: number[] + /** Total number of severe acute respiratory illnesses since the beginning of the epidemic */ + cumSARI: number[] + /** Total number of critical cases since the beginning of the epidemic */ + cumCritical: number[] + /** Total number of patients recovered from critical cases since the beginning of the epidemic */ + cumCritRecov: number[] +} diff --git a/types/regions.d.ts b/types/regions.d.ts new file mode 100644 index 0000000..d4ab6e1 --- /dev/null +++ b/types/regions.d.ts @@ -0,0 +1,41 @@ +/** + * A mapping of ISO 3166 codes to region specifiers + * + * The length of the code determines alpha-2 vs alpha-3, but we prefer the more + * common alpha-2. + * + * A special subregion ID called "_self" represents the entirety of the region. + * + * https://en.wikipedia.org/wiki/ISO_3166 + */ +export type RegionMap = Record + +/** + * A top-level region, which must have subregions. + */ +export type TopLevelRegion = Region & { + regions: RegionMap +} + +/** + * A region identified by an ISO 3166 + */ +export type Region = { + /** + * The human-readable name of the region + */ + name: string + + /** + * The ISO 3166 code for the region + * + * This may be a 3166-1 or 3166-2 (subregion) dependeing on what level we're + * at. + */ + id: string + + /** + * The subregions of this region + */ + regions?: RegionMap +}