From d30828738626f91b95997ff18862eb303f05fe52 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 21 Jun 2020 13:31:11 -0700 Subject: [PATCH 01/66] github config and vscode settings --- .github/config.yml | 6 ++++++ .github/workflows/test.yml | 36 ++++++++++++++++++++++++++++++++++++ .vscode/settings.json | 17 ++++++++++++++--- 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 .github/config.yml create mode 100644 .github/workflows/test.yml diff --git a/.github/config.yml b/.github/config.yml new file mode 100644 index 00000000..3708b464 --- /dev/null +++ b/.github/config.yml @@ -0,0 +1,6 @@ +requiredHeaders: + - Prerequisites + - Expected Behavior + - Current Behavior + - Possible Solution + - Your Environment diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..7990cf3f --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,36 @@ +name: Test + +on: push + +jobs: + release: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [macos-10.14, windows-2019, ubuntu-18.04] + + steps: + - name: Check out Git repository + uses: actions/checkout@v1 + + - name: Install Node.js, NPM and Yarn + uses: actions/setup-node@v1 + with: + node-version: 13 + + - name: yarn install + run: | + yarn install + + - name: yarn test + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + yarn package-ci + yarn lint + yarn tsc + +# Failing because virtual framebuffer not installed +# yarn build-e2e +# yarn test-e2e diff --git a/.vscode/settings.json b/.vscode/settings.json index fe7c2204..63e5500f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,17 @@ { + "files.associations": { + ".babelrc": "jsonc", + ".eslintrc": "jsonc", + ".prettierrc": "jsonc", + ".stylelintrc": "json", + ".dockerignore": "ignore", + ".eslintignore": "ignore" + }, + "javascript.validate.enable": false, - "flow.useNPMPackagedFlow": true, + "javascript.format.enable": false, + "typescript.format.enable": false, + "search.exclude": { ".git": true, ".eslintcache": true, @@ -9,11 +20,11 @@ "app/main.prod.js.map": true, "bower_components": true, "dll": true, - "flow-typed": true, "release": true, "node_modules": true, "npm-debug.log.*": true, "test/**/__snapshots__": true, - "yarn.lock": true + "yarn.lock": true, + "*.{css,sass,scss}.d.ts": true } } From 824b322fdb0dca013290596c4de08cbf100fec43 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 21 Jun 2020 13:53:15 -0700 Subject: [PATCH 02/66] webpack --- configs/.eslintrc | 7 + configs/webpack.config.base.js | 48 ++++ configs/webpack.config.eslint.js | 4 + .../webpack.config.main.prod.babel.js | 47 ++-- .../webpack.config.renderer.dev.babel.js | 186 +++++++-------- .../webpack.config.renderer.dev.dll.babel.js | 33 ++- configs/webpack.config.renderer.prod.babel.js | 222 ++++++++++++++++++ webpack.config.base.js | 72 ------ webpack.config.eslint.js | 3 - webpack.config.renderer.prod.js | 192 --------------- 10 files changed, 414 insertions(+), 400 deletions(-) create mode 100644 configs/.eslintrc create mode 100644 configs/webpack.config.base.js create mode 100644 configs/webpack.config.eslint.js rename webpack.config.main.prod.js => configs/webpack.config.main.prod.babel.js (55%) rename webpack.config.renderer.dev.js => configs/webpack.config.renderer.dev.babel.js (60%) rename webpack.config.renderer.dev.dll.js => configs/webpack.config.renderer.dev.dll.babel.js (64%) create mode 100644 configs/webpack.config.renderer.prod.babel.js delete mode 100644 webpack.config.base.js delete mode 100644 webpack.config.eslint.js delete mode 100644 webpack.config.renderer.prod.js diff --git a/configs/.eslintrc b/configs/.eslintrc new file mode 100644 index 00000000..89d242ba --- /dev/null +++ b/configs/.eslintrc @@ -0,0 +1,7 @@ +{ + "rules": { + "no-console": "off", + "global-require": "off", + "import/no-dynamic-require": "off" + } +} diff --git a/configs/webpack.config.base.js b/configs/webpack.config.base.js new file mode 100644 index 00000000..856c9363 --- /dev/null +++ b/configs/webpack.config.base.js @@ -0,0 +1,48 @@ +/** + * Base webpack config used across other specific configs + */ + +import path from 'path'; +import webpack from 'webpack'; +import { dependencies as externals } from '../app/package.json'; + +export default { + externals: [...Object.keys(externals || {})], + + module: { + rules: [ + { + test: /\.tsx?$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + cacheDirectory: true + } + } + } + ] + }, + + output: { + path: path.join(__dirname, '..', 'app'), + // https://github.com/webpack/webpack/issues/1114 + libraryTarget: 'commonjs2' + }, + + /** + * Determine the array of extensions that should be used to resolve modules. + */ + resolve: { + extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'], + modules: [path.join(__dirname, '..', 'app'), 'node_modules'] + }, + + plugins: [ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production' + }), + + new webpack.NamedModulesPlugin() + ] +}; diff --git a/configs/webpack.config.eslint.js b/configs/webpack.config.eslint.js new file mode 100644 index 00000000..bd000487 --- /dev/null +++ b/configs/webpack.config.eslint.js @@ -0,0 +1,4 @@ +/* eslint import/no-unresolved: off, import/no-self-import: off */ +require('@babel/register'); + +module.exports = require('./webpack.config.renderer.dev.babel').default; diff --git a/webpack.config.main.prod.js b/configs/webpack.config.main.prod.babel.js similarity index 55% rename from webpack.config.main.prod.js rename to configs/webpack.config.main.prod.babel.js index 9aacbf49..06aed1f5 100644 --- a/webpack.config.main.prod.js +++ b/configs/webpack.config.main.prod.babel.js @@ -2,38 +2,49 @@ * Webpack config for production electron main process */ +import path from 'path'; import webpack from 'webpack'; import merge from 'webpack-merge'; -import UglifyJSPlugin from 'uglifyjs-webpack-plugin'; +import TerserPlugin from 'terser-webpack-plugin'; import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; import baseConfig from './webpack.config.base'; -import CheckNodeEnv from './internals/scripts/CheckNodeEnv'; +import CheckNodeEnv from '../internals/scripts/CheckNodeEnv'; +import DeleteSourceMaps from '../internals/scripts/DeleteSourceMaps'; CheckNodeEnv('production'); +DeleteSourceMaps(); export default merge.smart(baseConfig, { - devtool: 'source-map', + devtool: process.env.DEBUG_PROD === 'true' ? 'source-map' : 'none', mode: 'production', target: 'electron-main', - entry: './app/main.dev', + entry: './app/main.dev.ts', output: { - path: __dirname, - filename: './app/main.prod.js', + path: path.join(__dirname, '..'), + filename: './app/main.prod.js' }, - plugins: [ - new UglifyJSPlugin({ - parallel: true, - sourceMap: true, - }), + optimization: { + minimizer: process.env.E2E_BUILD + ? [] + : [ + new TerserPlugin({ + parallel: true, + sourceMap: true, + cache: true + }) + ] + }, + plugins: [ new BundleAnalyzerPlugin({ - analyzerMode: process.env.OPEN_ANALYZER === 'true' ? 'server' : 'disabled', - openAnalyzer: process.env.OPEN_ANALYZER === 'true', + analyzerMode: + process.env.OPEN_ANALYZER === 'true' ? 'server' : 'disabled', + openAnalyzer: process.env.OPEN_ANALYZER === 'true' }), /** @@ -47,8 +58,10 @@ export default merge.smart(baseConfig, { */ new webpack.EnvironmentPlugin({ NODE_ENV: 'production', - DEBUG_PROD: 'true', - }), + DEBUG_PROD: false, + START_MINIMIZED: false, + E2E_BUILD: false + }) ], /** @@ -58,6 +71,6 @@ export default merge.smart(baseConfig, { */ node: { __dirname: false, - __filename: false, - }, + __filename: false + } }); diff --git a/webpack.config.renderer.dev.js b/configs/webpack.config.renderer.dev.babel.js similarity index 60% rename from webpack.config.renderer.dev.js rename to configs/webpack.config.renderer.dev.babel.js index 262b5db1..e2511ea0 100644 --- a/webpack.config.renderer.dev.js +++ b/configs/webpack.config.renderer.dev.babel.js @@ -1,5 +1,3 @@ -/* eslint global-require: 0, import/no-dynamic-require: 0 */ - /** * Build config for development electron renderer process that uses * Hot-Module-Replacement @@ -13,17 +11,23 @@ import webpack from 'webpack'; import chalk from 'chalk'; import merge from 'webpack-merge'; import { spawn, execSync } from 'child_process'; -import ExtractTextPlugin from 'extract-text-webpack-plugin'; +import { TypedCssModulesPlugin } from 'typed-css-modules-webpack-plugin'; import baseConfig from './webpack.config.base'; -import CheckNodeEnv from './internals/scripts/CheckNodeEnv'; +import CheckNodeEnv from '../internals/scripts/CheckNodeEnv'; -CheckNodeEnv('development'); +// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's +// at the dev webpack config is not accidentally run in a production environment +if (process.env.NODE_ENV === 'production') { + CheckNodeEnv('development'); +} const port = process.env.PORT || 1212; const publicPath = `http://localhost:${port}/dist`; -const dll = path.resolve(process.cwd(), 'dll'); +const dll = path.join(__dirname, '..', 'dll'); const manifest = path.resolve(dll, 'renderer.json'); -const requiredByDLLConfig = module.parent.filename.includes('webpack.config.renderer.dev.dll'); +const requiredByDLLConfig = module.parent.filename.includes( + 'webpack.config.renderer.dev.dll' +); /** * Warn if the DLL is not built @@ -31,10 +35,10 @@ const requiredByDLLConfig = module.parent.filename.includes('webpack.config.rend if (!requiredByDLLConfig && !(fs.existsSync(dll) && fs.existsSync(manifest))) { console.log( chalk.black.bgYellow.bold( - 'The DLL files are missing. Sit back while we build them for you with "npm run build-dll"' + 'The DLL files are missing. Sit back while we build them for you with "yarn build-dll"' ) ); - execSync('npm run build-dll'); + execSync('yarn build-dll'); } export default merge.smart(baseConfig, { @@ -44,111 +48,91 @@ export default merge.smart(baseConfig, { target: 'electron-renderer', - entry: { - main: [ - 'react-hot-loader/patch', - `webpack-dev-server/client?http://localhost:${port}/`, - 'webpack/hot/only-dev-server', - path.join(__dirname, 'app/index.js'), - ], - viewer: [path.join(__dirname, 'app/viewer.js')], - }, + entry: [ + ...(process.env.PLAIN_HMR ? [] : ['react-hot-loader/patch']), + `webpack-dev-server/client?http://localhost:${port}/`, + 'webpack/hot/only-dev-server', + require.resolve('../app/index.tsx') + ], output: { publicPath: `http://localhost:${port}/dist/`, - filename: '[name].entry.js', + filename: 'renderer.dev.js' }, - resolve: { symlinks: false }, - module: { rules: [ - { - test: /\.jsx?$/, - exclude: /node_modules/, - use: { - loader: 'babel-loader', - options: { - cacheDirectory: true, - plugins: [ - // Here, we include babel plugins that are only required for the - // renderer process. The 'transform-*' plugins must be included - // before react-hot-loader/babel - '@babel/plugin-proposal-class-properties', - 'react-hot-loader/babel', - ], - }, - }, - }, { test: /\.global\.css$/, use: [ { - loader: 'style-loader', + loader: 'style-loader' }, { loader: 'css-loader', options: { - sourceMap: true, - }, - }, - ], + sourceMap: true + } + } + ] }, { test: /^((?!\.global).)*\.css$/, use: [ { - loader: 'style-loader', + loader: 'style-loader' }, { loader: 'css-loader', options: { - modules: true, + modules: { + localIdentName: '[name]__[local]__[hash:base64:5]' + }, sourceMap: true, - importLoaders: 1, - localIdentName: '[name]__[local]__[hash:base64:5]', - }, - }, - ], + importLoaders: 1 + } + } + ] }, // SASS support - compile all .global.scss files and pipe it to style.css { test: /\.global\.(scss|sass)$/, use: [ { - loader: 'style-loader', + loader: 'style-loader' }, { loader: 'css-loader', options: { - sourceMap: true, - }, + sourceMap: true + } }, { - loader: 'sass-loader', - }, - ], + loader: 'sass-loader' + } + ] }, // SASS support - compile all other .scss files and pipe it to style.css { test: /^((?!\.global).)*\.(scss|sass)$/, use: [ { - loader: 'style-loader', + loader: 'style-loader' }, { loader: 'css-loader', options: { - modules: true, + modules: { + localIdentName: '[name]__[local]__[hash:base64:5]' + }, sourceMap: true, - importLoaders: 1, - localIdentName: '[name]__[local]__[hash:base64:5]', - }, + importLoaders: 1 + } }, { - loader: 'sass-loader', - }, - ], + loader: 'sass-loader' + } + ] }, // WOFF Font { @@ -157,9 +141,9 @@ export default merge.smart(baseConfig, { loader: 'url-loader', options: { limit: 10000, - mimetype: 'application/font-woff', - }, - }, + mimetype: 'application/font-woff' + } + } }, // WOFF2 Font { @@ -168,9 +152,9 @@ export default merge.smart(baseConfig, { loader: 'url-loader', options: { limit: 10000, - mimetype: 'application/font-woff', - }, - }, + mimetype: 'application/font-woff' + } + } }, // TTF Font { @@ -179,14 +163,14 @@ export default merge.smart(baseConfig, { loader: 'url-loader', options: { limit: 10000, - mimetype: 'application/octet-stream', - }, - }, + mimetype: 'application/octet-stream' + } + } }, // EOT Font { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, - use: 'file-loader', + use: 'file-loader' }, // SVG Font { @@ -195,29 +179,37 @@ export default merge.smart(baseConfig, { loader: 'url-loader', options: { limit: 10000, - mimetype: 'image/svg+xml', - }, - }, + mimetype: 'image/svg+xml' + } + } }, // Common Image Formats { test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, - use: 'url-loader', - }, - ], + use: 'url-loader' + } + ] + }, + resolve: { + alias: { + 'react-dom': '@hot-loader/react-dom' + } }, - plugins: [ requiredByDLLConfig ? null : new webpack.DllReferencePlugin({ - context: process.cwd(), + context: path.join(__dirname, '..', 'dll'), manifest: require(manifest), - sourceType: 'var', + sourceType: 'var' }), new webpack.HotModuleReplacementPlugin({ - multiStep: true, + multiStep: true + }), + + new TypedCssModulesPlugin({ + globPattern: 'app/**/*.{css,scss,sass}' }), new webpack.NoEmitOnErrorsPlugin(), @@ -235,21 +227,17 @@ export default merge.smart(baseConfig, { * 'staging', for example, by changing the ENV variables in the npm scripts */ new webpack.EnvironmentPlugin({ - NODE_ENV: 'development', + NODE_ENV: 'development' }), new webpack.LoaderOptionsPlugin({ - debug: true, - }), - - new ExtractTextPlugin({ - filename: '[name].css', - }), + debug: true + }) ], node: { __dirname: false, - __filename: false, + __filename: false }, devServer: { @@ -266,11 +254,11 @@ export default merge.smart(baseConfig, { watchOptions: { aggregateTimeout: 300, ignored: /node_modules/, - poll: 100, + poll: 100 }, historyApiFallback: { verbose: true, - disableDotRule: false, + disableDotRule: false }, before() { if (process.env.START_HOT) { @@ -278,11 +266,11 @@ export default merge.smart(baseConfig, { spawn('npm', ['run', 'start-main-dev'], { shell: true, env: process.env, - stdio: 'inherit', + stdio: 'inherit' }) - .on('close', (code) => process.exit(code)) - .on('error', (spawnError) => console.error(spawnError)); + .on('close', code => process.exit(code)) + .on('error', spawnError => console.error(spawnError)); } - }, - }, + } + } }); diff --git a/webpack.config.renderer.dev.dll.js b/configs/webpack.config.renderer.dev.dll.babel.js similarity index 64% rename from webpack.config.renderer.dev.dll.js rename to configs/webpack.config.renderer.dev.dll.babel.js index 4a4eda0a..99fc2f30 100644 --- a/webpack.config.renderer.dev.dll.js +++ b/configs/webpack.config.renderer.dev.dll.babel.js @@ -1,5 +1,3 @@ -/* eslint global-require: 0, import/no-dynamic-require: 0 */ - /** * Builds the DLL for development electron renderer process */ @@ -8,15 +6,15 @@ import webpack from 'webpack'; import path from 'path'; import merge from 'webpack-merge'; import baseConfig from './webpack.config.base'; -import { dependencies } from './package.json'; -import CheckNodeEnv from './internals/scripts/CheckNodeEnv'; +import { dependencies } from '../package.json'; +import CheckNodeEnv from '../internals/scripts/CheckNodeEnv'; CheckNodeEnv('development'); -const dist = path.resolve(process.cwd(), 'dll'); +const dist = path.join(__dirname, '..', 'dll'); export default merge.smart(baseConfig, { - context: process.cwd(), + context: path.join(__dirname, '..'), devtool: 'eval', @@ -29,24 +27,25 @@ export default merge.smart(baseConfig, { /** * Use `module` from `webpack.config.renderer.dev.js` */ - module: require('./webpack.config.renderer.dev').module, + module: require('./webpack.config.renderer.dev.babel').default.module, entry: { - renderer: Object.keys(dependencies || {}).filter((dependency) => dependency !== 'font-awesome'), + renderer: Object.keys(dependencies || {}) }, output: { library: 'renderer', path: dist, filename: '[name].dev.dll.js', - libraryTarget: 'var', + libraryTarget: 'var' }, plugins: [ new webpack.DllPlugin({ path: path.join(dist, '[name].json'), - name: '[name]', + name: '[name]' }), + /** * Create global constants which can be configured at compile time. * @@ -57,17 +56,17 @@ export default merge.smart(baseConfig, { * development checks */ new webpack.EnvironmentPlugin({ - NODE_ENV: 'development', + NODE_ENV: 'development' }), new webpack.LoaderOptionsPlugin({ debug: true, options: { - context: path.resolve(process.cwd(), 'app'), + context: path.join(__dirname, '..', 'app'), output: { - path: path.resolve(process.cwd(), 'dll'), - }, - }, - }), - ], + path: path.join(__dirname, '..', 'dll') + } + } + }) + ] }); diff --git a/configs/webpack.config.renderer.prod.babel.js b/configs/webpack.config.renderer.prod.babel.js new file mode 100644 index 00000000..602119ce --- /dev/null +++ b/configs/webpack.config.renderer.prod.babel.js @@ -0,0 +1,222 @@ +/** + * Build config for electron renderer process + */ + +import path from 'path'; +import webpack from 'webpack'; +import MiniCssExtractPlugin from 'mini-css-extract-plugin'; +import OptimizeCSSAssetsPlugin from 'optimize-css-assets-webpack-plugin'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import merge from 'webpack-merge'; +import TerserPlugin from 'terser-webpack-plugin'; +import baseConfig from './webpack.config.base'; +import CheckNodeEnv from '../internals/scripts/CheckNodeEnv'; +import DeleteSourceMaps from '../internals/scripts/DeleteSourceMaps'; + +CheckNodeEnv('production'); +DeleteSourceMaps(); + +export default merge.smart(baseConfig, { + devtool: process.env.DEBUG_PROD === 'true' ? 'source-map' : 'none', + + mode: 'production', + + target: 'electron-preload', + + entry: path.join(__dirname, '..', 'app/index.tsx'), + + output: { + path: path.join(__dirname, '..', 'app/dist'), + publicPath: './dist/', + filename: 'renderer.prod.js' + }, + + module: { + rules: [ + // Extract all .global.css to style.css as is + { + test: /\.global\.css$/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + publicPath: './' + } + }, + { + loader: 'css-loader', + options: { + sourceMap: true + } + } + ] + }, + // Pipe other styles through css modules and append to style.css + { + test: /^((?!\.global).)*\.css$/, + use: [ + { + loader: MiniCssExtractPlugin.loader + }, + { + loader: 'css-loader', + options: { + modules: { + localIdentName: '[name]__[local]__[hash:base64:5]' + }, + sourceMap: true + } + } + ] + }, + // Add SASS support - compile all .global.scss files and pipe it to style.css + { + test: /\.global\.(scss|sass)$/, + use: [ + { + loader: MiniCssExtractPlugin.loader + }, + { + loader: 'css-loader', + options: { + sourceMap: true, + importLoaders: 1 + } + }, + { + loader: 'sass-loader', + options: { + sourceMap: true + } + } + ] + }, + // Add SASS support - compile all other .scss files and pipe it to style.css + { + test: /^((?!\.global).)*\.(scss|sass)$/, + use: [ + { + loader: MiniCssExtractPlugin.loader + }, + { + loader: 'css-loader', + options: { + modules: { + localIdentName: '[name]__[local]__[hash:base64:5]' + }, + importLoaders: 1, + sourceMap: true + } + }, + { + loader: 'sass-loader', + options: { + sourceMap: true + } + } + ] + }, + // WOFF Font + { + test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/font-woff' + } + } + }, + // WOFF2 Font + { + test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/font-woff' + } + } + }, + // TTF Font + { + test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/octet-stream' + } + } + }, + // EOT Font + { + test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, + use: 'file-loader' + }, + // SVG Font + { + test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'image/svg+xml' + } + } + }, + // Common Image Formats + { + test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, + use: 'url-loader' + } + ] + }, + + optimization: { + minimizer: process.env.E2E_BUILD + ? [] + : [ + new TerserPlugin({ + parallel: true, + sourceMap: true, + cache: true + }), + new OptimizeCSSAssetsPlugin({ + cssProcessorOptions: { + map: { + inline: false, + annotation: true + } + } + }) + ] + }, + + plugins: [ + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production', + DEBUG_PROD: false, + E2E_BUILD: false + }), + + new MiniCssExtractPlugin({ + filename: 'style.css' + }), + + new BundleAnalyzerPlugin({ + analyzerMode: + process.env.OPEN_ANALYZER === 'true' ? 'server' : 'disabled', + openAnalyzer: process.env.OPEN_ANALYZER === 'true' + }) + ] +}); diff --git a/webpack.config.base.js b/webpack.config.base.js deleted file mode 100644 index 4e2f1298..00000000 --- a/webpack.config.base.js +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Base webpack config used across other specific configs - */ - -import path from 'path'; -import webpack from 'webpack'; -import fs from 'fs'; -import { dependencies as externals } from './app/package.json'; -import { dependencies as possibleExternals } from './package.json'; - -// Find all the dependencies without a `main` property and add them as webpack externals -function filterDepWithoutEntryPoints(dep: string): boolean { - // Return true if we want to add a dependency to externals - try { - // If the root of the dependency has an index.js, return true - if (fs.existsSync(path.join(__dirname, `node_modules/${dep}/index.js`))) { - return false; - } - const pgkString = fs - .readFileSync(path.join(__dirname, `node_modules/${dep}/package.json`)) - .toString(); - const pkg = JSON.parse(pgkString); - const fields = ['main', 'module', 'jsnext:main', 'browser']; - return !fields.some((field) => field in pkg); - } catch (e) { - console.log(e); - return true; - } -} - -export default { - externals: [ - ...Object.keys(externals || {}), - ...Object.keys(possibleExternals || {}).filter(filterDepWithoutEntryPoints), - ], - - module: { - rules: [ - { - test: /\.jsx?$/, - exclude: /node_modules/, - use: { - loader: 'babel-loader', - options: { - cacheDirectory: true, - }, - }, - }, - ], - }, - - output: { - path: path.join(__dirname, 'app'), - // https://github.com/webpack/webpack/issues/1114 - libraryTarget: 'commonjs2', - }, - - /** - * Determine the array of extensions that should be used to resolve modules. - */ - resolve: { - extensions: ['.js', '.jsx', '.json'], - modules: [path.join(__dirname, 'app'), 'node_modules'], - }, - - plugins: [ - new webpack.EnvironmentPlugin({ - NODE_ENV: 'production', - }), - new webpack.NamedModulesPlugin(), - ], -}; diff --git a/webpack.config.eslint.js b/webpack.config.eslint.js deleted file mode 100644 index 4dd73a84..00000000 --- a/webpack.config.eslint.js +++ /dev/null @@ -1,3 +0,0 @@ -require('@babel/register'); - -module.exports = require('./webpack.config.renderer.dev'); diff --git a/webpack.config.renderer.prod.js b/webpack.config.renderer.prod.js deleted file mode 100644 index 8db0ea52..00000000 --- a/webpack.config.renderer.prod.js +++ /dev/null @@ -1,192 +0,0 @@ -/** - * Build config for electron renderer process - */ - -import path from 'path'; -import webpack from 'webpack'; -import ExtractTextPlugin from 'extract-text-webpack-plugin'; -import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; -import merge from 'webpack-merge'; -import UglifyJSPlugin from 'uglifyjs-webpack-plugin'; -import baseConfig from './webpack.config.base'; -import CheckNodeEnv from './internals/scripts/CheckNodeEnv'; - -CheckNodeEnv('production'); - -export default merge.smart(baseConfig, { - devtool: 'source-map', - - mode: 'production', - - target: 'electron-renderer', - - entry: { - main: [path.join(__dirname, './app/index')], - viewer: [path.join(__dirname, './app/viewer')], - }, - - output: { - path: path.join(__dirname, 'app/dist'), - publicPath: './dist/', - filename: '[name].entry.js', - }, - - module: { - rules: [ - // Extract all .global.css to style.css as is - { - test: /\.global\.css$/, - use: ExtractTextPlugin.extract({ - publicPath: './', - use: { - loader: 'css-loader', - options: { - minimize: true, - }, - }, - fallback: 'style-loader', - }), - }, - // Pipe other styles through css modules and append to style.css - { - test: /^((?!\.global).)*\.css$/, - use: ExtractTextPlugin.extract({ - use: { - loader: 'css-loader', - options: { - modules: true, - minimize: true, - importLoaders: 1, - localIdentName: '[name]__[local]__[hash:base64:5]', - }, - }, - }), - }, - // Add SASS support - compile all .global.scss files and pipe it to style.css - { - test: /\.global\.(scss|sass)$/, - use: ExtractTextPlugin.extract({ - use: [ - { - loader: 'css-loader', - options: { - minimize: true, - }, - }, - { - loader: 'sass-loader', - }, - ], - fallback: 'style-loader', - }), - }, - // Add SASS support - compile all other .scss files and pipe it to style.css - { - test: /^((?!\.global).)*\.(scss|sass)$/, - use: ExtractTextPlugin.extract({ - use: [ - { - loader: 'css-loader', - options: { - modules: true, - minimize: true, - importLoaders: 1, - localIdentName: '[name]__[local]__[hash:base64:5]', - }, - }, - { - loader: 'sass-loader', - }, - ], - }), - }, - // WOFF Font - { - test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'application/font-woff', - }, - }, - }, - // WOFF2 Font - { - test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'application/font-woff', - }, - }, - }, - // TTF Font - { - test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'application/octet-stream', - }, - }, - }, - // EOT Font - { - test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, - use: 'file-loader', - }, - // SVG Font - { - test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'image/svg+xml', - }, - }, - }, - // Common Image Formats - { - test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, - use: 'url-loader', - }, - ], - }, - - plugins: [ - /** - * Create global constants which can be configured at compile time. - * - * Useful for allowing different behaviour between development builds and - * release builds - * - * NODE_ENV should be production so that modules do not perform certain - * development checks - */ - new webpack.EnvironmentPlugin({ - NODE_ENV: 'production', - DEBUG_PROD: true, - }), - - new UglifyJSPlugin({ - parallel: true, - sourceMap: true, - }), - - new ExtractTextPlugin('style.css'), - - new BundleAnalyzerPlugin({ - analyzerMode: process.env.OPEN_ANALYZER === 'true' ? 'server' : 'disabled', - openAnalyzer: process.env.OPEN_ANALYZER === 'true', - }), - ], - - node: { - __dirname: false, - __filename: false, - }, -}); From 4faad36d45efe70d531d0f44fd7105cee3380f7c Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 21 Jun 2020 13:53:27 -0700 Subject: [PATCH 03/66] Updated package.json --- package.json | 309 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 180 insertions(+), 129 deletions(-) diff --git a/package.json b/package.json index c1b538dc..ebb7c8a4 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,42 @@ { "name": "BrainWaves", "productName": "BrainWaves", - "version": "0.13.0", + "version": "0.14.0", "description": "EEG Experiment Desktop Application", "scripts": { - "build": "concurrently \"npm run build-main\" \"npm run build-renderer\"", - "build-dll": "cross-env NODE_ENV=development node --trace-warnings -r @babel/register ./node_modules/webpack/bin/webpack --config webpack.config.renderer.dev.dll.js --colors", - "build-main": "cross-env NODE_ENV=production node --trace-warnings -r @babel/register ./node_modules/webpack/bin/webpack --config webpack.config.main.prod.js --colors", - "build-renderer": "cross-env NODE_ENV=production node --trace-warnings --max_old_space_size=4096 -r @babel/register ./node_modules/webpack/bin/webpack --config webpack.config.renderer.prod.js --colors", - "dev": "cross-env START_HOT=1 node -r @babel/register ./internals/scripts/CheckPortInUse.js && cross-env START_HOT=1 npm run start-renderer-dev", + "build": "concurrently \"yarn build-main\" \"yarn build-renderer\"", + "build-dll": "cross-env NODE_ENV=development webpack --config ./configs/webpack.config.renderer.dev.dll.babel.js --colors", + "build-e2e": "cross-env E2E_BUILD=true yarn build", + "build-main": "cross-env NODE_ENV=production webpack --config ./configs/webpack.config.main.prod.babel.js --colors", + "build-renderer": "cross-env NODE_ENV=production webpack --config ./configs/webpack.config.renderer.prod.babel.js --colors", + "dev": "cross-env START_HOT=1 node -r @babel/register ./internals/scripts/CheckPortInUse.js && cross-env START_HOT=1 yarn start-renderer-dev", "electron-rebuild": "electron-rebuild --parallel --force --types prod,dev,optional --module-dir app", - "flow": "flow", - "lint": "cross-env NODE_ENV=development eslint --cache .", - "lint-fix": "npm run --silent lint -- --fix; exit 0", - "lint-styles": "stylelint app/*.css app/components/*.css --syntax scss", - "lint-styles-fix": "stylefmt -r app/*.css app/components/*.css", - "package": "npm run build && build --publish never", - "package-all": "npm run build && build -mwl", - "package-linux": "npm run build && build --linux", - "package-win": "npm run build && build --win --x64", - "package-mac": "npm run build && build --mac --x64", - "postinstall": "node -r @babel/register internals/scripts/CheckNativeDep.js && npm run build-dll && electron-builder install-app-deps && node node_modules/fbjs-scripts/node/check-dev-engines.js package.json", - "postlint-fix": "prettier --ignore-path .eslintignore --single-quote --write '**/*.js'", - "precommit": "lint-staged", - "prestart": "npm run build", - "start": "cross-env NODE_ENV=production electron ./app/", - "start-main-dev": "cross-env HOT=1 NODE_ENV=development electron -r @babel/register ./app/main.dev.js", - "start-renderer-dev": "cross-env NODE_ENV=development node --trace-warnings -r @babel/register ./node_modules/webpack-dev-server/bin/webpack-dev-server --config webpack.config.renderer.dev.js", - "test": "cross-env NODE_ENV=test BABEL_DISABLE_CACHE=1 node --trace-warnings -r @babel/register ./internals/scripts/RunTests.js", - "test-all": "npm run lint && npm run flow && npm run build && npm run test && npm run test-e2e", - "test-e2e": "cross-env NODE_ENV=test BABEL_DISABLE_CACHE=1 node --trace-warnings -r @babel/register ./internals/scripts/RunTests.js e2e", - "test-watch": "npm test -- --watch" + "lint": "cross-env NODE_ENV=development eslint . --cache --ext .js,.jsx,.ts,.tsx", + "lint-fix": "yarn --silent lint --fix; exit 0", + "lint-styles": "stylelint --ignore-path .eslintignore '**/*.*(css|scss)' --syntax scss", + "lint-styles-fix": "yarn --silent lint-styles --fix; exit 0", + "package": "yarn build && electron-builder build --publish never", + "package-all": "yarn build && electron-builder build -mwl", + "package-ci": "yarn postinstall && yarn build && electron-builder --publish always", + "package-mac": "yarn build && electron-builder build --mac", + "package-linux": "yarn build && electron-builder build --linux", + "package-win": "yarn build && electron-builder build --win --x64", + "postinstall": "node -r @babel/register internals/scripts/CheckNativeDep.js && electron-builder install-app-deps && yarn build-dll && opencollective-postinstall", + "postlint-fix": "prettier --ignore-path .eslintignore --single-quote --write '**/*.{js,jsx,json,html,css,less,scss,yml}'", + "postlint-styles-fix": "prettier --ignore-path .eslintignore --single-quote --write '**/*.{css,scss}'", + "preinstall": "node ./internals/scripts/CheckYarn.js", + "prestart": "yarn build", + "start": "cross-env NODE_ENV=production electron ./app/main.prod.js", + "start-main-dev": "cross-env START_HOT=1 NODE_ENV=development electron -r ./internals/scripts/BabelRegister ./app/main.dev.ts", + "start-renderer-dev": "cross-env NODE_ENV=development webpack-dev-server --config configs/webpack.config.renderer.dev.babel.js", + "test": "cross-env NODE_ENV=test BABEL_DISABLE_CACHE=1 jest", + "test-all": "yarn lint && yarn tsc && yarn build && yarn test && yarn build-e2e && yarn test-e2e", + "test-e2e": "node -r @babel/register ./internals/scripts/CheckBuildsExist.js && cross-env NODE_ENV=test testcafe electron:./app ./test/e2e/HomePage.e2e.ts", + "test-e2e-live": "node -r @babel/register ./internals/scripts/CheckBuildsExist.js && cross-env NODE_ENV=test testcafe --live electron:./app ./test/e2e/HomePage.e2e.ts", + "test-watch": "yarn test --watch" }, - "resolutions": { - "natives": "1.1.3" - }, - "browserslist": [ - "electron 2.0" - ], "lint-staged": { - "*.{js,jsx,ts,tsx}": [ - "cross-env NODE_ENV=development eslint --cache" - ], + "*.{js,jsx,ts,tsx}": ["cross-env NODE_ENV=development eslint --cache"], "{*.json,.{babelrc,eslintrc,prettierrc,stylelintrc}}": [ "prettier --ignore-path .eslintignore --parser json --write" ], @@ -59,33 +54,41 @@ "files": [ "dist/", "node_modules/", - "assets/", - "utils/jupyter/utils.py", "app.html", - "viewer.html", "main.prod.js", "main.prod.js.map", "package.json" ], - "mac": { - "icon": "resources/icon.icns", - "target": "pkg" + "dmg": { + "contents": [ + { + "x": 130, + "y": 220 + }, + { + "x": 410, + "y": 220, + "type": "link", + "path": "/Applications" + } + ] }, "win": { - "target": [ - "nsis" - ] + "target": ["nsis", "msi"] }, "linux": { - "target": [ - "deb", - "AppImage" - ], - "category": "Development" + "target": ["deb", "rpm", "AppImage"], + "category": "Education" }, "directories": { "buildResources": "resources", "output": "release" + }, + "publish": { + "provider": "github", + "owner": "electron-react-boilerplate", + "repo": "electron-react-boilerplate", + "private": false } }, "repository": { @@ -114,11 +117,11 @@ ], "license": "MIT", "keywords": [ + "eeg", "electron", "boilerplate", "react", "redux", - "flow", "sass", "webpack", "hot", @@ -126,123 +129,149 @@ ], "homepage": "https://wp.nyu.edu/brainwaves/", "jest": { + "testURL": "http://localhost/", "moduleNameMapper": { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/internals/mocks/fileMock.js", "\\.(css|less|sass|scss)$": "identity-obj-proxy" }, - "moduleFileExtensions": [ - "js" - ], - "moduleDirectories": [ - "node_modules", - "app/node_modules" - ], - "transform": { - "^.+\\.js$": "babel-jest" - }, - "setupFiles": [ - "./internals/scripts/CheckBuiltsExist.js" - ] + "moduleFileExtensions": ["js", "jsx", "ts", "tsx", "json"], + "moduleDirectories": ["node_modules", "app/node_modules"], + "setupFiles": ["./internals/scripts/CheckBuildsExist.js"] }, "devDependencies": { - "@babel/core": "7.10.2", - "@babel/plugin-proposal-class-properties": "7.10.1", + "@babel/core": "^7.10.2", + "@babel/plugin-proposal-class-properties": "^7.10.1", "@babel/plugin-proposal-decorators": "^7.10.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", - "@babel/plugin-transform-flow-strip-types": "^7.10.1", - "@babel/preset-env": "7.10.2", - "@babel/preset-flow": "7.10.1", - "@babel/preset-react": "7.10.1", + "@babel/plugin-proposal-do-expressions": "^7.10.1", + "@babel/plugin-proposal-export-default-from": "^7.10.1", + "@babel/plugin-proposal-export-namespace-from": "^7.10.1", + "@babel/plugin-proposal-function-bind": "^7.10.1", + "@babel/plugin-proposal-function-sent": "^7.10.1", + "@babel/plugin-proposal-json-strings": "^7.10.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.10.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", + "@babel/plugin-proposal-numeric-separator": "^7.10.1", + "@babel/plugin-proposal-optional-chaining": "^7.10.1", + "@babel/plugin-proposal-pipeline-operator": "^7.10.1", + "@babel/plugin-proposal-throw-expressions": "^7.10.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.10.1", + "@babel/plugin-transform-react-constant-elements": "^7.10.1", + "@babel/plugin-transform-react-inline-elements": "^7.10.1", + "@babel/preset-env": "^7.10.2", + "@babel/preset-react": "^7.10.1", + "@babel/preset-typescript": "^7.10.1", "@babel/register": "^7.10.1", - "@nteract/core": "^14.0.0", - "babel-eslint": "10.1.0", - "babel-jest": "^26.0.1", - "babel-loader": "8.1.0", + "@types/enzyme": "^3.10.5", + "@types/enzyme-adapter-react-16": "^1.0.6", + "@types/history": "^4.7.5", + "@types/jest": "^24.9.1", + "@types/node": "^12", + "@types/react": "^16.9.17", + "@types/react-dom": "^16.9.7", + "@types/react-redux": "^7.1.6", + "@types/react-router": "^5.1.7", + "@types/react-router-dom": "^5.1.5", + "@types/react-test-renderer": "^16.9.2", + "@types/redux-logger": "^3.0.7", + "@types/sinon": "^7.5.2", + "@types/tapable": "^1.0.5", + "@types/vfile-message": "^2.0.0", + "@types/webpack": "^4.41.3", + "@typescript-eslint/eslint-plugin": "^2.17.0", + "@typescript-eslint/parser": "^2.17.0", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^25.1.0", + "babel-loader": "^8.1.0", "babel-plugin-dev-expression": "^0.2.2", - "babel-plugin-flow-runtime": "0.19.0", - "chalk": "^4.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24", + "browserslist-config-erb": "^0.0.1", + "chalk": "^3.0.0", "concurrently": "^5.2.0", - "cross-env": "^7.0.2", - "cross-spawn": "^7.0.3", - "css-loader": "^3.6.0", + "cross-env": "^7.0.0", + "cross-spawn": "^7.0.1", + "css-loader": "^3.4.2", "detect-port": "^1.3.0", - "electron": "^9.0.4", - "electron-builder": "^22.7.0", - "electron-devtools-installer": "^3.0.0", - "electron-rebuild": "^1.11.0", + "electron": "7.1.13", + "electron-builder": "^22.3.6", + "electron-devtools-installer": "^2.2.4", + "electron-rebuild": "^1.10.0", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.2", - "enzyme-to-json": "^3.5.0", + "enzyme-to-json": "^3.4.4", "eslint": "^7.2.0", - "eslint-config-airbnb": "^18.1.0", + "eslint-config-airbnb-typescript": "^6.3.1", "eslint-config-erb": "^0.3.0", "eslint-config-prettier": "^6.11.0", "eslint-import-resolver-webpack": "^0.12.1", "eslint-plugin-compat": "^3.7.0", - "eslint-plugin-flowtype": "^5.1.3", "eslint-plugin-import": "^2.21.2", "eslint-plugin-jest": "^23.13.2", "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-prettier": "^3.1.4", + "eslint-plugin-prettier": "^3.1.3", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-react": "^7.20.0", "eslint-plugin-react-hooks": "^4.0.4", "eslint-plugin-testcafe": "^0.2.1", - "express": "^4.17.1", - "extract-text-webpack-plugin": "^4.0.0-beta.0", "fbjs-scripts": "^1.2.0", - "file-loader": "^6.0.0", - "flow-bin": "^0.127.0", - "flow-runtime": "^0.17.0", - "flow-typed": "^3.1.0", - "husky": "^4.2.5", + "file-loader": "^5.0.2", + "husky": "^4.2.0", "identity-obj-proxy": "^3.0.0", - "jest": "^26.0.1", - "lint-staged": "^10.2.10", - "minimist": "^1.2.5", - "node-gyp": "^7.0.0", - "node-sass": "^4.14.1", - "npm-logical-tree": "^1.2.1", - "patch-package": "^6.2.2", - "prettier": "^2.0.5", - "react-test-renderer": "^16.13.1", + "jest": "^25.1.0", + "lint-staged": "^10.0.2", + "mini-css-extract-plugin": "^0.9.0", + "node-sass": "^4.13.1", + "opencollective-postinstall": "^2.0.2", + "optimize-css-assets-webpack-plugin": "^5.0.3", + "patch-package": "6.2.2", + "prettier": "^1.19.1", + "react-test-renderer": "^16.12.0", "redux-logger": "^3.0.6", - "rimraf": "^3.0.2", + "rimraf": "^3.0.0", "sass-loader": "^8.0.2", - "sinon": "^9.0.2", - "spectron": "^11.0.0", - "style-loader": "^1.2.1", - "stylefmt": "^6.0.3", - "stylelint": "^13.6.0", + "sinon": "^8.1.1", + "spectron": "^10.0.0", + "style-loader": "^1.1.3", + "stylelint": "^13.0.0", "stylelint-config-prettier": "^8.0.1", - "stylelint-config-standard": "^20.0.0", - "tar-fs": "2.1.0", - "uglifyjs-webpack-plugin": "2.2.0", - "unbzip2-stream": "1.4.3", - "url": "0.11.0", - "url-loader": "^4.1.0", - "webpack": "4.43.0", - "webpack-bundle-analyzer": "^3.8.0", - "webpack-cli": "3.3.11", - "webpack-dev-server": "3.11.0", - "webpack-merge": "4.2.2" + "stylelint-config-standard": "^19.0.0", + "terser-webpack-plugin": "^2.3.2", + "testcafe": "^1.8.0", + "testcafe-browser-provider-electron": "^0.0.14", + "testcafe-react-selectors": "^4.0.0", + "typed-css-modules-webpack-plugin": "^0.1.2", + "typescript": "^3.7.5", + "url-loader": "^3.0.0", + "webpack": "^4.41.5", + "webpack-bundle-analyzer": "^3.6.0", + "webpack-cli": "^3.3.10", + "webpack-dev-server": "^3.10.1", + "webpack-merge": "^4.2.2", + "yarn": "^1.21.1" }, "dependencies": { "@babel/runtime-corejs2": "^7.10.2", + "@babel/runtime": "7.10.2", + "@fortawesome/fontawesome-free": "^5.13.0", + "@hot-loader/react-dom": "^16.13.0", "@nteract/messaging": "^7.0.7", "@nteract/transforms": "^4.4.7", "ajv": "^6.12.2", - "@babel/runtime": "7.10.2", + "connected-react-router": "^6.8.0", + "core-js": "^3.6.5", "d3": "^5.16.0", "devtron": "^1.4.0", "electron-debug": "^3.1.0", + "electron-log": "^4.0.6", + "electron-updater": "^4.2.0", "font-awesome": "^4.7.0", "hazardous": "^0.3.0", "history": "^5.0.0", "kernelspecs": "^2.0.0", "lab.js": "^20.0.1", - "lodash": "^4.17.15", "lodash.clonedeep": "^4.5.0", + "lodash": "^4.17.15", "mkdirp": "^1.0.4", "moment": "^2.26.0", "mousetrap": "^1.6.5", @@ -250,21 +279,20 @@ "papaparse": "^5.2.0", "plotly.js": "^1.54.2", "rc-slider": "^9.3.1", - "react": "^16.13.1", "react-dom": "^16.13.1", - "react-hot-loader": "^4.12.21", + "react-hot-loader": "^4.12.19", "react-plotly.js": "^2.4.0", "react-redux": "^7.2.0", - "react-router": "^5.2.0", "react-router-dom": "^5.2.0", "react-router-redux": "^5.0.0-alpha.9", + "react-router": "^5.2.0", "react-toastify": "^6.0.5", + "react": "^16.13.1", "recursive-readdir": "^2.2.2", - "redux": "^4.0.5", "redux-observable": "^1.2.0", - "redux-thunk": "^2.3.0", - "rxjs": "^6.5.5", + "redux": "^4.0.5", "rxjs-compat": "^6.5.5", + "rxjs": "^6.5.5", "semantic-ui-css": "^2.4.1", "semantic-ui-react": "^0.88.2", "simple-statistics": "^7.1.0", @@ -277,5 +305,28 @@ "node": ">=7.x", "npm": ">=4.x", "yarn": ">=0.21.3" + }, + "browserslist": ["extends browserslist-config-erb"], + "prettier": { + "overrides": [ + { + "files": [".prettierrc", ".babelrc", ".eslintrc", ".stylelintrc"], + "options": { + "parser": "json" + } + } + ], + "singleQuote": true + }, + "stylelint": { + "extends": ["stylelint-config-standard", "stylelint-config-prettier"] + }, + "renovate": { + "extends": ["bliss"] + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } } } From 57b81c167801bd729477e67abda6a10ad9160ed4 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 21 Jun 2020 14:07:34 -0700 Subject: [PATCH 04/66] tsconfig --- tsconfig.json | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 tsconfig.json diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..79a055ac --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "CommonJS", + "lib": ["dom", "esnext"], + "declaration": true, + "declarationMap": true, + "noEmit": true, + "jsx": "react", + "strict": true, + "pretty": true, + "sourceMap": true, + /* Additional Checks */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + /* Module Resolution Options */ + "moduleResolution": "node", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "allowJs": true + }, + "exclude": [ + "test", + "release", + "app/main.prod.js", + "app/main.prod.js.map", + "app/renderer.prod.js", + "app/renderer.prod.js.map", + "app/style.css", + "app/style.css.map", + "app/dist", + "dll", + "app/main.js", + "app/main.js.map" + ] +} From 776099264454db8da927b3dc3c16d6c5206ca46b Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 21 Jun 2020 17:30:43 -0700 Subject: [PATCH 05/66] scripts and test --- internals/flow/CSSModule.js.flow | 3 - internals/flow/WebpackAsset.js.flow | 2 - internals/img/eslint-padded-90.png | Bin 6742 -> 0 bytes internals/img/eslint-padded.png | Bin 9731 -> 0 bytes internals/img/eslint.png | Bin 10125 -> 0 bytes internals/img/flow-padded-90.png | Bin 5380 -> 0 bytes internals/img/flow-padded.png | Bin 5737 -> 0 bytes internals/img/flow.png | Bin 6364 -> 0 bytes internals/img/jest-padded-90.png | Bin 3131 -> 0 bytes internals/img/jest-padded.png | Bin 3965 -> 0 bytes internals/img/jest.png | Bin 3821 -> 0 bytes internals/img/js-padded.png | Bin 4680 -> 0 bytes internals/img/js.png | Bin 5128 -> 0 bytes internals/img/npm.png | Bin 2455 -> 0 bytes internals/img/react-padded-90.png | Bin 4068 -> 0 bytes internals/img/react-padded.png | Bin 5124 -> 0 bytes internals/img/react-router-padded-90.png | Bin 6514 -> 0 bytes internals/img/react-router-padded.png | Bin 4801 -> 0 bytes internals/img/react-router.png | Bin 4640 -> 0 bytes internals/img/react.png | Bin 5639 -> 0 bytes internals/img/redux-padded-90.png | Bin 13160 -> 0 bytes internals/img/redux-padded.png | Bin 19243 -> 0 bytes internals/img/redux.png | Bin 20464 -> 0 bytes internals/img/webpack-padded-90.png | Bin 3979 -> 0 bytes internals/img/webpack-padded.png | Bin 4999 -> 0 bytes internals/img/webpack.png | Bin 5576 -> 0 bytes internals/img/yarn-padded-90.png | Bin 6264 -> 0 bytes internals/img/yarn-padded.png | Bin 6613 -> 0 bytes internals/img/yarn.png | Bin 2181 -> 0 bytes internals/scripts/.eslintrc | 8 ++ internals/scripts/BabelRegister.js | 2 +- internals/scripts/CheckBuildsExist.js | 30 ++++++ internals/scripts/CheckBuiltsExist.js | 28 ----- internals/scripts/CheckNativeDep.js | 51 ++++----- internals/scripts/CheckNodeEnv.js | 3 +- internals/scripts/CheckPortInUse.js | 27 +++-- internals/scripts/CheckYarn.js | 5 + internals/scripts/DeleteSourceMaps.js | 7 ++ internals/scripts/ElectronRebuild.js | 15 +-- internals/scripts/RunTests.js | 13 --- test/.eslintrc.json | 13 +++ .../__snapshots__/counter.spec.ts.snap | 13 +++ test/actions/counter.spec.ts | 45 ++++++++ test/components/Counter.spec.tsx | 71 +++++++++++++ .../__snapshots__/Counter.spec.tsx.snap | 67 ++++++++++++ test/containers/CounterPage.spec.tsx | 61 +++++++++++ test/e2e/HomePage.e2e.ts | 97 ++++++++++++++++++ test/e2e/helpers.ts | 4 + .../__snapshots__/counter.spec.ts.snap | 9 ++ test/reducers/counter.spec.ts | 25 +++++ 50 files changed, 498 insertions(+), 101 deletions(-) delete mode 100644 internals/flow/CSSModule.js.flow delete mode 100644 internals/flow/WebpackAsset.js.flow delete mode 100644 internals/img/eslint-padded-90.png delete mode 100644 internals/img/eslint-padded.png delete mode 100755 internals/img/eslint.png delete mode 100644 internals/img/flow-padded-90.png delete mode 100644 internals/img/flow-padded.png delete mode 100755 internals/img/flow.png delete mode 100644 internals/img/jest-padded-90.png delete mode 100644 internals/img/jest-padded.png delete mode 100644 internals/img/jest.png delete mode 100644 internals/img/js-padded.png delete mode 100755 internals/img/js.png delete mode 100755 internals/img/npm.png delete mode 100644 internals/img/react-padded-90.png delete mode 100644 internals/img/react-padded.png delete mode 100644 internals/img/react-router-padded-90.png delete mode 100644 internals/img/react-router-padded.png delete mode 100644 internals/img/react-router.png delete mode 100755 internals/img/react.png delete mode 100644 internals/img/redux-padded-90.png delete mode 100644 internals/img/redux-padded.png delete mode 100755 internals/img/redux.png delete mode 100644 internals/img/webpack-padded-90.png delete mode 100644 internals/img/webpack-padded.png delete mode 100755 internals/img/webpack.png delete mode 100644 internals/img/yarn-padded-90.png delete mode 100644 internals/img/yarn-padded.png delete mode 100644 internals/img/yarn.png create mode 100644 internals/scripts/.eslintrc create mode 100644 internals/scripts/CheckBuildsExist.js delete mode 100644 internals/scripts/CheckBuiltsExist.js create mode 100644 internals/scripts/CheckYarn.js create mode 100644 internals/scripts/DeleteSourceMaps.js delete mode 100644 internals/scripts/RunTests.js create mode 100644 test/.eslintrc.json create mode 100644 test/actions/__snapshots__/counter.spec.ts.snap create mode 100644 test/actions/counter.spec.ts create mode 100644 test/components/Counter.spec.tsx create mode 100644 test/components/__snapshots__/Counter.spec.tsx.snap create mode 100644 test/containers/CounterPage.spec.tsx create mode 100644 test/e2e/HomePage.e2e.ts create mode 100644 test/e2e/helpers.ts create mode 100644 test/reducers/__snapshots__/counter.spec.ts.snap create mode 100644 test/reducers/counter.spec.ts diff --git a/internals/flow/CSSModule.js.flow b/internals/flow/CSSModule.js.flow deleted file mode 100644 index 6bd2a54f..00000000 --- a/internals/flow/CSSModule.js.flow +++ /dev/null @@ -1,3 +0,0 @@ -// @flow - -declare export default { [key: string]: string } \ No newline at end of file diff --git a/internals/flow/WebpackAsset.js.flow b/internals/flow/WebpackAsset.js.flow deleted file mode 100644 index 37d49d3e..00000000 --- a/internals/flow/WebpackAsset.js.flow +++ /dev/null @@ -1,2 +0,0 @@ -// @flow -declare export default string diff --git a/internals/img/eslint-padded-90.png b/internals/img/eslint-padded-90.png deleted file mode 100644 index d3c59cbaf94e8e2c9a0ae974d91d820c7278f2e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6742 zcmV-c8mZ-pP)f(skBvFT1#=&)@7v?w4fq`7{e%JA_JM;%X{w*zy7iJZ=Ze6z4yJBqdBWp)1NseM zmj%wTz&aMVPiBEDO^Id%nw%@+bAd~X=fkZ?gG5*Hqo5_uw{(kGw@UOZuk0#h>(W@x z!{w;}+UD&#LdNx8lL4mCIk~71NI^Wf5S0QKCZS=GBQ4O(c~@CgvcR1d?i(s-sawkO z`VhtZX?BsykntgMkvdN)0j+tufZszp#SCPTZp9Fr8L|M16y&cWllue@Ut(TdECh6w z{^Iv2XiM!V)PWb3@+zle1ud3=bdeeFFy`m42k3c9KaTW^L6*8$AXVwg$E|}jn-z1J z!f$V)&j<>xP68p5K#7p$Db!tFPZIp4yoDv;(AaMRN6jZN3Fvu|8q#`UM+MvpE{p~O zPA7_zC<$U-rII{v;>@f(S%f@_pD;i{T$ly%B3YUx4s|F#@|nV*LM+3A>~~QnI7O!S z%-bAiemVLw!CTCNoRk6pK{Tk~YDLiz!FH*V@+K~}l-G?6Gke(J3XH2Tp0qRog;;P} zL@|l3Lf?h<_&^u4I|A>r9(%XU)+j2=L%n){KFo2e1J}7|2*5fsTKevs?UX!E-@G^) z>;$_OcroxL;B$tZFSte6ekjBb`OHYqTd6#Yg1m5CBFE#?2qfyj@6Ezob50pYA0ot| z^}j6flSvpxPAv3V-cje!=!it+NK$Z~SD48R{kg%}z#jnPS!;Iz>rGr}W?wASW74Wo zbSQGR72-Md*GOW!7-Dx~F!6d5KYcjjv=7jSoR*vTE%)Stxun?9_}y>_gOW5w85w13 z>a2>(>_3HFi1-y?vjfnYY}1--=i=`X(Cf_Xa>MQm&qmNyWGm78(&W%*APJ!x=K-U` z2ilBx3rznnbJgS`3xeMpnzY|u4{b0dPm ztMh59VhTq(ikjb_30i-*;2OzZ2;7!Nqial!PthE1u==8tSo5;gyzug~ShQ>b{p!5noCwQx@d%M zr_0p%bYV)u7NqsSTEV}$M;aUyw{D_ti0;0dm$J-EEb^{2vv(ejluo?;s`LKmU3aIW=3PE zPQ6*9Gu>s&qtCKw!#2iuPck&zOdN?hfV|qU8!*lZRePfX&=zUQ(Kj+iNi%U;;w8X$ z4hEzN2rsl4DOh znu}g@F2|nsV{|$eL5^*e=(IXaPqgTEjbm4@;G)-_$1$fZXJXF*I_(bD?Pi0{zsXpO z^xH_=e0?Picxh>X=mQYx0Ub$0m~J>!v!m``PF;ER+=of_Tfm#$oU+`n4jM6Xh9zL) z_X83)fvyI96X;69x?QFxrcq5SIc70u{NyRDT(unQbZNIbWjhHi1%`krAJ=ZD16|{& zW0tV=_#>G<(Bi<}DW(s!s5k1=Y67DLx?AuM1|x#=lXrwAO{t_$pdcjk@i9<@9!71MmRw^ZAW-ENAI)i#hA1r?SS&>Be#j_I?KVRbVY<|Cwxka9<@e z3#~kxLx%Oh!fL~2O9y4%#m4-G!Ai4i)Gb&MBr79o`M~Yp0=pFW1>lj`eyrQ2HPxa$ z)n?U;PT+!9pT&}uOXzltsqty7TPRQ963~61Pk}83I|1|s(AR(q131FE;n{Ad%aWCg zx!`Bc=9CLgpgq;0HQBn{EpRKaX1316PQN8Ik?#=fX#l$2E@O*FSaS3t zR-C+yeY+;uwPg>Dp*ppCn$Xk0-4eH%u@rHZP%U@Y-BXC-dIV$C;NNF!*rQb$JzFxk z3hDBsH+&V$3hgbkyJWf$cqgzUJ!{5+eFvyFYMg!P>70GZYDO20mhInyQ{O<4!|wx) zdPfHhes+Hu=w{%4;EKHAE>40yehR0rJ&B>=22&GLSl3cf22Ts#EMuL)Lus9g=-_yN zgY|SZaPeI6o2xQhB58e42;d7xshbAEwj#Y1?BPV0=(IburrNB2$;n)J#W^fm>K7%o*!eF}8S&ZYP+O zx!42l!R#GKlfIpn`c6`oLxO8&w}mS}&ywB-c8--gt27L;-+O@_Bp+Y2TM^`oPU7VA zj$?G;FjLWt%hK_{XTa_PE+~WN0DG&eV8Z~g0lgf!m*8zK2jZHEv47V%iZFolEt|=#qoP>LoAFb?YX>x-lxB5UfEP%*7W2J5-^~b;D-5^+j9|9V z)w6G2ow;rm$N%_BCiYG;J=w}RXNX|xZ2-Ns7cirTEvitI^7cy_0j&o;47@AvZ+p5! zr(+y{<_gYOcM4|E?UoF>G0cX1*WJAD5$7};jT z*FicRV|4K-N1wcusfp=onO6cEfe(O<4sK!oS*2A)O3wW~&n*Z06R`V%S9v3>+huBE zniZ!kV{CC)Gs)W!jE-XMrVt%2OAN&6!0*haMP>u~5=mDUKYjN)pUlx!@ogigx4WEp z_A%7!wV-f9S^<0o^mp`K4a=KX{a#HrAaB3>>H8YsPT=o>#Q@ed>h&5Yo^veSc0P-W zeaxcdVymsFSxEXNU{#++rZgkaCapKKdYC$v#lZP*C6SeFkEJ|~X1&_~w*!}!Ij%H3 z^l~K?S`KQp(tdKhUtawJ=rySL4y9xaXc|M}w}JL2}Fp^qYje zGIdKy+h+ZZqQg?vr4DAC>}jkFKvnVOfajp)v~nH&xqXmqFV#1kL(=V9pOTEUp+RPK zSXQDE{TG3CeHsJgK$jLn7&CaUrB!gn(KCGI%U8^k<>6*uy1M=9n;g`T-ZaR38)WMB z`^@wAl-1)U^;T7E#hFjrY#l0m#;v))jn_HubCS_!dOy-?m2z9+>@>phrtegh2di(< zDt!!0{lr66bPVFye)ndp&r_{ZMhu(q&o{I5K-_7?_ zI4ohrE-`qMsDJm6qR|OWuB|%+Xe|I*PVAEk(s*DR071 zG!4DdpGmB3FrI?Ivo7Y%D)uNdTFjhDvY6(=(K9K=+33|)%ypIwRPz)Z?Nw)rP6Oss zg-%ApNTkP3L}Q*&y1W88H)Z2XA@w#yWeS zAq&TZ5*BH&Z$zYx*gW>G1Kb4mTo%V2?zmpGvaAaFA_kS`deE<#yFq`>%(=6gx5}~k zvsF%??R&rWl&>Dunz+`=%CFiJ;}N01$m6!EZ1*UpkH)1xQiM_T3dugx{itHo@@anc z?NC1up+5lqXfq8)kF*>>A0*E!mpr7n=(A$SEW^dmHx}RdAlaTN^q=21n%P5XXTdAY zST$K4*;$lcmYzu&riUsWw~U_OtJ3ImpUSbcFsWtzpDUm5*xPn4C5z{Zj2n6ixcY)7ZybQK7> zTWGjwE#c5cc3r=c2WhO^FuS9qvt1d+#wLEZ;`S z)$dgWI;h-g-js&QP3!YqSf(TZ>+K=+so_HEEdeeu;}bxLBx zW9-r@OL3V*W4K<8m)KhFaIULM^QYX(o;*2lMlX;(c0eVs0Nb5JgrG50qc~@tiH;Z< zi?Y?YszD$ybOZ1h1JaCphQe+Jo(`D$g0~eoV~L}!0*oZ~Z6Bvoj^zAv;A4T^XHte# z?)6h@p1+?=?l())_kF;%z~@6dq0{cLZ^w8w-lUKY315%Fi{jF7>*^t4pBMlmF#9g} zCNuj;5hUZzNd(zDCen_vU-gD~^1)5CTU{E>hBtPS5H9vY(4B(;s&aQfIXXzT4%EU1 zb{ipd_zxh&1U5&8=(M{$@xUhPjYg>r9^B|6BYm61-!>6;r+)(YdS3C!f?=L{WE(&H=2Pr_b{x#Y$$%p57fcFDXQ9e1Gl1&{!&{`e z#@^kDxYf06s?;oQkQ*|N0alx3gHW$gZ`A0vyKMNz8^qm-6AplV6m$;omrhho)SGq27LW1NLz{Wze;%hXRA<;3AT!;B&NQ=QJ)mB= zDeEyUhR}zF9vIlH{#M7V*Ud=J^}67pVJ0mCZl@IV7vy)nS*PBt^Vq#laqpKNWY6~f zELbv1y;;vi&Q`Fuft?5Xul|;ZgFZ+$3$V|JGWZQ(CqO#I)u^$1%O39i(gQqp-;by_ zJx02!Y%~i@<*X7vv8&nsum& z?LT^s4fj03)8F4pd#cUCBi*!4jk=$36yqwer(y*em{h)}8Sp)@R|2mm#8=}3z3|8} zI_)m^f8_@}_}`DRQ{~^#d!0!MH%AlmC zKMQsv@CmZr2GwdI%*(oLeRMlp9^J`vTlX+LI+Uz|U?>?#XPEH;iPy!pgIgS_KZRlz zx(DN8vXcda(w*^jZ0TslX)CTqv;R$jb|8Cga>xxzhanwiQyuXl!ntk<-3N4#s0oHf zhnUzi$+J)FV&|qk&^4ByxD-jWTV2PZ1G)?NTd*Yr#pzH^Mmc;X@HMhgXbjbkIF`KP)MczZbvX-`j4`!;DlJEn<cu&+@k$Hu&&ICq|g@h0FH!M8!QvwQ1aCihLU z{Dh-u3^(Ys{cvZd5Cy{vhN;zHL|mv4OR^7m zSkN}0Ruj$9CR5|n?0jYqowhMF(q!S0V}vu{VVPuTq{+}olfB#b^V9=dc;dU8=yp1c z9x+l{$PzjNco(w2LtKPWlStw?4V?(_DS3M>e8!i!Y?Qc4qBYpJ>%DqK$HBkd0E}NV z@v)*)y%wp<;|e3j$K$`ow-MK2`m%dmj#cYG8`WUts^uKLYB|e}4{u4^@$@dXJ-VGO zkL|!ZMsuV|5k8zg-iY*m;Iw|t&vji7z0?;2^m<{Rp9?H`@&lcR_r^l;H<-Oy=tV?X zmR`dKV8uC*Vuv?|mStKTINwZn0{;xWA9%>Espd!%GvmnzHnVf{9u_TM2#CGg_pxv1 zIAe=PQM1Q^d9lHbl3tM6kvyV(Vi&*!tLZT9Yjn9ptN zctr{Wz{>54$~9Z?EEs`O$N(7AgoC1ol@8_Y2Bkm57tC}=TJR@Z(aT)*{3_mZo2`V! zNN!2PLhnJk5A=4hCPZ_vS!Z}`h~crJ;Jz0}H%3gXm-KC!epOP@P6* z6d?%ZB3z3l0ueVRyj@ZLr*n}2tXN^uY={5Q*wI|+(PO&6K;Rp2(kDOsK85S*AVA)SktO;LuMcFELKfI8)M zb0gO0W@)4X{E->Y&Idq6kYm+cIQaB&;Em?z2i=6~(tAG?6=$X_%jTE8 z!AzG0x0_MWuLBGF`ZC@hH!B=mR~0dzyD%wldPZROElHm~Y*b>J&-Wy6!t4gYr^C{K zQYb>P%@tBu$8k=wsEZ1_Eb?JFFCf`c(DgwwSh6J2OS6m=o)${;SwW$M9nqfpJhUy* zKL||B7dZ3!T4RI1MBE#`Tj@qmJf6$QWXHxusR(+CbVzyKSSXZCPV=ycVo9^GY%C6@ z+vwrBav7HPLk-{#Gu_@B7;x~Hr^L~RZXuTN#EjpS^c9R+J{|pCrIzK*-b9fO3?$~y zyt}FtP=%I`IKtmfGL!yN0*Dq1&>_k+P?^br{Fi2p)p?)CC=bpdB#jRUwN==zGNF1U4^JId$-V* zIc$K;`Onk5|L+W0`YV~Xf&G$6Cr0M&7Hb|!{Uwtso!4`7!qJMtHM}*Qe54Y13FpF? s$Y*Y0p-{S4i}^PKA5(a}+w+qCA2GA8Z(?jp$^ZZW07*qoM6N<$f?KdkHUIzs diff --git a/internals/img/eslint-padded.png b/internals/img/eslint-padded.png deleted file mode 100644 index d6f9a1af3af2e64fe8b8a4f3f488efbad1ae2f4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9731 zcmV+eCj8lnP)p!w001BWNklgnc#o#y;ZlCR8^8nAS;0o2n3n{0@6xrYdebj(5*JpIyQ>iXiqES!t*GifDP*O zJmc0bgNk=iSEf0!2YUlxHfu0Aw*j3s3;DH<~>FsDemwf&oOdVL(c% z9%qx)5SP)0+53l>*3m&Fd)OoBcYyoT2*(<}cki>@eb4dBHU~W@f3I-4Yeh|aK@r3R z+ZI*Zu4(T<-1^zGsAn0~EVdw7&!{RQlI0!nLWVVPxO< z8pQFP7nC*Z#Y6~V6JoRdS?;bbanHJZEUgsNI<9f;pa`4@e85MT&#R<^RdwF3Onff} zF7us4HWbU8mr(j7=n}-tLp5o9M_Ybc<8Lnl*p;?Ak&il`7dVDQF9i z*EX~!{Gh;9z`4M;=>UR!0g*FR^{>OWk>FRH)^J?q@veN5rxnX`F`fXg!e{4Gu+q7V zSc0tt9PK572v?}+S$>!irk_cMWY21c7Zw)|btF*L63k)+@m;$5NznBupD5}~H%89G zVc=>-&r~HdG$xu%jyI_vX)xWKMk;xU0)7L$0`#Q< zcRM?qm6I$_u}++|{ef5Mv=8d)=jO^oy!tu_e9~3zBKk@}Ukcol>)47g)tu(=z9Wn*9pd~KY~ZYCt)o({ zGPZA=)=bN-2*vHdcYzCl|E|hDt8rXivVyqsiVYWsck|IwMymm>oU8EaV;#- zSFv*a2@H-50PxiA!)&{EJG-~+r#0Q8f4Cnv(PGW4_u@uX^%_Lp85J?8TcO%d!;9iY zVfvJaoB+%eq&6$~-aURtM>Ry8w*2)+n>N7LMC3G)z@ZY`_~zc>)ZU9zcLpCiR+2L3 z7ewS$!1pys+xCnA6Ne{h&9qp%aU~m`wT@M1EMuxMO?|9EV`7TIk$zULKatUu3u)A+ zII!ywI-~UV^|*5So~ADFBY|&-$O=(C(+>CIGTZtF;kJBY)p^hkdD;P0Y63sWThiIV zqr1Q4?xU1mbTkqy0P-B*)`(S2FSv{}_#X;uG}4HkGhK(?D#!;Az1>SK!8&h+$?*m= zQ`0P2wTQLnuV&@?6KPIPF*(-AY_3UMvq_SHk$ze;E%t2P$JV=duz%-421fen8|X!6 z!m{{Mi^yf5*D0LqgkFMaOS1a}XE2g2h-p+mH^x^GVI|0}IrTvXp#;z0RHZ507vo+d zVIk{qB`VlUOG2lp>Q>+efxj)vRw}|&eTs>(CW}{$aO(N1S#jD@q*`HY|G05t5{JrW zKXIr|wOV2IhUF|-y@(wT?cuQpp5XA_BMgoV&{ONl4LeZ2sqjsKcOhH@EGCdnckjJ3 zq9K&`II%j~Nw)DhZdUYVMRlDEL@Ijyiq{{-jFtQa@EQ@zrFo$QiMG->Y%>1L=I9$D zaudkq0(U#C$qT6nGt(``pQ_W_-^=M2pUj3!*0FT;A|}V1H0#YwJxZKc_>`5kG2W!w zTV=&*OBr3c2t*h=FwW$7)2Qu;Uu|db3sw1&AR~%g==_YZKG{Im-G=oQE79JxD1xZ0 z7x)pdqkY$v!{#y-{o?cIylr++(fug>K{ZWhs^`>V97cr)UbF~bLHVE}+e{$?R;ehc zFmZ5#N^g~AYnO8B`KuXSwUGK)lc`3t&@;~H7Xb~>dJ$GzO5cJ$YW+PNc;XP7f3=<6 zoA=V&SEYYJjh1Gef>H5mI}a{a^aep*prVdLZDma2p-&am$HlkJqW}*Ja%PuppM!AQ zY%0g+v3jc13n0B12zM1DT*W&p*hjy$Ws$6JYk5Zy>J8P{L$$QE*xO& zz(l+B|3i>VL0^sXs4Z*g96GBc#kkNZ6X6Wt^>L(GTw$HUhZmhcCnsw?%EK25usWwaYRIx0L`NEwS&@O()txwW)e4xKjj;OoE&nYskC1; zQakifFVR`dmWX@=(N_U?+H!bquh42K6Nl^c)T*4kaTRC(;b|;ix0L4OG>wTy{4|8jP9iViWGN5#U2Wp?yZ7HrPvVe~o>QA7JyHkFjsZL8{d%14DggCN9%n;#Cj|&lKTC;5pEK zm}I>T3A7w=3dmz+1uue7g5wUJ)EF!O9Abp{s=-wj{Kt@3RGw^(jGgcru!c=35R!bROwTKm`pGZ${mA#K2U}kED-dax@ z-PZGdfzJrcAo2%5#V@Fcj~BG0n%ySr6n+N$wsWr-C?6(u|90UbMfW1o6D5+domE4b zl17v}KwbjubN0l}FN=vgGou_iFu{qZjI!~0XR=`N0F!p*r_gg1K+nZEP%jO_g5NZL zQqZ=lTLHcTTmx)R@-;COY6CU;27B4PWgidz>`^8T)mgA`5UB{-YIzApvu!*I!kMc4 zP>?mz2nqjBkZ_yY7F16wC}bgg|K4Z2`#DLlAYT-bbDazr!{Iz;34XJgtG6QD>uM6F zR5dEOex%9Tr=7&c=bb^Vzn6(alW41WwFejl`7p?rf%U0-7ysrm?GQJLcP?f~RRL~G z`sUNQM)b24VJr$}|`zEP#oXDDMA5asK=Z9_RCXQ@;@3@W% z>=We9ZXDmx$(qZ0@HvRS+Kz#-Mb3)icS#j^evX^7$BIxtJju*-i}Nnsz{cmUM-?Ux z*W36*yaRX`^c_K>0cdd9=1a>GK9@-<5G4*{Ei|B|axmi+j^32OblT==qcSa;DH zCdVdePEJMBr0TSq033;m67i!F4mUISUn)A-&Adbiv)^VmyMd1bOY_E?LWYmu^6T>B;F#LM0doD?lH%4_#Yk?Wtfl(EI4pkMh5Z z8m1j2Gg%!j<&}tBK-NUX3?P2V&j~?3qAIkeTby~xI+m?n%8>)(u?Onm_dxy`}4QjlMQdrP_k;dP7wngjbrY{sT)K((R?tnryQ4M~L0ig^{S&M{b2*Ea57C%t7N(Qth-72w zD25eawfxp*2$zT1*x>6$WNGZkitW4VE0GGcS~+`t1;*yRr@bT8 zPV%~y+@iEXoKl_-Bfwt+4*<^#OE%ScR^hKt+HJ82^F zEP)r5)i!OVJ)#vueFHGgH(z=j5HFGz~4l7d3nt zi=~}d1V!m}qLq_Vd77STWgS*#3X*IxTkP5~!&w=~+JCjEyt~YthR|`j5cDF1KPKDe zVyj5zNCAFZtYifU;uR}aW57$edLmcjLKWLi9p}|yQ7OuCo$zHiohI0~$gGA*MWFCyw~0IQu7ch4WE;KhyRmB5iLHoh@l~2-sE&i+=r;{Z z8?+l|iIO;JSUcLZOeIw+x?H>B7~Z`EAn`ECwX3QvE@XSON? z>u_0|u?KTInyHg>(@6r0Xv@;gD$%wK?P$A!l5#r#BvhQZ;igmD8l)0VKv-I3nJVuu z@?DFLGJLLxTbv5FY1pEAuLIYm4822`MiHN#Qx2{Y@@b%d+Rtk^SIn-%#Y0H0A&(qe_hE6 z=u%oK2n*@Tq_?P(Q^}nh`$p*{O2o*N=BnpTYBF{=i0o-a^)smmr%u*uK-T%!Gu6iz z;{LK79jOn3hrqtfZX6td%`I&3GJF{nF@bHplxb)amNHBcu3Z_5RCF@d%^ERWRgFp1 z*<})Z7XMF0h|b`OHV_H=C!TXM6%uZ!6K@dW=2o|h!yqLtLF!6(Jq|8S^NOfvnqwfE?y|Tp=hQWE4mNj1-Q8@ zvQTnUDNgiLVWGOsxlBWJgYQJ!CRIsvP*OdIOD$3$Z!xU`vMS6YeY^n=wv4Hc)twjV~I!lAKQ_V$3xOj%FZy4^f1zYii@SeeZIIwRZ1;Q zSN+&AmHED)xCUi$LwrhWMXSV9Zo_b8IfXVj{EhIXwbQ5%(_@tW8T0|$wPxQ}wggyE z3h!>HGxWCT_OKC^c9owCbZdjVrA@=TvBC2LCRNjd(GgCO^d|GtMYQ%7{YMdbAdFXZ zl%fB&fHUA(?*m&TdzOB54HQ@F`vr90{&0k1~d^xNd06${ofl zmtY8`Q{8;CpZ5>&VY~Z`--z$K2+H?l!HvKk&BWL)1A;x7&b&YC_d^Fb1a~}=geB}& zM|X0_+S$r(ow;^)w38E9gr7YlM@K7(X9hEsZ`)Fh=FIRS=9ovjBNNrzP<~J*4{f*X z2=XSecLfb*k7_7y=g`X@F$|?1H!EqK6TuwdX!0mC8FNWR zVnb{vr$eR*+Sn|^0;=P{yE`q~bn|Az!>W8fN+vM)sS{<#XsTYaXE{b%;4;ZcP0?={ zSCi*@ ztvTt7DekQ}z-`4$UpxaUl?v6~YSE65-^7jL8n2+y%Ag2W=7`NE-FEQ=&>bn`RC_Dt z%#i}766{NQSvyK%hm&2df%Sa^(VNTPMDdX9=*V|Qc1;NS9^W=*!ebd|FkvIK``eyoTDs zc-8F2X$AGF_Ee~kHQD~qE_!-+P|i>_$9viA3k0rxzm0Hvxv6O*!R>e=yIyDF<<&?0Heno| z7C=?$AF8oy^FH=Ic7Wm01x2cQC-7#_X97QoQSH3c?mSo@H>4@TmC}6;bH>&+z@){f zLZvDUEgod&rakQ6age^D8l@`QDrBdElXfI*M-Y)WckU?LxJ1#E6 zrT3lU>R#Y4feXPfc?jB4`iJ|d4fJx~Pafv}TOXxTmEe%^+z!)*%fXs<1S820{Pa?x@ zE^rOVuXDI;|IEN}A5szaY~9DhzxXYOo;3wWCwpJi8(gO%Ms2XiFDwfP0_eW^drx;l> zWX8++V;;Z^sh)v3mooW!SqhyUk|68>%=`7ZnD!as+*3^^`8Jbj5!|o>JHUR z3K*7J4uakQe5@dSP>`xHFx1CXv&FW1wzKWt9ZWZ87+lzo*i%#^3t=T#U!vwzzVl4D z7*#B$-s%RrSw6U7)K>)lyr2T5@V!8S=ib49s-7#ty~PdaVx`$wxEa;!RM-`Eux%Zw zRA|=C$E-$IEo9vVYgm5j5?V7Y>PMQ%yn&??KsR7cjeSM?a;0VD(-`}n`>>X(AQh#5 zK_As>g&mvru;s4pj2#%Kf1pNBUypMfCE^zVJqzSUR4+5LcTkWaRKiJFIfeChR*~g(h zV+<@DV06U@sF8GUpB?N2`5MR_zy@GN-m--Z!4H8y1HOPeJ|ZZmDt&`B`UY$4-+7RS ze!himzuw7IW17K*{qcFx5HOw&Bl2NY`Fj!0^a#6HAkn^N32~XJ5aDWsTieVq7GCps zUNoRARCJ$+^w{B({mFe&#v(Lm2~|Kgfqp=c{~L`JEMCmnQxk{k)COvte9j71owu*VdTiqJP$qt#OOY~9b3+xDTr=<*Tz2K$(9 z&bT2e0J95rAoD0VQBFnt?3q_yb9Pd`wnS);`>p27)#j>tTwkX zNEEFr_%tHd3+yGE)3&o*3RFaB)|)gNQ!HF&zLm7UW4rk{P{&XM%F+R2g7i%v>)K+qeopNb7S*f^o)p+06N$xb+VG3zc^ z!wDykGI6M$9UvYi7&?1#6PwTJ)aYN($CHm8VC!9vvwQ1)s=XBkhx)K1G@qQis{!v* z)%S`}^SU~!cHRvM9c|Glf@vdNhp?47!uRj-9USlI=&(DW1N=bYR*{VJ)Ov-P^pRD@ zPSRuyAgcbQ#K1PI>ZqENWv>upL;p1{tN9tsK2P_=BTsT@&lqdYS;^`R%NbrW#KfTq zW~OIc{wZk7jAw@y53qmxL4I@FR(5aQM{}aV(BcJVDYR8wS%ue%>U9XGhP~)FWn>3{ zi}#n^P)I^t%69rG5!rfFJrThCNw9&ns=77RLm?L{F)kj4;v%_VanD}|xlZ9hfjm(K zrY5JUAD(2%>P4KqaV5*wEv2`whlxWCTCJIEoC>NfD%A>uBLg%hnmqBy9=6@Rld=8d z3@#p^w^nt_p81_e@+?HJS3D!f{$fzK2xrw+5nk;4`w+vY$XN()7%66u000HPNkl1J?*n;;B?C3=Gw% zA8xYqktaF4_XySADvMW)(9>IGsxb`+1H*mv^j3Lt+kPJW*=Dxgvy*DI%7VoMejIDH zj<4Ivf_x0&lZvd3%IbzS$*gdM14;h^hcK(-TS0zhY36zzi%;8yP*Ze2DnoV{V6Cy^ z-)Pn*WqI6?A=Y1!O4x&PoxtZ@2Rn0sOS3*!r=`kC8&W zUMjs61{U-=8aG>PCnc0#HM3*yN2I^dlov>CPMU3eTeTcsH-T(u-?ZJq_shOMI=8nF za?k|cF6b@(i)Z$O6v+s~szKKxd7R<<6er8noLzmTnCZzM6%}M~WPq7gi|r5YV$arn zoOaR4Oi#`5+k1B~)tF{r;Q*D28Dke(Y2|W-8%1OtU}qMi?K5$KCGPWZtg8W&YlzQg zz>wD!72#+hD&|prKR6E$iLfDOZ!LtLrZv)T7((JPCjo(R&M3YHd;oYjlwdFpTm^Hq zZ?oPs>(GNWdTQ0oJJzhhBTaA-!i^};FLuwua^xXrZrjAoO7Ja^%eo#!c7XELr1=El zb(zDA(M$edFSlDEa6qDs^y;;=!3S^IsZsiVLz)2mDX>Z4Cfv4L59T|B6$Xa;85rrO z+EXdpRIm&)2EPO4`PlL#7X)=kaRDzz^$BV7>AhvXIyZ&c?#b%@Qtm+Io8iZ-{47`M zU{UCBMaz&y@e^7^-V5?Db6Z|}hYAmi$lL5$UxiC|h0A(AzB~D^d)mJekv;i?VCR07 zcJO?Ih`uF$Los}OQCdz ztHb1RVVzT20ae{gc9Qy|dqP?_)cT17S~T&pkyj4FIgRqg{`9&Ue9El4{F3+z7ju(!C(nX}fJ_733d z#g_bNFAwQ4O2-CN-;BsNY}WR0HMK1(g8jt1^MZ{EGq^0C;=O9?BuPq3k}itCfFd`5 z{w2^WB8yyEGUwf7Yld?!t;}Hx{dFgM1m(%_A#Ic{id|WAM+l2tDFobjj37M-?O4G# zQT-2ri=7t+!B!o7M}`O&)r>n_@icDeh!&00b+ih|2|f#rI?xZ4@M)zuyJqXQ+C(L6 zPn(q}TO$2i&EZeZK#K}O}Y+0rO4aclzLtvIji!R!X{O|D99TMGqUX@`Ep1$ujkcpfD35zvrD)M z2Q5lBqitL95_~(_P}Ah_%GDwqZjqK#0p+|a?Du@!_nT%cy%kSkB? zKtmjcHq6sqS(qEXgk>TO=}7CcR*GrOzsFScZyP-GrbTH>>nf=+tyjN+w;8O-3PG7H6Nxnk>e4Hs#nF1acg*ZKm^TI-a_p`E zj+c`a!lwjzC&DQ%q)>MT!O|tJ=(zyQX29Y!iqw3Vwsq%bODpj2z>hnZZhql-+F%c= zSE%_eeUNL&dg7%sG_npY&Uq0h9|6vabY!5z^z2wwv$TjSuRdD5tQW{@Qrwu6U1S+=)`UX`!Uqlw7IulBrxG{&_E$r>1 zXnvxkkT#nX5j03IgJ3cu40jU}u{n;x^P1a07)X9al>@*Xz-O7`_SgA<{}15@#R3ho R@s9ui002ovPDHLkV1nC#(menG diff --git a/internals/img/eslint.png b/internals/img/eslint.png deleted file mode 100755 index 7fc0e98015e8ab9146b3bc926d19c630d18be080..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10125 zcmaKSWmFv9wk-sA2_D?t-Ccsa6Pl)R?QYy%f(A+BZVB%0BuFC(gg|hDy9S4s@7#Ot zeLvoLHL7aMm~*bV_FkiYR8^dgmI@9g1ttOl0*;!hqTb&Y{P(g&NBw&@)3bf}+mJ(* zOrZMic2FMx7=$2a>uv+0RdWT{gY-ZETR+b+kR$>E61}5=3DiVWLmcSt$_@Aj!|m(p z@t2K&ASvVP0RTFKptLq1dq+1Z`qQpHdRj+YDSBfeO@VBt}bp6abGF=f9Z<LJd<o0-};^zhh_;R^H82+uG2!a5? zjvi1)cQ@L96ahBwUQj9ezfS)v1y_&%k#&Ro_cHxmFdkok2M-@N?>{O18>p%I|A)G| z{tp@g)dT&n-~XpD#K6x3#G?m-xO;(te>cvK;h#_*;tF680O}4laCdk4_bTc*xI^6` z4(=Yb3i`sdtj3ORw(dRk#Q9w{$L_m~}_upJacc7Om$PM~$uI>MFh5sY>pHgu3_#0Uf1a|ZW z*(!tGU1|T7vbf`a_9E~f_5Pb{`=7lC{zop)Uo$-aZ0!HF(f^+MTRs1D|EFyK4*sX` zL2iGm9sIYfvD*Fp5D*v<)fD9ne19!VVYD+Vc^bZS-K@4vtR6L@)pzv|vcF9y6H>;X zi$xT2!Uk6&z81m^EWku(FXnq^a7K&n>nzAladjDsN>Gd*&MI;=FvuOyWBDi0ea*D$ zAZx$&WIrq9`Gtx(YbE#ves!hcV{GhYX_;72;31(gC-;b#^72};U|MUVDJxLQrm^3a zi6z|%24RcvT0748A;N2nk@K-96KZ8<6tZf03mWTb$+U7&DWo|&ecC|!9n?HHOkK0w zUI%`#vJZGaxXRo+xaB<$Nxy!F&V=qS7V)a1NG@I4b=8Sh7L3RD)Ee%WjkdL#wIbjX z-bfutwJtpumSpnak~6+aUyrsj8;&j z3wK%QSs$Xq6Bc_p7X7bWhZX*(Nrto~3+hb$^yyB`jxcxDgGojAc& zsl^-7*v90GmlHmw3h0kc7}@fbHg36@T*P5+Vm9fJ;-*f1z%H0OV3#E*rY{#jTj>Xp zYN9J^4To<0o?Rvtdi#*2H>eaJoAn@$0^8f&Z#%z1%RwF189Kfa0c=H-G^!| zMJKC?9?n;aFFjGqtW^UWWS@+BgN~6?<|BK^Dy}F{hnrN#QZ$@CP|_E~@omK&5q;bO zzU3ZjMD%L~HAx1Y;4ft;us{e+CBc5=vzyO56U9MdsqaX_8y{~pALkl=a|Ex8j){+r zK36-^7qOV=jPv+kSi$TYkcgW$F2-z#6~~#^SU5gdhaam-o3;cc8QCH0z%~Drkd+56 zZuJ;N(!INC0AaXouI)arr7;l5jB3KD^1M|O4+6zhR%q#M3H{;9g2|MQzkRMR*OF}e zJGGbxWgV2>^^_J7V|y1|aXdn@QAV5Et|*@`ot}IAEL1tlE~gimvxoXV78R>2U&+3m z7E;NHqh<5tM=y;vm|yGU4Ce{5^DDgga2g!`!o7Q0LN3r-zNoE%@#@2k~_zL=+z(L*}n%Kn7LB2qv5`XCTO%L(PAinUB5?z=(8GM&77n{5%4hPeP}YYGPnUl@N;o#d$|H!cq_~Fl}I~ z_3P_CA@}rk+3BxNe1Crf^d*8Zp6LjSyt_5iM|cz6r%6}tA72ux37a7WmJw_d?tC1_ zs#nY}&0^v*ZwCH|VPEjSwMXfs0sE7z1+lz4h9?I`KCdE*LOl@faj%AE`thx~*qx-{ z`x?O;9HKW?5_o3h0zli*Pa~F6quZdl7=!#WK_XtG9V!v#_?KU>(rh|9V9GG=*B`ld zUNiApp!?mKD;OJ!WKD9hSE(;5ICq`lv8SmW%WA+U_#+Z6l5j6_kPLQO08%CgU2Y{e5^y&-Zj@554#RxX4%Rp_gl^nRI&S&;A_r@~S z^6jNM!cKdlLqZe}R>+aJKKZQCMYyW}m2#du}oiYMi)LC zL%WOPF{PnI88uVKL480i^m##m=gQz@@*(Wj!Ei=z9>@fOI)uoya(@m^Yi55NS@1^} zmT9IEmO2xp3@rbdvN8W>K7H0O6e>P{b5?M3*^}ipX@bIB-)#)Lo5H(2u>sR3HE<-+60Ex zRq(ZIH3x>e;fZT~y+-@gK~|IhQ#^`*nyECGM?@r1r=rgF7ZsQ=x!2MnP3t&YuCkiM z3Hjb{sz;&ag(L7BF&JD@N2tQvi?V#XD%GR&d#a!d+Bz_J5;aTy8P%7YG8SCy=okG# zH}^*AJS4IZ2u5r6X&pSNxEbtR<5y^QV?k;{5oc)|LT5{Wryr};Xl({)2%QnhUsz}~ z7cfQZzi+vB*qPpv8b38#lxz~{Q?rXXo3&U=3*15du~i2{frG+N8@;Xf<1}$c? zTO72*_+@6O5c0MQkpHKlUC&w0!PT`T)Zlt)kn4`!Cvwm8=UJX9%$dRW-tO=|>REuT zN#srBrAm99m~nE8=45KInx6sr%Chy914vkh4PQ-zK^W43m$I;bMXNP|Q9y4|fquAk+e%!~ z?8PLpQK718TMSFp{fu=D^B~(84^9_Q%x#wtT*5$2;?2B1IRt(wLCLI_^o3&?_jhkM zkvk*TKZ!*&ia$rz^}+Y0Fw`b-R-$rOhaH7tX$bmjA0NkFd%fcinF1cA-~HUX^vC5j z+!KN8)EHsOOizw1iH%+H=H+ygq;oGAU(sz*omHEIB-XOV?PV}9lfF`_@$9xf%f2Ty z8}{H7+EJGHcq?4cSjc6^^xdLYm2f8$?gxfj3S(u;1n|LgMSeh!tk-nbANBxSk{e*L zo-&ixxW-u;6kYx^`}g?{1#@2#3?;54JKoH%^kDc4p8{&zP&&yJ67AT_lw*GhAm&eh zG(P|FzA))F)e}iIyA*?IKr<1sQSLlK=7z}FHWhfzcGAD~4fm1C_$Dau99X8TOTrx~ zmtSJbohufCS}p3y2Nx@T6K%Sh*72=vVYkC zo-p&Yw+G0yia%Q&w7sfK%N#tAF-O$5*W`z!!&76)+IN>C zqM+8;D*1Q~47~DkmfGewoOlR<#0A~yX>*?X)!PwI5z$*dJh_OM$+<{18vZ`~nV2PW z^Q#p4>7y?X-)^}Ecty6f)2e9lSg7x>Clz12U4VnPgnRE4k;qK5ny1#!o74KfA9%4j zGD0~7Zqv!J0>$24nfPnJt@&~j9TTVGT{qAx#AAw)X74>v1lJ<~DNS}IYm;Xg-@>&B z785bHl^B0+1&ySH6iE`GR5dsCe5MkIZMm7RA>pn55xwHSk@UM~WZ3;a8ap%!XU&s! zWBT}n5#h)eFJv(^5}@E#CNy(#;Z}@B>6X_GHhJ;{2qnH}zX5x-C;KxXw=tyJ(#o_6gAH z0SsplFmz49Bye`Pa&Us+FsUY2nK?6OWoM#VU9~QC$ydKR9@V9^@ed;+!@f~;id~;Q zb$#Y7G(1lI$_HJQ6|)a&_E%m@m65kg&r+LnC@vD)m@};38Bxj7<+gB&TQzY>;yjs= z_$@oLs%sLOXYguE$CZ^H8T0iOdPQH7>D~5uM1cP!g5-I|*MW;&&KAeA-E5)f#nF@9}}>$1)vVqqQ7 znspPx-TGk+a;Ku_7JqJ=5U3%IXZ{PP3GXzzN8-=d%=9K+>=)!l=$pN|1MCKL=ENP- z%8O-`+{k6CbbZFNP|5nwq$D-DXaYN$d=ym+0fRggr;-Nhubb`W@1xV>l-Xzxx899q zH+A)B#U_Y;+JQ0kzP#!cuUWqPH0nj}fE#kce>TQB zOsXU%@=~m%|9!Nose-pcgc#K~UvWApNAU}x8&ocT`z!q+B=uHD1zz|nR1c$`?F%o} z(7yfV&St7+7a zk>7}F!!VXjrw&vD}%o_4HK5pSY)u}fW(AtkkQ!AIGjvJq8&S~>Km+K`lEat zqK*fTc<V zA6nF4xE8KTasAr^Z{Cpspy`)}-!KaZwQC6*imAQlU(3{EoR?q^9s2bU3)q~CGL*s$ zXw3Cz0h!ZhML_v{=HXEiYVx1T#;rjqPF-0TCR{$%=~+D9ObKa=sy zM`7)nv(`&8N1uwEi_I9Gr;vn>u`05Cim!zBdv(N+QWGZ^Fab165)B6-j-6K-m_@-* z6M5HK_^PlkVZP&Iij_;;?eg6H>mNs)J7}v4cQY7#A$hsv6L-l*bP_X#fhNft1E`lp zxcVr>TYA;AQ{i3-S(VCnK1JISv>twclro4k>t?r|oq}es#ZMAJa;oQzrQal|0Hv3N z{+fzFS-mP;1-<0b`61hCeKazrDsCHZO3238ZWY;Xl(vpd&hLHRiGqp!?+Gz*c~}pO z@5rEHb7<78zdz&Motw?hfh_D&%@LbHCBhS=p=(K@pSn26%&M_>QeM*OSk5=7O1Ra1 z@o29zKL~#-rHs=VENvgmw0oshb-UqgFu*O;_&vc&a!pV+Lw#hPQ2fL_~HptP$!!WHd|hHlY4~90ds@6i-dM ztxEJDXATqw^jA$rmI(4F&LPBl=$iQ=<^|)~w4`QcuptkXZefa2-S{S}|C8M2jgac}l zgJ2R<>>Ah^Ru$_fPG%Wea35Y}49a2xcXU(URomT``;G_3Xw%eBHIe(g?X_bKc;lqr z`n9jU5G``f1L+M5k_o|^1`Ifj4ChaRuI?FLYGG9WpC+avEkO|@DQJ!OcDvE#B6Ax9 z;f3G1sd1}3fO|Fjj#f?jhQTh1YDr9BTPf3qN|&_I`SZx{0|kIc`!CNi>3+n@+rkvG!){|^n*1=C4&vFG?y!XSLUo!}b zZyqCZ_KEKe^CChs9G@S01}9wcrB+M-*l!V7 zIjPb7KF0F0VzAa)pt*$_XdwL25cCQEQ^4F0jwQ-~lPDKCH0UrVCiADgbknVI#%}YS zu&+5i30Rv>?FYAH?qT-0#?gV zRy6V&`!YCbJY(UAQUlwk(b-2`K3Co0dqSYy%ze942~?r+>y~KN=gkw{X-I88x^9b$ zZhmBiqwHgSLa_}i((j%rANoARi!QP2kyUdJo3|fiTP;Qf$QXwIBs6}Gt&XQ}3{_Fq ztg#E{RFp)go)RDuq)>9l5D=i?(!%C&gow(T{c=*%h#Xx%A8HacR+4y)YL)2Z9hktj zdacBP;@a*&T|@o9P0><7tXwftUGPhXQh3cp@8?WU-B*_LU)`+@e5yQ`F_R?$~Yb>9xIl ztQK=EIB*)U&&Z!G-7%O`cV#w<`fR*ykh;rS?C8BEuV;)LT%8jMyy8MRQwyZuaZeD( zAsHfjQAXV9%j3O;35jOU`dsfa)%K6#d%kI_8f7k`tV$q^FTL;8$|`9)UNdjsqXL;# zvhz)@xn%vG$yziI+FqO9-|Y}4)O9-Sq+aN76wx@&r(|eoWau})yW5Sx2r?DkHJFTu z@0@)b`fNl|qGE$h`JJ*18T?_?)SP+|w@dgm4A;$>&ank-yS_@bKYP{DHXosvQMT)o zf?lB0O~Fw?T6#Oo!(epq98(~J+0}LwR@KCOn5T1n?%aDvn&NU^9~=lbnF}RwKdeW(wLS#Z5JGj?RqIXSxYk}XZB zHq&#yRCTu$Tt6O71-DS8EomZ@O1M8GN#6Avy^dFsZz5{f3Fcw~7>8nDn@s1_=9gD& zM9C3yJkf~ep{HQ);K%0aOTcq^A}*iJX+&WA;deWdm=98T;>WVo2Ra`*Ts}q;*YN8& zd(&w-+I&#C(jCUP_76br(T=WK(m|DVm$8|>)q-#(hOCn&zfo4*>?7v=O!#y>4t;(! z>!2onyE7S`?EGEsYQLL_9dJ@UorQ@6Us%3=dI0=BZG}0Q5K@LKvmTI!GDnB5`cGHM zDx7{wf9j|Qn{>>we_2$sV3|Ze=57*UW!C$nFP-s5Dm33gK9dL=7k8j22#MF;u`RBL z9qt{vDlRc-HAgKqy;cp4eIh93n>tEGu%z^KblVUZ522a*tyvnR^Vl-=Z z{=7>@&MDi18^Ap5mLSp*jOWu!*!VXtYtsnJ=*f>xB~`oWS(XIh>p{Cz%Sopmb(~N+ zff-bcscS$nTL3xfvaTs`PDf|J)-BzG&AG)*akRVd9Dr`YdxB# z%Uvrryj+hJ!qQ0JS`}n=&d<&!RX;<=Sn^X7@}%z+48ki=mmSnrZ1{mKDrgJwu#QyQ z(`SC%o$0T~5Qs1pR18N~{yxDL_uVVJt*$w-R3rZloA~(_N8pY78@(qX3aSq>!IIgr zMw%UjR?|G~@-~-_vS#M8HFh>9s>>8{Nu1y4cDZsu;bZFQoWo?g{C%Hk<1T#dfF~(u zS&Xlc#wUM~25@o`#Z{gxN~tgT?488v>NNO}KysN3w^1LKt*bkZXJS0G?qmkxmgRDlU06G zef8$sHe;%qWL>~j3CrPi>ee4Lwak)PI|E($FT@P9xb|67E?{tcTQ(~eC)ry^ae1TG zN7>CA#+*h;ybrhH+RmdeVF7zq6FNS>R`&%I3E@Amhn36n^Cw&+xCRkA@6|~<-3Or? z_#MFgtvplk!4n?>=3V-oDOt6bj|>LhO2d?c1EXxu99%& zqy6mS!TBVrPKzF`4LGo8leKieqpOyZg_{TsR=5(vHIj>wsPqt5HzBC^LfA=7h%}J< za#!|+R-+*2=$fwU7#j~Khc?P#%yKI3_DnHLRss{&W)Q8k@OWnAdlBY(2A}Vlnd*O? z#Y+>pOuxkc{7?k-NRNMAHehLyPlju?+}r{sT2fNQiBx({wYn#M|JzB-g2`(86&*8* zPl-p$B1t%A$}bPsLC}O-wz?ff^j81$tmkL4{LJI9k7Q`^oO(Q6Gm$*^7#;m zdXCdi#+dupVo5KF>FVCNMmff4Mh9_@zUREXwamE2tNg zr)w@WbF0g%K%fe7Qc8d~V5)f@&bRzFt3Cax(js(P$;&U62?mKoUJaSYzG7lljN;uO z>4ZggW=d6255p*us;V5qBb%qp1d%f9kJ!2hVr!dx++~oUq8XQ^3M$x5^h?ZfJ!ku0 zTZg^`w2_tD5n^4r9&^o8e!MXmAU&JpU}Fd(x^R`=@iTvCE&VG4=PadgGt71xkM3oX zres7_><`SLFP6nG(-nIV$Hw5{cb2O>7ut*IWCiJkdbvl_DLBz9-WO5pXSz4)4uT5+ z7qT{m^aV@q51i2Xy|pu;MemTs=|Vdeb+>EYx5RNbM8e=V5w5$$7MUKJw!kcBvTpUB zPJg*q5#F-xS(=^(F6$gbx`{#*A<_!h-5<8&Kn{oOUdj*5PF#M1tVp&62<1iJNWdr8m-^Comw!3A8=d3la6;$T?xGiv9k`Q)3i z>jBe`fe+XQzO3{9?Uc3<-X3IWDn%hxdAImco1;Qbtyo0g$o^SZc6g?2yz%+IdIKF0 zg9zcX#mQ#%>7{~wf+4i_mx+8T$BUgk$K>F<689&ggwWkHje$m&V(SeS_OFbWbIwYs zp?2=O@H~F}i>#*O>|c(}{9r5V?);qbdLIn@i9pnNBjtTL6QU*Ii{7?GP;ASuz4C=z z!yE~uz6ue`b6`FY|3z~1up}#g;SvU63FLVp;434qJB|fULPl%DG6EH; zcH!n_zSe7P=HVsS*ge0hOV6VxrOXKAbznh(r9M06cJ~VHsYP{zfF8+EBZe;zr&*q)MC;Ss#3koZt6q-i0Nf^&>n3Y_9u#isV0dxT|PqM57R* zZ4Z6gDlOY=^f~7Y`R;plbBjp0j!m5?vJ`Dw&IbA}&k-*wo?F$-f35&&P<;DTF(H3u zWj^me*y5Q*UKE?{=N(|9mr^n5X|;UL4${X$TWl%y<+OF<0R}dIzvT+Qr*1nCX(VlE zbp{|%a!^Hg4a%1n%=sgQ{QaDpTo4H4vfe3*j_J_W!OzsJ6KB+xDM}pRrhw5Pb+|3M zWNMK;~KHQ|c z%_R(9^7|nm0t%3J(l?MZb^QXKTKwc<V(^C(5J`uM?uOeg1FRGX9ZA7M>w@4~S^pX6!X36xEY>as6L6F*OqVNB87?70Z` z!jq(Hl}ugVJK2(OM#ewfWNslET!bnPJ0Qq}-hWdO`uR)Mbn2ex`EF4W>Twu3V#p{i zu_8jYc|ux5&QTxi>j`}Fiq7|g=g89S2FPtyxq{~fN3%+Zo-@dh2*HO~rO_g=!qJT1 z<1MH$8eiyBLcaU=>L%RLgEC+V7?r@8jYQmW^Nwzx9{-+8{UiU;8a4`g5m-0!@Gf>{y&tQhfcGYrXPxX2MuU zwk47e(yX;Gnk-mzf@!06wz=3Ipb^<&dD4D!>`ctzdriaQ?+|1%1i4dQoD|8v(0_iA NQ&ZAXtd+M8|3BAF_AdYc diff --git a/internals/img/flow-padded-90.png b/internals/img/flow-padded-90.png deleted file mode 100644 index 3ee97f0c519569dbec382006f03baef86452fce3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5380 zcmV+f75nOmP)QkBXL z1{^S?5<&`N2V(du92Fa5x8di zx-gHULuz1GVax9XO@XNbvhWB8yb<^&(AU$soMiNtXar;yk~O&5cYw<*M)nrqGT>i< zY;Wgt^3Y?VTOVO&(d1O@>~DF?mLtgCj3@hFfL!nAwDMR1qT8QTf@CeW{M!r2RzSkm zJT?Qb1HQ&Dpp2{>(J)80n|(XDf|n6#C>X(;_-5cLJlUBQom-F5Inge|VV;8=<;cZ9 z&XiF*iY>hlSGf+%Ood>76;rBVW-6HJ2O+r(%vbmY((JI)6HIm&u6hQTI^aO`3cTmA z9f&!eFHahvfokolsxytt2=|q~<%5MaVR+cBl9(dcWy9{|-(=lM!Q2iEAJPhN&L zhj6tsp*ac~o`GrH3wCYi4~PI+5CL_dY0xYtf9nI1+Pob%copbUEg<6dEYU#kzAyC5K3aIETgo&KktFb$c^# zHE2WPX9X2DlmcBcRs#oKHTMK{T%iKxGWVG)Wridm$n^xJzcw`?#C>)eF?-Uqw(J z1I#hhsZFTCudwZ>Kw7^q^hP!UUj;r2G?y{&lZxdKeE~kOC2#4bvPn!#~|iG#Qf&1YMeE(3Y#{`zX6Wv5 zQU_y_V$eCSN1d2B)RK{8pj(y=e(u}xn!S*0bAqEMSdQ1R7;eVj=of(^ zPy!-wip__FrNj*WY}`$~el_u6DC!W&V%r*X7zMe#1)Dfp-9Bfus2N==BDGuy%Z zE&hp|06qiEc5v=-p<6_Q*UJR&`bEGbZL*X8kf5BHp}WT2VRsW}-5%CQ-`Ys^huyN2da z+p@Kl>|oBZkfa10#FKb5vJ6lMeuys`T+ljp6|kwp`)kdEu_Zq5gwSoG!IPZ=zQ7SO zQV0pli5a+Ofs9NgKCdAlaeynJw)k(7D&2xBu4U;PH~7cg0)GL#7ubh)IUSuP%>sJE z2Q2Htde{>$hDGk@M!YqCnImMR5E7JHGV-RwWW<4~qVf6Dl70fD@-o`ToK$Pu@D}Co zQ%E=s@_x`6f3e=kz;e*}Dr+(eM$YGd+$@V2-c5KvJC9#z7I-855fVEybmus!>15s; zX%}->g>LqD@g$c)6OaIcECdAza)*sR|1&B79j zW=!ADAPmr86wO}>edj`akVC9m0&opX>1R-W;;*T0k4TTcpP;Y_)fhCG&r@knH27HP zTsq9c6oW(i&O>vrMrzL^)#sqT3xd4Ac~8dY@s@QXUPh)sBd{%Rq?DMUI~U4G>vLwH zu^!F51&TYNQJ=SHSK|ozFlpTC_d(xM2G zbX;9J5p-#lRY)d5GLStFmpu!qJb$>Pd{l14$@d{&=f>v#61hm zJZRi6Gk5=$i-sdI>$cGx?>~ZQ3BXmM`dmObIHRNQ*-vx7V#}8hjW%iQo$^E{4${F& zT6GuQ83AqjA?9e3@=r)$K|aqBGExW$W--MF(CXQK;S9>417HG>Y?WkY+DzPfp_X;+lHciYE_-o*Cmz|}#UX#Qf{(3^3? z*F#VQO}>Dud;%zd8D`EK(N-d=X{GRZLkf>0*&V*w2IGw{9CEk@X5yAhX}&y2YIRG{ z^)TiH5Qioi(1_H?BLunKxW*8;kj{PV6Go34XbzKn#PRZb}7yABB|A-qf3A|)MinaBDLyKO!{S9V;uyh zwb-l}*(=bg)RGie0kvq~dAL>YL`UBC52V(7jK)htxau&j8sMrSt}58NU~6ET9La?< zgdE~oy|AkkOgCNF*>lZseKoH-R%GVTH>+KVX`HBMlQtXKL87^vB)K@5DnFd5A>PwZ(r`# z{Qg6v)=qoPRyk6$#p3D(!oeJwQ~#3EZiDI#AX~g^)O&P;=o~(YlmT7@(k!{0w;rPE zwt%o$b|Y__CYk(^?@}U*uSJ$HS!nFWO#b*V-@OHOLO4<(IhZr!|8==r{d*6QS~WvF z-oHrX-Tu~!E_)W{;GKU%*zCuo-i7KWe1}y}WuzO@@htEuJV_U{ehwUSNKn9*PQ}fh zgXybdGF42biOJM48B34_St`@1fEB{wDz0YC_$`;y+&4(Hstk5<8F6(>_H0A$3`nLv z336L&&OMirZfW!b!0+HQb;I}+XNh)8!cm8rMqLf9r_n|VZA7ghUNYk2_-HGHLp5wQ zGGpJqoaT6uXidrg?J%-k4N~jT{wu*X0sRc{9pE+iC$VR_k!~)A&*Li{0-VA8^-6i@a@6;}_<*ezGk93Lbaods(Sl^=y%0efIQZmbCDSn<;L zUA$%YBqzO${%8wfzD4+=`uRBUA-r|`5-ZxiWrc94imilZ?3T-E?r+P8*K85UkVi3|z5d9?ZZG7uQ*U>T2GI1wVcljL=VUeSdy#=^|d9qiqeak^KJd3Lt zGjZD`#QO_Gt4bJANoQ2IKTC4oPmoNEWR!U48r;MXq~Zg>-{R|rT}S5@T^~dC{5LZG zzexExhz5N6QrgX*b9fprBbM&SNc-XzFTO_^s^B0sQpQz`nfTUa(%e@h8ZDEKVmH3W zuK{5M#v-95-gydkYy?7U>5)cvu16Aja?8&{WfxL<4kSQ_E^U#XhNMEv(jUXi$T#qT z%`Q%$*+o?pDBWOR>m_4rEZpmUD&&^2x+-M$7tZ(x1xWw4KnpRib3VRkGNF{RC?cLM?NA?cE*V z1l&9I3u2J>(m{aCY;MWQ9nctq^l)2JHUS^@C$WxBG<#t?q!38xtca_iw3^qK8fw8g z)qF$xQZ9UTwJ80jtQEE(yac>ND^L;Ra0dsVk%CMULOVaYfbO|6VjyVk*qVMEsqTX8 zdUW8Twxm2tQn>;2-+>MIMW-_v@nkz9JxGGVNgA1p=#DNUqN0tUE*Y0gUD&v$xhZvr zR%A;0v=42a7bUpaEX}POkaX;GRC9Q#qiHUN9%SzXq9L$#C~rabeh&`b2aRzE^P4c4 z8&H?R%gAEsxg{=)phQ3@fzBXUl+1!_96dM^jMhz^h)i^0{07NsQ7bYtccuywC1@>; zn=0UD@^hmb=uyLnf=K}>P>0NHhSC-&oQw9K`xJere}uUF71XW+x3`tlI25h)^n#*w z3a{;;tVcjX2Z=x=88x_;buRhEX)H)i3(+ObjmehiK{sRShvuMqQ-JANXU-fBk(9@f z>Tbxad02-o{Sc|4Z=lJkxa6gln9nygws$X^sQt?fz5#IvsG=AGZ4yvRc8BlLhWv(v zx(%@R!S$ za4m+MaT4%p$w(H*Tk*kCJ85;4iBJGy+{%=~mqYXpe5g8zZv;OgBwQLTvZFyEsVI{V z?xeJ3C+Rg;p)N!dT4W zbDL4Myh8f#mP7Qz!1ee5q#xKy$I+f^Rkd@5ARS^GyRoH&)S7F2xhwIB=pez>^SIdo zB;SYhodGt1Mzd9r!Atc;!vtrYjotpN)xA4Eq5JlPGP33^MA1`NyVx$?6>ke$?lQ0y z_yE4+Xajyze8MpUh{J}u7(@xOMUv`XniCKC#WS5DjC?*~QpSA3Lu^%gD9tV6Yq(>l&ITcd$hCF2;ln&1e5M3nVkS$BsCaAj5c$)T7+l~Y?L7k20)c&BS02dr7GA&n3+nK8Rhs>IDS#<;ojC2&IJT%DcVqxJfPoPLgr z)|~3>L-!1EaQ~SU2WC(O6J$x6Q*L^4DIU(}-a!a5*mzVL6K};fH!w9lsv@h+mDfBVtJX|X zE)8Lf!I%J%rTy$4pj)o`vv|#}0B7Org(q+$?IO0!?YbbHwiJplClCAt_t^adrZ{qt zFq*`+KoFQ5&ajgK%qdVtb& zvBj|-rL(Cg=yve=0-o#{dQmTQPRQnv{^D$M-%tA86Ax{Wf#H}av}ilsrXW!jXEV~6 zxDK&ds`Un7%oT5Vh>_J3l&6cWy*Dc+AH9h3x8SQPRr~_kZOevKTIe5`O&++T=pMiS zG#MCa5=Ith=PlHPRj_@YY?r4NHwcWFD>mLQgQL^bW;e7J!WG%)(yMgJcD!ZR@G{bM z%a&AHBv+^;58hpHPd&Vz!I36WD)uk0X@%bs)*$JV=Kkvtm!VQ`NR%0n3of}`(I1n< zXR<<(V=wbo?S`5%KB(!PjNE@`(LMRldMOSdCV=@WmmpCMmt>_e{$|9bwNy^Y@Myyf zjQqLImhQ!vH9nkQVsrt$P7pqW4{Dn9Xn`b^77E2#d*7V{ZqsAK3=BDfz)MUUCaglz zCyo8r5m(b_kT+NUdV7J9UXxOAV7PVTJ;yvpTIcWvS5(tW-YwSv=War3-BbM?jsB$s#6j z$)-mM9f3LfY^$XiZ}tB17bL7YPGDSaNg$D@`fV7bV)PUzgJ^)K@G@fQ#R91g z!Zc(vnmqN0aW6a{NdJJB54XV2_SwhtfxGbifjz^?A{yX1yo^}9jI_I#y7R2+0vUPw z3FEeJHPT;%AVlYbngHL(^UJ`GfYn|3>_u=gi3a~F%n##9-q8Bly_HE7GFc>-(d5ZT zjN86Vq|na-8EIF`_uwu24t(0R>p0m&13ZbB5r?-ea)K}4^ zEhD>u3xPZFRsOExl|VGi``L=m`o)NMj~DE3ZNE9}SfhRH{BTYsN~xsNE_vn&aoe{C zE6|dR%;uq?!U?l^Vp!w000&+Nkl zd5|4PeaAn)o_Y7)lC_exx-1#nvdm$O0h=?yoDPH{q>3U30StyflHy1pfrL-Xw6)ODU4cPoP#LF%(0h>XR`!VVN0?mLX0j;&=An;qjEz8bqhf1y< zZd%%=X(`v8gB-SSH8%HhFj6LuHhDnez)isOfJ1<{%+!GZ%&67km0oBEcOhXKmGbl^nn{R1{J2TpeE^Le0doWH zZu|5KPwfez1^|8(FL4UZZ^h=eL3sd7c?y&N9LQ^c?YJ6rnWcq*lz|Y!_2>T`_JB+l zAXJEzaCP!qaF9QA#GZM2aO4!QDh<9OSn~Tl`8xZa`P1g8C5j0_s4o`Cm-$ec(-=Bj|Z9HgOnq z6Rx|l*%D?${?is5vt!l3R&*8UibW@f(ZbfVHn;6k%Kdj@O4nivr{-}cERr}9tt-ny zs)qcw==*1vdeA3=8Ugq@xC=M}c;|yYh?g85(Zc2rY4%CqR-0OjmzzXoDU>UKJzS|X zci&oRRUjV)Zp0PqH!bnpR=pYl_!69tR)MoKX;yECk_FKY=i z26VBawh=PShWsZjIA+JFQU2hs0k6kFP6Jawe)gg{!Y;v^ESvtjPvK=l!i*O|u6J3k z=0bkw3es9tYNW&eTfpz(0I#8Di&-J;@*~Kn@p2W&4a~;8s)qc>z&l!T&~~fQ5gq>w z{62L<-rY{f@4$h6LaP}eJKw~G)ue#|Iveskd4fZ3R!r7E;R56`)C0M%ZN>Ew9N-&U zanN?CnL&5opkB!S#0+HH637a~aL>lS#I>y7y5JtGRL%AWe*@RDzBT$Db%s={8uFgg zcI=vU*o=qChRb+Pu2(i%E(KD!o9{EgD}en#5_fGHb*HTZ{uB6@2BlZGTH)}&4M*x9 zqwfnq9&Z(74_8D#0z4h(zb@ed>#qh50tp%ic{9#!+H$ojqT|+R-6Y8B;i`fd^;bI? zAPejRuEJUES)d145BwZ=eU|9~o257~*?@GGtX2lT--?T!$^iW=SSLHkn0y^|vH=ML zq%;a<3fIX}&ob!_$O+&FKn~~w#&8yQF;OJg3eUT(YIRK3*Q529;Ub564+zVx6XT1l@fdcTp>Y$QFP+ z7D0Ya1#%EM_Gct{2-i&6+^a@S=DT3V!S=EYE(dU}{;vQVaP@PNCbslip>~Z;`WkQp zE--I_;<`J6y!#BM5Mnd_`6Z@+nTQc=!cM&wH0B^rpPGQpLHP^>=V~wIvk;7chG)RM z9XJQ%>pLK0VAG%$;+xU`cry~e1?(1J`22jW9<3O# zcI}$;ivbiV3_I)ax)%cd)o8sG$n&(WE08x~r(T0ee-AtXO`=^-LkC_8;nY0&@Bl>% z4A+o1Y;29Y8{{HIDzEFXzEfl_aHK{=Y(YUzX>~X3;w_+ zB=!i{IoGT6tLFwpRn8sRA6>xM8npj9G;=wUJ-8U?FGuT}qxAxiM`s|184oYZtP5=u z5I>HjPP)%J<&GyF3pc#f)x#J_U4o`BLvs(Fl!-mBlh9N8vp+6oCrPF$4P25zQVrCHbQ-M7*ttpK~F+NuOXOCsX%60t(`F zq&YY7F)2FVS)gBxW_B%9bl)89_{AuZg&-GA|J|qU*tP4OCFemUS`;*NjVhBs@(*9n z=pAp=ffxT6)W;TL^FyxWy$W>t^3$5S?3a{IKf~QYejd}6q&R#|rhYo?N`_xKz!g=4 zmKo6L%aL5QMfZTj0R2+5(-)!y=7Su=A1#{RJ=pPQ1=v(H0>X=WE-TmDfR{NTQ+ok= zbl@ci0S{YPz>=%;t`LlZ_#+tqZc68#4mO5Y&Js=*XPsjQs)ZdLb3n&0Koc)P)4OVc z{$ga&bwD1+^!;d@pa&#yaJ?MZ)Xa8x;P)ewdpClh12296pgzczWP%JPF-m;ReGYQi z73Hg=)rOv|`9MdFvHUdXFCsAk{XCA+IJF?#G?<){oN&dnSg>)|;W1smPeabh)O{O) zl|v5m&ql)(=ZETcl-f8xcrNHcG%yHKDrYv_am{WvhF-}zyR$xeaqiaB} zR|dz-a8~CcU+E12AE{YmGN~doLWa} z`ytXh-$gKX8j(%7DJ42e&9dMmZd~vPuETx_byQ7@4mESdZD#Vmiz%OZHxkb=;|K_; zb_$3ATXc)ecmFC-fqdVPE3RL3(1q96YsuE4;gIdU_PELJdmFZVE8=fvMZ;tpuVxm} zuLfQRJdAr#Tw+7yJkSL@@X~R@i95l#4sWNkIER3f--k^62pQiEe%}J=S1h?VCzJOM z0SN=bQSwQ<=bdXR%i*-O&&;Z+W4Q6WZF>LuQi2qffV<0!vg3G{r zabuHS%Zec5c2f(K<~EmS$4%Li>&2@3FjbHzB1`VSF0$msAd71+I4g$nJ;z84z6I5< z&>@gp(a8F1;JY{ndUes-L7EL&M*n9gUOGS$<;5Fb6)V2h`M_=YC~l6BF&yN!1`V{T z75zb0736z1MUcyjL#|lylc4LVP#yu13gmIx47rt$Ngo9Mja31;FM|AoIw33A0PTAo zboaP8F`b4yK^q~r`Z@RmILO<1B0*Nbo21Xew!6PLe;G$-bf1KTm0UvO#WmDu-g9{4}xdW zqQ#E~5>F7`^M8Z~_afbW;CYBwKnroo4{jxP*-<1_ghImB+tuAjtsHQCjq4UX_Y-8| zLFn0u_Uv+?!$K6ZH7~dKN9$%ot_qS~s#FjkyxxLL{$wj6qUmcMLPW%~vGAvNnQFLh z$`MgXmQ)LI%7?ZRyX+VeFGIQYzMaOzWSMvs=pRR*FGG8;faLncK)*lw<5j>zG}^x! z1!ZVp00xky_KjB*SLioP?%T=Pa~ImN!4kn#clh|xFG*Jqc%F$S4O$O;8I}K#WC@#1 z5gxw)f5)S%6>vo>0$q8FO5-8Bl*-~M8i0-klC~VixH4Mmt?kn$R&L3amQAXX1q^}swy1&W zMgT(*T}H=`qFR#B8wxK)@PcFhX%Q`VN-$I#gYK$97vOAEba(GW`>ue*ItcUcaRbKW z71V9X0$PrI#|w-ZnklYBwWbdtf%9E2^_mDuND1+V!iy0$1dsSuR68P=wgaLn6-)x+ zNe6nm=#J{>#Jcwo<_%%)WgvAxwqP=m@lV6O3FqV}&OJ0qE!yLCrjCbOF__I4z;wS0MRc zKigHSHkNY)_R z!QZe0`|x4x(ZlH2$bLzsZzPet8P)YTXMNj4V3(stKCOKgH<`*doJBR^QC}7Dlc-us zr}ttDXWe+E*%ArSQV(jy4am1s5RAJSf#xpZ7-UBwk;c378vNh99`C8ogm_}Vj*YyH zQc(~YWR*^-)ab|Y&)_CiX%Xa8d$IWd6U!jRmCK^2rm#T|;#oHcVzD>)h(NJ`j*mdH z0{WGBPkrV-V)57M#OOFdxf|6Y)|P85B~)7xu&`t`qi(6Z6!Hd|S6oMsg94>9hlsB| zgTz2BVghWjAGJPWieRlrEIvRi4yA&JnE7uy5usQJwNxsTN+-Q5uTiu8(qa3H2R>_$ z9QrWU#)&6#Rj$EkKLl&b=zJ4#wNK4zJbW4l_02RLa+sxfb{KK5PEwRA77N`BZ5=hn?6(Jg`cz6KpG2ZKZOI}&3qEYO zPtEQU{}gUs%55}u2K6}-anHWu7S9JiHoZu9-_s#c z@&Xc!boUnQBS$p2>-Mbz2~wFNYHI$5W>*qq2CttN6 z8=6kFklPtK^bfcfXI(^PM($Rt8uIQt zwlQPLHMgD@av{G_Hed8zNu=IS5F~*MT6`w+s@mE!blZX}J52tw2hW zNv#v|AmWc}J}YL!=B=`6+py*)-+@RCw^e)8ZouFmf0IsteDtsv{^YJTcrhiBs0Z>3 z9As}CYkjk0C&ZKAB@DjN>Qk6cod6i%qjUn~On1p1A1(#^_8Ji*bwYkVVPS(7?OC(& zGR&4IqZ7HnP0uFvElpG>MJjw0*VXrW+-qN#ISOzE5)tX@!k&DDK=J*jJT1^fLMaxd zhRe}G)-WZuu!G5C7s}*m{GpIwB!LzIzx_{5odg(MWC*xd#Xn3tAR|a7;~<0QKjq4B zQOM$_q;T{LOzt}%UF#l-?aH9VQb#-%cS;dmt&afTqMgMxf}}HQPd*~S{=J@vw{UTd zmhsZ-iLcpBkh%o5NYc6?#q}&rR3`!k_%QBWyX~x#XCUAIv&A3-oCek*+=b;5f;#Kp zCfC883K$&Zf29*3pBSzOvWN3~UjW<%JgJpgoll(%7~pSlkay52kc}rK63heH$Gz0D z0{P-rX0?_&9Wcy5ZoefTAC_SM&pa_6bwFN62S8p8fB`-Pe4BR8kSBsz^?xRDbt z!JW%|V}nlN-e+`nk+h1q(qITT5~DteL6Q)jlNb`udPC)L1VL*$N)+cr*?|is{vDiS br78M<{-Z>blk7as00000NkvXXu0mjfxN6Ex diff --git a/internals/img/flow.png b/internals/img/flow.png deleted file mode 100755 index f4c4bed7671112e3c37fcfff0ab408a196347e9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6364 zcmaJ`XIN9)w%s9w&=I7A5D}0XdX=IyL8|m_fP@Z-Av9@`B3%NA6h%NOhu%~=gepio zib~fY0aU7>6lo97z31NdA zg`}oByYC2Bq0b5~oUSd-0_~0qcEO^6Ye=*!3TEKv;(;Y?V6&}D0Oo~M7qC$H3<&kdxr9ji z2VDAFK?fD!hV{bWywLuz--<4-=s=vhz?rB23c(NaA6fr^e-G2yfJue8V5DT=(!WFc z8)$6&|3m%!{(}y{nWO&e@Bb+rU>S-*NtvSp(1BRDvx#%R^xG6hRU3*dx4h|6g3vXxSWONm;$tdXRC}}C`UenW()>Bsao2!F%3-m+z203EZPtDSIDYf|Llw6KkEIPi~MI_l>U(`b>@uJ?}`0i6a9DBS@!&{{wHnE z8vjXrl>b?_W6#pM_;NBg0I-=E=v=c5nOVyZ#qhog9JsYN@==+F1*S`&luCSBcvxq` zZy-3GA@Hh1*{a6ze&A*EjD}}@uNRczD`pRr;X|!UwpiZFDDkYQ43U=tR<3*vjOK+R zH;VOXDL27=FQ)qWse>k zu~@!&>MGcCMPKhUS^pKnrRrVWOW&Adfi*kTiHE~Xtd5c%?QXe(S*_8Q+rmewbb{u# zqO^X~Oozr(y+7m{MtI?(ELh-MSBB+hixQx%jtS8PI@}(oa12{+JIANw@)NXWb;6e1 zLA`8St9<~ER>C0;T?&-=)qY%@YXI%>5V`TEk93`Ax6rvvC%f9sC{PeR$tNYcjPeMw z)7{J8BgupLgabbLe^5WVIOhfGoM}$r&!RZG3mV}+nvchbW0^Iv`l8u5U?DDON6{pm z{V<{G%IKjSRh?j5;Vom@qnNr@Z_tNJlLAI3Fm(tKZHi|tC)+q+E9lO%-2xvqjUE?BF?uwpYy=*V(z}0tRdA zW$_}wX$UVRp_MNu9?0fT7CI$pxavQPl*d|8l+E7`j{c$#0soT%X2R^MJYel z6{6Zw<@*s!fp-F4(vz^&_V~?P`k2rIjkQVoxraUJp#A2+m!NQ#P9*M=zJTS3Pvl=(8l>vW?}_iL`4G7n z@r0ORrw1}Mp*kaRE8Kmfbr3ox{QgHv+}VmSsc3o5vF3-_#(00aem8D`MGD90=ZY=iuHE zeXaIlRK`$+S{F~T*M={AVHu#~eq?4tv4sbP`!UwJC4CO{B-ph{_KF>RjpPageZD|> zf8a*Wn*5v5i8|B(e|-794sV5dt&^VDOZ7FaZ{bfr0w2SZkV#Il>MdE@`+}^iRWOAk zJ2=Y${yI}?Tnc-Ex-R)K+}Ezz9y*T?s!u1+fUV!E=H-8mq*+qchG^-3aDA6z!5(Ng z&TXaUWZ%t4q6goL&Su>pb4rIauk#`7_Oz>_S1pyP7$8ua491rW=&}SilFvio^r@k` zwDgWIjJ#Lwo7N|PDK{@ujA(AHX~gF!BwD7`(pGk|l08ONaX`~Usu9}GROAocHG`0y zh`{;&VvY!w0tOBh#$ktAi!cLve+aq8t@zglCE4Tl8c?-NSy%n2wqVXEPB35PZcKQ* z4tCFyP#|MNHrQFX>P5^{ZTa5icU$fjxZBx4;N@hRGuu%^%zW#R0LC~~z5NLe3I0kB z6TJ75k1g>+6L`B3-yW?4XxL6?9`@L`LX>V!NmAM;bgxc@;@f@122FD(FOT}r5RcvP zE$j=Up5s>x;-)l1Vs*$lr%imjQKq&QIPA<`TX_DZ6~g@|!-O=@cD2Cw-Nxd0YZuK9 zH_g&N)%+5LS$KIqR^EAThAeYFj~qxg_mKP2mb~)XTDnhV*ZDt*kQpLW>vv)~zn)OS&7gSUW0w=@UynMA zIU{!p_b#|3auX%lG)!W{!LZiW_z;9Lao)J49!A;Wp7U0{tbdC~Ju*4RsyPmp zEHijhL?yQt`9!66x-zmS{A;}^097NVIv6lGe&nz^nc(; zMY@(@T+5iz`zav2ZcUhT*OMO~7$ldtzq@oaYqoWzlTH+h@mDgTuP!WzmYfYI`sb_E z96Tsui}6+MOuspp29|C5j^@&efq()e#541Hv^xz+^jwmYhQfNs2O^05LBHV+1v$vt zeMiXT`J$oTgMhpf_PcXbgX;-P#;;bc@!g>(ya}b`Qz)bbFBgR=nJIe@MM+7lgYKi{ zXgfQxMCX>q(Y0=X}7 z#iTF4H|1=Xw_$}!`0`_pMuXn$y$z*)!)rURCys(|V8nGlY?OW(kP^72VxYC9qwS&i zVEBFUi&Bvdlkv-JmJO9|E1FV^vmY#W-({a`71~J>+i0esYtT0L`V=csMB*j+t#>Bx z$2pz6%fzx(vBE>zyxW%(jBxXYVu!qN?#a7MR)*arb3Go2f|zx=^7NddHvMwl0$#!3 zFKqIhxhs}o#<%-@(md~zKf_f%jHJ9r^h9P=R^f0Ii2KHQ zT++cAUu6NGaY*^SN&`l;Ch+rP-0|(|Vllj-X!fOF(7^)n-RWGABB3Q*KlkcgH_j_G zS>GEQ8={1nwg@*dJ3sZhEkNv%r=&`b`jHP{vrQ+n&58Gbqe=WO+Z0{tzQhXFsKSx> z^fXE_gDp@$w!tD8tMb!%ak9?pp~ve&6RZ^^htG6GC5v$_#aUrGZ?TtumCnjAUZc-+MG#BV%Dx7F2YL;f%)PNW8$z5|@Y z^gzpv1cSHrFUX9zr^)@L7o~j1=3n;ft}IQ&^ANKd1SS^x@TU=ZzzjZ`ZmZ(ZfG2COp1r%HpBc|HG z(nhJeNE3A(R<&tKjw0W_JH_t#qYjx|rA9M8JMon7{jl>cl++%> zbcD4Z(%gJ?d|zmE)Icq9Q`9l@6hN3KQny@xNa)xw6T` z4^2z4CI65RV)px?m{0k=$7_;ZSSvDc8cmiF4orJZH=#hA)Ugn{TaZvg(3CM?VH zE4`kGxd(E_KEqS!GNx$454~9Cjn^wA0s6q#+Z5@&h$=*RPffU>05r7zZaW*{6NJ12 zv^1V0YsyE>If98Vp;J_dTitS?D%`+p`(dX}^=x{?_T&5Tcb9w4Py3f>1h*2J_6a;n zzX;lkFik`!&XB<|)=3B=r*pjw!gcoA(By`C2_uPR^A5+%(GA9&zqs>wmJD`>Zx~yd zVQM%M$t~14v={^NCs~u~(kN4O1qt_jjC#^LSP7x|Fo39$h>&zh1xbhLnP6CDS!aFb zbk$)>-IwF-xwiTDGgtaXm&9{cJMAnEC1v7$Ms%C)LunavXBwUEMmxQR1$zchF3!uY z6joElqg=;G%i7CB0WSR8f3!(!sJx>kUSc6=#yyh+*KJcFBi^J%NA$6#yghp$kT$Qr zuemGw}SYn1+on1^MGBzFmCsdjvCK5g&fOe58m5 zoHo{seKJO<(Jbg2Jk;TOLU@&)9&9o6=4p$=jkTM{*sg>xuSN&E-z0(P0LH@Ugl|MY zC52(%K-GLL!lw&G_r|*3rt)ON(%Pfn4JNir#cqdJ6hu<7U;LmMud_^@8Wn9=R4{S! zOgj1wQ{j=uL8GLNO%>uaq@rOfZD-A+Ginz&0LL}x-QZ*Y?v$tH@d9zIYCb*JhlmvT z;jq|I_yfZE$KGNn9|o7KmZP)K$l9*UO`Ap;OtGs@wbj4{)Ns$O7+=g`s%X1I`-HNE z!QUk(W8Nu21g`DeG6lRG5LHU6#aa_g3|S%MhzVNL`Mw^zOcktP9Z$roB!# zc;jDRg+4t;t@a3B=RmxbeBSQfKpmQ?d_%n$`YR|w|Hqjo%N2WX+WE#vQ=Lva(se_1 zzay(cMF?gT5-sh_iZbzsb~s0!Oi{j$(>KDf)tR4wcE)qh@OO&?w8i$wT$!!VBn{u*m%E;(T>)1?0*e z^_J%VPK6=9NU=lil^t|Ar<8KlquRR`9@Y zUHe*|F${$Qo!W-H7q z*2JG+fl20!MdPx%0%vqu?nL&pUf)R~z8a;^$nYp1{(_t z;)FpU*H-W{gv7_R<=q|3@z4^(Or)V||Mo{a5iB9<#6z5@zO)r}DbybXc2;GsYbG^Z zz%Vzk)7BL0@BDcLYM+EkVDW)m_=!b;&Kk2)5+3HR-V$Es@>90uhB$&LH+q~G?7s~{ z-x&h#o0K3NkasSFonO?LO87-NrwLNke-e66p_aM*`4i#PtV!WPSYDqa#mA$!-rN?_ z#&j5OWQ%RfGK4uvP5*vxu&iXRPjmax3s8HIKd4uicdBxJR4Nc*tP|VYYDDy-=S*V5 zPQPZXcMVK48QARAnAidNGj8pjMYo~;@NlM-y@4zr4to4aLsIT1)V;V(1p_v+BctAnK}GH zDSgVK`6Nv9W=SKn2c>O7tE%}cMiv&w+0HH3>vE*$HWQNcwr$Ks=Bpx+Bnf6sgP=A; zlUoV=yX4W?N~?v^jHT7(EdKEhvBXgdNOu}Y$ox?M&ov6i48sHyk8CjV(oAi7YF zsyUY{zN3N4;}yP3vkV@ctLw&%k85;m6WTveC~>4rQ?Pqe!sIPax zG5PH41oy#sUcMo}8rA-KQz^yBu)*gQGVP2`(%8l8BU3A{xu5WXPbNb_`<|vM_yf*1 z#6?_PmUDDInFE}a_V7$ZU7$`ulIXJ{H^)oj&ns1I z!ZWRa8BHJ|UP5@G(Ua}0&}SrG1Rws1efKauN#V>A;}+e{fbQCyOQu;~boi`T7C7W* z_`PAn4G`Dr%9=9vX5T`@%yfjBmbDIxX*ir=Ut($*3(U$l(Se<<^eh$=Tf==U-ILa% z-LE)PpumiV=4F8+C1xYv^e?wZr#fu4IHaii13MG@H8Fk#wV2QaE_J0mH&I2Kv=Gt%1CK~{&Hw-a diff --git a/internals/img/jest-padded-90.png b/internals/img/jest-padded-90.png deleted file mode 100644 index 1f942a87a6de8fb3f8d5083d80c059907ad02d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3131 zcmV-B48-$^P)Y(_AG`r~^qv(Imzd+*+7?r<-D*J3f}ch25-pYPe{ zw|}pFx)6w8jyyH=(pXFYrT}ku)(><7_5|*p*!2Ss`daPaeqUuX-!OnT2LLJ8L}Ga@5dAvv1n?C{wjTH%(udW=!RB~YL$2wC*iLFibpZUq93KN5 zSB-%ku_)OsFsMH4ZP_bcLl~*X)FcQ1KpkDbwntNlCs$)2z-NFVMwV$dL+ug$B(TcJPOQd2fHANK3u=+*w~_PWVk}90Sq_H+ z=j8t$1AH!`?e_R)<>L*xrl=s2MJ*ByFvlDZz;}a7;bKG>Xf{uZXgdNqDlVRiXrGE& zCHe{ARU`XSVB6vNGjbf^)=ND}+kF-O8y1aPC3+3;M_&RzO_bhTv8*mr!BjAmQzQ+L90!O8so01}H#-F(b%m!uw zr#P}pid;JxSur=}|E&)hY$V=DJh29hiv2*EI5R^zDp{u#!z z1;Lqzl(OA9s9efLD>91~BegUF&0zaGt57My@|2&NNV^T};uWMC{t4`Y-0}TVuDcdU zE2kZb-acz@uSIXpGGIIOutuk}e+n4gkZamfIn||0c;Y6jj-G^1ax+p7HWP6u^3dF< z*skccoM5gUfYgwS&A?T_%_MbYkNofbnB<#zHOf}MZ2I{wKFJRtJ#FI|M*=fQmJ%P2 z?)ztCKo-@}6F(IBILfo7rF;H@RE0e^1_kL|oP~lrE-pZ1+68F?(&OhD`40H*_#ybo zfO~*1k{&dA7QHbxdU$@ywL!>2^ay0e6;POQ8`Ccb6gT(=NwaH5{P?nsH_SwDLn+)1 zG#c4>Wcn5BcMWhunSS3u_vK<}oQEJ2ozjYH4GPnD(NL6Rz{F5h=FvJh>__*-DRjVPk#qOUWC-Xxum_4tvy zVps~SbdI|slWZtb8#|fnmjw2^9^d`XQp{5k7rZXw+L*<+OT_ivh`X1VYprRqIrXXv z{$K%ife5Vx+8)`YE?Q_Gcnk2pbFK&BHu^AR$%Mi#!o|>&^f5;x3(?kW8b?^k)+y*U zcHzF3D@eZn5MCc`t&HW!8aWR|`tCC4PbX{_*qOjS&haMv`wv1EqW?-#*VZ9V&gwxI zy8%BjvNrrwl}#Ou1HN5mJd==_=HgCd2hTvs)oJE@FBHQlrS=9PTi?Z^hFsHDtN33B z+-_t?q1v>xSA7(+0QNERM^I4SMI*jy`abd$?St$EOh=B4ix%KFMz$E)%`V0Q&!7d< z;#A}b+J$d=%C$kr>KQg7=i&%Qb`To)d~{=VD3Lk>e?eJ`2((z8m)~aO6Va@F8h8u6 zA;*!fmv10FBs&E;NiKPZqXL3M{#Jp=G{*73N7R7Q!DVI~e*u~-oN|Ou< z9*sh8MHU>^II4bNmWCZ6`YMzt4M8h%l@B4jV6c=+U%-D+joz`q^@07)N2=jg{LGDu zxk!z*IkMeJs>@(x)zJg-BX3UwSD+hk7sYoG5osaOVmK2&p}G>KqxzxX{mW=EwQhX~ z)*x$TDk=jTjNCbY2pgCx;&h$DF{GRrKk z!?$)iij}~Mtac8#G-iMmhTYN;vUYgLLi9Q2cnQh<(Y9!N z7%C4ag{f#JTUE9IRr*(J<9!eO#O&%U9mNv8FaBPVCX(tQM>4?QA3qjRz#!y-U6XQd zKJw6FR8OTbn52G&xbH*$QH z#;auMoiA{7YI7Bd>8r#CSRj-B6^@u0?b4qk_SRA-X@wP~~PyFAS?t%HFCL7mM=O zoJs|@m{kCWAWO$C-fh4oZt+YkVuBo0897jUp~Y^06n`FE zqRo|5z$=X*I&JpHd^O-nDqKZh0(B_(Q`pzN4~m=jMGIWW4%}8$B~`2pI0`XDTc5ux zNt?Rb*a@kkF(@!Kgt$@&7qd}pJG5q{EMkaWiQ*W&^2goLEQ$UGT!k?lx#{(kRsrR( z7L^pwAmb<3N+E{mS5e7qFGn^U|I<8M3u95b>uBOrQ=3o{_eE5Mxe&Sho%Y4w7^0V= z6wm-ic34G6Qyx80D(ni%Z=eV1**8(a;!F9z-$5#2dH(!XK@8E$Q5?hFbvhEIb~@XN zs6(IAybQl`$f5;(8R1zpTbH4fS5*;1bSsL~eT(+5yYximxSd6G9a{M>rM&)~g;HJ5 z;D6Gs>WGcrJ&*tWiZg((R%A5o=!G_FzJ#2eVkECdHtrClQXZfNNrr4W!)d@5jO=za z<1>GNFOOZ3ikOTNz{SvllE95rc;jVfAxnm3E`BXr9q>D}k8pdhMR^QE4{I^-Q;L)P z9`H>RMZBJEgk;E`1-}lJQ`zliSE4GUAEJFNZ<4-?wKuX}jzuxw;gt3=-$E*6I$P0F zs3fuy-G*x6?!(_lJrI%dK3bSwqus0A5k&zH#xHtI!>jqeZX;R9vdy6*Ta;I!{do7F zA`^?W%|M}8jMUJhsEllzM@P3-Y(!SaIryKsjKw;X02qr(w(jL4LNZkD>jw9rFlYlJ zKGb7ehqB=F&|=!rhgGwvquAp!w000j}Nkl zd6*Q%6~KR79!MhbCLl+Gpd#L@a)V<8yci=BkH?QM+2c;FF}C`m-jA$~Z<+h{Z) z84!^OO;mJUC7yUdxSlml(@PMBKbAaYe@c<>{OQ0)o-?=j;-W0c!mhPUXB)kuNJM*)(@Ttwkl{N|< z2j({QLzIv;z+Y@Ss5AisJl50?P(r47e)?mZ4k}T=|7_|9C?OMUJE%kf*8;CA$36!( zmhf3zuoh9M^7#~)ZrgdKDOp*j0{a`++?J3T|? z3U~stUCO6d=HG=Se3n>vemeVWZ{-y0=@}|>iUxQQc+JqhACM^Vv&1HqNbUm+HXQmG z_?L@&RH}dh(n|aHO8OLb3{l#j@ci^=E^biC0-mC@A6?R?utWPYI+>oKvIYDi@Uo%3 z3+8FBtVku2`>{o5$Ym*F&~ZW~3mD)ZO8bc=eTsM-ue49|{B*smn^d}hCoAp4fNe_o zATc;WY5%*+n^d}hUjzPQXx{@k*5Q4&1-5h8Ur*o&L;DBF9^V<2E@042mo5c-0q|>w z{hg$=PxAcqdWZL^3IS{D@bSR*j_z>|FcN6tsJ~;Bc4x{}mTD0297LneXE*eHW)zME z_R0Kyo`e1l0%{EHi_y1!v8e_DgT8MZ?x62WbAJCB_M^d`%`8&NF+o~X1R zg`ILVB-2Nh&cIm~{Q-PeY1cl371bi(xxh?A`)=4NTO$o^ms#}J8?l$?^Byq6qFe`$-@!c1wI#Z3x}zO$*YnfQMC>ax)g)lh1M)P(g2ojg&bcIF zpV~8MZcisvn}9Xj^l`w>A^RABZivX`VBpk{eS*FxFKQ5BwF!70;2YZ8U{;t+{4~P- zOkqPN2C&6glFQr0oSvcj1Pr=2CX6=SAMr%xvk}-}Xg`Q>qgcE56Ctj(q8bIP#WEd3 z;c5COO8ecwZyg%CW-2 z+w;@U2VCcbY7{W&ic664q^+k<0k0y{^nJ=XK^nEDJ!=Y~Q>sbAG>BIj1k?2#uEL#*IlzyHl!Fz)LajiMPi*O>6e$nKX0)ya_z4oO`*UZ4l7G z(EhsTr|Xn{oKmd<2HiHDKca%xUekyT8pT8N+O*(5&8+I2Y8LQhBpEHAqYy7s7EKGT z!#oST0{m6ECU+FKL|5vZJN7lIS-{IN`&hSU%X(RZt^sS?B7i?A?St5oIx`gW^!yw! zE1++ulrs6OC!)-BM4}YeAz>=DnDdNWFcq^Q!UOI_w_3eOu#LD5*~6M5MlMFIX+Kb| zeIcM<=QN9ZVaOsZZGo#0|LHCP=dD2g;5Pv)<33XkU4dUBqo{3+>xWY~eWV{?GBd76 ztX@F@e+z-Jo}a!g%)>Nm7F$e374S%4OpLCt0Dc$aI*`vZ9vPu=sl%L7Vqy}(#*;$) z4>-m1(YR|8xNcmn2_-&{5VVUnv3 zA-u2j3CtF%e8QANx>_$YvfBYW zA^uShm>tmPFbW5oj{yz{IDS78e$xT?1`;&)V`RIcF@nNTAmh>heyfqCrWdd~@_F|{ z{zm@|=yO~uk?d69zL9XHWVHt7BS~NRyn+0Imj-lq8E}hoYz3kfuQD9l8+co}Zc*mG zL4VNU=mBqYGyR(wfj-J-Ad1)8fcyRmxJEg4zvrhL#Cw&4l64Md;m$(#zd^zU7>mAd z+yyvSIi|JG2YL`JT#&tNALUqg^vnoNk(-DZI)a1?a4ow1`;1f~*}1^=p>ZYP(+q82 zq6^K$Lx|tigvnFW9DN!+1zGpPP>VUh9pL+hwi?6-oX;}gjF9)l^V7FtcKA0Vek^w* zTnM-w5`dP^ZOFDI3ZpT*`T79)Yf~>^Ps6#70xw0p?>Hnk*L2^$NN7%9pgra*^CPTcf-7AjT4Tt1aYuy_sONZa$X!y%{t8SQM)59!olZ%#yCVsdGLY|Bjg!Xg}IJh&3@1k9CgKmyFhqT9U>M@)-addDpE zAh$cwYeSFAJeQ{Y?2p*VPgjoLn>lV`tkT{JDar!j^F4q+uvnG#{hIA z1<15E4OvS+M;!D65nFW-eF^sboIr2^la0XBNHpXc#J1g+U=P$vWU5~gaLx_Dbpgje z2A)Lr6e1AN2WVuRR*%LjQ;g6Yrx5I3fn}?ln_dzUO8W$m7ERd~BDfuMx6T|`<3%Dh+WGu6N z09RA=d6>T}FR&%_wH4+v`zAYfSh{EKk?%^(l0u>?%NgzSJE<`5LcpznA1TLjv*YVA z`-tPZ6>AWOgI1>SS@fX1azdL$oxGaQg@8{)tWx>Rr=f{)9q^Iiysns|LV`FMF^y^? zcOkmzv)s@kQ&zj^+=YO(AT-k!z~tgG(b76qz_3F$-22N1`W>Kj_lo zZ!<+}>!B%9Kc8E$D}-H#WF1tZaJ!+8&{f2*j9|n@z#WzLu$cuX65W^j84@+wiwatA zbLfZc1hlM$>peg1)SPM~;Py&;p_I*B`V(%w*??%-J7Erls|0?7c(AmLjA@>q*6MG? z#zw&Hl=i42YZ&_8b_G(#cV{Fn+1Yz_OGI15CAf^>_dqN|HyBxAqhx8(ig8SAw<3`g zDa5MvG*V5jsP8i<0^1-CkRy;K=x7S(7_9@2^!#*CfM0BE1gsVMGL^m$!-q(r(AMaA zN995rLa!`Hg~&fafdi zVUn+!nofu<_)N@UL~&V;q~_EiCfk_=r@s^(8v(z9Xw3P2^hTmJorIh?rYCSCb`@gR zB6UO-AkmrcAz$`4(38@e3>yJ|fP72yYesdXa6(wAIT*3=YH6ZDyn{@$&md_z^C(>C ztZcA#7f!}p6zpQkL%@e3^}0;Y7{nYT8uL-~rKlpXb@*#SOrXCns1)=@(qLv0UbtT% zImLS;vDTxhaN&ZzfM=t>!7D{@8UJFCK#G<O6=p$lF2RK(;Lx5k7ZkIuc$qkl^a_Rf)?NWBI@j2~PIf4=EqC1X0dr zAV!0gh!)!tsT#Kjl5bptOs8=S{*NPHin#g4Re|d_pFMymD_Ys3EFBOVa5kf1Q|7vs z4xZ@|#GoIwR&`ZU3=Q`YM3aq@Thknwa^nj33&fz&4tbT`|Am{OSX-D^k#mHLvJPvAAY^{6+ XIA9IW7+~=F00000NkvXXu0mjf#>a(s diff --git a/internals/img/jest.png b/internals/img/jest.png deleted file mode 100644 index 3923b0bc4102bf8b642427fe70e27922c564be67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3821 zcmV( zdAt+V7016kf(z10-Ki+hBB+S_Q`x~-5jSF`YOU55HFd9*S{JO=wn|$OyNDl*b>FHj zZ9qg6LRAz|s#S4;ilBlbNI@2nRr|+D9+SyAH#3u%%&Wi8=Y3vsX6D|>$(?)8`JHoa zTHJd0VCsN0@H1dG&`^&Xs3ATFIsU0C|1K-U5eOa)oUZd(!U{0O-t_M~F_t*0g zex#0l*BTSkx$LrfD*GRG?7P+&3-w)`rUS1U$36u%)$m@bfi=it=*KEx3P8OU$O0w- z`zrGL5R0V~`Ui*;8q&G!yi786HE^wR{E>7nyA0~D?6HUm=tqzI|M@k%mq&k%`>=V9@nR9;yfq;X$_Dtm zAwQv}cM%Q88S=^LTz0)z5Eo@nFyw=QEoylq5pcXA|C?VB7iGT!{7aGV0vuDtezpX* zs$zTHfx{H}2Z#?*gt#ahZ1=sI%03VHbrst?(U6Z%=dv68!Z<10nzxSwwyshiX9L54 zmQ`x+XhZ&}CXAD^XCs!0A3I^&v0-owuvh-|IaO%y0H9HkFTgNo6zhWrRBTiA}uw^2Yx;LHlz1NgQfw?0GclsyNSrpR}q zvW0S(BD}~Qrfe`47wnN#4g)A2)dh3~hDL1D`r^l1QwYRU*_Ksu zH1L%O?OpCTcCq7_3)X!7SJy>xRQ6lwk78TGb0vLo6I$JYGeWl63)owczmv{opLSgs zM`eQ@47QvI3zr2r=c15pTK8a4#Z8E-vMsLUSYZ2rZS=!-I=na#I3-}4VB7p<1K4p@ z_FN#R$lIVVb{c*XqCYJ(r=cI49V0K^EH{Nfe3cCfYnDe4tE4Z&82YgZ*r>=4AlT@( z`hG0HwXs(AmH?P&c?!xvKU%<^-%s^~pEfRDg z;>CW?xb}HRyDC})EMRI2T!HYvJ2=i;ihTI%f#qRuMnPxbm&oX98{zsP*rB!p`T&}% zy#etyUBTx0z^HUCdvlPR38L&_z{ntt`EVKVy9n0-v;f8+BR48$pr?gt7?0agDu@39 zC#Q2+jn8Ry?D6b%q)wB>PSg?()gOvxluzi^%8QuYjj zGi(+HNfjgp7s%GY+ekvAAFm-Fc9El#OMn}VV@nb1Vuf;SPvA}Cx_9&ax<1?x>|pDheES-P zVvqi*$fCK%(eJN-tBhm!q;uJ#_@@6GJsVxoGZFjRrD%Xr*mmg-z>kb$mi%p?8*W8| z*vh?(V_mT`s;otL9OBft6bqu+58N4{SzpTkUx-ayg|4Yj=dv@=tCfpBt5@0D=vq(o-4k9n zYO+_^8gaA@(Y-5;mW0yzaJ6yXPKLZ3I!3$>WZjBFc!Bo+HYu?{MIPWVF+xT4U2)pWPm%$LkyY!>Tn(``pC3+%yKf>oR zTTJ0UDg8p{09xKf7sNvg11l=?AY#&uK&r*YAf+DK6m}A&F-Q}cWNJG{zeVMFey8Rx zJ^HcRY^bAB1sy3W!2VU}@Djq0)Uyz!N5vY1c(T&VEc6BLte{^FMG2smvMZ?(1X&Eb0XJ3H zPFUQ6%;nP~UOyC>kLQKB<_+M_#xaxiD_}o#`f&qdx;>B0A3TB3w1*I#&^aC3PG9fq zdnuChF&r_!&PV4c!XSqPoCgB;BQ^D2p5}9;xO5_LW;&PchB!=XDMgXdpe>MhAhA6^ zo@BEfJDXB!bUngVf9U)uZuGz&m8+01aS37(tUx|=EjC+hi*P+H^ZhqPtO{GrWs<4s zl;){y1lp%_*~L)GU+;z;rTAn1|5oU(>0ByP^j?UEY2gCoO9nB=YKf2Ye=f|URM`n+ zT3ZaI)5tmK0fgt-oQ}{6eJdf2R|$%)`9A#gYXKP~x*lg(pTB8?1Fy1M0Y5M<@Mi6= zN9VYsQn8H)8D*79KZ6|*juWiRuckG|tLzgHZ_tmoDR#5h0Us&nbw-c&xNs6e4_G65 zKDPTGH&_v;m4z2xWm^GI&8*RA(FVdLC*FunOo1#!y{K$@swFh?Z8e^OSy1+_=p$$& z!lwE0q|srJ?SMKU#E{FDUxGMRWwflM;BA9~r|ymT(xG*}AC?uWjO&qPWiDt!FB%MHbF8C89dftO(G(UUL2eGKOF^*qT z_?-hU8W6KjL%B3vFZvR!hI=Dot!#%Lgl!J^4Z<{9nOu|8xvW}W*??pLX$U*w24maK zOOdT7wny?dqNbMB3vCe^busRJrxs&7ha|A0)+-IU3pXJVk__TaK7~}#Hn$%D+5#cR z4nwBNBPqX~=sMu=bS`TKmlN1UmD=_`LGU3`#NQe_k1sB0gREIy@_!u>hid=)v7q=E zI5eHhI;Y+QHu+x3#;~6eKSg&yf)58G%It(Fy3*~Urvn4ixop|bo4}qf!hExFL;|rI zQb>r)O1iHE!_v8|mFT11kQH6oxjOe#b2K9S_en(CPP808L!wqcC*;$cKyuPFbjRL- zEN*CxFpd{dTC-CvJdLEXJ%}FMEsF#a9MBLXv9R9gfN&FMP~BhsSc0V2%|K|2X}D9^ z0wICq&TXVLtkV-oqKxCO)^!K2qq3b8)*y91^N=Y0d&t0h4Ld=CoRZ$qt6VMAVFC-qyJ{YOT)b7!R*+^9WVeIL$ zW+(&?EQKbq_p_@7dLpT8GYPKfwMb6)o=7gr2x6dU*sSbX*gG#~aBo%gMIeb3h(3#q z>L8elr})+SdLf&38Y$f7bM@i5qadJkU@_kUr^M1@7Taf2D}$p zXslAY0@@>-L?ILEv;1`lN83U15JL8Z-RmT_a9J1+Ar^r(hg=Z5+{y0S{kGzq~z#6>I5VtBm@+Y2H^+^IT}tvLQX>R=g;LmGj;3U#UmAEy@e1IbcjeSut44uLvG zHGL_XAB->PpQ<&`O3;L<0;A&?^+`ml)%bJkzAH{EbO;}I1TR^P53@G~Ab0&%Mo+vc z`!<7(Ybvfz+s?CnI|Ke)X3=r}SK{^iArt~o`4IWf7R!aIKl*+#PdN{lnB0z(N3ggH zZRO^ot4KZQJ)!+Q*52d=q{9(xT^v0Sdo5KsC1rl3{_Yfn^37)}5mNt#XHNiqd0S29 z{mH5r8!zdS}iGfq}eEg_Jm02?5Im}gLw|JC=_frzIYtN75o#+w)CtFnVd`Te* z?o38;+jOyG%crAJ(iA%y#zHR5BJRhJ7_*4y&+NVo-s%^*H;vdS=DxzWR}pwL>_F%8 za-n@^2AEP6JGsHPY@l3JD9YS#UC#1Q7ezIZoCv-N{BmwFgg+XixWXDYrF5RnVCBDU7(=dK!y zv7H-$t+my)@1BqeWzm04z*(EtXgvAavJSY5R+{*=b8*Ta`$wB`0T(j|g*yXUwE%PNq9+p6SfVS-7X8?Q3|s%Y1Fc z!0~Gr=)y}|r+K2@;zh-ulDYVO{|Z=wFPFp^f-2cJpUPFx&$21uFxOKk0(zwylo#O7 z*g=2i4JGB4s#>!+Q+VbTwl)JYOuEEWyk4&RM|Q5TWj3`nH1I8E(gjn!Bu&99Ao%WH zHM!vM?xdBmF>#!`gjDY^IXy+*!QoPimaUaOL%xM2L)R%Vv~|& zv~tOl|KgtC`etW#N$TEx{$BS!wwZ@9op@dW^KNP{>AH{Z0EvyHb?7fJKYE}|>vW$s z_esx1^3Fn4qrz#0Qbm?|xzk2G=ImiBY%Ej!;whV@6_xtLY+m!lU;9dVxpCf_)iG1c zq#QCQE#m67_79X66A*26F-hw12hFCfd~(!aQd~Z3J~})SwGZ~d(Mrd9DiJWV$Ew*_ z`%bb%Q5GoJ>dYHrQbCnjeuVbj{>6TF+0T0gJLZ3@7-CFR1GAusyV~--3IH`H3$1Hl zp#WkoYz5(*bgA4-0SiFGJ>J zjoM616C%EDWzUm!Ioiz8NjN+oI-6g=3h>QNLkU@&k|ni)+cV0R6fK=Od+J3(rQmj2 z37Wv`ZVm@JS=(G5UO$JVk?kB-yJn}M)5ZQN5*`(ztCU}TlAcBg4G&hlwa+ezm2c=s z?Zzx~3sid2 z$eW$KW$eNlIe6U~mN1)Jh)I*An4%86yTxO_y}K;6ML&Pew`b5sf6Gx$$sJ{9|^XDRrKHw*TG zTSyi?B@r5Y z!l`KqgT$yiy$z-3%x4F>a|dTx*_>Os>_80^YJ;}$@%ORWy0MeM96bx^?kLc2Td|tq zs`nhGuZ9yaepH;vU{OrMUrfecYVA6DyV7D8yHzha!23b}1gu~vZs>0lpW88$U(vS{ zaLyoeyqvYaxSe3JZMBnzZDLe~zrlH=tfgWN=3qRL-Lx>1T3s0N30czxKlXc{Gy+p3 zR+7&7wR^OsYVPraBx*3H-185CJQLH&@af_&p7JEF9wOyt_@lU#V|j2!Qlg&4%WyX1_9If#Hc5VYmUMatu zui46;$F^}6^jcT=&E>LKypq(w9~H#PQ^lDKph@!&QCBikDR1=a<#Xi(c18XExAiZM zb&kxP{26ZIgz+7;PPR;ygDbQ_1s9lzs^#-6y1*-!5!r(uv=MNJ^IXK<47;5OVMYdb zFZHs|Ip7cKS>4xHCu}tu*hd`pe61o(BA3Y6LsDHOu92p$)xIp>N=$N6A{p7mbDiCr zfiItMwIRz7z_)f^*4&R#Q_f)(>pPm8`Pl~|s2>LdvNdJt^_ed;sOXbR@E&KE88DH{ zT|yD+;R8+${{L+;N9 z4MXTMkCqXZ{35_Eak+h8f4y-jb9Gy1Z2c|ho{R1rNi>vfodih!8g0}gDI;22Dt)94 zL7nwI)a(8`{mvK=-`-+ziQidHXUQvu%q2>%=5& z&ba_~nYQ#ouHWMo*?! RTB6Ze{8V;H;cEB+>02)(`u)%X}UvjEDwOzm2Yz)|J=E z?c4mBVje<(7kWmP!ZpOYP32w-!-jDl2Hfec-c1IR*gq{E%s5|MU%=H?=C?AdD3q-@ zdsEy#=Pdaq78Tt%H0>8}+7ssZQ5L?_D4NVQkFth~E1{BNtM`8n>qu^_NY#xmx>faX z6WDGl()i^x8{Q@GhCgC6xf(6Wh_>?TpeQqz>beVxh!x)Zd5t)!En3@b(lc&3YsC$x zw)5{DkM^6B_9L``Unl43m(#EvHu8iP6&D<+#f!!_n|%?-)j%l&!hmE);mQ(b;JgOP7YYP;yN18b`D-z=tzItLJ%oB-8PY$Ce4aEb`i3p~4SC+9~-7@9|OV0v~ zzR4k*6@^Bfs1`q){R!o1*~dulVkOBM4t{Auhj7`@qZsV~WZjbl611l6`_9Z&n@REe|-tY>bb8 zZ5rPmw9zn9EPGBNn1X8LF6 z$rhQmf!N%5^BJ1Tyj6h%;SbXQY|zD>+DgL&ov7HRQ*TW&iGHZcAxW&GRGay`F^;n2 zesrF>lu<<_^yO5dp%3rKB`%Du{peKll_&j7^h7o=7fA^lG?NASRrb32>P{pYU$NFm z&eK2HYbZ5Z|8qC&HP_*H&l2Z@;zn}{K3yiLJc~fX!Ob=aZna~n5!qp&cFbu7tMg`T zm-_BUlDcsC1_&XYow6gI+8`>!vM)aeV|G<0xnHv;SBpKMValJiH02hB5`kt-4fE(+ z_lbhGzKu9vyIOM^Ldf)M1(>7;Q}f0&>-EfDBDkY0GWkl+Nc!>ePp)(-?}k?mP5e+n zD50OF={NaBI#(f*rEIPt{J#V`#hRY0va&`7`k-HGIkX|FKtimK!RJ7-BO&xI8 z3hB}pA8}c8#vPgU5j4R04nh=uFlNAS6}bGfz239^_XT57%z`k9u&$GTE7Yx{HnXvV z;=5b5_2}}4D}zWx(BOl9Ru%ALlxuWR@56#@bAIdcN~Rp*=9Au+y0E8-Hg{8%BH#^x zAc5hgqG{ri+x|wlEsK<^*HPf_nBYgfnKn%c{!|O~52FvA`YUbjKgg$BCHHlCZtl=Wh|&XF|7PwyLc`zkWw-Pn#0$UVp_CewX4 zPm+f}p2#N?35h%nvJUuUtM~Ev!(q+VzPMLh9BiNMFCVRBw)+_}WXC^%_vxrsRHF61 zK5~kT;)<3uqXOiz87u8=DCk@~fM=A&lo{ItAD3&{jRSHt4ZU5Uq+#?FggW!|F?7oH zuH2RQ5)KS@5T7lf>R&H&x{{y z{8;25xASKS=W2Gh&30cE9j6JY%*P#}=VPLvmx)j7T<<+*!e0zOt=(gScVql;B9)Xt z!)okq+g0w`hD_w8asNu2)9OF`_r7*ZA7%3~IfnejexxU}cGpLbs29`efnRQP{Sm@W z=#?-slVcmzGdsk2uhlfds&aV>WOjv<+RrOl++}Kk7E`oD;D)VGG)OG;J$W=zEq^3m zZs&Ml5(l2>59)LM78xMXt)UaoORk zbJU-0sX_0Bj}8$a0BvMY9I{O~(A|{GK$N_p+J8G4~jd@ z)0aiew~e1>8&L2;MXzSV{hJ07NvAG?i*b&ly!D=bPNJWJ`#SP1?sa={^7*8CcgEn7GldxzT?=Ik=Gr;b4PIVWvE2Dcmeb^d@)$yHjBGROc&e7esF#Pm&# zfr?Ksj-ZgoO0IX786ML!b_HNtr>BB&6w2(sIM7zdl0k4tlrb*Y5&s;6N8qp7B= JS`D#+{|8Y`0tf&A diff --git a/internals/img/js.png b/internals/img/js.png deleted file mode 100755 index 7f49239001778c1ff98d5ec7b0d7931c61df529f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5128 zcmaJ_2Q*x3*H)5<8qvEkL}!dL7@ZL%Mi~-B9gIF^%#5hfYqaQH5FvVtmgu4r5fM@d zBO*#-@Fj$VpZnc=zkjXozyDe1?6<7_JbS+tFJwua`scHmZkBC7=Ha6T+`0Ba+U#u0T75ZSY81F0ZRg8Wx%o^nX?-r1(t^@K%laUfIlzbSu~uB zD-;2{{%5SSks8pQK)^ylAb)>0Eq>GrDe{S^p_(X{{Oq8 z(SLj62?*4G^8G)F@fLwt6bOOBWBhQ=XN7YWJP(D1>flgF0tRP+!Fd0*i>B@v0tWAn z!2)#5AplWJ4<8qdKVIw)e>fa!;DaY1eVkDSFg4&AgS3Z-3sgxL0+vydkypAd4*`R9 zAzC^zFdeY&b(oH}tc)U9_Ae|9JYDWI`ukzpvD#~qZ*bsPo_ z_+!aXkAKcZ_8?H!QaA1`JAa8cP49v z0CRCNGR6=Cn3hGryKP%)g6*2$$&&1G8E4%a;@vbEY8w-4L-K={&ZE~Oxt#`lCy{<| ztH=l^on;;ddTKGL1u=R^6YV20rRZ0tCBsy&oaSR4w+k1fFYUaMz3nESe>WHtw4;%Z za=gxkbe8yXno1~7Tj~nj2|fM&&41_gW2GL$#}DLvl*+~%qXiz1gKk0rua9 zhl!DTl-*6#aOHTP=ZHT;YcDWgOFl-`CyVYO%ZVu=Urb-vsC+h1bkpsaCwXZdS7qAG z<;V%^F9{>*ZALY~gRaV@#pjQ@Zup}j$p;*BgP3OM8s+Wly=I=ZIGS5o?}L8nHV-X&dq zy>80)*ZQz%=xzvyMn@G*Vnai;peNvUMpT7_gRN#RD3_)S#=cQ|2}6A)f!S0w7@4hQ zCSCS8h_?7{^_2tF*U1*bsd?sgFTW3*>e22QIm`;z5D#8_1*>TP!*mt#=?860;2TVh!$y0KjxVp6!-y>S_>sM!J$njH1 zE-b9)Hm#8$h@7*iMqd}+PMrIW{O}vg?rPk^q~Z_S31{w zJX*B}H{G-sf@Pwvmq`tZhSpwJhQ~gxjEWxUe?!MG<1bP5Saglw2tD*kDr#Ww?TRVs zH`PDtQV?1tB93UR8(7Rn}3yT`5V$Eb*)9k+=fwBGEFDT&& zUiB715WHo5Ozq3`H4QiBy5nTaKA2TgFeeva-`!O0ZN4f8!U_f|C41N3*OFbE%WzXW z3J}cqlvgFeK(7sG7F=GWajr#w1SrInB^#krlO{K4f7D z`pDixzyZz7=4KeoVBJYIxsOI;>G>*@W>p98ea7>|`?(}sny3^J3#LsHtSHS8+R%U7 zFpFt*Pav?`^^WIZ(5)`Z3q!_>HWw&c+V38_kv9 z<=l^-^nG-^`si24$$obawG9;6S>rXX?_~>2Jv^?|>9}jaeH4TzO*QrFX*LzyweK^U zd}XlE_rNT)uLR~a6ga_S`zaqh7wHFz^?iF&kM#VZ+Ly~NX5jZU{DE{0;-BHvqrRyN z;Ss~2x4ttEpt^gNS(gWlFx$F#xA%-29Fwh_zYLBenw4qv8%7{bp1eZKvK^l z($6=XADy3c3DB|#o)?Ad{dSou+bX$YlB+2tx8mNY21woYX`%PYiDh?4aNI@nb~yQR z7dx;=&eipsER}mX+nA(jb>HU(&SnkS`M+^oneSfc6!BxJ#bxFvyL&RM@tYUa2CV;% zwi4?i2G=c+3dlQzZB`m)k)QXN?l)r!>G;=qfi5lUw-k~6YxdgRcwlH6@wIel}AZO&q5)?qSK8db8WqHX!MP_@*+NR*bA&#SX1G19FbYGSVGq-VtQ=eyyxb<;&rOp99l$t$1 zux8P8JSZP@gwyk=uRVkrdJVH6?EZDK^Wk+$9R{}iC?Er*6JekkOQ)4Rn%;kO;QAao zx_B^;9PEW(?K2Wwio|W+RHpe-xM7pPkR!bVBbi>Z4^rduGtgA`V60ze zy16@maPGc1@vUZPYZ~6aIl_hAy=Z(v^fT!dT3juN{*Wab&zWoS{JFz@)ll3`N_&BZ&Tm}&K|#1Ln_!p>D9aQl`<8E%*b5md zvG~GtpP7QeS{%N_SYgG8o+2i-@LGL$VJ^PgY_=V~T_R)->esVfCu*<79nWU|$`u?2 zP+yKc)><%qc+swDr67gcJUo?IDF;My{;dId8O*w3pgVnKDYX`?Q6YyU~FCDq9AA{R&KvA!jy&B-c16RR1!tN8wE3RlPXW8T99dNVU) zc7B9w($%%<+64S`bK-v1JMyuE;eu<3jkLP@VwzOOmUQ_}w+i|lpOjUi#1-W14im|^ zJ;k=CB4D&tIJ@vEq`9;sxO#!1qcmapflovoVz8l@9;uFcZE^yPKj!Hr8t!Mt*8tv^XJjFRmugIgdTYN8 z{;ElFT+0WDZ+!1u?~IO9J;W-$_M{EzN!{67K6qAmFTShyEr&#aK6PGR`RUxvt=uKp zw@i-f(KYp~nUqfuj@|n|$m+Z5>3bIo`@AXQj-j%j0`a4AklqK+6?=m(Ak$k^eQo6< z?$uplppLlbN=2cxw)*!j*+)Nof1gy&_wa=?WzRNP-dDRg|zNC37~7 zchHROFJthlpEsu3`t68=>^mjgpNhU{1d7M=p5_e9i;~w=a!%=CUoJLFCFF>{_sd{v z&bTbv=3F$*nZn^-x==p_AT)H3=ciVG-;Ueuu9F`OwlIs~ zYZ;su9Iu%P2MZst-btt0g_K&_rvh~PGAW#Mar;W^1S(An6$DjNsBENC*wY8$jsz~@ z4T^G;Vd~;4x^eHaWGNUo2GQvMl%_j)%w^?zLHsFNdyJ*mcS&J1rhfu-C-KmCyV*OM z?r<&fL%^>HsAN|wFRRZ@mXmvdT=ONl_DSN7BlSW{OI+;9rFWq1qS}baT)@t%ePD&k z62X#&?j)q1ZMw*L#1iB;Sn^SiDO@C`+38amZO{6M8Ue3i$2?$-M~k}73bc+XDnE&x zDtvT{eqtd#S)m-u@T3BqN}Rd2|3Tk>UH!$nP#qJC#&f^z@+~Xg=Xv(eYP&<&usL}Qr}ddhmVrkP3ZW)F2SX+QU=Ra+W%-ifl$$@c670=Kls|mhY&gv zEvgD>v3=sKlbUVb7y*QN@r3MHBQ6f<4x6lN_^F3BM_q-GMh7#VLy!2?^;yR^3fBU(CT}#9EAPIthr+z$iC_JhoPI}k$Ir1g)Zr6~B6yg{d6uowL;7fX zg;NqU;PW&dIYYs3EK-$ZPg!ajm^wdNAoe&r|BD#8i~bNvk^s3XW58_F{=CUAINkN` zB`O2@?^lx>Ge4~=b+l+HKP-3k5!qC_xw2Lo_Aw7} z*Q?A&_=)n2BZxX(#!Mi`n}bn3R&7CVK$Xe@k60sNCu*}Q;1Ejb4I$+{m7aT*>W`=A^W2~NzFvO!_xJt%uHW_jT%YUDP3{c6 zxyEx52!tNfjmCz1p8C_#f?M(9Ltb#V6ms>0Ji%>{oFf4c&O9&#Krw}!?Eo9#@FK(O z0eb}E2eiP;5AtLEM&^P-D~=jtr4Wi?Zv?{LQ6c7VLjedC0&EwEDCptKDl|&Kqo93> zEG$b*1^5ED9TLEEhr1VdM<~~hhjw&8*(=B}fe?T=D1|UgBqb{-=#RW)c&s*K(5R0P zD3pT!l$0N96N(B-02I;6+LDXK;ZP)!6^=k8k#K8Kcq|T&!NM=e5=S5tNo2eY>hpt! zqe*z%$ZQ(@b1Zm9LGvL1wTT{+7@ z1EgGuKnw{$5lYR-2?1pg1r2BVX$eB{7g~|@bD7|RVH6xO24{s;FKHIYV*PKZQ1}Hc zh1kH?eE%!4)GJa9VAy~Zlu5Yo#%)`v4kad2B>)EkC0-yHHe1C_d=LVqd{B&{dXi9P zz5)>sluOrq#Ismrrbr5LL|lMLqo831D}jJVrV_DuSDcHhEuBEZ;ao{}BrMk1&YECN zqr2EpvDjH(8pxFi0TDFo%lqm}|E{lE3PLd)nFdG%5de=a0fnfKOC}4xp9}T7e4l-J z-_M2iU0)2G3`V`N-)!`(309AK_(itxWLq#Y_u(b$_N+^z6_R1Bf$HJY49&t``O9G`QYF0wvR7p` zE@&mQdo&Sy5ObVR2n~H5C&V00ef9KH`;GDIug^x*sr1XefkzC3-iuu~m=z^CcE>Ld z2yN($HwmD3`B4LYtB`qnm}R;*CVY5#SYpTaIT|YD81Ss@K1esa5}3ic$k|w_-41p({$K`?Ru6Ru zO$^C23aXxw%pwt|Kol?`!Z8Tv2wRZGik6j9MXJWc&7chqN2m! zFC~e;;`bZKLC;rXw*3^!t)rI3C5exM{fil<+iDB;Ayz;W#S5xzi)$aFkC8}jx^t97 zpE+7Pz|#sHl~;M}SN@5;fV^ZWFi~j8Q3(io5rd>4L{~ zdM~1d4dL3tU6YoURZ(%|xF}vd7Bq1IT$$ey70M1Pil=v7Gumfut4&L64&rn&!|AARo~UZ zLf+L->a$mG3_2Q`ZC`RKsj_EROYY#fH@zCUNH{P+Y%E)@AP{8@A&eWQ;WIcJ2hq^p zq(Q^5OE~YW=TlJL{oDYczua?i5;=eEtnNAmh23F5M1)!SIBjsgOC7VOr7+|Jw<=aM z<=1-0Y0dFm$Bor@-H>L9b6UK{k#J=~Mn3m1QWP5E%YEco@BH4G{%ao^Nf`7fy} zz^+>qy`up}?JK03V+|WlznIL-cvhTgUZeG}*K2**nbyH1T3>xrcDi3+DpMoB)0jY5 ze?4Sms>{A-QB`vC(KpDNmgS3O1x;mHiX5-_=zVFAO5Q{!?iwvmWwO)a-HXO$BYN|* zC#KLF7C2>`u3Vk`Pf_v8Lo$xtm4z`goYvG#dGPLo^O1L&$IkVbbX=nOvyN3=a~;{Q zJPc4Y-_1O^ehzwL8ZplR-<7e&e?jVFel)70uOp|_KqW1#elpcfwY?{QcQI8_x8LAH ze7~bAdUN2@Y?;`r|LKb>((1mLN}dk*Z5Zb+i{ZC(UiwJiGaVGX39L z-M3AC-k^vhPc2kVI%Kz3Ur2v;phzyy20CoA9&GK*$^JXT@XSm>uuN+T8qU{+7#t zxC3Pxc*L1-BP*j@|B}XRwy5=N%U4uPExH15?S0?WT5m#L6XTtxJFFYpn5&+>jdGWy z2~Gf8t{F6`{%AgqwKY$)kl(IqCM1RE9l7x={h_&KE*&2+c9 zc47W{pXndBOP(gKEDP{3O(@N|%Qjy2N{6}RkCoc+72%kv;gOp^pHCz4_P5@1xwB-= zke;g$JA9mhW}$%`i=5ke#KNMZ;{Nkq`r*cehn385%rDp8~;(PbzxN6jf(q^5-yiK(Va zkQ!r%nS{(l36aS3A}_Che9y_*d!ON+bMAhY?^<`gGu^%S`<>tZ&3oS(3=Et4JK@rtpV)~-ITF>f>j zp??pY1$3+M+=IZwz+ImE9|9Zz91OJ1cy2y$HE@~F&P_tM@Y%3~Yk?c6Ok@y2?gU;2 z_Vdv9?ub(#01hXc$RG~C6!?dSz7x@^nc6)WIL)~>4R{au7FZwX4)k`O*&cEBIN%Im zM!|kJKm}v)`Q&N7g6Y8;``(cwn({eGTBx!Pr8q1hxj=&)IJ(np<1||Vp8P~c26VVGYaW60siIJuPeP3rBuZzr4Z}3g% zUjQwG<3`~55^XF2h6Bet*Eb8=>kh1gIIy4d%vng@|F1;9laZnhu|tVAQsJA>-Hqef zz`QEjx)nGO`=9TG6x!p!M#l9Oz%k^L=V|y7Swrj5B&fv zGLAa}Z9TQ?mC&`=n!mwg+p9?S?ph-yC28 zFbG=@90rW4qQ5r4ddB(J{D=wtg>n27Yz`@cfxwNq9ZMs5eLajxA&Ipw%E3g3p9Q=*Mj_$Ktb*wcB- z5^dar?OOi}I6C9`)6t6wu?g@HwyBv1y|B%>cME<$6TSogZzH$6J~;1F;rW)x7VaGU zJrXIq5RJf0;Bq92AYzVH!Qc5vH#86_-yKng=Q?CP%n$Bo1-SYe#|uzI(HndddLeR& z>w|N1@Lf=3uO8SGab7(l;QEN@uFKm3_+!q#S2^dyQK+;L1)1idmo^<`T4oSsTimhE z20qQ%Z!R=PD(e{(p8&bX=cBC4Za|NMZPiqMWHpk+U}(#?3;O=KbAL7pwSIz3#1Jpw z(OCh%gl>ZfYl@3bz=b)!+eDnGOA+xJkeSth-0fAt^DWW%TO)$55nOj?MN-=#HbQwq z7d?TUkoa)3GNn*0pVoEnCmvN93I2u!Zo3wSEw+2c^UE5xfPnd$?Np_vlmB9hAp`lD=380T1w z=#myY`3#w$mr)_!UM34(gKXIkg8?TIc?!ySZ;KtD0C9|qb&;YB(S#DQzHmBrJbVPQ zbX*L;j>#O2M9j5FT)60pQfAXo#=kD%nHcgAx(^Dvk0qYoS&E2zAg~Q8D|jDq$lJzq zLy0S?kxqMKurtxsVk&kSK?lSnCTf8rh-UU2REIYMl^hH}iQ(&zm^0BCg$bU;&iEvv z5}}Vk2~jtG@CB+Q>W_#!&bhx5J1(&~k;w=0{7yB_=V5bq8tRZ+--Uc(*h{hP;lokd zD?}gcB<$0~>rb9Qvtc_F=$h%=-w~LA^g=4K2z@>(I$Ybh)`*G$dk25r8Vq-UrY-tw z=`MLZgLV`=D#xN|b_aqxLF7(u6G z?2-iwY07XI3fP!<4OR6_$QX=?T2!>yKRBO0+p5F0F>%CaU1gN@)8+DfCr89 z4UoM(0-KwEM>>%&Kmq+UB7!7LfR84O%oTBkalx9 zx(0X-+cq9UzOt?))FW%8BN8Kvkl7RxdK^-uN!SUX3eq%SSUHx)hjvj-+0hxnlR>oBRF+!U~gl{4(UoGB6!Fv;nfU7dT)0^^1iL7M9wW##V z#6&c6tHoRt^$W3udDH!8%#yATJaityja|G%b~$bPD*DPwV@(DA?Ob~he`N(`?Vc65 zatUqPvb{WY4snII9SY{8VM!Hzxg2X^W8%)&KKM)N)f>lFq|fcZxL{R>J*}sSctvQi?0^z0lOIIADcH_LYvd7J=t3H=1N0^9>7M$4irQSC(&@shE$_{MTH@S+%v zUBqMJTx_}7Ks0L(LwU@yI14*dKMf@eR>LLqDimHcaW?Y0isbJ?3?)*qHHdRe#ds*` z@#p)2zZB@}b`)<&!WJm35aKCB+%PNN7CAd*Fp4-+jG%&y28AkJ`FUzExB>CUQ_%tu zI>c9KeaSW08S7g}Pk)_>xTVrMm@7yZ3!oQf2J&w}9A_5E96+%`$<2Z`+@RG}#4Vdt zZF_a_F);|mI?f|sC44`W1PBpE#$LnDw)7>tKxQ<0!MC97#xf*YzCg~15eb?#A$npfvozEpj-7<#{UJ9$u{FbBY!BJ#a`?n-Mt)zK^7k_0&=B3ow=8%OGMhdm-};y{ zv6mn}gq@Ih6FXhCCvj(Kdz2r15zPR1S@nCt_cAM4^CoB8ptp4a$sx;?!GI^AXy1nD z<%I2zMzYpKSHvBmC)bEXjjt^wHbO5Y%;_ydv*Basxe-WAhGX3uF~X@xT=pkfR4zfY zWeh2nPBq&|bVkd84=24+bRm+VrYpQV$+7G+ux<4T!LvSaKejTynq()bFEVMvH8S&q zznxRs{T9V;E16^!cIJ=!so^)ozQe2iez%qdTkd?$kh9is5Evck@vU~ z!cPR-)rTGHa38lsA&_Q(n8gOpsj+Mp>oUxd!Ih+J?`j$x0tsj%@l*kS!m2u~UebP*jEHDBB%m9KS>4(r-#6 z8+)O|Xm|7yIv`@Zi#D?=L0zmOZmzCGvtS7-Se%JW&1s0ZvyiDsFs9HX-5JmDP3R8T zRQGDPG> zWUuC(LPY59!T(WotD#i*CUhU{l}+zdc)lU{gymMRBabhf6}8BQ9Txwpg)6a%{1zg7 zS{XwUOiN-NWQ}+uwC}}2TVWRrmdPw1LNuL0vU5zv^A};q7d}TBogzdAi4!w;mB(z& z4c~+|mrg9B+y*5Jh_4?Uj;t9M2N5qz7*4!CE^oi)cqI( z>#@taHYZ+Dbv?3~%U}WV{W`qCH=#Qj$6r$2#weF#*Z;Lb=3}^F$y3-c!kxlif%!q0Nh3QJtQdY#-0O_bZnY8z}n;I$HMq{26$pT%~6i&p>a zi2_1yoyH4D9-G6Pc z(X?Baq5_$dsO+7cg<{F>hEsB)vJn$!CyXzxhOac5>sKqzCSHXa{tU=BNW1qy zaxp2tHxaF~c4crSY>bvqr2Qbn6lAr`K{?JXiPuJ7L%h(l6n?0m2f2;nb;nZ>H{C&e z>z*PQg1EeBf%$lpk@rG~AL{2pjzzKJJfYHO(OSlB&@``x$RPPV5Gi9a!5dK0b1;&TU6I+h7+ELJBTM3SJi5CH*f#j=hLXY^g8t^AaOp!w000xqNklMC^1%ysisgVDveqbP10CJ+X@wp@mgtfsWAl_ ztH#EdCW@&yM3LYPMM0FS#43o05s?7l=;(u_R^0&yp8&1`z7BLqIkp-2E%0x^?LbqxT{H0&;5^`1pmV}; zX9KsQeqIW^Rd&bX(7vrM44i=8@QX6EGF%QdZ|2T!i|14{##M!i{1A znuR8m)UQ;um4HtN9wz$?(hZn`rtH5ds#6Be0yYBwjFye8_$hjkD@R)hcqs6Tgzw)4 z76Z$GKct+iD{vDM!ik0SP8b2KMpJChlw-FeJ>ex_eZq0mfiD))y9Uq}0{&r4`$NE| z&`22y3V+XBw{Pr$WC`_~)jS8h}(;6st-9K{-7QigLq1ni5ZZVT;!yMTWUIMy<-+v$I0o>VO9|5iao^{#=qZhOiR4L$7jJD~(A9I}Z8ekvfSg>$D@EGy;c_;9X zG2g8~I)OFoG=l4lw(&X78H_3ge5TR%s{+pZ25=Pdqxo21DXq2Pc4*X&i}}qDfr0os zK^8m!yzR6#VoT>jRRZ1%_!FmXA@Ev(*SH249rN8FB;;Lce=kDou7!ydyH0LJ9=Is_ z0*4fMjaXDA;Qf%68pYBQuJZ`+S@cj{^g*NPeq@GO7>k?|MdM|o?Z6VQY;U7& zMM>9s7B~o)gA|%5j*a=vyS48Ym((ZgUiT^KTCGsk2<~mPtu66->(CVVK)|stARD_Z z;evgy)-x#_RSDQKL8=J-eF;T%;xHSzB}44mJaC;M5O0UVm;2Qr4oRRSTQNa8P`q5^nO28IPr0h5NI+BH3$5FuDCHKX;*Gi}} zRS9^r(YAYu*Sj1sDO@~^?OZt%_)&@d+0|&Xo=M@TO2F?MZE11VtT+SsuF?J$a+jWl z?V-8=_;yKsvhLM-CWWIa0lTg`$QIH|!%*z$wh4K;>VEIh*gUD5fiWfY%eq(VnG}wy z1Z+Lb{R+NDSHxtrl($oXC6T{3AVD@8$Ns#8zFFrh(+{u{RS9@4qP9e_Z^74?i9A>? zE(3mJw7-aAye@V{G3p{=3HZ%|uVJDp0dK&6WA`PDO&Nl7u><_~A_`6%?m~n*7o!lV zuPE&A{Jo8jnSjA}xc4WS_Y{gzh%4=43GinDzyBt-OLHpr2yYbK5fdbeRp_NJ9aRc= zj?s2#&U5xaYo?1=kPFgUV=a6MyMI5$4_Gvc!T4JAGda&0j4By^mNS1ijR*aEAg#1L za09l6x)s^A!;#X}vG%DeV9mgXNV{&X^{tbC8rmbK=3gV%>f1D)jxx+>o7dnuGNWn% zZ>P0a=kS9HtQT7|E=QFKJH?Y*%D_ZAwR4+2l1IIv3- zejA$rPztI}K6{eZ0{$e@u6y!-Q=pBaFY=_-ec-=GN>&sL@J+_jP?dlWLfY;~LgbcjV~!0Hw8B^wy=d<1MF32nHgq zHOO508B*kyWjtRZylF9K0(e(MMV*A5q7s4+&_i5a`*#^yvz8&V#ZAS02faW^iC=)FG|3D5sUwPvhjVNLMG4e(6nW( zQRA?)3r@y%MHYdf*c$I;*dDTu$nM<__y*Yn7q=rq{;EcQ=nA+9N5}QZY`BOp;cmgt z&VLQL6&GR)cNdhP=Hf2O6D}x`%@X9b*j~6M^n%XDe=$Bn_a5SWnSji%S@?A0hLA_V zlaV5ml#N%%8_4l+1oA<JgDTaY=Ggm0sD`Sh?Zx1do0e;*m}Nx}L>D7v!; zQnsElj`=U6Ew1wxJL74TxK&!drT4S+hnf@Ur^*ULo6jUIufWXov|GGPu!F2?6WE{aT{`<=FS_$){( zwe#Qcr}!j{uU+eR$d$Mr=>!iW9#$y3b0zk=dnK@2{F5au1+eKXo?2Iqq9oXx4C~ie- z^pi2)|2GMVY)Jy1f&GAfj)d@fU6{ z@tOW1n23V=X|QyI%drLU;~f2Q@h$8bkumo)JlR~D)JV;unZVo(060fRJ3?s~2bYsGIGsssWDh>DJ zQ*S+Ag(YA&<6t=|%vmOW0=#OpKSB7*)u*`b(3>!($$V@Lb`vt`%EVTDrmFW0ECIW1 zX_{+MumaJIaF>eabcLSJ>f;W|9ldq9u2T<|fZYhqAnYnRMdB=MD$Z!&PXo_UWVYT$ zd|$bR;n>ROp5(8PmxfOG{%DW0Z3*}#>> z24>!T;JBJ!AE9Tq6dI$=ZbU+~a5N%{<t)N@GRV5uH1tHHb~f=A z%z60Kr&b8fY#4-UF()}Z?m{Chgv#0(?bqOPmj=^1M`t{u+_*TL#%V&`k=@uHam*U6 zQ`HZ-ZQX3a$+T8JcSFld)YbVBst@h*t1a|I`i84~MzIAAyt(cdSu-1!As=-T^<*4k zdHja-O((vHFWg7)6R_??doH*LQG{GtjG5W{67 z$-=gMWKBM+Zz*?S+JQB^fY#UB(Gj)<(o3c3F;PU@<a! zNbC0=l7aas@_-#j&Vp%0CxG`sk)etB#lJ$anwEs`rARSajMkmI@mZa#k)dBk1^LJD zH}ZG}y^Nhus?Gouwi|?~z5~e?n_i17h98k*yP>iYz%A7MwP#Qa+u}JCM0W{+Af@JO zD0ATtw3KgX1f6TY?@r6^q81f(VeJ}6H+X&vo6yWRi{!+!U{opKC`O`@FoAM6gsOX! zqBT0|MOf-}I-1ea)Pa`z99?J;Za2!U`13kaHs>NIQApf57_NY;spVw3a(+XodQ%QpAzFt_hha!tosUM}|5t2BQ~1?r*6NGz zZatFX%QeNK%0g(p@biscMnYbPw9OkwYwTYHuFt4K2lg}9EdIgzin~=HoCXJOjdImr0_9;Gw0=71U3{4oXV>1#)okRUf z?c?rh(u|z(&9n%(J*@>Ctu_mCuUa^peC2ky+OFYd#p${dg4)oGZ5 z9k`fIG4!PO@fEEBRJ5&LRRZpX@49;(zaUyx+=NQ_x|l>V>*OS~j=NZba&e1-8wc*r z$8399OZ&}RA;851Y~IsPkZIy#f9&l5z@GN=V2#lh=XWm@RSDQ~Rfez|8o>ta`c$B@ zP0<;o3sS1A`Xl2gUcWJ8P#FuVY4ZF(4usKggeMMZW?yoki4);{TG=H z8H=jSB&#GsqnlfV;x;5aH*aVViblPUz192O6hoZ1V8wFN%0v``sswCJg=KEecnKP{ z=Q{0i1!Nw@-dL+BSp4xacVFF!s-|cw$X)if>XQg7fbt4(V#$56LYJAU$2N+#+yOjv z)2ci;f!1rUi;mNjkYC*LcohNbUW@kRnW$30uHQMRpml>7iiBv*4%?9L zc_emGx2}j*RE9=v@v4jVKY+PULuUM@kjpJ@G#O^7}eXF^?tN-P%f0*=9t z96d%g+Iyt}{=FdSR_Gyxn%jY07DGS%@Ei^M&6$R=z0y#!jpcm5$Iqr_K2d(pLz<$X~ zLsh9OQ5;Qj9?q+16m~|nKSHQ2A0jP!R^HCla5Abc5aMlHj}*AAD8_pT@yo_|N-oXZ zR;epd)PwSIHKGU8vhzv^rlU;zA~PZ$K;g#8NTW`APJIXq-cO_ay4xPwDw=c~sxX@e zGtiX&Ey_uEX-1hAd!WjHc?g1+QXZKg5p5YRyaP?ajqEA33MFp!Lh;_b#l=Ff1qo<( z#FK8Ms_h(PDOjZ;D?wYV!4~#LWVcaB=-tt}`Y!SjKZCUAB6!qApg*beVXJ+rnJbV5Sa%5#>@7dW~R*@)jgp90mWQB6stH@p% znZKt$?zz|NxqF`bKA-RB^In%|@IaH2jD-vU07`8wH6!rd5`5i<5rfA)&NO)dV3yHV zQ#J`K`V|`NMUVfmwp$dYdorXYew$Pq7NZ2C5%WjyYwaD~VC_ov;lT4%UsSbe%cQ*x zl)C>#I|p4f{MJ&=e_2eb36JsKYMZzAyz9N3_hWw=?l{Oqc$Wjo%#}u?1wlMZ(-1Ex z&JQbY2v2!h3mqT&O;F#_S^b(tuf(_Y9B&uCCbzJXz(Fp(=6Ins&6T<|nK zUcjv2Qdj=2m1sVBBFVzSVqjzxl`UXa{^}J;q8cPLG&E1roe@yVasG33v{YSFTi`Hr zjH>H6E@%q7JPTGW`?{Kw!+2LjWKr#f;inaEcpL$+7bw4XehDLvM&7wo>AO0V9-^>7 zQWA17Fu}mUP|qy>uu)1gBV|Ivl?9>Ir(bh4!YD=a2?9kN`jdXFyG*e;rN9n zd6r7X%hHA2YYi)_nPox}sy7u`lZHC`%gMq~G!Tm%WxnAM7yXg8KW2VWYcOaA3(ArvlXV_~5k;K_Jd*L#0(wm^-!($||) zL~$sgP|)b^qL;8JK$(U^n+}Mefy^{{|Lmvz(bR#Yfe9vQyeQ4`w81)Q-*((GtiuQY z=*Zdcf=5?Zr#T1tIHg3oA!O6FO556QMk)av9UYEMh!_rfvY_CnPd!QFdlk3W*Z=wi z2g@0~rbo}jl_OzL2s7j$y*;^GhNOaCp@ceyMj8{nv*VdiZqD#bqs9a^$C0!=mXVQh zZEIPS$xbk59%DI?a>VGGDrY+Us4aM{Se7yBMnMrtF7}g_$FjijVxIArg(x}of= zLuI>^0U9Bo6nL}G;x$rM&5xd$_xkgD?0Rl$YF&zgFsVGk=;>!|cG5n$JUcbqF#)%- zyuX5z;-O1y)6vnn`?~t9E_bv2Ljt?o7g_)TgaL$bWj{y9+Y)-wf`cLygu5TlJ*!^4 zSos`!etg*>FtrnNWI<3tj}?p-jayxPcxx?0Gc@$_5?s^CAeJ?M=P(^jBK$NP76Ab$ zB37?Xug-TJ&yTnNHFR~gwAW%61OAYnac zQBhHcg?BxAqKL?OBt`=B`USfPC>)>z|2nGUWIp-ezy}(wY@UM>8a%*_x&HB06^j^p zxwRj-H)-`)=&`%IoGZMKPTjC_n>Dl8(=Kp{DCGKlLDSHXHmaLLccT65Ynkfxr!RC4oig zV55o`0Bczr^TF=}xODucI%j&`{$4M2=YG86#gZxD#ps03SPbk?(1Uf;7hXPqN*`@-=$CJxEzo6PMLD&=pK`1Mes-8zx|CG zH6`T|Sfk#O>kF5Ja+r38*KWs&3Jvu1GK_^P-frQ8@7j|b=g`%m=Jlv@F?rVsc61;44Q7pE_xqodjJ4!$zV0GCWWrF|sVlB`9fPK0NlmzF+a`N!T30#0U}p@QDt z(+&_sdqDWPC5%Lxf5+orCH{BCp7KV>Msuh?lah++syF?%rl$|vey(u=AMi}{l!&1D zoa~*(aj9-r7tCHX?nYA7^F*k^nDHJR89{F9))EI1hE)c80mARKzq@9SR zafC`F@01O_3paW>5F&6wRZF`WfLJD86?Wz50FXN~v$S2vTID!5Ha61x2LxPaZXWW) zI34){GF)d9`iewp{sp5Yik%nVUK`g44)$cf%g-!ws6{$tZz&hOO6)i_MMgl^V02M! z9bxj0)IG{n#*dOpvwFN)i)4Hs>T%FiDS!~R9s(5>7^~~Ndb%16PJMt%nZfsLb6a14 zilmyGRGgdHu&)mV+j08KJr&Jt(nW-eOjB*GBr~K>*Qxk&lZA!-9{?z}9-<}{rl{t_ zuP*_h4u8|t!{c%~U))6uQ8h?Oro;{9qJBO|8VRv)LY4<4DI|t)42re3wi?*lUUhv8 zJrA=%p%^f@m8!RI*_!oD%LN1kKym@+I>$F`I~$u%IxZ`Vp7|<6sBS5oN-`pYge4Kt zQpozWOueEQk)c;t7RxWHtA6C6uC8uA(fB45OSf&w1Y#?7(Y@f~ByDj333Vk=H5N6aT!hH^ zfgl#aOo!K%3MIR3wsp;v7Dl~Ty15@eeoIm~@;C~5T!a`cI*zr)9GC>4YZ*Oe(q&9E%-1VH?sUR{o-l`UfnE=#!w0r};tk#;kn-fGrXPMM zX?Qqn8Mrh1p$)_{Nz`{`n6f;(CI?Mdvhc@*qfLD8+M%5z(bFJ(0_Ll~)vP6ve6IO<7Tu zBk$^m{={~3oF3Z$tk`!XGg4_$%h=d>Gti?!VcdBz=N=7NY>wWiATf5q!6>(a)BV)& zl)8{#0xM1AP)OjPF-=2L)3`u+g$+2tA_5wwLt6@oGEqu13WRmH?IX6tDO0#jDIz}0 zEEnB|L~S||6_Sx5=pZghPYXqf)eRYQb8_a>-`bd#b8DaRSNK_`jDz)M5HMXV4&E7< zI^L+M>#Ii9*uyn!b1-T!R-HY*hIDt)A<}M|fOooS2E0Li`ppG!Sj2t>iA=)I`g&yT zW^T)UUNU@vd84c0JnaE^uhP;|j=JCC1YK~=5;qlIiE}+~sy>25BWvzKV=8t~)lEpy zQpI0RO*?l~f)vpuG3^#lK77f^*Leg3wM*5T8g_|(;< zbnHJxrNK#So+J57o-$xuI{YeRKJ-C}!ZQ>8?2`{{0Dl>hi~a%oA5kg_5zK3T4SZpM z_m>0iZ7iEEPbSF1mI*mrqFHM0VxjWYS0h zX~1tpxy$=GSML|^4o(+jDg9#>*=b5gomHFFr_!VONk!sW+3sb_IU-z{1G-%1InIF{ z^M*@zbof-tXl%p&I)frc{?AucM@+Lj{tkMsRnpO_!NE>~q_iRYWLP^Uf+}42C4B%< zl6NKt=da>anuOl_emY1l2#i&W#$J;jv!LmiFN&RuA6<*)fLRb>Xv8GL8>_3C&ja3= zAn z7Df$=%OfOVF=`P|j!U{rHZS9?{`Hq{T_fA-eiHXG+ zOg-Oca%sD|x_0f%wHcb2Kn>|Z)j>TX1K!gFHJpa_p(>=AT@v`@fsJCZhzk!a>n0^w zTPH~`2bLnTbR2F;Qxy=G7xmIYx%31YGU$QRDj>;W?g8w-dhyL;2z)fY;8f zOvqk0N#NP~tADD-0O^;N2ln- z%FiA6U1IN`iwK^j#E!`^*5Qck@=a&qicy-7_}3mMv%aSXxt;Pmp&^@A3o82hquhsa zZUvy4?rRS^oc7=PQSUWGkme{RC?McV9;R`*BTWTEoQ|c2N!%F#49v{pOD?xuXrKg+ zLD#cUdKNjt`Q-5N+EF=_;>RT+r3_yRI!Ii7MXx^TgFIq?S8oFy0}Uc55kYJepjeih zM)9&@tjXizC$A!NuG5J^*x5u$&&s~F&n?VK*UElrd%L{M4$!ac=j{Azs-76M8+dD9 z%E>yrlDBez{n5tvmKBWL*9FCTwIME-sw}SA+G?%HSG?WcJY0|nZ;ZdT+W1#Pt=M)( zPEgpj{K~QN!rKJ=Lbv&ETfVXW;4}11ctl2e?Uu`CN%rqdUVViMH_OA%OMVj)``_!r z7})hqN9~CRbA$*T(JJ4~8A(>})2$AOHPTXD)hiLeW0pfW2~w2~Ij4qE7ENdi+x&M? z9E*K7AGd$9t<35XNx4BtNch-!vqWH^{t4KhOzpP2RoW4vaR&znMNDfw!)n91u9!a= zvRY7B(N8W+TBCa-zUgqp#OE!MRDT-v9ZY^}&bJh1@t!CS375^n?B7!jF0URvdUVF6 z&7z*c0h11WI;(PZe=)B5;3&Vva4+m(FJ#mrM@c!&o~jisxBHX1d0v!mpmSV^E-?k0 z%j}rOMf(2z`}&~6Rc9NPhaK^?wY9!$BhQ1!n>^fqI&lw*`R~p@vrf0;*p9yf?M4~$ zOH8>0yUN!`7Os*M&?-Q|)=oJBFR@?dQJ%U-imGCyr?=mo?@0LkpUg}_Wg@6(YH8_RziJ~As;G8%wwZIzW7KLA4tY42sIZP2gmBBoQYP+;1ipk!!hIMQ^x zj4sM{u;*qDRibzxn?LCkt5W^SqC~(uaRunA$X8PNAtjCoeTBbJFb1(4Y3jVb-1R=) zTQWS%Sdq>XcNs~;txS~+;?s}xtU8`bLLwuUq#w+^Hh%T-XYr>a^X-MsTc89nZx7th zyIcsr4h6B00pLMBEi*_m9gG@bwSIv#(6%H@j#1))#>SLClR0%p)2yLy#%6kjC6*`r zlM5&m3M8blJdgRHHMW0P+OP;2A1~6WFtD@heAU?a$GLgZMc#?~416vqpp`+-%))X; zy%WZwWLZtw+copJ^V#9rDCh$XbjsXVK;f}JBtE*B$XguYRb8FT%ok%tN+*h@uxh zvgyn3L(wzr?|=KSlElWwR=s(1aToD&0{iAo1%t&x0||Q|0F+igGIR%>my63<2Izqe zF`NO3>=eYHsfQu*Lnze^dGrqY$s46LGsFWE0bxCt6$>q4SLwAq{R}6j+Pd5My5&_> zFwpV)Qi1C6nFe@ayY1sRC;X+?_Itd49XL|X^6ZM_K9$>T*beEpNc4Xqkyb3hikmvvY8dr&MWY4V z=@=|Z)Xj5ZK@OrCz_xQQ_`x_x#z2BQ{LITd+vG8GJI>)k2lai>Hv7mzjXzrjbavNB zBoeO0MHkdLbz=%nR8YB;ZDzY4da;iK9ne$*=gg$LodlS*xUqP)u2<@pJl%L*n4FwU zk~uI|JcfSVc7t>JGpIFprdqsLYCvFf)L{FV0Ghe4Pv-uDt@xNf?gIh_IKO7R5TJWFozyU3V z!x%o3+Fmz7-KTtO8oVZ`d+$U39z3fz-+J#QZT)lAJEVB2IvI-<^BBnBKH*F9p>QK9 z5}#t&dzrbxic^+gQ5VaPsjjB1F@0;P2Bv&YS|K7-FdslEXwnw4&0wSLEYJCq`NH^5V5;2sV) z>trRV6FW;!cOqX`T7?VHmeO0C2 z4&SQB?SSza+maW&pc28D{7ZLWm?U$~g9%>N08Y^UQv5AWy2J>YC^b&ne8upqR!R3s z`LEN{XCa!J@uL#MqT(4>re24#YKEV{WGe$qyXLW=0SG6y2f@o(%uQ%e#lm7LYgCH) z@PWqkEyYLKYlT_dhDD}qXI_9 zVDGrO@fFGi?CjjSSR}dTW2I`YwQBbK;+Psgpw$>Fs-t+vKd%iTq_ggpiaR_4wR?!_ zL}R>_m6e%aK!8hAe5cWjduzTC82N&z{Rxy9m~WGlSK|`H3m-C1etl}Z#3$7+#$mw} z)nle^^4qs|LtEQ0v+(fi7bRh5>nb*Q(CCXH>a9r^ZbTNE@0ex>b=dY}Q^5GViHV8n zTB;6z-s)`8rxx|_L-aJep`ts$AX;8;} zVaCAE9?%AX3a@rk7KF~NBl#j?CGgX#(KYw`6-Kv?|NPl1mU?X42*&NYj*gDaH}eBf eKNiTYsb3HfG%+t4jf4NC0NUyg)M{1iqy7i=w@Q)# diff --git a/internals/img/react-router-padded.png b/internals/img/react-router-padded.png deleted file mode 100644 index a0c4ac955c57f1cd4b8845d0c8e3de28cdc633a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4801 zcmV;y5p!w000t*Nkl zdsI|qzsJ9O@0no+hT)DLd}=e;*~}ykUDZs=~CY^EnAVg!gXATV~=dG4hK9Q4*)==QXw!f5PH2H;o;#33kyR;Lb>gwLxv}x1#vN`u14Z|=ll7c--;Earn#K6G7++TkAWo%hlnWA-%9z7bPMvXdW zv)NwD%gZZNwDNXf7&7U)y}*w=@<^YAgoG_sRaH-&JbAK9+HfZ(lL^Cy4cmA0=+VC& zJb3VGSG1wW3;fbcFHP*%uiyT!zWS<<-ELR3Zc=nQ9i~s8-c(;-Z+`dPcZ-y)yT=M_ zu~;5u7^Y~~u3d`MCl|@d$!KY5iQBMY!@rcMug3`-5fKrzXwjmI-Me>3cZc`AR8mt@ z>k0}AhMzut`no^s=}`h(ES8Uoii+mf*4Fy14kZZ<4MkjB+<#|hXV3Ll9bF+X^?G>8 zk|o1E9?!XNzWIj6tj92U@??aDhEB}Q%`K7Jw-N#~XkCB@0tf(52Y@GZr^(FBTyyyF z;S7hvLE3~KiAJM=*=*jjX3d%xA>)RSKLozDhcam0S?Lde15g8?34}kuVzJZ~6cqF! zt^01^si&S2R;^m4f=nVS(SupE_Fw^khr~xrOpGBeF7C#UKmJHs?Ony#v13tJR~NZ| z|9+p>&ZGjfKGY!qaDh*Oh0z) z*q2RBO_F`wO{i2V#K*_aTEBk%PDmWGyUj9b>C&YshYug#EeL`n`@0#l+5Ez~b?ZKc z1d+Riz>60ze*DOhBl~;B?U=_Oe_T>e?s9>jd+xdWOG``3olYl}-Mt3OvY0w`>Z9+y z_a4#tZW~HWvb&1OS= zef>26p6Gs95ORAPsr_8R)LonV$tR!K+Ivnq zM5}yl$m-Rrt=(1Jnff3ksI_1?_D_GxT86pup&h4}X!|Cjtqq8Z5`Q|JTkit^c24Fkf$gsT&U21qB7j%*>qN ziw~a!_INyJe6jZz{Z%SFDF|Q#bU-IV8N)DO0n86JKt(w0DT&Qy`^gu3$pWXRrw=PE z?D7Erc6l;D2bQAQ5qA4tkdUXR#~`1H&Ma^LgGWJA3!; zMNCYLqPKg6Lml9dW-fz#8|W6z&IPiv+a9ss{E3|uakgcYQS{;KXN zaCLPxmM&dtrnRFMI4mseLs}c9*=uiv;B-NxRG48H4CSahiDCo?2Y*a!LoM*>)2APx zwNaWXmka+24}rU}-CaJfL<$08y5Xh=02CJ&Q%8MJ2|Rc1+!4S2`YUZ6UBch1f5%Y> z;CY@pWHCL`h=D;tercC4Sgls1r>9S)v7r)p;J|^)>6+BFeA3c{kKImOaylWR^}s|F zMSx)-@_f4oD6B?W;t-aZ4LWOXlQ5#O?lcG#XQRL zvJe>=iNE~iFBmdp2-Ipdu3Wi-l9CdfIMI28OR=pH#Q>t!YM3+u7@$%i0xSXpG*Aly z3?dM~Fc3unt(%r27>)zOvWNwPSdI3kq#hAy5(U%>JT9~}qe7*^DO;mIfBK)W*=$eJ zl&2C{>BJ{2%OWEq1J6A34A^!yFHW2|fwgPb;>?-Ox5O{G-MG}wv0xCxVu(hK={h}z zvm#iQy?F?6XJ6$Y!oac!W>^dkR3V=C;Ii>P>}+g6g+jL^OG`_s%5$UzPo6wE@WO=) zOQ>5U5re^iojZ3TE-tRaHLcNT#LSs9arW$4R903>s>clx*LWUBTbiK@3c^s~kIj;H z>TGLAtNsiajzf^kjmew}jU0!IZlcUaKH+dUP*PIz&l4w3Tq7w@{0<&5V#H(8n?=v| z?b{I(6GK$??YG~?(4j+puJiNS8eHUERFg7Rr2<$Ev-F`bDKs(b-@ktvX<1@{2M-?n zpVFE`Pg+_Uh7B7=WwU0@8d>T-EC{VbGsR5~hU37vop@fM!wQb$h)gFvH>jO@PmB=nR%+iAPgnf$Qt*{c;Q9PNJfs z5FH&Y$#%+=DL&VKwYeEB94G12f?*hpS74K*y1JUU5@OM=U-xTPpqm(t(j$Nd4jkxn z{T@+7wZ}~}Lf?i#fvAuhH*OG@?REmYT+(Nvas~f+e7Nk+E0E)hCi5T7J6KXk4abfhlVn>|&tIdcYYz4ewXbtkDbblD6<5d!aljpOiPZJjJ_kP~8o zRSHKsY}~jJ@4x?kr{#_wJ&M`0XZu`Vq*{Ze0|z0RM;3 zJB}mXVJ1Ip&}y|*({nl4vSka79zBY=bLV2plqt~bTjQ1mK|n=C1$OP)h5Y<{DxYC2 zi+*Y~f>;hgqKHtA!(g=r<5&*jjYe=f-Jdr)7#4!d*}DI%Rznm7Fbsp=Tu%JJvH0?O zy<9(;2(_9#>V#NegTa8SSLqV8MMg##2Vn5rg5lo8k(8 zh*&R*sCG8Nq1D1I2xzd|P$vpF?{?t|#k^$V#EFQDi-XBzLQqf;YHDgwT3U*I`}U!# zs*2bT(3*&x6yn9e^Upso9zTAZ*zx@N^RZ~rq7H}l)I ztX{9j)~#D5#V~h9Mo1s%!GhJOiBEn-~j^$bed>VtyUu|D~r@603bR#8gu8$n;3mcfEGrU1*amPZ2|z_(t^f_ zKDgxaeY3)BHezS{m`0{B0yBCwE$g=Xv6bf5ZYGJ9g}i&dN-kN)^$0lR<+9QN826 zp=VhPQmZ8m`>alfY8!nl^_{3xD(ZlRHcTc{r)6qtYCb3RM=bE0Z@zhM(4awH%SfFt zu`DawWGkHIz)C#O5qSZZB_4F#ie9h3xn`GQ>y3zr2yEH1h4>3$R9lr}$By;-yrH3i z#@%hmbsTB);WUQ<@T&}a?oCZik`HG(J1H77W(<`-DuFqU`_$WWsi#0ztCe~ar6aBj zJghvuNP;NBDtJ&U!S+sEE*CCdyeP@`?AfzkpNEEq9-#3@C2)0hb&j{^`}gmsad(qF zd-h1O>xiNz2Si?=3cKNNG~x?2-K^Ui1qB6?>~`(;FmLxv3L z@Oe{H6V;9k(0cy+(MKOq*>uKNEzNLf)ezley^#?`{H)dBN0~+u0LahJr{03xxpOD3 zT)EQW^Zxz&R~4JHGw)TVj6;7A%0=d8I`FZ`RdA|WVRbsO*)D&?%EE;UiGN#JSsB)@UF)^X~=d! zOG~kL?_QLYbpGW#qtS>12M*lS%de>n$Bi5JMP+4WN@wND%E}bKu+|>OoGm!!iYBFcK0H zke8SDn-p8g-Oy^acD`xai!3-Cjz^^0`jjs^BO^mRaDZxKr58#jPo9j;n>YVSCq+{F z>vXzqpK<3d;2~d(ea-mJu3ELqv1`|^?wNO}hm)9?h}_)Vb~RG!qZ~p>Nl71?FwS1c zxqSI@UtfLryw)i!ENn8H&GdIodhyDP88g1vv15nN0oQVUH_0$(&YT-3PZFO)_u_>S zBSs)UKc7SEN4VQX>F*{rFI%?kC7FEP^B4?ft$K)rJ1$}>tHB-~9TBqU(Nh7ClTbm<48)6&vJlI(N6{6Epr z(b%(R53wFy`hn=Lzy8`lbG_nTN2k+a+qP|fS!?=5;F_8m+t{&VC-t5K-I1 zDQQ`5Zmz5!guWBMkD=?C;OPo6w^ zu)bc|bO+rHy~XHe}SO zQQImiD&o$a^LhCw3o$V}KvfB#)p|M%T@ zA4ZHAfsl}py>`2OOI}{y|H@i{k0>QD2R|(XXj!;$;e+Af;ZLg7>PZa4Oul;cYH&kC z1MGG?nwy*9bUJTlN@rOXTCEmZtrmK{9-*P3FdB_5f*=&}JpX-tef^#fKKOt<^J*7B bD)9dS3LK__8}USG00000NkvXXu0mjf2c#&T diff --git a/internals/img/react-router.png b/internals/img/react-router.png deleted file mode 100644 index a926678b6fb59163442f2df3fe8115aac61df271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4640 zcmV+*65s8KP) zdr(u?zQ@07?Ia`+!b4GF5mE3}W7UqesI^RoN+Yx&_Lh5FJL+kDw026-Db96JV?`=g zEqzU`wYNTQ&$Oo=uGouIoT{~lR;t$e;8Ckq#8cvfhe`q@A$#xpN5mtV$KE?3#Oh~; z8Q58m-_Dn{*IK{zTWb@Z=iveZz~zVjV)5d|m^EwGyS25ouNjR-d1GTEu3o*0mX;Qn z&1STM$*VnCPmc;>Fc?0q zsHm9R)YQ~tb@-F;@Ngt0CH+r+e*Wy9szZn%qUR%v7A+cTx7$yD|NZxp4GUx@O`3%8 z@bK}4g@s3bUA8kp2pkiZU;se?ngOr^%Twg#<*nYoe}8UUTbu8!3_uhL1@wCTrq!!g zzXBglpb5|Ox3&NR$IP)m00uxKfOer38VrV}l9G}>zB2A^V8)CY+{%?JW$=+G&RPhC zqlIt)>_Q5OkB`?RB_&<|`RAW~Vbfj5=+UFm+}s>pUS96?+=V*1#sRQFpco4lEO>b6 z(4qIN7ywXJRRx>PcFABcO!KxZuSQvm7A=}qSy}l_dwaXLcKj)j$z(`QPM*1L-MTL! z@ew9jkj0A^XYAj+g#p0FLAE%P+tD zFn|91C^7j&3G(8LFIpQL8^u|64`VW!(9+U!1;ALLc?1h$Fc?}-oH!xLuzQ))r%xj< zFYlPp^nwIgx^(ICl9G~8>1N&Al$Mra#flXl3rXv-Q(wAtsdo47-NySPD({&-efp?X zt5(&zOXIPHG&MEd7sE%KJ$tssQyRB|o2D$)zgq4((ATKX(oU_lI3Szh0PxY)x(&#Uf;Tett4N?Kl#JB}Q2q=KL zp&H0Mr0oq%Cets@uHPX@c6N3`X=$$q@Hyp~AQdPhVsVZT1oH%GA?hBrO9}@L96)Yv z?)clU-yujuL_|QYG|33TXr%Rp z%$Z-``gb=$YHDg;@UJ<-xnj4Y)!ylRWaR;#2l@tJ3ju&5M~)=H5$OZq7D2MJvlGvr zJ=-fr3BeBF3?Z=DY%WId?%>g17MOxGG&ErG;>G%|zi$c>5fSl8@0cW?J}&LqF^K{iYx%Po8|Jcgzt^z0HPyM24ZW)v4FPEzul@_yC+F0>Gg| zhi!6|GQ{gTw>LH7JZlp* z2%s_nc2ei+%_ev{)>l9UcA&lQEf0sI07% zl((Y7`{PC;7zSYyRvdYr2hXxN+}ZP6Fl;s(s6ST-Kl=PS=z{JJHt@P)Ps3S*?fMr=sm@vU@x`PJ~V&1%YlKY)5qU8$Ae;@`4ot=)^w*VZT zV~Tph$N8A+0aj31W#f}|2 zP+VLrs=NqF(N8W%2xSn$^9W}c#K{#HLmBXPI~bMf&WRzR;A~b9LO|ql@Eiw12rgJH zIKohTbG5}+w=0M~efogRm@$JtbLNbwjM352NKH+}m@#9Z)oRhv(Scuo{S_4z75MQ- zQF|PrR;v*c69bt{hAUUD;L4RNg7fNvLy)Kn#&F)zX?IOBx&k3?ERl4ByYZ#B@H`r< z7PKjq=;SzDvslo~b2!^+!zB^@>iF^Fk(87Kolb|4kPtLBHlnJk3cGjjMtyy~;Bo-R z0CpbR4@G{|l;qiKK^`Ia`X z#ZakK*uH(cTQLA&&YU@-1|?x(VW1Ha5rPt@r>En&=bjUkR;^ZJ^XAQxVyHZk8`cME zP*8h*ez8|QQ?hl^fLFaby3*fnR8lGhzkQBl~m zY145EI8H=!$F*zMBpCq!zH;xIyzsUX0KfadXV>1|4yn#qPfG}+MvVe+BT$ZEm@nKV zmg=Q78jbLk7vL(#!pMsMQaPT7k+Y*oLf+f4*=#s}{=B5Tzy0=`+t0(p!}kC;1Zik! zC~%j!yu4hJ5xaKnl9bOC742={Sx(e4EPK5bU(3af%G^;>QX(ne&Ye5met!M>^>x4v zK{jvRTswI1V3+uKFWI047{$ETluDk_gBzO{6qO(_T8DeS+U@H~E1D)6%peRajf z#iCszUw-)|E?v6h^7H=v`{Vuh-`@w^68%1Q?AX)p3f;POD}MOl2f;?npFbbI_9F8D z-f3q6-!*5PWad)zw(DW{ul4lO|2N-u3%UL9SlC zI^R>_3l}cLS6_YQHcee!9bS0h1=Q4dJk~=J7pxt~?`VfnA$J;B&GS4ss};2&Dy(j6 zg|!FP!i`2Fo_+RNk0H2aWo4K-bEe1g+S=OYcKzP%XpM}F48E?e&SL>Ooeobw{WQjo z9gDEAFt99(y1F{-+qci-v(lGL3{v7@WiSRX6fzKWfJc32Cl0l@qn7p0u^M{49w{j) zNJvP4TrP*%Y(`a870SxWaP+9>lgPDNE%xl$bF-;;^Ae63Gv@2My1EQcg;ZBp`#nJ0 z8I@KGD!p_RdP{kEx#U3)03;?Rc2lj}5^jEe{(m@&M!!$bVKSMz`IowV`#jHErca-K z_rB!gE+Zu+1w}<0uEBv>2%gPbLRZj zXI9;#WMpJ~v3c`mj~iV)J+c@8g8;}^tXOf%pN_*n6DcVvSigR~pj9*s$TJsZ*yuFE-!3Mrvy6!nfak`x^kF-hw0PUwz%Wb$`?A z^}-^E??KYi(v}n!77BWS%k4;h_N-mI_P;YTGw0rae03)^H8p$9nlNz<% z$;Xc$-`mpS-|b(4hFYygVq)U-qN1X&J*Re!PhN1Z*Xy;Bk&(tgSZD7Ih7KJHwOT!V z+qP|PL#c$|6G6H#7!17B$iBOk)YMcI6ciAK@lAB3Pdk9O-g=9qr>AfAm2rViMn=Yt z!otF6U*4~~7D8|QaPZ&|yPe$J+()lnyY^EczrV^G#*G_?n3$L+3knLphlKCP9qt5C zz!A6A0g11oUcP+!-}mj?_iw&98Y2)03JOA6TH4-~D_80Pc)#Jq37%Sr*UIbldTnB2 z;<>whIXE*j6L!0OR6#+3_eT@C!Kaq#i3NJ~ot!!ZB8YSpUk{;b>Yf^?CUl{I+8h!I$5y2?#-MB_}86DUC++s@ZJLICbh2{`lh$pO*i?0}o)> zuwe)b3oA35&6|pfivG{16?lm&K^XMVuud!s7A$x;GBWZRxm-Sx5HjiV<;$Vhu3dxK zY(_^%2dq}>%`>$qrBEuBP%4#BtJMe(4~JH(wQw9)!Lsa6EiEm(KK}S);V13%0{;&` W%$5^nEt{kO0000(%o+=ltG3-t#`6=egJCx~}ha-{0>)_jCJ-nGq+OAR7Px;50EdusrSq zjz13;rsLMRvZ3#|J3}zEBUoWQ2_ddH6aemlbwhzn{9V0JmMB+`(7=}{O#pyi9Bpk! zutQ#kxnunmTz_K}i2lE&002!LVt}i=FNy$iLwTVwTH;%6o#G(0hnDzN2vP|dppWuK z8;9XgR$*q=?qR;}8Xn?0+8|9L>{!4bMQ{ZX{rxa_7*R|7PhHsY`1i7+IOtCZ!BF1nQ&9u`^@txw z!+ChZEDaEU#X6p8iF*?W0Wd|ykdP3C5LE>%&P!2QLqp@YhKh>(F+v_6iXpfX*O3@O9#|Gitj}zx9@jFxiOdp4GC17#ZSghaQr+CF1 zOTgm2u>l}`D=0|jDjMT~4Z)xP6OTl~OfYzYE5;pVVxT2{te}8Kd%(aN2n0d{4pv8i zp~}jJP<5!Xfrg=yvLQkb3_*Ym{^lBB-Gls57{cFNkN{#EZUuE)Q7QTsS z?zpUT)9XP10AIL?0ok5r!!c979bI#cnmL`7cBciJ|XdiR6@SF^U<&Uh4#AUu%-~Nu(`&L$J#`# zdMz!dxru0-t9zMkeoG2_7e<`PZD`EnLmuh`WNW0|bk~h4iY|P3Xp|*tZI3si`h(S8 zw-+s&lGVJOD?;O!S;>>jPhC+sxvog?!lOe$Dr#)jq4ZFnI_wkWjQ{)?)KW-(JTeQ% zGbVf+9r{V`{3Xv;dv{q4ob&2!vjc>COfyz>LTzs%LK>nEB`C+O79`>%+eOF=FD;3Q zYinlJ<7c&+cJ-+1U>!a{+{no?2ElUa%XuWEWO9n=qojpypURzV&oHL zvfIsdphy4kzAeSDX%syUW7MJ-ZO$y)O6X6pCd&x&Y5MndGl#^EZ8eMsn)%AN3UWwS7>v?M%2!_V>9Gg~1gx z`JmCU-><6rFivjz(2H81{G?Ba#30Sfv_-L zs6>|_`JMnuH|%=*LU{^caSQFgr2US_KQ|^yN?@ z*Z1=NCu5hZpVPJlsrU?%JVW^kBP=@r8$t=>pfU?9E_o47UhbZsBOtry?wWGCp zEjzm@2{cy1elXFkJf1WZWh;{~p!sU)VDbX(LvRi%-qVx?h;hl3Un*9Rp)=zhAR`{u z%TCJO?XYA$ZGYQctI}aQq2P8O@642)Zi(o(HIE`*tBm@V@_`7eW?2hirWqyno*6`2 zjT9WIf#X}$t<^bEkX`HlL7ral4(4iA>^k=g<*|UnQ+l*$HXG7Kj>o;q+2Op`ZV7)z zSnF`IFs!AIeex7F2`e}MJZn9>a`o1OUhT!tF+bFrc^Fxax_DfKOUHad zWo!L7_MNN8ncHrF&Kav__D67C2R<}!m_iVpgSdxhkd%&_j)PAmb3Po|777-N3)7+8 zF$oP$aVeg?vzJx#*+ZpuDR9XIQ0(S*Za&>QB^Vi&u&m1%lTyUu0cv+*kZVg>VCY6# zlCsb*uokx))Xsm$iflbD`Vj8o9}RXfOP0EFjmN0ci1U$=G|2jKbMZGPH2X!g*e|Cp zh&!F@55vA6z8bo=;khqanw6e?t+cwgVML<80eV{_MlJPIyG`eZ$cP?n1eAQ^jhi(> zo!(Nvd#)Q-eG;A0)s2hY3puj6ktRqlh2f=T+f@ji?xc~gO`^IquEhS zeI{+|>Wy!ggr-AIyio9`-{T)}ZX#A5jdE!xMfyr`?0lBJqv3eYipT2al|Kw$&{qWB z9|~OI(cMGEbK3O;Nl|M2SWARs?ek9+qicGi)!01^VLrN&eq1U*-Yk&>w6 zxTk(i+nnBJx2?68)O~4V)!LIb6-Xj})pl)Bru}}^HhHAmlRq!>XfKT;E=0SiF~6o} z!tt&$=&|+YXke23`n)bz@?sc<4V#EFm+Fd~J8yh%EIfKY{D1&_*nhe)RA#e+bKm5Y zkBMd3TykoTWmN*~%|eXtkax{vWr2P3E1CZU0RkHB7wEJ@qW_v-`=i6-|>efp=Vq%x?{b!K?^DRNt#I4M5mVjtCgC(iB@gd+WXx3txqu~bgq=n$~vAXPa z*C1EyTF;e1Ug-V(4Yb?X)WQ6b|BJ5Q$?7oU`G}HD%-Z+3_yZ+Xp@r@Swit$ z#D?;~&uCZ+6;S?=RwdI|3-)P*!ce?^JyKy*ta6;pw=8xJpL!T7UHpQi|Xwc}h z$s2&F_kN-{Vaiv@gs_U2}?<>@(Q4!oxJl#%F_N zM5ZaDcEWnNB{=P!+_TloS3RaqaZD+29duKnuVwT}C-p>l;7vBUdCU)14oT33b<93Z z6E#Izmyx`^n6kjbi!P95!8XZqs^vta+|t8qNY-%AbaXGxJ4JAxUb0yPWoW8MforHv zLI&X>X(Q&uw7r2%^{r}P$;k>{9qISa2S#rKd$Xw}053Kad_ip1Hz}5@omTf#O~#M% z!+tHN-|15+?ZzJ05^Igw$Mrb62AZ91-^C7JSaqMh+WB4}Df`gSJ5ip(+V}lEnCXYW zPa7rimS?G8-m`|7{Obn#qAj>%a!@@D z(#q(~-pY3MVsKZb<3eF&qLU}(otwDX%;?!P*5MvwE$ec`?L!c{^4CPVy%eM0NvkCP zrRfReOSmcD9|m~IN72x+jr+0;056UCH2dVK%j)5;&PqTZrV0v`+a%*6PQR5M?$Ljf z#m_yh7x(RYT^h}tc;NAc%nnC7Q&iNg&KgjrSZ`R$+Ulz1DZXZTe}KVP)d z^oTvYiWvOL6}n-KBTN&y^0m&t@R!}a$soIZkY%$v`SSjj(crS`^z&`AvsJB&v{0Q? zvxB|8Cs3i6#*UhUWdoPO^kX!3Ug~pYgziW=$_`Y&{{A(QZpp?n%6!lcuB4V_mOd9~ zySbj3c;-Dh9&lIs-1EIz6@Fc*<2%)0x21=7#!RHv$U(`+bBlI{-g7bDSeTc2$!o6a zsqm^Gp9j_2ZLJuE)^h`635W=`+PvavPkY2?M=4Pwo45*ud`xPaT=DXy8VJ>T zHBkpVtt@j-r`Uc=l3 z1)?I|AYrM~gznTCAV;AsOW4@X;3b=ecVapx2Bu}ri=+-(nM`k7vfz%?Z~1kYP1Du@ z4Lar1X6V~59ADJ$N-}>Bl0Bjo?%GsuJ+Tps$z2AL?1l9I*fudO;ZQ&S_DsUULX}6q zI_~pZ7EzicAdhLlDziwD&i1t9r3=<;H*{!xLhD%84}aJY$Ggru8kIx7#0xAe%reLR zVSlBl=E7T3vMgA8*3qr|PfO@z z`5LTwH?@Z8^)lxh%}Uru`d4FaW#26wt!C0i@&!WqHubw++i`z7ny)k8d6PV4B;&BY zYHx0(?l}(}=;O5}@I)o}(rY!M3*3v|KLR|k8_83Adb@sTP(o)0r?bB>v^OPkKI+Y@ z$(e|%E9etr2VUmk7n;Y!7Fkv{TIFBAu|3q|D>jhQAR?sQKiw5#4Ji7wKg(71QzcGP z_q;<;nhU<@-+E z)?t7V3d=>*pKsl&bDA>7NKuAE<2(_U`8SGH-6+i}>rDl%@da`5YdMFzQ$@alZf>B; zch7Q}1aO9f1qlZcCD)695r#5tP`82{OM#}{^1y6+Rg^gs9jUI|L)ylF-2AMu(VgU- ziI>`p>Ir2q<6K6X9~tTuIeb1m_B3orO7)b9>c@D2U1OB~_G?!Ah7&K#g;SoOWcS*) zV?Ot4V)Ei@?3??md(D7vU^7d>3xO$T3*l{j7EaSmchV)4vsm8jMfh)=H?0iQtkMjN zieL|D$mleTb>9yZj6^P7)5>BA?MnV;94DP-R&wSJ@*(vgpH`;7i8g!|&CBd8ku>^~ zR9*s9#8^3DZ7xk2J7?)RvBw=&ypOH6?8JC)poB`7%Tm8hQ2 zbq+DcfehcdtVV&gM<4Zwt^6)Ht=Po;^lof%b-F-|O!K_#(UOM3mlKSnM$W*}y!=G< zIOA};8W`lN?6@R@kXSB7KJHrHy5P>jQrY+16@1+QH_+|5$=OG&9vSD~&3IoNdVj51 gX_E6>5r7_WGv*}MEFni_@% diff --git a/internals/img/redux-padded-90.png b/internals/img/redux-padded-90.png deleted file mode 100644 index 7d96a6a6ebf9ed8f59ddee0c289590a64ed253e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13160 zcmV-uGndSXP){tBRXdz`&$+4lcFx_(xfPKBVIh(LgAF)=JtW&RIF3DL#s+NTvCYgF2aN5( zpD`v|;33H%GL{4qD79j%bMBkdNjp`o?~ij^@ybX-nDsp8xqbJ!UA61owO6fr*Skts z#{T&GGvo|`j! zbT4Oo{W$5SHDvV?;{6Y0i~#Su>2*)I7W~k9dn%^jEdOqd zNfgCbd3EQ5tTz%21vaW6VifH;pUz_CSSzXCdDg}gH@f1)tuu#KxzUEl(-7xH6#?W& zI>b}f@l_-jC3hoza~zd)7MeqLf`o zoRleo3meAxqnc|kH)7Sl)eNsVGi?sMDmXqdWyJEMgnC(^w=N7ldmX4{#oTxem z#F7_IrYe4HxFb7_t-d+)*~?G^I8jlGqN`!4`W)Nt+%T-}C-S&-B&T@R#`UyuSnlF$ z_MQ2xbug00e0=a89=PCZtUGxLIv*38@_W)E`Ym517(5`NVyIatRg!!5ofv%Y@Je(2 z*8F(qqT~g9!G4zm?j$R_Rpu)N+cU>RRMGj}yH8f;<#R)qzw&eA$%D_&CHXVW!}D^@ z5fRC=E|_>{H5mL<6Z;~yI$KBq)}R#pM@A&e0^JSrXRU*_MmVEb5sKI&W&1m!guj)# zZhxFAnucCt@8;)y?VY>sEq!3>c)j=1pIO1$>KNhJ;t!uS_QIEqcTebv_9T^PEvnDnIKQ7Q z3-oYOeO4MbDpVC51%9zg?BZ7%BY&K@9BbGp4xOl4Cs((3)(mdbE8@v`@zfUVm>;Dcl_9yh!<>OMPskn&fBb%&T&3GOUW_L(UDHIz9M?}p7}F=?E3L7 zK+J#ChGtoyHLCr<4XeO_udvw2_+I14b+sgZtz-a8 zUWLFYD@vZwOcD*wQqxgwuRg(S)|j;?2YzFyo_{ILjq%14d2p@L3%0IHUw+o{+UMpw zWl_Vk?mUhyKJnVJK#TdoyB6((T?)e>clb88_rz<<0$u6;U>%D>H*jorRR)X7 zD?4JJ?@2&Zg+RKIKe}zI`mVvW%)f3u#ME>Oi%L;TXq+a@?Ak!JY#X7$zLfN_=jA4Z@#+Jqo8-IWN3mAYp8z_>(>5^h+2c@+51;bl#dLhLyXsY z)Vl%>%H;|_-ii2h(qzxR5VP?h-C&ZDPLtWq_b{Qe1p80NNr9)J-W_9eugqDMS;{_r zcr;#=R$H=ifF{>y{|&4>aVbfXOn} zykPK|w^Bq1$Pb4 z^DR^2OJ7=~am5Uai=Mj{F3)ZRJ^J$qzJ=nzuuf$akSl=j4HACKGpZ^*uoPpEeo_iZ|oWOQ4|3~ zqf;7pCYZjj{ObAuHB}H12_+!!%zt=s#puxoUa^De0xgy(V^b7lc99Rv@8NqloyL~B z#fFwhBQgwyf^`=0N?`&_8Z*6ek@?}6ne`nu=1Q)XcDdL0<$zUmMP!-Ef;+;1F9sqn z@k`GlmeQtPzVO1&W}o|r-!P)oYfwDR)%eNm&=W5$3-sddsb}1W&n#wD3&sK}mFRg& z0@9CoBV&@hU3|eMmdQq&30L6N6INCbOx?i0+#WGFyoph3{#{l=`pYA6Vu%IqT$?jI zwSt!(+eCHmaG!@3z!}om@w?Ce7G2Z+;*hJoBy%1Vvb={>2X<~6IO8K~5DgoOJWD_? zW6QI5_dWEC8#Gxib0^kmYv<;3hT`NLas5bDRB*m~SL2NHZyBl%lBSEO2vHcYXpZ6U zyPwkHh3L>zk9brRd3IMG5Tz+IJIA z#Z;8}u)`}3K9^g1w{dgjde(%(WG^M6!P({5cZ~gBq3!~Jb~=lVMn+$H`pY)XOx(Qx zukXK+ZqXqyKb-JmS)lh!-}H_VKwmV5B zn&J3~t$gRsmlLlpu-1_lA&pAP&NKEBNP#hm*FL4B)`4|`%9A2rXhB&bo)f>7lYScy z9vtMX)pt`W&CrttymJRt=|6Z?a__AP?Ygb&d+6>7H0zPe4=1~~{1!ZYW*L^uEpqjl zzfLn69dSO};MF}GZdvRDweso{rxzu1>JB+pL^j1)8*)w+O47A@#@zr1uh6NfjnSm zR{UYLYd=v8c_c9y6~y(aSXD^FTw>#OFb^?a$jlU!M(CF2*x5ag>{x}{*BkDt4YL^DP`^!9+b;L#dNRIsnup5@Swmk7q?-_NVKu5ax(5^9=sV_NM zu^76pm^e|pkMjE6B;6XXKKmLdVv1Zi5_Uk~s$kL_E&rcsL`dmOj4H zH8v$J_s1>2fQC8V3LP!5M%Xa9LJwsjH;l|O9~Oj(fixl$hXx%gZkS7Ew{z>zT&sKF z=5MS|)_h}d^Y%aAHB=j|HV?|&)Y}wYijbB*t)-te!12g;X6bhel$XZ+{cKsFU(D^# z2Aww%B8k{A_=8Gnq-Q%163VbKCePF-wvhJ5$(3{a!+iR#(S@0sGjnU> z#J~2UJ6V%QtlzVPJ(W2^7l;HQ<=QA`PjA&7M=xp}^9Nh^ZF>#*p$}m57WMKbYUjU! z9&LVY_od`E<)bV1vpUWzA?Y~| zza$%2<{^p!REo#1A4?J%gBb8l=e3FInI33m4UCbzTj?DrQNH88wKHF7cJ0@WjiyIu zDkn7=Utnn91XtuWTG#y<^$mMy9rd_m9-q%K=V!@W51-DG<&z}IB568@%X4~(q3AXU zH6+yJ;cfrZ0=l_n(_=@X9`6bi!E1(bZ*^9fVh5q8@Pb1 z*7A1-j>Lt;Ub*I8p6E{=UK{A_Q7X+yU#lzvQ3N}tT zIx%8?GL47;jF1f0n6Das_Wtv@CA`12SW2fODX;CnEz6q#Muc2F-V2dgTA*xzMIl$P zB8o#5FskYmrv=VC5rm%6k!Cl3ttEafHM=X#c%S$FleXx#lGYHa0Y;wv9pduQxjrfj zt^v3*ng%#R(q4h42A>3!q{iJ7Q~dg8Ue2qyiZ&i$d{l52!Z~yfAiGd3ilHO0{nqMC%i?Kvl6Cxtwy~le;;XU~L zf>7ma&Aj@T&GP8Lp|KA4R1ad@DOtmh0BH3}qKRx>c`=taUro38u576MH@1wfVA0f$ zt8sG`OQ*4Y(@JGb+@hid%S2e0JUlIL>U#g}1z;vzch)>3gLX_Quen=`gu(yf|b z3$o(#f!JGW;ozrkJ9+r^S!?R5jis@JMb?%~6D`!J>!*NG0l$>9-5e`}MkH4ui@RKY zat*IKylMQv+}tPr?Y`01R99`>S(NxgO_JlrL|79ny*wVLjzV*~CV5*UFMsz-JN8}h zr85pNqN5bf{XkyiX#=e&uE@bCc{Z=x%V(apV(9E^whe5Tw_kQCmn?L!-O5x-GI44a z7zqfhY}k9`rpnCp3;=lwzyIk9d-i!oVoy7p(_9n6jqBRe<@_(o9s7#)#pbKp-3Nd2 zp7zlXpPW3FUUSAvIA_gO+Dhl1^!|MRqXHDb8FRxJF9d;SdS(a)NB5kF=iZT}t#fSV ze#1yGVJIVNmv)3op_!UocZ?*Bf7@uc|NPLfB`9|urVO5mJ+1$#su*L5%7Zk=VuEmX z>-fGqzdX>`^zPR`|NVNJ*+yp}C+_NW=!3)9U@6w}7@gg5l5>| z6U^$^9W}k^x06S4k1AJKHILP^+KIRlPaak0Ht_6 zcYWbFlV*mvI!2>C$AR#7`SzhtVhI!iF+l}WA3o{UkNt>2{j2{THoS{q^boDaUR>IvA~C~6 z#64JLH!{||lC##of`NL-z{t0#mcPtkdx(6oN+H6~U?Z)D@oyCsd2Lkov)WHOD1cXo zc=NWvR^HiYE+XpCr;%h_K8`*mky0=Ls24ELnxWQ3Bo&4g| zQPzYTxhYRMx=^`&UA?$3OXX5jPzpL(c;3nZyY2O7clSE`HC&PRHxnpXQLrFu@WC5V z?6Pi9mp-AE7|6;@t@thn8%LO5bthp~#pVXp20^KcU=Yo@xp|cF>Or>2PX3~L9fw!v z9Nv3?p^Yb~g=N-FZzhfob3!03az+L!JWyHp&vSd*5AGQ0e0er)jh*5#ygCBncbQ;e zvNG8F8!=W36>@Jd-zV5!Ue_@k10aE6ZqGcWB-e0tZFM=YACg2HDyphpkbp)_*nP6` zC%Zcb-~QtV3;v=bTye&%>{+bqwcg)!cR9UODf%@jK3kFa;VX}a>0V#DQ`GnL)Gc^T zsYWY_il4?5JVMeu>iz{NX^F$ldwFQf?HrHxliG}OGK7{q1s+F+S|y<)7p#1N9^YE7 z9?SP$J8FW9OZj3cJ-N8Qn{+>Ky4w#mqcccKZ5b;n8s!GBN*sE!_ImlkEq`(EPwxy~ zJhtM}>w86Os~1I7aXzP1Z@kaO^GC*apSU6RV^WWEl}AM+^G_A%p;ZQNpj$wDe4f_y zE}AO`|JrA4$RzKJG!SAJFkNcBbH~i_KX@pO=!GhQ8`S638c1-A$zuGAYVx6GhLfDH|^Nx|z^zKGKX?;}ZPX;;^=jtJ9t^QiX(AvCLX zcKc6LnrKkV*3wY>n5>98N4B;tMKjg4mz{S;%Trox}jqMsRo53D+R)7hQ1w;6)VoaS0+A?mYh&)V>k3!9tIxTD&f zz(|QmN_^vve<0~~v6Yl6We!yq!0jUogd)p{8x_A0!YoCxxxrr? zt1tJ?@fH8ow3m!}JQRJ&umdm*MK$^BB$=;eQhtw*4U#(!XNMpfBM^WJVP4?N!5uz} zekxk@H)dfPDPEn+M76Y`UakLOsQH_U8XVhjoS;~m)lU`ZuiWq_1c+2;hjr6A7jCXL zYVXSX>U%|yKw?bJ2l7bYNmeFvU}B}_BEB@dhwp5dqUAblOb3fVu;Ol1y>?bM`duBJ&HVHK-SSk#W%OryMl6WW$+ER}1!^+|R1|W$4NX z)hDj{fh{vLcMsi8iF_b>H%T&@YohY zMIFj>db{Tu& znzLEoxQegs+dwp{Z;fJBD-OgENJt_6u7t(^+Hgu*Da(WB34X66em`=5A#e0udWI%l9b@3gCsLV`KZO_o2 z-H+}43opCm0xDPh96c58I`$D}^z-knn1Rn22@nLYigPJW^IvhIrklqUSpH@ad@=6bXG$bV|u@F4PtmH_bN%8)z0;hP~&eTF!kFo5}ME zCkxAT5iwBd?q5H$_-T`u-|Ezh`U173RVG<{Yqs~cx7TW()J9~Q;5ETK?%4~Tw8$t^ zVzJueiznYn+8xK*CzA77G0U3fD_Pro#W|`|K|%4Pn>Z1aZd-JCY&(@IwO4zn^c~}- zZo;wK4Rce5C=?d+X_|Ws!KUIJwpRYJB5l`<2&x4d*cT+7{HNDMYdEIeXU}e{bXxSTxqL*5;O3GziBZ}v}Gr!tqpvuqmM96%a{Tb1vV@*c_w5@i>TF?E)b`z z*m4@Hnr9+W&dXQ-Edv@dGk)S;-*T8sO>aDo8T!a+T>vIvlJgJS!Uj@}E25y?uoGvR+>U6l@Y~kC%%RzJIsPr51 zhBJ<=sE$l5OOm$6V-B(2Y4TsEx?|4t3?r}R^ zAx-8u`}{X@_W5tb<-I3}5(`%_TyN4%j@_dLMW0Mx-b4`%Ln`7PoW5}#|6ePFV2Ouc zP_Df?;AgKs#^k)C84l1j8DTL=c%b&7tQ5Z0NVZzlgHvp|e0i%odHMbW`@X%SlIm^C z^tbGdWaDGl_TZVu#5)V=AsDq9izE5R(ph&LV%1*!&;V4r03`7uJ0`|>&n|G)HmAyO zIx1XR1Qgv8_na8~tBV`?PpCIl?>)IXwPMc?LODOv7#mH#O?+@;;o>(L$&MKc@}j^z zD(R`dp9I)=`Xvl*93y!gb7?@cc$`DuxaB+b`NkK5YWT|Brz$+QC`Z++7%PF3*~0Wb z`o9;3xn!owiBgXcq3Dhj-Tw^ z&4!cf(D;$+D~f;*CNUGU19!OE^#8JA-sSLO5Y&4zpU~$M490M+82L<`*&pk~G9Rtk zjFk``eKJ8&@KEn4>*i`~NNS{yg3u^rWhcX7q!Ro8lB--GV%MwsM~Hg`D^>~&bFTO9 zO<{Jwx5(RlO({wbxAl(?T*A9Q+GK6FzZL}6adffCw$g6a%HfY0zwTEs#9lpCA@Oqc z;MS9WeBr&PFDvs}zA7tF5e?2NBm-2ejY#`2000vsNkl?0-E27R zxj6Tz@?PiZHH8nXo}q975BM z_*9+Gr9!yl-p2guLl=DS5dZcRfmYEWYr@TVC^RDoEEQ9^_qK<=*d3p~m+wv7%%fl0 zMdmqc_#%Gsn*TXF4?aO#$5lE*z<>Ff9lS0I7ByphE3 zb$cfk)tZNAv=gNi2)};UR?d82pbzfj)N7@d>TI}3T&}#scs8i^{fm_V=iUB=F#Ut= z(_>%QG!xF=dhP?v#U1GdiJppeRQmZ?w@`zH67!F_QRUXji`a49h@QE6@|!aU=3hk6 zFVGV$uZ(L8rzax|hnB;1d9DLL3VzL!bdFpyqPE|4>Bj#|y0(XToGizwqY_j&c%q8a z(qq1x6{K11YFJCwn548JQ@5neSjH3(j|t=TVOER|93NkN^f--iOf5F}*m#EvuH40Z zw}vyG+&C^-Tt|JnBA?zgr}>avmznlkg9MzQf{0g380Np*JbU;PXMU!_)eo$}`UO6F zaLF!yF$*X?{uVPwb!yQ3>Be=}bT4>=PUkq9Z<<&W2!n|l%_oRXCBdvj_s2S%D zr9-4@F>*>1qgYqw=Ai{DYmYFwFhmwOQk%2h3=_1_6YJ(1>yzPkYmwoX^chw{)D&NB z_u_vZpIpQ0JOv!9W`-Xlw-yz=D7%KIv7^&mo<~opr3nP~AKb;f+WoakV}YXA5JkL6 z@x6G|7x7aE+K5<`P?r*)ff^!}bWb$ST+}1zBPp5%pRsXC3FWu0jKmejpR*fCS5P>C5|Q)C)LSTB-`8EEcYGPGYg9jJn58OYaRq zT4Q)|1EDjIjn>r@9EQ0ANB#X8e`px@0w)gjUImd;SqxQF3=$Ppklu#|HXh2$2RGre z2$6nNQV(;a(#4BnROm{EQiRLe?N5V}7xLbj-5HKy`|MW^aKtLvy6Xqnj0sOJE_TQVKp?GWKe<(a+~;A$=lH zRhBfPVhz)c>W6)F@Ppf{C-|njhWR2O2R3Zp$0a)sFuHdWNAj@0b{NN8oQM;zi{f5d zNe18J$d@Kde*yIB?q3Ky?^zt4VdR3lcvI^}+9?0S7UYX%(i2q*;~4-Z;~u+5juI3O zDV9fB6!HKvPZZj)q@?|6B1W9oo?jN7C-c$Dw7^MVD*~pQ;?|B{c*XbDFuK1-S`Ue& zgg)vBhT8l9C!e#61Kal#%$I;i&1_Mk_2X2!3*Ev*c@x|>Aa1xIzJeypL z$1f-%ipxV?j18DzYd|pUNctu2CLp3SW&HBh5>FD|*=gt8eie76AnL7(?Iai7J$z{7 zRR^|BADh3Gdx~4AP{$zT;@MYjbK=1XcCO#Vy1^QS?_f|0XAps4MUQM?fd_iVpP?gv zr1scH+MV7NQYnv-$b`{_f2;RKj-GvNn6GYGDc^M^tzPqGUVHym+?IRU1q>Gfg$hYw z@PTU9tT5IKu96`7f2nVm)w{mR5ly>+WF~sjGVZ@UmSjU)y?DV;=42$#vo)kZmyrC-A&kf_f`18 zvuF(+V#l^UG>ovgP>0MQMMyme7@s}P(YcQwZVxmMpSSZ@*mrxK75RQf1oCpq0ZbI|HqDY5M3D~_l#FmJp_{2o(@SoSpXOfnM z`Fe{Y5F&4>Coz)))7-RXf=`{cmu<6yKtLr6aY2g9BkrFZL5wE~4UHP4Da^EBXw1E3-q#%=)#FH0?aLHm%jFedgG}E13y1k&ZzsC3I>Z% zBcw*ikRM_&tRos?6b{Ze$!@-q2ktzVO35LVtH262Y z2(KmLxXYS$jW;AK*l|pm>>4^oL6pK-(cu}cSv|>kQTgpgEB|a!Btu?{K1b}G#x^3$ z?2XfN@moX+R5HS)I`T?l>AD`btU1D0uDFALy5L?i>xjIioCPRK?gC2DB0Eo?<%K&9 zXKucM@u}aSTzemzH+BiKI_k?W@S@LizMp5a*5Z5R`}56r?8~nHCPLnMa?sf^#83xX5W+r@8!m*u3#`bo2MpvhU&2Gk0^vs)A6q{*F^;`fpJ`a*9jI zjmP(G=ybmMyr=FuYKxAr)a<16ZZw8V)b(pif?P!ddB^ms($_X`yD(X^HzLn+{6HBw zVID*ND1uZ{gkwx+8OPSFcbnD_LtJAu14w!ouet;&R$M(8l7H+*9Kjt zLk~&Lq4GGdTG+zL`T}*aFYyw*FGn^7TJ+g2OuwYx2<5KcK2Z;@vzHCGtAj(-?uVmy z3Gb}$VZ+6TxTtj*i^Bm!$4gkBEL-X(D5{oT642^ElJqIxusg^=(Z$y~Z%CY8jaQ8H zs~!+$)1vt2L%YuBo~acAKl6l!mz~k~Ja?4pX~wvnXwScYxMJc=cxWDLX|9@@R0tMA>yo6mm{S6%#9yr6yw58l}0`28)!#T)$f^Z6rQCa}MbD5F(5#Gd`Q{(zd24@y*mchDI{9;_IkKc+4FhGY zw(!xp`R0B1w+5Jh67|orK!5XskVQq*xIL=*--!)T?JGo_%Ru$WTQqxhuh)uUdC0z>Z1-8Vn9?hp4(k8sx5gj~Aj z#Ih|e>pDL7f4j7LgIv086PIp#=slhJ=mpk9mph;LX&+zEtGRb|r8iu+_BS0#J~VI! zeYu0f7XZ`3nSp9}`4HZ`X1y?SPg zJw`N;ux)-Lo4bSDJUUI}`^6Q0DW+bU!|H%briYmvnx)|n5iJ~{(2YND!~D5|cu|qLhS#DGf{5Zpg1{4nM!ZJtFykE;&X(Tv{$A<$m$FQ* zd7f~fHc2$sCaguQ2!dZPh5nzj!0cR|?d?{hWTps4d%MkH=CeuCARvk|CalA$p_#_S z8qg|bxN1UN?v-N+uX7rIz*v68d0%!oRaHU>#g?mRmc21(=|2tD0$DkjGuG&`VYtKE zp)NNc`1@tvmSybiSA2a*OsE9vu@TaBWo?JWwSzVNQ0`@A?la|4r5)B-P{ByBXhiSp z`D{<8+&(^BjTe(+^&Xwvl{W;XPB2kvw<{}0U3tBgXnW!FZ3@;16uvl>4S6`=3cS!M z<;2CxEb!qc_crf+_eF;`?D_HI>-f~bBI65&i+|w&pF0t;_Fzt_8vTV7)n9QW{oIWS z2sAvjU|P4e%)HZNid#iOEO=!<`d0yq_%7p(M4Cw&&&IIHtJ zn?d<+O;&zMAvvDDzjdxSm6aawUN5&Imp79k=n3TtXf;4PP}Y^iIGj2>DP9!yipQ&p z$Wpcku^{fg4{?Ey;Q$D=uIaS+y zuXEW&g?9TqjP{?Imtte32sYNuDu@K}nRl4B^(GOFdgCjYpjz>viF*MK*DsM%kHw%? z1R_e5|8?BX|5AO=eMf?Ir{m1hdF(0_*}s3z$Fkop=VwHqEKY8lX&xPFH(z%4jw7$n zx|QE6sokPR!8?k6vCUFiNW^K3veE+C5@B93&f)QlEiw?k2n5a2UGZhiMdNC3Zn21t2rQ5CU4u&TGXtK2Mk=X|u ztTwSYYoFG66Hlv##agFXQenPb(G%sF4{2rk{Lr}noJD+lJapMW98xPA@%>Zy`x<5G zv)ZSUu>HDi)0b+AAvUp8q(V0?vLq<(wSoNY!k~Rw^R5Fsvzf`?k48uL+*jPjiF7Zq zU7?CYa*wZx#Jg)9*v%p<>kM2wd7D?g`{G{2?SWN59{wlPw}&T zh`kC+2cn1wY9u5iFo7?S+YfbvU%vXD%{$L*l|C}l9H-YyMfB;PXZp0xwNV6X9f5UX z6dj4O)_E8`uR7GjLX>T9IM=_@Gq)w@uL26VUp=C|K=Cn2kl@6q#Q#a>(3x~&U z;q*hdTrwN}-u_T7TGOsQZ?4q7B#qb_`Dl&HCGa*8#V^Iw0vN0fF=Ewge!QUA9YnQn zC&}zr=Dff4=DRN_er~Z&j36$=+U5E9XBFtjV6KAkAt$1Fxol#kz9MVf`Jrn2&bU3m zXtUMm<$i5pbahYCW;Lxs!Ffs79oFZ3_3F8E3iFkT#{5@yZ^+D?_Ew56Y%r@9*7)(2 zV+N^VeCY8`u$^9KZqh{2@xX=$iRHMj4QP~2Q57W)bDVYJJ_x}fN5pkGsb#&DL O0000K-j;DP)p!w001BWNklq&Y5BEF=547(^&v|X=nQf7KWEXz)z&kOc^?Jmm z*Wk*RK0*tAtQv$79-MguDFtewgVz8=9uQap8889R1gerXjo5tnXV}{NQ@nodKjKrr zTuYa)9>9Xt8PrBIcj5#Gyr<>$fkS_1qn!wy?jeb4%3oi8Cjlk}J7MG-y_m)w z7#Kg&G)J1Qfzc~N8(k=>3%xo+L?AUFA`l1wAW#qhvH}pp5DnCl%&)FIZ`&=^B)GMF zm=17fho&kCQ_xgD<#$+qcK}v^2mpf$T#{!k`E#_iXP368cfYPsZF*TcW#%Wo20w*| zD!h7intDo+90LGUG*LeV z9fQ=%3?}pXbgJQ&T%>Z6kgL;yimRqHBNfhl+i08{~0t^Xt-g>t7gcN>`-#O)i61Am>X0g(85449S!-7P;cS1x=lS)4EHP38} zjrjw9`Ql}j48PtF_SDoGCb-{;dHER$Fawm3QY}~TTfKQ9$89&IRC9^M3V@h-O7p0y zg4t5QDe^uMC;A|~|CyKgzP{Ypj+Sz&zqyt!6vG%ha^qOdgw#YHM_iIFv}kvywydpH z#$E+A*94rhPHV?&ZX@b6fgm!u*Z7`8t&OJg@FF4q&@>2RsGL6c}A*e7E;en z6nsrBX}`JbHRpX*CT(9*s47$$Oo7c%6kwFJ_8*?)Idjo>MXjUZy;tj1w_LQdefMap zR)}H?QAJ-=L&{dsAPU%Yr8012FW>+0O>;Bny}T)Cy)2>94=qPz$PfTkCa9mX>OiU0>@fKX~u16xyR%blnvWj!0Dj^_VhvPi7KLZexI~ zdIFpi-o9(2%tqU1lO%nArLA~NR8Gwbs!oJ4Wu~AUK-uXY|a!O=IQ+H?D@>iX>uGrT+Q{9+Ss9LpL%NkTF!yjr* z>_6;i=)|@?O`HvfXcE$s!+8ecy_Y+F_EUQK+N-&zQhV&W&6($nH?;m_bI0IfQ%Qt~ z81<=Hyf`jql7G5taPcE8uJtEhwm;`KRHO-&v)3tSNuC)-77O`oMcO2X5cJ6e?p)^+ z91kvmsE}8=Y*X`Fbl#d9AL`r!9*Y@gkxEpMasbc6HSQVB9H^z;OIZ950uwECQu6>A z0$5d~p_a*Roi*_%PX(b%~VU)8#teJsbtPeb+MhXPDhOEx>Pj(JfEw&6NpU zu5$CRNY>0)7#MoDR|i0*m}dY`%K8HNA)#>RJVPMIHZ$#p-Y*2mKVT!?B< z>&=w`qfT;Zi!}IeRsCEq?kKpbB9;SoN&LWQ*1b1O=aFM!2_fNG)`A4UD`U*Yh?^Or z9%HtKnzx8+{O>`^Jv-p=TIZ_*fQXp9#A0lw!BgtZ=gye-=K0wj@`Z=H&u+thO_^4o zSmCGbFAzrTi8zRm%QjuC;{RHKqmG+8xFHi8r<}ZPG*c}YwVYCxCikT5xgWIGOxd4#k>0>woFEmk5Xie67(IA1-wBqHMazs~)iVli`{&sWeF49FM?&`rY# z!d{G)Isk2khr*D8NI?n^1coQAFC~ziyw6F2wyfg6x7F~#&T}wYx)FE&Y&n=Lrp)nb z9O}ZTM%SMA=z}H1H&~9|t16^*rOsYr32i2*cz#m}x4m(!`gH+5_O$iela*-!HZ}kB z+*JW@nP;()eiyDCCH#pYe{|Yas9Fw4fi3Ej&xPei+VPcFA0J$`|_=0)qhO~zufzkYqs-vp-+^4GuHIq-f`-E(*nHo=1ph2 zEt66KEnOpr*Q`S&7VG?LYlPK%E(OffG(a9F ze>=^-=|^yS!C7t!KuU1F%s!nFmz0}SMOTW)qnr(qP$l7rMN%AODyMq4e5Q5;6U>_-{Z zdc4O;B#!_i<0ITKR`RAL^#xV`S^~8yCjAmblK2{1W3Tbl^lv?yNO!ZN(VSD#-@qt7 zeCl1(&%v+Fp6#Z<8IR^t8_NAT3{MPRlL<3(Vjp9YDFT7mQ-qGN_}?SRw%W4Ib2wKE zPPz2>%(`FU!4+H3^2j1gd4*L0Rsxjj6p1jrI?Ui^xMB+maUZfISe`7#rUmPv?pNIhGfuH=O3fFZQGmANFfj|*=PNR zA%XYWK;pE{Oe@wUzJ{Zel|rqJ2)=gvc)2v-?0o85Vq}}E)JG%$Ktbs=%HO;NcZ{Bo z7bQ6e4L|vY5CI~<=s1FW9$UI*;4K?hVOAjzn}i6x!3jnZ5vT^B{#b)6+kDul8C)HWoy3M-LMqs^@RRMw0UxF6alhX0}2Zm+`JjAYkqxSED=nS zV6c$jAJ_gIFHb_e>|57i1WzOha)6?eL1R=MM;!i~l@~(myi7gtfMGM~MKrLxyD7@{ z#g3)uKCK*z`e0??f5Uih6|f4_|9&g$*o|8)!uoR#K1WtkS>%=3Q#tlfyfh!KMe zgIF+Vtp>a{A$JtP`Uo%(Hg`=NIy^=t1&%{cmC(^rz=k`{L%1}L7i9@&3*4!z7-3K) zjpq4+hxwzp^}ZwMZkh)sGihNfoGNy1xe2d3Kiq)SP?06bIf;b`ED#i{!**HM^OlY_ z+B>jtv*y|u=4oCo?V3i>P7Cm@H^1?$H6r#^bfjnFs`IYLXjEFB;p~D$0H<-?Kp`gY zYXH;Td%|IfNA?rrnB^3OF}Cb$!UMZ5!PV)p07X(Qh|~OSO8-@i1aBD!=>sNR?hl8tXeY<7wV-513@4LaT0(@u(U105h;v< z!ktR8Uh4}oK!MOkDEiUa4Mnn1+~o==o}K=CiZU(0|M2FXvv((EXsxP+Lwi7~OGT49 zFd(Q3m@I_c?!0O2pQ%kqJ&r&A)i7}V@fx|Fj{@tNAXf8DPI>QR2(^Y~mAlcnyo$kM z11ju@Q&r$e=yPU^N-_ag9>ko5vw->IC_H#RTDwLe!Z?(a-~$IkzL#KNI52=f)Qf@) zTsWh9c2ARw`-a~C-M6FW6PVvp(B<@V@MF8r+Kos7&kCP%U@}Vt3K3PJV~HjZ*_BPV zk9_0u2{_bgNdk}wWBl#+Ix$hU$6t>e1St*Gms)~L);zMV;rqWHKPg-~%l#Uy?EZ@lhRBq&*Y@Hj{2$PiRguNcVTC?4OI+I=~x{p?X}9 zHvm8hdx){R;z$$r{^&uND6alq5j~9=J-oafvr51qRd9}Nr}2pq9az0hFTCe6jRd(7NZ~f5RW4bz}{)DUa4n38IXFQV%L_5%Ru*MbDd!&)&TZJ0Cq&SnjFa zoznvRP3%2W3{NXcgr4@<*x#03&`I!)M7ohSC{fOc!c5Av}cs4uV-!~zu$u?AJ55-|@1Y7R*# zdn>WsGrwbS>(ZG6JFDf~zN|@=dYX#rGK|4|6+QV0WF*ZmEUuFe#T&7I{fpE;vJIUc zNKpr7%)Ah#fpJ{@qBU6G@H#v&D5zop4dWiq+x!yz#BWC`$RTYTkq!jeFo0J^x>f+R z2^orz%{0Q;0Cm3Y$;q?;fArE%KIsddTofRSTIW@;F3dEP1Nh@6I3}Wu3$Sx$PyAqi zCysc70Cla@HgXsj?(c^wrKzD*)IGit3Gs8`tM#P9W6_t>2$8C2>?%)GN%etFb#D+6 z6J-fJAEfh1@LW;>nFtC~hyvOii+ki-=Wco+R|_7vXa2$MV__97aYh^qwO6uy^Ro`h z^6EBSRcOOlxfPdP@qf`V(uJAL52Jryv;enW*Lp@5If1V|nUF%A!N^Z1K-E;JQRWF%5%RT29-MbTzPfh-MuuCC zZvW%MeYiTzyG7vhj+(DyxD#bY0lBOswV7EDve^Sq!O*4>&~_zfFq#8hnf+_$Z`96O&X5| zO&AZ-FieQ*#Ghc2BEge1E+>(rNe2*NiiN7%-;?9{M9r`2kVrD+@FIwV0xe*=oPy|b z7WbabvqpcBshV##_mA9K$aED3f+BLH@T8DusyFF|8*Z5PWbZvv=`{Z0&)4o&aP;EK&wvvp3MGNs?W?S07Ug@R1RTkIuLcJ)02e6S4kBu z%}MqTl<@~)7;K3>Zpr;%E+q@;(dTG}Z-U?A|J^&x>$ z%r;^+SrW}t;+izDp{hdJ62kxlcySP^XY~{D?$XjB_UOof}=$m^HSJa)|!axVX`$95s&)3&d0b`LhNcn1XvTzH=-XRn|ec% zDc?{XS@^|FRVyxkh<*K#-$;tf)017uKwHv^4TW3q-`E9g;+hzhf11A|eT_<##^+iJ{3dwN_8TtsQ21wwG7n1J^asmAE=Ha#DQ2JXfA z7d?jRBTLYb8Eul;gLB-0Wve7rzEnvrA<)7o$QdWKdS=71Dqcr}2NPEnBEtq|fibyH zr6qZdqssN2wZ^+^HH#t!sZQWNz4G(`tU#JF=r;*|fVTm(0w(=@{nHngpu_zoPPL4w zO7m387gS(KF)C5V@J5T8C9u|06MQ=`ySWvaVuA{as3BCX6e(4~EeiK~kpFkfL5m|f zp}Pbg*`SGQuIedDU(a)A{O9mvx1$=yTobERtutjn-Q@^X81@(&1%_$@H211^=OS`$ z%q`h5#$q1x+ZTL;GI2{a&0VGf;+4wp z1h%uiuYkD+MlkEpC}tfQ#oR{+5YAZ&ABH$;nK6Tfk#fP;kF}= z_^fR#^o{NMiHmzLZwcFPC>MM2?VtY@{c7k((v<3&;#Z#dM^F)~2i82Wkl%Aj( ztNih!tA>I~eA~X^-oG9k&#vLfzKH{SUu08>p#X*~)eB9?3c53bwkAb;R~ii{K#tbK@<5cL%!TVWyZJN!uv{H|7FDXR z&Qrr1lhVYWcw^W9V8^GQuVX*Ct1Xo$S6}65Jz4CGAA8bs!GKs576jf~YqjBy@2}kbh8?Yg z==AL>S|9OeTh5w_uCE`6U8s^BEz@O-U;pwu`fnp-KX3WnR$ zUCZp5+qeu{2Jb{~^e76MmlFF7DN1q{2ZtW#!e%3cAubBLiQ60Jo_~9CVCQpfCihMa zgKLPGoy7HYQ%re6Ku%*Z2vQl%dR2=it7*op=l@5uuFZRha_HN=o(WOB}0`GT6{Kv;2`Nt(IxMIn#*( zPyrdh5F;@jp6Ye6EQf$VKqRanPNg_(X-2+d@h{2^(Y58#-j@)9Uj-bop@8%_vXQ{- zC6Su1Xo}Ns3{-!RX`1Lx=S!k;c2hdf$_V!A5T=?m+t`qTls{#|#@DF|Ql(`64;S2r zOt}FwhFYf#W@zv0l9zQD4uPmju;#yz9y(@0iz=@7nj~H!4z8JF2t<4B|zg zWF>+FeJA5)kAL%jEnTOo2!a$GQUE)+lE;V{#~fvnBW9cvsv zXLz)6%fIefh(B7mf##0|TFNB5LkSK#==`Y*i;5az>dGx!8E)BpN6r`>DW}1c=7)iz zqJl@va?B1LvY|(E7NZqa0b_tn2xKx1h^xaWrw(J@k{9674}1!D&;JG9W8R6o7WZIA z{$jwr5ksv-^d0^;G)MxMZGi&nVgieyB=9P!%0#Wy@UN|n;rFUZ`E#C<=NPhZGFdW_ zm=vN;yfWL>Dtv1#axdh>?iKNb$8)+*L8b-xt#5to#0>#p#vMv`+=iY?h?&{BluD1u zm=v3o=-WiNOf(Tyh2ek!?P?CT-K~=2{ zsV0>R^Ccn-+dlBW%PNb8lM{9N_LNVC0|Hl{~--nxT`Xp9e zcokAzSHn9(;u0_c)xgy`bpXO;#Bm9;X0Jna{0J=VMmjee;}udC0xF8QDaV~F&fRXe z?YsQZc+2}TXnc=l=0s}3#5|cpLn06+v)B-QKMvgUO_b@;qW!h!~ z8ul^=$2#ft6LBE*7mo+hG%=%pXpUNn1l2$e001BWNklWN5Q|NUTi$VBx zAQp8<*#>lE=He&&K8Kyd_u=8*+c2dapM7a#JwNq0ZOL-1ND?WCh*dOz^CM`=eh;0a zuf)!SgK)tl_o0wD2Ddk*la}$+d&h^zAIdj0e-cJ#If;epACe#dEb6@>dyYVF&Neo^ z0C1yP2pD+k1<9Y%9ITEwovsQRYALVu-$v;QugM8jIYqsuOp1h>FS>Zq{_dowt9RtF zJ{^)qy5zY|i@+~|s0QyMpibvINnkmcS8>_3bE4wy=PlbzqM<%vI${A0=25P;Jn7s$ zMcrTuI6y~kJ~s5+g3oMt0|ra`QBF=Z!~uNx-uIzU8$uzTE;~^GL}-oM=%(5I+GBb^aTT+l{aS-4 zrCGN_#tv>#))LqUBo^A%Gz$Yk1v?LRp#ucNsK)^UByCMpE=HTuarDB8$o*^eV{FIYR4f~*)NrCIIYW6;0J{l+HKH0YEJuGCApG-+)-b6;>I?)_ z3>j`p%g~RvxBbax%HHTo_jTq>q;2 zeGCvTD{-7k@o06Zx|K&N2gLG;D>|YWGqS7U$ADT~LB!^ag3=~xWBB`@UXQyEeDjQ+ zS#*dpcmXwLpCkJlH|1;2{(ctzlHKiNGt_%+lEyu8JoXdy_=VegZl%TrSg+(gX~kQN zwj6;}RwBg=Vz1?~CcX2nWz;eEvHq}O(bX{9e@G^?PNtY?B2oyPRFFxxy)iY9H{W^p z_@{bzG@~u;Xr!7`c@i+6F~DSikq35BZYFESL>D#2=^LsPL&Paf=5VTt7_w~Axg&cs zhyS>*Vf!7kM`uyYX~ZDyT@183VD6j_+Ba0yiJ*L&5xhcG?PRb8i+V(i|#yu)?aogUS4CICg(uv9jTOTd(#Lgcj9uA08dQ11;@Kk>L=L zu{b=kQ@=R!I)3Q|pXu*jIQL~*EPsz`l~rC7B{BpMiFkDyQ%M>>ylU>@P0JeYyepJh z<`ciV+E<=L0m5mCj^<{dtp!Ns0ggcMUQ4?-Hxt`WIQ1##W1*u?a8bjSZIBu&@89-{ zks96cfgQr@!&`L>jamTEnge!r0^b?v)Vo_o@n}ciZMG)8%(l*S08pqpUrjYO1h3p( zU4!xTAIgezFQCPXuEOF)S7FieYp`O~tC2~yBGwAX1|TwE0fw?=1S|;sF~<_sV+~Nu zoq4BB$^?Ml~^9 zC4sRi?28WI2gyAsJ0K*$+7^ttKFL0G7hlk}>Oi^4zM7TyTa%jlya4JTJ5iN1H24>a z+8P8|e{}a5%JhNnH~t|eYQwl>=F2d5#qX_El~EPw?MAHB3LSenMJrDg<7H(Lt+I@SbKudqR)f;i4S zcTW2w=PaN3tS$2{ekH1@3}ArZ$SB4Nhw-(+N0B7uqk)D-8GV@oeim&2XUAcEJ*L?O zfEgUYdmcUquf{iF5S`>nPn0|&+%{tikIFfc?A&%~szpDWh_g;&&twc8%?X~;7G7&f z(T71Mm*w2&_D<}(JX*44-^wF7($PjGBdClen2;*uIID1Z(k`=x08zgsiEDovrgA?H zSVE^xCbc4~da;NuPGvgZ>EYk^dy9XLiPkjCahmGhX>tUo4}9PD9RNUYX+F2NoG%;{ z&JVQVUCt*^g_$fk2xdc;0wk{TH=)PvgXb@&MR#{-4~C%tGD(0N&btrgxqCoy0wavk zOqokzEDh!8CK317OommD)u^n*cE+5}!Yi}m6aVOob2V%N)B;gCMm%r?iB_NBG_W2x zDEpCV3(*|q5uyeV;UydAq47v7*4S5^7F+;;1EQu2hMc79B%}ytG^1yWAwO8R0R-(Kr6MNeMWHCzM;PNT9f}U zL3pYrroh9i1A+gJjQ{q^8M_`Go114ZPNpgoJ!ODfQ;XrFU3AC5T4eUE!umyby|v6H zD^gXSicnO7VT-b>e8HqAKAWqiF_1|^EP$j=G3KO#YHJ^cXL#7EgOVb2M%uiEkUVU` zKQ&~oh+RdwzJ^xAhB(Q+vQPUzTf6^%56!&#wKSZJs6Tu^qHGIr(z%w9))WjeCXzg! zv*sZjX2GY^30js_&nWnfnUR!Y?lb+;JrS;tkY1li6-;JY_K+q+b3s75IsL-q>u&Dg z{J{esd+bF>)u#9g#?alsNAU|d0KMqLmi{94`bWuk4{ET&eH4$af1ZitDnA(vMqqY6 zmXyt;D(v3Ym3sD{&8v3E50dX8mqe$H8lD#5f4cH>m|xA{=1q&_K(J#SA$pP57{}r; zAl8Iz6gvy4%DXsIL3b(7oFt+O7^Zg zFj-P~rTY8>C0=B0`VX8be$w;}X_T5kLH%hTYRbDC1`eJX54P-w-SxBS&zY3C8l!Vj zD`s?@3)7RnfKx$(7l%{4Q6~z4L{)6NRRJMJ2w==qFt>6OcI*Q_ zfPV*W`F8-&xwAXyZ?67`9*)P}n@OcE5Rx|4db}AEaUxY1wy%iEe-?%Dd%N;8IcjMa zoF-&>T7YLXAHd2@D|JR##%CApe^a5*(W)BjRKOV%F%z7N{X2b}8LDIoW`CyQt0egL z(j6!khY@sS@X*+WIMP28=s)rLAq(EqIe;?BZA|7-Qd;G_(|S=8FQUqsF!xSsk?*Cp zZ92#cVMcAB0wpCCI!(xnC?TK-mD(U~-t_*{!E;nD9AAKQF8nY`;fz-3nI{C*XDk7# zHMr#q+hOo2CVLZ__vx@&zq46c%PH?N_KKnDmA~ zRVA<~7ODJ~xZu{r=P(fr`O$n0p%Om+tovY1gn7X%n9V2eq*xgLyL~CWg`@br<;@a<1CakDTCbXNHf^!D1dewK~ zeSHn$#GyIeh{5g)HNE*E6bFxdFx}ksQYO2?Yce&UC`qbF+0^s23Fm|Z2e*9xGtIoc zFFUPSJuSdvT*XkPf~0Zc^325SxsDv_)e=;#2^i|DoNoPaasO67drJ?`e89_;CR;jr zjYb;7*5o`K1kmuf>sJ5_47VU%4dC+Sn*z3P_K8_pSJNO6NX3D`e^Vo$<`PxXHY_5k z-ha)CbM70Vp<2z4W4fZBst!actXTaT%xyd$4dV*Orw+AMpMdjCG?p(QAE!2x(F&kX z%>O+3&FU)w;^BysgFCh>e);iru+|-Sh=;Fa@w`js;I-ERqZ0rVQ1d`Jgan5zSNjU( z$hUvN8vAeJlc|Ohh+v32;xu2Um7#y?-8QaA#-`7fm_EaQ+p~2PMMTAp%RE&fTAv>$ z6KKh+|C$xq!i^J1H;oDCiI*GZBL1`Ba6t@Aoa7!2wUqAKx}5&y+$}>H@K@S0`jM(< zs&^K#Q>O&Zr)>J|lNVO)esMO zhm&Gl4|#=b-TNr~k^T3ypmD$DV7ZgnO&mX#rlGKMxNS@1AeSK1-qS;-I8zIb;IEY4Mv;F-FUad&s}aDNeEo zPuglo-5|h*CywALX$unEw`U$2t=#z1)jMCCR5B}_CQ?^+L<&XhDtcTp5{abNtCb&R zee~C}icO!gY9JJ!l&>Ws7!#s*@KMC-ao)L05k)cTbKDap2+}&wR=HGk6PR!xW|RFA zkW5Posfsro7*UFwqZbn5ACa{CcAHB&n|ofPYb8xj(Gt z5IuB0G)PWrXogXYgJA`!1$$8r<0tHooJFB^SfAyYy@bVTjsJ;2|4l$Rh38RL;ke7k zuIdbj)*Jd{E{O&jmCufK{vk5-9J;MEC4QR|%pRiv@QQ5f! zuj=fhMXMgeV6l0iQ7O?nt9MEvV(TRlYeEif_@0uj+>sa=oImdpicGd1b$JrWW;^kv zFa9SEAKE$HqXPh5-?A9Bb+dF^)axP*aGVA~{Rbm7(WI$Y8E@tGzf025=LYG1bW6i2 z*Ht?K{7)edY+Z4xTkECsu0uMEb`#-8gy6+cCm z1Ol9^P8KY)U2s4nw z7Z*OnOUBpA#=`g&n&!8-B*yXSr*&frNdor>DgW4|(_d*QWOl>kQ4*QfwP*4LtXqE{ z@+YZ(4b%tFto(X-NLAr~uHLM z<|1A9+D*E=b@7JE#tq;oMNX5+vIqqA!Mu3x;VxdVcL;Z!`cl&u1c#;-(lOa5%I;@~-0Oe3RjRrYi|9s>b38|_v zmITtx-dp&@or?dc8jqztd9)W#KKBB^k;W0c>%2!zPE)QC$vcR%SBj5;V{@-Em^}2L zChjBos2eu)6xJrY>@;Fnu&`wWRpC>1z6itGlIBZ_#Eu^^Hr%gd=0RfANgx5)YD=$QQF{n8-toKlRhAfw}^~RS%Pq zdW_bYCUQ)rZzBnme4xQeUp5g&+%SqO_AWtFH8ssM8)`D@3{_SbiQeITf}^GT>jV#3 z6JkP2pU=3;fu&ttoP;9+iE$=h>e@c*FkXMomb&pc4f{#TG~Q!%bZBdTD${aEMdnS~ znItM8A!v}yDDPM@?fs_zW<#A}k50&=Cr0G8I20CfI8#C>r(POXy}|tUL9{eXz`0Z3 zN>ES}J{#1t!G@9|tiqh+yeL)0hFy!%Q^@0G&w3DX zHH9L8Lrr7oD&)~pOCi;qp`D{;O-D7hCi(;<=vJ)>jxJ-xTN4_ueq&1@|F(O49=`F_ zPGphCbG3%hoW3ym9rN~M+*xE!G5;QYE(N?*m>^wN??&ZV{Q=d<<%$B$nwma``wSyG z^o0Kfpfnh*La?VWu7LV#s!~p2yt@Yt`QkJn4{I1*Oz~)=B%(i!I9glt<tH4U}GN z^+-<*O_kvP0erdB>e2jvK(+owaE0^kgPk>7E|;6>&|wIWL1Glf5y%q&3re0?W%ky^ zyHE&Yq^Eh=PmuaBheE1T8|tP>oocd%Ps^~KW)6k`a8nD=N!lAFpka<om zHk|s*9!bDyBc}XiBl;c5mk_lLYc$k>#vn!^D52Uk0%X!4RFU`sMmqsKt zR5($JEO`FmSy)kvP&(PiE+!=fk;{c?^X!40wPNG-5of*#su=I%sZ9D~D^OJ-BC-^i zDA(RIku`4@DIwR@Pm5M;(}HK%$$OFYsEjw@B`db#S3NV}PeMMh5(|sOqYW2XpZ&C` zLXH+#t7ktlS>x0l34Q#5G_j1YevDRJut8V7CB_he7Ef&=7_gHr z?&@05%jHKd-O!5eY7=UwsA^uZ4r_Y5(NQ{m38C`={ruWbW5=AmU*bJ0#U+_fM1~qL z`E@acfWa^(G~PQv{3Cs-(Kn3;4ci(WxOvGg`Qvl8ArM9(Q$mnQP&qIg+czykZM3EC zX?}bkl5)*@saU^S53c%_nz%L5%CQeqtE%CE3|o}^#PyXp*u$ABqj6loGOe3fNfD7^ zxRk}}jcbq^Yr)o*eF)ug{M;#pfOH5CX${GAsS>=#lP(8Fon*lXRj03nbeeUrDFAdp zA?xeB&1AZ4HSP$OcAVRnIrPYi@3&xSdFE*vd*%|5Qh&CjgWKkQ3pv6C`T>?tGfCWpJU8P-u ztypWV_-acPE3FSuvAmSx0|W#riVPuy5GEvnyfewXGV?v}cOPf({&BxaCKM(FI5Xe3 z)~q$_+;h*q_ndw9{_WpSqz52H#G#OVA=J@b*}DGT`~J`}{EgE#sjhh$me57Hnn%5* zh7FIMhsw4Lez0f=ZliFt#_4DikR?ln(Brh#%fxekP6*~kw!zc41tLX8yJ&Fbn{Byy zKRN%oxo92rCEU5_l|yfK3m742A*3P~V}&yQZq+lmaCaXjTgNeZ#v+`84lvJ9lR*Rt zMQFz$H0&G#79Oj@glJMEq~XNDkh^pR-takC5m{!t6C_9=IwUL>j-dd{Wt~9>w z3UlbyR%c?Eaks+zhuce&r!EUOnNJ5dl!bk8((0Dxc5 z-G{?|3f@F3TrWh)4G?v8!?&$712Ghk;Rxa05M*V!<+#8SgNR5(gp>koILvdGjq;rN zGmc^AH&`?*@z$hNTa$=|2t*qXV&k*Zm3U4u${o0F;4EasAf7%o1h^4!UGQoA^7P%f zyzfKU5?O3{*JD^aG!N$t&qCTy!Gy0;d_p233cg}^CT)MU@pFe(UHlJ+X0@g8m`CfQZgatL#rA zvU9BsWV&&=>7nP+{()+xe0A+e=tr%t;u(s;LTwRfi#twx9``NTj%DNR$cHYpwh$qt zltS?PE%=v*&PDYE3{~eZ{UJ{8ZzHYR&m$tRaFXbtgkKYme%aZ7Xh?0Jx!h*vH`s5$ zX3d~csUs}X7I7>fMV2FwGK)RQY=}ti*x~G@){>RuLm7;|)G{2=4HPRL3O*29h7%k7 zeEx3y^s?J<(|>&u!@K&i8vlPs5+tETf5} zZmuJW?uE(-5FG2PN`eglAr;72l!giLu@*nNCDtfJac~So2tdTLQH~OLH~T`1}=0iz=XeN z&`SJA5xJnr@s|*S8As(L^_i{hLl6Gbf6g8p9MS^V-Sd(PB9 zX@K_DGW4!oom&^|O+8}xi>;CQYY|3dgX4~3%q&_t%5yS2QJMJUO*7T9H<<4XvZSGv?Kcm&BdRZ^gQ$+KaZxftU500JftAJIR?}30MF}TVxeui(>3T250V! z;kpy>Pi=)v4;Tu-0%hEY^Gf8l;`qFb>)zh(XE(%%lVxw3aYaP5cE~7Kg8JlT?&1aa zys!OPti5YJ95}!$M6UKM0iKvYitUw6a9N>P%gzWN0um&t4H%_DHxAf7WD5`DHzRjr zc%P4MZw#3AmwJxhVb?GJY6i^<|) zJoSzd+tzibCQkbgT z6%hzqVom6&XSvtU!OaF&bV_a@7p6Bv2wA{F$06s1wKC*zmL=j(3_Fz{MYA(lv1S__ zm4r>IiqU|@ts4gM(7R()TY(487z4)gBJ>rh@h+mMJ`~IVWe15A&yw)^`N5t z8`(y=>9t>gBBdOJar8g4GqsU{ZAlTR7;^r zBqHpXo^+kQnBPB&a=F4m9puIg$M+ME`w3`X7z`7;=ssLPseKsF2SZq3J8)}j37dKj z!3i}wvz-_k%i#|{dpoWy?m}N~7{k>ZverOIU{ykbX2B>*j#lF|8c)|HY|o>pTTV^K z?mb$0|H;B#38y5fsi;jek-!RCG1*$=?7r0N@BSfr7m~|9`Qx3apA zUdEojA&kyaNcli}*?|%Bh8bl=1Ra?<0MfKXda)u~lOR*MR^VR9%+qtwqDTWILm81< z%auHKRtl(}AcHk?g})0pZ5_(bq&fCWH+!kJ4_Mf?Bqg1!nz0SxXz$OE$!sqj*nZ=V z+z~0~tE7U=N!_t1fg8BcRzpFMZW=C#>$qguXK~N?5PW|n(mICI^h&2DRRA~y0#(rG zE|Pz3y#u$M{>M~4N`I;t7jG0&>BO+dC#gh4h?FQ&O2IkUl9j7d>wk5Bz0nD^qYv9R zy5i~{eEF(d(Y9q3)HAD5O_$-t8mWL@4;21{Ew&*pUwspTr9~Q>%<_)%*tsc_{#wip zFcKO0=2*!XAmx;9$%=aUzTHdIzEbgom1r}*U+pQN{cUMZFMu`^2cC|_-mQ%bp2jF3 z!U$s@V)W-1R%TuQ$m!cK(It{?WYwFc=$jJmh-@MqM+8_Q@NqLs$_42$drv1b?yDX`|Y`;4AY$XY1SIk^p_#XfnpmJ!PoVGB;%5?PxBzIjpGV3fDVr>$bp;uIo3s@_y;5hK(#*Z=$TwQB;)gzHdo5$D4x+PDcO&vtG zZ8b3~Kv|s7dpeocT>nIfpjZNjr7@W~&v@bOMAX5;7MKc^GCSJSn$%$yx%#o4i~N0K zo$6q@@Ve?qXMBUVZ370M2lkI;cvR<6tL`7OLFF?5Vhu-6A={eJR*q~WUP@n6wJEkF){F(s@+MCY;2-!Bp^}(qk)J8+F0qRXQZR8g7cPd z&X!u*FV!s_zt4+vw^C}Il^B-8gc)L*3)%z@!Wd6gyr{f(fBV%JZtuNxPq9>WLQ4VF zBp&ZU>G3|mKcsY85L#E{rIo@?41Ox7WLI>^1CyT!jGj#A4= z1QCac5lPTwubDC|D<}|YrImxSTYrFT^x3HFY(8WSL=?rICqEv1Kh}4D4V79KrGi$z z=+qbTG}?Qx(QJiEIQCG@l5wqdX;K5QU8^(h(j?)Tj=^DzFBHCyA7@-_fseMGOOf&z6~w9TDAPkuV^PHFtZYiZ z*9z7F9>rE8<^X7B=4qNAC5bA7OmRlLVn(ZR?elLNY5R`NmgQa$?o>?IbnKIkg=@ik z6jJ0X=?wVD?s>V4NqvXX_G2+eWn%YdrjWTW%sT`1uzYZIbR+h-t3^##5vK@s1#sx0 zjRXb&s|1nZbA+6AFkGmCgwU1t-TA9Fz1?!^6B_jAWRSBQfD?TJB@ls#I6AGM5Jz$2 zW7*ifOCeGgB0+F+j?D>n#bbTFWBrp@m)?YyUmUTM7Cj@=gOnU z4-sLlU9CxjIfhow5eN^)h<50Zc9qlq!JHSACmR{RP@<5vLao4Fi&IZe#=2Mxyg#y+^mFL>U+<#6a*@;dsFyf(zoWesVeE@mhKL2$Gca%tNYHqu z<~BBmw*Gv+;q7M6J7{B!LlEahfl0ugpdl7u$-AuQRNZKy609xS+}SblI*2$zKy1UK z2@VlvMH*TeMdZG$Q}t`w8}$drOGTw9mQ0H)ySv|sTW)-*B93y1(9l7NWAFASo>_j&s>NFehuTV* zQ!bEIfKy4^FYlj=egOLp&!@5c9(iZi`=u;TepsygZKIu8VeE^5Ddtch0v$35@f=Yy zCmp#L=X4fG(}XY&$0{ldY&ihxBCxRRYEVJLDH_M=DoVO5wvmbzCt67yF#*&xt_Vc5 z@{}e8A$f2pI&|gImk#Z1U)D>*AaPG>$A1$BZqBBV5;6jedj79cf!>@a{wGg)msv2y zoWNZKQ^r;#ViB@laam!FRd8985+zIts_d*<3mky9ik4{PP+@H6(>JABy(^g_ zM7F^Ra6~1~HBnQzs=**d3Pje%5TKR7t)K*qkc3s~n0gBd;%3o1#3GKHPb!g;=3FF( z_Q+$Iz}*>0M4Q8WdGlc@QzNpw^aIUWHwf0Dm#@_)kMsYow0X%J~> zav;VjO>p$RO#8tzN{hC9>qr>DwF-bY1;l#8?ak5&3$cPkF8L~!!R+`0D^>2HC=5PC z$Xwx?%=$2_6|{0lk!jwjouW=o20o=_G1cMJw;cUy%FZd$$|O9P97B-;NLSg|7bcwg z!){gX<3poQGo^4O6X6|dHeD$nr1@CSos^MR&XYJmJp;sfh;m&@@7uOrO-{V~VD;>^ z)oRB9#fy^kqD1_6;$nzS-WcvcJ;H0Gto z@1$z>yZr}xo*U~p0Ba%=rI3VE-u%(~tzvu^02H%UeU8sBdUVfZExadN8(C>{`46^) z`S%pk!OC)jTEuEH#%)$fa1*31)0lIct}rQ@f+Jgw!LZO!krF)^32&Kjs!!&F^i#Rv z%GQz8p)i`Y6pMd1O2bRK6qHI7GU&Buhy>6U&~b8khN8?Pz}W0r15eZo1B*|2^2T!H zz9+4`cUxDlYf!j6TO$|7g(gE&;#u4j&^qo)M5L0f14Nn#gqXu*+2(lMDDzYq<%c{I z-}~Io1^d>4apA5$_1!ZD0HK)+n@+O5m8vU35F3jo0nuJ}OfK5evw3}6-{uGB4}SID zr&sr%F>n9dTJpgPCSDAdJ|T1yOMyvJ1TjD&woRfM0x1jeFadi6_GKd&oK)p)6w@x> z*mJxex4`}gnK zS19um>tOrdIkdQIgp4{#hO^h%-f~$TnF{JDqBg&PQ>$q_;fBG!@s4dPXCK}M_;*FN zp_Nd;OYO;GMmAHG0Dvw~GZ^CpY1!qQStm-vWFhsIy!Q2bXsm;}^xK z6p7WAnZ=>H3235HJ$%H=x0jVtlR{{av2fek5gt5V6?hFotyTjn_?(Qyw!{F|3zH{%n_x*V1b#!-C zSL9lmRkb3zBRiv%6eJPh@Zdl|KoF&+04o1l>wlLi4Aj57J$=c^zXsP;T+>z6!Q9ou z$k_};#MHsqj6~Yb$ihs;%*fQsY21t-1O%MS3aII-DKE!o;$X*Q^dB20PdmqdXb=#7 zAx}pm6B{#E5@Rz9D|-R5>&{*>5-U>yG7V077I{Z8GfOKeZ)Y=AZv~)NI03; z8BJJNSxLCKm{>VDxwu#vNZ43d*_c`Wom`Bp9DJNyd~Dn#|N9{O=gryFoKFQH@xOij zdlDeCbai#)V`ld7@L=*_XL4}1U}ojz<^2x_8yn+43q}_&dsib*Mtc|X|7HM~xtKUx zIl5Xo*pvK+(a6}r%~gQxU!?zQ3U-eFht}TZe=pO&1!ML!a%5&@V)@UM{@YMq{{P?9 z&hGzMySS>D{oi>1KZ#v{UXEtWDrPPYZq6qEHqM;iJLi z|H$^=!~YS!nf*VtJO7jQQbs^E2#B1iG(ZICx$(Cf+E8~nmD~Ty?^Axcd@_j=yPaE? z1quy@lLAE)t^$6&4+^be9ms{h;Le>zq+$pg#2_6A6b(e-8$#*mA8GTLY^i4YS=!@$ z{W;^uo@7?{QyO9Y`}-XVN@8Iu>;1~ASC#qoT%#AR_C!osY^~l7io>HhL>{6%d*Ce` z^re+rA>87^Lu59X@6<|_w8#C&*7skFf|4hh8(HE|_TBn4IX@*Bd2Yky;!i_35Jlu5 zSVR~j5CR|=0958i2LK{^lb#fexEqlt*!0!9)vq3*9k@KXQh?RO^gNvTlR zI-}y5XHPF+CD`p7_vCdTU&)F6>-k*dt=9;Y=!!|q4%3=MrVv7V{X1X0`b4kyrXsMt znG_k+4$0mdXTD4n4=qt!U6pasq6dB^gNR)KtBs2LcxdZWJ z2yHr_oE!uKC`a-5O^$IzhF2(z!j_@Rrj&(Ap0=7_^~UT*?hcPu1G`Lcq7qy@9W@lL z4imT;3m2zai6YM$DZ?oPLwVqx45X0%(*Mf&BjlMAnV!lGJCOJQ>Jmy^c^{r&I!psEio)NU^H|>m_lX^R8mz?Wa?wzwl=1Fx-e+MqKJ(TGyti4FhmA!(uJ% zF)}D~+1~_FCcHcmIWcwsKg(}m;v890UZAyRdp1)3bal=drr`4XRcjbT0u%SDR=;{w!0|3Y3FwsQSr5i(YB(kB;yRkRPn+4YhwWP1ZF2lUf z*>%7DC08Ec!fOlJ(B~{X4J(-_N=AT;qqu9mF@pC4c9&1V9%aoNi(o2m$ufwAdqS8$ zs2I^G?>2RNX)xIR6%eOC3QKSnZ#&zW)k-QQSiZ06l-q$he`&>=Tnm2q2L+*xgW$8??e>QiB+vvd!MG{tj% zGQZp?c&M}0O#!3WXlS9%A<9JM*Kqn{$>~Xk*%rju@E!vCTT8d7=Q_LjOH(A8`;n03 z;1OJ^ZAQ3+))zTeqb~*K-2Seg8RGMQ%%vv7mG>>4|D-BtWk=fDF2Gin3dgHoQ2Prx)WR1IsR)T z8z>wCbgNXVz*g;Z3h&jzFaK`gT!+c>D7BI!CR1DJGw3vcQF@t>B%-?3cV@bD>T<)j zuTz|%v?1P@V_B=<5rJTL5i$jpqewbD6&1Z%Tv^p6<-;=g_C1iuFA@|;BPAkz%!Z0Z@@b;BxxTHw z@rB6oAdk(%a#r+SSnyP)U6-DXv$LKK(1Q?DEE&k46f#f1Z&8$tj~lr7xvM4#uYb>6 z4~D3F2%t{`{b@riGULbX+#0H@b_1Cxzfg{(mG~(qw$i4bkwGG&3(3mxnP(E)qU2E8 z)}LpIr=E$wJ&pB3ETYweFTkur)+Ys7IIQAF0U{=<;v z@ve2}euJ-hA^(@2b_hO^s&=Ur+$)$EF-({#Lj!gZ@^G^F@4HMwmdr zs0MsBzTQ32fM$86{5-@!%uEx`z-NyY(>MN0iG46xsgfCn5-rx3L1s?lAljN5msNQKadXufX&-}-~Dl#D?bf@Z86ErUYQ8Ykj3 zUOzv{@)2)5@1IFYaJmTfLW3b(O$;S}9cEhrN~;Zyc0~&S)UZUM;SpeHi{ma--iTf2 z_&Vsx_0@9w-2826_w2sdpO-Y3L|}m;)-%9fM2Od|+Z$G+ys4Flc!?PU0Dvi!sVXH^ zEypb0Ua(i4woBcZy-)A8%mo;*uKMUX5!ux$8#0(X#OJaN5KJnj6WIy3b2&}2FD*ZV zA-T_wFot5hCgiYNDUs`ZP#}U~w_!=9=Npgkf=wVz*%C<=O!GxZQ|N-m+rVHL0hm7J zeaymOQ40~L{@>-WtUUO40?_2XU9mJnF%(4U392D^m7?DuH7+uyRdmXwQk5J6Pgn9q zSFH?}<9fY34)D{MZ*3&C$Zx6^JMCYb9Zle-$HqI|p0qq0eLkERFnPQLCD9Xh(PSHK zpwaX-jJRFbMLrwj)ts^~vdZOKm73)Pvu?y+^Cv8g8bQ*@@~7+dFidM(kh}aY^h>W$ zrr6ye{ZF`T24Nss;tSN=PIF8mHrE`UNu_aJTgJNlEmxim*5l^_s(@FdupuGF&>yAt zN|h+uj;-eYgS6OF*4huahO7t?-k+tX!It2o zqy!>kWlC8M%|UE$jZZz^mW-t%1s{{P2>!NrNt|;%jj$3EgmY5#Nh%4bt|>G_P)ZHD zr_$yHP@f!E6-pz>R^|8?T{xx%_-|g=Df7}O5%r$1DRYTiF!FI}=}D~L&?2+LZ95w@ zmImXQH-TP2wWWI;>3~{Eh^}@jigiyKa>d$^pB+5zQ_Of|zm`+Z^S6j2_CNN#TI>~{ zGLY3~4R$!qh616wUoH|28@X);P4S+a21R%B82pgbr`KUJniq{2=qaDWqiLFfPN^j_ zfPv;YJeU|-z&FE&tiB?b)6AZyaeP$Y7gVffgmB<8u>5n!&IQf#lG74_E}c zx7Qc?qd*sW)0@=Osp}0rx{t1{E`)QzI+QCqP*3zL4K#rH7P0qOSX~7^73M)*c(g{~ zF3ot`QMswe6@w(f$uK92b{u$f8KU-}pWzVBiW(s>e!ChmX)po+85{?rA;(?QTm={U+$)-!$ub3gl8nll(4Fb5j^O_tFhHsJKu-Xl zDfLx0;Zl4bdd(kkyu zL0*R3Y5E&H)6hnRI7_2paG1i?c^`qzSy1i$W_6y5Cfp zk+OikYaLk0fZ;!kGP#DkLGOF}qTrYQPOewJ zghT=X?pN}&bMfZylj`19$;VjMS1SZi$r{IvbiENlA}D!A~Y9A5n9G##Uu*-tuc7jGQZ%`@n>5HUCB5(w&{G8vo)dWVn%TUC+J-WOJ3z3@gr5NGa+Cl@69DB zErw|nQPZmR!``8!K^xsQsRz>X(p2*yS!Xqn+~2*Ukh0*WkyT?Cz;v8sl99(mzRzh% z3gDhIPTL8b&0XWaofGCk#X}~_-fXOwyZwkW0)W+nTCD<8Pp68iW4U_^h4N0E0L?n?99tJradPnlIs;?JrI5=R-F z={@;;G}#%-`5-6wNYG$+rkRK1WV+SsN4^4KoqNi`m{pkV~cUJdjg-y{Y?)& z`QxO*dK0!~tXG-F5wAq#qGxAgWae>V#sf+t7+aiQztgwS`|~^|9gsC$@7_RQglIbR%U>iORw2iVs*#?_ zV3uJrhS{n|xP^0ALbds`O8eZ*8sbkl_>}KIz!k70r*X8x2}-qdC$fWqR5q)MJZi(4 zNF`iAXiwDuqz!ie%(EPLEm1y8+cq)HQ%y!sR!s(<+q#?2Ym91tc;n(=a>UomU*tZt zJg5vT0bnsjAWfEDw}ul67$v$tb#uHkL~OA=k?&KwvH&Qn^Q8;?ut`iql<<+8DM9Y| zw#rE+zA_PyC;ra!-VXx zFW4H<8zU+>K@w9Wm>yXFXJeJksBlPf9l3#wzAtJ1#}-LRrn)F>4Xkb5TNcE%HMGGn zqNxnVaLnB&Lo`NWAlqIv-SJ<=!J2oCAT}R7OBvmjdaaC6@<9>3`aJ#x3N_y8Rp z5+8A9(}KWVB_5RzXnoOwkN_edMI1;%WWT87_{2Q2T4t~FCc(hC6X@U9xp$&$mw3=l z*s46m*&T_ELp0ub;$-RJcUUBUtb;nFvC8Rs%mr~_pxd(SD8cc*Oc`jcASIBnw1k&cAJ@$cowB0W7k;GGI^Pv ziR5*DiUvZ@K$J_C5{x~Gz79hh(UD(ccWmI+l}rEZ5oN)`)CaPu)>gi8pANBzhW=1C zcRYct)UTo2LsKD3L9!HGA9d@Qyj{*w#e?FW&gQ6_W*qex#b{hgW{RFGWl47|piYF& z(s`I3F8Rp%!aLQzRqtQ150^MpNahfpEIv}g8|!a(&_ke4`qkGMLZFKiXd2g_#g&bW zT+e7|?Nqmfp?L~5J(Ecj-pHUDs7boRTD-R8qJ$u7ZN{CShn_5_KTl zynqVs&1QKX5yt~TS+Jpw$$7M=ZTw;lw^2@e%GR9-7?%*!jtVYFL=;3`{c`_$vpC3o z`irjmWRJV7H}=9Mi7#=UgVTNg((T*Qsl~vs)Nk32rSRiGsKBTgmTI{R&*I zA9{-=l;!*#OBpVF-zMW%^188f`Kbqq!Miffg_IRz^V7gak*Zy6H`yUNjFlwO47iiL z9?sKb2P1lJzlPi2eeUZ_IP$@a+ud(558~`9yI|XOFhXtyyV9fO%mSHnjs4u%R$?Nk z+r8)k8GtOrAK~k)*m#)YUsCy620>EJ;&$n8G}_OoTSM6Ay6-zmm;qe@%Fjr!?5T`C z{e@0RgY=Lbp(?cSMU+su>VRfkA3G%jFN0SaV^5ktEqJ_5n7#w1x-hQfphUOGUDBn& zrt^_ad(1}2ud0#PR)!sQsDN0x7oA$;{upgMXS`s?2fLp#!r@}eYW~fjMRbr-oO|+y z43$d#F{TVftja|azsvY>;BUwQh(|u`ZTDs9(>ytMH2-dNK`pw&e7sXa2-HqI;A_VbNfsS4AJ%i8Huy*IVU!L#R=N zsNamFdqb=VB$9zRBX8pzwwaeK@!p}wHssTX>1=HhQ|)C?{~Jiv2)PF9^m3_(Jz%kZ zVt7je>7^rDRCgejY*dcYVO~SgIbZ0#Rxi2WI;NPLSG%LquwNZzQ0HWS6oubdRs-mD zTQF!-ch41ucofX@qDb1)=<*^17EY{W*lVP;I8ogn;4P|^PQIe2R6>==Aaq|rzz#Ic z0R_(c3M&a5QS@@h^^Nq;*kT#hJ=q<@V8M>XyYgvAbRXzySRQ~4~ix2}m1yiW03%qW9_Jc3zuW6w{ewl%8oFMS+ zCs&DCXIiTrj9FuSbi&Cl6s>$6+uitjuI zk7r8<{e+Oi!ybgU7^Y}JwmAY6Um=;eV^O>r6N~>#B!B`=z8BFTFJ%p55`ptm0y<(HziGhpB$+MVqjxe~0csn-VWkGOd&nip$4hEIgFCw9&xIgdD$ zTYMZCK%Hg7$zyhY_0YmyYUpO(pyaDhx+ID|)a(Jqd^M`$^13h|1FNAk5puN>z{&CM zzJ(GZo`a>fB9tzptKLHQQpPYIz_>JYEIxW_7AW9Er)h|X5ZAb^w zS(;TA4%Ie$-t;H%XmEK~j0z|Yf8tQ2_HFDYE4@5o)fX7R?%BU!)L0 zxnfpkXOHH}H?QU(erB(1o^&oU@T=T*PLN8WFt%9#D%lB#HrL&o9L8&C9V07EDy0M#5l}jI_1tbKb2e2Em-(=iI=M! z)00!2+Q}wjox{@26VHJ=>&4<397qdBSGrbDKRU?DeIS~_077HyoW(nKSL)$lqCKZx~pd5U?z{5m6izP(tmb>t8qohvI8@hfp@0Lf!% zKs-%e;$#-w7(?fmNEp-(y1f43TEK5-(SSk{urOI0q-m~*j;6pjD)=O& zNYQjm{5Sx+oH4UOJ!v-ES&kXE55LnEGKJJ#Lw-tcB<*>0XRE$P8jjy-Js-Qs09*%F zYN7udoomP;Iqi03f|)6vYGlc)>8N3NwJxWd>B2)?UW$&j!bIGaK>X_!AwX?1+IFoJ zkC0j&^HDY&A)S0NE5>^Ja6)Ki^EUB!bI9D-d04jO{c0Lk7u~W(|L;gE*M5_AHs0U& z3m&z9dw+lUy?hGXZ=&6ltdx<|+wi%*q`^qFDJF6rpcle9-*Z$d`W2oWFCEfekK1YP zGC0`i2J^e2qJ1jf)RdP#f}E#qrK{<#8`m|iH+r;`nfH(MOBSqpqQX7>fH8B<*Nq|; z12Rw*&y@#D*hgaVBHkkxZ^ZkMtTkT#tR(!do@>4@eoKDDP@`lI$B?G+?edv!3j0L= zm&VdJ(IfSY*im}gYc5@%oO<WV;X%zYC8i9_#gMtIIfX6cB!1$z&hHR~w z?Zl#k2RTFvJic!g1w8DO#_kjJx!lEaQj0MZR#F%Wo4<*4FhK-HDi>_>k)4;WJ?ks*5UH+9uw0$I80m?Ly zzEuthipoQf)sikwGH0@HGvZtet)54j&<)WXba4S%_4HLj*%=>@q3$H@VWvv ztl7+f=#)R!3S8`%y>(Sbn5M{oh)b*buJHREgr_=*qmrA^TW3Ydw3}X%qXqnC!{2y7 zG3HBdOp419L~kIGDE+*(qVD&ID6n-G8;xz;AFkDdk5_z!*DdkIBD(k+lr|IvvTw!$ z)Cujmx)wppV2Cv%J45oz@BvEYlkUq=U#BMRR?44ww2Qn-NCYRBFd})mr64DIL>&Hc z=1=H=DLK=hh1rz@cf&@@4dm%S0)I@-)AhJ<;ONTGg(*pW7Ktw!EY|$N`dfJ@W0)g) z_)=R=66^cv%^!Dmvm$^-Mej6yiYgk|GLSJs^&x6F1*B{M3cjGEgY zCkrny8KIpuPTr68($@&xwQ5&#U7k+t*q8bWK!ROwa(b3xaBgvt2=l;xQO;Fh6 zENJ7It|6&NFHIy>PKUCxtoXX4Hqu^yJQHIpV9Jw>C56JRZbgWA^BsEF=YuA}`_?2_Gm|x$F5TZw= zR0aL^5fSdYFq`3d;n?2S_^a8}IhmCYk8*RONg&3eL5MPt=U|AUTwrHwdUNT1%(k09 zU`};4ECb07-i0p~)f2`u45koIauq3TYCy%CB*L;%MOx=i*|*q-QqFaOr5+;b@V#LwIsp8g>AXDj%bUh}cUwRsi zB(F!GdvFDHHQ){GH)X;J#3)?9Akh7}?YB72G9?w*v~_qVe!i8sR1f`ye$a|jTGuOA z!9$8RnP7%Jz6v61b&{7Q%jMtjXVt+9{3Gyu_}tf;_r`|NMN0D`c@CBMZnD?ClDN6? zCLX^KV%Q(nlFXz&7mr@=NKd@oiJE8u`z%4O3#t6eJ`8kPWZXI!O82*D)gxEZoST&j z6W#^muBXcm%y+R;N0Ur-rRw-RBvM=Hn!~Ns?K^NvpdW6Ua;sOqXQFbIObj zty+31hkA=3)SA&jmDhH&n@geNu)8gQZe7xA3L3iVT0{bfuOKRNHsEG8vE)zUY1%OAIN=y)Sh)3*$54*_^%kn*D{I`j06$uB( zYkNC7B)Nkh7U1_HHXn*Ngb~(f1J#l)Cy!Z>!6~VJ>%62-Du97u%I;@uS2$vrt(1)!TiGx13`rQ zG#KCp?0Ms9UdX9EqiZ`7^ki*CV|!%pm)MTAX5-uhGQzE zR5Cxfmhv0lij-K`O&4(DC>K%mi#k*}UCOtbUj@jCv|gKkXV=VKV-_W#EgV(<1h=(; zco`Hf^5jnr!^VHRQWe;tmyIO%113tLvaQNdHa}lEVvEgqQ|GY<;GSjsBaNLrte^B} zhY^EpRzn)_D0k<}354p7kXnJr=P=MzHdiY!PPJ4i3AgH)7m}e9r!e~)_6`P-n>;bJZku8 zRc#Iad8*jsbPf+~`?i#UWt&$Kn;+D!O1UBQKEHM$l`%O?RvFvt6G` zvvXbLwhAc#xF}&N5iK|Z`8|RZg@qbJym$C8Kx=;nUHeIKA0U$zojF4|smYGR(Q){U zM3rv8XhHp*bU6KBKeS=&GGHqJak(d^bAvCTZ4z`LDAV5Ok*5%1rVfzSsNjQ)Uf`9Df+aM?prETv2S1(eK`~qG`Pbh!FsWQ?)wfWIJY)%?`K@vjavD zBRA+r$(rM8TjcB+y13IO1EMfD!*bKa66dOa`Q1Q2N&aSGMy#o{EPA?Qs=IJ4XGM#I z={|KnsXYr^`qI{{?m0OH!1C@&F&}()-_TkzoaV)cISs}vU`9K?_<|~BZ~!=X%{T}? zL7S(#rX|8t-Dd|F_ZmUP`~f zuEDc9OE+t8>cHFq$Zl9K;LCvdp?~Cy?5{C1+6q5S6Ysu<(RMU9EtF7%S`4SDu2LqB zYO{Pqc%C(z;@c=vYtSy?7UXSTw9R17McKW;#!3l9Z0iJHBe<8AR%7|3 z+(%3BnQ!g}62~vJQ}@Z!&?O+kAEjW%bN)K+<|0(-{EVu$a{rPIq^YzXveg`e$}OId zi4LekVwL$>DR@3Twco7~GPigo4pKPgL~y~~&a?)coy9h!EL$&X8B9v8Le9W}!%jgC zh1#&R@YnnY&B^i#O0(`EBc21Zr6gz|XCVOkbuRF#NMQg-wbHR%&Sz1S?{RC@ zmtbousQ8*^YCX%h@#}aFn@Q8;$4q&HhzY)%7;XZQeq*K}M)YVA+bv(WPEnjNuPt4p zUsJch4@RTdJZR#243$rL)i*Anm?1Ph_*cofqcfC><8JhXvb z`|J|3aRM_kg3xqKN(}3~+UvOZk%#*~ck8S(cY^TD6(H8D`a?+^`+@&T5;>-pp`YwO z4iv3V(|T|;BrD*>%4dRsU#>rPSBR48*k)CcQdQM-^_dG;A$kg{>Q&Qiu5Zy`a}eE}K?N4#c) z>xDWc_67z2{vdrTV?O$1Lz)KTraZOwx1NR#;J(RRA7`%#;ejvj_$G~sqQ)8zTE(_0 zf5ZWijiNVFAUeg5e97gH`eovsNtlt5krv55+E51AIAmVMwsaQQho9sd$5&4r2pWRE z3TLo(oy~^8X-nm8Eb=gVb6!OiLMH24VP};+@WS{1aUbb^YFuI0g zCQS@P6$@J%CB*;k?y@>ieLXs%Q;g+3rXFha|xi$>}`^?4nehd-W$7)%&`jz|N@Hv%Hg z7gSiM!~{RMz_#_b_Z%X|xbatKj{7|xyc=b{0+tP3aF+TAol(H^&!CNY@W$j*NC6FdqOd9*qQ&x_ z#RKshcEp{9D>u@}{b<2G0RbA$SsSU38}w8~r&81Bug`55HJT-)n1c*C#S8J(A_I{> zA9%IJF(KsL&^fe+5%!Vr>KURnBI$eychkFwI+Vl66S3^hJaG~IU-CDjdK#pO?gz6^ z`&@cZjW1Ja&muOqq{L(9|LH`-bwYm^0v~nC(@WHWTr*uRO5G>~qT2 zX|-rGXGWAj>~#mCH>a-aqj$!Ws7-SR zENcxfXq+K!u+X2aZ2&7KQpqYrfw!w=_(>o2>Il7QFQc}Irx$z^P+yZ6(AiijQnOBG zN%JwsnHJoeo)JMdzkNO&h82W-W@ejkS7%esqKOXhGosTG`0btpLE>;)${))dVW znKP7l&1zJC_r>@EpWPM>4&GnpeEm8bbX@q|1*9B2ZGIHS>gz@-VH^rIX)6Itb+P!+ zrP?0ECB}5Y8Nb0pAP7U5e+@JTzGUQ!`~XVXvECmcrPBV`KZ= zC6mscgaeOCh+k3R^*E@K^J=P(ItdQg5GgqkTb`;^I}{Atf+<*WL`+w+j1#|EV4e4R zC`3?>DsKuIPd~RgF1`53TSIGU4`)!Yy2%iH)7M&5K@ly#NOWZ({8*Z*4JhEBkd)Ar z{(MBrZ^MD5meA*h1M&$+euG%bS0|KBk`|iyTIE95DBdjN=8#4y_WC_!u(>~L9lQYL?k~d5Zi>{ zC6-GsWL_mu6m8o=zfx{4PlTD1O3gSRz%w-` zRiYBkJFD{QaBK%jp09x?rR5~t zz7>QXSI6T4GkobjRv=|tY7f);s9z-IF4Ltc7 zJ@=>Dd1`!~H>06ZUHNEVcRGa?Qxk<~2H71GiroiI$)E|@r~9)4_2nZNJGG5v5CbBQ zl*66MLYctqgN9PIie`}1E0@0Dk)HS z`cebfEsIhDZaR-bx=aghPqoI$S%iXnW1c9Y2+Id*uU3=7m|o3enxeddWWYY^Xo5D3 zLvas_0{7!XkHi?AR6n8v0V7MpnkKHL&!ZX<5lkMXw1ANpV{t6&Ia!OxWEDZG^B9%i zG^`lY>#&?%a(~34c#vN(sp-!tdQ(ioNlD&DL8FDaDmvl=DiimuCDpNm)n&NsiG6io zF*%^*kn~48k(y})*JGBuIkEQ?A&YxpDMd>4_FQn<-3l(rEManPjFXZ9FWm>$_vcYPj`cMJZ56b5e;c7JJ~x2hEr63^nO0 z3kYIk3kczO;MPj>bT^AlIhMApw6R;IaX>t@mE=1!#`U7ue%v#;`bhZ%`o>{@@jf@+ zE&RL|<$K4G`x;7qw1%kGGtQ$T7_7da+TWd-OC@3KVYv8)mQ*193Mx=;j>yzj7)wS4 zgH^eT+CJQLKt%3Np7KGDIs!xe1&S|0vc~s#tfJ0_EZU>O`T27mqvRLSx3l>>k)`E%h{cm) zu-rOS5E`XJO%Fy0-fD1hRS2;Gq*c00f#~II<0+hRmmm>$j?I!vo5~lj$^|mNGFXwl zCXN_l!h$c2C8gscjEx<<(1BM zC=z%mWr691nA6tcZ*5O8jm7rtv_pG-Ax-pP$q-m}17v@U#N^p?`!L>IP)hHYJB}?b zf4(wPvCTfN+VqZv{3m%~f-u&A>c)7v1Pa{B#BrJ7$kpdVlZi53W|6LnJh{9^EsS)A zp8e$sS||l3*pu0Hh}p-c{LJDA(U7|#T(8mJ)kGQpk?ubU9d`3DA`sm`?n2N zk3g#>VMe2Ev!>@)4k|Bk+FN4c1PotFIqCvMdR&zT#urjwfJR>sh zPRmIduI$3Y7wB8Bh$CWN&XO(+FAnvDihi8jveX5b(on!ITYb)J5+tBg&MS-=5?a{2 zPyIa_W6x40oy)}Cd=;A7CdheL7Jjc-2j%hEFr0kT+B0KMm0O)0Qc*(Ivye248QKZ! z#f&z$e8Wp7@`jRxUud`xZt*A$3K2v ze_xq-HGwiuqb6*`b3}C03aF-l;%@!^v-OIve(ioP6h+|6b)^{tU@O1$h48@lqikbT zSGVVTuW7S^fbE!i)$9Y@=r71ACS1Js-!nYlYiGQi*p?9Z26lJ6G)a}rR`B!g)(T019tPT7 zcr%;ZphcX6EFIP8IhP&fbT2S4u%WiH>n+k$20DqRi^#6s!oZ?cx~I9>I234YKfa4oeNaYZ3$P z0SEkK|302^PLW8S))3~LPb1_m!Bl5jpHpEg6%vx<`=qH}4@p@kRnVW`L*Gg=N>;q8g@O4);nCLl z9SDlea7H$Cksbl|%j1Udn4;cwhv$~@LMNZ_TaAX?zU2p(bxekJS1FSFFS+hKzk6Yy zmmro`kuQhIq@0wRaVm$e{JvtkV`jhOcS>Vn6>Ig7-ok&+InC&kSmx97=@8|rBzZs! z;KSWqbY6wa?l1QJB?ZEPjleBQA1b1vkzFxL9zh)fVn+NiNfL4HhX7=^bcL}x3LfI7S$%4LC^$>6i5Fg%O-fcF=>gfWy@UUG%yj*IPOj@C50_{ltH**t$=TT1H^H!4*pITm;k&xN?7r^- zf(W0HFuw>yO=7Ias57q^BJ9T!ZLLdagY_|!EyK^MXb{5cZ#T7lRsfb8qH!A`Ea^7rSA=4?l_kj$8RxVqSx zsr-5Q@_)%z`@wfZkecB4Ju%1I#M^jJuf|^8n12cKhpVue-`AlPb|B1s0teeyCJsqQ z={`!UIcUuHnN~hilEAM#&Y(A~3Z@WP>ST2?oQ4EoQMmcNE$RFI=t}O(-mn0d96gKj z^_n3eSzQ-V&fDfML1eBsOU_{)%jHGaG13qazNL$zn|65jfyiVic>`GHzn(Zy?@&hP zO}s273!NnO{#Bks`Vf^np0G>;L@aq43imZ2_`LGgMUxX?%qlj&9c~iEbe9O0!f4FI#GMRW62hPzr4&&P~A*$wJF40VN$b6Ghk; z?4{fO?w9b6A9mD1RP+J{Y_>f%RDI~GP)0UJKlx*ERU)tS&!%WHpv;IObQ@4Rw4jHQ zkOxD+dn3NOkvQ5-% zU0^nk>hvE$fsg`H*;s--e*DqAlwb!{uPOBlzhf@zHt?+^TXKYEo(Gi3!{qD;PPP4q z!1LTbEI5{-XLDIV-mMAR9#?lGEIhVBEtaa3s~xj78zNQ~3+AEPY#gD6pxwnrIQM9I zZ^PF1vY_MCeo}EeHr0%2FdpGJ023xnb|@dozTE!MBf@NqzO_+ls_`$% z)neMqb8Xf+!VP?G#zSizlKF{Z(gsZ8&q-9W=dUaOKLJk;u<_ykWkb;ZAc7Y^_A16e z%b7gV??PaP$Pid%874xRWEgPK-U0R za4FDsUt~;e`~|d4CpveCGh7d)cnLOlZil7Ky>L;-PU!0Bfx#vUCfeQFyoPXG{i`R4 zNv5i^TP0j2GesLLMAyW#3m+GtpC`L5>dI-harq0t!MmLEFPRITrZvQ8Z;$MaR!N>l_grk4A0 zOwgTo?Vd^Z=28&?rL`t<%sh)*(?C(P-Oq)B{a#UZ;1fC(r9t*X2g#~@WqP6M3y&<= z4A}-DVs4E7t)pYc1_aBaiy~wyr+i5Q9kfG)>IlMz*nY96OvRQ|9&VYx>V0*7axJRW zZ^@im5FN`0=Mji?FEOcsy7`|&@YiGY@q)+xi{*=I{IFi0TIjR*jd zF(i5nXM;(6=6L~i0+;Kt;Uz@qze2ys5Y>vWvBDWc(;??5E1%ug@x4~V0YeKXbaVWq z(q&laT`uNN_hFG$yox%hlXTUbiypj;Y$?%%!l+foCz_@Gm$qYeOI@t-UwSe<3{@LmmbIy5LG7X%C@M>6yU76Yh$@|?L|tu?#YDEeve9Qc{Goe z`<0H<36QB;paUvOQNalE$M38C=y_Y)F6v6L_E$3bZ62I$eg`m&PD^cc38I_#% zBa2{^H>hB&bR7P(H_U?T2qWu;)^7l1(o~RX8rhUD@=0_|2}wf&X46hYZDq9R9xNm? zpoG9(_CBel7{X;CO32kS;vqCldkj`)J$UP4HKq}^0Ab5p8q>}@!@!&^sUJjHR#7=o z1r8z*k6@4-%Z8{aub1y9Ecmw|udVHsfCQ~nXc*#`o8Am3HGUTgr3PYpHT-RJHYUhm z+c{1#v1v3FYCD3gA2`WdQE zAtxjyY8m7ZwW8Hoq>zSxSGe*vCJ)0DV=cC%B1zOhO^fW|yO&r2JY>cxG&jAR3DiUM zq(s3++f}~rS)mOI`5L;em0q37?D0yPOGLdyIwAUHhFZFaYRaEN$G_9twt9`Q$=-yj zmi4tuV52CAQ|%_W#Qr(_Vb2g~DDnTE{2Bbx)?pnukl8*9OoKxKLbEZjTZra%;+0R1 znaUYVz;XbC$nmIhZXQ%Kd}IP%5S6L1Vr*ugF4VzdSo+Gmfz0(RmKT4(KmHCa)D?Am zMcwq{fp;O2BMuey9v|7=9=BEVdSbEnhdjs=uHT_1?YsPhwyNys_YV#}4_*2aK}UTUc6jc_ofhnZHiBJ~2)xA5H6CEZ=?v-0|cYwYHRv7d!e*It;A5+v2OA;6WEfy)5^N^4OM zrXv-OPqFx^C|%2Odo&Rps_Bmhf}^Pb^88^cy{rF&ZQ{Iys*={*xk4S zete_y3KCVN9zn5k%Ni)5axGW#yA;j*kxs2?LFiQ>Z*`g$Dh7deE0B5M=!|uqLAE*> z7&%!^b4~ChQ0a?ESdb)9Tb{wtDPcCP5tWH5(d1{@XjADClf;pu+$!HO0VIg(zm@Q@ zMm2nct9UsCP`5m>dhU-G&)Bf3CzFHLe3D52QY%>O8~Y|lMPqyWrjVgTmsrv8W|0?9 zUm%!%ovLU}l1S3A57FL5EtbAaDDzfyC0eaOKR>R-r2CV_{p}BFkVjJHQMSu+lsPU` zM~O+IEl;VM){qibL&yRu&-jRDo%5(6-H24c?5A78cjrcHKk>o4;Z zmLheKv!&OBxV%#JadIgw14CqkP((1$n;hEy+_%jd<1$VHsUdhJkxa)sDJlcxT^?<( ztSMyC`fJc(sF8+>0$(k2HdnQtEZeZTLU-~0yet36}EvFINaLB1cXI0293SjY)8U;%k`Xz`0iwRF|i zZG`Jp;-e|{BG^J+n4`jE)p{zvd4J(=-KU>8YV+MD^>R84f)GlCq2qf`d@DPcG$e(Z z#7v1JF}=a#iJvrh_-9Cpc;fz7-#s9a1F4+Fi$xcC)sW~dJM90`aqSDOK_iZ0yfL1C#zOW%5XDLZ=r#3sZhV z>$9s@t8N!;pP-PguHJW)kgkYcLBbD#7BzntpyB`AN_*7TJORn3D^NKHL z3iX0c1u`paaL(l^QtbXd=HOd!9Rn`~t5Ro)^7ib^`q{voAk-vJ&Hr9 z8urjzWCDN2&f()|iKcM)Uot(MO3o3kALGPNSXza(bz;@d6rFe8be!bJuZ%U`>oRo) z`QSVhK}Nyc?FJdi!1g|P!OzgO=%62c!B~-D5Jhb1i?SInJ0V;)LX~CgM6S(jryrC@ zwgG?uZsg)22(yFYfAz2_oDXPVT5Hos2EJ}J-RqI&ZnhVVof~pvXX9o!Yj^MvE#j^mq32kxtQVY#-aQg}(9$`uz*5+zWbMC~t=G|zi@o+cv#P!BcqPbu9 za49p&`M@kV8p)nl_24yM#Sid1Onvw#gvt}+x!bLHZtkT!muyczYZBv3PghQNusa`V zf^P-e6>-*BzAZEmvVW!};V^|u77qHr2aeSc$` zTwBbErGMDl$PTO0EEv%~Q-o{V)XVJrYINZ zn}$CagFqFB5FNrooIqZF21}{~J-5N;5*Ym#gx)_O9_B4#uVEi=v<+JO;86x`rrOA= z?SPvoBQ&WJ7qANpm~}_07sxGC($G7!5^7aGx_@f<+xh(RiESe>>!dT^%|CuU(lWDP z&nz@F1C;p$ChLGOUp6d2js-U0qlZ3j=gf5GH*afeqY$@g24MU8=F50) zbQg2wsG}A-)FW0$WU&Qah-5pCUUf`#TX(yK%E(%FVrLCf{%;^qD-hn|J;K5jqiH7X zNLW!!aMlh2=jd8dzd6zgccAxep-IjKlyY5*$FVp_W;nsUOQx4do!ghvWuDwA5Y{r|g8ApHHc3I{{gI2!p%m@tsEv zx704KHJqKQ5gWD%Ar?$rhf~+|pP7z zGq&%wZ$8PEWu3=9-&topzO~LF><|zC&l>u!C`phLHP!xwb>$72PzT<_N(90wB!=wS+KLGuTW6mrt-DC z(7#aN%1P#W;)qrNh6#zG+0~A}@AVTkeQIUxLj3$5D8}j6<+Q>wUQn0m&(UBd;Yi&a+fs( z;&0pd05LH{8v?wS+c&!Yq0PShb(+huS`vfPrL0pGuuMoSp_j?^YaRb!rym|v!F4<# z{`+8w*7*1XxTX+%e6wGsnmS%DfGh9jho+x3CH!6rWJH7B58{P2rUK)PR8OA~R?|mnl zh+vq|&*VqXZTd%7H;NAh(L>e{M)`y*qC2T4gshOGYu)hY8)^9W5bzGeF_`Wr-}_3m zWrnKWl;-l_+4bV@vs`YdIfmu&I8jBkUT31O@1@}_=ez#je9%t;xW?JBoOWA`m*~=D z3=@cO#YW%%(fX$Uk2IINY~_bBe#)r5&hA};+`+Nb$O0;3X zFu6`I+`HEC$2a=n*Mn+3ar;B?b|6Fx4?$;E&lev!-;?8+m-kvjAfmA?YUD&KsujHV3mSR0;=lLFu__vKMi-Rcl}p3y5S?Lx;V(aN3`IP5pANS z&WY&npYMj_=Q`oNOf{HHg0Z#f{?8 z^-ceqmT9J577mkQ!Iy$+G?tnr7(-W`>*OEZ==v{<;!amx%N{Of*F+P=vN;6YvbO2J zxY{ZHAq0J`F{LiC`!yXHD%ZxP3oL?u&t^Y-VRfVUT<-NcS86W1!H$WJ77PG%EcN=A zYhC|nn#uQ@eQ*<^0286IFd6IFV!`7KVXafV>&$xb$oXElKP&Y1T^(zuJA{BYc#k)q z>l7a|gcfn>-*kLdtmUtI673={1oedBgQD;;s*U3oR~b~zF@m7I-u1u2gzp0I)}0<} z$3%BBd0(d&ekk|Snr@g#@EH9>rBBxrLYfPnKAGa|T81kZ>bQETj%I_AWrCn%BD=gc z%Yep4gx}3^c1*M(1j`7jKoJx~(Ql178`=s^HG=oRbITc?TTYQ?0md+%Io-#~`2trT zspE=62|z%aDO7c&vS@WEQH2*kRCndEc2n(p00D@kiYSCoHfr}S)>QdzJz*G2SXs+) z;)OoeIv$n@jk<{ikr;H-fNwt2#f$41t~uJoY}=tI1X&?_CVPuuz>5yb_}w0MH$=bW zT&jRqjRk-K7`rdAon<5mq1*E~aU#X(b2%7@1P`5$2xue>QD9}wYX^JQvh! z2F7e32dZGzs56Q}@!WDBt7|!4eWZ>f3pFH`wg|tBfJunNit5M+t}s%fhaWcy3d2!< ze!0a~mf5UDf%t`$49_p8*ywsV%V;&tV7rS!6>yGVtwEj(zV&Pur_bd$cBGDlc?VHK zn#tgN+pSpPAcl=cXNk#@zdY zHI5Pc+R9?Y@vbLMbaDKN4vL_dY8p5@p31T+rfQBb)iCJx0>1Xm4V*aLM`HN`cQ$V9 zW7iDjRS}9J3Q~Zg@PHkfy%;6g<>?>_6kY(1f>Gf|Thv?*_LpcxBAp?yp+R;Mps>s^ zW-BY$iwhY(h7V-`ET0%-qR_wJU7md>dN{WpHmX7dUP>akwD4WHlS(%Z5(yq29UH`e zapZ58z`hgxau{SNUJ+Q~3=PWqOIcs#BBK5x2x0r1d61YGqJbg81jtpvahj?0=i6I% zMPvwyLgK#Tl1=x5i6Xi}q;v?O5iLNlni2fz@iz&4ABcLl-3*8^Wie7!g}X>81|tCkB!(bN zu@5MEf%P8*4n)24qEIPG;jK&p*n5X%cz0$X;rKy-A}B)H;oi*{!d|hzd31SwOoTiL zm-nE(iN+(Sj(%zy9hbrdy0tFXq@x1vNV!F}@0h zh1YU0(%`1owXrytATM+VGg;!_Ey`b! z0Rs$X?OrjHO4X|gmzup}iUTa&o+5FKV@nMz&erhUa*7vLGUSD#S!1vPKBL#3C;QMXrPGE(XhV!R*~A2_Fg3)qD*kq_ITz6^YJ11I^0C0qugcD!9dAd_j*_`e61zeaqUtAOA9qvOUQD84?2>z)`f&qEOcVf+@Fd60H~L^j-(ud z8Figiy*UtqqU!?^M|jOuO)SnQc=}|Vp*y-z!?C3Xnsr8+3-VNV-B^`xG>}1)Tr@a1(lE&<9)@FC|-14#Naeey;%X|ULm5s zSu^)fx6Jj-^d|~DwVUJZT2zXHjlu^#(MZfswi0t|vu+*^6Q%?21ca@@NEJo9Za#nI z;o7Z+>DPkj>RygL67{ZpHQ~PwPrL7%ZQ1u3rl&%PQF@ZP92WyoDWQrWvGk30!@RTI zH1Dc8eq5@LlI{Vc`(8(sB!e;dOuNBvYSqn$gQ(An(z+*<@XCryceFC!cE7wZliUWv zgHldOjRGShx{A(mWEMSR=mSfKk{f2H?B{~SceW4u%QM5M)?1W;e0IuwcBW}=Y}U-j z6zGk5tz#4ZMHJ5Rx8_>*N2Z(hordWfKE$@tL0b1fqn21zCYB$WZJD<<>*i;y;Zt#F zee@PFHlhio?~aq-4=zl*TaU~o?+4**R;FnO!M8|s6OQT0L(}%>TXp_kReV_nYaI{9 z+R7SsCkpgi4gUCS%e`@K%6(FG>jldFKzwOl;YE6jv+nl}PrKWk5C#;&C*f3lvv#X@9%u)dn$F1f6%?iD!=DZsOjm3?#^vL3jyEAe06Hq)6#_T4x!+}hbRxj*`0QJQD z?ZS+^?TR_~I|A(l*;~LQih;OHE0-5$-90l+^EPMbUque?d%Fidw(Em{8Jn#de`u;^ zZmuWh(*U&avLhXX06=5eOhoD8toyTe!`zr8{7D50IjHDc;=qXpqSP9NDSfh@@ZCq} zYj1akAI|bPDSA2l1W^>Cs3-i7hiB}YkIuVa5XBiefMJ>KFabnwK}*rdS$??PFmIoq zwmC@Y@$k~}@us__pu>*nqv=z9$7 l{l3tD(NZ6uFav%G{vW*`&(dGW==%Tw002ovPDHLkV1oTLrab@v diff --git a/internals/img/webpack-padded.png b/internals/img/webpack-padded.png deleted file mode 100644 index cc1d1a22ad8c7747333f1f3e9d52561e2a28c281..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4999 zcmV;26L{>2P)p!w000wCNkl3 zdyH&%UH^Q4k8@^rc6MiGcXsdIySK$sNe#h(#kOKg>mw0J3dI;O7_BG@NTY>D2?3Oc z8iK|O1Oj4sG#UgFpgbheL}`n(Qmv05C~XS8_wK#BJ9}qmcAn>)-@`wC=eIk1=`Hs$ zk2BNHANS^N_MZ98?=#=`V+cdQL;u^vnX?fpMTs!rXmu50Wl%0kw7VMlkYS;~vD;SI z>nK!;5`q(2Jq>FtN=1QA&!FAYDC8Ild5)c?!ctKH1hje@jDYgI#9q%mV_{BUF63x- z6grVcWnLmy7E%z(1&(@KW3QW_RFEj-Ia(csMn}D}8|k~M3-U``uy^MqLlhhAb`%!! z9HpW_tEZ1F-L|GK_9D)P&mO?Jau$ULHfdgTk(4=?1~fw zMhC=tSU43PI2B#o>*=?B?@a&S_PXj7fn=B!qNkoV z_qzJ^Ly^yxS;&k-Y5#}|A?0E`HN5tO!9Z8qW$ zo!E}<)7swT&zL1-ir_#H5@lDmc9ZwjTgk)S$h=HA6+P*rJt;UN1cDGH=7r6!y8mo5 z`P)R9XG=al^YOzlae@ghEMbIPtnD4!&E$ctX7am?hzG)5)TE{Mhrvs3yJueY_-6k< zx0~_1q+rWgC}d2GU<-gTcY?i+x^1hG+}G@=4_M$?fp8a-bz;v&C<)qF(d_8A*W2pB zW?Q|6XtJhd>;zlu9H>wbtif{{ZT*Q8+wte4#9Wt3^3=ln5K<7dwpZ60@kbv!-TUWG zWUdb-1DgQRVm$I zaMMhzUj=__#c}c{Wr$o*?}+Pjrsr+hObshmty^qZr^;kwwFBE>grn=5%`E1 z80q7sAaI5&wszyYA3fc>zaN{QmwfbZDyv`w2ti1cx#5ZJ=!;vs@jZ;_xucAqM{?Di z5g37LjpVM)M*L8_ukR#sG2_!7c0VjcFEPKm+frZOX{x_a+8h~0Hf(4F`+BMrgnq1l zsoBvFZ8zdSH`=cGH#F<&_+mihs$&2O&9-{uqi1@Lw0i0_QV<`e!#Na!U1^P>8=2>C z)S|EK?5WQxW3Tg}L6$J-#KXDpWl5#%TBD;sy46S?=tla*!+QQuIy#KD%e}pz9fgl)**07#8oSrN~m588>1*gg9Ux8FA7(oa^ zr>Akc7Gb*{BTg)K8VPpy6ppQiSSSc+ZK3q!Ka~W)7+{!384AG!^a)OKm9-!Md_oC~ zgDwn)B(XTT*~dmLLO(VL1Ys`EpbfCS8)LVnu(llFXf;GGWQY?Bt?k%9puV7@jfJ*= zv36+A??}2TEu4*GlqNbbJ`XyS?rwH=W1QTMu-8`LjF1c5&#g^A00D#67AMa1QQwPk zteV40C4>}&I5sdCy?yq?D&zbCoBnK=0mn$&W{m~Rn1~kK<+Jy?3a7Rr>@*TsYY_(L z7Y5E<*GRW-@!b<$)EWtnujWuL3TR`IsL`BuUt+D3+5uvRjy&8DTsOopYrLEh zq-5wv8Yi~;*xZQ_Cl*pNaJsPSjT8iH3H4@zW?Nx(DZu)2h`BkAL^-uR40r-lHN5YP zj#5*Mh2Z@+W&lGLj9lX5a)>4Z0?A+uaHiJBsqF~uo`&R39ovh1Hl=FY7>kYV2=zvS zqty^cmP6zMhFBSxOLVyX`!p8N1H_I4W1noW>6x~#ts$|#8lp5Wf2e)-M==&K0L+N(>{DT)vq=PZ z3D%}+n;l%j;Po*E1cD(-EKY6paC#?3KQ;&@L9o%5rb5Y}El_JDXtWX>S<2y9H9$U> z+Glf^=!1|awX>KEu^tm2K09zcER1$em@g-~MgazEEH=-^IJwSkD0M- zwm*gTt{9~m$rSlF?9pic(>`mQ?^P|BH) zMA^)hMu7}U@E`&~h&Va5t=xrjM(|a?aZ8J@lqv0;D^GGDCp$0oRLC^J9tVjM3u7z{ zBi|MTVDvK(nTsANXlDGU3&PWeVDDUwE4`T& zJS|kTFWO7ydbzB%NYdG)S&4VghuJ3B0>oTAJh=MM&no-a*Q8zUv&i$z5p2^xD4nKf z?4THNu3Gk!^@Bvunl#T8!Ja^ou8Hsk`19qZ{m%~(tzAnmFdGs*69oG#lo&{6z+QO4 zVUTD>2NIoy4wB2oR1@rpw}8qj$><59h~ciNaa zs2fiMGEH!z(gFc7C$)pbjyV$*uUWgu-_$YiS0&nlIQV&5aaoK~FS zo(%^pD$=u*iUOR|ev40*kU0tVbF_j1*F2+u)pCFnTYcWqPYV0?5^nCJkwBR1XJ@f5e9(mhs%kl~su3s@;7IJMo!ZcBls zyO&1=rQB;T%nPhnLsZKFh=3^hLC0$FpPT{A(hm%Pj~f#snBn4AIK;|=$fB|+u~-z? zu1DC|j@@n!G2E5B##qG4A{Q_mUkh<`DMTPIZdV5pz~REHr_BlnqEsDUV&UCdAc_q* zBOI;fu(S~1^iGU3I}xJTq}z2aJwCP;h?Rlhgkviqjx7f$%n2xUSRG#sTvH$I?9p?LT_F1El7r5pb0?SQ_lUoNH?!*PyXZH+);+(+x zN)9V!336XLJ=D1ST%yn2mo*BEY?YyRpnNCAu!%hvQDVRdsFnhh<|Q`k5jM6X^dh&T z^4#w(BDjTQNn#L4hV_*^j#fj2k|9K%h zb1!!G^Z05GOA8XGwj*rSVjOJG4*PhBXiiRT8^8?l z<%hEn+@fHSN-P~TH%%gQM{r{+TDv`!KYDx)OQirC+iqc+O+SST1%dUI5X&VAq>kI9 za6ojL3$RebdiGEV<_wS9bd4}&WKjy>oF*cRa#3KhP{39_##TK>WkKNRatJBi3ZyJ; zekTTyK`^Xm4u#-KQGDd;wY;e{leff)J(7hlW%RIVdXW)uWGO(k6o7NLc)K5)Ozg56 zgi;oa4^M)JQcdE7-fCIC|L9V1ZE=p@t&Q!)Nk+stg|SH258C|=b(tboyK@DSeQdQH z{_?P%I~0Ol65fJyIz5+TZ(1t{H&%+`OYxJe`kOQ|b{x0&Qd`XD`8Spp<8}%nIn4AFxI7BIipjhg7}TKO7PQ#ko{Av zhMNExdcmK_ts6>|#azg~yigD~uatt{6Pz{%SN%O*;dg*ALbEb2-h0(r{@VE*|F|!x z4BK}ZX-9`2zFuAs?>|}zuAk5I_gQN@qgs`pW%%&TSc`nXK2cc^H!d%VH%m_2dPGSM zU`#DLt_p;WLXO{Anin@M&hdY6{Z`|6^~u9pw^2X{dictf+-=oG`D$bBw-P;iA7yMk zSthO0O=;MEJJ1Iavv-h6SHlOO%DR_KEqBzhR{m+^|sK_ZnbqU72J5 z25`TQP;z$9@oISES|#`sz_w>iZAVT+>B@rm$dO8Lv*h$43m8ZE_+sygbX8h7wJkX9 zu9oE6R!hMRxqy8#PO|Y0WS0Y-Hslp^{J!dfmh*Xb&okHZ&#ji^A1BK0WGUXy6v4oOeU^fqU8@9lE-%XKL&-jq zsO;Eh|Ft@SWM5mH6E{~&^7dRn|CeNlSdYvR3=G&bWf2H^BpE-%QJ(s|q>x&gBJh!(xGd*ru&ESw`jw2AuSyUlQ3b&hfjiKAQW9#X0_07B(4W!hqoX zf>;?8LiYJ9kK}JyoD=WR#?~ek_FOEcf?y9XF`;DNTPexcR*K?h14;LKwLPp*gy1r7 zQDQNl4f*?ZQO!xxr|;!|2%L>G|XCL9d6 z&4ui%>r3G+>&w9%0Ji+P!)YZKm~w&#;fW3f`}XpJeAV)Td`Th4{wq$*c|Bd<9~}nl z`=xpDs&Y}hBp0v;rp1A}5X=n0z(9UGF__QuuRd!%f8El8`~zaN<@bFIer1jY_7>;m zpI&t&ckM!+e=3VTWS5JXB6tvK*JNBN%0FA07uOf_{4a?Jy~x1AA|J4iFXs96<$3;A zMySsku^tnj@E;|N-M6n#td@f}THp(t_4tl*QGAwj`b?vhxK;nN$t?ij{{cbE@C$z} RL~Q^7002ovPDHLkV1n|Sc-jB} diff --git a/internals/img/webpack.png b/internals/img/webpack.png deleted file mode 100755 index bc437f0bf89897e96bdc940e80063acbb0a335b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5576 zcmaJ_cQjmUzb3i_LG(7!j@}I>MjO5N7DO9SXD~C2-V!2Oi0CbPh>=9^B#~%QCwiAe z4JHU-aOHgGobUc|&)sX6_x-Ksd46^6wf2rTHq@e`WThk^AfVFGRyVzRT3lVOk zuLw)c1I$8LE_?pfq`Oy(qeG``{I%c3JSk9q@+Zz5Tb}67}5zX3PbSxt)LD? zxcGbcB0bfN>*M|Mov;v z1E{K?AgwMTr4Er$RhN~~g#67_hr6JBpfKd$T-X0{f&a?=JqkX)SDw|O{vH8PS51Go z58%&~K_34ei}b(h{l#_t_gG~9l`DP~jQH=y{;x*=ZMvGC-^+i-_GW&{LuiaP45=IGfSdn#{NE0of4=UMo-5ownYeBHLeMp|)^fT_DXQ1@Vpi-J|~ zW))>sQ9zU$kpVVVT~tj)Py4RMEmjsM-aKmW)V%XB1^*c)n$MbDF?=LNu@peR~2>$5| zLOo%n=5TV2PLlMinf zG!rqW%hTM1y&pb!6CeKZ%cw8Jy69l#zB{{~{33%~q_?gLWkjd((S9DgzXv3&F>zh= zYsp9u8VqWZAo!LU>g&4`gzvEBc|hsVMpJ9wy(GLAw&ru~T?pXD8)^sPgkw7zY{ys& zBDwpDRCt4#tot%8Xw=|l-;pNzT)+41*b|IrYHzt$m=&lDGz++_+kFTxj?*jDn@yEB z?ysT{>6zhsdVROTA+HK-fq1thi$3g3Vtiy7w$Re@!R0A*&uMtYKe+G@@&)y%$12h3 zj-RZ~X++FpD#i@Ic)4Tm@{QP$-{%ALJ`afykRsggbHS)%I8QP8O!7# z+4Tkdc>dRWQ*iS@&+;4kz{%xtq8Du|PW98ZVwN!x?~0IhGmuV(h0daMFIDo(3=NgN zm*(dokVv`~#41>uIlH{2TCCvVdt$ZRhs(D_{|)l5L!uJ&ma3rp?E_sg1zTPcOv9-)HdU%l?E zl;_a#z8Y)MxLgy@s|CmO?1>77*0P1p`5DW?i!trq!9C~KY)6kx=oUPg$EX4Zf?Y*M z$mhRmqQ7F>&rte+&g3;TxWCTuhtEfqGD&)PF<g zN4d`E@`MhaAkT@T&!$d{<3J2Upld?@yifSV#K_?JcKe1R7~(>5NH&kdcA4hKZVg6n zbG8+&^^Ep4dCc*OwB?!sZ>1}(Yg8#mS$b`VU)6=dmru2=4(PItSJh3L6he22l%K@? zF}QpGLj{`=X;iyvilj+V8UwnMJ;!#Rv$!$=^V5yCC4$@Q`T)U$@jf|AOS}t$VNbY# z%fX2?q@o-gHQ-DUvxb;gS(LTM735T*BVs2VMd&Z<&%K-z7MkLcDN3!MxQOQpwiQNP*nL+vPUd(% zzzip}TYOwSK_d8gB)#LTd|=ls3(m#2c#aY>bi}H|B48P4TEE&cBqSq53b$%C|)Y3 z6D=Z2CYM);=t>AZ_$u*0Sj0XpCgE(7lB%*;??N9JoqEA;r7%j5oBNr`qGHeq>xf>9{HQDAkoZrL3iL z=r>xbvahj!@fVFmNK<7M1oj-27FRvg;G(9U8;y&NEVi?O(YX_Rn}5;9$&JkTnVY~Z|=hCk_! zN(rwDM6hLg=fg(-#3w=AQm-z3l+H(y=m57?!UT(ZB>Ep$y&A}_aonSiTwC9k=-PPO zlSTwNZ!D%{;!+{cU%yMmA0&@!OI+e1UGRULqr@CQVfXnPM4CicDKFnsfGP7)k&jQl zN2P)o-u8vw$=4IgB1|mg9rZ1Qnhlj~5eh2>bsUOt`DtoVDi6fBZxj|zs0d$9ed;}b0fH+aF4@6we)El`$ z52kVbqZMlW46pKf3c4*s?~t?8p8d)O^nZpXth-6_J#bf`M~j(KzHi_m z7t2pES7YA&B-M|I;g@JSYPa-CMy?v$uq^0r4?#WR%~h?mRG1h`I)^P5=k>xdCsqdA z-7n%2O7E$HIQ#fkU4`xCIlegKl!Khnr}h^U1~uA3STH9enK&7Ul;pM7E1DFvBlhShUpY!};JgydUC=l3|uClLC0_gNAqp{I`~1#XkO zSS|5o`4FOneRa0vqhC0j``y|{pm~VjxUhi-(e=bUHw%^PqThUa2;oV#ol~*Xn+ zQ#9JRmamUPYuNC!6GH4} zq`E*JD<++G!e~xa!u^Z7rZKzj89F5)w&Ilry$BS1GPZj}^g4 zF{YGx8n$wcL#038@v~x4sbEqjI`?djk@GtoV?QCe^PL117)GyPGr8uC`Fl(`2ArRK zOl-yyLS6*dXdQD^5;Lb9dLF#dTM({p@L=XoVN_q8S8P&fMYMNMg})oc-*o}-pY#}0#P{V(1}R@L1e1Ey@oyBAFFPK2@ozmI{7K_WU77^1+SWB)9VP|!fUlVmE z4b!Soi~8T-IlWn<9uI8wsTNx#-~Di8J{LX9{s7tAvET?(Bqw0?reL_H@lB_Nf&sCK3`&Z5-$G^n|s-kBn_M=i)crX>$_`6-9OaSY%gUpzzz@w%KZPicj1q0@}$a2RU}Pf--@e>MW)u^kFKax#oey&>>jh&Y(#g7S`4qAd}hE2xI|<7^dj#hqpe@+9dBf=z~GIN zElVI2fAa_jFF8GNaV@(abP)N1Ak8oFJ~h=GT!>-luEB7!NvQ#Avkto16)A8u%qX>L zUvfSPclEvi2OBj6!iMtNr_(2Zmq5*#+*r!VLY@&r8FA^*7S3P;LjTY*Wnraovpb28ceMd)&AYU1U{!r;c5gXudn^O$t&ua4Y$7KYUYM3!bFf;TW#RTC9Cmbhw zNLRW3?4Qt6-2?Uamr9t$A{*W_+$-{TziNjXDRm=t>GNCb*oG zwLz>lTdLazB(@&b<5Dk_4q8Jk@zT8q9qtE>vSyV*2RB3YUX48aF^PhZ9NcEl+T%;7 z!=tIZfW2HnNA6of`T-ZD3!#l1!R<91LOJl%xNj1V7Qk6@9x3?Rpm6^aOZf8#L8r$D z9)9%ELD<*R;_X0wxpo(J4I-u;mM=3+w^zCppa+*nF^gFGLtq{<%xT|D+idUZCEeAp zz@QC{0WlYq1{{<^G_Dj?l_ z-_z#AhtrHj35hzpp34pmTu?Y2fo8@lj~|zp^0^$q?LcX*j0@)_8-mgfaa^8Lj1?Y( zD#>AlG1DC93b?x&{hSl&qnMZadpnwU8lfC(GpWU>ySH5~ILAjLULDNrNUxi-ZMk0rWD>0mkEC0V z8dE*{;B2U<3vK*By+v_jl683;7~$;Q-5KOP+IoGd;74$?PZ&2N-qY8orx5ZBbtilw zI`uRH>%GYct6snKN$9ffdpw78nqRfX3y$oCNrEM-E3LLE$jyOJMO@BntSnL3w|i2< z<%g$H-@d2r&p9i3T`a87u5Wdw+{DPHP) zL+pf{ButoKLj(ca3S95>i7FqJwZLZ?~mX5d=wxut+cOu7dC>yu`x2~6fI3H3>|rijIGIbtzzQH zOQe>bgDVV4&%pqelVI%FVXDPxI(jc)U}S`)9XUp)D`XQ+b2{m4vyj^mY>=?bATmPW z8Do$_NC1t|7@>g>Owqur7_(2qi=naiObqqEY=QzU%QoT(#bl|BEi4kQi#7(OHA-5P z`}blcvt$-6r&KPHvo%K#?L~ENg#Ks1_8{2;qX*;9weao#dCITsxFaL4XkP zxuj>O9oyP05Z4GHt`LIN0$KnByjBnph?$eK|JwkpHing!Fu7DJWt1ylF)9LEV9w^l zy#?MjqJ@-5Y2#R8&EnSFg^rL{cji(TVOVU8X`U_j`fE<{c?K;AvDFrAwb6H^Iy#O; zM(hu&l^+Z2T~hEIP&987<7b^{V;~BuvZ=l6Qm3=~R!fIhCKK)^qcv#rCdr#0F9ID! zOC&5wxXv|Nn~BzB>KBpLKUBs%s5HmUHs5E3XftzY3{uFOrQmlR+q+Ug#u$UvdO_|P ze=rC^t7VBDmSycQ@P|QY?hBOuTBJ>%F&c9g#9S_9<;EDIFhB^fgt*wX>~Fiae892f z4vfk0HuPfwYm%h7(%5{x^ee9QB$N;d(N}|ZT05ux3sR=0-=A# zb)PZOS{ppa@>X;<{qKZhzgI0V$wEM&G^IeH3{)aTHPQ|5JW55$TubLSTRRuuB1{P7 zA_NtP{8Jw_F#idQ(HNzW5;vE$zG4afQ=}R{TAu^~#XymDEq1J5#M<^O!$qHm4-GR| z@JTsVLvI%PRX1%r|FUew%85cI^;p#i%GF?ADskRK3u)seQ?zFipSDnUEVQ-|0!o1* z=UV*vwHvtkoSxb5uI}yN!{6Oa-jB$7jh*bOFv#UvyZ#}&Xz6=LCrkUw6Vo71UlGht zb%Z{xy<1p*&O5KS(VsXQ6Fj92S{puo*_v6Bf8IArz8Z4Tigtc?>k2}xX?Uj+0;9rp z_?0i3u#&>B#5y~yzWJzu`a~Oj@_~UU#C6=BL?ZdO#+X!t9_cNijUm#8;iAvQD_Xhj z{G|Zgv+HGU{OT?~|I_^deDsoDHgskgDOD-@5n+R8c@lmtm-7B7olaoe0@tzLbkst9 zrMB^s_%hmxfi@^@=*oC};n?SPdE_4Ull`cL^ze5Jqaqb1WQNo^(|I@6J<=FbNQ+c0Pf!P zGL=xVIG1FwQ042-_49=rn%KO!nazu1S9VV>#TR~d5ZjT62DMQsol3jzmrRB$wbAB{ z^-k5ewl2|&+h=|77(hzVlD3^Mg<<0-B*qvDzM?bZ@u3Tra^t!#R<&hLD)YkNG(UZL zl$N9m#?X{-`2PMOK6K$Sl!l{|C2m~b&FvQ~;~RVW>6@&Ob{k`j7{Io~$qq|I{>dvm3iQ$ z0s5!PSW>coq<|D4WgMPLIu=DgReUlY1u-SluKmPXz%?S3?Rx#7*nE_~hklIk&rsN~pMd*I{-( zf1HU*NDyhH0Nau$*~{7((w@yT$EPsH;76LD93EjyPYcVNQ%E6VKSl$4pMd2F$NHUt z$--x+rYm68w<+dKv^Iu>V}DRevAU51VBU{7XHk~hw=C!OEwM#0kgxCu5A5NwzA>5; z4xTMZ+7<@$mipEhNZA%bfYK3#AOfH}m!vJ_5-3B$ZYa@MQr@PO`HI$J2*;*g5Th>9 zQVO&-*itk*Qocu+#(0$lPz)7o+tYmc=JV-o&jRpN|2Tj3vxDq9I>Dk$0x4d9&8f*c z!M_yXhq1alXHkwNO-T-p6-n5Q^Pd?&YqPGSwfWY<@hAUI9UBA3t$9sdqRZ6)5HzK{ zODs!lX_Pc86Wf-zowtPE_AJNq74H7UVIDs+&Z|=u+EOl-IDJ316fjW^DEbktDVOG? zL)bva(+Ox}NV?8V*_8Lsq0aguk)&9wUG*v)9i3*fR3YJ7H(^Ze*LE7Hgo@Q|Y2Lk| z3xI!ovX8&r^$J4;pIpL0iuvVY2q7qjiqeewNH`XH0f+`rVX(b@<)#bW_8uI!_PnjG zM7Or(@LX#VhRYk(Tw_2P!;%9i%IpAmvzRteR%6E?Cgej+9o52rHLP z9^JQ#!gTGj^(xC(15&Pgp@4ObYM?d-O9+-W#b(#B=?YVo0MC|Z%!@IGCf6qG*%;!< zk0l#x@6SRjY|Gxh*eDGjY@m!xBJ zWTM1Sv5Gqf^J_jZfMr=*E!SOIQnkz0Z9zvaz1EWAl1AoWNGVXp&_7)PU~x7Mvw7@{VLZYF5>XTthxmc@c<3zsJP&fyor4ZW$yt9$2PR!hRFkfY0 zxTIg=N$(DbY~Mx zRRSLC8zYxk==4H?6k??#O;@c_b9veA4QkOWG?4d0wk~Pm&Wl#loNyT{ReAi#7?u?C za%%=k<5`mTof}7A9zHNk!H;kjP;CHU3{ueQ*w*q|#pdw3MWRt{I)Q>8(Va=~`5QKJ zes?o3j~BV~{^!^|n5RAM%}Y&}0>usM7IDd{4$48qw_iMtYOpiutzZCz$Vov@t#b7x zS~OP0#gZrZv+Fi+es?p6#|nJxfj#UV%+r}UeUgQMa;RudINZ5?6|NQjAu=cNI%o;~j_K2{Fc zv9X&EUa$;+uRPhuW3P;n@$5!qa?KSIK}{7~muS<#9M*|)z>W>wbYx7At(kBBgHt}f9={%Hg#nw2X&@ujYmzM=Afe+Bhi7M_(D^vp?R4A8D>z)5WiC=)#ZAnpFEhzE*)bs1D9JmGZ=5p|+Gq zd)lKKDIV(^C*hpAw+=uGK~uuv!F@yA``l4%OY%EgSCDZnf(6b8oaydGV60{v>sMuJ zJ6h)mA(#!S=Bp7Cm7r#5>U7~*5&`Ud{y5_$pY@$Nu3gi~L^*8OJx&Q@^2+G`T1Dm} z(Fe}FA+f4IL3AZl2t-5ELJW}gYz~i?cyQk!09W^R;z&VMC&HqQLCrT7Dg;V15=8n) ztzz|w#_T_1XFLXD4DIPS5@ySWjj<=e5`t=^*)uRrq%~Ldc5>m8X7X?0s0x&(7(^8O zh)SsOBTdPVsD!7d*98WRITR^IYn7`@bfnD-#+YNLb@!7R0@X;fx;4#?4c!0~su2s3 zOKphN)2{}m*f(4t=~yglP7$h@JR#x`+ITqt1MMk~bsZT#a9$4|*|vgh%UZCcpnMu+ zOCbp(^(wcHvl#S;ac|YW_SH`$!*I`~B zFV8JtAkd-Ky9*V+X5MbyCmr1P)acUn7d&Cx-uq8?m69R$LtNk6!3Q?S$uXaK$#bCO7D#!5a{uIk|SElat1AJ<*k5F>BEkjIIy_W<#>%|)g{`pBnI=Gi4F48N@9yt9Gcp(u^R#W@W3EH zIy_2C%EgvqL02fBs5?}Kgl+NRZ7cc1OL|GV@gpA?EpY!!1N`9NFn*+|hKdV%nz{Qu zo7uXwm3J&@=Ar$=xRyM%KnQ_~q9;oe<3mE%RyTEtwtKcPRgIqQa@1}R+fV0V1EuK7 zdTdw}2WbBN#Q}my)0A))j$~s%%Gq?dcPwe)zTeo&#WP8h2SyA0!;^h{Z{HvVKO*be zXkw}U(VF^V3LucBhCzqfaD*RAm$;M1lYQlgs)8)4>kG+@uQ)RyO{4sVuf1E=TB|6g{ ztx1L!F94$%{pr_FS+@RYG}(`GAkyLy zONftROs4KNGZ4g{7HvQZ!`X1B8Njn8ohc7(3*da?=fer)pf zwxzjzWgDwo)10@snI+9Bj!u?%>ewWX6x0gPSg!Yr(HEcC7fg;qB3-jxb%}0TzYUp8 z%dyQr^HExp1Upyc94{sIsyx&C-@6`eidC;U|}kb21F2K;c?4 z_Jhnr$JjG&(|>&W2-<)n1+HyjNkgF;VK97Pa}S@say{+ocr&U>7_syD<2-Y0l4p-k zF_5p4cI{IRg0VU=PfkpZKcu`?$aPaM_pE-#f3*aFl#(FQ-*Ij8`<7tqTsW|$px{S5 zb8Lc(SG4iIO+9?~#X(A;B0VErC!mN)xnOYy25BVM83}7;YW()Eor{I z<2kJA*zuk zVOyj<8_%v`&M}iJVLMM3rYHZX(7!)8u^f;ngac2X^1Avn!`B5^3{VZidu<_q+m`a0 zxwv5xw#DJ`68ApW&qpur<$ar$u=Dxj6#a;nq%+(2P#G3wJdPJCJk~dkV~NvRx+X+i zN5PK}KrUf(>B?3vU)j!0>$~aB#Z!P?N5=TqU%ko?4~`INLu=~vGm%T>@?BOUQ|#P) zZpN9ZPPoqI8Pj%pubdMQO4s_SFYpMO-uOu zCtju+s#%BqiRUoH*+@dnZ0V+FT${#F4i#(LGJItFN^Uu)hg`y$z5mnw6MW~T<2-V3 zgo#RsBjX@}IL*}rB0i4!%6wd#ScgZ!+H(RY&x$k1(pO$ zNVGAe9E=}3EYW)f^!+(g@q6){x__{rfB9y&10FON`{JnXoUXh z%It0j-PtoswlY9u%su5G`les?=d|4Iji~=>KK`w@zAW$&7Od`W{f(64{EM!$zC{3` zF%+v2ZE1&1T}>>`dU%#aRVnrk7imh^{MH4_*}9~e)|49u2aLhjnjnggP-y~Xs47L- zk2o?_=GDnE$MRL4ADm|YXaP$|Tw7u{DDTc79x=k)Hc_Zd4vptey^X||e)E)d)R$;= z3OzJ4%bO_q->|cGk7vs-sv2%oLp+&iPC8UV&7&`m0R~%2A|2<*3E;({JS$pLEXsJK z9GgICs!HRBiptF4tJvEXXcPNTB26XI*iw-7oKv>pbRpt@UKpJ&eK=pLOe(~@_UeE$ z+%i)Lfj}@_QGb(iRWg@w{ydyRwR1JpVfwW_u-i?+t74`Ip14Iq-8xhJYBhC=->+n5dwNIhA23r zdg~Ki9HBtJoe`us{?;&iv zq5F|EoCRA5{75lX_8;@Z==!Sfe|f&np#_IAShj}!Lv0>ZS}mABEbRW# zfHazX#s6-;9BdCF{TXd)M&%bAC$w##)K3bbxNf-r(8ux#)S zW-3(bFSHi-0(W?>bF-9k^V!-gRshUlvYCqyjnP`Kc+Af z2RNJ>Hs)OBF)w+ITrr{zdqSmu z<(G<&`=!ZW+D+Z#(wLb9%d@$>CC1zHJ1oW^rG;%fL`sL_h05Nf=j_F(uMAC<+HYkA=S0000p!w000@BNkl zdvsjYeeb`&z0W!G9*s15SZ~{sCCkE!9fWNe9I(NtkVi=tNrPD{(1bJwL&Ckew@I_; zElon3rfouRV;*f5DXcCxS*0dT8WLd>0|sOK09#m=^{^#bPwOp>G^3e0XYc#RkrZRF zJ!f7T();p{4d0UL=Zp8yV+zub!zA^P2K zc|m9*Z~!)dTmT9gPy@mpBzc&VJg3;z6GF;Y+#7FgZqsib)(tUHJNnc_8b5Brd?*BN z>Z_)bbz6N7n_68>w1xqjh;RcDRV@g5DT#D9Mz8@?1E7Wz-6bSuRgI2IiGy8554~+b zwhm7Qx;6)&olBsaw2<)vpU%6#xVnVj#K0N=Y$l>AMsP{MxSY7jh7nuoeu*0C<%gRcj|^7Xp0-81QEM?7S#z--qBT}2Q5)8ORvivE6-q)r5!Dy_ zvkrDu&ck7`4EwZ z6a9gr@al2ThMrcVX0$YVQcq?bu?oB-UuaWbHFXv}SmU;9k0_k}oe|Y6MLSZBLUf19 zXm3%D_Y1B0JM)&J4QcPehn)A=msix>qB8a?Kd^ij|J}p|%&i_H z*chWag|jDD73O@bsju3SvnL)>E^rg=;H!&s|4d=@os0Lj|6L(~Gos}x=f7OF@z#y0 zt}mqmH~V+F7sO3vJs(CG!KE^`|6I|7TT?k)r%d35IhPTAGgWoOi^d71Sq`kp_nd@*p`qLlBEs}s6hA!JfiFIP9D7goBVq_RH3hrxSZ6Ir zEr~FKixJ)9vMaYIbJ3MFft&iO$*HMZIis&-nuSW^giq8I!spN+rNkTEqxflaKPKmN zJpEQTj`dAIN{L*T4L4Wjfir@}DeYo2f}eqXy`nHDX`^3KY|%}9)l|BETaiQK|H6p! zlhU#zpmBmzQ}9Q1CD^{I0Ctrl5Y}`^(d!ccL&E@Cs?1Q0jA{%I`vsQ$vy0 zfrhf2#oqhRN4nnk&QFf_U|VG#YVy7C+Ev`LssI3RV?{nH{4V_8L+20(r*DN#ME4c? zyuU>ddlM}yDFRm&=4>aT`;t*syl9;8(IOwNE%9M}kq;Zo{O@}v6gBWK$Irj-?-4`d zg;N8l+UfzM#AGN6z}!-O`kG?A&@zbA!-154h6NbG#u+`*n!od4&G1triIkPFz^(Z^ z^W2<0x|H*-->Kn~HOug+nnJAbyPz-zDJ2Xk5sVm^jp&F9iTxcHE?dUlmH~XOt^~hm z9YoJW5bKJvaQFH$*c6V&s(iE#2hzHQ;*8e2H0^5u9!aE}gavkJ+75uONwl1JDa~@= zzU#_y%c=r+?JA^{2u5@q>KVh{Qv;X@M-etmX$Gc4mn|n^Nc`_#pF;0s5D`OSG8Dm< z<+)gu=fP*LDaP(M&mm%@cb80ryE_YaJzqJv`$W8DBqZ?Zy!(qigu9l?T9xn8@ISXy zV#|tL*c1+32)xlXif_Ms1|eNoo;S~q%`X1GWjKK2{S&CnbtB8J!e>`8JR3>&N4N@9 zsB!)PfIo@1goFfk+SEG%s!XJexaw6ot}XWA?>@d3PECQ764P^0eD~#6ywo`YLnPkQ zB8J4|Toi_sP#8n5%a(S5Il*QCH*^;6S{H9Gj(Z<`I`95s2HeI7?_bTN2+jzbO0&`Q zrR(v;r`N-wn!R=?Fo(a`cN)KLA5Mz63+RSiEN??;QVmQoVb)A#8s~S$Yy5~?V27$~ zBtmt(@5e)3fd}8(Rt=v+gAfu^b5R`co51&9ZO8u3gch40$V@~>Xnqg8X6ekBE+TA+ z*Z2|F5Z#iyGuzGRdLk-~=lytasvLLJ7NOMVgp?9*o*%=(u2CHBop{gOnM}rm5rm=! zd=8*I+nJI&Vq}%VSVL1^^%<+d^l=GnQ+YWfT%S&RbKNp8)-KC}!Wbq)5&Z3I9Vrub zftiSb==>0!@3yD3uB%YMfK6o|-TF%mw^7@iG7N(raNu`(w;)4#?U`25JxJT#q_IEpc`h3`5u}t?bX24h2CDNo)R+(K zSrV8rT9Z!W#sU(+(f&!iJ7f-%^(EOUw=At)mW7WL`9MS%3d|vx#;A@fL4>t#hdXBb zg(ZQBux6=(>CTPKqHBB>x)87_9N)clO-f^?{7w}GZqvoR=R_}}X?7J}9;)SJq^1Yc z5)97^NB}Q)j$mNg%!p9ocjE`2Seuf%@?9D>l;*&ua0nrBq<11?@`Nyg-^xnb>XOvb z9xPdKM%cPC7vI`ejk0-LbkF20UTVL5ghnE)%yHr7N^`M#YG?`*q4ey#V@2aEX2*j? zTQqsCHYQOBz;(qw?A){hD{|bBQsPMOIKK6pmX!EsJvIe5SLVT~DG);9U*9>8p+LrD zMFId2V@0t(Yt`A1_OweSSq|J=Uyd~eS&&lV<<4RJ<^I-`og-RTn1xSYQw%93P7O_= zeQY*khUWzch*@B(i>$N?%o*VuH?G3<%X1;6#B1k9@PmV$DLo{%bK?rw6pn}?u&;9% z-4nr-)s+CLnS-U2X|)%Aa&-Z2tjLFy5}l(n_*rv5`leF1AN~GqwOCtdjueM`#_)2I z!hezt0Wt3pt?h#^$`zSve0Bw2|CqU!2t^GvwO_znz2hkxF1N1C#rCR##eMI8oEkuH z3V%!qL2$?VXvU;6yp%g?ixy8K9O@av(?_~fTHiyPE5PS-N}rz$;*FlfQypajmU^U+ zQlzRO7o%~)j&-KNED+XlG7X0Q=icsFbZBfS&B1qXT?3yzV}JiKV{ws1X_=5J{cbo^ z4k;!2rh?dWqBrGr{`~Y19{cSXjLwEZMA%+cfVf5&ZZ_7s9&f)VR4KAGJ#qO?f3G5VLdI;wl;`-|=glP@U(2#u*GLao}w7 z!(p$)3oV2A*~vcWLZC9&jnCGVWa3aA^Su#PdvMAHcB&j6&HO?my1?r_Ya6bH1O{S#)}p{N<#8(xRe{0@M1)|}Nb9-W1-d7Kc(H8= zVcmd3<+%6SvL#FH@Igo+QX{aGXtUlNYdAFybv}}DseG_PNW3#Jg|^`UhzN~U%aD~p z!*s+Du^sP+Re^yP>&>x-SL0CTSFYhD5?BH_JsiNX{t4(pfH6WtS`G=N=oy@z!_52?aeu?gC2q|Evc-@*X8)x%Lx+$ZQp%KVN(()9 z+`1|sdG5?e((`K97|xE(KuU?_*)BNM*nfD19y>ObW@GEhT&yolo|jchygL(`iFsjS zX<~^QqK9*Kf&t4dx9lo7RWnsWL%AOcW0;kbl3k4@1_N`8&VC|-TjQ5q7igTY zu`~y3@;z{B9A!QyD*P_k6^@Be1c%R$H(s`5M-n4UwfQ^PM>hvHg53W-@E(cCEa7)>$0V@cq?69*<& zZPW$rhhIogdE+foybW0j~OARxg&D9?7{ox$J5N8eJJhtGec z1l4&SWZBI)xQj2rT!4t6keT83E1OoLe|ioFyW??Y$Wu|>7`F0;C4n1D+GHoT4+$Zg zIivN~8h3e$ybgT4rVvDguJIWh>>f*d!jo8V%^P5Rb_Kf{R^n4@ieOhbh)fZ6A+WD) z2u~mB#^CfE!iMRa@n{@h-mn5+xV9XAr-u3xA5IKTS>EGIiDOn)&_EpS!f-?%((KwH z07(&;0956=7L%y#d8Zd`qZxMvAOQ2U;g;ood~<6xO0yh`qK*W@_|MY=c<$}q4-{>3 zPRFm#4B@7VJe2vIsLu1ittplS77}3r@n+wN1CzBSvA5Z>z^FI~4BZkqy5rlsxtWDq9@Ch_+NI~QGzmm_S5#eKb9 zvF_uMQl1u)&Zho^fA4XjFT16MEAkXT3Ew%u$=p%^=7J`yr^V$QGYTWHc|)boVcxhm zIvd7`fl2H=HGsEz$FDk_XxvO5Q!xKIdnSSiMXmH+DF7S`N26ygx8LdujU{ceCAzgo zG*2k6*FZ`kfj!l=x8QbHZy^ar^3J z@Yobg&qeXhz$5|@E30Ul5D>@CzkOh|#=`In#2Kx#kO$+r%`|QcdMK*DG#T3YNi%xUp>nMBn+*gv8#6h6t}<7BY31QdGrs2qj|C>Y8(jq2lE|gb66V(7+Tv_@>?$Tg5ex;w zkN_gaN zT02e;&md7-jf5PD7{Y?@_)>!?ndeY*~?uEh}=7WmiE&7@ZB{wR0o* zS#y6<^GZvJXA(&z3?xC|n&GELx{4lrRN?&R@g@bAFmqtMcxDjyZ7|OU<-2TGO?Kwh zI0mLec=||pN)w}1_+8jknvIVXX5qTh9Qd8u;vD-*=P+J9H-eWsMv^*B2q{}#{HE;!UhNu-X(46>2^hK|A6YZbF>@B`=@YWW-cX85h3I=fv|Wf8D%9clC1mq%Ux9)Zhb`I`1g1ZsWlHy zp?xHPLazg*Sq}X2-pzP(J~jX0Uek%PAi$k#i(yyzqM0)p+_7dE9%!gQp4+x~PHABu z+c6Tr4`1)Z@%~B6+Z`(iDO)2#{IG6pcTzkqNfWrSq)oO&wjOZXwa1C@wRlXJ!?O|m z$Eg7nc^z2ccfse-aNFua{6Y1y#nm)tv}o*?Qlg>UkFRW4ju%=65V~X)y>RMeA>ZV} z-)alIsLFMt$ZLmx{_33qj~#AJ0b>LqBm!X_5yP}R{j|A1<;hPaU`UBMLyE`ZHEMhi zmh6I!4}apS&vX_&SferaL&oTqctj=u>k7U2%BGbl^4d}0w!^8t_jf3z#86-kIZkac zQOa~Uih=160%08rBREtJhst4B%zqb>nk|?OFURy;6z>jA;rVy_ajb75Z8wsd(HipU zU?lRrSgz7(di=j)DmUrDzGnx=+p7w59w%aD6vuol0lYIfjj#UVBx>_L*u312a-S0_ zXHc0L3?GUbIM_XgEzA9=FU>)j&k3JHTlDtCN?12A9*kfj6hR=YV>}qa>EVE7b7G>H zzFxU6D#VWyy(j5Xk}hzg++!S?yyumo9Pi@*9*y^k*@z+W&fqlO8Jsq+s8c!kd^+Ko zunq~}P|r9vm*-%8kq<>)JF@3mZsA2vaF~q#pONVYq%tUltmaRm$^p$mbiAu}bp%6Z)ok9G`>A5BH% zb;{0T)Q#<)Y4-1WBFjMX9&o&IIR#RfNQB)DU0n7#x2sUT4D9NU3kGZfy6= znf}qgHiUdEmGyiWF~v1LxpLq~2T~<2kcI=`jdG9C+CTaix{!Y^BvOCTLWU!x6hg{D z-7xO#II{1RRM(dt?|ScXF%>c%7eahnNI966Ix`Sqy8lk?wP4M@q{7eqe9BoR3Bo?G|b2h`HC*Y*V_lj_oZ@JzL>Pe$JCAOo*5XQeoi;! zBSOgiLL!{b`j?7%arZ{1k_fj(xyPs++sP&4!f!_WLp~o2z8;jlf*wu9f}&czAR0 z*(J+Ioc1C5ePw#bkUM*HqD5c*E2pNN08j;xH<1{xr9en2Bq(S=z8KMsKj}EKZ*POr zl(J-(X^Y897Mp|5&LN1sr}OTA%cUuIOQO#cQCT|gCys}CTk-_}9l9a@VQ_N##m&KI z=i-fmOg0%K@B;I5)%V*99(dla@H-{ZHX_skC`f0v+pA&j0OUCdoDfp{YC0tUvu=YEntY3k;Z+FpRcM065%4JC2s+d0$W!C6@!`oUt1K)F*QofA8>%w}g~$MRj9X zH^fBWi35}AFfk^J4~4)N($gy diff --git a/internals/img/yarn.png b/internals/img/yarn.png deleted file mode 100644 index f406a4718b1d7a12b8b379fcc3d3224cddd5e16f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2181 zcmV;02zvL4P)qi@6|& zwkeFdBZ{~ujJPU|yB&qKDU7-*jk+m}x+jdfC5pHyjk+F&v?z?aD2%!&jk+g{xhRXd zDvi1-jk+g{y8r+G{{H?fj=MaTzx)0D=JEEs+UWK9`}q6(@Amoe_xk<){!gLCR;0)> zk-RpOzTxlnEsncFnZd2n-6|=ve0R+&X>pBhrZXq-06I{ z(`2j6oyy)to5PdD+tujsr_bRpki2!Y(Zt{D-tF_U)#Ze|*3sqf$l>gv%;3!9?Ma=) zU8l)yu+OvX>>vOD04H=(PE!E==GFo94EzK55eQPaNSZJ>BF-sW>>Gs0ly5<%6^(qa zW_I7fVkFD2+5i9s|4BqaRCr#^TGvt|ITUqHIDiu-4Fe2Zsk3v=ImZD1|08QJ3=7k( zfX&wKd2^}Cr*&@Bl}!I1xPF{QVs}=H-RU%AY<9Zs7VBLsa(3>peH%mg`sba+iE$2p zg4=p?e-`u{&tUVMJq4^zOoII}<_(`5$8jFH4B4?0(-8H={EovZf>%C^8MCp|&3hot zkE>7==P(zX7N7S3(N4S~eAg~E$Cc$64xDp`{45sNPdh#m&R^Fy1_%BI*w3h1 z(K+~8D0XpNacPy_rnYHJ1zE9^Ckqcpso7q(2LjzL7X-y@ey%VVQscQJ75Q=OSonYT%!KY_Av_$;&E;?R@o52}cM~P45nT+(;BtkZCA@;*+s{r6~f{ zC^_ptTRHb(GR9pEkSNuS)&?q+>2V)>k4Wz?OvdvJ657g;1GhA&U@9KN?+L|8(W)S# zX)9^GIFVq;XkVV*a{ejJ?A;=0Nz!5?3pF~4Iq(`Qu85stk+O(Jmn2nu#(Ywa+%M8$LVoa~V zvX9yDn@o19SluC@m9Y<3N06B0FdI)Mlbc$0r+{REV0INPlb8cPO(rKztTv$bmaw=4 zwLIn_xiy*0w4M}Dv5_P7#5#Tgc7>j@Drle#2!Ze-g7kv9a6=_21CmK=MFgufCkaii zv;^@oQOO#hioi!gGki)zL-NPgYalkc_7b3x^i)LaMOrEppE1(#0j-Bi)b$J z#YvRtTT7%=sR?=sN{TPyiRGj}WONDR)=tkHSMKr=KePy0dKE}5At7*O;ahTl%4|h? zB22jI$vw%v>g;}Jp}~x+GF}sm(yxe2lKuvv%!i-dmuKS|AG|Ym(ET~LgBg$!-R)y(Q1o1VVts>>{J@yKIIXq)$91Beakh0We6nDTzn-W!3;Ly*7&3|a! z2BcNG`#)0>22EZ^5)lF@HZp{U#i}2q>jzRVMG*k0s)%-MgM4)dK`50<`IkYVU5qCn z5wDGi{@}DnTpY9d-1Bs%zz#@KA)yUdo8e5-6cxcM;?uf7o7EfM)46oF4(aD+MQ&FL z^+FatL6wH9N|`p}bl-&u_b2xjy#ooQY7S@WYk4zVZl-djFj_YUt@`tpngh%i#2Y8a zgPj!BnSL^rN+!4cQZu- zzx!q5#Cyywc7XGJf$Q}0;QRQia}zH-kzWUK_|8tg^hV<5fHx8ko-e=l2z|+!&33|T z4?4~tLQ($Mc=R6l*eCeF{Q@U)%tN0@AjI-#`(w=SIrdf5eZXoaGhEzy!;Wux-{p_( zbTd-v>MZDCnVX-;;W>@OZXT`Cy?Azu)fag12OTFa6A%6ZrE>pGT0A6I00000NkvXX Hu0mjfS`aSa diff --git a/internals/scripts/.eslintrc b/internals/scripts/.eslintrc new file mode 100644 index 00000000..35dc618d --- /dev/null +++ b/internals/scripts/.eslintrc @@ -0,0 +1,8 @@ +{ + "rules": { + "no-console": "off", + "global-require": "off", + "import/no-dynamic-require": "off", + "import/no-extraneous-dependencies": "off" + } +} diff --git a/internals/scripts/BabelRegister.js b/internals/scripts/BabelRegister.js index bf41c5af..9608e76e 100644 --- a/internals/scripts/BabelRegister.js +++ b/internals/scripts/BabelRegister.js @@ -2,5 +2,5 @@ const path = require('path'); require('@babel/register')({ extensions: ['.es6', '.es', '.jsx', '.js', '.mjs', '.ts', '.tsx'], - cwd: path.join(__dirname, '..', '..'), + cwd: path.join(__dirname, '..', '..') }); diff --git a/internals/scripts/CheckBuildsExist.js b/internals/scripts/CheckBuildsExist.js new file mode 100644 index 00000000..802394c0 --- /dev/null +++ b/internals/scripts/CheckBuildsExist.js @@ -0,0 +1,30 @@ +// Check if the renderer and main bundles are built +import path from 'path'; +import chalk from 'chalk'; +import fs from 'fs'; + +const mainPath = path.join(__dirname, '..', '..', 'app', 'main.prod.js'); +const rendererPath = path.join( + __dirname, + '..', + '..', + 'app', + 'dist', + 'renderer.prod.js' +); + +if (!fs.existsSync(mainPath)) { + throw new Error( + chalk.whiteBright.bgRed.bold( + 'The main process is not built yet. Build it by running "yarn build-main"' + ) + ); +} + +if (!fs.existsSync(rendererPath)) { + throw new Error( + chalk.whiteBright.bgRed.bold( + 'The renderer process is not built yet. Build it by running "yarn build-renderer"' + ) + ); +} diff --git a/internals/scripts/CheckBuiltsExist.js b/internals/scripts/CheckBuiltsExist.js deleted file mode 100644 index 91510811..00000000 --- a/internals/scripts/CheckBuiltsExist.js +++ /dev/null @@ -1,28 +0,0 @@ -// @flow -// Check if the renderer and main bundles are built -import path from 'path'; -import chalk from 'chalk'; -import fs from 'fs'; - -function CheckBuildsExist() { - const mainPath = path.join(__dirname, '..', '..', 'app', 'main.prod.js'); - const rendererPath = path.join(__dirname, '..', '..', 'app', 'dist', 'renderer.prod.js'); - - if (!fs.existsSync(mainPath)) { - throw new Error( - chalk.whiteBright.bgRed.bold( - 'The main process is not built yet. Build it by running "npm run build-main"' - ) - ); - } - - if (!fs.existsSync(rendererPath)) { - throw new Error( - chalk.whiteBright.bgRed.bold( - 'The renderer process is not built yet. Build it by running "npm run build-renderer"' - ) - ); - } -} - -CheckBuildsExist(); diff --git a/internals/scripts/CheckNativeDep.js b/internals/scripts/CheckNativeDep.js index 578b6bed..1acf39ec 100644 --- a/internals/scripts/CheckNativeDep.js +++ b/internals/scripts/CheckNativeDep.js @@ -1,60 +1,49 @@ -// @flow import fs from 'fs'; import chalk from 'chalk'; import { execSync } from 'child_process'; import { dependencies } from '../../package.json'; -(() => { - if (!dependencies) return; - +if (dependencies) { const dependenciesKeys = Object.keys(dependencies); const nativeDeps = fs .readdirSync('node_modules') - .filter((folder) => fs.existsSync(`node_modules/${folder}/binding.gyp`)); - + .filter(folder => fs.existsSync(`node_modules/${folder}/binding.gyp`)); try { // Find the reason for why the dependency is installed. If it is installed // because of a devDependency then that is okay. Warn when it is installed // because of a dependency - const dependenciesObject = JSON.parse( + const { dependencies: dependenciesObject } = JSON.parse( execSync(`npm ls ${nativeDeps.join(' ')} --json`).toString() ); - const rootDependencies = Object.keys(dependenciesObject.dependencies); - const filteredRootDependencies = rootDependencies.filter((rootDependency) => + const rootDependencies = Object.keys(dependenciesObject); + const filteredRootDependencies = rootDependencies.filter(rootDependency => dependenciesKeys.includes(rootDependency) ); - if (filteredRootDependencies.length > 0) { const plural = filteredRootDependencies.length > 1; console.log(` - -${chalk.whiteBright.bgYellow.bold('Webpack does not work with native dependencies.')} + ${chalk.whiteBright.bgYellow.bold( + 'Webpack does not work with native dependencies.' + )} ${chalk.bold(filteredRootDependencies.join(', '))} ${ plural ? 'are native dependencies' : 'is a native dependency' } and should be installed inside of the "./app" folder. - - -First uninstall the packages from "./package.json": -${chalk.whiteBright.bgGreen.bold('npm uninstall your-package')} - -${chalk.bold('Then, instead of installing the package to the root "./package.json":')} -${chalk.whiteBright.bgRed.bold('npm install your-package --save')} - -${chalk.bold('Install the package to "./app/package.json"')} -${chalk.whiteBright.bgGreen.bold('cd ./app && npm install your-package --save')} - - -Read more about native dependencies at: + First, uninstall the packages from "./package.json": +${chalk.whiteBright.bgGreen.bold('yarn remove your-package')} + ${chalk.bold( + 'Then, instead of installing the package to the root "./package.json":' + )} +${chalk.whiteBright.bgRed.bold('yarn add your-package')} + ${chalk.bold('Install the package to "./app/package.json"')} +${chalk.whiteBright.bgGreen.bold('cd ./app && yarn add your-package')} + Read more about native dependencies at: ${chalk.bold( - 'https://github.com/chentsulin/electron-react-boilerplate/wiki/Module-Structure----Two-package.json-Structure' + 'https://electron-react-boilerplate.js.org/docs/adding-dependencies/#module-structure' )} - - -`); - + `); process.exit(1); } } catch (e) { console.log('Native dependencies could not be checked'); } -})(); +} diff --git a/internals/scripts/CheckNodeEnv.js b/internals/scripts/CheckNodeEnv.js index b2f50bcf..8acca0a2 100644 --- a/internals/scripts/CheckNodeEnv.js +++ b/internals/scripts/CheckNodeEnv.js @@ -1,7 +1,6 @@ -// @flow import chalk from 'chalk'; -export default function CheckNodeEnv(expectedEnv: string) { +export default function CheckNodeEnv(expectedEnv) { if (!expectedEnv) { throw new Error('"expectedEnv" not set'); } diff --git a/internals/scripts/CheckPortInUse.js b/internals/scripts/CheckPortInUse.js index a61be941..982ca49e 100644 --- a/internals/scripts/CheckPortInUse.js +++ b/internals/scripts/CheckPortInUse.js @@ -1,19 +1,16 @@ -// @flow import chalk from 'chalk'; import detectPort from 'detect-port'; -(function CheckPortInUse() { - const port: string = process.env.PORT || '1212'; +const port = process.env.PORT || '1212'; - detectPort(port, (err: ?Error, availablePort: number) => { - if (port !== String(availablePort)) { - throw new Error( - chalk.whiteBright.bgRed.bold( - `Port "${port}" on "localhost" is already in use. Please use another port. ex: PORT=4343 npm run dev` - ) - ); - } else { - process.exit(0); - } - }); -})(); +detectPort(port, (err, availablePort) => { + if (port !== String(availablePort)) { + throw new Error( + chalk.whiteBright.bgRed.bold( + `Port "${port}" on "localhost" is already in use. Please use another port. ex: PORT=4343 yarn dev` + ) + ); + } else { + process.exit(0); + } +}); diff --git a/internals/scripts/CheckYarn.js b/internals/scripts/CheckYarn.js new file mode 100644 index 00000000..aa5be8d1 --- /dev/null +++ b/internals/scripts/CheckYarn.js @@ -0,0 +1,5 @@ +if (!/yarn\.js$/.test(process.env.npm_execpath || '')) { + console.warn( + "\u001b[33mYou don't seem to be using yarn. This could produce unexpected results.\u001b[39m" + ); +} diff --git a/internals/scripts/DeleteSourceMaps.js b/internals/scripts/DeleteSourceMaps.js new file mode 100644 index 00000000..91bbb3a1 --- /dev/null +++ b/internals/scripts/DeleteSourceMaps.js @@ -0,0 +1,7 @@ +import path from 'path'; +import rimraf from 'rimraf'; + +export default function deleteSourceMaps() { + rimraf.sync(path.join(__dirname, '../../app/dist/*.js.map')); + rimraf.sync(path.join(__dirname, '../../app/*.js.map')); +} diff --git a/internals/scripts/ElectronRebuild.js b/internals/scripts/ElectronRebuild.js index adb858af..2bff677c 100644 --- a/internals/scripts/ElectronRebuild.js +++ b/internals/scripts/ElectronRebuild.js @@ -1,19 +1,22 @@ -// @flow import path from 'path'; import { execSync } from 'child_process'; import fs from 'fs'; -import dependencies from '../../app/package.json'; +import { dependencies } from '../../app/package.json'; const nodeModulesPath = path.join(__dirname, '..', '..', 'app', 'node_modules'); -if (Object.keys(dependencies || {}).length > 0 && fs.existsSync(nodeModulesPath)) { +if ( + Object.keys(dependencies || {}).length > 0 && + fs.existsSync(nodeModulesPath) +) { const electronRebuildCmd = '../node_modules/.bin/electron-rebuild --parallel --force --types prod,dev,optional --module-dir .'; - const cmd = - process.platform === 'win32' ? electronRebuildCmd.replace(/\//g, '\\') : electronRebuildCmd; - + process.platform === 'win32' + ? electronRebuildCmd.replace(/\//g, '\\') + : electronRebuildCmd; execSync(cmd, { cwd: path.join(__dirname, '..', '..', 'app'), + stdio: 'inherit' }); } diff --git a/internals/scripts/RunTests.js b/internals/scripts/RunTests.js deleted file mode 100644 index 45e0cd28..00000000 --- a/internals/scripts/RunTests.js +++ /dev/null @@ -1,13 +0,0 @@ -import spawn from 'cross-spawn'; -import path from 'path'; - -const pattern = - process.argv[2] === 'e2e' ? 'test/e2e/.+\\.spec\\.js' : 'test/(?!e2e/)[^/]+/.+\\.spec\\.js$'; - -const result = spawn.sync( - path.normalize('./node_modules/.bin/jest'), - [pattern, ...process.argv.slice(2)], - { stdio: 'inherit' } -); - -process.exit(result.status); diff --git a/test/.eslintrc.json b/test/.eslintrc.json new file mode 100644 index 00000000..9adaad74 --- /dev/null +++ b/test/.eslintrc.json @@ -0,0 +1,13 @@ +{ + "extends": "plugin:testcafe/recommended", + "env": { + "jest/globals": true + }, + "plugins": ["jest", "testcafe"], + "rules": { + "jest/no-disabled-tests": "warn", + "jest/no-focused-tests": "error", + "jest/no-identical-title": "error", + "no-console": "off" + } +} diff --git a/test/actions/__snapshots__/counter.spec.ts.snap b/test/actions/__snapshots__/counter.spec.ts.snap new file mode 100644 index 00000000..dc692275 --- /dev/null +++ b/test/actions/__snapshots__/counter.spec.ts.snap @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`actions should decrement should create decrement action 1`] = ` +Object { + "type": "DECREMENT_COUNTER", +} +`; + +exports[`actions should increment should create increment action 1`] = ` +Object { + "type": "INCREMENT_COUNTER", +} +`; diff --git a/test/actions/counter.spec.ts b/test/actions/counter.spec.ts new file mode 100644 index 00000000..0bdd6ea5 --- /dev/null +++ b/test/actions/counter.spec.ts @@ -0,0 +1,45 @@ +import { spy } from 'sinon'; +import * as actions from '../../app/actions/counter'; + +describe('actions', () => { + it('should increment should create increment action', () => { + expect(actions.increment()).toMatchSnapshot(); + }); + + it('should decrement should create decrement action', () => { + expect(actions.decrement()).toMatchSnapshot(); + }); + + it('should incrementIfOdd should create increment action', () => { + const fn = actions.incrementIfOdd(); + expect(fn).toBeInstanceOf(Function); + const dispatch = spy(); + const getState = () => ({ counter: 1 }); + fn(dispatch, getState); + expect(dispatch.calledWith({ type: actions.INCREMENT_COUNTER })).toBe(true); + }); + + it('should incrementIfOdd shouldnt create increment action if counter is even', () => { + const fn = actions.incrementIfOdd(); + const dispatch = spy(); + const getState = () => ({ counter: 2 }); + fn(dispatch, getState); + expect(dispatch.called).toBe(false); + }); + + // There's no nice way to test this at the moment... + it('should incrementAsync', () => { + return new Promise(resolve => { + const fn = actions.incrementAsync(1); + expect(fn).toBeInstanceOf(Function); + const dispatch = spy(); + fn(dispatch); + setTimeout(() => { + expect(dispatch.calledWith({ type: actions.INCREMENT_COUNTER })).toBe( + true + ); + resolve(); + }, 5); + }); + }); +}); diff --git a/test/components/Counter.spec.tsx b/test/components/Counter.spec.tsx new file mode 100644 index 00000000..05fda86a --- /dev/null +++ b/test/components/Counter.spec.tsx @@ -0,0 +1,71 @@ +/* eslint react/jsx-props-no-spreading: off */ +import { spy } from 'sinon'; +import React from 'react'; +import Enzyme, { shallow } from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; +import { BrowserRouter as Router } from 'react-router-dom'; +import renderer from 'react-test-renderer'; +import Counter from '../../app/components/Counter'; + +Enzyme.configure({ adapter: new Adapter() }); + +function setup() { + const actions = { + increment: spy(), + incrementIfOdd: spy(), + incrementAsync: spy(), + decrement: spy() + }; + const component = shallow(); + return { + component, + actions, + buttons: component.find('button'), + p: component.find('.counter') + }; +} + +describe('Counter component', () => { + it('should should display count', () => { + const { p } = setup(); + expect(p.text()).toMatch(/^1$/); + }); + + it('should first button should call increment', () => { + const { buttons, actions } = setup(); + buttons.at(0).simulate('click'); + expect(actions.increment.called).toBe(true); + }); + + it('should match exact snapshot', () => { + const { actions } = setup(); + const counter = ( +
+ + + +
+ ); + const tree = renderer.create(counter).toJSON(); + + expect(tree).toMatchSnapshot(); + }); + + it('should second button should call decrement', () => { + const { buttons, actions } = setup(); + buttons.at(1).simulate('click'); + expect(actions.decrement.called).toBe(true); + }); + + it('should third button should call incrementIfOdd', () => { + const { buttons, actions } = setup(); + buttons.at(2).simulate('click'); + expect(actions.incrementIfOdd.called).toBe(true); + }); + + it('should fourth button should call incrementAsync', () => { + const { buttons, actions } = setup(); + buttons.at(3).simulate('click'); + expect(actions.incrementAsync.called).toBe(true); + }); +}); diff --git a/test/components/__snapshots__/Counter.spec.tsx.snap b/test/components/__snapshots__/Counter.spec.tsx.snap new file mode 100644 index 00000000..2c98227d --- /dev/null +++ b/test/components/__snapshots__/Counter.spec.tsx.snap @@ -0,0 +1,67 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Counter component should match exact snapshot 1`] = ` +
+
+ +
+ 1 +
+
+ + + + +
+
+
+`; diff --git a/test/containers/CounterPage.spec.tsx b/test/containers/CounterPage.spec.tsx new file mode 100644 index 00000000..37d5b981 --- /dev/null +++ b/test/containers/CounterPage.spec.tsx @@ -0,0 +1,61 @@ +import React from 'react'; +import Enzyme, { mount } from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; +import { Provider } from 'react-redux'; +import { createBrowserHistory } from 'history'; +import { ConnectedRouter } from 'connected-react-router'; +import CounterPage from '../../app/containers/CounterPage'; +import { configureStore } from '../../app/store/configureStore'; + +Enzyme.configure({ adapter: new Adapter() }); + +function setup(initialState = {}) { + const store = configureStore(initialState); + const history = createBrowserHistory(); + const provider = ( + + + + + + ); + const app = mount(provider); + return { + app, + buttons: app.find('button'), + p: app.find('.counter') + }; +} + +describe('containers', () => { + describe('App', () => { + it('should display initial count', () => { + const { p } = setup(); + expect(p.text()).toMatch(/^0$/); + }); + + it('should display updated count after increment button click', () => { + const { buttons, p } = setup(); + buttons.at(0).simulate('click'); + expect(p.text()).toMatch(/^1$/); + }); + + it('should display updated count after decrement button click', () => { + const { buttons, p } = setup(); + buttons.at(1).simulate('click'); + expect(p.text()).toMatch(/^-1$/); + }); + + it('shouldnt change if even and if odd button clicked', () => { + const { buttons, p } = setup(); + buttons.at(2).simulate('click'); + expect(p.text()).toMatch(/^0$/); + }); + + it('should change if odd and if odd button clicked', () => { + const { buttons, p } = setup({ counter: 1 }); + buttons.at(2).simulate('click'); + expect(p.text()).toMatch(/^2$/); + }); + }); +}); diff --git a/test/e2e/HomePage.e2e.ts b/test/e2e/HomePage.e2e.ts new file mode 100644 index 00000000..4ea4edd9 --- /dev/null +++ b/test/e2e/HomePage.e2e.ts @@ -0,0 +1,97 @@ +/* eslint jest/expect-expect: off, jest/no-test-callback: off */ +import { ClientFunction, Selector } from 'testcafe'; +import { getPageUrl } from './helpers'; + +const getPageTitle = ClientFunction(() => document.title); +const counterSelector = Selector('[data-tid="counter"]'); +const buttonsSelector = Selector('[data-tclass="btn"]'); +const clickToCounterLink = t => + t.click(Selector('a').withExactText('to Counter')); +const incrementButton = buttonsSelector.nth(0); +const decrementButton = buttonsSelector.nth(1); +const oddButton = buttonsSelector.nth(2); +const asyncButton = buttonsSelector.nth(3); +const getCounterText = () => counterSelector().innerText; +const assertNoConsoleErrors = async t => { + const { error } = await t.getBrowserConsoleMessages(); + await t.expect(error).eql([]); +}; + +fixture`Home Page`.page('../../app/app.html').afterEach(assertNoConsoleErrors); + +test('e2e', async t => { + await t.expect(getPageTitle()).eql('Hello Electron React!'); +}); + +test('should open window and contain expected page title', async t => { + await t.expect(getPageTitle()).eql('Hello Electron React!'); +}); + +test( + 'should not have any logs in console of main window', + assertNoConsoleErrors +); + +test('should navigate to Counter with click on the "to Counter" link', async t => { + await t + .click('[data-tid=container] > a') + .expect(getCounterText()) + .eql('0'); +}); + +test('should navigate to /counter', async t => { + await t + .click('a') + .expect(getPageUrl()) + .contains('/counter'); +}); + +fixture`Counter Tests` + .page('../../app/app.html') + .beforeEach(clickToCounterLink) + .afterEach(assertNoConsoleErrors); + +test('should display updated count after the increment button click', async t => { + await t + .click(incrementButton) + .expect(getCounterText()) + .eql('1'); +}); + +test('should display updated count after the descrement button click', async t => { + await t + .click(decrementButton) + .expect(getCounterText()) + .eql('-1'); +}); + +test('should not change even counter if odd button clicked', async t => { + await t + .click(oddButton) + .expect(getCounterText()) + .eql('0'); +}); + +test('should change odd counter if odd button clicked', async t => { + await t + .click(incrementButton) + .click(oddButton) + .expect(getCounterText()) + .eql('2'); +}); + +test('should change if async button clicked and a second later', async t => { + await t + .click(asyncButton) + .expect(getCounterText()) + .eql('0') + .expect(getCounterText()) + .eql('1'); +}); + +test('should back to home if back button clicked', async t => { + await t + .click('[data-tid="backButton"] > a') + .expect(Selector('[data-tid="container"]').visible) + .ok(); +}); diff --git a/test/e2e/helpers.ts b/test/e2e/helpers.ts new file mode 100644 index 00000000..017a3445 --- /dev/null +++ b/test/e2e/helpers.ts @@ -0,0 +1,4 @@ +/* eslint import/prefer-default-export: off */ +import { ClientFunction } from 'testcafe'; + +export const getPageUrl = ClientFunction(() => window.location.href); diff --git a/test/reducers/__snapshots__/counter.spec.ts.snap b/test/reducers/__snapshots__/counter.spec.ts.snap new file mode 100644 index 00000000..9d78460b --- /dev/null +++ b/test/reducers/__snapshots__/counter.spec.ts.snap @@ -0,0 +1,9 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`reducers counter should handle DECREMENT_COUNTER 1`] = `0`; + +exports[`reducers counter should handle INCREMENT_COUNTER 1`] = `2`; + +exports[`reducers counter should handle initial state 1`] = `0`; + +exports[`reducers counter should handle unknown action type 1`] = `1`; diff --git a/test/reducers/counter.spec.ts b/test/reducers/counter.spec.ts new file mode 100644 index 00000000..f111c17a --- /dev/null +++ b/test/reducers/counter.spec.ts @@ -0,0 +1,25 @@ +import counter from '../../app/reducers/counter'; +import { + INCREMENT_COUNTER, + DECREMENT_COUNTER +} from '../../app/actions/counter'; + +describe('reducers', () => { + describe('counter', () => { + it('should handle initial state', () => { + expect(counter(undefined, {})).toMatchSnapshot(); + }); + + it('should handle INCREMENT_COUNTER', () => { + expect(counter(1, { type: INCREMENT_COUNTER })).toMatchSnapshot(); + }); + + it('should handle DECREMENT_COUNTER', () => { + expect(counter(1, { type: DECREMENT_COUNTER })).toMatchSnapshot(); + }); + + it('should handle unknown action type', () => { + expect(counter(1, { type: 'unknown' })).toMatchSnapshot(); + }); + }); +}); From 27b267a81e296862627499302edbba18cb7d9d95 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 21 Jun 2020 18:02:30 -0700 Subject: [PATCH 06/66] everything else --- .dockerignore | 6 +- .eslintignore | 11 +- .eslintrc.js | 84 ++----------- .gitignore | 61 ++-------- .npmrc | 2 - .nvmrc | 1 - .prettierrc.yaml | 9 -- .stylelintrc | 3 - .travis.yml | 42 ------- babel.config.js | 62 ++++++++++ babel.config.json | 34 ------ flow-typed/module_vx.x.x.js | 3 - package.json | 66 +++++++--- test/.eslintrc | 13 -- .../__snapshots__/counter.spec.js.snap | 13 -- .../__snapshots__/counter.spec.ts.snap | 13 -- test/actions/counter.spec.js | 41 ------- test/components/Counter.spec.js | 70 ----------- .../__snapshots__/Counter.spec.js.snap | 63 ---------- .../__snapshots__/Counter.spec.tsx.snap | 67 ----------- test/containers/CounterPage.spec.js | 61 ---------- test/e2e/e2e.spec.js | 113 ------------------ test/example.js | 5 - .../__snapshots__/counter.spec.js.snap | 9 -- .../__snapshots__/counter.spec.ts.snap | 9 -- test/reducers/counter.spec.js | 22 ---- 26 files changed, 136 insertions(+), 747 deletions(-) delete mode 100644 .npmrc delete mode 100644 .nvmrc delete mode 100644 .prettierrc.yaml delete mode 100644 .stylelintrc delete mode 100644 .travis.yml create mode 100644 babel.config.js delete mode 100644 babel.config.json delete mode 100644 flow-typed/module_vx.x.x.js delete mode 100644 test/.eslintrc delete mode 100644 test/actions/__snapshots__/counter.spec.js.snap delete mode 100644 test/actions/__snapshots__/counter.spec.ts.snap delete mode 100644 test/actions/counter.spec.js delete mode 100644 test/components/Counter.spec.js delete mode 100644 test/components/__snapshots__/Counter.spec.js.snap delete mode 100644 test/components/__snapshots__/Counter.spec.tsx.snap delete mode 100644 test/containers/CounterPage.spec.js delete mode 100644 test/e2e/e2e.spec.js delete mode 100644 test/example.js delete mode 100644 test/reducers/__snapshots__/counter.spec.js.snap delete mode 100644 test/reducers/__snapshots__/counter.spec.ts.snap delete mode 100644 test/reducers/counter.spec.js diff --git a/.dockerignore b/.dockerignore index 18cba3ef..8618fd34 100644 --- a/.dockerignore +++ b/.dockerignore @@ -31,10 +31,6 @@ app/node_modules # OSX .DS_Store -# flow-typed -flow-typed/npm/* -!flow-typed/npm/module_vx.x.x.js - # App packaged release app/main.prod.js @@ -50,4 +46,4 @@ main.js.map .idea npm-debug.log.* -.*.dockerfile \ No newline at end of file +.*.dockerfile diff --git a/.eslintignore b/.eslintignore index 3f90da49..efe3eacb 100644 --- a/.eslintignore +++ b/.eslintignore @@ -31,10 +31,6 @@ app/node_modules # OSX .DS_Store -# flow-typed -flow-typed/npm/* -!flow-typed/npm/module_vx.x.x.js - # App packaged release app/main.prod.js @@ -51,3 +47,10 @@ main.js.map .idea npm-debug.log.* __snapshots__ + +# Package.json +package.json +.travis.yml +*.css.d.ts +*.sass.d.ts +*.scss.d.ts diff --git a/.eslintrc.js b/.eslintrc.js index 4be65fdd..38f99fff 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,84 +1,16 @@ module.exports = { - parser: 'babel-eslint', - parserOptions: { - sourceType: 'module', - allowImportExportEverywhere: true, - }, - extends: ['airbnb', 'prettier'], - env: { - browser: true, - node: true, - }, + extends: 'erb/typescript', rules: { - 'arrow-parens': ['off'], - 'compat/compat': 'error', - 'consistent-return': 'off', - 'comma-dangle': 'off', - 'generator-star-spacing': 'off', - 'flowtype/object-type-delimiter': 'off', - 'flowtype/no-weak-types': 'warn', - 'import/no-unresolved': 'error', - 'import/no-extraneous-dependencies': 'off', - 'jsx-a11y/anchor-is-valid': 'off', - 'no-console': 'off', - 'no-use-before-define': 'off', - 'no-multi-assign': 'off', - 'no-plusplus': 'off', - 'no-param-reassign': 'warn', - 'promise/param-names': 'error', - 'promise/always-return': 'error', - 'promise/catch-or-return': 'error', - 'promise/no-native': 'off', - 'prefer-destructuring': 'off', - 'react/no-will-update-set-state': 'warn', - 'react/no-did-mount-set-state': 'warn', - 'react/no-did-update-set-state': 'warn', - 'react/sort-comp': [ - 'error', - { - order: ['type-annotations', 'static-methods', 'lifecycle', 'everything-else', 'render'], - }, - ], - 'react/jsx-no-bind': 'off', - 'react/jsx-filename-extension': ['error', { extensions: ['.js', '.jsx'] }], - 'react/prefer-stateless-function': 'off', - 'linebreak-style': 'off', - 'jsx-a11y/click-events-have-key-events': 'off', - 'flowtype/boolean-style': ['error', 'boolean'], - 'flowtype/define-flow-type': 'warn', - 'flowtype/delimiter-dangle': 'off', - 'flowtype/generic-spacing': ['error', 'never'], - 'flowtype/no-primitive-constructor-types': 'error', - 'flowtype/no-weak-types': 'warn', - 'flowtype/object-type-delimiter': ['off'], - 'flowtype/require-parameter-type': 'off', - 'flowtype/require-return-type': 'off', - 'flowtype/require-valid-file-annotation': 'off', - 'flowtype/semi': ['error', 'always'], - 'flowtype/space-after-type-colon': ['error', 'always'], - 'flowtype/space-before-generic-bracket': ['error', 'never'], - 'flowtype/space-before-type-colon': ['error', 'never'], - 'flowtype/union-intersection-spacing': ['error', 'always'], - 'flowtype/use-flow-type': 'error', - 'flowtype/valid-syntax': 'error', - 'react/no-will-update-set-state': 'warn', - 'react/destructuring-assignment': 'off', - 'react/jsx-props-no-spreading': 'warn', - 'react/jsx-wrap-multilines': 'off', - 'react/jsx-one-expression-per-line': 'off', - 'import/order': 'off', - 'max-classes-per-file': 'off', - 'dot-notation': 'off', - 'linebreak-style': 0, - 'import/prefer-default-export': 0, + // A temporary hack related to IDE not resolving correct package.json + 'import/no-extraneous-dependencies': 'off' }, - plugins: ['flowtype', 'import', 'promise', 'compat', 'react'], settings: { 'import/resolver': { + // See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below node: {}, webpack: { - config: require.resolve('./webpack.config.eslint.js'), - }, - }, - }, + config: require.resolve('./configs/webpack.config.eslint.js') + } + } + } }; diff --git a/.gitignore b/.gitignore index 360a787b..86b8b644 100644 --- a/.gitignore +++ b/.gitignore @@ -1,27 +1,11 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Jupyter stuff -.ipynb_checkpoints -__pycache__ - # Runtime data pids *.pid *.seed -*.pid.lock - -# Auto-generated files -#yarn.lock -#package-lock.json - -# flow-typed -flow-typed/npm # Directory for instrumented libs generated by jscoverage/JSCover lib-cov @@ -29,49 +13,22 @@ lib-cov # Coverage directory used by tools like istanbul coverage -# nyc test coverage -.nyc_output - # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt -# Bower dependency directory (https://bower.io/) -bower_components - # node-waf configuration .lock-wscript -# Compiled binary addons (https://nodejs.org/api/addons.html) +# Compiled binary addons (http://nodejs.org/api/addons.html) build/Release - -# Dependency directories -node_modules/ -jspm_packages/ -app/utils/pyodide/src/ - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache .eslintcache -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules -# next.js build output -.next +# OSX +.DS_Store # App packaged release @@ -82,13 +39,13 @@ app/renderer.prod.js.map app/style.css app/style.css.map dist -app/dist dll -dll/renderer.dev.dll.js -dll/renderer.json main.js main.js.map .idea npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts keys.js diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 96501666..00000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -registry=http://registry.npmjs.org/ -package-lock=true diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index 02a819f2..00000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v7 diff --git a/.prettierrc.yaml b/.prettierrc.yaml deleted file mode 100644 index 28fccf9d..00000000 --- a/.prettierrc.yaml +++ /dev/null @@ -1,9 +0,0 @@ -tabWidth: 2 -useTabs: false -arrowParens: always -bracketSpacing: true -jsxSingleQuote: true -printWidth: 100 -semi: true -singleQuote: true -trailingComma: es5 diff --git a/.stylelintrc b/.stylelintrc deleted file mode 100644 index 40db42c6..00000000 --- a/.stylelintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "stylelint-config-standard" -} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 6bc30ff3..00000000 --- a/.travis.yml +++ /dev/null @@ -1,42 +0,0 @@ -sudo: true - -language: node_js - -node_js: - - node - - 9 - -cache: - yarn: true - directories: - - node_modules - - app/node_modules - -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-4.8 - - icnsutils - - graphicsmagick - - xz-utils - - xorriso - -install: - - export CXX="g++-4.8" - - yarn - - cd app && yarn && cd .. - - '/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16' - -before_script: - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start & - - sleep 3 - -script: - - node --version - - yarn lint - - yarn package - - yarn test - - yarn test-e2e diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 00000000..51d89736 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,62 @@ +/* eslint global-require: off, import/no-extraneous-dependencies: off */ + +const developmentEnvironments = ['development', 'test']; + +const developmentPlugins = [require('react-hot-loader/babel')]; + +const productionPlugins = [ + require('babel-plugin-dev-expression'), + + // babel-preset-react-optimize + require('@babel/plugin-transform-react-constant-elements'), + require('@babel/plugin-transform-react-inline-elements'), + require('babel-plugin-transform-react-remove-prop-types') +]; + +module.exports = api => { + // See docs about api at https://babeljs.io/docs/en/config-files#apicache + + const development = api.env(developmentEnvironments); + + return { + presets: [ + // @babel/preset-env will automatically target our browserslist targets + require('@babel/preset-env'), + require('@babel/preset-typescript'), + [require('@babel/preset-react'), { development }] + ], + plugins: [ + // Stage 0 + require('@babel/plugin-proposal-function-bind'), + + // Stage 1 + require('@babel/plugin-proposal-export-default-from'), + require('@babel/plugin-proposal-logical-assignment-operators'), + [require('@babel/plugin-proposal-optional-chaining'), { loose: false }], + [ + require('@babel/plugin-proposal-pipeline-operator'), + { proposal: 'minimal' } + ], + [ + require('@babel/plugin-proposal-nullish-coalescing-operator'), + { loose: false } + ], + require('@babel/plugin-proposal-do-expressions'), + + // Stage 2 + [require('@babel/plugin-proposal-decorators'), { legacy: true }], + require('@babel/plugin-proposal-function-sent'), + require('@babel/plugin-proposal-export-namespace-from'), + require('@babel/plugin-proposal-numeric-separator'), + require('@babel/plugin-proposal-throw-expressions'), + + // Stage 3 + require('@babel/plugin-syntax-dynamic-import'), + require('@babel/plugin-syntax-import-meta'), + [require('@babel/plugin-proposal-class-properties'), { loose: true }], + require('@babel/plugin-proposal-json-strings'), + + ...(development ? developmentPlugins : productionPlugins) + ] + }; +}; diff --git a/babel.config.json b/babel.config.json deleted file mode 100644 index 9212334c..00000000 --- a/babel.config.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "presets": [ - [ - "@babel/preset-env", - { - "targets": { "node": 8 }, - "useBuiltIns": false - } - ], - "@babel/preset-react", - ["@babel/preset-flow"] - ], - "plugins": [ - "@babel/plugin-proposal-optional-catch-binding", - ["@babel/plugin-proposal-decorators", { "legacy": true }], - ["@babel/plugin-proposal-class-properties", { "loose": true }] - ], - "env": { - "production": { - "plugins": ["babel-plugin-dev-expression"] - }, - "development": { - "plugins": [ - [ - "babel-plugin-flow-runtime", - { - "assert": true, - "annotate": true - } - ] - ] - } - } -} diff --git a/flow-typed/module_vx.x.x.js b/flow-typed/module_vx.x.x.js deleted file mode 100644 index 734bb1c7..00000000 --- a/flow-typed/module_vx.x.x.js +++ /dev/null @@ -1,3 +0,0 @@ -declare module 'module' { - declare module.exports: any; -} diff --git a/package.json b/package.json index ebb7c8a4..d954e965 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,9 @@ "test-watch": "yarn test --watch" }, "lint-staged": { - "*.{js,jsx,ts,tsx}": ["cross-env NODE_ENV=development eslint --cache"], + "*.{js,jsx,ts,tsx}": [ + "cross-env NODE_ENV=development eslint --cache" + ], "{*.json,.{babelrc,eslintrc,prettierrc,stylelintrc}}": [ "prettier --ignore-path .eslintignore --parser json --write" ], @@ -74,10 +76,17 @@ ] }, "win": { - "target": ["nsis", "msi"] + "target": [ + "nsis", + "msi" + ] }, "linux": { - "target": ["deb", "rpm", "AppImage"], + "target": [ + "deb", + "rpm", + "AppImage" + ], "category": "Education" }, "directories": { @@ -134,9 +143,20 @@ "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/internals/mocks/fileMock.js", "\\.(css|less|sass|scss)$": "identity-obj-proxy" }, - "moduleFileExtensions": ["js", "jsx", "ts", "tsx", "json"], - "moduleDirectories": ["node_modules", "app/node_modules"], - "setupFiles": ["./internals/scripts/CheckBuildsExist.js"] + "moduleFileExtensions": [ + "js", + "jsx", + "ts", + "tsx", + "json" + ], + "moduleDirectories": [ + "node_modules", + "app/node_modules" + ], + "setupFiles": [ + "./internals/scripts/CheckBuildsExist.js" + ] }, "devDependencies": { "@babel/core": "^7.10.2", @@ -200,7 +220,7 @@ "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.2", "enzyme-to-json": "^3.4.4", - "eslint": "^7.2.0", + "eslint": "7.2.0", "eslint-config-airbnb-typescript": "^6.3.1", "eslint-config-erb": "^0.3.0", "eslint-config-prettier": "^6.11.0", @@ -251,8 +271,8 @@ "yarn": "^1.21.1" }, "dependencies": { - "@babel/runtime-corejs2": "^7.10.2", "@babel/runtime": "7.10.2", + "@babel/runtime-corejs2": "^7.10.2", "@fortawesome/fontawesome-free": "^5.13.0", "@hot-loader/react-dom": "^16.13.0", "@nteract/messaging": "^7.0.7", @@ -270,8 +290,8 @@ "history": "^5.0.0", "kernelspecs": "^2.0.0", "lab.js": "^20.0.1", - "lodash.clonedeep": "^4.5.0", "lodash": "^4.17.15", + "lodash.clonedeep": "^4.5.0", "mkdirp": "^1.0.4", "moment": "^2.26.0", "mousetrap": "^1.6.5", @@ -279,20 +299,20 @@ "papaparse": "^5.2.0", "plotly.js": "^1.54.2", "rc-slider": "^9.3.1", + "react": "^16.13.1", "react-dom": "^16.13.1", "react-hot-loader": "^4.12.19", "react-plotly.js": "^2.4.0", "react-redux": "^7.2.0", + "react-router": "^5.2.0", "react-router-dom": "^5.2.0", "react-router-redux": "^5.0.0-alpha.9", - "react-router": "^5.2.0", "react-toastify": "^6.0.5", - "react": "^16.13.1", "recursive-readdir": "^2.2.2", - "redux-observable": "^1.2.0", "redux": "^4.0.5", - "rxjs-compat": "^6.5.5", + "redux-observable": "^1.2.0", "rxjs": "^6.5.5", + "rxjs-compat": "^6.5.5", "semantic-ui-css": "^2.4.1", "semantic-ui-react": "^0.88.2", "simple-statistics": "^7.1.0", @@ -306,11 +326,18 @@ "npm": ">=4.x", "yarn": ">=0.21.3" }, - "browserslist": ["extends browserslist-config-erb"], + "browserslist": [ + "extends browserslist-config-erb" + ], "prettier": { "overrides": [ { - "files": [".prettierrc", ".babelrc", ".eslintrc", ".stylelintrc"], + "files": [ + ".prettierrc", + ".babelrc", + ".eslintrc", + ".stylelintrc" + ], "options": { "parser": "json" } @@ -319,10 +346,15 @@ "singleQuote": true }, "stylelint": { - "extends": ["stylelint-config-standard", "stylelint-config-prettier"] + "extends": [ + "stylelint-config-standard", + "stylelint-config-prettier" + ] }, "renovate": { - "extends": ["bliss"] + "extends": [ + "bliss" + ] }, "husky": { "hooks": { diff --git a/test/.eslintrc b/test/.eslintrc deleted file mode 100644 index 89ab59d9..00000000 --- a/test/.eslintrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "env": { - "jest/globals": true - }, - "plugins": [ - "jest" - ], - "rules": { - "jest/no-disabled-tests": "warn", - "jest/no-focused-tests": "error", - "jest/no-identical-title": "error" - } -} diff --git a/test/actions/__snapshots__/counter.spec.js.snap b/test/actions/__snapshots__/counter.spec.js.snap deleted file mode 100644 index dc692275..00000000 --- a/test/actions/__snapshots__/counter.spec.js.snap +++ /dev/null @@ -1,13 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`actions should decrement should create decrement action 1`] = ` -Object { - "type": "DECREMENT_COUNTER", -} -`; - -exports[`actions should increment should create increment action 1`] = ` -Object { - "type": "INCREMENT_COUNTER", -} -`; diff --git a/test/actions/__snapshots__/counter.spec.ts.snap b/test/actions/__snapshots__/counter.spec.ts.snap deleted file mode 100644 index dc692275..00000000 --- a/test/actions/__snapshots__/counter.spec.ts.snap +++ /dev/null @@ -1,13 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`actions should decrement should create decrement action 1`] = ` -Object { - "type": "DECREMENT_COUNTER", -} -`; - -exports[`actions should increment should create increment action 1`] = ` -Object { - "type": "INCREMENT_COUNTER", -} -`; diff --git a/test/actions/counter.spec.js b/test/actions/counter.spec.js deleted file mode 100644 index 69355f83..00000000 --- a/test/actions/counter.spec.js +++ /dev/null @@ -1,41 +0,0 @@ -import { spy } from 'sinon'; -import * as actions from '../../app/actions/counter'; - -describe('actions', () => { - it('should increment should create increment action', () => { - expect(actions.increment()).toMatchSnapshot(); - }); - - it('should decrement should create decrement action', () => { - expect(actions.decrement()).toMatchSnapshot(); - }); - - it('should incrementIfOdd should create increment action', () => { - const fn = actions.incrementIfOdd(); - expect(fn).toBeInstanceOf(Function); - const dispatch = spy(); - const getState = () => ({ counter: 1 }); - fn(dispatch, getState); - expect(dispatch.calledWith({ type: actions.INCREMENT_COUNTER })).toBe(true); - }); - - it('should incrementIfOdd shouldnt create increment action if counter is even', () => { - const fn = actions.incrementIfOdd(); - const dispatch = spy(); - const getState = () => ({ counter: 2 }); - fn(dispatch, getState); - expect(dispatch.called).toBe(false); - }); - - // There's no nice way to test this at the moment... - it('should incrementAsync', (done) => { - const fn = actions.incrementAsync(1); - expect(fn).toBeInstanceOf(Function); - const dispatch = spy(); - fn(dispatch); - setTimeout(() => { - expect(dispatch.calledWith({ type: actions.INCREMENT_COUNTER })).toBe(true); - done(); - }, 5); - }); -}); diff --git a/test/components/Counter.spec.js b/test/components/Counter.spec.js deleted file mode 100644 index aa46d72c..00000000 --- a/test/components/Counter.spec.js +++ /dev/null @@ -1,70 +0,0 @@ -import { spy } from 'sinon'; -import React from 'react'; -import Enzyme, { shallow } from 'enzyme'; -import Adapter from 'enzyme-adapter-react-16'; -import { BrowserRouter as Router } from 'react-router-dom'; -import renderer from 'react-test-renderer'; -import Counter from '../../app/components/Counter'; - -Enzyme.configure({ adapter: new Adapter() }); - -function setup() { - const actions = { - increment: spy(), - incrementIfOdd: spy(), - incrementAsync: spy(), - decrement: spy(), - }; - const component = shallow(); - return { - component, - actions, - buttons: component.find('button'), - p: component.find('.counter'), - }; -} - -describe('Counter component', () => { - it('should should display count', () => { - const { p } = setup(); - expect(p.text()).toMatch(/^1$/); - }); - - it('should first button should call increment', () => { - const { buttons, actions } = setup(); - buttons.at(0).simulate('click'); - expect(actions.increment.called).toBe(true); - }); - - it('should match exact snapshot', () => { - const { actions } = setup(); - const counter = ( -
- - - -
- ); - const tree = renderer.create(counter).toJSON(); - - expect(tree).toMatchSnapshot(); - }); - - it('should second button should call decrement', () => { - const { buttons, actions } = setup(); - buttons.at(1).simulate('click'); - expect(actions.decrement.called).toBe(true); - }); - - it('should third button should call incrementIfOdd', () => { - const { buttons, actions } = setup(); - buttons.at(2).simulate('click'); - expect(actions.incrementIfOdd.called).toBe(true); - }); - - it('should fourth button should call incrementAsync', () => { - const { buttons, actions } = setup(); - buttons.at(3).simulate('click'); - expect(actions.incrementAsync.called).toBe(true); - }); -}); diff --git a/test/components/__snapshots__/Counter.spec.js.snap b/test/components/__snapshots__/Counter.spec.js.snap deleted file mode 100644 index 514ced60..00000000 --- a/test/components/__snapshots__/Counter.spec.js.snap +++ /dev/null @@ -1,63 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Counter component should match exact snapshot 1`] = ` -
-
-
- - - -
-
- 1 -
-
- - - - -
-
-
-`; diff --git a/test/components/__snapshots__/Counter.spec.tsx.snap b/test/components/__snapshots__/Counter.spec.tsx.snap deleted file mode 100644 index 2c98227d..00000000 --- a/test/components/__snapshots__/Counter.spec.tsx.snap +++ /dev/null @@ -1,67 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Counter component should match exact snapshot 1`] = ` -
-
-
- - - -
-
- 1 -
-
- - - - -
-
-
-`; diff --git a/test/containers/CounterPage.spec.js b/test/containers/CounterPage.spec.js deleted file mode 100644 index d2902751..00000000 --- a/test/containers/CounterPage.spec.js +++ /dev/null @@ -1,61 +0,0 @@ -import React from 'react'; -import Enzyme, { mount } from 'enzyme'; -import Adapter from 'enzyme-adapter-react-16'; -import { Provider } from 'react-redux'; -import { createBrowserHistory } from 'history'; -import { ConnectedRouter } from 'react-router-redux'; -import CounterPage from '../../app/containers/CounterPage'; -import { configureStore } from '../../app/store/configureStore'; - -Enzyme.configure({ adapter: new Adapter() }); - -function setup(initialState) { - const store = configureStore(initialState); - const history = createBrowserHistory(); - const provider = ( - - - - - - ); - const app = mount(provider); - return { - app, - buttons: app.find('button'), - p: app.find('.counter'), - }; -} - -describe('containers', () => { - describe('App', () => { - it('should display initial count', () => { - const { p } = setup(); - expect(p.text()).toMatch(/^0$/); - }); - - it('should display updated count after increment button click', () => { - const { buttons, p } = setup(); - buttons.at(0).simulate('click'); - expect(p.text()).toMatch(/^1$/); - }); - - it('should display updated count after decrement button click', () => { - const { buttons, p } = setup(); - buttons.at(1).simulate('click'); - expect(p.text()).toMatch(/^-1$/); - }); - - it('shouldnt change if even and if odd button clicked', () => { - const { buttons, p } = setup(); - buttons.at(2).simulate('click'); - expect(p.text()).toMatch(/^0$/); - }); - - it('should change if odd and if odd button clicked', () => { - const { buttons, p } = setup({ counter: 1 }); - buttons.at(2).simulate('click'); - expect(p.text()).toMatch(/^2$/); - }); - }); -}); diff --git a/test/e2e/e2e.spec.js b/test/e2e/e2e.spec.js deleted file mode 100644 index a0a3b130..00000000 --- a/test/e2e/e2e.spec.js +++ /dev/null @@ -1,113 +0,0 @@ -import { Application } from 'spectron'; -import electronPath from 'electron'; -import path from 'path'; - -jasmine.DEFAULT_TIMEOUT_INTERVAL = 15000; - -const delay = (time) => new Promise((resolve) => setTimeout(resolve, time)); - -describe('main window', function spec() { - beforeAll(async () => { - this.app = new Application({ - path: electronPath, - args: [path.join(__dirname, '..', '..', 'app')], - }); - - return this.app.start(); - }); - - afterAll(() => { - if (this.app && this.app.isRunning()) { - return this.app.stop(); - } - }); - - const findCounter = () => this.app.client.element('[data-tid="counter"]'); - - const findButtons = async () => { - const { value } = await this.app.client.elements('[data-tclass="btn"]'); - return value.map((btn) => btn.ELEMENT); - }; - - it('should open window', async () => { - const { client, browserWindow } = this.app; - - await client.waitUntilWindowLoaded(); - await delay(500); - const title = await browserWindow.getTitle(); - expect(title).toBe('Hello Electron React!'); - }); - - it("should haven't any logs in console of main window", async () => { - const { client } = this.app; - const logs = await client.getRenderProcessLogs(); - // Print renderer process logs - logs.forEach((log) => { - console.log(log.message); - console.log(log.source); - console.log(log.level); - expect(log.level).not.toEqual('SEVERE'); - }); - // @NOTE: Temporarily have to disable this assertion because there are some warnings in - // electron@2. Loading files from localhost in development uses http and this causes - // electron to throw warnings - // expect(logs).toHaveLength(0); - }); - - it('should to Counter with click "to Counter" link', async () => { - const { client } = this.app; - - await client.click('[data-tid=container] > a'); - expect(await findCounter().getText()).toBe('0'); - }); - - it('should display updated count after increment button click', async () => { - const { client } = this.app; - - const buttons = await findButtons(); - await client.elementIdClick(buttons[0]); // + - expect(await findCounter().getText()).toBe('1'); - }); - - it('should display updated count after descrement button click', async () => { - const { client } = this.app; - - const buttons = await findButtons(); - await client.elementIdClick(buttons[1]); // - - expect(await findCounter().getText()).toBe('0'); - }); - - it('shouldnt change if even and if odd button clicked', async () => { - const { client } = this.app; - - const buttons = await findButtons(); - await client.elementIdClick(buttons[2]); // odd - expect(await findCounter().getText()).toBe('0'); - }); - - it('should change if odd and if odd button clicked', async () => { - const { client } = this.app; - - const buttons = await findButtons(); - await client.elementIdClick(buttons[0]); // + - await client.elementIdClick(buttons[2]); // odd - expect(await findCounter().getText()).toBe('2'); - }); - - it('should change if async button clicked and a second later', async () => { - const { client } = this.app; - - const buttons = await findButtons(); - await client.elementIdClick(buttons[3]); // async - expect(await findCounter().getText()).toBe('2'); - await delay(3000); - expect(await findCounter().getText()).toBe('3'); - }); - - it('should back to home if back button clicked', async () => { - const { client } = this.app; - await client.element('[data-tid="backButton"] > a').click(); - - expect(await client.isExisting('[data-tid="container"]')).toBe(true); - }); -}); diff --git a/test/example.js b/test/example.js deleted file mode 100644 index e73ab5b9..00000000 --- a/test/example.js +++ /dev/null @@ -1,5 +0,0 @@ -describe('description', () => { - it('should have description', () => { - expect(1 + 2).toBe(3); - }); -}); diff --git a/test/reducers/__snapshots__/counter.spec.js.snap b/test/reducers/__snapshots__/counter.spec.js.snap deleted file mode 100644 index 9d78460b..00000000 --- a/test/reducers/__snapshots__/counter.spec.js.snap +++ /dev/null @@ -1,9 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`reducers counter should handle DECREMENT_COUNTER 1`] = `0`; - -exports[`reducers counter should handle INCREMENT_COUNTER 1`] = `2`; - -exports[`reducers counter should handle initial state 1`] = `0`; - -exports[`reducers counter should handle unknown action type 1`] = `1`; diff --git a/test/reducers/__snapshots__/counter.spec.ts.snap b/test/reducers/__snapshots__/counter.spec.ts.snap deleted file mode 100644 index 9d78460b..00000000 --- a/test/reducers/__snapshots__/counter.spec.ts.snap +++ /dev/null @@ -1,9 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`reducers counter should handle DECREMENT_COUNTER 1`] = `0`; - -exports[`reducers counter should handle INCREMENT_COUNTER 1`] = `2`; - -exports[`reducers counter should handle initial state 1`] = `0`; - -exports[`reducers counter should handle unknown action type 1`] = `1`; diff --git a/test/reducers/counter.spec.js b/test/reducers/counter.spec.js deleted file mode 100644 index 9dc334d2..00000000 --- a/test/reducers/counter.spec.js +++ /dev/null @@ -1,22 +0,0 @@ -import counter from '../../app/reducers/counter'; -import { INCREMENT_COUNTER, DECREMENT_COUNTER } from '../../app/actions/counter'; - -describe('reducers', () => { - describe('counter', () => { - it('should handle initial state', () => { - expect(counter(undefined, {})).toMatchSnapshot(); - }); - - it('should handle INCREMENT_COUNTER', () => { - expect(counter(1, { type: INCREMENT_COUNTER })).toMatchSnapshot(); - }); - - it('should handle DECREMENT_COUNTER', () => { - expect(counter(1, { type: DECREMENT_COUNTER })).toMatchSnapshot(); - }); - - it('should handle unknown action type', () => { - expect(counter(1, { type: 'unknown' })).toMatchSnapshot(); - }); - }); -}); From 9e1fb537008072ddf7b9a7461de8a6246e769be2 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 21 Jun 2020 18:02:52 -0700 Subject: [PATCH 07/66] deps --- app/yarn.lock | 1900 +++++ yarn.lock | 19290 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 21190 insertions(+) create mode 100644 app/yarn.lock create mode 100644 yarn.lock diff --git a/app/yarn.lock b/app/yarn.lock new file mode 100644 index 00000000..d3440ba8 --- /dev/null +++ b/app/yarn.lock @@ -0,0 +1,1900 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/register@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.3.tgz#b49b6603fc8d214cd2f77a6ed2256bd198b5994b" + integrity sha512-s1il0vdd02HCGwV1iocGJEzcbTNouZqMolSXKXFAiTNJSudPas9jdLQwyPPyAJxdNL6KGJ8pwWIOpKmgO/JWqg== + dependencies: + find-cache-dir "^2.0.0" + lodash "^4.17.13" + make-dir "^2.1.0" + pirates "^4.0.0" + source-map-support "^0.5.16" + +"@babel/runtime-corejs2@^7.10.2": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.10.3.tgz#81bc99a96bfcb6db3f0dcf73fdc577cc554d341b" + integrity sha512-enKvnR/kKFbZFgXYo165wtSA5OeiTlgsnU4jV3vpKRhfWUJjLS6dfVcjIPeRcgJbgEgdgu0I+UyBWqu6c0GumQ== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" + integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== + dependencies: + regenerator-runtime "^0.13.4" + +"@neurosity/pipes@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@neurosity/pipes/-/pipes-3.2.3.tgz#acc71f9f965c5ba96dd1ba9d1ca9785924217b5e" + integrity sha512-aDa/iTe7OUbwgFFnRgGcB/hTgBdkr21E5vQbpOXZpByQijB4czGDgXJfFtI3zuLKST3bZuiQ7/ZPBA3+P8GENA== + dependencies: + dsp.js "^1.0.1" + fili "^2.0.1" + rxjs "^6.3.1" + +"@nteract/commutable@^7.2.12": + version "7.2.12" + resolved "https://registry.yarnpkg.com/@nteract/commutable/-/commutable-7.2.12.tgz#a4b6bafd582e0de7a095f57bf537ac18de1691d1" + integrity sha512-6cgjLkH5/xButb1VQEGwHxBa93GBAShyJFyG2jMYONZqy6vPU2MwlMRQYA1aaa16LsOcei1FFf7DKOBWYkue3g== + dependencies: + immutable "^4.0.0-rc.12" + uuid "^8.0.0" + +"@nteract/messaging@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@nteract/messaging/-/messaging-7.0.7.tgz#6052f9b20be782fb39d1a3e5fbd941dae90586e5" + integrity sha512-ucfiyQf48ecYOKrIUrIwb20LfPhx2YdM0iSejVycM7QR3CP8V3p4CccdCjcJHbv7aI9RgfgGp4FUp8Exbh3weA== + dependencies: + "@nteract/types" "^6.0.7" + "@types/uuid" "^8.0.0" + lodash.clonedeep "^4.5.0" + rxjs "^6.3.3" + uuid "^8.0.0" + +"@nteract/types@^6.0.7": + version "6.0.7" + resolved "https://registry.yarnpkg.com/@nteract/types/-/types-6.0.7.tgz#5a9b458c376cb81feca875b684696c32a9769642" + integrity sha512-sv4X97iXVHXVoPBl2m/xxO396GwujUSfm+7Cx6W5ziGUxSBjs4ydGTn2Uy6zv1MRa7Gwv9uJ/Sl8hgm7vY80Tw== + dependencies: + "@nteract/commutable" "^7.2.12" + immutable "^4.0.0-rc.12" + rxjs "^6.3.3" + uuid "^8.0.0" + +"@types/uuid@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.0.0.tgz#165aae4819ad2174a17476dbe66feebd549556c0" + integrity sha512-xSQfNcvOiE5f9dyd4Kzxbof1aTrLobL278pGLKOZI6esGfZ7ts9Ka16CzIN6Y8hFHE1C7jIBZokULhK1bOgjRw== + +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bindings@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.2.tgz#52b71e9088515d0606d9dd9cc7aa48dc1f98e73a" + integrity sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bleat@^0.1.9: + version "0.1.9" + resolved "https://registry.yarnpkg.com/bleat/-/bleat-0.1.9.tgz#078e7128aac8575e90f3978bbb008889edc8ed75" + integrity sha512-XM4t1lDBJWFSyzmniG5upL9Q45JbKYmo2CP+nKhjHq/QBTrnYrccf7s7YwHvup+GrecV1MtzH3kHZYg/TT1d5A== + optionalDependencies: + noble "^1.9.1" + +bluetooth-hci-socket@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/bluetooth-hci-socket/-/bluetooth-hci-socket-0.5.1.tgz#efbe21524fc1cf5d3fae5d51365d561d4abbed0b" + integrity sha1-774hUk/Bz10/rl1RNl1WHUq77Qs= + dependencies: + debug "^2.2.0" + nan "^2.0.5" + optionalDependencies: + usb "^1.1.0" + +bplist-parser@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.0.6.tgz#38da3471817df9d44ab3892e27707bbbd75a11b9" + integrity sha1-ONo0cYF9+dRKs4kuJ3B7u9daEbk= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer@^5.5.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-native-messaging@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chrome-native-messaging/-/chrome-native-messaging-0.2.0.tgz#c142cde524bd1b1854e14f57e078a396a6da3826" + integrity sha1-wULN5SS9GxhU4U9X4HijlqbaOCY= + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js@^2.6.5: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.1, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= + dependencies: + ms "0.7.1" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +detect-libc@^1.0.2, detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +dsp.js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dsp.js/-/dsp.js-1.0.1.tgz#02554a223ee514cd0e226cb6fb88d6d0b3e91308" + integrity sha1-AlVKIj7lFM0OImy2+4jW0LPpEwg= + +enchannel-zmq-backend@^9.1.22: + version "9.1.22" + resolved "https://registry.yarnpkg.com/enchannel-zmq-backend/-/enchannel-zmq-backend-9.1.22.tgz#bad28a62d7483a78f2cb3339dfd2900df9423fbe" + integrity sha512-/hda4CYmFtSqBUm77nUDIe46eeMIR39BLO1qBvYezmHm8yrHEdQ40SYAJlhy1iG5GNwvQSaxQS2pRowzTzFb3g== + dependencies: + "@nteract/messaging" "^7.0.6" + jmp "^2.0.0" + rxjs "^6.3.3" + uuid "^7.0.0" + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.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" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fili@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fili/-/fili-2.0.3.tgz#a2a62dd77f1f2b98e9afff173d24167f4221a83d" + integrity sha512-NW/EY++EMP9f4mSpVCjg5PJnAkkxzh170My+R18sh4CSXu3Puxw3Cs4aQmXoUtNg1EonZmvmR5TLcKEJtX5hQg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-yarn-workspace-root@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" + integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== + dependencies: + fs-extra "^4.0.3" + micromatch "^3.1.4" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + +glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +home-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/home-dir/-/home-dir-1.0.0.tgz#2917eb44bdc9072ceda942579543847e3017fe4e" + integrity sha1-KRfrRL3JByztqUJXlUOEfjAX/k4= + +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + +immutable@^4.0.0-rc.12: + version "4.0.0-rc.12" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217" + integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/jmp/-/jmp-2.0.0.tgz#4f2be3540e25a35b68183ec2d79c990884e0a9f0" + integrity sha512-VATfWVHErQJA2XMtmQjJQHHyQ/hxjHMmsy+egmwRk/RzFchQB4xjrR1iX496VZr+Hyhcr4zvL+IkkSlIYKx6Yw== + dependencies: + uuid "3" + zeromq "5" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jupyter-paths@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/jupyter-paths/-/jupyter-paths-2.0.3.tgz#1e2827981f78f401e398576048a290172e0c67e4" + integrity sha512-cQuCfHtKINnwiVTu1Ljm7Pk+tRZiV2wJkZLn0fUmZIJ76v9cIw/nu3PXgUYZ3T120eYxg6oELRxGkXianCowZQ== + dependencies: + home-dir "^1.0.0" + +kernelspecs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kernelspecs/-/kernelspecs-2.0.0.tgz#273411c7f9cfd352cb742d86b24723a0869e2c4f" + integrity sha512-lce4pPDrs4VdxKYTEBnGLT81A3yNP8syyMAq5AejE+CKAkiXQXrHZaHO1F4c/RmgkKKF1Otis1XrpBxOOQsdnw== + dependencies: + jupyter-paths "^2.0.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash@^4.17.13, lodash@^4.17.14: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nan@2.13.2: + version "2.13.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" + integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== + +nan@^2.0.5, nan@^2.14.0: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + +needle@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.0.tgz#e6fc4b3cc6c25caed7554bd613a5cf0bac8c31c0" + integrity sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +noble-winrt@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noble-winrt/-/noble-winrt-0.1.1.tgz#77b31a77e7c386c2f56d837b8584197ab5dfbcb5" + integrity sha512-IUlWQfaHJMuiYOQTGvW4YdWeQR7E6tBVXut8KDMkIFGAKU+LNvTciWYTwHUlzqZKtuP3jc9VFMBvR9UDFNq7Sw== + dependencies: + chrome-native-messaging "^0.2.0" + debug "^2.6.8" + noble "^1.7.0" + +noble@^1.7.0, noble@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/noble/-/noble-1.9.1.tgz#2ccd31ead8ec92dbff6f19a42e420b258bcdcdd0" + integrity sha1-LM0x6tjsktv/bxmkLkILJYvNzdA= + dependencies: + debug "~2.2.0" + optionalDependencies: + bluetooth-hci-socket "^0.5.1" + bplist-parser "0.0.6" + xpc-connection "~0.1.4" + +node-abi@^2.7.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.18.0.tgz#1f5486cfd7d38bd4f5392fa44a4ad4d9a0dffbf4" + integrity sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw== + dependencies: + semver "^5.4.1" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-pre-gyp@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz#c2fc383276b74c7ffa842925241553e8b40f1087" + integrity sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.3" + needle "^2.5.0" + 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" + +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= + +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + +npm-bundled@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-packlist@^1.1.6: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npmlog@^4.0.1, npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +patch-package@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" + integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^2.4.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^1.2.1" + fs-extra "^7.0.1" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.0" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +portfinder@^1.0.13: + version "1.0.26" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" + integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prebuild-install@^5.3.2, prebuild-install@^5.3.3: + version "5.3.4" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.4.tgz#6982d10084269d364c1856550b7d090ea31fa293" + integrity sha512-AkKN+pf4fSEihjapLEEj8n85YIw/tN6BQqkhzbDc0RvEZGdkpJBGMUYx66AAMcPG2KzmPQS7Cm16an4HVBRRMA== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp "^0.5.1" + napi-build-utils "^1.0.1" + node-abi "^2.7.0" + noop-logger "^0.1.1" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + which-pm-runs "^1.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.0.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^2.6.1, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rxjs@^6.3.1, rxjs@^6.3.3: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + +simple-get@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" + integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.16: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spawnteract@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/spawnteract/-/spawnteract-5.0.1.tgz#425daeac2775919a5fbf7cc3ba973e1850e0336c" + integrity sha512-7R+unoZfdInm/fAqLeCirqoF8clth3N5SQBohAdv/LhYNJ0I6tnL0AN2catX8T+KedwsgujaeTTuyukB6Jc+Ew== + dependencies: + execa "^0.10.0" + jsonfile "^3.0.0" + jupyter-paths "^2.0.0" + kernelspecs "^2.0.0" + mkdirp "^0.5.1" + portfinder "^1.0.13" + uuid "^3.0.1" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +tar-fs@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5" + integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.0.0" + +tar-stream@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.2.tgz#6d5ef1a7e5783a95ff70b69b97455a5968dc1325" + integrity sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q== + dependencies: + bl "^4.0.1" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^4.4.2: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + 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" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tslib@^1.9.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +usb@^1.1.0: + version "1.6.3" + resolved "https://registry.yarnpkg.com/usb/-/usb-1.6.3.tgz#c0bc14994e8f9cb16f9602ec0dbadaa57cb919f5" + integrity sha512-23KYMjaWydACd8wgGKMQ4MNwFspAT6Xeim4/9Onqe5Rz/nMb4TM/WHL+qPT0KNFxzNKzAs63n1xQWGEtgaQ2uw== + dependencies: + bindings "^1.4.0" + nan "2.13.2" + prebuild-install "^5.3.3" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +uuid@3, uuid@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + +uuid@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" + integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== + +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +xpc-connection@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/xpc-connection/-/xpc-connection-0.1.4.tgz#dcd7faa2aec6b7a6e18cc5ddad042f7a34c77156" + integrity sha1-3Nf6oq7Gt6bhjMXdrQQvejTHcVY= + dependencies: + nan "^2.0.5" + +yallist@^3.0.0, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +zeromq@5: + version "5.2.0" + resolved "https://registry.yarnpkg.com/zeromq/-/zeromq-5.2.0.tgz#92eed6baeee5167977e51a2e2360b2c29a3b39fd" + integrity sha512-qsckhCmrg6et6zrAJytC971SSN/4iLxKgkXK1Wqn2Gij5KXMY+TA+3cy/iFwehaWdU5usg5HNOOgaBdjSqtCVw== + dependencies: + nan "^2.14.0" + prebuild-install "^5.3.2" diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..bb903db1 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,19290 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"3d-view@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/3d-view/-/3d-view-2.0.0.tgz#831ae942d7508c50801e3e06fafe1e8c574e17be" + integrity sha1-gxrpQtdQjFCAHj4G+v4ejFdOF74= + dependencies: + matrix-camera-controller "^2.1.1" + orbit-camera-controller "^4.0.0" + turntable-camera-controller "^3.0.0" + +"7zip-bin@~5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.0.3.tgz#bc5b5532ecafd923a61f2fb097e3b108c0106a3f" + integrity sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA== + +"7zip@0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/7zip/-/7zip-0.0.6.tgz#9cafb171af82329490353b4816f03347aa150a30" + integrity sha1-nK+xca+CMpSQNTtIFvAzR6oVCjA= + +"@ant-design/css-animation@^1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@ant-design/css-animation/-/css-animation-1.7.2.tgz#4ee5d2ec0fb7cc0a78b44e1c82628bd4621ac7e3" + integrity sha512-bvVOe7A+r7lws58B7r+fgnQDK90cV45AXuvGx6i5CCSX1W/M3AJnHsNggDANBxEtWdNdFWcDd5LorB+RdSIlBw== + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.3.tgz#324bcfd8d35cd3d47dae18cde63d752086435e9a" + integrity sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg== + dependencies: + "@babel/highlight" "^7.10.3" + +"@babel/compat-data@^7.10.1", "@babel/compat-data@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.3.tgz#9af3e033f36e8e2d6e47570db91e64a846f5d382" + integrity sha512-BDIfJ9uNZuI0LajPfoYV28lX8kyCPMHY6uY4WH1lJdcicmAfxCK5ASzaeV0D/wsUaRH/cLk+amuxtC37sZ8TUg== + dependencies: + browserslist "^4.12.0" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@>=7.9.0", "@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.10.2", "@babel/core@^7.7.5": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.3.tgz#73b0e8ddeec1e3fdd7a2de587a60e17c440ec77e" + integrity sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w== + dependencies: + "@babel/code-frame" "^7.10.3" + "@babel/generator" "^7.10.3" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helpers" "^7.10.1" + "@babel/parser" "^7.10.3" + "@babel/template" "^7.10.3" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" + 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" + +"@babel/generator@^7.0.0-beta.44", "@babel/generator@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.3.tgz#32b9a0d963a71d7a54f5f6c15659c3dbc2a523a5" + integrity sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA== + dependencies: + "@babel/types" "^7.10.3" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" + integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.3.tgz#4e9012d6701bef0030348d7f9c808209bd3e8687" + integrity sha512-lo4XXRnBlU6eRM92FkiZxpo1xFLmv3VsPFk61zJKMm7XYJfwqXHsYJTY6agoc4a3L8QPw1HqWehO18coZgbT6A== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.10.3" + "@babel/types" "^7.10.3" + +"@babel/helper-builder-react-jsx-experimental@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz#9a7d58ad184d3ac3bafb1a452cec2bad7e4a0bc8" + integrity sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-module-imports" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-builder-react-jsx@^7.10.1", "@babel/helper-builder-react-jsx@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.3.tgz#62c4b7bb381153a0a5f8d83189b94b9fb5384fc5" + integrity sha512-vkxmuFvmovtqTZknyMGj9+uQAZzz5Z9mrbnkJnPkaYGfKTaSsYcjQdXP0lgrWLVh8wU6bCjOmXOpx+kqUi+S5Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/types" "^7.10.3" + +"@babel/helper-compilation-targets@^7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285" + integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA== + dependencies: + "@babel/compat-data" "^7.10.1" + browserslist "^4.12.0" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.10.1", "@babel/helper-create-class-features-plugin@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.3.tgz#2783daa6866822e3d5ed119163b50f0fc3ae4b35" + integrity sha512-iRT9VwqtdFmv7UheJWthGc/h2s7MqoweBF9RUj77NFZsg9VfISvBTum3k6coAhJ8RWv2tj3yUjA03HxPd0vfpQ== + dependencies: + "@babel/helper-function-name" "^7.10.3" + "@babel/helper-member-expression-to-functions" "^7.10.3" + "@babel/helper-optimise-call-expression" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + +"@babel/helper-create-regexp-features-plugin@^7.10.1", "@babel/helper-create-regexp-features-plugin@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd" + integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-regex" "^7.10.1" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.3.tgz#d27120a5e57c84727b30944549b2dfeca62401a8" + integrity sha512-bxRzDi4Sin/k0drWCczppOhov1sBSdBvXJObM1NLHQzjhXhwRtn7aRWGvLJWCYbuu2qUk3EKs6Ci9C9ps8XokQ== + dependencies: + "@babel/helper-function-name" "^7.10.3" + "@babel/types" "^7.10.3" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.3.tgz#9dc14f0cfa2833ea830a9c8a1c742b6e7461b05e" + integrity sha512-0nKcR64XrOC3lsl+uhD15cwxPvaB6QKUDlD84OT9C3myRbhJqTMYir69/RWItUvHpharv0eJ/wk7fl34ONSwZw== + dependencies: + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" + +"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz#79316cd75a9fa25ba9787ff54544307ed444f197" + integrity sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw== + dependencies: + "@babel/helper-get-function-arity" "^7.10.3" + "@babel/template" "^7.10.3" + "@babel/types" "^7.10.3" + +"@babel/helper-get-function-arity@^7.10.1", "@babel/helper-get-function-arity@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz#3a28f7b28ccc7719eacd9223b659fdf162e4c45e" + integrity sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg== + dependencies: + "@babel/types" "^7.10.3" + +"@babel/helper-hoist-variables@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.3.tgz#d554f52baf1657ffbd7e5137311abc993bb3f068" + integrity sha512-9JyafKoBt5h20Yv1+BXQMdcXXavozI1vt401KBiRc2qzUepbVnd7ogVNymY1xkQN9fekGwfxtotH2Yf5xsGzgg== + dependencies: + "@babel/types" "^7.10.3" + +"@babel/helper-member-expression-to-functions@^7.10.1", "@babel/helper-member-expression-to-functions@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz#bc3663ac81ac57c39148fef4c69bf48a77ba8dd6" + integrity sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw== + dependencies: + "@babel/types" "^7.10.3" + +"@babel/helper-module-imports@^7.0.0-beta.44", "@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz#766fa1d57608e53e5676f23ae498ec7a95e1b11a" + integrity sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w== + dependencies: + "@babel/types" "^7.10.3" + +"@babel/helper-module-transforms@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" + integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== + dependencies: + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.10.1", "@babel/helper-optimise-call-expression@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz#f53c4b6783093195b0f69330439908841660c530" + integrity sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg== + dependencies: + "@babel/types" "^7.10.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.10.3", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz#aac45cccf8bc1873b99a85f34bceef3beb5d3244" + integrity sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g== + +"@babel/helper-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96" + integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.10.1", "@babel/helper-remap-async-to-generator@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.3.tgz#18564f8a6748be466970195b876e8bba3bccf442" + integrity sha512-sLB7666ARbJUGDO60ZormmhQOyqMX/shKBXZ7fy937s+3ID8gSrneMvKSSb+8xIM5V7Vn6uNVtOY1vIm26XLtA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-wrap-function" "^7.10.1" + "@babel/template" "^7.10.3" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" + +"@babel/helper-replace-supers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" + integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-simple-access@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" + integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw== + dependencies: + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-split-export-declaration@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" + integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-validator-identifier@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz#60d9847f98c4cea1b279e005fdb7c28be5412d15" + integrity sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw== + +"@babel/helper-wrap-function@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9" + integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ== + dependencies: + "@babel/helper-function-name" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helpers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" + integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== + dependencies: + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/highlight@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.3.tgz#c633bb34adf07c5c13156692f5922c81ec53f28d" + integrity sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw== + dependencies: + "@babel/helper-validator-identifier" "^7.10.3" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.10.3", "@babel/parser@^7.7.0": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.3.tgz#7e71d892b0d6e7d04a1af4c3c79d72c1f10f5315" + integrity sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA== + +"@babel/plugin-proposal-async-generator-functions@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.3.tgz#5a02453d46e5362e2073c7278beab2e53ad7d939" + integrity sha512-WUUWM7YTOudF4jZBAJIW9D7aViYC/Fn0Pln4RIHlQALyno3sXSjqmTA4Zy1TKC2D49RCR8Y/Pn4OIUtEypK3CA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-remap-async-to-generator" "^7.10.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01" + integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-proposal-decorators@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.3.tgz#2fc6b5696028adccfcd14bc826c184c578b857f8" + integrity sha512-Rzwn5tcYFTdWWK3IrhMZkMDjzFQLIGYqHvv9XuzNnEB91Y6gHr/JjazYV1Yec9g0yMLhy1p/21eiW1P7f5UN4A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-syntax-decorators" "^7.10.1" + +"@babel/plugin-proposal-do-expressions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.10.1.tgz#ef99f594320f38c300ed2404d6ca83b00c858905" + integrity sha512-rjAoAQl6YLsY9C60zQBVTBsDP8YUWlgSv7qRdG8rapQYl+WL1LIVq23SHDCPllaNrE8bqO9csBooTL4yXr7FnA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-do-expressions" "^7.10.1" + +"@babel/plugin-proposal-dynamic-import@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0" + integrity sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-export-default-from@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.10.1.tgz#59ea2a4f09dbb0358c73dab27def3d21a27bd370" + integrity sha512-Xfc1CfHapIkwZ/+AI+j4Ha3g233ol0EEdy6SmnUuQQiZX78SfQXHd8tmntc5zqCkwPnIHoiZa6l6p0OAvxYXHw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-export-default-from" "^7.10.1" + +"@babel/plugin-proposal-export-namespace-from@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.1.tgz#512ee069cd866256600bdf89639cf7e1b51fbfe9" + integrity sha512-eR4CoYb6mh5y9LWjnb4CyUatuhtZ8pNLXLDi46GkqtF7WPafFqXycHdvF5qWviozZVGRSAmHzdayc8wUReCdjA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-function-bind@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.10.1.tgz#155ec493b2b883fe5f5b8da114396bc54d188a5c" + integrity sha512-NgVBGHC8kpnyPP0LtRRe5ElE/17QoAKf3BoqQY+A7MqBsPK+DorfyeRo27EU4f/i49MDdFAXz2yZvhUnHFOxmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-function-bind" "^7.10.1" + +"@babel/plugin-proposal-function-sent@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.10.1.tgz#e9ffe9df5348e2694d6679f8fd0897acf14326d7" + integrity sha512-mpfEbRcwHvDA6k19ZFsGkW4Q+AF7DekafKTTfn2Ihz1cs6/qL+KgAJlcHBY6XnW1OW1zDaNCR0i28Blonl8/Bg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-wrap-function" "^7.10.1" + "@babel/plugin-syntax-function-sent" "^7.10.1" + +"@babel/plugin-proposal-json-strings@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz#b1e691ee24c651b5a5e32213222b2379734aff09" + integrity sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-logical-assignment-operators@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.10.3.tgz#efae900a91f76ad07dbd50142108e8cd602fee44" + integrity sha512-9uievCCgqOa7VDyMDXlTp5U+0bXu0ubMQL2ek5M1mrwQIY2T9Fx6PUpx/0Eh/8XZice1hzZZo3CJx0wHcDVqNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.1" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78" + integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz#a9a38bc34f78bdfd981e791c27c6fdcec478c123" + integrity sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-numeric-separator" "^7.10.1" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.3.tgz#b8d0d22f70afa34ad84b7a200ff772f9b9fce474" + integrity sha512-ZZh5leCIlH9lni5bU/wB/UcjtcVLgR8gc+FAgW2OOY+m9h1II3ItTO1/cewNUcsIDZSYcSaz/rYVls+Fb0ExVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.10.1" + +"@babel/plugin-proposal-optional-catch-binding@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2" + integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.10.1", "@babel/plugin-proposal-optional-chaining@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.3.tgz#9a726f94622b653c0a3a7a59cdce94730f526f7c" + integrity sha512-yyG3n9dJ1vZ6v5sfmIlMMZ8azQoqx/5/nZTSWX1td6L1H1bsjzA8TInDChpafCZiJkeOFzp/PtrfigAQXxI1Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-pipeline-operator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.10.1.tgz#d7129bf1b170efef250759b82b64ce9a9b29d335" + integrity sha512-P+WKKsi7XBEvvTaregnYZIF+aLoCTNt0T21tbzeGlOdERmR1X0iFXJKqZbxsJooa+a3f/tKYFhbJYqnKt70x2w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-pipeline-operator" "^7.10.1" + +"@babel/plugin-proposal-private-methods@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz#ed85e8058ab0fe309c3f448e5e1b73ca89cdb598" + integrity sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-proposal-throw-expressions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.10.1.tgz#89bde971b6081bfecff832c811ad76c2337c6970" + integrity sha512-wyhTn1ebUbbphDJVVUpg1wikUOIW8Lg93ng0aDGv07+MxINPS4d0ju68JVH06W4oMnZTwgELA5AImrah9RULYA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-throw-expressions" "^7.10.1" + +"@babel/plugin-proposal-unicode-property-regex@^7.10.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz#dc04feb25e2dd70c12b05d680190e138fa2c0c6f" + integrity sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.10.1", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5" + integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-decorators@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.1.tgz#16b869c4beafc9a442565147bda7ce0967bd4f13" + integrity sha512-a9OAbQhKOwSle1Vr0NJu/ISg1sPfdEkfRKWpgPuzhnWWzForou2gIeUIIwjAMHRekhhpJ7eulZlYs0H14Cbi+g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-do-expressions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.10.1.tgz#18ad0be2e2808991101c708e56d2ca5e7a9f96d9" + integrity sha512-Me/wISm2f76puo3Heyu01tthw7/8HSTn2aaiDahWD1K9oRPfzygW0eBcLIrTUdhr58MUyrSLduhUM7uZry6vzg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-default-from@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.10.1.tgz#634f58f36b5d6320d80f75441fdc61e1c05c33b0" + integrity sha512-+rcL4S/mN1Ss4zhSCbxzv1Wsf12eauvgTjWi0krXEeX1zd6qSxYnJoniE5Ssr5w2WPt61oUCJyXIFQIqO/29zw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.1.tgz#cd4bbca62fb402babacb174f64f8734310d742f0" + integrity sha512-b3pWVncLBYoPP60UOTc7NMlbtsHQ6ITim78KQejNHK6WJ2mzV5kCcg4mIWpasAfJEgwVTibwo2e+FU7UEIKQUg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-function-bind@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.10.1.tgz#934b4a2fbc316ec77243957516d93083e8d3ba00" + integrity sha512-eb+muGp2AzVPYnAof+IYuTjyHsbMRKn+hVSEhCzKlPVcGemJPnv9buhDhvgcQGTo1yZnOh6O+YNWMq9g9QAalg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-function-sent@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.10.1.tgz#42a03af38dd7f46121c97c67d032da4749792478" + integrity sha512-Ze/5A9mFucmT7UyEA8D60YijmclEZQp3kjzbbEImWnyMLmjE/3S5x7lkCr+W7g2wc00nqk1QLsloa4+1EiHULA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-import-meta@^7.10.1", "@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.1.tgz#3e59120ed8b3c2ccc5abb1cfc7aaa3ea01cd36b6" + integrity sha512-ypC4jwfIVF72og0dgvEcFRdOM2V9Qm1tu7RGmdZOlhsccyK0wisXmMObGuWEOd5jQ+K9wcIgSNftCpk2vkjUfQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz#0ae371134a42b91d5418feb3c8c8d43e1565d2da" + integrity sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.1", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.1.tgz#fffee77b4934ce77f3b427649ecdddbec1958550" + integrity sha512-XyHIFa9kdrgJS91CUH+ccPVTnJShr8nLGc5bG2IhGXv5p1Rd+8BleGE5yzIg2Nc1QZAdHDa0Qp4m6066OL96Iw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.1", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99" + integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-pipeline-operator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.10.1.tgz#07cd46978b26f21eb8c4231534a64aaa686b3cd3" + integrity sha512-6jvu8KNBnEGuwlRpAQxTHsKcYuGqSf1gAv1c7j+CP7evNU8atjCRW6pK/W1AxeTz1WXWpzciOQTK4hLfPlXKDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-throw-expressions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.10.1.tgz#09a88bacf2ad8af7a465af5e910a61d93136b147" + integrity sha512-1ieYCCX6HCEvBefYt1Njja2XFrbThi2pffdfpPeB7WzVwbX/UlVOrPw9WSPQyVoyo+kqO0l/KGRNZyrTKo0bew== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-top-level-await@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz#8b8733f8c57397b3eaa47ddba8841586dcaef362" + integrity sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-typescript@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.1.tgz#5e82bc27bb4202b93b949b029e699db536733810" + integrity sha512-X/d8glkrAtra7CaQGMiGs/OGa6XgUzqPcBXCIGFCpCqnfGlT0Wfbzo/B89xHhnInTaItPK8LALblVXcUOEh95Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b" + integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-async-to-generator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062" + integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg== + dependencies: + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-remap-async-to-generator" "^7.10.1" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d" + integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e" + integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.3.tgz#8d9a656bc3d01f3ff69e1fccb354b0f9d72ac544" + integrity sha512-irEX0ChJLaZVC7FvvRoSIxJlmk0IczFLcwaRXUArBKYHCHbOhe57aG8q3uw/fJsoSXvZhjRX960hyeAGlVBXZw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-define-map" "^7.10.3" + "@babel/helper-function-name" "^7.10.3" + "@babel/helper-optimise-call-expression" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.3.tgz#d3aa6eef67cb967150f76faff20f0abbf553757b" + integrity sha512-GWzhaBOsdbjVFav96drOz7FzrcEW6AP5nax0gLIpstiFaI3LOb2tAg06TimaWU6YKOfUACK3FVrxPJ4GSc5TgA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.3" + +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" + integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-dotall-regex@^7.10.1", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz#920b9fec2d78bb57ebb64a644d5c2ba67cc104ee" + integrity sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-duplicate-keys@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz#c900a793beb096bc9d4d0a9d0cde19518ffc83b9" + integrity sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-exponentiation-operator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3" + integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.1.tgz#59eafbff9ae85ec8932d4c16c068654be814ec5e" + integrity sha512-i4o0YwiJBIsIx7/liVCZ3Q2WkWr1/Yu39PksBOnh/khW2SwIFsGa5Ze+MSon5KbDfrEHP9NeyefAgvUSXzaEkw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-flow" "^7.10.1" + +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5" + integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d" + integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw== + dependencies: + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a" + integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39" + integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-modules-amd@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a" + integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw== + dependencies: + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301" + integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg== + dependencies: + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.3.tgz#004ae727b122b7b146b150d50cba5ffbff4ac56b" + integrity sha512-GWXWQMmE1GH4ALc7YXW56BTh/AlzvDWhUNn9ArFF0+Cz5G8esYlVbXfdyHa1xaD1j+GnBoCeoQNlwtZTVdiG/A== + dependencies: + "@babel/helper-hoist-variables" "^7.10.3" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz#ea080911ffc6eb21840a5197a39ede4ee67b1595" + integrity sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA== + dependencies: + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.3.tgz#a4f8444d1c5a46f35834a410285f2c901c007ca6" + integrity sha512-I3EH+RMFyVi8Iy/LekQm948Z4Lz4yKT7rK+vuCAeRm0kTa6Z5W7xuhRxDNJv0FPya/her6AUgrDITb70YHtTvA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz#6ee41a5e648da7632e22b6fb54012e87f612f324" + integrity sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde" + integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd" + integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg== + dependencies: + "@babel/helper-get-function-arity" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d" + integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-react-constant-elements@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.1.tgz#c7f117a54657cba3f9d32012e050fc89982df9e1" + integrity sha512-V4os6bkWt/jbrzfyVcZn2ZpuHZkvj3vyBU0U/dtS8SZuMS7Rfx5oknTrtfyXJ2/QZk8gX7Yls5Z921ItNpE30Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.3.tgz#e3c246e1b4f3e52cc7633e237ad9194c0ec482e7" + integrity sha512-dOV44bnSW5KZ6kYF6xSHBth7TFiHHZReYXH/JH3XnFNV+soEL1F5d8JT7AJ3ZBncd19Qul7SN4YpBnyWOnQ8KA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.3" + +"@babel/plugin-transform-react-inline-elements@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.10.1.tgz#14c1179cfda904d430109ed27a167e54c7565d68" + integrity sha512-lV/H9X6MaIfyzOVZnC4tZzMUnU9hGujmOuQhlGyDHOZbqAHv7dL24yXG1vOn8kA43CVL4bretUnGfV9IyjgqWA== + dependencies: + "@babel/helper-builder-react-jsx" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-react-jsx-development@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.1.tgz#1ac6300d8b28ef381ee48e6fec430cc38047b7f3" + integrity sha512-XwDy/FFoCfw9wGFtdn5Z+dHh6HXKHkC6DwKNWpN74VWinUagZfDcEJc3Y8Dn5B3WMVnAllX8Kviaw7MtC5Epwg== + dependencies: + "@babel/helper-builder-react-jsx-experimental" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-jsx" "^7.10.1" + +"@babel/plugin-transform-react-jsx-self@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.1.tgz#22143e14388d72eb88649606bb9e46f421bc3821" + integrity sha512-4p+RBw9d1qV4S749J42ZooeQaBomFPrSxa9JONLHJ1TxCBo3TzJ79vtmG2S2erUT8PDDrPdw4ZbXGr2/1+dILA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-jsx" "^7.10.1" + +"@babel/plugin-transform-react-jsx-source@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz#30db3d4ee3cdebbb26a82a9703673714777a4273" + integrity sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-jsx" "^7.10.1" + +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.3.tgz#c07ad86b7c159287c89b643f201f59536231048e" + integrity sha512-Y21E3rZmWICRJnvbGVmDLDZ8HfNDIwjGF3DXYHx1le0v0mIHCs0Gv5SavyW5Z/jgAHLaAoJPiwt+Dr7/zZKcOQ== + dependencies: + "@babel/helper-builder-react-jsx" "^7.10.3" + "@babel/helper-builder-react-jsx-experimental" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-syntax-jsx" "^7.10.1" + +"@babel/plugin-transform-react-pure-annotations@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.3.tgz#97840981673fcb0df2cc33fb25b56cc421f7deef" + integrity sha512-n/fWYGqvTl7OLZs/QcWaKMFdADPvC3V6jYuEOpPyvz97onsW9TXn196fHnHW1ZgkO20/rxLOgKnEtN1q9jkgqA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" + +"@babel/plugin-transform-regenerator@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.3.tgz#6ec680f140a5ceefd291c221cb7131f6d7e8cb6d" + integrity sha512-H5kNeW0u8mbk0qa1jVIVTeJJL6/TJ81ltD4oyPx0P499DhMJrTmmIFCmJ3QloGpQG8K9symccB7S7SJpCKLwtw== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz#0fc1027312b4d1c3276a57890c8ae3bcc0b64a86" + integrity sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3" + integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8" + integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-sticky-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00" + integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-regex" "^7.10.1" + +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.3.tgz#69d39b3d44b31e7b4864173322565894ce939b25" + integrity sha512-yaBn9OpxQra/bk0/CaA4wr41O0/Whkg6nqjqApcinxM7pro51ojhX6fv1pimAnVjVfDy14K0ULoRL70CA9jWWA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" + +"@babel/plugin-transform-typeof-symbol@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz#60c0239b69965d166b80a84de7315c1bc7e0bb0e" + integrity sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-typescript@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.3.tgz#b3b35fb34ef0bd628b4b8329b0e5f985369201d4" + integrity sha512-qU9Lu7oQyh3PGMQncNjQm8RWkzw6LqsWZQlZPQMgrGt6s3YiBIaQ+3CQV/FA/icGS5XlSWZGwo/l8ErTyelS0Q== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-syntax-typescript" "^7.10.1" + +"@babel/plugin-transform-unicode-escapes@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940" + integrity sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-unicode-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f" + integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/preset-env@^7.10.2": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.3.tgz#3e58c9861bbd93b6a679987c7e4bd365c56c80c9" + integrity sha512-jHaSUgiewTmly88bJtMHbOd1bJf2ocYxb5BWKSDQIP5tmgFuS/n0gl+nhSrYDhT33m0vPxp+rP8oYYgPgMNQlg== + dependencies: + "@babel/compat-data" "^7.10.3" + "@babel/helper-compilation-targets" "^7.10.2" + "@babel/helper-module-imports" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-proposal-async-generator-functions" "^7.10.3" + "@babel/plugin-proposal-class-properties" "^7.10.1" + "@babel/plugin-proposal-dynamic-import" "^7.10.1" + "@babel/plugin-proposal-json-strings" "^7.10.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" + "@babel/plugin-proposal-numeric-separator" "^7.10.1" + "@babel/plugin-proposal-object-rest-spread" "^7.10.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.1" + "@babel/plugin-proposal-optional-chaining" "^7.10.3" + "@babel/plugin-proposal-private-methods" "^7.10.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.10.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.1" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.10.1" + "@babel/plugin-transform-arrow-functions" "^7.10.1" + "@babel/plugin-transform-async-to-generator" "^7.10.1" + "@babel/plugin-transform-block-scoped-functions" "^7.10.1" + "@babel/plugin-transform-block-scoping" "^7.10.1" + "@babel/plugin-transform-classes" "^7.10.3" + "@babel/plugin-transform-computed-properties" "^7.10.3" + "@babel/plugin-transform-destructuring" "^7.10.1" + "@babel/plugin-transform-dotall-regex" "^7.10.1" + "@babel/plugin-transform-duplicate-keys" "^7.10.1" + "@babel/plugin-transform-exponentiation-operator" "^7.10.1" + "@babel/plugin-transform-for-of" "^7.10.1" + "@babel/plugin-transform-function-name" "^7.10.1" + "@babel/plugin-transform-literals" "^7.10.1" + "@babel/plugin-transform-member-expression-literals" "^7.10.1" + "@babel/plugin-transform-modules-amd" "^7.10.1" + "@babel/plugin-transform-modules-commonjs" "^7.10.1" + "@babel/plugin-transform-modules-systemjs" "^7.10.3" + "@babel/plugin-transform-modules-umd" "^7.10.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.3" + "@babel/plugin-transform-new-target" "^7.10.1" + "@babel/plugin-transform-object-super" "^7.10.1" + "@babel/plugin-transform-parameters" "^7.10.1" + "@babel/plugin-transform-property-literals" "^7.10.1" + "@babel/plugin-transform-regenerator" "^7.10.3" + "@babel/plugin-transform-reserved-words" "^7.10.1" + "@babel/plugin-transform-shorthand-properties" "^7.10.1" + "@babel/plugin-transform-spread" "^7.10.1" + "@babel/plugin-transform-sticky-regex" "^7.10.1" + "@babel/plugin-transform-template-literals" "^7.10.3" + "@babel/plugin-transform-typeof-symbol" "^7.10.1" + "@babel/plugin-transform-unicode-escapes" "^7.10.1" + "@babel/plugin-transform-unicode-regex" "^7.10.1" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.10.3" + browserslist "^4.12.0" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.1.tgz#e2ab8ae9a363ec307b936589f07ed753192de041" + integrity sha512-Rw0SxQ7VKhObmFjD/cUcKhPTtzpeviEFX1E6PgP+cYOhQ98icNqtINNFANlsdbQHrmeWnqdxA4Tmnl1jy5tp3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-transform-react-display-name" "^7.10.1" + "@babel/plugin-transform-react-jsx" "^7.10.1" + "@babel/plugin-transform-react-jsx-development" "^7.10.1" + "@babel/plugin-transform-react-jsx-self" "^7.10.1" + "@babel/plugin-transform-react-jsx-source" "^7.10.1" + "@babel/plugin-transform-react-pure-annotations" "^7.10.1" + +"@babel/preset-typescript@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.10.1.tgz#a8d8d9035f55b7d99a2461a0bdc506582914d07e" + integrity sha512-m6GV3y1ShiqxnyQj10600ZVOFrSSAa8HQ3qIUk2r+gcGtHTIRw0dJnFLt1WNXpKjtVw7yw1DAPU/6ma2ZvgJuA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-transform-typescript" "^7.10.1" + +"@babel/register@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.3.tgz#b49b6603fc8d214cd2f77a6ed2256bd198b5994b" + integrity sha512-s1il0vdd02HCGwV1iocGJEzcbTNouZqMolSXKXFAiTNJSudPas9jdLQwyPPyAJxdNL6KGJ8pwWIOpKmgO/JWqg== + dependencies: + find-cache-dir "^2.0.0" + lodash "^4.17.13" + make-dir "^2.1.0" + pirates "^4.0.0" + source-map-support "^0.5.16" + +"@babel/runtime-corejs2@^7.0.0", "@babel/runtime-corejs2@^7.10.2": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.10.3.tgz#81bc99a96bfcb6db3f0dcf73fdc577cc554d341b" + integrity sha512-enKvnR/kKFbZFgXYo165wtSA5OeiTlgsnU4jV3vpKRhfWUJjLS6dfVcjIPeRcgJbgEgdgu0I+UyBWqu6c0GumQ== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.4" + +"@babel/runtime-corejs3@^7.8.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.3.tgz#931ed6941d3954924a7aa967ee440e60c507b91a" + integrity sha512-HA7RPj5xvJxQl429r5Cxr2trJwOfPjKiqhCXcdQPSqO2G0RHPZpXu4fkYmBaTKCp2c/jRaMK9GB/lN+7zvvFPw== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" + integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.0", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.3.tgz#670d002655a7c366540c67f6fd3342cd09500364" + integrity sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.1", "@babel/template@^7.10.3", "@babel/template@^7.3.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.3.tgz#4d13bc8e30bf95b0ce9d175d30306f42a2c9a7b8" + integrity sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA== + dependencies: + "@babel/code-frame" "^7.10.3" + "@babel/parser" "^7.10.3" + "@babel/types" "^7.10.3" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.10.3", "@babel/traverse@^7.7.0": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.3.tgz#0b01731794aa7b77b214bcd96661f18281155d7e" + integrity sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug== + dependencies: + "@babel/code-frame" "^7.10.3" + "@babel/generator" "^7.10.3" + "@babel/helper-function-name" "^7.10.3" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/parser" "^7.10.3" + "@babel/types" "^7.10.3" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.10.1", "@babel/types@^7.10.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.3.tgz#6535e3b79fea86a6b09e012ea8528f935099de8e" + integrity sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.3" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@choojs/findup@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@choojs/findup/-/findup-0.2.1.tgz#ac13c59ae7be6e1da64de0779a0a7f03d75615a3" + integrity sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw== + dependencies: + commander "^2.15.1" + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +"@electron/get@^1.0.1": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.12.2.tgz#6442066afb99be08cefb9a281e4b4692b33764f3" + integrity sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + progress "^2.0.3" + sanitize-filename "^1.6.2" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^2.0.2" + global-tunnel-ng "^2.7.1" + +"@fortawesome/fontawesome-free@^5.13.0": + version "5.13.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.13.1.tgz#c53b4066edae16cd1fd669f687baf031b45fb9d6" + integrity sha512-D819f34FLHeBN/4xvw0HR0u7U2G7RqjPSggXqf7LktsxWQ48VAfGwvMrhcVuaZV2fF069c/619RdgCCms0DHhw== + +"@hot-loader/react-dom@^16.13.0": + version "16.13.0" + resolved "https://registry.yarnpkg.com/@hot-loader/react-dom/-/react-dom-16.13.0.tgz#de245b42358110baf80aaf47a0592153d4047997" + integrity sha512-lJZrmkucz2MrQJTQtJobx5MICXcfQvKihszqv655p557HPi0hMOWxrNpiHv3DWD8ugNWjtWcVWqRnFvwsHq1mQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + +"@jest/console@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.5.0.tgz#770800799d510f37329c508a9edd0b7b447d9abb" + integrity sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw== + dependencies: + "@jest/types" "^25.5.0" + chalk "^3.0.0" + jest-message-util "^25.5.0" + jest-util "^25.5.0" + slash "^3.0.0" + +"@jest/core@^25.5.4": + version "25.5.4" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.5.4.tgz#3ef7412f7339210f003cdf36646bbca786efe7b4" + integrity sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA== + dependencies: + "@jest/console" "^25.5.0" + "@jest/reporters" "^25.5.1" + "@jest/test-result" "^25.5.0" + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.0" + ansi-escapes "^4.2.1" + chalk "^3.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^25.5.0" + jest-config "^25.5.4" + jest-haste-map "^25.5.1" + jest-message-util "^25.5.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.5.1" + jest-resolve-dependencies "^25.5.4" + jest-runner "^25.5.4" + jest-runtime "^25.5.4" + jest-snapshot "^25.5.1" + jest-util "^25.5.0" + jest-validate "^25.5.0" + jest-watcher "^25.5.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" + +"@jest/environment@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.5.0.tgz#aa33b0c21a716c65686638e7ef816c0e3a0c7b37" + integrity sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA== + dependencies: + "@jest/fake-timers" "^25.5.0" + "@jest/types" "^25.5.0" + jest-mock "^25.5.0" + +"@jest/fake-timers@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.5.0.tgz#46352e00533c024c90c2bc2ad9f2959f7f114185" + integrity sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ== + dependencies: + "@jest/types" "^25.5.0" + jest-message-util "^25.5.0" + jest-mock "^25.5.0" + jest-util "^25.5.0" + lolex "^5.0.0" + +"@jest/globals@^25.5.2": + version "25.5.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-25.5.2.tgz#5e45e9de8d228716af3257eeb3991cc2e162ca88" + integrity sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA== + dependencies: + "@jest/environment" "^25.5.0" + "@jest/types" "^25.5.0" + expect "^25.5.0" + +"@jest/reporters@^25.5.1": + version "25.5.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.5.1.tgz#cb686bcc680f664c2dbaf7ed873e93aa6811538b" + integrity sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^25.5.0" + "@jest/test-result" "^25.5.0" + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.0" + chalk "^3.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + 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.5.1" + jest-resolve "^25.5.1" + jest-util "^25.5.0" + jest-worker "^25.5.0" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^3.1.0" + terminal-link "^2.0.0" + v8-to-istanbul "^4.1.3" + optionalDependencies: + node-notifier "^6.0.0" + +"@jest/source-map@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.5.0.tgz#df5c20d6050aa292c2c6d3f0d2c7606af315bd1b" + integrity sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.4" + source-map "^0.6.0" + +"@jest/test-result@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.5.0.tgz#139a043230cdeffe9ba2d8341b27f2efc77ce87c" + integrity sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A== + dependencies: + "@jest/console" "^25.5.0" + "@jest/types" "^25.5.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^25.5.4": + version "25.5.4" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz#9b4e685b36954c38d0f052e596d28161bdc8b737" + integrity sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA== + dependencies: + "@jest/test-result" "^25.5.0" + graceful-fs "^4.2.4" + jest-haste-map "^25.5.1" + jest-runner "^25.5.4" + jest-runtime "^25.5.4" + +"@jest/transform@^25.5.1": + version "25.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.5.1.tgz#0469ddc17699dd2bf985db55fa0fb9309f5c2db3" + integrity sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^25.5.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.4" + jest-haste-map "^25.5.1" + jest-regex-util "^25.2.6" + jest-util "^25.5.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" + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + +"@mapbox/geojson-rewind@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.0.tgz#91f0ad56008c120caa19414b644d741249f4f560" + integrity sha512-73l/qJQgj/T/zO1JXVfuVvvKDgikD/7D/rHAD28S9BG1OTstgmftrmqfCx4U+zQAmtsB6HcDA3a7ymdnJZAQgg== + dependencies: + concat-stream "~2.0.0" + minimist "^1.2.5" + +"@mapbox/geojson-types@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" + integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== + +"@mapbox/jsonlint-lines-primitives@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" + integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ= + +"@mapbox/mapbox-gl-supported@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz#f60b6a55a5d8e5ee908347d2ce4250b15103dc8e" + integrity sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg== + +"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" + integrity sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI= + +"@mapbox/tiny-sdf@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.1.1.tgz#16a20c470741bfe9191deb336f46e194da4a91ff" + integrity sha512-Ihn1nZcGIswJ5XGbgFAvVumOgWpvIjBX9jiRlIl46uQG9vJOF51ViBYHF95rEZupuyQbEmhLaDPLQlU7fUTsBg== + +"@mapbox/unitbezier@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" + integrity sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4= + +"@mapbox/vector-tile@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" + integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw== + dependencies: + "@mapbox/point-geometry" "~0.1.0" + +"@mapbox/whoots-js@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" + integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@nteract/commutable@^7.2.12": + version "7.2.12" + resolved "https://registry.yarnpkg.com/@nteract/commutable/-/commutable-7.2.12.tgz#a4b6bafd582e0de7a095f57bf537ac18de1691d1" + integrity sha512-6cgjLkH5/xButb1VQEGwHxBa93GBAShyJFyG2jMYONZqy6vPU2MwlMRQYA1aaa16LsOcei1FFf7DKOBWYkue3g== + dependencies: + immutable "^4.0.0-rc.12" + uuid "^8.0.0" + +"@nteract/markdown@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@nteract/markdown/-/markdown-3.0.1.tgz#d9a0739fe4ce3b0e036fc4df364021eaea2a2625" + integrity sha512-Dr79niruytzbcDsLLS5NoPIzvVJ3YkJX18O0hmZAmrVn2Ni8L5VW+ZymWsSgRBogDgrYQzhV4L1MmIC/X6rbUg== + dependencies: + "@babel/runtime-corejs2" "^7.0.0" + "@nteract/mathjax" "^3.0.1" + babel-runtime "^6.26.0" + react-markdown "^4.0.0" + +"@nteract/mathjax@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@nteract/mathjax/-/mathjax-3.0.1.tgz#1f2900661880e6bf85777ab7f2610e6d9dd8dd36" + integrity sha512-jL4a2KjY9wzcg7dG3HvufKMXOk+FxWQ6BFH6p3fwJUerbf3SF6H/RlaLxuMgFP+Tv+sHVXo7FHTTTIIsRyuv8g== + dependencies: + "@babel/runtime-corejs2" "^7.0.0" + babel-runtime "^6.26.0" + +"@nteract/messaging@^7.0.7": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@nteract/messaging/-/messaging-7.0.7.tgz#6052f9b20be782fb39d1a3e5fbd941dae90586e5" + integrity sha512-ucfiyQf48ecYOKrIUrIwb20LfPhx2YdM0iSejVycM7QR3CP8V3p4CccdCjcJHbv7aI9RgfgGp4FUp8Exbh3weA== + dependencies: + "@nteract/types" "^6.0.7" + "@types/uuid" "^8.0.0" + lodash.clonedeep "^4.5.0" + rxjs "^6.3.3" + uuid "^8.0.0" + +"@nteract/transform-vdom@^2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@nteract/transform-vdom/-/transform-vdom-2.2.5.tgz#02b25342b6ba916f02281527ad96e941ff5bb458" + integrity sha512-q6FbWlrSEWUmQpDV1DBPcw5FZpUcQbKOQ2a59vY/qcQ/Qjh1KUCC+gortso+WIE4P36eHZRxKz5ptCu5i47OLg== + dependencies: + "@babel/runtime-corejs2" "^7.0.0" + babel-runtime "^6.26.0" + lodash "^4.17.4" + +"@nteract/transforms@^4.4.7": + version "4.4.7" + resolved "https://registry.yarnpkg.com/@nteract/transforms/-/transforms-4.4.7.tgz#11355df0f5cd44a2fe52dd9c9686a410bc27f4d5" + integrity sha512-G84BeBfzfdAg3cAV78ES9/yxe2ZNitg7j8MCKKx4iNS9vqeQbO92vyBsBW2D6qlddefU/RB5/HUvvtNUpd0ZRw== + dependencies: + "@babel/runtime-corejs2" "^7.0.0" + "@nteract/markdown" "^3.0.1" + "@nteract/mathjax" "^3.0.1" + "@nteract/transform-vdom" "^2.2.5" + ansi-to-react "^3.3.5" + babel-runtime "^6.26.0" + react-json-tree "^0.11.0" + +"@nteract/types@^6.0.7": + version "6.0.7" + resolved "https://registry.yarnpkg.com/@nteract/types/-/types-6.0.7.tgz#5a9b458c376cb81feca875b684696c32a9769642" + integrity sha512-sv4X97iXVHXVoPBl2m/xxO396GwujUSfm+7Cx6W5ziGUxSBjs4ydGTn2Uy6zv1MRa7Gwv9uJ/Sl8hgm7vY80Tw== + dependencies: + "@nteract/commutable" "^7.2.12" + immutable "^4.0.0-rc.12" + rxjs "^6.3.3" + uuid "^8.0.0" + +"@plotly/d3-sankey-circular@0.33.1": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz#15d1e0337e0e4b1135bdf0e2195c88adacace1a7" + integrity sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ== + dependencies: + d3-array "^1.2.1" + d3-collection "^1.0.4" + d3-shape "^1.2.0" + elementary-circuits-directed-graph "^1.0.4" + +"@plotly/d3-sankey@0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz#ddd5290d3b02c60037ced018a162644a2ccef33b" + integrity sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw== + dependencies: + d3-array "1" + d3-collection "1" + d3-shape "^1.2.0" + +"@semantic-ui-react/event-stack@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@semantic-ui-react/event-stack/-/event-stack-3.1.1.tgz#3263d17511db81a743167fe45281a24b3eb6b3c8" + integrity sha512-SA7VOu/tY3OkooR++mm9voeQrJpYXjJaMHO1aFCcSouS2xhqMR9Gnz0LEGLOR0h9ueWPBKaQzKIrx3FTTJZmUQ== + dependencies: + exenv "^1.2.2" + prop-types "^15.6.2" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" + integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q== + dependencies: + type-detect "4.0.8" + +"@sinonjs/formatio@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-4.0.1.tgz#50ac1da0c3eaea117ca258b06f4f88a471668bdb" + integrity sha512-asIdlLFrla/WZybhm0C8eEzaDNNrzymiTqHMeJl6zPW2881l3uuVRpm0QlRQEjqYWv6CcKMGYME3LbrLJsORBw== + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^4.2.0" + +"@sinonjs/samsam@^4.2.0", "@sinonjs/samsam@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-4.2.2.tgz#0f6cb40e467865306d8a20a97543a94005204e23" + integrity sha512-z9o4LZUzSD9Hl22zV38aXNykgFeVj8acqfFabCY6FY83n/6s/XwNJyYYldz6/9lBJanpno9h+oL6HTISkviweA== + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + +"@stardust-ui/react-component-event-listener@~0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@stardust-ui/react-component-event-listener/-/react-component-event-listener-0.38.0.tgz#1787faded94b40ad41226e6289baf13e701c6e7f" + integrity sha512-sIP/e0dyOrrlb8K7KWumfMxj/gAifswTBC4o68Aa+C/GA73ccRp/6W1VlHvF/dlOR4KLsA+5SKnhjH36xzPsWg== + dependencies: + "@babel/runtime" "^7.1.2" + prop-types "^15.7.2" + +"@stardust-ui/react-component-ref@~0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@stardust-ui/react-component-ref/-/react-component-ref-0.38.0.tgz#52d555f2d5edd213c923c93a106f7de940e427ef" + integrity sha512-xjs6WnvJVueSIXMWw0C3oWIgAPpcD03qw43oGOjUXqFktvpNkB73JoKIhS4sCrtQxBdct75qqr4ZL6JiyPcESw== + dependencies: + "@babel/runtime" "^7.1.2" + prop-types "^15.7.2" + react-is "^16.6.3" + +"@stylelint/postcss-css-in-js@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.1.tgz#41e5e7660f73d88227610e18c6ebb262d56ac125" + integrity sha512-UMf2Rni3JGKi3ZwYRGMYJ5ipOA5ENJSKMtYA/pE1ZLURwdh7B5+z2r73RmWvub+N0UuH1Lo+TGfCgYwPvqpXNw== + dependencies: + "@babel/core" ">=7.9.0" + +"@stylelint/postcss-markdown@^0.36.1": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz#829b87e6c0f108014533d9d7b987dc9efb6632e8" + integrity sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw== + dependencies: + remark "^12.0.0" + unist-util-find-all-after "^3.0.1" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@turf/area@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@turf/area/-/area-6.0.1.tgz#50ed63c70ef2bdb72952384f1594319d94f3b051" + integrity sha512-Zv+3N1ep9P5JvR0YOYagLANyapGWQBh8atdeR3bKpWcigVXFsEKNUw03U/5xnh+cKzm7yozHD6MFJkqQv55y0g== + dependencies: + "@turf/helpers" "6.x" + "@turf/meta" "6.x" + +"@turf/bbox@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-6.0.1.tgz#b966075771475940ee1c16be2a12cf389e6e923a" + integrity sha512-EGgaRLettBG25Iyx7VyUINsPpVj1x3nFQFiGS3ER8KCI1MximzNLsam3eXRabqQDjyAKyAE1bJ4EZEpGvspQxw== + dependencies: + "@turf/helpers" "6.x" + "@turf/meta" "6.x" + +"@turf/centroid@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@turf/centroid/-/centroid-6.0.2.tgz#c4eb16b4bc60b692f74e1809cf9a7c4a4f5ba1cc" + integrity sha512-auyDauOtC4eddH7GC3CHFTDu2PKhpSeKCRhwhHhXtJqn2dWCJQNIoCeJRmfXRIbzCWhWvgvQafvvhq8HNvmvWw== + dependencies: + "@turf/helpers" "6.x" + "@turf/meta" "6.x" + +"@turf/helpers@6.x": + version "6.1.4" + resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-6.1.4.tgz#d6fd7ebe6782dd9c87dca5559bda5c48ae4c3836" + integrity sha512-vJvrdOZy1ngC7r3MDA7zIGSoIgyrkWcGnNIEaqn/APmw+bVLF2gAW7HIsdTxd12s5wQMqEpqIQrmrbRRZ0xC7g== + +"@turf/meta@6.x": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-6.0.2.tgz#eb92951126d24a613ac1b7b99d733fcc20fd30cf" + integrity sha512-VA7HJkx7qF1l3+GNGkDVn2oXy4+QoLP6LktXAaZKjuT1JI0YESat7quUkbCMy4zP9lAUuvS4YMslLyTtr919FA== + dependencies: + "@turf/helpers" "6.x" + +"@types/anymatch@*": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" + integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== + +"@types/babel__core@^7.1.7": + version "7.1.9" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" + integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== + dependencies: + "@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.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.12.tgz#22f49a028e69465390f87bb103ebd61bd086b8f5" + integrity sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA== + dependencies: + "@babel/types" "^7.3.0" + +"@types/cheerio@*": + version "0.22.18" + resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.18.tgz#19018dceae691509901e339d63edf1e935978fe6" + integrity sha512-Fq7R3fINAPSdUEhOyjG4iVxgHrOnqDJbY0/BUuiN0pvD/rfmZWekVZnv+vcs8TtpA2XF50uv50LaE4EnpEL/Hw== + dependencies: + "@types/node" "*" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/css-modules-loader-core@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#67af15aa16603ac2ffc1d3a7f08547ac809c3005" + integrity sha512-LMbyf7THPqLCPHIXAj79v9Pa193MeOHgp1fBFRR6s6VvEVHUFIcM5bc/WttslOf+lao4TURNN1X1zfW5wr2CHQ== + dependencies: + postcss "7.x.x" + +"@types/debug@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" + integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== + +"@types/enzyme-adapter-react-16@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.6.tgz#8aca7ae2fd6c7137d869b6616e696d21bb8b0cec" + integrity sha512-VonDkZ15jzqDWL8mPFIQnnLtjwebuL9YnDkqeCDYnB4IVgwUm0mwKkqhrxLL6mb05xm7qqa3IE95m8CZE9imCg== + dependencies: + "@types/enzyme" "*" + +"@types/enzyme@*", "@types/enzyme@^3.10.5": + version "3.10.5" + resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.10.5.tgz#fe7eeba3550369eed20e7fb565bfb74eec44f1f0" + integrity sha512-R+phe509UuUYy9Tk0YlSbipRpfVtIzb/9BHn5pTEtjJTF5LXvUjrIQcZvNyANNEyFrd2YGs196PniNT1fgvOQA== + dependencies: + "@types/cheerio" "*" + "@types/react" "*" + +"@types/error-stack-parser@^1.3.18": + version "1.3.18" + resolved "https://registry.yarnpkg.com/@types/error-stack-parser/-/error-stack-parser-1.3.18.tgz#e01c9f8c85ca83b610320c62258b0c9026ade0f7" + integrity sha1-4ByfjIXKg7YQMgxiJYsMkCat4Pc= + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/estree@^0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/fs-extra@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.1.tgz#91c8fc4c51f6d5dbe44c2ca9ab09310bd00c7918" + integrity sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg== + dependencies: + "@types/node" "*" + +"@types/glob@^7.1.1": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.2.tgz#06ca26521353a545d94a0adc74f38a59d232c987" + integrity sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" + integrity sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ== + dependencies: + "@types/node" "*" + +"@types/history@*", "@types/history@^4.7.5": + version "4.7.6" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.6.tgz#ed8fc802c45b8e8f54419c2d054e55c9ea344356" + integrity sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w== + +"@types/hoist-non-react-statics@^3.3.0": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/jest@^24.9.1": + version "24.9.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.9.1.tgz#02baf9573c78f1b9974a5f36778b366aa77bd534" + integrity sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q== + dependencies: + jest-diff "^24.3.0" + +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" + integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/lodash@^4.14.72": + version "4.14.155" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.155.tgz#e2b4514f46a261fd11542e47519c20ebce7bc23a" + integrity sha512-vEcX7S7aPhsBCivxMwAANQburHBtfN9RdyXFk84IJmu2Z4Hkg1tOFgaslRiEqqvoLtbCBi6ika1EMspE+NZ9Lg== + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/minimist@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" + integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= + +"@types/node@*": + version "14.0.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.13.tgz#ee1128e881b874c371374c1f72201893616417c9" + integrity sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA== + +"@types/node@^10.12.19": + version "10.17.26" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.26.tgz#a8a119960bff16b823be4c617da028570779bcfd" + integrity sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw== + +"@types/node@^12", "@types/node@^12.0.12": + version "12.12.47" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.47.tgz#5007b8866a2f9150de82335ca7e24dd1d59bdfb5" + integrity sha512-yzBInQFhdY8kaZmqoL2+3U5dSTMrKaYcb561VU+lDzAYvqt+2lojvBEy+hmpSNuXnPTx7m9+04CzWYOUqWME2A== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prettier@^1.19.0": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" + integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== + +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + +"@types/q@^1.5.1": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + +"@types/react-dom@^16.9.7": + version "16.9.8" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423" + integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA== + dependencies: + "@types/react" "*" + +"@types/react-redux@^7.1.6": + version "7.1.9" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.9.tgz#280c13565c9f13ceb727ec21e767abe0e9b4aec3" + integrity sha512-mpC0jqxhP4mhmOl3P4ipRsgTgbNofMRXJb08Ms6gekViLj61v1hOZEKWDCyWsdONr6EjEA6ZHXC446wdywDe0w== + dependencies: + "@types/hoist-non-react-statics" "^3.3.0" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" + +"@types/react-router-dom@^5.1.5": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.5.tgz#7c334a2ea785dbad2b2dcdd83d2cf3d9973da090" + integrity sha512-ArBM4B1g3BWLGbaGvwBGO75GNFbLDUthrDojV2vHLih/Tq8M+tgvY1DSwkuNrPSwdp/GUL93WSEpTZs8nVyJLw== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*", "@types/react-router@^5.1.7": + version "5.1.7" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.7.tgz#e9d12ed7dcfc79187e4d36667745b69a5aa11556" + integrity sha512-2ouP76VQafKjtuc0ShpwUebhHwJo0G6rhahW9Pb8au3tQTjYXd2jta4wv6U2tGLR/I42yuG00+UXjNYY0dTzbg== + dependencies: + "@types/history" "*" + "@types/react" "*" + +"@types/react-test-renderer@^16.9.2": + version "16.9.2" + resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-16.9.2.tgz#e1c408831e8183e5ad748fdece02214a7c2ab6c5" + integrity sha512-4eJr1JFLIAlWhzDkBCkhrOIWOvOxcCAfQh+jiKg7l/nNZcCIL2MHl2dZhogIFKyHzedVWHaVP1Yydq/Ruu4agw== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^16.9.17": + version "16.9.38" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.38.tgz#868405dace93a4095d3e054f4c4a1de7a1ac0680" + integrity sha512-pHAeZbjjNRa/hxyNuLrvbxhhnKyKNiLC6I5fRF2Zr/t/S6zS41MiyzH4+c+1I9vVfvuRt1VS2Lodjr4ZWnxrdA== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + +"@types/redux-logger@^3.0.7": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@types/redux-logger/-/redux-logger-3.0.8.tgz#1fb6d26917bb198792bb1cf57feb31cae1532c5d" + integrity sha512-zM+cxiSw6nZtRbxpVp9SE3x/X77Z7e7YAfHD1NkxJyJbAGSXJGF0E9aqajZfPOa/sTYnuwutmlCldveExuCeLw== + dependencies: + redux "^4.0.0" + +"@types/semver@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.2.0.tgz#0d72066965e910531e1db4621c15d0ca36b8d83b" + integrity sha512-TbB0A8ACUWZt3Y6bQPstW9QNbhNeebdgLX4T/ZfkrswAfUzRiXrgd9seol+X379Wa589Pu4UEx9Uok0D4RjRCQ== + dependencies: + "@types/node" "*" + +"@types/sinon@^7.5.2": + version "7.5.2" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.5.2.tgz#5e2f1d120f07b9cda07e5dedd4f3bf8888fccdb9" + integrity sha512-T+m89VdXj/eidZyejvmoP9jivXgBDdkOSBVQjU9kF349NEx10QdPNGxHeZUaj1IlJ32/ewdyXJjnJxyxJroYwg== + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/tapable@*", "@types/tapable@^1.0.5": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" + integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== + +"@types/uglify-js@*": + version "3.9.2" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.2.tgz#01992579debba674e1e359cd6bcb1a1d0ab2e02b" + integrity sha512-d6dIfpPbF+8B7WiCi2ELY7m0w1joD8cRW4ms88Emdb2w062NeEpbNCeWwVCgzLRpVG+5e74VFSg4rgJ2xXjEiQ== + dependencies: + source-map "^0.6.1" + +"@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + +"@types/uuid@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.0.0.tgz#165aae4819ad2174a17476dbe66feebd549556c0" + integrity sha512-xSQfNcvOiE5f9dyd4Kzxbof1aTrLobL278pGLKOZI6esGfZ7ts9Ka16CzIN6Y8hFHE1C7jIBZokULhK1bOgjRw== + +"@types/vfile-message@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-2.0.0.tgz#690e46af0fdfc1f9faae00cd049cc888957927d5" + integrity sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw== + dependencies: + vfile-message "*" + +"@types/web-bluetooth@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.2.tgz#5cf081c320323543712c49c49ed520bf65eead1a" + integrity sha1-XPCBwyAyNUNxLEnEntUgv2XurRo= + +"@types/webdriverio@^4.8.0": + version "4.13.3" + resolved "https://registry.yarnpkg.com/@types/webdriverio/-/webdriverio-4.13.3.tgz#c1571c4e62724135c0b11e7d7e36b07af5168856" + integrity sha512-AfSQM1xTO9Ax+u9uSQPDuw69DQ0qA2RMoKHn86jCgWNcwKVUjGMSP4sfSl3JOfcZN8X/gWvn7znVPp2/g9zcJA== + dependencies: + "@types/node" "*" + +"@types/webpack-sources@*": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-1.4.0.tgz#e58f1f05f87d39a5c64cf85705bdbdbb94d4d57e" + integrity sha512-c88dKrpSle9BtTqR6ifdaxu1Lvjsl3C5OsfvuUbUwdXymshv1TkufUAXBajCCUM/f/TmnkZC/Esb03MinzSiXQ== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack@^4.41.3": + version "4.41.17" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.17.tgz#0a69005e644d657c85b7d6ec1c826a71bebd1c93" + integrity sha512-6FfeCidTSHozwKI67gIVQQ5Mp0g4X96c2IXxX75hYEQJwST/i6NyZexP//zzMOBb+wG9jJ7oO8fk9yObP2HWAw== + dependencies: + "@types/anymatch" "*" + "@types/node" "*" + "@types/tapable" "*" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + source-map "^0.6.0" + +"@types/yargs-parser@*": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + +"@types/yargs@^13.0.0": + version "13.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.9.tgz#44028e974343c7afcf3960f1a2b1099c39a7b5e1" + integrity sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^15.0.0", "@types/yargs@^15.0.5": + version "15.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" + integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^2.17.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" + integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== + dependencies: + "@typescript-eslint/experimental-utils" "2.34.0" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.34.0", "@typescript-eslint/experimental-utils@^2.5.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" + integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^2.17.0", "@typescript-eslint/parser@^2.3.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" + integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" + integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +a-big-triangle@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/a-big-triangle/-/a-big-triangle-1.0.3.tgz#eefd30b02a8f525e8b1f72bb6bb1b0c16751c794" + integrity sha1-7v0wsCqPUl6LH3K7a7GwwWdRx5Q= + dependencies: + gl-buffer "^2.1.1" + gl-vao "^1.2.0" + weak-map "^1.0.5" + +abab@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abs-svg-path@^0.1.1, abs-svg-path@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" + integrity sha1-32Acjo0roQ1KdtYl4japo5wnI78= + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +accessibility-developer-tools@^2.11.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz#3da0cce9d6ec6373964b84f35db7cfc3df7ab514" + integrity sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ= + +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + +acorn-es7-plugin@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz#f2ee1f3228a90eead1245f9ab1922eb2e71d336b" + integrity sha1-8u4fMiipDurRJF+asZIusucdM2s= + +acorn-globals@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-hammerhead@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/acorn-hammerhead/-/acorn-hammerhead-0.3.0.tgz#2f83730f15e8450169c3dfd88af3ea9405ea973d" + integrity sha512-Izrr9mXONhWc7q8fqUe6ijQy+KjmyQlgdWARgaCVjds+nPpoSS298FY8uSVN/to8nKVTtkJpafNUlACWxwZS5w== + dependencies: + "@types/estree" "^0.0.39" + +acorn-jsx@^5.0.1, acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +"acorn@>= 2.5.2 <= 5.7.3": + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1, acorn@^6.1.1, acorn@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +acorn@^7.1.0, acorn@^7.1.1, acorn@^7.2.0: + version "7.3.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" + integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== + +add-line-numbers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/add-line-numbers/-/add-line-numbers-1.0.1.tgz#48dbbdea47dbd234deafeac6c93cea6f70b4b7e3" + integrity sha1-SNu96kfb0jTer+rGyTzqb3C0t+M= + dependencies: + pad-left "^1.0.2" + +address@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + +affine-hull@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/affine-hull/-/affine-hull-1.0.0.tgz#763ff1d38d063ceb7e272f17ee4d7bbcaf905c5d" + integrity sha1-dj/x040GPOt+Jy8X7k17vK+QXF0= + dependencies: + robust-orientation "^1.1.3" + +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +airbnb-prop-types@^2.15.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz#5287820043af1eb469f5b0af0d6f70da6c52aaef" + integrity sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA== + dependencies: + array.prototype.find "^2.1.0" + function.prototype.name "^1.1.1" + has "^1.0.3" + is-regex "^1.0.4" + object-is "^1.0.1" + object.assign "^4.1.0" + object.entries "^1.1.0" + prop-types "^15.7.2" + prop-types-exact "^1.2.0" + react-is "^16.9.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.0.tgz#5c894537098785926d71e696114a53ce768ed773" + integrity sha512-eyoaac3btgU8eJlvh01En8OCKzRqlLe2G5jDsCr3RiE2uLGMEEB1aaGwVVpwR8M95956tGH6R+9edC++OvzaVw== + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.2, ajv@^6.5.5: + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +almost-equal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/almost-equal/-/almost-equal-1.1.0.tgz#f851c631138757994276aa2efbe8dfa3066cccdd" + integrity sha1-+FHGMROHV5lCdqou++jfowZszN0= + +alpha-complex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/alpha-complex/-/alpha-complex-1.0.0.tgz#90865870d6b0542ae73c0c131d4ef989669b72d2" + integrity sha1-kIZYcNawVCrnPAwTHU75iWabctI= + dependencies: + circumradius "^1.0.0" + delaunay-triangulate "^1.1.6" + +alpha-shape@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/alpha-shape/-/alpha-shape-1.0.0.tgz#c83109923ecfda667d2163fe4f26fe24726f64a9" + integrity sha1-yDEJkj7P2mZ9IWP+Tyb+JHJvZKk= + dependencies: + alpha-complex "^1.0.0" + simplicial-complex-boundary "^1.0.0" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +anser@^1.4.1: + version "1.4.9" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" + integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== + +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + dependencies: + string-width "^3.0.0" + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + +ansi-colors@^3.0.0, ansi-colors@^3.2.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= + dependencies: + ansi-wrap "0.1.0" + +ansi-escapes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" + integrity sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs= + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= + dependencies: + ansi-wrap "0.1.0" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +ansi-to-react@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/ansi-to-react/-/ansi-to-react-3.3.5.tgz#aad1850d5a69f5c008866697e2cbf88f8418cfe2" + integrity sha512-uAI8NOh+/5PC1poTnLwhuO7whaxPst1lZCeq+7P7hlP0A6GRXjXu1f5qprTwT3NHtjIWyMcFJAL0Im0HyB2XeQ== + dependencies: + "@babel/runtime-corejs2" "^7.0.0" + anser "^1.4.1" + babel-runtime "^6.26.0" + escape-carriage "^1.2.0" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.3, anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-builder-bin@3.5.9: + version "3.5.9" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.5.9.tgz#a3ac0c25286bac68357321cb2eaf7128b0bc0a4f" + integrity sha512-NSjtqZ3x2kYiDp3Qezsgukx/AUzKPr3Xgf9by4cYt05ILWGAptepeeu0Uv+7MO+41o6ujhLixTou8979JGg2Kg== + +app-builder-lib@22.7.0: + version "22.7.0" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-22.7.0.tgz#ccd3e7ece2d46bc209423a77aa142f74aaf65db0" + integrity sha512-blRKwV8h0ztualXS50ciCTo39tbuDGNS+ldcy8+KLvKXuT6OpYnSJ7M6MSfPT+xWatshMHJV1rJx3Tl+k/Sn/g== + dependencies: + "7zip-bin" "~5.0.3" + "@develar/schema-utils" "~2.6.5" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "22.7.0" + builder-util-runtime "8.7.1" + chromium-pickle-js "^0.2.0" + debug "^4.2.0" + ejs "^3.1.3" + electron-publish "22.7.0" + fs-extra "^9.0.0" + hosted-git-info "^3.0.4" + is-ci "^2.0.0" + isbinaryfile "^4.0.6" + js-yaml "^3.14.0" + lazy-val "^1.0.4" + minimatch "^3.0.4" + normalize-package-data "^2.5.0" + read-config-file "6.0.0" + sanitize-filename "^1.6.3" + semver "^7.3.2" + temp-file "^3.3.7" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +archiver-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" + integrity sha1-5QtMCccL89aA4y/xt5lOn52JUXQ= + dependencies: + glob "^7.0.0" + graceful-fs "^4.1.0" + lazystream "^1.0.0" + lodash "^4.8.0" + normalize-path "^2.0.0" + readable-stream "^2.0.0" + +archiver@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-2.1.1.tgz#ff662b4a78201494a3ee544d3a33fe7496509ebc" + integrity sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw= + dependencies: + archiver-utils "^1.3.0" + async "^2.0.0" + buffer-crc32 "^0.2.1" + glob "^7.0.0" + lodash "^4.8.0" + readable-stream "^2.0.0" + tar-stream "^1.5.0" + zip-stream "^1.2.0" + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-bounds@^1.0.0, array-bounds@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-bounds/-/array-bounds-1.0.1.tgz#da11356b4e18e075a4f0c86e1f179a67b7d7ea31" + integrity sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ== + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-filter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" + integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-find@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8" + integrity sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-includes@^3.0.3, array-includes@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + +array-normalize@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array-normalize/-/array-normalize-1.1.4.tgz#d75cec57383358af38efdf6a78071aa36ae4174c" + integrity sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg== + dependencies: + array-bounds "^1.0.0" + +array-range@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-range/-/array-range-1.0.1.tgz#f56e46591843611c6a56f77ef02eda7c50089bfc" + integrity sha1-9W5GWRhDYRxqVvd+8C7afFAIm/w= + +array-rearrange@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/array-rearrange/-/array-rearrange-2.2.2.tgz#fa1a2acf8d02e88dd0c9602aa0e06a79158b2283" + integrity sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w== + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= + +array-union@^1.0.1, array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.find@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.1.tgz#3baca26108ca7affb08db06bf0be6cb3115a969c" + integrity sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.4" + +array.prototype.flat@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + +asar@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-2.1.0.tgz#97c6a570408c4e38a18d4a3fb748a621b5a7844e" + integrity sha512-d2Ovma+bfqNpvBzY/KU8oPY67ZworixTpkjSx0PCXnQi67c2cXmssaTxpFDUM0ttopXoGx/KRxNg/GDThYbXQA== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^2.20.0" + cuint "^0.2.2" + glob "^7.1.3" + minimatch "^3.0.4" + mkdirp "^0.5.1" + tmp-promise "^1.0.5" + optionalDependencies: + "@types/glob" "^7.1.1" + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-metadata-inferer@^0.2.0-0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.2.0.tgz#a470e5d1d7402b18c6f7a1f3d6900723cfa07392" + integrity sha512-6yPph2NeCHNxoI/ZmjklYaLOSZDAx+0L0+wsXnF56FxmjxvUlYZSWcj1KXtXO8IufruQTzVFOjg1+IzdDazSPg== + +ast-types-flow@0.0.7, ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-exit-hook@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-1.1.2.tgz#8095d75e488c29acee0551fe87252169d789cfba" + integrity sha1-gJXXXkiMKazuBVH+hyUhadeJz7o= + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.6.tgz#ad3f373d9249ae324881565582bc90e152abbd68" + integrity sha1-rT83PZJJrjJIgVZVgryQ4VKrvWg= + +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + +async@^2.0.0, async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-1.0.0.tgz#b88dca6006922b962094f7556826bab31c4a296b" + integrity sha1-uI3KYAaSK5YglPdVaCa6sxxKKWs= + +atob-lite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" + integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.8.0: + version "9.8.2" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.2.tgz#7347396ee576b18687041bfbacd76d78e27baa56" + integrity sha512-9UwMMU8Rg7Fj0c55mbOpXrr/2WrRqoOwOlLNTyyYt+nhiyQdIBWipp5XWzt+Lge8r3DK5y+EHMc1OBf8VpZA6Q== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001084" + kleur "^4.0.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" + integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== + +axobject-query@^2.0.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-core@^6.22.1, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-eslint@^10.0.3, babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" + integrity sha1-FMGeXxQte0fxmlJDHlKxzLxAozA= + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-builder-react-jsx@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" + integrity sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + esutils "^2.0.2" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" + integrity sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes= + dependencies: + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^25.1.0, babel-jest@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.5.1.tgz#bc2e6101f849d6f6aec09720ffc7bc5332e62853" + integrity sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ== + dependencies: + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.0" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^25.5.0" + chalk "^3.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + +babel-loader@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-dev-expression@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-dev-expression/-/babel-plugin-dev-expression-0.2.2.tgz#c18de18a06150f9480edd151acbb01d2e65e999b" + integrity sha512-y32lfBif+c2FIh5dwGfcc/IfX5aw/Bru7Du7W2n17sJE/GJGAsmIk5DPW/8JOoeKpXW5evJfJOvRq5xkiS6vng== + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" + integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + dependencies: + "@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@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz#129c80ba5c7fc75baf3a45b93e2e372d57ca2677" + integrity sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + integrity sha1-a8lj67FuzLrmuStZbrfzXDQqi5o= + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94= + +babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + integrity sha1-MSVjtNvePMgGzuPkFszurd0RrAs= + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + integrity sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo= + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + integrity sha1-TDqyCiryaqIM0lmVw5jE63AxDI0= + +babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= + +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" + integrity sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds= + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw= + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" + integrity sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0= + dependencies: + babel-helper-explode-class "^6.24.1" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-flow-strip-types@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + integrity sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988= + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-for-of-as-array@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-for-of-as-array/-/babel-plugin-transform-for-of-as-array-1.1.1.tgz#f18fcbcbfa2b8caed1445c3153893d37439a6537" + integrity sha512-eE4hZJhOUKpX0q/X3adR8B4hLox+t8oe4ZqmhANUmv4cds07AbWt6O0rtFXK7PKFPPnW4nz/5mpbkPMkflyGeg== + +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-display-name@^6.23.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" + integrity sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-self@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" + integrity sha1-322AqdomEqEh5t3XVYvL7PBuY24= + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-source@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" + integrity sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY= + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" + integrity sha1-hAoCjn30YN/DotKfDA2R9jduZqM= + dependencies: + babel-helper-builder-react-jsx "^6.24.1" + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-remove-prop-types@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" + integrity sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-current-node-syntax@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz#b4b547acddbf963cba555ba9f9cbbb70bfd044da" + integrity sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ== + dependencies: + "@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-import-meta" "^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-env@^1.1.8: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + +babel-preset-fbjs@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz#a6024764ea86c8e06a22d794ca8b69534d263541" + integrity sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + +babel-preset-flow@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" + integrity sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0= + dependencies: + babel-plugin-transform-flow-strip-types "^6.22.0" + +babel-preset-jest@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz#c1d7f191829487a907764c65307faa0e66590b49" + integrity sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw== + dependencies: + babel-plugin-jest-hoist "^25.5.0" + babel-preset-current-node-syntax "^0.1.2" + +babel-preset-react@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" + integrity sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A= + dependencies: + babel-plugin-syntax-jsx "^6.3.13" + babel-plugin-transform-react-display-name "^6.23.0" + babel-plugin-transform-react-jsx "^6.24.1" + babel-plugin-transform-react-jsx-self "^6.22.0" + babel-plugin-transform-react-jsx-source "^6.22.0" + babel-preset-flow "^6.23.0" + +babel-preset-stage-2@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" + integrity sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE= + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-decorators "^6.24.1" + babel-preset-stage-3 "^6.24.1" + +babel-preset-stage-3@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" + integrity sha1-g2raCp56f6N8sTj7kyb4eTSkg5U= + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^5.8.34: + version "5.8.38" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-5.8.38.tgz#1c0b02eb63312f5f087ff20450827b425c9d4c19" + integrity sha1-HAsC62MxL18If/IEUIJ7QlydTBk= + dependencies: + core-js "^1.0.0" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.25.0, babel-runtime@^6.26.0, babel-runtime@^6.6.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +babylon@^7.0.0-beta.44: + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.47.tgz#6d1fa44f0abec41ab7c780481e62fd9aafbdea80" + integrity sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ== + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +barycentric@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/barycentric/-/barycentric-1.0.1.tgz#f1562bb891b26f4fec463a82eeda3657800ec688" + integrity sha1-8VYruJGyb0/sRjqC7to2V4AOxog= + dependencies: + robust-linear-solve "^1.0.0" + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" + integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= + +base64-js@^1.0.2, base64-js@^1.1.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bfj@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== + dependencies: + bluebird "^3.5.5" + check-types "^8.0.3" + hoopy "^0.1.4" + tryer "^1.0.1" + +big-rat@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/big-rat/-/big-rat-1.0.4.tgz#768d093bb57930dd18ed575c7fca27dc5391adea" + integrity sha1-do0JO7V5MN0Y7Vdcf8on3FORreo= + dependencies: + bit-twiddle "^1.0.2" + bn.js "^4.11.6" + double-bits "^1.1.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +bin-v8-flags-filter@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/bin-v8-flags-filter/-/bin-v8-flags-filter-1.2.0.tgz#023fc4ee22999b2b1f6dd1b7253621366841537e" + integrity sha512-g8aeYkY7GhyyKRvQMBsJQZjhm2iCX3dKYvfrMpwVR8IxmUGrkpCBFoKbB9Rh0o3sTLCjU/1tFpZ4C7j3f+D+3g== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +binary-search-bounds@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz#323ca317e3f2a40f4244c7255f5384a5b207bb69" + integrity sha1-MjyjF+PypA9CRMclX1OEpbIHu2k= + +binary-search-bounds@^2.0.3, binary-search-bounds@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz#eea0e4081da93baa851c7d851a7e636c3d51307f" + integrity sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bit-twiddle@^1.0.0, bit-twiddle@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-1.0.2.tgz#0c6c1fabe2b23d17173d9a61b7b7093eb9e1769e" + integrity sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4= + +bit-twiddle@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-0.0.2.tgz#c2eaebb952a3b94acc140497e1cdcd2f1a33f58e" + integrity sha1-wurruVKjuUrMFASX4c3NLxoz9Y4= + +bitmap-sdf@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz#c99913e5729357a6fd350de34158180c013880b2" + integrity sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg== + dependencies: + clamp "^1.0.1" + +bl@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.5.0, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.6, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" + integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boolean@^3.0.0, boolean@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.1.tgz#35ecf2b4a2ee191b0b44986f14eb5f052a5cbb4f" + integrity sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA== + +boundary-cells@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/boundary-cells/-/boundary-cells-2.0.1.tgz#e905a8d1419cf47cb36be3dbf525db5e24de0042" + integrity sha1-6QWo0UGc9Hyza+Pb9SXbXiTeAEI= + dependencies: + tape "^4.0.0" + +bowser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.6.0.tgz#37fc387b616cb6aef370dab4d6bd402b74c5c54d" + integrity sha1-N/w4e2Fstq7zcNq01r1AK3TFxU0= + +bowser@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.9.0.tgz#3bed854233b419b9a7422d9ee3e85504373821c9" + integrity sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA== + +box-intersect@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/box-intersect/-/box-intersect-1.0.2.tgz#4693ad63e828868d0654b114e09364d6281f3fbd" + integrity sha512-yJeMwlmFPG1gIa7Rs/cGXeI6iOj6Qz5MG5PE61xLKpElUGzmJ4abm+qsLpzxKJFpsSDq742BQEocr8dI2t8Nxw== + dependencies: + bit-twiddle "^1.0.2" + typedarray-pool "^1.1.0" + +boxen@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" + integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^5.3.1" + chalk "^3.0.0" + cli-boxes "^2.2.0" + string-width "^4.1.0" + term-size "^2.1.0" + type-fest "^0.8.1" + widest-line "^3.1.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +brotli@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.2.tgz#525a9cad4fcba96475d7d388f6aecb13eed52f46" + integrity sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y= + dependencies: + base64-js "^1.1.2" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + 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@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" + integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.2" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist-config-erb@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/browserslist-config-erb/-/browserslist-config-erb-0.0.1.tgz#0a93648bbe11fac5b9fe555bf061f31980db64db" + integrity sha512-QQQzCXrYVVdSWxO0UuV+f2HGBt7xdGRRvgr49W1lcwoyXNpRQFVi5cTz8+B/rLHyBkWd4JbRFeTIKHAw7BpCBg== + +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.8.5: + version "4.12.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" + integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== + dependencies: + caniuse-lite "^1.0.30001043" + electron-to-chromium "^1.3.413" + node-releases "^1.1.53" + pkg-up "^2.0.0" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buble@^0.19.3: + version "0.19.8" + resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.8.tgz#d642f0081afab66dccd897d7b6360d94030b9d3d" + integrity sha512-IoGZzrUTY5fKXVkgGHw3QeXFMUNBFv+9l8a4QJKG1JhG3nCMHTdEX1DCOg8568E2Q9qvAQIiSokv6Jsgx8p2cA== + dependencies: + acorn "^6.1.1" + acorn-dynamic-import "^4.0.0" + acorn-jsx "^5.0.1" + chalk "^2.4.2" + magic-string "^0.25.3" + minimist "^1.2.0" + os-homedir "^2.0.0" + regexpu-core "^4.5.4" + +bubleify@^1.1.0, bubleify@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bubleify/-/bubleify-1.2.1.tgz#c11fa33fa59d5b9b747d4e486f43889084257f37" + integrity sha512-vp3NHmaQVoKaKWvi15FTMinPNjfp+47+/kFJ9ifezdMF/CBLArCxDVUh+FQE3qRxCRj1qyjJqilTBHHqlM8MaQ== + dependencies: + buble "^0.19.3" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@^0.2.1, buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.1.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +builder-util-runtime@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.0.tgz#e48ad004835c8284662e8eaf47a53468c66e8e8d" + integrity sha512-G1AqqVM2vYTrSFR982c1NNzwXKrGLQjVjaZaWQdn4O6Z3YKjdMDofw88aD9jpyK9ZXkrCxR0tI3Qe9wNbyTlXg== + dependencies: + debug "^4.1.1" + sax "^1.2.4" + +builder-util-runtime@8.7.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.1.tgz#23c808cddd650d4376a7a1518ec1e80e85c10f00" + integrity sha512-uEBH1nAnTvzjcsrh2XI3qOzJ39h0+9kuIuwj+kCc3a07TZNGShfJcai8fFzL3mNgGjEFxoq+XMssR11r+FOFSg== + dependencies: + debug "^4.2.0" + sax "^1.2.4" + +builder-util@22.7.0: + version "22.7.0" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.7.0.tgz#0776a66e6d6e408a78bed7f17a7ad22516d9e7f0" + integrity sha512-UV3MKL0mwjMq2y9JlBf28Cegpj0CrIXcjGkO0TXn+QZ6Yy9rY6lHOuUvpQ19ct2Qh1o+QSwH3Q1nKUf5viJBBg== + dependencies: + "7zip-bin" "~5.0.3" + "@types/debug" "^4.1.5" + "@types/fs-extra" "^9.0.1" + app-builder-bin "3.5.9" + bluebird-lst "^1.0.9" + builder-util-runtime "8.7.1" + chalk "^4.0.0" + debug "^4.2.0" + fs-extra "^9.0.0" + is-ci "^2.0.0" + js-yaml "^3.14.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.3.7" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + 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" + +cacache@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsite-record@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/callsite-record/-/callsite-record-4.1.3.tgz#3041d2a1c72aff86b00b151e47d25566520c4207" + integrity sha512-otAcPmu8TiHZ38cIL3NjQa1nGoSQRRe8WDDUgj5ZUwJWn1wzOYBwVSJbpVyzZ0sesQeKlYsPu9DG70fhh6AK9g== + dependencies: + "@types/error-stack-parser" "^1.3.18" + "@types/lodash" "^4.14.72" + callsite "^1.0.0" + chalk "^2.4.0" + error-stack-parser "^1.3.3" + highlight-es "^1.0.0" + lodash "4.6.1 || ^4.16.1" + pinkie-promise "^2.0.0" + +callsite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" + integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-db@^1.0.30001059: + version "1.0.30001085" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001085.tgz#4f6fcf0c10e69fabad8cf237b5990ee09718d7d8" + integrity sha512-+w8XO3jUi79lgiBANacwq/ZY8EnkOcatTyT7z03z/YxL2kysI9h3jUGKafkCkP69F4jpKXSjhJ9BUvsgQrGFpA== + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.30001084: + version "1.0.30001085" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001085.tgz#bed28bd51ff7425d33ee23e730c7f3b703711db6" + integrity sha512-x0YRFRE0pmOD90z+9Xk7jwO58p4feVNXP+U8kWV+Uo/HADyrgESlepzIkUqPgaXkpyceZU6siM1gsK7sHgplqA== + +canvas-fit@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/canvas-fit/-/canvas-fit-1.5.0.tgz#ae13be66ade42f5be0e487e345fce30a5e5b5e5f" + integrity sha1-rhO+Zq3kL1vg5IfjRfzjCl5bXl8= + dependencies: + element-size "^1.1.1" + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +ccount@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17" + integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw== + +cdt2d@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cdt2d/-/cdt2d-1.0.0.tgz#4f212434bcd67bdb3d68b8fef4acdc2c54415141" + integrity sha1-TyEkNLzWe9s9aLj+9KzcLFRBUUE= + dependencies: + binary-search-bounds "^2.0.3" + robust-in-sphere "^1.1.3" + robust-orientation "^1.1.3" + +cell-orientation@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cell-orientation/-/cell-orientation-1.0.1.tgz#b504ad96a66ad286d9edd985a2253d03b80d2850" + integrity sha1-tQStlqZq0obZ7dmFoiU9A7gNKFA= + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chai@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-html4@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" + integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +check-types@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== + +cheerio@^1.0.0-rc.3: + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" + integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.1" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash "^4.15.0" + parse5 "^3.0.1" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" + integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.4.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.1, chownr@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-remote-interface@^0.25.3: + version "0.25.7" + resolved "https://registry.yarnpkg.com/chrome-remote-interface/-/chrome-remote-interface-0.25.7.tgz#827e85fbef3cc561a9ef2404eb7eee355968c5bc" + integrity sha512-6zI6LbR2IiGmduFZededaerEr9hHXabxT/L+fRrdq65a0CfyLMzpq0BKuZiqN0Upqcacsb6q2POj7fmobwBsEA== + dependencies: + commander "2.11.x" + ws "3.3.x" + +chrome-remote-interface@^0.27.0: + version "0.27.2" + resolved "https://registry.yarnpkg.com/chrome-remote-interface/-/chrome-remote-interface-0.27.2.tgz#e5605605f092b7ef8575d95304e004039c9d0ab9" + integrity sha512-pVLljQ29SAx8KIv5tSa9sIf8GrEsAZdPJoeWOmY3/nrIzFmE+EryNNHvDkddGod0cmAFTv+GmPG0uvzxi2NWsA== + dependencies: + commander "2.11.x" + ws "^6.1.0" + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circumcenter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/circumcenter/-/circumcenter-1.0.0.tgz#20d7aa13b17fbac52f52da4f54c6ac8b906ee529" + integrity sha1-INeqE7F/usUvUtpPVMasi5Bu5Sk= + dependencies: + dup "^1.0.0" + robust-linear-solve "^1.0.0" + +circumradius@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/circumradius/-/circumradius-1.0.0.tgz#706c447e3e55cd1ed3d11bd133e37c252cc305b5" + integrity sha1-cGxEfj5VzR7T0RvRM+N8JSzDBbU= + dependencies: + circumcenter "^1.0.0" + +clamp@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/clamp/-/clamp-1.0.1.tgz#66a0e64011816e37196828fdc8c8c147312c8634" + integrity sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ= + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@2.x, classnames@^2.2.5, classnames@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +clean-pslg@^1.1.0, clean-pslg@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/clean-pslg/-/clean-pslg-1.1.2.tgz#bd35c7460b7e8ab5a9f761a5ed51796aa3c86c11" + integrity sha1-vTXHRgt+irWp92Gl7VF5aqPIbBE= + dependencies: + big-rat "^1.0.3" + box-intersect "^1.0.1" + nextafter "^1.0.0" + rat-vec "^1.1.1" + robust-segment-intersect "^1.0.1" + union-find "^1.0.2" + uniq "^1.0.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" + integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.3.0.tgz#0632239a4b5aa4c958610142c34bb7a651fc8df5" + integrity sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w== + +cli-truncate@2.1.0, cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-regexp@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" + integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q== + dependencies: + is-regexp "^2.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +coffeescript@^2.3.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-2.5.1.tgz#b2442a1f2c806139669534a54adc35010559d16a" + integrity sha512-J2jRPX0eeFh5VKyVnoLrfVFgLZtnnmp96WQSLAS8OrLm2wtQLcnikYKe1gViJKDH7vucjuhHvBKKBP3rKcD1tQ== + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-alpha@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/color-alpha/-/color-alpha-1.0.4.tgz#c141dc926e95fc3db647d0e14e5bc3651c29e040" + integrity sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A== + dependencies: + color-parse "^1.3.8" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-id@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/color-id/-/color-id-1.1.0.tgz#5e9159b99a73ac98f74820cb98a15fde3d7e034c" + integrity sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g== + dependencies: + clamp "^1.0.1" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-normalize@1.5.0, color-normalize@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/color-normalize/-/color-normalize-1.5.0.tgz#ee610af9acb15daf73e77a945a847b18e40772da" + integrity sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw== + dependencies: + clamp "^1.0.1" + color-rgba "^2.1.1" + dtype "^2.0.0" + +color-parse@^1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.3.8.tgz#eaf54cd385cb34c0681f18c218aca38478082fa3" + integrity sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA== + dependencies: + color-name "^1.0.0" + defined "^1.0.0" + is-plain-obj "^1.1.0" + +color-rgba@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-2.1.1.tgz#4633b83817c7406c90b3d7bf4d1acfa48dde5c83" + integrity sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw== + dependencies: + clamp "^1.0.1" + color-parse "^1.3.8" + color-space "^1.14.6" + +color-space@^1.14.6: + version "1.16.0" + resolved "https://registry.yarnpkg.com/color-space/-/color-space-1.16.0.tgz#611781bca41cd8582a1466fd9e28a7d3d89772a2" + integrity sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg== + dependencies: + hsluv "^0.0.3" + mumath "^3.3.4" + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colormap@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/colormap/-/colormap-2.3.1.tgz#9f2ab643591c0728d32332d5480b2487a4e0f249" + integrity sha512-TEzNlo/qYp6pBoR2SK9JiV+DG1cmUcVO/+DEJqVPSHIKNlWh5L5L4FYog7b/h0bAnhKhpOAvx/c1dFp2QE9sFw== + dependencies: + lerp "^1.0.3" + +colors@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2, commander@^2.11.0, commander@^2.15.1, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@^2.8.1: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@2.11.x: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compare-angle@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/compare-angle/-/compare-angle-1.0.1.tgz#a4eb63416ea3c747fc6bd6c8b63668b4de4fa129" + integrity sha1-pOtjQW6jx0f8a9bItjZotN5PoSk= + dependencies: + robust-orientation "^1.0.2" + robust-product "^1.0.0" + robust-sum "^1.0.0" + signum "^0.0.0" + two-sum "^1.0.0" + +compare-cell@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/compare-cell/-/compare-cell-1.0.0.tgz#a9eb708f6e0e41aef7aa566b130f1968dc9e1aaa" + integrity sha1-qetwj24OQa73qlZrEw8ZaNyeGqo= + +compare-oriented-cell@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/compare-oriented-cell/-/compare-oriented-cell-1.0.1.tgz#6a149feef9dfc4f8fc62358e51dd42effbbdc39e" + integrity sha1-ahSf7vnfxPj8YjWOUd1C7/u9w54= + dependencies: + cell-orientation "^1.0.1" + compare-cell "^1.0.0" + +compare-versions@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compress-commons@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f" + integrity sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8= + dependencies: + buffer-crc32 "^0.2.1" + crc32-stream "^2.0.0" + normalize-path "^2.0.0" + readable-stream "^2.0.0" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-dims@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/compute-dims/-/compute-dims-1.1.0.tgz#6d5b712929b6c531af3b4d580ed5adacbbd77e0c" + integrity sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg== + dependencies: + utils-copy "^1.0.0" + validate.io-array "^1.0.6" + validate.io-matrix-like "^1.0.2" + validate.io-ndarray-like "^1.0.0" + validate.io-positive-integer "^1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^1.6.2, concat-stream@~1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-stream@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + +concurrently@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.2.0.tgz#ead55121d08a0fc817085584c123cedec2e08975" + integrity sha512-XxcDbQ4/43d6CxR7+iV8IZXhur4KbmEJk1CetVMUqCy34z9l0DkszbY+/9wvmSnToTej0SYomc2WSRH+L0zVJw== + dependencies: + chalk "^2.4.2" + date-fns "^2.0.1" + lodash "^4.17.15" + read-pkg "^4.0.1" + rxjs "^6.5.2" + spawn-command "^0.0.2-1" + supports-color "^6.1.0" + tree-kill "^1.2.2" + yargs "^13.3.0" + +config-chain@^1.1.11: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +confusing-browser-globals@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" + integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connected-react-router@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/connected-react-router/-/connected-react-router-6.8.0.tgz#ddc687b31d498322445d235d660798489fa56cae" + integrity sha512-E64/6krdJM3Ag3MMmh2nKPtMbH15s3JQDuaYJvOVXzu6MbHbDyIvuwLOyhQIuP4Om9zqEfZYiVyflROibSsONg== + dependencies: + prop-types "^15.7.2" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +const-max-uint32@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/const-max-uint32/-/const-max-uint32-1.0.2.tgz#f009bb6230e678ed874dd2d6a9cd9e3cbfabb676" + integrity sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY= + +const-pinf-float64@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz#f6efb0d79f9c0986d3e79f2923abf9b70b63d726" + integrity sha1-9u+w15+cCYbT558pI6v5twtj1yY= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convex-hull@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/convex-hull/-/convex-hull-1.0.3.tgz#20a3aa6ce87f4adea2ff7d17971c9fc1c67e1fff" + integrity sha1-IKOqbOh/St6i/30XlxyfwcZ+H/8= + dependencies: + affine-hull "^1.0.0" + incremental-convex-hull "^1.0.1" + monotone-convex-hull-2d "^1.0.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + 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@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.2: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== + dependencies: + browserslist "^4.8.5" + semver "7.0.0" + +core-js-pure@^3.0.0: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" + integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + +core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.6.5: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +core-js@^3.6.1, core-js@^3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@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" + +country-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/country-regex/-/country-regex-1.1.0.tgz#51c333dcdf12927b7e5eeb9c10ac8112a6120896" + integrity sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY= + +crc32-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" + integrity sha1-483TtN8xaN10494/u8t7KX/pCPQ= + dependencies: + crc "^3.4.4" + readable-stream "^2.0.0" + +crc@^3.4.4: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + 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@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + 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" + +create-react-context@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.3.0.tgz#546dede9dc422def0d3fc2fe03afe0bc0f4f7d8c" + integrity sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw== + dependencies: + gud "^1.0.0" + warning "^4.0.3" + +cross-env@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.1.tgz#b2c76c1ca7add66dc874d11798466094f551b34d" + integrity sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ== + dependencies: + cross-spawn "^6.0.5" + +cross-env@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.2.tgz#bd5ed31339a93a3418ac4f3ca9ca3403082ae5f9" + integrity sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-unzip@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/cross-unzip/-/cross-unzip-0.0.2.tgz#5183bc47a09559befcf98cc4657964999359372f" + integrity sha1-UYO8R6CVWb78+YzEZXlkmZNZNy8= + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + 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" + +crypto-md5@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-md5/-/crypto-md5-1.0.0.tgz#ccc8da750c753c7edcbabc542967472a384e86bb" + integrity sha1-zMjadQx1PH7curxUKWdHKjhOhrs= + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-font-size-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz#854875ace9aca6a8d2ee0d345a44aae9bb6db6cb" + integrity sha1-hUh1rOmspqjS7g00WkSq6btttss= + +css-font-stretch-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz#50cee9b9ba031fb5c952d4723139f1e107b54b10" + integrity sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA= + +css-font-style-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz#5c3532813f63b4a1de954d13cea86ab4333409e4" + integrity sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ= + +css-font-weight-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz#9bc04671ac85bc724b574ef5d3ac96b0d604fd97" + integrity sha1-m8BGcayFvHJLV07106yWsNYE/Zc= + +css-font@^1.0.0, css-font@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-font/-/css-font-1.2.0.tgz#e73cbdc11fd87c8e6c928ad7098a9771c8c2b6e3" + integrity sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA== + dependencies: + css-font-size-keywords "^1.0.0" + css-font-stretch-keywords "^1.0.1" + css-font-style-keywords "^1.0.1" + css-font-weight-keywords "^1.0.0" + css-global-keywords "^1.0.1" + css-system-font-keywords "^1.0.0" + pick-by-alias "^1.2.0" + string-split-by "^1.0.0" + unquote "^1.1.0" + +css-global-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-global-keywords/-/css-global-keywords-1.0.1.tgz#72a9aea72796d019b1d2a3252de4e5aaa37e4a69" + integrity sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk= + +css-loader@^3.4.2: + version "3.6.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" + integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== + dependencies: + 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.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.0" + semver "^6.3.0" + +css-modules-loader-core@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16" + integrity sha1-WQhmgpShvs0mGuCkziGwtVHyHRY= + dependencies: + icss-replace-symbols "1.1.0" + postcss "6.0.1" + postcss-modules-extract-imports "1.1.0" + postcss-modules-local-by-default "1.2.0" + postcss-modules-scope "1.1.0" + postcss-modules-values "1.3.0" + +css-parse@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" + integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= + dependencies: + css "^2.0.0" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-selector-tokenizer@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz#11e5e27c9a48d90284f22d45061c303d7a25ad87" + integrity sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + regexpu-core "^4.6.0" + +css-system-font-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz#85c6f086aba4eb32c571a3086affc434b84823ed" + integrity sha1-hcbwhquk6zLFcaMIav/ENLhII+0= + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@1.0.0-alpha.39: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + +css-value@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/css-value/-/css-value-0.0.1.tgz#5efd6c2eea5ea1fd6b6ac57ec0427b18452424ea" + integrity sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo= + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css-what@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39" + integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg== + +css@2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz#f861f4ba61e79bedc962aa548e5780fd95cbc6be" + integrity sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ== + dependencies: + inherits "^2.0.1" + source-map "^0.1.38" + source-map-resolve "^0.5.1" + urix "^0.1.0" + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +csscolorparser@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" + integrity sha1-s085HupNqPPpgjHizNjfnAQfFxs= + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + dependencies: + css-tree "1.0.0-alpha.39" + +cssom@^0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^2.2.0, csstype@^2.6.7: + version "2.6.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" + integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== + +cubic-hermite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cubic-hermite/-/cubic-hermite-1.0.0.tgz#84e3b2f272b31454e8393b99bb6aed45168c14e5" + integrity sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU= + +cuint@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" + integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cwise-compiler@^1.0.0, cwise-compiler@^1.1.1, cwise-compiler@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" + integrity sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU= + dependencies: + uniq "^1.0.0" + +cwise-parser@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cwise-parser/-/cwise-parser-1.0.3.tgz#8e493c17d54f97cb030a9e9854bc86c9dfb354fe" + integrity sha1-jkk8F9VPl8sDCp6YVLyGyd+zVP4= + dependencies: + esprima "^1.0.3" + uniq "^1.0.0" + +cwise@^1.0.10, cwise@^1.0.4: + version "1.0.10" + resolved "https://registry.yarnpkg.com/cwise/-/cwise-1.0.10.tgz#24eee6072ebdfd6b8c6f5dadb17090b649b12bef" + integrity sha1-JO7mBy69/WuMb12tsXCQtkmxK+8= + dependencies: + cwise-compiler "^1.1.1" + cwise-parser "^1.0.0" + static-module "^1.0.0" + uglify-js "^2.6.0" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0, d3-array@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== + +d3-axis@1: + version "1.0.12" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz#cdf20ba210cfbb43795af33756886fb3638daac9" + integrity sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ== + +d3-brush@1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.5.tgz#066b8e84d17b192986030446c97c0fba7e1bacdc" + integrity sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A== + dependencies: + d3-dispatch "1" + d3-drag "1" + d3-interpolate "1" + d3-selection "1" + d3-transition "1" + +d3-chord@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz#309157e3f2db2c752f0280fedd35f2067ccbb15f" + integrity sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA== + dependencies: + d3-array "1" + d3-path "1" + +d3-collection@1, d3-collection@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== + +d3-color@1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" + integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== + +d3-contour@1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3" + integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg== + dependencies: + d3-array "^1.1.1" + +d3-dispatch@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" + integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== + +d3-drag@1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70" + integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w== + dependencies: + d3-dispatch "1" + d3-selection "1" + +d3-dsv@1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c" + integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g== + dependencies: + commander "2" + iconv-lite "0.4" + rw "1" + +d3-ease@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.6.tgz#ebdb6da22dfac0a22222f2d4da06f66c416a0ec0" + integrity sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ== + +d3-fetch@1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.2.0.tgz#15ce2ecfc41b092b1db50abd2c552c2316cf7fc7" + integrity sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA== + dependencies: + d3-dsv "1" + +d3-force@1, d3-force@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" + integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== + dependencies: + d3-collection "1" + d3-dispatch "1" + d3-quadtree "1" + d3-timer "1" + +d3-format@1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.4.tgz#356925f28d0fd7c7983bfad593726fce46844030" + integrity sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw== + +d3-geo@1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f" + integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== + dependencies: + d3-array "1" + +d3-hierarchy@1, d3-hierarchy@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" + integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== + +d3-interpolate@1, d3-interpolate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" + integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== + dependencies: + d3-color "1" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +d3-polygon@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e" + integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ== + +d3-quadtree@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" + integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== + +d3-random@1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291" + integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ== + +d3-scale-chromatic@1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98" + integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg== + dependencies: + d3-color "1" + d3-interpolate "1" + +d3-scale@2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" + integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw== + dependencies: + d3-array "^1.2.0" + d3-collection "1" + d3-format "1" + d3-interpolate "1" + d3-time "1" + d3-time-format "2" + +d3-selection@1, d3-selection@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.1.tgz#98eedbbe085fbda5bafa2f9e3f3a2f4d7d622a98" + integrity sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA== + +d3-shape@1, d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-time-format@2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.2.3.tgz#0c9a12ee28342b2037e5ea1cf0b9eb4dd75f29cb" + integrity sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA== + dependencies: + d3-time "1" + +d3-time@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" + integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== + +d3-timer@1: + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" + integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== + +d3-transition@1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398" + integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA== + dependencies: + d3-color "1" + d3-dispatch "1" + d3-ease "1" + d3-interpolate "1" + d3-selection "^1.1.0" + d3-timer "1" + +d3-voronoi@1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" + integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== + +d3-zoom@1: + version "1.8.3" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a" + integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ== + dependencies: + d3-dispatch "1" + d3-drag "1" + d3-interpolate "1" + d3-selection "1" + d3-transition "1" + +d3@^3.5.17: + version "3.5.17" + resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" + integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g= + +d3@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-5.16.0.tgz#9c5e8d3b56403c79d4ed42fbd62f6113f199c877" + integrity sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw== + dependencies: + 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" + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +damerau-levenshtein@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" + integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +date-fns@^2.0.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.14.0.tgz#359a87a265bb34ef2e38f93ecf63ac453f9bc7ba" + integrity sha512-1zD+68jhFgDIM0rF05rcwYO8cExdNqxjq4xP1QKM60Q45mnO6zaMWB4tOzrIr4M4GSLntsKeE4c9Bdl2jhL/yw== + +debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.5.1, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +dedent@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.4.0.tgz#87defd040bd4c1595d963282ec57f3c2a8525642" + integrity sha1-h979BAvUwVldljKC7FfzwqhSVkI= + +dedent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.6.0.tgz#0e6da8f0ce52838ef5cec5c8f9396b0c1b64a3cb" + integrity sha1-Dm2o8M5Sg471zsXI+TlrDBtko8s= + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-diff@^0.3.5: + version "0.3.8" + resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84" + integrity sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ= + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-equal@^1.0.1, deep-equal@^1.1.1, deep-equal@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +deepmerge@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.0.1.tgz#25c1c24f110fb914f80001b925264dd77f3f4312" + integrity sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0, defined@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= + dependencies: + 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" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +del@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" + integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== + dependencies: + globby "^10.0.1" + graceful-fs "^4.2.2" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.1" + p-map "^3.0.0" + rimraf "^3.0.0" + slash "^3.0.0" + +delaunay-triangulate@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/delaunay-triangulate/-/delaunay-triangulate-1.1.6.tgz#5bbca21b078198d4bc3c75796a35cbb98c25954c" + integrity sha1-W7yiGweBmNS8PHV5ajXLuYwllUw= + dependencies: + incremental-convex-hull "^1.0.1" + uniq "^1.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +detect-kerning@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-kerning/-/detect-kerning-2.1.2.tgz#4ecd548e4a5a3fc880fe2a50609312d000fa9fc2" + integrity sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw== + +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +detect-port@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" + integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +dev-null@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dev-null/-/dev-null-0.1.1.tgz#5a205ce3c2b2ef77b6238d6ba179eb74c6a0e818" + integrity sha1-WiBc48Ky73e2I41roXnrdMag6Bg= + +device-specs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/device-specs/-/device-specs-1.0.0.tgz#47b54577b9b159118bbb0a175177d0aa9c50a9c9" + integrity sha512-fYXbFSeilT7bnKWFi4OERSPHdtaEoDGn4aUhV5Nly6/I+Tp6JZ/6Icmd7LVIF5euyodGpxz2e/bfUmDnIdSIDw== + +devtron@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/devtron/-/devtron-1.4.0.tgz#b5e748bd6e95bbe70bfcc68aae6fe696119441e1" + integrity sha1-tedIvW6Vu+cL/MaKrm/mlhGUQeE= + dependencies: + accessibility-developer-tools "^2.11.0" + highlight.js "^9.3.0" + humanize-plus "^1.8.1" + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + +diff-sequences@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" + integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== + +diff@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= + +dmg-builder@22.7.0: + version "22.7.0" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.7.0.tgz#ead7e7c046cbdc52d29d302a4455f6668cdf7d45" + integrity sha512-5Ea2YEz6zSNbyGzZD+O9/MzmaXb6oa15cSKWo4JQ1xP4rorOpte7IOj2jcwYjtc+Los2gu1lvT314OC1OZIWgg== + dependencies: + app-builder-lib "22.7.0" + builder-util "22.7.0" + fs-extra "^9.0.0" + iconv-lite "^0.5.1" + js-yaml "^3.14.0" + sanitize-filename "^1.6.3" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-align@^1.7.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.0.tgz#56fb7156df0b91099830364d2d48f88963f5a29c" + integrity sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA== + +dom-helpers@^5.0.1: + version "5.1.4" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" + integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^2.6.7" + +dom-serializer@0, dom-serializer@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domhandler@^3.0, domhandler@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9" + integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw== + dependencies: + domelementtype "^2.0.1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.1.0.tgz#7ade3201af43703fde154952e3a868eb4b635f16" + integrity sha512-CD9M0Dm1iaHfQ1R/TI+z3/JWp/pgub0j4jIQKH89ARR4ATAV2nbaOQS5XxU9maJP5jHaPdDDQSEHuE2UmpUTKg== + dependencies: + dom-serializer "^0.2.1" + domelementtype "^2.0.1" + domhandler "^3.0.0" + +dot-prop@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +dotignore@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" + integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== + dependencies: + minimatch "^3.0.4" + +double-bits@^1.1.0, double-bits@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/double-bits/-/double-bits-1.1.1.tgz#58abba45494da4d0fa36b73ad11a286c9184b1c6" + integrity sha1-WKu6RUlNpND6Nrc60RoobJGEscY= + +draw-svg-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/draw-svg-path/-/draw-svg-path-1.0.0.tgz#6f116d962dd314b99ea534d6f58dd66cdbd69379" + integrity sha1-bxFtli3TFLmepTTW9Y3WbNvWk3k= + dependencies: + abs-svg-path "~0.1.1" + normalize-svg-path "~0.1.0" + +dtype@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dtype/-/dtype-2.0.0.tgz#cd052323ce061444ecd2e8f5748f69a29be28434" + integrity sha1-zQUjI84GFETs0uj1dI9popvihDQ= + +dup@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dup/-/dup-1.0.0.tgz#51fc5ac685f8196469df0b905e934b20af5b4029" + integrity sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk= + +duplexer2@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= + dependencies: + readable-stream "~1.1.9" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.4.5, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +earcut@^2.1.5, earcut@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.2.tgz#41b0bc35f63e0fe80da7cddff28511e7e2e80d11" + integrity sha512-eZoZPPJcUHnfRZ0PjLvx2qBordSiO8ofC3vt+qACLM95u+4DovnbYNpQtJh0DNsWj8RnxrQytD4WA8gj5cRIaQ== + +easy-stack@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.0.tgz#12c91b3085a37f0baa336e9486eac4bf94e3e788" + integrity sha1-EskbMIWjfwuqM26UhurEv5Tj54g= + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +edges-to-adjacency-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/edges-to-adjacency-list/-/edges-to-adjacency-list-1.0.0.tgz#c146d2e084addfba74a51293c6e0199a49f757f1" + integrity sha1-wUbS4ISt37p0pRKTxuAZmkn3V/E= + dependencies: + uniq "^1.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +ejs@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.3.tgz#514d967a8894084d18d3d47bd169a1c0560f093d" + integrity sha512-wmtrUGyfSC23GC/B1SMv2ogAUgbQEtDmTIhfqielrG5ExIM9TP4UoYdi90jLF1aTcsWCJNEO0UrgKzP0y3nTSg== + dependencies: + jake "^10.6.1" + +ejs@~2.5.6: + version "2.5.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.9.tgz#7ba254582a560d267437109a68354112475b0ce5" + integrity sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ== + +electron-builder@^22.3.6: + version "22.7.0" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.7.0.tgz#a42d08a1654ffc2f7d9e2860829d3cc55d4a0c81" + integrity sha512-t6E3oMutpST64YWbZCg7HodEwJOsnjUF1vnDIHm2MW6CFZPX8tlCK6efqaV66LU0E0Nkp/JH6TE5bCqQ1+VdPQ== + dependencies: + "@types/yargs" "^15.0.5" + app-builder-lib "22.7.0" + bluebird-lst "^1.0.9" + builder-util "22.7.0" + builder-util-runtime "8.7.1" + chalk "^4.0.0" + dmg-builder "22.7.0" + fs-extra "^9.0.0" + is-ci "^2.0.0" + lazy-val "^1.0.4" + read-config-file "6.0.0" + sanitize-filename "^1.6.3" + update-notifier "^4.1.0" + yargs "^15.3.1" + +electron-chromedriver@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/electron-chromedriver/-/electron-chromedriver-8.0.0.tgz#16f6124d481e9312cc18abc16495ddc2d61f8264" + integrity sha512-d0210ExhkGOwYLXFZHQR6LISZ8UbMqXWLwjTe8Cdh44XlO4z4+6DWQfM0p7aB2Qak/An6tN732Yl98wN1ylZww== + dependencies: + electron-download "^4.1.1" + extract-zip "^1.6.7" + +electron-debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/electron-debug/-/electron-debug-3.1.0.tgz#0df17297487fa3c82344d810812853bf67f0bd69" + integrity sha512-SWEqLj4MgfV3tGuO5eBLQ5/Nr6M+KPxsnE0bUJZvQebGJus6RAcdmvd7L+l0Ji31h2mmrN23l2tHFtCa2FvurA== + dependencies: + electron-is-dev "^1.1.0" + electron-localshortcut "^3.1.0" + +electron-devtools-installer@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-2.2.4.tgz#261a50337e37121d338b966f07922eb4939a8763" + integrity sha512-b5kcM3hmUqn64+RUcHjjr8ZMpHS2WJ5YO0pnG9+P/RTdx46of/JrEjuciHWux6pE+On6ynWhHJF53j/EDJN0PA== + dependencies: + "7zip" "0.0.6" + cross-unzip "0.0.2" + rimraf "^2.5.2" + semver "^5.3.0" + +electron-download@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-4.1.1.tgz#02e69556705cc456e520f9e035556ed5a015ebe8" + integrity sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg== + dependencies: + debug "^3.0.0" + env-paths "^1.0.0" + fs-extra "^4.0.1" + minimist "^1.2.0" + nugget "^2.0.1" + path-exists "^3.0.0" + rc "^1.2.1" + semver "^5.4.1" + sumchecker "^2.0.2" + +electron-is-accelerator@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz#509e510c26a56b55e17f863a4b04e111846ab27b" + integrity sha1-UJ5RDCala1Xhf4Y6SwThEYRqsns= + +electron-is-dev@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-1.2.0.tgz#2e5cea0a1b3ccf1c86f577cee77363ef55deb05e" + integrity sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw== + +electron-localshortcut@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz#cfc83a3eff5e28faf98ddcc87f80a2ce4f623cd3" + integrity sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q== + dependencies: + debug "^4.0.1" + electron-is-accelerator "^0.1.0" + keyboardevent-from-electron-accelerator "^2.0.0" + keyboardevents-areequal "^0.2.1" + +electron-log@^4.0.6: + version "4.2.2" + resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-4.2.2.tgz#b358dc6d1e4772465609ee3d8ad9f594d9e742c8" + integrity sha512-lBpLh1Q8qayrTxFIrTPcNjSHsosvUfOYyZ8glhiLcx7zCNPDGuj8+nXlEaaSS6LRiQQbLgLG+wKpuvztNzBIrA== + +electron-publish@22.7.0: + version "22.7.0" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.7.0.tgz#d92ba7c4007c9ac1dd070593e48028184fb2dc19" + integrity sha512-hmU69xlb6vvAV3QfpHYDlkdZMFdBAgDbptoxbLFrnTq5bOkcL8AaDbvxeoZ4+lvqgs29NwqGpkHo2oN+p/hCfg== + dependencies: + "@types/fs-extra" "^9.0.1" + bluebird-lst "^1.0.9" + builder-util "22.7.0" + builder-util-runtime "8.7.1" + chalk "^4.0.0" + fs-extra "^9.0.0" + lazy-val "^1.0.4" + mime "^2.4.5" + +electron-rebuild@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-1.11.0.tgz#e384773a9ad30fe0a6a5bbb326b779d51f668b6a" + integrity sha512-cn6AqZBQBVtaEyj5jZW1/LOezZZ22PA1HvhEP7asvYPJ8PDF4i4UFt9be4i9T7xJKiSiomXvY5Fd+dSq3FXZxA== + dependencies: + colors "^1.3.3" + debug "^4.1.1" + detect-libc "^1.0.3" + fs-extra "^8.1.0" + node-abi "^2.11.0" + node-gyp "^6.0.1" + ora "^3.4.0" + spawn-rx "^3.0.0" + yargs "^14.2.0" + +electron-to-chromium@^1.3.413, electron-to-chromium@^1.3.47: + version "1.3.480" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.480.tgz#190ae45074578349a4c4f336fba29e76b20e9ef5" + integrity sha512-wnuUfQCBMAdzu5Xe+F4FjaRK+6ToG6WvwG72s8k/3E6b+hoGVYGiQE7JD1NhiCMcqF3+wV+c2vAnaLGRSSWVqA== + +electron-updater@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.1.tgz#9d485b6262bc56fcf7ee62b1dc1b3b105a3e96a7" + integrity sha512-UDC5AHCgeiHJYDYWZG/rsl1vdAFKqI/Lm7whN57LKAk8EfhTewhcEHzheRcncLgikMcQL8gFo1KeX51tf5a5Wg== + dependencies: + "@types/semver" "^7.1.0" + builder-util-runtime "8.7.0" + fs-extra "^9.0.0" + js-yaml "^3.13.1" + lazy-val "^1.0.4" + lodash.isequal "^4.5.0" + semver "^7.1.3" + +electron@7.1.13: + version "7.1.13" + resolved "https://registry.yarnpkg.com/electron/-/electron-7.1.13.tgz#f98838de70d74890cf639bbbbbe1f3b4b341ae78" + integrity sha512-WFfjhAG/B2iVjZcGoQkwkn/Zf1YN3U5Ux/hTcnANRiM6qPMAX23CINQC+vhlHspcjM9/jbF310fHCSrsXMGlAg== + dependencies: + "@electron/get" "^1.0.1" + "@types/node" "^12.0.12" + extract-zip "^1.0.3" + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= + +element-size@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/element-size/-/element-size-1.1.1.tgz#64e5f159d97121631845bcbaecaf279c39b5e34e" + integrity sha1-ZOXxWdlxIWMYRby67K8nnDm1404= + +elementary-circuits-directed-graph@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.2.0.tgz#c6507f42566507c646b5bb144b892fbce1656371" + integrity sha512-eOQofnrNqebPtC29PvyNMGUBdMrIw5i8nOoC/2VOlSF84tf5+ZXnRkIk7TgdT22jFXK68CC7aA881KRmNYf/Pg== + dependencies: + strongly-connected-components "^1.0.1" + +elliptic@^6.0.0, elliptic@^6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + dependencies: + 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" + +emittery@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.4.1.tgz#abe9d3297389ba424ac87e53d1c701962ce7433d" + integrity sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ== + +emoji-regex@^7.0.1, emoji-regex@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@^1.0.2, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +endpoint-utils@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/endpoint-utils/-/endpoint-utils-1.0.2.tgz#0808c3369a727cd7967a39ff34ebc926b88146a8" + integrity sha1-CAjDNppyfNeWejn/NOvJJriBRqg= + dependencies: + ip "^1.1.3" + pinkie-promise "^1.0.0" + +enhanced-resolve@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + integrity sha1-TW5omzcl+GCQknzMhs2fFjW4ni4= + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.2.0" + tapable "^0.1.8" + +enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz#5d43bda4a0fd447cb0ebbe71bef8deff8805ad0d" + integrity sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enquirer@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.5.tgz#3ab2b838df0a9d8ab9e7dff235b0e8712ef92381" + integrity sha512-BNT1C08P9XD0vNg3J475yIUG+mVdp9T6towYFHUv897X0KoHBjB1shyrNmhmtHWKP17iSWgo7Gqh7BBuzLZMSA== + dependencies: + ansi-colors "^3.2.1" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + +env-paths@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" + integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA= + +env-paths@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" + integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== + +enzyme-adapter-react-16@^1.15.2: + version "1.15.2" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.2.tgz#b16db2f0ea424d58a808f9df86ab6212895a4501" + integrity sha512-SkvDrb8xU3lSxID8Qic9rB8pvevDbLybxPK6D/vW7PrT0s2Cl/zJYuXvsd1EBTz0q4o3iqG3FJhpYz3nUNpM2Q== + dependencies: + enzyme-adapter-utils "^1.13.0" + enzyme-shallow-equal "^1.0.1" + has "^1.0.3" + object.assign "^4.1.0" + object.values "^1.1.1" + prop-types "^15.7.2" + react-is "^16.12.0" + react-test-renderer "^16.0.0-0" + semver "^5.7.0" + +enzyme-adapter-utils@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.0.tgz#01c885dde2114b4690bf741f8dc94cee3060eb78" + integrity sha512-YuEtfQp76Lj5TG1NvtP2eGJnFKogk/zT70fyYHXK2j3v6CtuHqc8YmgH/vaiBfL8K1SgVVbQXtTcgQZFwzTVyQ== + dependencies: + airbnb-prop-types "^2.15.0" + function.prototype.name "^1.1.2" + object.assign "^4.1.0" + object.fromentries "^2.0.2" + prop-types "^15.7.2" + semver "^5.7.1" + +enzyme-shallow-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.1.tgz#7afe03db3801c9b76de8440694096412a8d9d49e" + integrity sha512-hGA3i1so8OrYOZSM9whlkNmVHOicJpsjgTzC+wn2JMJXhq1oO4kA4bJ5MsfzSIcC71aLDKzJ6gZpIxrqt3QTAQ== + dependencies: + has "^1.0.3" + object-is "^1.0.2" + +enzyme-to-json@^3.4.4: + version "3.5.0" + resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-3.5.0.tgz#3d536f1e8fb50d972360014fe2bd64e6a672f7dd" + integrity sha512-clusXRsiaQhG7+wtyc4t7MU8N3zCOgf4eY9+CeSenYzKlFST4lxerfOvnWd4SNaToKhkuba+w6m242YpQOS7eA== + dependencies: + lodash "^4.17.15" + react-is "^16.12.0" + +enzyme@^3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.11.0.tgz#71d680c580fe9349f6f5ac6c775bc3e6b7a79c28" + integrity sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw== + dependencies: + array.prototype.flat "^1.2.3" + cheerio "^1.0.0-rc.3" + enzyme-shallow-equal "^1.0.1" + function.prototype.name "^1.1.2" + has "^1.0.3" + html-element-map "^1.2.0" + is-boolean-object "^1.0.1" + is-callable "^1.1.5" + is-number-object "^1.0.4" + is-regex "^1.0.5" + is-string "^1.0.5" + is-subset "^0.1.1" + lodash.escape "^4.0.1" + lodash.isequal "^4.5.0" + object-inspect "^1.7.0" + object-is "^1.0.2" + object.assign "^4.1.0" + object.entries "^1.1.1" + object.values "^1.1.1" + raf "^3.4.1" + rst-selector-parser "^2.2.3" + string.prototype.trim "^1.2.1" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^1.3.3, error-stack-parser@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-1.3.6.tgz#e0e73b93e417138d1cd7c0b746b1a4a14854c292" + integrity sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI= + dependencies: + stackframe "^0.3.1" + +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4, es-abstract@^1.17.5: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.0" + is-regex "^1.1.0" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es2015-proxy@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/es2015-proxy/-/es2015-proxy-0.1.7.tgz#d94d27beed01fc97eea399076184ed73e30bf610" + integrity sha1-2U0nvu0B/Jfuo5kHYYTtc+ML9hA= + +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +es6-iterator@^2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.1.0, es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +escape-carriage@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/escape-carriage/-/escape-carriage-1.3.0.tgz#71006b2d4da8cb6828686addafcb094239c742f3" + integrity sha512-ATWi5MD8QlAGQOeMgI8zTp671BG8aKvAC0M7yenlxU4CRLGO/sKthxVUyjiOFKjHdIo+6dZZUNFgHFeVEaKfGQ== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^1.11.1: + version "1.14.2" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.2.tgz#14ab71bf5026c2aa08173afba22c6f3173284a84" + integrity sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escodegen@~0.0.24: + version "0.0.28" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-0.0.28.tgz#0e4ff1715f328775d6cab51ac44a406cd7abffd3" + integrity sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M= + dependencies: + esprima "~1.0.2" + estraverse "~1.3.0" + optionalDependencies: + source-map ">= 0.1.2" + +escodegen@~1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.3.3.tgz#f024016f5a88e046fd12005055e939802e6c5f23" + integrity sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM= + dependencies: + esprima "~1.1.1" + estraverse "~1.5.0" + esutils "~1.0.0" + optionalDependencies: + source-map "~0.1.33" + +eslint-config-airbnb-base@^14.0.0, eslint-config-airbnb-base@^14.2.0: + version "14.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4" + integrity sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q== + dependencies: + confusing-browser-globals "^1.0.9" + object.assign "^4.1.0" + object.entries "^1.1.2" + +eslint-config-airbnb-typescript@^6.3.1: + version "6.3.2" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-6.3.2.tgz#d63d30f1f6b54fefdf619e0aa1e622d0f8bbccda" + integrity sha512-JdwaDl+0vX223MSKRyY+K8tQzrTcVDc3xCd3BtpQ4wsvu74Nbvvz7Ikuo/9ddFGZ2bNrYkfmXsPPrTdBJIxYug== + dependencies: + "@typescript-eslint/parser" "^2.3.0" + eslint-config-airbnb "^18.0.1" + eslint-config-airbnb-base "^14.0.0" + +eslint-config-airbnb@^18.0.1: + version "18.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz#8a82168713effce8fc08e10896a63f1235499dcd" + integrity sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg== + dependencies: + eslint-config-airbnb-base "^14.2.0" + object.assign "^4.1.0" + object.entries "^1.1.2" + +eslint-config-erb@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-erb/-/eslint-config-erb-0.3.0.tgz#54355f5730bdb0636f2ee77bf01ae2578cd26d05" + integrity sha512-cndLCtBXqS4wPCSJbyUSGiZ6qzgxxevcF/uYxx1EOX7WElii73xhw8PEl1fagRvAS60vF5SMYwkFUlQynWyUAQ== + dependencies: + babel-eslint "^10.0.3" + +eslint-config-prettier@^6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" + integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== + dependencies: + get-stdin "^6.0.0" + +eslint-import-resolver-node@^0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-import-resolver-webpack@^0.12.1: + version "0.12.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.2.tgz#769e86cd0c752a1536c19855ebd90aa14ce384ee" + integrity sha512-7Jnm4YAoNNkvqPaZkKdIHsKGmv8/uNnYC5QsXkiSodvX4XEEfH2AKOna98FK52fCDXm3q4HzuX+7pRMKkJ64EQ== + dependencies: + array-find "^1.0.0" + debug "^2.6.9" + enhanced-resolve "^0.9.1" + find-root "^1.1.0" + has "^1.0.3" + interpret "^1.2.0" + lodash "^4.17.15" + node-libs-browser "^1.0.0 || ^2.0.0" + resolve "^1.13.1" + semver "^5.7.1" + +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-compat@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-3.7.0.tgz#03f1ebb350a3c7eb93b6f461e200048e6008594b" + integrity sha512-A3uzSYqUjNj6rMyaBuU3l8wSCadZjeZRZ7WF3eU9vUT0JItiqRysjmYELkHHCpH8l7wRprUu4MZPr37lFCw7iA== + dependencies: + ast-metadata-inferer "^0.2.0-0" + browserslist "^4.12.0" + caniuse-db "^1.0.30001059" + core-js "^3.6.5" + lodash.memoize "4.1.2" + mdn-browser-compat-data "^1.0.21" + semver "7.3.2" + +eslint-plugin-import@^2.21.2: + version "2.21.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz#8fef77475cc5510801bedc95f84b932f7f334a7c" + integrity sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA== + dependencies: + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.3" + eslint-module-utils "^2.6.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.1" + read-pkg-up "^2.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-jest@^23.13.2: + version "23.16.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.16.0.tgz#fada00f765b5e32a1fb10a7490f75ebf673133b3" + integrity sha512-51KcQup31S2NBm+Yqg3rxZIPETd+wZ/gU2rb034RpdXLcZYsa2+uwubqbbDAYIpQw3m+wywF/A56OMEouBY/wA== + dependencies: + "@typescript-eslint/experimental-utils" "^2.5.0" + +eslint-plugin-jsx-a11y@6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa" + integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg== + dependencies: + "@babel/runtime" "^7.4.5" + aria-query "^3.0.0" + array-includes "^3.0.3" + ast-types-flow "^0.0.7" + axobject-query "^2.0.2" + damerau-levenshtein "^1.0.4" + emoji-regex "^7.0.2" + has "^1.0.3" + jsx-ast-utils "^2.2.1" + +eslint-plugin-prettier@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" + integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-promise@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" + integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== + +eslint-plugin-react-hooks@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.4.tgz#aed33b4254a41b045818cacb047b81e6df27fa58" + integrity sha512-equAdEIsUETLFNCmmCkiCGq6rkSK5MoJhXFPFYeUebcjKgBmWWcgVOqZyQC8Bv1BwVCnTq9tBxgJFgAJTWoJtA== + +eslint-plugin-react@^7.20.0: + version "7.20.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.0.tgz#f98712f0a5e57dfd3e5542ef0604b8739cd47be3" + integrity sha512-rqe1abd0vxMjmbPngo4NaYxTcR3Y4Hrmc/jg4T+sYz63yqlmJRknpEQfmWY+eDWPuMmix6iUIK+mv0zExjeLgA== + dependencies: + 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" + string.prototype.matchall "^4.0.2" + xregexp "^4.3.0" + +eslint-plugin-testcafe@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-testcafe/-/eslint-plugin-testcafe-0.2.1.tgz#4089f646dadb69b1376a01d7e608184907e6036b" + integrity sha1-QIn2RtrbabE3agHX5ggYSQfmA2s= + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0, eslint-scope@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" + integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.2.0.tgz#d41b2e47804b30dbabb093a967fb283d560082e6" + integrity sha512-B3BtEyaDKC5MlfDa2Ha8/D6DsS4fju95zs0hjS3HdGazw+LNayai38A25qMppK37wWGWNYSPOR6oYzlz5MHsRQ== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.1.0" + eslint-utils "^2.0.0" + eslint-visitor-keys "^1.2.0" + espree "^7.1.0" + esquery "^1.2.0" + 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.4.1" + lodash "^4.17.14" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +esotope-hammerhead@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/esotope-hammerhead/-/esotope-hammerhead-0.5.3.tgz#4423efd9ea71e56dfd293d9f9c9eeddb51992842" + integrity sha512-EMZvx+2MXsAZxqa+bOJZp+5qWzKZ6jx/tYung2dOalujGWW5WKb52UhXR8rb60XyW/WbmoVBjOB1WMPkaSjEzw== + dependencies: + "@types/estree" "^0.0.39" + +espree@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c" + integrity sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw== + dependencies: + acorn "^7.2.0" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.2.0" + +esprima@^1.0.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9" + integrity sha1-CZNQL+r2aBODJXVvMPmlH+7sEek= + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esprima@~1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" + integrity sha1-n1V+CPw7TSbs6d00+Pv0drYlha0= + +esprima@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.1.1.tgz#5b6f1547f4d102e670e140c509be6771d6aeb549" + integrity sha1-W28VR/TRAuZw4UDFCb5ncdautUk= + +esquery@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== + +estraverse@~1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.3.2.tgz#37c2b893ef13d723f276d878d60d8535152a6c42" + integrity sha1-N8K4k+8T1yPydth41g2FNRUqbEI= + +estraverse@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" + integrity sha1-hno+jlip+EYYr7bC3bzZFrfLr3E= + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +esutils@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570" + integrity sha1-gVHTWOIMisx/t0XnRywAJf5JZXA= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +event-pubsub@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e" + integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ== + +eventemitter3@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + +events@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.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" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^3.2.0, execa@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.2.tgz#ad87fb7b2d9d564f70d2b62d511bee41d5cbb240" + integrity sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execall@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" + integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow== + dependencies: + clone-regexp "^2.1.0" + +exenv@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + integrity sha1-KueOhdmJQVhnCwPUe+wfA72Ru50= + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +expect@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-25.5.0.tgz#f07f848712a2813bb59167da3fb828ca21f58bba" + integrity sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA== + dependencies: + "@jest/types" "^25.5.0" + ansi-styles "^4.0.0" + jest-get-type "^25.2.6" + jest-matcher-utils "^25.5.0" + jest-message-util "^25.5.0" + jest-regex-util "^25.2.6" + +express@^4.16.3, express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@3.0.2, extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-frustum-planes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz#97d5703ff0564c8c3c6838cac45f9e7bc52c9ef5" + integrity sha1-l9VwP/BWTIw8aDjKxF+ee8UsnvU= + +extract-zip@^1.0.3, extract-zip@^1.6.7: + version "1.7.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== + dependencies: + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +falafel@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" + integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ== + dependencies: + acorn "^7.1.1" + foreach "^2.0.5" + isarray "^2.0.1" + object-keys "^1.0.6" + +fancy-log@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + +fast-async@^7.0.0: + version "7.0.6" + resolved "https://registry.yarnpkg.com/fast-async/-/fast-async-7.0.6.tgz#a9bcc0b4aa6c7a5b25f0cec1a9b7324d13cb169b" + integrity sha512-/iUa3eSQC+Xh5tN6QcVLsEsN7b1DaPIoTZo++VpLLIxtdNW2tEmMZex4TcrMeRnBwMOpZwue2CB171wjt5Kgqg== + dependencies: + "@babel/generator" "^7.0.0-beta.44" + "@babel/helper-module-imports" "^7.0.0-beta.44" + babylon "^7.0.0-beta.44" + nodent-runtime "^3.2.1" + nodent-transform "^3.2.4" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-glob@^3.0.3, fast-glob@^3.1.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-isnumeric@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz#e165786ff471c439e9ace2b8c8e66cceb47e2ea4" + integrity sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw== + dependencies: + is-string-blank "^1.0.1" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + +fastq@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" + integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.1: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +fbjs-scripts@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz#069a0c0634242d10031c6460ef1fccefcdae8b27" + integrity sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ== + dependencies: + "@babel/core" "^7.0.0" + ansi-colors "^1.0.1" + babel-preset-fbjs "^3.2.0" + core-js "^2.4.1" + cross-spawn "^5.1.0" + fancy-log "^1.3.2" + object-assign "^4.0.1" + plugin-error "^0.1.2" + semver "^5.1.0" + through2 "^2.0.0" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0, figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-loader@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-5.1.0.tgz#cb56c070efc0e40666424309bd0d9e45ac6f2bb8" + integrity sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg== + dependencies: + loader-utils "^1.4.0" + schema-utils "^2.5.0" + +file-saver@^1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-1.3.8.tgz#e68a30c7cb044e2fb362b428469feb291c2e09d8" + integrity sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filelist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.1.tgz#f10d1a3ae86c1694808e8f20906f43d4c9132dbb" + integrity sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ== + dependencies: + minimatch "^3.0.4" + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-keys@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" + integrity sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA= + dependencies: + is-object "~1.0.1" + merge-descriptors "~1.0.0" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +filtered-vector@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/filtered-vector/-/filtered-vector-1.2.4.tgz#56453c034df4302d293ca8ecdeac3f90abc678d3" + integrity sha1-VkU8A030MC0pPKjs3qw/kKvGeNM= + dependencies: + binary-search-bounds "^1.0.0" + cubic-hermite "^1.0.0" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-versions@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" + integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== + dependencies: + semver-regex "^2.0.0" + +find-yarn-workspace-root@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" + integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== + dependencies: + fs-extra "^4.0.3" + micromatch "^3.1.4" + +findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatten-vertex-data@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz#889fd60bea506006ca33955ee1105175fb620219" + integrity sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw== + dependencies: + dtype "^2.0.0" + +flip-pixels@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flip-pixels/-/flip-pixels-1.0.2.tgz#aad7b7d9fc65932d5f27e2e4dac4b494140845e4" + integrity sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.12.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.12.1.tgz#de54a6205311b93d60398ebc01cf7015682312b6" + integrity sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg== + +font-atlas@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/font-atlas/-/font-atlas-2.1.0.tgz#aa2d6dcf656a6c871d66abbd3dfbea2f77178348" + integrity sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg== + dependencies: + css-font "^1.0.0" + +font-awesome@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" + integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM= + +font-measure@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/font-measure/-/font-measure-1.2.2.tgz#41dbdac5d230dbf4db08865f54da28a475e83026" + integrity sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA== + dependencies: + css-font "^1.2.0" + +for-each@~0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0, from2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^4.0.1, fs-extra@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@^2.1.2, fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.1, function-bind@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.1, function.prototype.name@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.2.tgz#5cdf79d7c05db401591dfde83e3b70c5123e9a45" + integrity sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + functions-have-names "^1.2.0" + +functional-red-black-tree@^1.0.0, functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +functions-have-names@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.1.tgz#a981ac397fa0c9964551402cdc5533d7a4d52f91" + integrity sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA== + +gamma@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/gamma/-/gamma-0.1.0.tgz#3315643403bf27906ca80ab37c36ece9440ef330" + integrity sha1-MxVkNAO/J5BsqAqzfDbs6UQO8zA= + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^1.0.0, gaze@~1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +geojson-vt@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" + integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-canvas-context@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-canvas-context/-/get-canvas-context-1.0.2.tgz#d6e7b50bc4e4c86357cd39f22647a84b73601e93" + integrity sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM= + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +gl-axes3d@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/gl-axes3d/-/gl-axes3d-1.5.3.tgz#47e3dd6c21356a59349910ec01af58e28ea69fe9" + integrity sha512-KRYbguKQcDQ6PcB9g1pgqB8Ly4TY1DQODpPKiDTasyWJ8PxQk0t2Q7XoQQijNqvsguITCpVVCzNb5GVtIWiVlQ== + dependencies: + bit-twiddle "^1.0.2" + dup "^1.0.0" + extract-frustum-planes "^1.0.0" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-state "^1.0.0" + gl-vao "^1.3.0" + gl-vec4 "^1.0.1" + glslify "^7.0.0" + robust-orientation "^1.1.3" + split-polygon "^1.0.0" + vectorize-text "^3.2.1" + +gl-buffer@^2.1.1, gl-buffer@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/gl-buffer/-/gl-buffer-2.1.2.tgz#2db8d9c1a5527fba0cdb91289c206e882b889cdb" + integrity sha1-LbjZwaVSf7oM25EonCBuiCuInNs= + dependencies: + ndarray "^1.0.15" + ndarray-ops "^1.1.0" + typedarray-pool "^1.0.0" + +gl-cone3d@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/gl-cone3d/-/gl-cone3d-1.5.2.tgz#66af5c33b7d5174034dfa3654a88e995998d92bc" + integrity sha512-1JNeHH4sUtUmDA4ZK7Om8/kShwb8IZVAsnxaaB7IPRJsNGciLj1sTpODrJGeMl41RNkex5kXD2SQFrzyEAR2Rw== + dependencies: + colormap "^2.3.1" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + gl-vec3 "^1.1.3" + glsl-inverse "^1.0.0" + glsl-out-of-range "^1.0.4" + glsl-specular-cook-torrance "^2.0.1" + glslify "^7.0.0" + ndarray "^1.0.18" + +gl-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-constants/-/gl-constants-1.0.0.tgz#597a504e364750ff50253aa35f8dea7af4a5d233" + integrity sha1-WXpQTjZHUP9QJTqjX43qevSl0jM= + +gl-contour2d@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/gl-contour2d/-/gl-contour2d-1.1.7.tgz#ca330cf8449673a9ca0b3f6726c83f8d35c7a50c" + integrity sha512-GdebvJ9DtT3pJDpoE+eU2q+Wo9S3MijPpPz5arZbhK85w2bARmpFpVfPaDlZqWkB644W3BlH8TVyvAo1KE4Bhw== + dependencies: + binary-search-bounds "^2.0.4" + cdt2d "^1.0.0" + clean-pslg "^1.1.2" + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + iota-array "^1.0.0" + ndarray "^1.0.18" + surface-nets "^1.0.2" + +gl-error3d@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/gl-error3d/-/gl-error3d-1.0.16.tgz#88a94952f5303d9cf5cb86806789a360777c5446" + integrity sha512-TGJewnKSp7ZnqGgG3XCF9ldrDbxZrO+OWlx6oIet4OdOM//n8xJ5isArnIV/sdPJnFbhfoLxWrW9f5fxHFRQ1A== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + +gl-fbo@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/gl-fbo/-/gl-fbo-2.0.5.tgz#0fa75a497cf787695530691c8f04abb6fb55fa22" + integrity sha1-D6daSXz3h2lVMGkcjwSrtvtV+iI= + dependencies: + gl-texture2d "^2.0.0" + +gl-format-compiler-error@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gl-format-compiler-error/-/gl-format-compiler-error-1.0.3.tgz#0c79b1751899ce9732e86240f090aa41e98471a8" + integrity sha1-DHmxdRiZzpcy6GJA8JCqQemEcag= + dependencies: + add-line-numbers "^1.0.1" + gl-constants "^1.0.0" + glsl-shader-name "^1.0.0" + sprintf-js "^1.0.3" + +gl-heatmap2d@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/gl-heatmap2d/-/gl-heatmap2d-1.0.6.tgz#d0a2d9e8f5975534224b3b2be2ffe683f6b7e961" + integrity sha512-+agzSv4R5vsaH+AGYVz5RVzBK10amqAa+Bwj205F13JjNSGS91M1L9Yb8zssCv2FIjpP+1Mp73cFBYrQFfS1Jg== + dependencies: + binary-search-bounds "^2.0.4" + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + iota-array "^1.0.0" + typedarray-pool "^1.1.0" + +gl-line3d@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/gl-line3d/-/gl-line3d-1.2.1.tgz#632fc5b931a84a315995322b271aaf497e292609" + integrity sha512-eeb0+RI2ZBRqMYJK85SgsRiJK7c4aiOjcnirxv0830A3jmOc99snY3AbPcV8KvKmW0Yaf3KA4e+qNCbHiTOTnA== + dependencies: + binary-search-bounds "^2.0.4" + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + ndarray "^1.0.18" + +gl-mat2@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gl-mat2/-/gl-mat2-1.0.1.tgz#142505730a5c2fe1e9f25d9ece3d0d6cc2710a30" + integrity sha1-FCUFcwpcL+Hp8l2ezj0NbMJxCjA= + +gl-mat3@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-mat3/-/gl-mat3-1.0.0.tgz#89633219ca429379a16b9185d95d41713453b912" + integrity sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI= + +gl-mat4@^1.0.0, gl-mat4@^1.0.1, gl-mat4@^1.0.2, gl-mat4@^1.0.3, gl-mat4@^1.1.2, gl-mat4@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gl-mat4/-/gl-mat4-1.2.0.tgz#49d8a7636b70aa00819216635f4a3fd3f4669b26" + integrity sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA== + +gl-matrix-invert@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-matrix-invert/-/gl-matrix-invert-1.0.0.tgz#a36d7bde3654c4590a127ee7c68f6e13fea8c63d" + integrity sha1-o2173jZUxFkKEn7nxo9uE/6oxj0= + dependencies: + gl-mat2 "^1.0.0" + gl-mat3 "^1.0.0" + gl-mat4 "^1.0.0" + +gl-matrix@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.3.0.tgz#232eef60b1c8b30a28cbbe75b2caf6c48fd6358b" + integrity sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA== + +gl-mesh3d@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/gl-mesh3d/-/gl-mesh3d-2.3.1.tgz#087a93c5431df923570ca51cfc691bab0d21a6b8" + integrity sha512-pXECamyGgu4/9HeAQSE5OEUuLBGS1aq9V4BCsTcxsND4fNLaajEkYKUz/WY2QSYElqKdsMBVsldGiKRKwlybqA== + dependencies: + barycentric "^1.0.1" + colormap "^2.3.1" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glsl-specular-cook-torrance "^2.0.1" + glslify "^7.0.0" + ndarray "^1.0.18" + normals "^1.1.0" + polytope-closest-point "^1.0.0" + simplicial-complex-contour "^1.0.2" + typedarray-pool "^1.1.0" + +gl-plot2d@^1.4.4: + version "1.4.5" + resolved "https://registry.yarnpkg.com/gl-plot2d/-/gl-plot2d-1.4.5.tgz#6412b8b3f8df3e7d89c5955daac7059e04d657d4" + integrity sha512-6GmCN10SWtV+qHFQ1gjdnVubeHFVsm6P4zmo0HrPIl9TcdePCUHDlBKWAuE6XtFhiMKMj7R8rApOX8O8uXUYog== + dependencies: + binary-search-bounds "^2.0.4" + gl-buffer "^2.1.2" + gl-select-static "^2.0.7" + gl-shader "^4.2.1" + glsl-inverse "^1.0.0" + glslify "^7.0.0" + text-cache "^4.2.2" + +gl-plot3d@^2.4.5: + version "2.4.6" + resolved "https://registry.yarnpkg.com/gl-plot3d/-/gl-plot3d-2.4.6.tgz#69518759c473e3a8c1c76974472836f6500daf50" + integrity sha512-CkrNvDKu0p74Di2g2Oc9kU+s1Oe+wi4cIfHzXABp8DvfoRl0/bayqJ9q8EcRAqMeQQxQZYGvJkk4hlBwI758Jw== + dependencies: + "3d-view" "^2.0.0" + a-big-triangle "^1.0.3" + gl-axes3d "^1.5.3" + gl-fbo "^2.0.5" + gl-mat4 "^1.2.0" + gl-select-static "^2.0.7" + gl-shader "^4.2.1" + gl-spikes3d "^1.0.10" + glslify "^7.0.0" + has-passive-events "^1.0.0" + is-mobile "^2.2.1" + mouse-change "^1.4.0" + mouse-event-offset "^3.0.2" + mouse-wheel "^1.2.0" + ndarray "^1.0.19" + right-now "^1.0.0" + +gl-pointcloud2d@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gl-pointcloud2d/-/gl-pointcloud2d-1.0.3.tgz#f37e215f21ccb2e17f0604664e99fc3d6a4e611d" + integrity sha512-OS2e1irvJXVRpg/GziXj10xrFJm9kkRfFoB6BLUvkjCQV7ZRNNcs2CD+YSK1r0gvMwTg2T3lfLM3UPwNtz+4Xw== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + typedarray-pool "^1.1.0" + +gl-quat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-quat/-/gl-quat-1.0.0.tgz#0945ec923386f45329be5dc357b1c8c2d47586c5" + integrity sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU= + dependencies: + gl-mat3 "^1.0.0" + gl-vec3 "^1.0.3" + gl-vec4 "^1.0.0" + +gl-scatter3d@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/gl-scatter3d/-/gl-scatter3d-1.2.3.tgz#83d63700ec2fe4e95b3d1cd613e86de9a6b5f603" + integrity sha512-nXqPlT1w5Qt51dTksj+DUqrZqwWAEWg0PocsKcoDnVNv0X8sGA+LBZ0Y+zrA+KNXUL0PPCX9WR9cF2uJAZl1Sw== + dependencies: + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + is-string-blank "^1.0.1" + typedarray-pool "^1.1.0" + vectorize-text "^3.2.1" + +gl-select-box@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/gl-select-box/-/gl-select-box-1.0.4.tgz#47c11caa2b84f81e8bbfde08c6e39eeebb53d3d8" + integrity sha512-mKsCnglraSKyBbQiGq0Ila0WF+m6Tr+EWT2yfaMn/Sh9aMHq5Wt0F/l6Cf/Ed3CdERq5jHWAY5yxLviZteYu2w== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + +gl-select-static@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/gl-select-static/-/gl-select-static-2.0.7.tgz#ce7eb05ae0139009c15e2d2d0d731600b3dae5c0" + integrity sha512-OvpYprd+ngl3liEatBTdXhSyNBjwvjMSvV2rN0KHpTU+BTi4viEETXNZXFgGXY37qARs0L28ybk3UQEW6C5Nnw== + dependencies: + bit-twiddle "^1.0.2" + gl-fbo "^2.0.5" + ndarray "^1.0.18" + typedarray-pool "^1.1.0" + +gl-shader@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/gl-shader/-/gl-shader-4.2.1.tgz#bc9b808e9293c51b668e88de615b0c113708dc2f" + integrity sha1-vJuAjpKTxRtmjojeYVsMETcI3C8= + dependencies: + gl-format-compiler-error "^1.0.2" + weakmap-shim "^1.1.0" + +gl-spikes2d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/gl-spikes2d/-/gl-spikes2d-1.0.2.tgz#ef8dbcff6c7451dec2b751d7a3c593d09ad5457f" + integrity sha512-QVeOZsi9nQuJJl7NB3132CCv5KA10BWxAY2QgJNsKqbLsG53B/TrGJpjIAohnJftdZ4fT6b3ZojWgeaXk8bOOA== + +gl-spikes3d@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/gl-spikes3d/-/gl-spikes3d-1.0.10.tgz#e3b2b677a6f51750f23c064447af4f093da79305" + integrity sha512-lT3xroowOFxMvlhT5Mof76B2TE02l5zt/NIWljhczV2FFHgIVhA4jMrd5dIv1so1RXMBDJIKu0uJI3QKliDVLg== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glslify "^7.0.0" + +gl-state@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-state/-/gl-state-1.0.0.tgz#262faa75835b0b9c532c12f38adc425d1d30cd17" + integrity sha1-Ji+qdYNbC5xTLBLzitxCXR0wzRc= + dependencies: + uniq "^1.0.0" + +gl-streamtube3d@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/gl-streamtube3d/-/gl-streamtube3d-1.4.1.tgz#bd2b725e00aa96989ce34b06ebf66a76f93e35ae" + integrity sha512-rH02v00kgwgdpkXVo7KsSoPp38bIAYR9TE1iONjcQ4cQAlDhrGRauqT/P5sUaOIzs17A2DxWGcXM+EpNQs9pUA== + dependencies: + gl-cone3d "^1.5.2" + gl-vec3 "^1.1.3" + gl-vec4 "^1.0.1" + glsl-inverse "^1.0.0" + glsl-out-of-range "^1.0.4" + glsl-specular-cook-torrance "^2.0.1" + glslify "^7.0.0" + +gl-surface3d@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/gl-surface3d/-/gl-surface3d-1.5.2.tgz#a283b98d3473fca4e8552f0f6ac40a6f0dc88b00" + integrity sha512-rWSQwEQDkB0T5CDEDFJwJc4VgwwJaAyFRSJ92NJlrTSwDlsEsWdzG9+APx6FWJMwkOpIoZGWqv+csswK2kMMLQ== + dependencies: + binary-search-bounds "^2.0.4" + bit-twiddle "^1.0.2" + colormap "^2.3.1" + dup "^1.0.0" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glsl-specular-beckmann "^1.1.2" + glslify "^7.0.0" + ndarray "^1.0.18" + ndarray-gradient "^1.0.0" + ndarray-ops "^1.2.2" + ndarray-pack "^1.2.1" + ndarray-scratch "^1.2.0" + surface-nets "^1.0.2" + typedarray-pool "^1.1.0" + +gl-text@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/gl-text/-/gl-text-1.1.8.tgz#67a19bec72915acc422300aad8f727a09f98b550" + integrity sha512-whnq9DEFYbW92C4ONwk2eT0YkzmVPHoADnEtuzMOmit87XhgAhBrNs3lK9EgGjU/MoWYvlF6RkI8Kl7Yuo1hUw== + dependencies: + bit-twiddle "^1.0.2" + color-normalize "^1.5.0" + css-font "^1.2.0" + detect-kerning "^2.1.2" + es6-weak-map "^2.0.3" + flatten-vertex-data "^1.0.2" + font-atlas "^2.1.0" + font-measure "^1.2.2" + gl-util "^3.1.2" + is-plain-obj "^1.1.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + parse-unit "^1.0.1" + pick-by-alias "^1.2.0" + regl "^1.3.11" + to-px "^1.0.1" + typedarray-pool "^1.1.0" + +gl-texture2d@^2.0.0, gl-texture2d@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/gl-texture2d/-/gl-texture2d-2.1.0.tgz#ff6824e7e7c31a8ba6fdcdbe9e5c695d7e2187c7" + integrity sha1-/2gk5+fDGoum/c2+nlxpXX4hh8c= + dependencies: + ndarray "^1.0.15" + ndarray-ops "^1.2.2" + typedarray-pool "^1.1.0" + +gl-util@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/gl-util/-/gl-util-3.1.3.tgz#1e9a724f844b802597c6e30565d4c1e928546861" + integrity sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA== + dependencies: + is-browser "^2.0.1" + is-firefox "^1.0.3" + is-plain-obj "^1.1.0" + number-is-integer "^1.0.1" + object-assign "^4.1.0" + pick-by-alias "^1.2.0" + weak-map "^1.0.5" + +gl-vao@^1.2.0, gl-vao@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/gl-vao/-/gl-vao-1.3.0.tgz#e9e92aa95588cab9d5c2f04b693440c3df691923" + integrity sha1-6ekqqVWIyrnVwvBLaTRAw99pGSM= + +gl-vec3@^1.0.2, gl-vec3@^1.0.3, gl-vec3@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gl-vec3/-/gl-vec3-1.1.3.tgz#a47c62f918774a06cbed1b65bcd0288ecbb03826" + integrity sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw== + +gl-vec4@^1.0.0, gl-vec4@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gl-vec4/-/gl-vec4-1.0.1.tgz#97d96878281b14b532cbce101785dfd1cb340964" + integrity sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1, glob@~7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-agent@^2.0.2: + version "2.1.12" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.12.tgz#e4ae3812b731a9e81cbf825f9377ef450a8e4195" + integrity sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg== + dependencies: + boolean "^3.0.1" + core-js "^3.6.5" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + +global-dirs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" + integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== + dependencies: + ini "^1.3.5" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +global-tunnel-ng@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" + integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== + dependencies: + encodeurl "^1.0.2" + lodash "^4.17.10" + npm-conf "^1.1.3" + tunnel "^0.0.6" + +global@^4.3.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +globalthis@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" + integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== + dependencies: + define-properties "^1.1.3" + +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@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" + +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" + integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= + +globule@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" + integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +glsl-inject-defines@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz#dd1aacc2c17fcb2bd3fc32411c6633d0d7b60fd4" + integrity sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q= + dependencies: + glsl-token-inject-block "^1.0.0" + glsl-token-string "^1.0.1" + glsl-tokenizer "^2.0.2" + +glsl-inverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-inverse/-/glsl-inverse-1.0.0.tgz#12c0b1d065f558444d1e6feaf79b5ddf8a918ae6" + integrity sha1-EsCx0GX1WERNHm/q95td34qRiuY= + +glsl-out-of-range@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/glsl-out-of-range/-/glsl-out-of-range-1.0.4.tgz#3d73d083bc9ecc73efd45dfc7063c29e92c9c873" + integrity sha512-fCcDu2LCQ39VBvfe1FbhuazXEf0CqMZI9OYXrYlL6uUARG48CTAbL04+tZBtVM0zo1Ljx4OLu2AxNquq++lxWQ== + +glsl-resolve@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/glsl-resolve/-/glsl-resolve-0.0.1.tgz#894bef73910d792c81b5143180035d0a78af76d3" + integrity sha1-iUvvc5ENeSyBtRQxgANdCnivdtM= + dependencies: + resolve "^0.6.1" + xtend "^2.1.2" + +glsl-shader-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-shader-name/-/glsl-shader-name-1.0.0.tgz#a2c30b3ba73499befb0cc7184d7c7733dd4b487d" + integrity sha1-osMLO6c0mb77DMcYTXx3M91LSH0= + dependencies: + atob-lite "^1.0.0" + glsl-tokenizer "^2.0.2" + +glsl-specular-beckmann@^1.1.1, glsl-specular-beckmann@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-specular-beckmann/-/glsl-specular-beckmann-1.1.2.tgz#fce9056933ecdf2456278376a54d082893e775f1" + integrity sha1-/OkFaTPs3yRWJ4N2pU0IKJPndfE= + +glsl-specular-cook-torrance@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/glsl-specular-cook-torrance/-/glsl-specular-cook-torrance-2.0.1.tgz#a891cc06c8c7b4f4728702b4824fdacbb967d78f" + integrity sha1-qJHMBsjHtPRyhwK0gk/ay7ln148= + dependencies: + glsl-specular-beckmann "^1.1.1" + +glsl-token-assignments@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz#a5d82ab78499c2e8a6b83cb69495e6e665ce019f" + integrity sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8= + +glsl-token-defines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz#cb892aa959936231728470d4f74032489697fa9d" + integrity sha1-y4kqqVmTYjFyhHDU90AySJaX+p0= + dependencies: + glsl-tokenizer "^2.0.0" + +glsl-token-depth@^1.1.0, glsl-token-depth@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz#23c5e30ee2bd255884b4a28bc850b8f791e95d84" + integrity sha1-I8XjDuK9JViEtKKLyFC495HpXYQ= + +glsl-token-descope@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz#0fc90ab326186b82f597b2e77dc9e21efcd32076" + integrity sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY= + dependencies: + glsl-token-assignments "^2.0.0" + glsl-token-depth "^1.1.0" + glsl-token-properties "^1.0.0" + glsl-token-scope "^1.1.0" + +glsl-token-inject-block@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz#e1015f5980c1091824adaa2625f1dfde8bd00034" + integrity sha1-4QFfWYDBCRgkraomJfHf3ovQADQ= + +glsl-token-properties@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz#483dc3d839f0d4b5c6171d1591f249be53c28a9e" + integrity sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4= + +glsl-token-scope@^1.1.0, glsl-token-scope@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz#a1728e78df24444f9cb93fd18ef0f75503a643b1" + integrity sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E= + +glsl-token-string@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glsl-token-string/-/glsl-token-string-1.0.1.tgz#59441d2f857de7c3449c945666021ece358e48ec" + integrity sha1-WUQdL4V958NEnJRWZgIezjWOSOw= + +glsl-token-whitespace-trim@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz#46d1dfe98c75bd7d504c05d7d11b1b3e9cc93b10" + integrity sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA= + +glsl-tokenizer@^2.0.0, glsl-tokenizer@^2.0.2: + version "2.1.5" + resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" + integrity sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA== + dependencies: + through2 "^0.6.3" + +glslify-bundle@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glslify-bundle/-/glslify-bundle-5.1.1.tgz#30d2ddf2e6b935bf44d1299321e3b729782c409a" + integrity sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A== + dependencies: + glsl-inject-defines "^1.0.1" + glsl-token-defines "^1.0.0" + glsl-token-depth "^1.1.1" + glsl-token-descope "^1.0.2" + glsl-token-scope "^1.1.1" + glsl-token-string "^1.0.1" + glsl-token-whitespace-trim "^1.0.0" + glsl-tokenizer "^2.0.2" + murmurhash-js "^1.0.0" + shallow-copy "0.0.1" + +glslify-deps@^1.2.5: + version "1.3.1" + resolved "https://registry.yarnpkg.com/glslify-deps/-/glslify-deps-1.3.1.tgz#dfa6962322454a91ecc4de25b5e710415b0c89ad" + integrity sha512-Ogm179MCazwIRyEqs3g3EOY4Y3XIAa0yl8J5RE9rJC6QH1w8weVOp2RZu0mvnYy/2xIas1w166YR2eZdDkWQxg== + dependencies: + "@choojs/findup" "^0.2.0" + events "^1.0.2" + glsl-resolve "0.0.1" + glsl-tokenizer "^2.0.0" + graceful-fs "^4.1.2" + inherits "^2.0.1" + map-limit "0.0.1" + resolve "^1.0.0" + +glslify@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/glslify/-/glslify-7.0.0.tgz#10d5db9541ee07c6548ea55c679edda20307653d" + integrity sha512-yw8jDQIe9FlSH5NiZEqSAsCPj9HI7nhXgXLAgSv2Nm9eBPsFJmyN9+rNwbiozJapcj9xtc/71rMYlN9cxp1B8Q== + dependencies: + bl "^1.0.0" + concat-stream "^1.5.2" + duplexify "^3.4.5" + falafel "^2.1.0" + from2 "^2.3.0" + glsl-resolve "0.0.1" + glsl-token-whitespace-trim "^1.0.0" + glslify-bundle "^5.0.0" + glslify-deps "^1.2.5" + minimist "^1.2.0" + resolve "^1.1.5" + stack-trace "0.0.9" + static-eval "^2.0.0" + through2 "^2.0.1" + xtend "^4.0.0" + +gonzales-pe@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== + dependencies: + minimist "^1.2.5" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +grapheme-splitter@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +graphlib@^2.1.5: + version "2.1.8" + resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" + integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== + dependencies: + lodash "^4.17.15" + +grid-index@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" + integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + +gzip-size@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +harmony-reflect@^1.4.6: + version "1.6.1" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" + integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-hover@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-hover/-/has-hover-1.0.1.tgz#3d97437aeb199c62b8ac08acbdc53d3bc52c17f7" + integrity sha1-PZdDeusZnGK4rAisvcU9O8UsF/c= + dependencies: + is-browser "^2.0.1" + +has-passive-events@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-passive-events/-/has-passive-events-1.0.0.tgz#75fc3dc6dada182c58f24ebbdc018276d1ea3515" + integrity sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw== + dependencies: + is-browser "^2.0.1" + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.0, has@^1.0.3, has@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hazardous@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/hazardous/-/hazardous-0.3.0.tgz#f72212ef349039de7f5b7a86589de7662a870222" + integrity sha512-VLSlBMoLTnfScKBJTycufZ2OHLO06eS3Q0mxNdHJ+egd1QLqeLitxDeGeUuoIgOqSPer+uqZCxiv43a1EVmwdg== + dependencies: + callsite "^1.0.0" + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +highlight-es@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/highlight-es/-/highlight-es-1.0.3.tgz#12abc300a27e686f6f18010134e3a5c6d2fe6930" + integrity sha512-s/SIX6yp/5S1p8aC/NRDC1fwEb+myGIfp8/TzZz0rtAv8fzsdX7vGl3Q1TrXCsczFq8DI3CBFBCySPClfBSdbg== + dependencies: + chalk "^2.4.0" + is-es2016-keyword "^1.0.0" + js-tokens "^3.0.0" + +highlight.js@^9.3.0: + version "9.18.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz#ed21aa001fe6252bb10a3d76d47573c6539fe13c" + integrity sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg== + +history@^4.7.2, history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +history@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/history/-/history-5.0.0.tgz#0cabbb6c4bbf835addb874f8259f6d25101efd08" + integrity sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg== + dependencies: + "@babel/runtime" "^7.7.6" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^2.5.0: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== + +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +home-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/home-dir/-/home-dir-1.0.0.tgz#2917eb44bdc9072ceda942579543847e3017fe4e" + integrity sha1-KRfrRL3JByztqUJXlUOEfjAX/k4= + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +hosted-git-info@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.4.tgz#be4973eb1fd2737b11c9c7c19380739bb249f60d" + integrity sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ== + dependencies: + lru-cache "^5.1.1" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +hsluv@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/hsluv/-/hsluv-0.0.3.tgz#829107dafb4a9f8b52a1809ed02e091eade6754c" + integrity sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-element-map@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.2.0.tgz#dfbb09efe882806af63d990cf6db37993f099f22" + integrity sha512-0uXq8HsuG1v2TmQ8QkIhzbrqeskE4kn52Q18QJ9iAA/SnHoEKXWiUxHQtclRsCFWEUD2So34X+0+pZZu862nnw== + dependencies: + array-filter "^1.0.0" + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" + integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + +html-to-react@^1.3.4: + version "1.4.3" + resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.3.tgz#1430a1cb581ef29533892ec70a2fdc4554b17ffd" + integrity sha512-txe09A3vxW8yEZGJXJ1is5gGDfBEVACmZDSgwDyH5EsfRdOubBwBCg63ZThZP0xBn0UE4FyvMXZXmohusCxDcg== + dependencies: + domhandler "^3.0" + htmlparser2 "^4.1.0" + lodash.camelcase "^4.3.0" + ramda "^0.27" + +htmlparser2@^3.10.0, htmlparser2@^3.9.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +htmlparser2@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78" + integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q== + dependencies: + domelementtype "^2.0.1" + domhandler "^3.0.0" + domutils "^2.0.0" + entities "^2.0.0" + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" + integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +humanize-plus@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/humanize-plus/-/humanize-plus-1.8.2.tgz#a65b34459ad6367adbb3707a82a3c9f916167030" + integrity sha1-pls0RZrWNnrbs3B6gqPJ+RYWcDA= + +husky@^4.2.0: + version "4.2.5" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.5.tgz#2b4f7622673a71579f901d9885ed448394b5fa36" + integrity sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ== + dependencies: + chalk "^4.0.0" + ci-info "^2.0.0" + compare-versions "^3.6.0" + 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" + +iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.1.tgz#b2425d3c7b18f7219f2ca663d103bddb91718d64" + integrity sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.2.tgz#af6d628dccfb463b7364d97f715e4b74b8c8c2b8" + integrity sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +identity-obj-proxy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.1.12, ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^4.0.3, ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +image-palette@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/image-palette/-/image-palette-2.1.0.tgz#d976525a1df75964ca125d2dba2741e92905547f" + integrity sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ== + dependencies: + color-id "^1.1.0" + pxls "^2.0.0" + quantize "^1.0.2" + +immutable@^4.0.0-rc.12: + version "4.0.0-rc.12" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217" + integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-lazy@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" + integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +in-publish@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" + integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== + +incremental-convex-hull@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz#51428c14cb9d9a6144bfe69b2851fb377334be1e" + integrity sha1-UUKMFMudmmFEv+abKFH7N3M0vh4= + dependencies: + robust-orientation "^1.1.2" + simplicial-complex "^1.0.0" + +indent-string@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-1.2.2.tgz#db99bcc583eb6abbb1e48dcbb1999a986041cb6b" + integrity sha1-25m8xYPrarux5I3LsZmamGBBy2s= + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + repeating "^1.1.0" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.2.0.tgz#63ce99d823090de7eb420e4bb05e6f3449aa389a" + integrity sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ== + dependencies: + 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" + +inquirer@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + +interpret@^1.2.0, interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +interval-tree-1d@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/interval-tree-1d/-/interval-tree-1d-1.0.3.tgz#8fdbde02b6b2c7dbdead636bcbed8e08710d85c1" + integrity sha1-j9veArayx9verWNry+2OCHENhcE= + dependencies: + binary-search-bounds "^1.0.0" + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-permutation@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-permutation/-/invert-permutation-1.0.0.tgz#a0a78042eadb36bc17551e787efd1439add54933" + integrity sha1-oKeAQurbNrwXVR54fv0UOa3VSTM= + +iota-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" + integrity sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc= + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.3, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumeric@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" + integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ= + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-base64@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-base64/-/is-base64-0.1.0.tgz#a6f20610c6ef4863a51cba32bc0222544b932622" + integrity sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-blob@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-blob/-/is-blob-2.1.0.tgz#e36cd82c90653f1e1b930f11baf9c64216a05385" + integrity sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw== + +is-boolean-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e" + integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ== + +is-browser@^2.0.1, is-browser@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-browser/-/is-browser-2.1.0.tgz#fc084d59a5fced307d6708c59356bad7007371a9" + integrity sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ== + +is-buffer@^1.0.2, is-buffer@^1.1.4, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.0, is-buffer@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-decimal@^1.0.0, is-decimal@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" + integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== + +is-es2016-keyword@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-es2016-keyword/-/is-es2016-keyword-1.0.0.tgz#f6e54e110c5e4f8d265e69d2ed0eaf8cf5f47718" + integrity sha1-9uVOEQxeT40mXmnS7Q6vjPX0dxg= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0, is-finite@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-firefox@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-firefox/-/is-firefox-1.0.3.tgz#2a2a1567783a417f6e158323108f3861b0918562" + integrity sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI= + +is-float-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-float-array/-/is-float-array-1.0.0.tgz#96d67b1cbadf47ab1e05be208933acd386978a09" + integrity sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-iexplorer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-iexplorer/-/is-iexplorer-1.0.0.tgz#1d72bc66d3fe22eaf6170dda8cf10943248cfc76" + integrity sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY= + +is-installed-globally@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" + integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== + dependencies: + global-dirs "^2.0.1" + is-path-inside "^3.0.1" + +is-jquery-obj@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-jquery-obj/-/is-jquery-obj-0.1.1.tgz#e8d9cc9737b1ab0733b50303e33a38ed7cc2f60b" + integrity sha512-18toSebUVF7y717dgw/Dzn6djOCqrkiDp3MhB8P6TdKyCVkbD1ZwE7Uz8Hwx6hUPTvKjbyYH9ncXT4ts4qLaSA== + +is-mobile@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-2.2.1.tgz#10f2320012c410cc285feecb13406bd586f1b2f8" + integrity sha512-6zELsfVFr326eq2CI53yvqq6YBanOxKBybwDT+MbMS2laBnK6Ez8m5XHSuTQQbnKRfpDzCod1CMWW5q3wZYMvA== + +is-npm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" + integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== + +is-number-object@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-object@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-cwd@^2.0.0, is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-path-inside@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@^1.0.5, is-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" + integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== + dependencies: + has-symbols "^1.0.1" + +is-regex@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-regexp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" + integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string-blank@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-string-blank/-/is-string-blank-1.0.1.tgz#866dca066d41d2894ebdfd2d8fe93e586e583a03" + integrity sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw== + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-subset@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= + +is-svg-path@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-svg-path/-/is-svg-path-1.0.2.tgz#77ab590c12b3d20348e5c7a13d0040c87784dda0" + integrity sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA= + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-there@^4.4.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/is-there/-/is-there-4.5.0.tgz#62e918299660c4549b5388b8dd0c982f268fa30e" + integrity sha512-ko8s1Ll99F0fxKSGil5gdQCGOgkmOLWIC++OWBi3IvhlELNZzqUF/ydlcNnzMH18hau9wGfE77RjDMBxX1Qw+w== + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isbinaryfile@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b" + integrity sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-instrument@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jest-changed-files@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.5.0.tgz#141cc23567ceb3f534526f8614ba39421383634c" + integrity sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw== + dependencies: + "@jest/types" "^25.5.0" + execa "^3.2.0" + throat "^5.0.0" + +jest-cli@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.5.4.tgz#b9f1a84d1301a92c5c217684cb79840831db9f0d" + integrity sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw== + dependencies: + "@jest/core" "^25.5.4" + "@jest/test-result" "^25.5.0" + "@jest/types" "^25.5.0" + chalk "^3.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^25.5.4" + jest-util "^25.5.0" + jest-validate "^25.5.0" + prompts "^2.0.1" + realpath-native "^2.0.0" + yargs "^15.3.1" + +jest-config@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.5.4.tgz#38e2057b3f976ef7309b2b2c8dcd2a708a67f02c" + integrity sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^25.5.4" + "@jest/types" "^25.5.0" + babel-jest "^25.5.1" + chalk "^3.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-environment-jsdom "^25.5.0" + jest-environment-node "^25.5.0" + jest-get-type "^25.2.6" + jest-jasmine2 "^25.5.4" + jest-regex-util "^25.2.6" + jest-resolve "^25.5.1" + jest-util "^25.5.0" + jest-validate "^25.5.0" + micromatch "^4.0.2" + pretty-format "^25.5.0" + realpath-native "^2.0.0" + +jest-diff@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-diff@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" + integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== + dependencies: + chalk "^3.0.0" + diff-sequences "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.5.0" + +jest-docblock@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.3.0.tgz#8b777a27e3477cd77a168c05290c471a575623ef" + integrity sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg== + dependencies: + detect-newline "^3.0.0" + +jest-each@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.5.0.tgz#0c3c2797e8225cb7bec7e4d249dcd96b934be516" + integrity sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA== + dependencies: + "@jest/types" "^25.5.0" + chalk "^3.0.0" + jest-get-type "^25.2.6" + jest-util "^25.5.0" + pretty-format "^25.5.0" + +jest-environment-jsdom@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz#dcbe4da2ea997707997040ecf6e2560aec4e9834" + integrity sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A== + dependencies: + "@jest/environment" "^25.5.0" + "@jest/fake-timers" "^25.5.0" + "@jest/types" "^25.5.0" + jest-mock "^25.5.0" + jest-util "^25.5.0" + jsdom "^15.2.1" + +jest-environment-node@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.5.0.tgz#0f55270d94804902988e64adca37c6ce0f7d07a1" + integrity sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA== + dependencies: + "@jest/environment" "^25.5.0" + "@jest/fake-timers" "^25.5.0" + "@jest/types" "^25.5.0" + jest-mock "^25.5.0" + jest-util "^25.5.0" + semver "^6.3.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-get-type@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" + integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== + +jest-haste-map@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.5.1.tgz#1df10f716c1d94e60a1ebf7798c9fb3da2620943" + integrity sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ== + dependencies: + "@jest/types" "^25.5.0" + "@types/graceful-fs" "^4.1.2" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-serializer "^25.5.0" + jest-util "^25.5.0" + jest-worker "^25.5.0" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + which "^2.0.2" + optionalDependencies: + fsevents "^2.1.2" + +jest-jasmine2@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz#66ca8b328fb1a3c5364816f8958f6970a8526968" + integrity sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^25.5.0" + "@jest/source-map" "^25.5.0" + "@jest/test-result" "^25.5.0" + "@jest/types" "^25.5.0" + chalk "^3.0.0" + co "^4.6.0" + expect "^25.5.0" + is-generator-fn "^2.0.0" + jest-each "^25.5.0" + jest-matcher-utils "^25.5.0" + jest-message-util "^25.5.0" + jest-runtime "^25.5.4" + jest-snapshot "^25.5.1" + jest-util "^25.5.0" + pretty-format "^25.5.0" + throat "^5.0.0" + +jest-leak-detector@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz#2291c6294b0ce404241bb56fe60e2d0c3e34f0bb" + integrity sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA== + dependencies: + jest-get-type "^25.2.6" + pretty-format "^25.5.0" + +jest-matcher-utils@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz#fbc98a12d730e5d2453d7f1ed4a4d948e34b7867" + integrity sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw== + dependencies: + chalk "^3.0.0" + jest-diff "^25.5.0" + jest-get-type "^25.2.6" + pretty-format "^25.5.0" + +jest-message-util@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.5.0.tgz#ea11d93204cc7ae97456e1d8716251185b8880ea" + integrity sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^25.5.0" + "@types/stack-utils" "^1.0.1" + chalk "^3.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + slash "^3.0.0" + stack-utils "^1.0.1" + +jest-mock@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.5.0.tgz#a91a54dabd14e37ecd61665d6b6e06360a55387a" + integrity sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA== + dependencies: + "@jest/types" "^25.5.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" + integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== + +jest-resolve-dependencies@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz#85501f53957c8e3be446e863a74777b5a17397a7" + integrity sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw== + dependencies: + "@jest/types" "^25.5.0" + jest-regex-util "^25.2.6" + jest-snapshot "^25.5.1" + +jest-resolve@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.5.1.tgz#0e6fbcfa7c26d2a5fe8f456088dc332a79266829" + integrity sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ== + dependencies: + "@jest/types" "^25.5.0" + browser-resolve "^1.11.3" + chalk "^3.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.1" + read-pkg-up "^7.0.1" + realpath-native "^2.0.0" + resolve "^1.17.0" + slash "^3.0.0" + +jest-runner@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.5.4.tgz#ffec5df3875da5f5c878ae6d0a17b8e4ecd7c71d" + integrity sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg== + dependencies: + "@jest/console" "^25.5.0" + "@jest/environment" "^25.5.0" + "@jest/test-result" "^25.5.0" + "@jest/types" "^25.5.0" + chalk "^3.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-config "^25.5.4" + jest-docblock "^25.3.0" + jest-haste-map "^25.5.1" + jest-jasmine2 "^25.5.4" + jest-leak-detector "^25.5.0" + jest-message-util "^25.5.0" + jest-resolve "^25.5.1" + jest-runtime "^25.5.4" + jest-util "^25.5.0" + jest-worker "^25.5.0" + source-map-support "^0.5.6" + throat "^5.0.0" + +jest-runtime@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.5.4.tgz#dc981fe2cb2137abcd319e74ccae7f7eeffbfaab" + integrity sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ== + dependencies: + "@jest/console" "^25.5.0" + "@jest/environment" "^25.5.0" + "@jest/globals" "^25.5.2" + "@jest/source-map" "^25.5.0" + "@jest/test-result" "^25.5.0" + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.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.4" + jest-config "^25.5.4" + jest-haste-map "^25.5.1" + jest-message-util "^25.5.0" + jest-mock "^25.5.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.5.1" + jest-snapshot "^25.5.1" + jest-util "^25.5.0" + jest-validate "^25.5.0" + realpath-native "^2.0.0" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.3.1" + +jest-serializer@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.5.0.tgz#a993f484e769b4ed54e70e0efdb74007f503072b" + integrity sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA== + dependencies: + graceful-fs "^4.2.4" + +jest-snapshot@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.5.1.tgz#1a2a576491f9961eb8d00c2e5fd479bc28e5ff7f" + integrity sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^25.5.0" + "@types/prettier" "^1.19.0" + chalk "^3.0.0" + expect "^25.5.0" + graceful-fs "^4.2.4" + jest-diff "^25.5.0" + jest-get-type "^25.2.6" + jest-matcher-utils "^25.5.0" + jest-message-util "^25.5.0" + jest-resolve "^25.5.1" + make-dir "^3.0.0" + natural-compare "^1.4.0" + pretty-format "^25.5.0" + semver "^6.3.0" + +jest-util@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.5.0.tgz#31c63b5d6e901274d264a4fec849230aa3fa35b0" + integrity sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA== + dependencies: + "@jest/types" "^25.5.0" + chalk "^3.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + make-dir "^3.0.0" + +jest-validate@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.5.0.tgz#fb4c93f332c2e4cf70151a628e58a35e459a413a" + integrity sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ== + dependencies: + "@jest/types" "^25.5.0" + camelcase "^5.3.1" + chalk "^3.0.0" + jest-get-type "^25.2.6" + leven "^3.1.0" + pretty-format "^25.5.0" + +jest-watcher@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.5.0.tgz#d6110d101df98badebe435003956fd4a465e8456" + integrity sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q== + dependencies: + "@jest/test-result" "^25.5.0" + "@jest/types" "^25.5.0" + ansi-escapes "^4.2.1" + chalk "^3.0.0" + jest-util "^25.5.0" + string-length "^3.1.0" + +jest-worker@^25.4.0, jest-worker@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@^25.1.0: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest/-/jest-25.5.4.tgz#f21107b6489cfe32b076ce2adcadee3587acb9db" + integrity sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ== + dependencies: + "@jest/core" "^25.5.4" + import-local "^3.0.2" + jest-cli "^25.5.4" + +jquery@x.*: + version "3.5.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" + integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== + +js-base64@^2.1.8: + version "2.6.1" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.1.tgz#c328374225d2e65569791ded73c258e2c59334c7" + integrity sha512-G5x2saUTupU9D/xBY9snJs3TxvwX8EkpLFiYlPpDt/VmMHOXprnSU1nxiTmFbijCX4BLF/cMRIfAcC5BiMYgFQ== + +js-message@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.5.tgz#2300d24b1af08e89dd095bc1a4c9c9cfcb892d15" + integrity sha1-IwDSSxrwjondCVvBpMnJz8uJLRU= + +js-queue@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/js-queue/-/js-queue-2.0.0.tgz#362213cf860f468f0125fc6c96abc1742531f948" + integrity sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug= + dependencies: + easy-stack "^1.0.0" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1, js-yaml@^3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^15.2.1: + version "15.2.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" + integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== + dependencies: + 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" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.0, json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" + integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + dependencies: + universalify "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: + version "2.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" + integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== + dependencies: + array-includes "^3.1.1" + object.assign "^4.1.0" + +jupyter-paths@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/jupyter-paths/-/jupyter-paths-2.0.3.tgz#1e2827981f78f401e398576048a290172e0c67e4" + integrity sha512-cQuCfHtKINnwiVTu1Ljm7Pk+tRZiV2wJkZLn0fUmZIJ76v9cIw/nu3PXgUYZ3T120eYxg6oELRxGkXianCowZQ== + dependencies: + home-dir "^1.0.0" + +just-extend@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.0.tgz#7278a4027d889601640ee0ce0e5a00b992467da4" + integrity sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA== + +kdbush@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" + integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== + +kernelspecs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kernelspecs/-/kernelspecs-2.0.0.tgz#273411c7f9cfd352cb742d86b24723a0869e2c4f" + integrity sha512-lce4pPDrs4VdxKYTEBnGLT81A3yNP8syyMAq5AejE+CKAkiXQXrHZaHO1F4c/RmgkKKF1Otis1XrpBxOOQsdnw== + dependencies: + jupyter-paths "^2.0.0" + +keyboard-key@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keyboard-key/-/keyboard-key-1.1.0.tgz#6f2e8e37fa11475bb1f1d65d5174f1b35653f5b7" + integrity sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ== + +keyboardevent-from-electron-accelerator@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz#ace21b1aa4e47148815d160057f9edb66567c50c" + integrity sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA== + +keyboardevents-areequal@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz#88191ec738ce9f7591c25e9056de928b40277194" + integrity sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw== + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +kleur@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.0.1.tgz#3d4948534b666e2578f93b6fafb62108e64f05ef" + integrity sha512-Qs6SqCLm63rd0kNVh+wO4XsWLU6kgfwwaPYsLiClWf0Tewkzsa6MvB21bespb8cz+ANS+2t3So1ge3gintzhlw== + +known-css-properties@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.19.0.tgz#5d92b7fa16c72d971bda9b7fe295bdf61836ee5b" + integrity sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA== + +lab.js@^20.0.1: + version "20.0.1" + resolved "https://registry.yarnpkg.com/lab.js/-/lab.js-20.0.1.tgz#a79c49e2eeef198e4185da4208af89e77dc40ea9" + integrity sha512-+j8g+SiAhDdhctFcxaQ2EjTkvijWyDXkssrnvTaaJBXdJazBeK2KYnPrgTXx6aAHnGAK13uDtg6l0xVF99NfWQ== + dependencies: + "@babel/runtime" "^7.8.0" + common-tags "^1.8.0" + core-js "^3.6.1" + cross-env "^5.2.0" + es2015-proxy "^0.1.7" + es6-promise "^4.1.0" + fast-async "^7.0.0" + file-saver "^1.3.8" + lodash "^4.17.10" + nodent "^3.2.6" + seedrandom "^3.0.5" + shim-keyboard-event-key "^1.0.2" + terser-webpack-plugin "^2.3.5" + ua-parser-js "^0.7.19" + whatwg-fetch "^2.0.4" + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +latest-version@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + +lazy-val@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65" + integrity sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q== + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + dependencies: + readable-stream "^2.0.5" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +lerp@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/lerp/-/lerp-1.0.3.tgz#a18c8968f917896de15ccfcc28d55a6b731e776e" + integrity sha1-oYyJaPkXiW3hXM/MKNVaa3Med24= + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +lint-staged@^10.0.2: + version "10.2.11" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.11.tgz#713c80877f2dc8b609b05bc59020234e766c9720" + integrity sha512-LRRrSogzbixYaZItE2APaS4l2eJMjjf5MbclRZpLJtcQJShcvUzKXsNeZgsLIZ0H0+fg2tL4B59fU9wHIHtFIA== + dependencies: + chalk "^4.0.0" + cli-truncate "2.1.0" + commander "^5.1.0" + cosmiconfig "^6.0.0" + debug "^4.1.1" + dedent "^0.7.0" + enquirer "^2.3.5" + execa "^4.0.1" + listr2 "^2.1.0" + log-symbols "^4.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" + +linux-platform-info@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/linux-platform-info/-/linux-platform-info-0.0.3.tgz#2dae324385e66e3d755bec83f86c7beea61ceb83" + integrity sha1-La4yQ4Xmbj11W+yD+Gx77qYc64M= + dependencies: + os-family "^1.0.0" + +listr2@^2.1.0: + version "2.1.8" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.1.8.tgz#8af7ebc70cdbe866ddbb6c80909142bd45758f1f" + integrity sha512-Op+hheiChfAphkJ5qUxZtHgyjlX9iNnAeFS/S134xw7mVSg0YVrQo1IY4/K+ElY6XgOPg2Ij4z07urUXR+YEew== + dependencies: + chalk "^4.0.0" + cli-truncate "^2.1.0" + figures "^3.2.0" + indent-string "^4.0.0" + log-update "^4.0.0" + p-map "^4.0.0" + rxjs "^6.5.5" + through "^2.3.8" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= + +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + integrity sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg= + +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= + +lodash.flow@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash.memoize@4.1.2, lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +"lodash@4.6.1 || ^4.16.1", lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.10: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-symbols@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +log-update-async-hook@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/log-update-async-hook/-/log-update-async-hook-2.0.2.tgz#6eba89dbe67fa12d0b20ac47df7942947af1fcd1" + integrity sha512-HQwkKFTZeUOrDi1Duf2CSUa/pSpcaCHKLdx3D/Z16DsipzByOBffcg5y0JZA1q0n80dYgLXe2hFM9JGNgBsTDw== + dependencies: + ansi-escapes "^2.0.0" + async-exit-hook "^1.1.2" + onetime "^2.0.1" + wrap-ansi "^2.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +loglevel@^1.6.8: + version "1.6.8" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" + integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== + +lolex@^5.0.0, lolex@^5.0.1, lolex@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" + integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== + dependencies: + "@sinonjs/commons" "^1.7.0" + +longest-streak@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" + integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.6.3.tgz#51ccd0b4fc0c843587d7a5709ce4d3b7629bedc5" + integrity sha1-UczQtPwMhDWH16VwnOTTt2Kb7cU= + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +magic-string@^0.25.3: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-limit@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" + integrity sha1-63lhAxwPDo0AG/LVb6toXViCLzg= + dependencies: + once "~1.3.0" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" + integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== + +map-reverse@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-reverse/-/map-reverse-1.0.1.tgz#274e9f500a611153183b5b8d8490a9c1c23ee310" + integrity sha1-J06fUAphEVMYO1uNhJCpwcI+4xA= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +mapbox-gl@1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-1.10.1.tgz#7dbd53bdf2f78e45e125c1115e94dea286ef663c" + integrity sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg== + dependencies: + "@mapbox/geojson-rewind" "^0.5.0" + "@mapbox/geojson-types" "^1.0.2" + "@mapbox/jsonlint-lines-primitives" "^2.0.2" + "@mapbox/mapbox-gl-supported" "^1.5.0" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/tiny-sdf" "^1.1.1" + "@mapbox/unitbezier" "^0.0.0" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.1.0" + csscolorparser "~1.0.3" + earcut "^2.2.2" + geojson-vt "^3.2.1" + gl-matrix "^3.2.1" + grid-index "^1.1.0" + minimist "^1.2.5" + murmurhash-js "^1.0.0" + pbf "^3.2.1" + potpack "^1.0.1" + quickselect "^2.0.0" + rw "^1.3.3" + supercluster "^7.0.0" + tinyqueue "^2.0.3" + vt-pbf "^3.1.1" + +marching-simplex-table@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/marching-simplex-table/-/marching-simplex-table-1.0.0.tgz#bc16256e0f8f9b558aa9b2872f8832d9433f52ea" + integrity sha1-vBYlbg+Pm1WKqbKHL4gy2UM/Uuo= + dependencies: + convex-hull "^1.0.3" + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +markdown-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" + integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== + dependencies: + repeat-string "^1.0.0" + +mat4-decompose@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mat4-decompose/-/mat4-decompose-1.0.4.tgz#65eb4fe39d70878f7a444eb4624d52f7e7eb2faf" + integrity sha1-ZetP451wh496RE60Yk1S9+frL68= + dependencies: + gl-mat4 "^1.0.1" + gl-vec3 "^1.0.2" + +mat4-interpolate@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz#55ffe9eb3c35295e2c0d5a9f7725d9068a89ff74" + integrity sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q= + dependencies: + gl-mat4 "^1.0.1" + gl-vec3 "^1.0.2" + mat4-decompose "^1.0.3" + mat4-recompose "^1.0.3" + quat-slerp "^1.0.0" + +mat4-recompose@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mat4-recompose/-/mat4-recompose-1.0.4.tgz#3953c230ff2473dc772ee014a52c925cf81b0e4d" + integrity sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0= + dependencies: + gl-mat4 "^1.0.1" + +match-url-wildcard@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/match-url-wildcard/-/match-url-wildcard-0.0.4.tgz#c8533da7ec0901eddf01fc0893effa68d4e727d6" + integrity sha512-R1XhQaamUZPWLOPtp4ig5j+3jctN+skhgRmEQTUamMzmNtRG69QEirQs0NZKLtHMR7tzWpmtnS4Eqv65DcgXUA== + dependencies: + escape-string-regexp "^1.0.5" + +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + +math-log2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-log2/-/math-log2-1.0.1.tgz#fb8941be5f5ebe8979e718e6273b178e58694565" + integrity sha1-+4lBvl9evol55xjmJzsXjlhpRWU= + +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + +matrix-camera-controller@^2.1.1, matrix-camera-controller@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/matrix-camera-controller/-/matrix-camera-controller-2.1.3.tgz#35e5260cc1cd550962ba799f2d8d4e94b1a39370" + integrity sha1-NeUmDMHNVQliunmfLY1OlLGjk3A= + dependencies: + binary-search-bounds "^1.0.0" + gl-mat4 "^1.1.2" + gl-vec3 "^1.0.3" + mat4-interpolate "^1.0.3" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdast-add-list-metadata@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz#95e73640ce2fc1fa2dcb7ec443d09e2bfe7db4cf" + integrity sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA== + dependencies: + unist-util-visit-parents "1.1.2" + +mdast-util-compact@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz#cabc69a2f43103628326f35b1acf735d55c99490" + integrity sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA== + dependencies: + unist-util-visit "^2.0.0" + +mdn-browser-compat-data@^1.0.21: + version "1.0.26" + resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.26.tgz#2a0bd34358d6b4e687da6b8c01e439576503db6c" + integrity sha512-fULnPQLDsAH/ert7ZtKCDCPyD3gXCh+M0Qapab15VfDGUrqr3Q25HgIchiS6J/giqrfxPbYfCSnVY9Lp2FRPZQ== + dependencies: + extend "3.0.2" + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memory-fs@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + integrity sha1-8rslNovBIeORwlIN6Slpyu4KApA= + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.1.0, meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +meow@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-7.0.1.tgz#1ed4a0a50b3844b451369c48362eb0515f04c1dc" + integrity sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw== + dependencies: + "@types/minimist" "^1.2.0" + arrify "^2.0.1" + camelcase "^6.0.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "^4.0.2" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" + +merge-descriptors@1.0.1, merge-descriptors@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= + dependencies: + readable-stream "^2.0.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3, merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.44.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.41.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4, mime@^2.4.5: + version "2.4.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== + +mime@~1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-create-react-context@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040" + integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA== + dependencies: + "@babel/runtime" "^7.5.5" + tiny-warning "^1.0.3" + +mini-css-extract-plugin@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" + integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist-options@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34" + integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ== + dependencies: + minipass "^3.0.0" + +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + 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@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +module-not-found-error@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" + integrity sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA= + +moment-duration-format-commonjs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/moment-duration-format-commonjs/-/moment-duration-format-commonjs-1.0.0.tgz#dc5de612e6d6ff41f774d03772a139a363563bc3" + integrity sha512-MVFR4hIh4jfuwSCPBEE5CCwn3refvTsxK/Yv/DpKJ6YcNnCimlVJ6DQeTJG1KVQPw1o8m3tkbHE9gVjivyv9iA== + +moment@^2.10.3, moment@^2.14.1, moment@^2.26.0: + version "2.27.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" + integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== + +monotone-convex-hull-2d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz#47f5daeadf3c4afd37764baa1aa8787a40eee08c" + integrity sha1-R/Xa6t88Sv03dkuqGqh4ekDu4Iw= + dependencies: + robust-orientation "^1.1.3" + +moo@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" + integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== + +mouse-change@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/mouse-change/-/mouse-change-1.4.0.tgz#c2b77e5bfa34a43ce1445c8157a4e4dc9895c14f" + integrity sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8= + dependencies: + mouse-event "^1.0.0" + +mouse-event-offset@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz#dfd86a6e248c6ba8cad53b905d5037a2063e9984" + integrity sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ= + +mouse-event@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/mouse-event/-/mouse-event-1.0.5.tgz#b3789edb7109997d5a932d1d01daa1543a501732" + integrity sha1-s3ie23EJmX1aky0dAdqhVDpQFzI= + +mouse-wheel@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mouse-wheel/-/mouse-wheel-1.2.0.tgz#6d2903b1ea8fb48e61f1b53b9036773f042cdb5c" + integrity sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w= + dependencies: + right-now "^1.0.0" + signum "^1.0.0" + to-px "^1.0.1" + +mousetrap@^1.6.5: + version "1.6.5" + resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.6.5.tgz#8a766d8c272b08393d5f56074e0b5ec183485bf9" + integrity sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + 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@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mumath@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/mumath/-/mumath-3.3.4.tgz#48d4a0f0fd8cad4e7b32096ee89b161a63d30bbf" + integrity sha1-SNSg8P2MrU57Mglu6JsWGmPTC78= + dependencies: + almost-equal "^1.1.0" + +murmurhash-js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" + integrity sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E= + +muse-js@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/muse-js/-/muse-js-3.1.0.tgz#b443f60407bb6da84fdcf6c14e9c0bdcf00a2829" + integrity sha512-uH/yAfQIL0rOvgtbxFPb5C07X+M4vAD/2vDkVbi+NKocT2ADbbg2igHjiNvdN6dRhom9VfZ2S6HG2dvjnXa2jQ== + dependencies: + "@types/web-bluetooth" "^0.0.2" + rxjs "^6.0.0 || ^5.6.0-forward-compat.4" + +mustache@^2.1.1, mustache@^2.1.2, mustache@^2.2.1, mustache@^2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" + integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1, nan@^2.13.2: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + +nanoid@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-0.2.2.tgz#e2ebc6ad3db5e0454fd8124d30ca39b06555fe56" + integrity sha512-GHoRrvNEKiwdkwQ/enKL8AhQkkrBC/2KxMZkDvQzp8OtkpX8ZAmoYJWFVl7l8F2+HcEJUfdg21Ab2wXXfrvACQ== + +nanoid@^1.0.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-1.3.4.tgz#ad89f62c9d1f4fd69710d4a90953d2893d2d31f4" + integrity sha512-4ug4BsuHxiVHoRUe1ud6rUFT3WUMmjXt1W0quL0CviZQANdan7D8kqN5/maw53hmAApY/jfzMRkC57BNNs60ZQ== + +nanoid@^2.1.3: + version "2.1.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280" + integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +ndarray-extract-contour@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ndarray-extract-contour/-/ndarray-extract-contour-1.0.1.tgz#0aee113a3a33b226b90c4888cf877bf4751305e4" + integrity sha1-Cu4ROjozsia5DEiIz4d79HUTBeQ= + dependencies: + typedarray-pool "^1.0.0" + +ndarray-fill@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ndarray-fill/-/ndarray-fill-1.0.2.tgz#a30a60f7188e0c9582fcdd58896acdcb522a1ed6" + integrity sha1-owpg9xiODJWC/N1YiWrNy1IqHtY= + dependencies: + cwise "^1.0.10" + +ndarray-gradient@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ndarray-gradient/-/ndarray-gradient-1.0.0.tgz#b7491a515c6a649f19a62324fff6f27fc8c25393" + integrity sha1-t0kaUVxqZJ8ZpiMk//byf8jCU5M= + dependencies: + cwise-compiler "^1.0.0" + dup "^1.0.0" + +ndarray-homography@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ndarray-homography/-/ndarray-homography-1.0.0.tgz#c35516ea86bc2862b4e804a236a2707309fe296b" + integrity sha1-w1UW6oa8KGK06ASiNqJwcwn+KWs= + dependencies: + gl-matrix-invert "^1.0.0" + ndarray-warp "^1.0.0" + +ndarray-linear-interpolate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ndarray-linear-interpolate/-/ndarray-linear-interpolate-1.0.0.tgz#78bc92b85b9abc15b6e67ee65828f9e2137ae72b" + integrity sha1-eLySuFuavBW25n7mWCj54hN65ys= + +ndarray-ops@^1.1.0, ndarray-ops@^1.2.1, ndarray-ops@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ndarray-ops/-/ndarray-ops-1.2.2.tgz#59e88d2c32a7eebcb1bc690fae141579557a614e" + integrity sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4= + dependencies: + cwise-compiler "^1.0.0" + +ndarray-pack@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ndarray-pack/-/ndarray-pack-1.2.1.tgz#8caebeaaa24d5ecf70ff86020637977da8ee585a" + integrity sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo= + dependencies: + cwise-compiler "^1.1.2" + ndarray "^1.0.13" + +ndarray-scratch@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ndarray-scratch/-/ndarray-scratch-1.2.0.tgz#6304636d62eba93db4727ac13c693341dba50e01" + integrity sha1-YwRjbWLrqT20cnrBPGkzQdulDgE= + dependencies: + ndarray "^1.0.14" + ndarray-ops "^1.2.1" + typedarray-pool "^1.0.2" + +ndarray-sort@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ndarray-sort/-/ndarray-sort-1.0.1.tgz#fea05b4cb834c7f4e0216a354f3ca751300dfd6a" + integrity sha1-/qBbTLg0x/TgIWo1TzynUTAN/Wo= + dependencies: + typedarray-pool "^1.0.0" + +ndarray-warp@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ndarray-warp/-/ndarray-warp-1.0.1.tgz#a8a125aaabba0bebf93bd6ca83e6abd6822a34e0" + integrity sha1-qKElqqu6C+v5O9bKg+ar1oIqNOA= + dependencies: + cwise "^1.0.4" + ndarray-linear-interpolate "^1.0.0" + +ndarray@^1.0.11, ndarray@^1.0.13, ndarray@^1.0.14, ndarray@^1.0.15, ndarray@^1.0.18, ndarray@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/ndarray/-/ndarray-1.0.19.tgz#6785b5f5dfa58b83e31ae5b2a058cfd1ab3f694e" + integrity sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ== + dependencies: + iota-array "^1.0.0" + is-buffer "^1.0.2" + +nearley@^2.7.10: + version "2.19.4" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.4.tgz#7518cbdd7d0e8e08b5f82841b9edb0126239c8b1" + integrity sha512-oqj3m4oqwKsN77pETa9IPvxHHHLW68KrDc2KYoWMUOhDlrNUo7finubwffQMBRnwNCOXc4kRxCZO0Rvx4L6Zrw== + dependencies: + commander "^2.19.0" + moo "^0.5.0" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + semver "^5.4.1" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nextafter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/nextafter/-/nextafter-1.0.0.tgz#b7d77b535310e3e097e6025abb0a903477ec1a3a" + integrity sha1-t9d7U1MQ4+CX5gJauwqQNHfsGjo= + dependencies: + double-bits "^1.1.0" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nise@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/nise/-/nise-3.0.1.tgz#0659982af515e5aac15592226246243e8da0013d" + integrity sha512-fYcH9y0drBGSoi88kvhpbZEsenX58Yr+wOJ4/Mi1K4cy+iGP/a73gNoyNhu5E9QxPdgTlVChfIaAlnyOy/gHUA== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/formatio" "^4.0.1" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + lolex "^5.0.1" + path-to-regexp "^1.7.0" + +node-abi@^2.11.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.18.0.tgz#1f5486cfd7d38bd4f5392fa44a4ad4d9a0dffbf4" + integrity sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw== + dependencies: + semver "^5.4.1" + +node-forge@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" + integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-gyp@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-6.1.0.tgz#64e31c61a4695ad304c1d5b82cf6b7c79cc79f3f" + integrity sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.1.2" + request "^2.88.0" + rimraf "^2.6.3" + semver "^5.7.1" + tar "^4.4.12" + which "^1.3.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-ipc@^9.1.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.1.1.tgz#4e245ed6938e65100e595ebc5dc34b16e8dd5d69" + integrity sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w== + dependencies: + event-pubsub "4.3.0" + js-message "1.0.5" + js-queue "2.0.0" + +"node-libs-browser@^1.0.0 || ^2.0.0", node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + 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" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12" + integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw== + dependencies: + growly "^1.3.0" + is-wsl "^2.1.1" + semver "^6.3.0" + shellwords "^0.1.1" + which "^1.3.1" + +node-releases@^1.1.53: + version "1.1.58" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935" + integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg== + +node-sass@^4.13.1: + version "4.14.1" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" + integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.15" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "2.2.5" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +node-version@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d" + integrity sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ== + +nodent-compiler@^3.2.11: + version "3.2.11" + resolved "https://registry.yarnpkg.com/nodent-compiler/-/nodent-compiler-3.2.11.tgz#8f4bc703d7d8d0e563f5e09ea22efdce04dbaf9b" + integrity sha512-rfDrGWdgIJYomPUzR8nXiWNuIhJ7cVodPeZP3Ho65LEycuaX2uVNZ0ytpcfrmUKzdFeLRtye9+pHe8OynPZuPQ== + dependencies: + acorn ">= 2.5.2 <= 5.7.3" + acorn-es7-plugin "^1.1.7" + nodent-transform "^3.2.9" + source-map "^0.5.7" + +nodent-runtime@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/nodent-runtime/-/nodent-runtime-3.2.1.tgz#9e2755d85e39f764288f0d4752ebcfe3e541e00e" + integrity sha512-7Ws63oC+215smeKJQCxzrK21VFVlCFBkwl0MOObt0HOpVQXs3u483sAmtkF33nNqZ5rSOQjB76fgyPBmAUrtCA== + +nodent-transform@^3.2.4, nodent-transform@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/nodent-transform/-/nodent-transform-3.2.9.tgz#ec11a6116b5476e60bc212371cf6b8e4c74f40b6" + integrity sha512-4a5FH4WLi+daH/CGD5o/JWRR8W5tlCkd3nrDSkxbOzscJTyTUITltvOJeQjg3HJ1YgEuNyiPhQbvbtRjkQBByQ== + +nodent@^3.2.6: + version "3.2.11" + resolved "https://registry.yarnpkg.com/nodent/-/nodent-3.2.11.tgz#1c00b78bc8fc805fbb3b924d0cd021ef33078043" + integrity sha512-y+ofPYAJvGJB50B95pE26iPJqdTzgYKW3AjsqdLQboetJxH8tGRn1vr1gIe+z7PA7ZwcEUTOrahj6RaVzU2ivA== + dependencies: + nodent-compiler "^3.2.11" + nodent-runtime "^3.2.1" + resolve "^1.5.0" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-selector@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" + integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= + +normalize-svg-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-1.0.1.tgz#6f729ad6b70bb4ca4eff2fe4b107489efe1d56fe" + integrity sha1-b3Ka1rcLtMpO/y/ksQdInv4dVv4= + dependencies: + svg-arc-to-cubic-bezier "^3.0.0" + +normalize-svg-path@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz#456360e60ece75fbef7b5d7e160480e7ffd16fe5" + integrity sha1-RWNg5g7Odfvve11+FgSA5//Rb+U= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + +normals@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/normals/-/normals-1.1.0.tgz#325b595ed34afe467a6c55a14fd9085787ff59c0" + integrity sha1-MltZXtNK/kZ6bFWhT9kIV4f/WcA= + +npm-conf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + +npm-install-package@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/npm-install-package/-/npm-install-package-2.1.0.tgz#d7efe3cfcd7ab00614b896ea53119dc9ab259125" + integrity sha1-1+/jz816sAYUuJbqUxGdyaslkSU= + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@^1.0.2, nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nugget@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" + integrity sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA= + dependencies: + debug "^2.1.3" + minimist "^1.1.0" + pretty-bytes "^1.0.2" + progress-stream "^1.1.0" + request "^2.45.0" + single-line-log "^1.1.2" + throttleit "0.0.2" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-integer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-integer/-/number-is-integer-1.0.1.tgz#e59bca172ffed27318e79c7ceb6cb72c095b2152" + integrity sha1-5ZvKFy/+0nMY55x862y3LAlbIVI= + dependencies: + is-finite "^1.0.1" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +numeric@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/numeric/-/numeric-1.2.6.tgz#765b02bef97988fcf880d4eb3f36b80fa31335aa" + integrity sha1-dlsCvvl5iPz4gNTrPza4D6MTNao= + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + +object-inspect@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-0.4.0.tgz#f5157c116c1455b243b06ee97703392c5ad89fec" + integrity sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w= + +object-inspect@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-is@^1.0.1, object-is@^1.0.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" + integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.0.9, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" + integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + has "^1.0.3" + +object.fromentries@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" + integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0, object.values@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= + dependencies: + wrappy "1" + +onetime@^2.0.0, onetime@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +opencollective-postinstall@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimist@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optimize-css-assets-webpack-plugin@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" + integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + 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" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + 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" + +orbit-camera-controller@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz#6e2b36f0e7878663c330f50da9b7ce686c277005" + integrity sha1-bis28OeHhmPDMPUNqbfOaGwncAU= + dependencies: + filtered-vector "^1.2.1" + gl-mat4 "^1.0.3" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-family@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/os-family/-/os-family-1.1.0.tgz#8a89cb617dd1631b8ef9506be830144f626c214e" + integrity sha512-E3Orl5pvDJXnVmpaAA2TeNNpNhTMl4o5HghuWhOivBjEiTnJSrMYSa5uZMek1lBEvu8kKEsa2YgVcGFVDqX/9w== + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-homedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-2.0.0.tgz#a0c76bb001a8392a503cbd46e7e650b3423a923c" + integrity sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q== + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@0, osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-each-series@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" + integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +pad-left@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pad-left/-/pad-left-1.0.2.tgz#19e5735ea98395a26cedc6ab926ead10f3100d4c" + integrity sha1-GeVzXqmDlaJs7carkm6tEPMQDUw= + dependencies: + repeat-string "^1.3.0" + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +papaparse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.2.0.tgz#97976a1b135c46612773029153dc64995caa3b7b" + integrity sha512-ylq1wgUSnagU+MKQtNeVqrPhZuMYBvOSL00DHycFTCxownF95gpLAk1HiHdUW77N8yxRq1qHXLdlIPyBSG9NSA== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parenthesis@^3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/parenthesis/-/parenthesis-3.1.7.tgz#01c89b603a2a6a262ec47554e74ed154a9be2aa6" + integrity sha512-iMtu+HCbLXVrpf6Ys/4YKhcFxbux3xK4ZVB9r+a2kMSqeeQWQoDNYlXIsOjwlT2ldYXZ3k5PVeBnYn7fbAo/Bg== + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + 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-entities@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" + integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parse-rect@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parse-rect/-/parse-rect-1.2.0.tgz#e0a5b0dbaaaee637a0a1eb9779969e19399d8dec" + integrity sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA== + dependencies: + pick-by-alias "^1.2.0" + +parse-svg-path@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" + integrity sha1-en7A0esG+lMlx9PgCbhZoJtdSes= + +parse-unit@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-unit/-/parse-unit-1.0.1.tgz#7e1bb6d5bef3874c28e392526a2541170291eecf" + integrity sha1-fhu21b7zh0wo45JSaiVBFwKR7s8= + +parse5@2.2.3, parse5@^2.1.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-2.2.3.tgz#0c4fc41c1000c5e6b93d48b03f8083837834e9f6" + integrity sha1-DE/EHBAAxea5PUiwP4CDg3g06fY= + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + +parse5@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= + +parse5@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== + dependencies: + "@types/node" "*" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +patch-package@6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" + integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^2.4.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^1.2.1" + fs-extra "^7.0.1" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.0" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + +pbf@^3.0.5, pbf@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" + integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== + dependencies: + ieee754 "^1.1.12" + resolve-protobuf-schema "^2.1.0" + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +permutation-parity@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/permutation-parity/-/permutation-parity-1.0.0.tgz#0174d51fca704b11b9a4b152b23d537fdc6b5ef4" + integrity sha1-AXTVH8pwSxG5pLFSsj1Tf9xrXvQ= + dependencies: + typedarray-pool "^1.0.0" + +permutation-rank@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/permutation-rank/-/permutation-rank-1.0.0.tgz#9fd98bbcecf08fbf5994b5eadc94a62e679483b5" + integrity sha1-n9mLvOzwj79ZlLXq3JSmLmeUg7U= + dependencies: + invert-permutation "^1.0.0" + typedarray-pool "^1.0.0" + +pick-by-alias@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pick-by-alias/-/pick-by-alias-1.2.0.tgz#5f7cb2b1f21a6e1e884a0c87855aa4a37361107b" + integrity sha1-X3yysfIabh6ISgyHhVqko3NhEHs= + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-1.0.0.tgz#d1da67f5482563bb7cf57f286ae2822ecfbf3670" + integrity sha1-0dpn9UglY7t89X8oauKCLs+/NnA= + dependencies: + pinkie "^1.0.0" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@1.0.0, pinkie@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-1.0.0.tgz#5a47f28ba1015d0201bda7bf0f358e47bec8c7e4" + integrity sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q= + +pinkie@^2.0.0, pinkie@^2.0.1, pinkie@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.0, pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +planar-dual@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/planar-dual/-/planar-dual-1.0.2.tgz#b6a4235523b1b0cb79e5f926f8ea335dd982d563" + integrity sha1-tqQjVSOxsMt55fkm+OozXdmC1WM= + dependencies: + compare-angle "^1.0.0" + dup "^1.0.0" + +planar-graph-to-polyline@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/planar-graph-to-polyline/-/planar-graph-to-polyline-1.0.5.tgz#882b8605199ba88bfd464c9553303556c52b988a" + integrity sha1-iCuGBRmbqIv9RkyVUzA1VsUrmIo= + dependencies: + edges-to-adjacency-list "^1.0.0" + planar-dual "^1.0.0" + point-in-big-polygon "^2.0.0" + robust-orientation "^1.0.1" + robust-sum "^1.0.0" + two-product "^1.0.0" + uniq "^1.0.0" + +please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + +plotly.js@^1.54.2: + version "1.54.3" + resolved "https://registry.yarnpkg.com/plotly.js/-/plotly.js-1.54.3.tgz#573a6477cabd44425f486cae90a6152b66dbd8be" + integrity sha512-qGtowciLnaVNIO9VVv+bvW4o0BjPL8K89py8IEfST3mrJnOIownirW4WDC7GzEVfqtBo3coLWl3yYY/J2Vt4xw== + dependencies: + "@plotly/d3-sankey" "0.7.2" + "@plotly/d3-sankey-circular" "0.33.1" + "@turf/area" "^6.0.1" + "@turf/bbox" "^6.0.1" + "@turf/centroid" "^6.0.2" + alpha-shape "^1.0.0" + canvas-fit "^1.5.0" + color-normalize "^1.5.0" + color-rgba "^2.1.1" + convex-hull "^1.0.3" + country-regex "^1.1.0" + d3 "^3.5.17" + d3-force "^1.2.1" + d3-hierarchy "^1.1.9" + d3-interpolate "^1.4.0" + delaunay-triangulate "^1.1.6" + es6-promise "^4.2.8" + fast-isnumeric "^1.1.4" + gl-cone3d "^1.5.2" + gl-contour2d "^1.1.7" + gl-error3d "^1.0.16" + gl-heatmap2d "^1.0.6" + gl-line3d "1.2.1" + gl-mat4 "^1.2.0" + gl-mesh3d "^2.3.1" + gl-plot2d "^1.4.4" + gl-plot3d "^2.4.5" + gl-pointcloud2d "^1.0.3" + gl-scatter3d "^1.2.3" + gl-select-box "^1.0.4" + gl-spikes2d "^1.0.2" + gl-streamtube3d "^1.4.1" + gl-surface3d "^1.5.2" + gl-text "^1.1.8" + glslify "^7.0.0" + has-hover "^1.0.1" + has-passive-events "^1.0.0" + is-mobile "^2.2.1" + mapbox-gl "1.10.1" + matrix-camera-controller "^2.1.3" + mouse-change "^1.4.0" + mouse-event-offset "^3.0.2" + mouse-wheel "^1.2.0" + ndarray "^1.0.19" + ndarray-fill "^1.0.2" + ndarray-homography "^1.0.0" + parse-svg-path "^0.1.2" + point-cluster "^3.1.8" + polybooljs "^1.2.0" + regl "^1.6.1" + regl-error2d "^2.0.8" + regl-line2d "^3.0.15" + regl-scatter2d "^3.1.8" + regl-splom "^1.0.8" + right-now "^1.0.0" + robust-orientation "^1.1.3" + sane-topojson "^4.0.0" + strongly-connected-components "^1.0.1" + superscript-text "^1.0.0" + svg-path-sdf "^1.1.3" + tinycolor2 "^1.4.1" + to-px "1.0.1" + topojson-client "^3.1.0" + webgl-context "^2.2.0" + world-calendars "^1.0.3" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +pngjs@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +point-cluster@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/point-cluster/-/point-cluster-3.1.8.tgz#a63625fd8964f2a5b446025a1acf8bcac42500c0" + integrity sha512-7klIr45dpMeZuqjIK9+qBg3m2IhyZJNJkdqjJFw0Olq75FM8ojrTMjClVUrMjNYRVqtwztxCHH71Fyjhg+YwyQ== + dependencies: + array-bounds "^1.0.1" + array-normalize "^1.1.4" + binary-search-bounds "^2.0.4" + bubleify "^1.1.0" + clamp "^1.0.1" + defined "^1.0.0" + dtype "^2.0.0" + flatten-vertex-data "^1.0.2" + is-obj "^1.0.1" + math-log2 "^1.0.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + +point-in-big-polygon@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/point-in-big-polygon/-/point-in-big-polygon-2.0.0.tgz#39b613ea6cf17d6b43e188f77f34c44c6b33ba55" + integrity sha1-ObYT6mzxfWtD4Yj3fzTETGszulU= + dependencies: + binary-search-bounds "^1.0.0" + interval-tree-1d "^1.0.1" + robust-orientation "^1.1.3" + slab-decomposition "^1.0.1" + +polybooljs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/polybooljs/-/polybooljs-1.2.0.tgz#b4390c2e079d4c262d3b2504c6288d95ba7a4758" + integrity sha1-tDkMLgedTCYtOyUExiiNlbp6R1g= + +polytope-closest-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz#e6e57f4081ab5e8c778b811ef06e2c48ae338c3f" + integrity sha1-5uV/QIGrXox3i4Ee8G4sSK4zjD8= + dependencies: + numeric "^1.2.6" + +popper.js@^1.14.4: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + +portfinder@^1.0.13, portfinder@^1.0.26: + version "1.0.26" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" + integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-calc@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" + integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-html@^0.36.0: + version "0.36.0" + resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204" + integrity sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw== + dependencies: + htmlparser2 "^3.10.0" + +postcss-less@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" + integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA== + dependencies: + postcss "^7.0.14" + +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" + integrity sha1-thTJcgvmgW6u41+zpfqh26agXds= + dependencies: + postcss "^6.0.1" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" + +postcss-modules-scope@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reporter@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-6.0.1.tgz#7c055120060a97c8837b4e48215661aafb74245f" + integrity sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw== + dependencies: + chalk "^2.4.1" + lodash "^4.17.11" + log-symbols "^2.2.0" + postcss "^7.0.7" + +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" + integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= + +postcss-safe-parser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" + integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g== + dependencies: + postcss "^7.0.26" + +postcss-sass@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3" + integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg== + dependencies: + gonzales-pe "^4.3.0" + postcss "^7.0.21" + +postcss-scss@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383" + integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA== + dependencies: + postcss "^7.0.6" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-syntax@^0.36.2: + version "0.36.2" + resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c" + integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w== + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" + integrity sha1-AA29H47vIXqjaLmiEsX8QLKo8/I= + dependencies: + chalk "^1.1.3" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@7.x.x, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^6.0.1: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +potpack@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.1.tgz#d1b1afd89e4c8f7762865ec30bd112ab767e2ebf" + integrity sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +pretty-bytes@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" + integrity sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ= + dependencies: + get-stdin "^4.0.1" + meow "^3.1.0" + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== + dependencies: + "@jest/types" "^25.5.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress-stream@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" + integrity sha1-LNPP6jO6OonJwSHsM0er6asSX3c= + dependencies: + speedometer "~0.1.2" + through2 "~0.2.3" + +progress@^2.0.0, progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promisify-event@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promisify-event/-/promisify-event-1.0.0.tgz#bd7523ea06b70162f370979016b53a686c60e90f" + integrity sha1-vXUj6ga3AWLzcJeQFrU6aGxg6Q8= + dependencies: + pinkie-promise "^2.0.0" + +prompts@^2.0.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.4" + +prop-types-exact@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" + integrity sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA== + dependencies: + has "^1.0.3" + object.assign "^4.1.0" + reflect.ownkeys "^0.2.0" + +prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +protocol-buffers-schema@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.4.0.tgz#2f0ea31ca96627d680bf2fefae7ebfa2b6453eae" + integrity sha512-G/2kcamPF2S49W5yaMGdIpkG6+5wZF0fzBteLKgEHjbNzqjZQ85aAs1iJGto31EJaSTkNvHs5IXuHSaTLWBAiA== + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +proxyquire@^1.7.10: + version "1.8.0" + resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-1.8.0.tgz#02d514a5bed986f04cbb2093af16741535f79edc" + integrity sha1-AtUUpb7ZhvBMuyCTrxZ0FTX3ntw= + dependencies: + fill-keys "^1.0.2" + module-not-found-error "^1.0.0" + resolve "~1.1.7" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + 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@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" + integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== + dependencies: + escape-goat "^2.0.0" + +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" + integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= + +pxls@^2.0.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/pxls/-/pxls-2.3.2.tgz#79100d2cc95089fc6e00053a9d93c1ddddb2c7b4" + integrity sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw== + dependencies: + arr-flatten "^1.1.0" + compute-dims "^1.1.0" + flip-pixels "^1.0.2" + is-browser "^2.1.0" + is-buffer "^2.0.3" + to-uint8 "^1.4.1" + +q@^1.1.2, q@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qrcode-terminal@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.10.0.tgz#a76a48e2610a18f97fa3a2bd532b682acff86c53" + integrity sha1-p2pI4mEKGPl/o6K9UytoKs/4bFM= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +quantize@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/quantize/-/quantize-1.0.2.tgz#d25ac200a77b6d70f40127ca171a10e33c8546de" + integrity sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4= + +quat-slerp@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/quat-slerp/-/quat-slerp-1.0.1.tgz#2baa15ce3a6bbdc3241d972eb17283139ed69f29" + integrity sha1-K6oVzjprvcMkHZcusXKDE57Wnyk= + dependencies: + gl-quat "^1.0.0" + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +quickselect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== + +quote-stream@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-0.0.0.tgz#cde29e94c409b16e19dc7098b89b6658f9721d3b" + integrity sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs= + dependencies: + minimist "0.0.8" + through2 "~0.4.1" + +raf@^3.4.0, raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= + +ramda@^0.27: + version "0.27.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.0.tgz#915dc29865c0800bf3f69b8fd6c279898b59de43" + integrity sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA== + +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +rat-vec@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/rat-vec/-/rat-vec-1.1.1.tgz#0dde2b66b7b34bb1bcd2a23805eac806d87fd17f" + integrity sha1-Dd4rZrezS7G80qI4BerIBth/0X8= + dependencies: + big-rat "^1.0.3" + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc-align@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.1.tgz#0566de141a82d9a1923b7672c70bdb19dcde6e23" + integrity sha512-RQ5Fhxl0LW+zsxbY8dxAcpXdaHkHH2jzRSSpvBTS7G9LMK3T+WRcn4ovjg/eqAESM6TdTx0hfqWF2S1pO75jxQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + dom-align "^1.7.0" + rc-util "^5.0.1" + resize-observer-polyfill "^1.5.1" + +rc-animate@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/rc-animate/-/rc-animate-3.1.0.tgz#051b689c2c7194e4c8ae016d32a0e5f9de6c8baa" + integrity sha512-8FsM+3B1H+0AyTyGggY6JyVldHTs1CyYT8CfTmG/nGHHXlecvSLeICJhcKgRLjUiQlctNnRtB1rwz79cvBVmrw== + dependencies: + "@ant-design/css-animation" "^1.7.2" + classnames "^2.2.6" + raf "^3.4.0" + rc-util "^5.0.1" + +rc-slider@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-9.3.1.tgz#444012f3b4847d592b167a9cee6a1a46779a6ef4" + integrity sha512-c52PWPyrfJWh28K6dixAm0906L3/4MUIxqrNQA4TLnC/Z+cBNycWJUZoJerpwSOE1HdM3XDwixCsmtFc/7aWlQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-tooltip "^4.0.0" + rc-util "^5.0.0" + shallowequal "^1.1.0" + +rc-tooltip@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-4.2.1.tgz#c1a2d5017ee03a771a9301c0dfdb46dfdf8fef94" + integrity sha512-oykuaGsHg7RFvPUaxUpxo7ScEqtH61C66x4JUmjlFlSS8gSx2L8JFtfwM1D68SLBxUqGqJObtxj4TED75gQTiA== + dependencies: + rc-trigger "^4.2.1" + +rc-trigger@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-4.3.0.tgz#94ea1851d123359716d1dc3030083c015a92ecfb" + integrity sha512-jnGNzosXmDdivMBjPCYe/AfOXTpJU2/xQ9XukgoXDQEoZq/9lcI1r7eUIfq70WlWpLxlUEqQktiV3hwyy6Nw9g== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + raf "^3.4.1" + rc-align "^4.0.0" + rc-animate "^3.0.0" + rc-util "^5.0.1" + +rc-util@^5.0.0, rc-util@^5.0.1: + version "5.0.4" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.0.4.tgz#297bd719b1bd00b3c947a884ab7ef0a07c55dce6" + integrity sha512-cd19RCrE0DJH6UcJ9+V3eaXA/5sNWyVKOKkWl8ZM2OqgNzVb8fv0obf/TkuvSN43tmTsgqY8k7OqpFYHhmef8g== + dependencies: + react-is "^16.12.0" + shallowequal "^1.1.0" + +rc@^1.2.1, rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-base16-styling@^0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.5.3.tgz#3858f24e9c4dd8cbd3f702f3f74d581ca2917269" + integrity sha1-OFjyTpxN2MvT9wLz901YHKKRcmk= + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + +react-dom@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" + integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-hot-loader@^4.12.19: + version "4.12.21" + resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.12.21.tgz#332e830801fb33024b5a147d6b13417f491eb975" + integrity sha512-Ynxa6ROfWUeKWsTHxsrL2KMzujxJVPjs385lmB2t5cHUxdoRPGind9F00tOkdc1l5WBleOF4XEAMILY1KPIIDA== + dependencies: + fast-levenshtein "^2.0.6" + global "^4.3.0" + hoist-non-react-statics "^3.3.0" + loader-utils "^1.1.0" + prop-types "^15.6.1" + react-lifecycles-compat "^3.0.4" + shallowequal "^1.1.0" + source-map "^0.7.3" + +react-is@^16.12.0, react-is@^16.6.0, react-is@^16.6.3, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-json-tree@^0.11.0: + version "0.11.2" + resolved "https://registry.yarnpkg.com/react-json-tree/-/react-json-tree-0.11.2.tgz#af70199fcbc265699ade2aec492465c51608f95e" + integrity sha512-aYhUPj1y5jR3ZQ+G3N7aL8FbTyO03iLwnVvvEikLcNFqNTyabdljo9xDftZndUBFyyyL0aK3qGO9+8EilILHUw== + dependencies: + babel-runtime "^6.6.1" + prop-types "^15.5.8" + react-base16-styling "^0.5.1" + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-markdown@^4.0.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-4.3.1.tgz#39f0633b94a027445b86c9811142d05381300f2f" + integrity sha512-HQlWFTbDxTtNY6bjgp3C3uv1h2xcjCSi1zAEzfBW9OwJJvENSYiLXWNXN5hHLsoqai7RnZiiHzcnWdXk2Splzw== + dependencies: + html-to-react "^1.3.4" + mdast-add-list-metadata "1.0.1" + prop-types "^15.7.2" + react-is "^16.8.6" + remark-parse "^5.0.0" + unified "^6.1.5" + unist-util-visit "^1.3.0" + xtend "^4.0.1" + +react-plotly.js@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/react-plotly.js/-/react-plotly.js-2.4.0.tgz#7a8fd89ffa126daa36a5855890282960e2e4eaf0" + integrity sha512-BCkxMe8yWqu3nP/hw9A1KCIuoL67WV5/k68SL9yhEkF6UG+pAuIev9Q3cMKtNkQJZhsYFpOmlqrpPjIdUFACOQ== + dependencies: + prop-types "^15.7.2" + +react-popper@^1.3.4: + version "1.3.7" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.7.tgz#f6a3471362ef1f0d10a4963673789de1baca2324" + integrity sha512-nmqYTx7QVjCm3WUZLeuOomna138R1luC4EqkW3hxJUrAe+3eNz3oFCLYdnPwILfn0mX1Ew2c3wctrjlUMYYUww== + dependencies: + "@babel/runtime" "^7.1.2" + create-react-context "^0.3.0" + deep-equal "^1.1.1" + popper.js "^1.14.4" + prop-types "^15.6.1" + typed-styles "^0.0.7" + warning "^4.0.2" + +react-redux@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.0.tgz#f970f62192b3981642fec46fd0db18a074fe879d" + integrity sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA== + dependencies: + "@babel/runtime" "^7.5.5" + hoist-non-react-statics "^3.3.0" + loose-envify "^1.4.0" + prop-types "^15.7.2" + react-is "^16.9.0" + +react-router-dom@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router-redux@^5.0.0-alpha.9: + version "5.0.0-alpha.9" + resolved "https://registry.yarnpkg.com/react-router-redux/-/react-router-redux-5.0.0-alpha.9.tgz#825431516e0e6f1fd93b8807f6bd595e23ec3d10" + integrity sha512-euSgNIANnRXr4GydIuwA7RZCefrLQzIw5WdXspS8NPYbV+FxrKSS9MKG7U9vb6vsKHONnA4VxrVNWfnMUnUQAw== + dependencies: + history "^4.7.2" + prop-types "^15.6.0" + react-router "^4.2.0" + +react-router@5.2.0, react-router@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" + integrity sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg== + dependencies: + history "^4.7.2" + hoist-non-react-statics "^2.5.0" + invariant "^2.2.4" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.1" + warning "^4.0.1" + +react-test-renderer@^16.0.0-0, react-test-renderer@^16.12.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.1.tgz#de25ea358d9012606de51e012d9742e7f0deabc1" + integrity sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ== + dependencies: + object-assign "^4.1.1" + prop-types "^15.6.2" + react-is "^16.8.6" + scheduler "^0.19.1" + +react-toastify@^6.0.5: + version "6.0.6" + resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-6.0.6.tgz#7409ef8e89d12492308a8e561317031b5d90615e" + integrity sha512-NdHiMhj76Z877kZlXuelVfJONslvpmDTL95FVAoBy2kkU75hiqR5+pu1GdJZfRWPhen9ecdb58d3HmefaJ06Yw== + dependencies: + classnames "^2.2.6" + prop-types "^15.7.2" + react-transition-group "^4.4.1" + +react-transition-group@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" + integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" + integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +read-config-file@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.0.0.tgz#224b5dca6a5bdc1fb19e63f89f342680efdb9299" + integrity sha512-PHjROSdpceKUmqS06wqwP92VrM46PZSTubmNIMJ5DrMwg1OgenSTSEHIkCa6TiOJ+y/J0xnG1fFwG3M+Oi1aNA== + dependencies: + dotenv "^8.2.0" + dotenv-expand "^5.1.0" + js-yaml "^3.13.1" + json5 "^2.1.2" + lazy-val "^1.0.4" + +read-file-relative@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/read-file-relative/-/read-file-relative-1.2.0.tgz#98f7d96eaa21d2b4c7a2febd63d2fc8cf35e9f9b" + integrity sha1-mPfZbqoh0rTHov69Y9L8jPNen5s= + dependencies: + callsite "^1.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" + integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= + dependencies: + normalize-package-data "^2.3.2" + parse-json "^4.0.0" + pify "^3.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17, readable-stream@~1.0.27-1: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== + dependencies: + picomatch "^2.2.1" + +realpath-native@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" + integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== + +recursive-readdir@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +reduce-simplicial-complex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz#74d696a2f835f7a6dcd92065fd8c5181f2edf8bc" + integrity sha1-dNaWovg196bc2SBl/YxRgfLt+Lw= + dependencies: + cell-orientation "^1.0.1" + compare-cell "^1.0.0" + compare-oriented-cell "^1.0.1" + +redux-logger@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/redux-logger/-/redux-logger-3.0.6.tgz#f7555966f3098f3c88604c449cf0baf5778274bf" + integrity sha1-91VZZvMJjzyIYExEnPC69XeCdL8= + dependencies: + deep-diff "^0.3.5" + +redux-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-1.2.0.tgz#ff51b6c6be2598e9b5e89fc36639186bb0e669c7" + integrity sha512-yeR90RP2WzZzCxxnQPlh2uFzyfFLsfXu8ROh53jGDPXVqj71uNDMmvi/YKQkd9ofiVoO4OYb1snbowO49tCEMg== + +redux@^4.0.0, redux@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" + integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== + dependencies: + loose-envify "^1.4.0" + symbol-observable "^1.2.0" + +reflect.ownkeys@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" + integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.2.1, regenerate@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" + integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + dependencies: + "@babel/runtime" "^7.8.4" + private "^0.1.8" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regex-regex/-/regex-regex-1.0.0.tgz#9048a1eaeb870f4d480dabc76fc42cdcc0bc3a72" + integrity sha1-kEih6uuHD01IDavHb8Qs3MC8OnI= + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regexpu-core@^4.5.4, regexpu-core@^4.6.0, regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +registry-auth-token@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479" + integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +regl-error2d@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/regl-error2d/-/regl-error2d-2.0.8.tgz#0f26371ee99c78d42e9c5a197387e32034bcf640" + integrity sha512-5nszdicXbimRUnYB42i+O7KPcla7PzI62nZLCP6qVRKlQCf3rSrWbikMNd1S84LE8+deWHWcb8rZ/v7rZ9qmmw== + dependencies: + array-bounds "^1.0.1" + bubleify "^1.2.0" + color-normalize "^1.5.0" + flatten-vertex-data "^1.0.2" + object-assign "^4.1.1" + pick-by-alias "^1.2.0" + to-float32 "^1.0.1" + update-diff "^1.1.0" + +regl-line2d@^3.0.15: + version "3.0.15" + resolved "https://registry.yarnpkg.com/regl-line2d/-/regl-line2d-3.0.15.tgz#5baf2a0ed5024cec2ec038c6ada601c98ac579e3" + integrity sha512-RuQbg9iZ6MyuInG8izF6zjQ/2g4qL6sg1egiuFalWzaGSvuve/IWBsIcqKTlwpiEsRt9b4cHu9NYs2fLt1gYJw== + dependencies: + array-bounds "^1.0.1" + array-normalize "^1.1.4" + bubleify "^1.2.0" + color-normalize "^1.5.0" + earcut "^2.1.5" + es6-weak-map "^2.0.3" + flatten-vertex-data "^1.0.2" + glslify "^7.0.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + to-float32 "^1.0.1" + +regl-scatter2d@^3.1.2, regl-scatter2d@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/regl-scatter2d/-/regl-scatter2d-3.1.8.tgz#5fdf77f9cee7e71497d038dc1b654dc4340b6bfb" + integrity sha512-Z9MYAUx9t8e3MsiHBbJAEstbIqauXxzcL9DmuKXQuRWfCMF2DBytYJtE0FpbQU6639wEMAJ54SEIlISWF8sQ2g== + dependencies: + array-range "^1.0.1" + array-rearrange "^2.2.2" + clamp "^1.0.1" + color-id "^1.1.0" + color-normalize "1.5.0" + color-rgba "^2.1.1" + flatten-vertex-data "^1.0.2" + glslify "^7.0.0" + image-palette "^2.1.0" + is-iexplorer "^1.0.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + point-cluster "^3.1.8" + to-float32 "^1.0.1" + update-diff "^1.1.0" + +regl-splom@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/regl-splom/-/regl-splom-1.0.8.tgz#05f165a6f0b8afc6b6b97fafa775282d44387db3" + integrity sha512-4GQTgcArCbGLsXhgalWVBxeW7OXllnu+Gvil/4SbQQmtiqLCl+xgF79pISKY9mLXTlobxiX7cVKdjGjp25559A== + dependencies: + array-bounds "^1.0.1" + array-range "^1.0.1" + bubleify "^1.2.0" + color-alpha "^1.0.4" + defined "^1.0.0" + flatten-vertex-data "^1.0.2" + left-pad "^1.3.0" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + point-cluster "^3.1.8" + raf "^3.4.1" + regl-scatter2d "^3.1.2" + +regl@^1.3.11, regl@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/regl/-/regl-1.6.1.tgz#6930172cda9b8fb65724abc0d4930d79333f5460" + integrity sha512-7Z9rmpEqmLNwC9kCYCyfyu47eWZaQWeNpwZfwz99QueXN8B/Ow40DB0N+OeUeM/yu9pZAB01+JgJ+XghGveVoA== + +remark-parse@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95" + integrity sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA== + dependencies: + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^1.1.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^1.0.0" + vfile-location "^2.0.0" + xtend "^4.0.1" + +remark-parse@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.2.tgz#5999bc0b9c2e3edc038800a64ff103d0890b318b" + integrity sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-stringify@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-8.1.0.tgz#1e555f4402e445c364fb23d12fc5f5e0337ec8b7" + integrity sha512-FSPZv1ds76oAZjurhhuV5qXSUSoz6QRPuwYK38S41sLHwg4oB7ejnmZshj7qwjgYLf93kdz6BOX9j5aidNE7rA== + dependencies: + ccount "^1.0.0" + is-alphanumeric "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + longest-streak "^2.0.1" + markdown-escapes "^1.0.0" + markdown-table "^2.0.0" + mdast-util-compact "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + stringify-entities "^3.0.0" + unherit "^1.0.4" + xtend "^4.0.1" + +remark@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/remark/-/remark-12.0.0.tgz#d1c145c07341c9232f93b2f8539d56da15a2548c" + integrity sha512-oX4lMIS0csgk8AEbzY0h2jdR0ngiCHOpwwpxjmRa5TqAkeknY+tkhjRJGZqnCmvyuWh55/0SW5WY3R3nn3PH9A== + dependencies: + remark-parse "^8.0.0" + remark-stringify "^8.0.0" + unified "^9.0.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.0.0, repeat-string@^1.3.0, repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + integrity sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw= + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +replace-ext@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + +replicator@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/replicator/-/replicator-1.0.3.tgz#c0b3ea31e749015bae5d52273f2ae35d541b87ef" + integrity sha512-WsKsraaM0x0QHy5CtzdgFXUxyowoBhyNkmPqmZShW6h+rOWnyT6Od3zRdTX9r616rAA6kDC9MKQGnSM/CJKfVQ== + +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.45.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-1.0.0.tgz#4eaeea41ed040d1702457df64a42b2b07d246f9f" + integrity sha1-Tq7qQe0EDRcCRX32SkKysH0kb58= + dependencies: + resolve-from "^2.0.0" + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve-protobuf-schema@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" + integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== + dependencies: + protocol-buffers-schema "^3.3.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7, resolve@~1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" + integrity sha1-3ZV5gufnNt699TtYpN2RdUV13UY= + +resolve@^1.0.0, resolve@^1.1.5, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.5.0, resolve@~1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= + dependencies: + through "~2.3.4" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgb2hex@^0.1.9: + version "0.1.10" + resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.10.tgz#4fdd432665273e2d5900434940ceba0a04c8a8a8" + integrity sha512-vKz+kzolWbL3rke/xeTE2+6vHmZnNxGyDnaVW4OckntAIcc7DcZzWkQSfxMDwqHS8vhgySnIFyBUH7lIk6PxvQ== + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= + dependencies: + align-text "^0.1.1" + +right-now@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/right-now/-/right-now-1.0.0.tgz#6e89609deebd7dcdaf8daecc9aea39cf585a0918" + integrity sha1-bolgne69fc2vja7Mmuo5z1haCRg= + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +roarr@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.3.tgz#65248a291a15af3ebfd767cbf7e44cb402d1d836" + integrity sha512-AEjYvmAhlyxOeB9OqPUzQCo3kuAkNfuDk/HqWbZdFsqDFpapkTjiw+p4svNEoRLvuqNTxqfL+s+gtD4eDgZ+CA== + dependencies: + boolean "^3.0.0" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + +robust-compress@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-compress/-/robust-compress-1.0.0.tgz#4cf62c4b318d8308516012bb8c11752f39329b1b" + integrity sha1-TPYsSzGNgwhRYBK7jBF1Lzkymxs= + +robust-determinant@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/robust-determinant/-/robust-determinant-1.1.0.tgz#8ecae79b79caab3e74f6debe2237e5391a27e9c7" + integrity sha1-jsrnm3nKqz509t6+IjflORon6cc= + dependencies: + robust-compress "^1.0.0" + robust-scale "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.0" + +robust-dot-product@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-dot-product/-/robust-dot-product-1.0.0.tgz#c9ba0178bd2c304bfd725f58e889f1d946004553" + integrity sha1-yboBeL0sMEv9cl9Y6Inx2UYARVM= + dependencies: + robust-sum "^1.0.0" + two-product "^1.0.0" + +robust-in-sphere@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/robust-in-sphere/-/robust-in-sphere-1.1.3.tgz#1c5883d16a4e923929476ef34819857bf2a9cf75" + integrity sha1-HFiD0WpOkjkpR27zSBmFe/Kpz3U= + dependencies: + robust-scale "^1.0.0" + robust-subtract "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.0" + +robust-linear-solve@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-linear-solve/-/robust-linear-solve-1.0.0.tgz#0cd6ac5040691a6f2aa3cd6311d728905ca3a1f1" + integrity sha1-DNasUEBpGm8qo81jEdcokFyjofE= + dependencies: + robust-determinant "^1.1.0" + +robust-orientation@^1.0.1, robust-orientation@^1.0.2, robust-orientation@^1.1.2, robust-orientation@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/robust-orientation/-/robust-orientation-1.1.3.tgz#daff5b00d3be4e60722f0e9c0156ef967f1c2049" + integrity sha1-2v9bANO+TmByLw6cAVbvln8cIEk= + dependencies: + robust-scale "^1.0.2" + robust-subtract "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.2" + +robust-product@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-product/-/robust-product-1.0.0.tgz#685250007cdbba7cf1de75bff6d2927011098abe" + integrity sha1-aFJQAHzbunzx3nW/9tKScBEJir4= + dependencies: + robust-scale "^1.0.0" + robust-sum "^1.0.0" + +robust-scale@^1.0.0, robust-scale@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/robust-scale/-/robust-scale-1.0.2.tgz#775132ed09542d028e58b2cc79c06290bcf78c32" + integrity sha1-d1Ey7QlULQKOWLLMecBikLz3jDI= + dependencies: + two-product "^1.0.2" + two-sum "^1.0.0" + +robust-segment-intersect@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/robust-segment-intersect/-/robust-segment-intersect-1.0.1.tgz#3252b6a0fc1ba14ade6915ccbe09cbce9aab1c1c" + integrity sha1-MlK2oPwboUreaRXMvgnLzpqrHBw= + dependencies: + robust-orientation "^1.1.3" + +robust-subtract@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-subtract/-/robust-subtract-1.0.0.tgz#e0b164e1ed8ba4e3a5dda45a12038348dbed3e9a" + integrity sha1-4LFk4e2LpOOl3aRaEgODSNvtPpo= + +robust-sum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-sum/-/robust-sum-1.0.0.tgz#16646e525292b4d25d82757a286955e0bbfa53d9" + integrity sha1-FmRuUlKStNJdgnV6KGlV4Lv6U9k= + +rst-selector-parser@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" + integrity sha1-gbIw6i/MYGbInjRy3nlChdmwPZE= + dependencies: + lodash.flattendeep "^4.4.0" + nearley "^2.7.10" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rw@1, rw@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= + +rxjs-compat@^6.5.5: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.5.5.tgz#073c40510f29c45a2a5fc02dde87f8c3ad75f2c2" + integrity sha512-F42sssVbUyWH4vJswEo6m+Eh02xHv3q93n8S7nUJO58R7sbc3CvJIOts605zdaBhWa1xMB9aVSyqPqhQ5q3eXg== + +"rxjs@^6.0.0 || ^5.6.0-forward-compat.4", rxjs@^6.3.1, rxjs@^6.3.3, rxjs@^6.5.2, rxjs@^6.5.3, rxjs@^6.5.5: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane-topojson@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/sane-topojson/-/sane-topojson-4.0.0.tgz#624cdb26fc6d9392c806897bfd1a393f29bb5308" + integrity sha512-bJILrpBboQfabG3BNnHI2hZl52pbt80BE09u4WhnrmzuF2JbMKZdl62G5glXskJ46p+gxE2IzOwGj/awR4g8AA== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@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" + +sanitize-filename@^1.6.0, sanitize-filename@^1.6.2, sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + +sass-graph@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" + integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^13.3.2" + +sass-loader@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.2.3" + neo-async "^2.6.1" + schema-utils "^2.6.1" + semver "^6.3.0" + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + +scheduler@^0.19.0, scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +seedrandom@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.7: + version "1.10.7" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" + integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + dependencies: + node-forge "0.9.0" + +semantic-ui-css@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/semantic-ui-css/-/semantic-ui-css-2.4.1.tgz#f5aea39fafb787cbd905ec724272a3f9cba9004a" + integrity sha512-Pkp0p9oWOxlH0kODx7qFpIRYpK1T4WJOO4lNnpNPOoWKCrYsfHqYSKgk5fHfQtnWnsAKy7nLJMW02bgDWWFZFg== + dependencies: + jquery x.* + +semantic-ui-react@^0.88.2: + version "0.88.2" + resolved "https://registry.yarnpkg.com/semantic-ui-react/-/semantic-ui-react-0.88.2.tgz#3d4b54f8b799769b412435c8531475fd34aa4149" + integrity sha512-+02kN2z8PuA/cMdvDUsHhbJmBzxxgOXVHMFr9XK7zGb0wkW9A6OPQMFokWz7ozlVtKjN6r7zsb+Qvjk/qq1OWw== + dependencies: + "@babel/runtime" "^7.1.2" + "@semantic-ui-react/event-stack" "^3.1.0" + "@stardust-ui/react-component-event-listener" "~0.38.0" + "@stardust-ui/react-component-ref" "~0.38.0" + classnames "^2.2.6" + keyboard-key "^1.0.4" + lodash "^4.17.15" + prop-types "^15.7.2" + react-is "^16.8.6" + react-popper "^1.3.4" + shallowequal "^1.1.0" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" + integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== + +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.2, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + +serialize-javascript@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" + integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallow-copy@0.0.1, shallow-copy@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +shim-keyboard-event-key@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/shim-keyboard-event-key/-/shim-keyboard-event-key-1.0.3.tgz#9a9441d6b7d1fb25819d86182caf554e821a515c" + integrity sha512-PTNRkOxDlZ2+Xz4CbKJJsh/pe1DJdaC+b4HHV02A1aEWNmwh1g9am0ZiU/ktu3uVfQrY3yDHTOVhst3xpLhw2A== + +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +signum@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/signum/-/signum-0.0.0.tgz#ab551b1003351070a704783f1a09c5e7691f9cf6" + integrity sha1-q1UbEAM1EHCnBHg/GgnF52kfnPY= + +signum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signum/-/signum-1.0.0.tgz#74a7d2bf2a20b40eba16a92b152124f1d559fa77" + integrity sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc= + +simple-statistics@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/simple-statistics/-/simple-statistics-7.1.0.tgz#22a3ae8476650ff4cc1643fff6b636334629d352" + integrity sha512-aA7JgiiptQJFB1xJDySzUJ64XTtl1zkR5U79Qa0AxSYVTxws2UlsZt/chyJm+2lMt3xIPKzAsNzVhZhMUXlY+g== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +simplicial-complex-boundary@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simplicial-complex-boundary/-/simplicial-complex-boundary-1.0.1.tgz#72c9ff1e24deaa374c9bb2fa0cbf0c081ebef815" + integrity sha1-csn/HiTeqjdMm7L6DL8MCB6++BU= + dependencies: + boundary-cells "^2.0.0" + reduce-simplicial-complex "^1.0.0" + +simplicial-complex-contour@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/simplicial-complex-contour/-/simplicial-complex-contour-1.0.2.tgz#890aacac284365340110545cf2629a26e04bf9d1" + integrity sha1-iQqsrChDZTQBEFRc8mKaJuBL+dE= + dependencies: + marching-simplex-table "^1.0.0" + ndarray "^1.0.15" + ndarray-sort "^1.0.0" + typedarray-pool "^1.1.0" + +simplicial-complex@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-0.3.3.tgz#4c30cad57f9e45729dd8f306c8753579f46be99e" + integrity sha1-TDDK1X+eRXKd2PMGyHU1efRr6Z4= + dependencies: + bit-twiddle "~0.0.1" + union-find "~0.0.3" + +simplicial-complex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-1.0.0.tgz#6c33a4ed69fcd4d91b7bcadd3b30b63683eae241" + integrity sha1-bDOk7Wn81Nkbe8rdOzC2NoPq4kE= + dependencies: + bit-twiddle "^1.0.0" + union-find "^1.0.0" + +simplify-js@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/simplify-js/-/simplify-js-1.2.4.tgz#7aab22d6df547ffd40ef0761ccd82b75287d45c7" + integrity sha512-vITfSlwt7h/oyrU42R83mtzFpwYk3+mkH9bOHqq/Qw6n8rtR7aE3NZQ5fbcyCUVVmuMJR6ynsAhOfK2qoah8Jg== + +simplify-planar-graph@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/simplify-planar-graph/-/simplify-planar-graph-2.0.1.tgz#bc85893725f32e8fa8ae25681398446d2cbcf766" + integrity sha1-vIWJNyXzLo+oriVoE5hEbSy892Y= + dependencies: + robust-orientation "^1.0.1" + simplicial-complex "^0.3.3" + +single-line-log@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" + integrity sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q= + dependencies: + string-width "^1.0.1" + +sinon@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-8.1.1.tgz#21fffd5ad0a2d072a8aa7f8a3cf7ed2ced497497" + integrity sha512-E+tWr3acRdoe1nXbHMu86SSqA1WGM7Yw3jZRLvlCMnXwTHP8lgFFVn5BnKnF26uc5SfZ3D7pA9sN7S3Y2jG4Ew== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/formatio" "^4.0.1" + "@sinonjs/samsam" "^4.2.2" + diff "^4.0.2" + lolex "^5.1.2" + nise "^3.0.1" + supports-color "^7.1.0" + +sisteransi@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slab-decomposition@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/slab-decomposition/-/slab-decomposition-1.0.2.tgz#1ded56754d408b10739f145103dfc61807f65134" + integrity sha1-He1WdU1AixBznxRRA9/GGAf2UTQ= + dependencies: + binary-search-bounds "^1.0.0" + functional-red-black-tree "^1.0.0" + robust-orientation "^1.1.3" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + +sockjs@0.3.20: + version "0.3.20" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" + integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.4.0" + websocket-driver "0.6.5" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.1, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.16, source-map-support@^0.5.19, source-map-support@^0.5.6, source-map-support@~0.5.12: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +"source-map@>= 0.1.2", source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@^0.1.38, source-map@~0.1.33: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + +spawn-rx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spawn-rx/-/spawn-rx-3.0.0.tgz#1d33511e13ec26337da51d78630e08beb57a6767" + integrity sha512-dw4Ryg/KMNfkKa5ezAR5aZe9wNwPdKlnHEXtHOjVnyEDSPQyOpIPPRtcIiu7127SmtHhaCjw21yC43HliW0iIg== + dependencies: + debug "^2.5.1" + lodash.assign "^4.2.0" + rxjs "^6.3.1" + +spawnteract@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/spawnteract/-/spawnteract-5.0.1.tgz#425daeac2775919a5fbf7cc3ba973e1850e0336c" + integrity sha512-7R+unoZfdInm/fAqLeCirqoF8clth3N5SQBohAdv/LhYNJ0I6tnL0AN2catX8T+KedwsgujaeTTuyukB6Jc+Ew== + dependencies: + execa "^0.10.0" + jsonfile "^3.0.0" + jupyter-paths "^2.0.0" + kernelspecs "^2.0.0" + mkdirp "^0.5.1" + portfinder "^1.0.13" + uuid "^3.0.1" + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +specificity@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" + integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== + +spectron@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/spectron/-/spectron-10.0.1.tgz#d89fdd3c9625c7dbb5d1f047fda7cb922eda0125" + integrity sha512-eMAOr7ovYf+e6+DhkoxVWAMRfZvLJMjtZKwWYkL56fv3Ij6rxhYLjOxybKj0phgMYZ7o2cX5zu2NoyiUM756CA== + dependencies: + "@types/webdriverio" "^4.8.0" + dev-null "^0.1.1" + electron-chromedriver "^8.0.0" + request "^2.87.0" + split "^1.0.0" + webdriverio "^4.13.0" + +speedometer@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" + integrity sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0= + +split-polygon@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/split-polygon/-/split-polygon-1.0.0.tgz#0eacc8a136a76b12a3d95256ea7da45db0c2d247" + integrity sha1-DqzIoTanaxKj2VJW6n2kXbDC0kc= + dependencies: + robust-dot-product "^1.0.0" + robust-sum "^1.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + +sprintf-js@^1.0.3, sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" + integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-trace@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +stackframe@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-0.3.1.tgz#33aa84f1177a5548c8935533cbfeb3420975f5a4" + integrity sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ= + +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +static-eval@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" + integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== + dependencies: + escodegen "^1.11.1" + +static-eval@~0.2.0: + version "0.2.4" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-0.2.4.tgz#b7d34d838937b969f9641ca07d48f8ede263ea7b" + integrity sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns= + dependencies: + escodegen "~0.0.24" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +static-module@^1.0.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/static-module/-/static-module-1.5.0.tgz#27da9883c41a8cd09236f842f0c1ebc6edf63d86" + integrity sha1-J9qYg8QajNCSNvhC8MHrxu32PYY= + dependencies: + concat-stream "~1.6.0" + duplexer2 "~0.0.2" + escodegen "~1.3.2" + falafel "^2.1.0" + has "^1.0.0" + object-inspect "~0.4.0" + quote-stream "~0.0.0" + readable-stream "~1.0.27-1" + shallow-copy "~0.0.1" + static-eval "~0.2.0" + through2 "~0.4.1" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + dependencies: + readable-stream "^2.0.1" + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + 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@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-argv@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-length@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" + integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== + dependencies: + astral-regex "^1.0.0" + strip-ansi "^5.2.0" + +string-split-by@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string-split-by/-/string-split-by-1.0.0.tgz#53895fb3397ebc60adab1f1e3a131f5372586812" + integrity sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A== + dependencies: + parenthesis "^3.1.5" + +string-to-arraybuffer@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz#161147fbadea02e28b0935002cec4c40f1ca7f0a" + integrity sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q== + dependencies: + atob-lite "^2.0.0" + is-base64 "^0.1.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.matchall@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== + dependencies: + 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.trim@^1.2.1, string.prototype.trim@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782" + integrity sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-entities@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.0.1.tgz#32154b91286ab0869ab2c07696223bd23b6dbfc0" + integrity sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ== + dependencies: + character-entities-html4 "^1.0.0" + character-entities-legacy "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.2" + is-hexadecimal "^1.0.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" + integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strongly-connected-components@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz#0920e2b4df67c8eaee96c6b6234fe29e873dba99" + integrity sha1-CSDitN9nyOrulsa2I0/inoc9upk= + +style-loader@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" + integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.6" + +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" + integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +stylelint-config-prettier@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/stylelint-config-prettier/-/stylelint-config-prettier-8.0.2.tgz#da9de33da4c56893cbe7e26df239a7374045e14e" + integrity sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A== + +stylelint-config-recommended@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657" + integrity sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ== + +stylelint-config-standard@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-19.0.0.tgz#66f0cf13f33b8a9e34965881493b38fc1313693a" + integrity sha512-VvcODsL1PryzpYteWZo2YaA5vU/pWfjqBpOvmeA8iB2MteZ/ZhI1O4hnrWMidsS4vmEJpKtjdhLdfGJmmZm6Cg== + dependencies: + stylelint-config-recommended "^3.0.0" + +stylelint@^13.0.0: + version "13.6.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.6.1.tgz#cc1d76338116d55e8ff2be94c4a4386c1239b878" + integrity sha512-XyvKyNE7eyrqkuZ85Citd/Uv3ljGiuYHC6UiztTR6sWS9rza8j3UeQv/eGcQS9NZz/imiC4GKdk1EVL3wst5vw== + dependencies: + "@stylelint/postcss-css-in-js" "^0.37.1" + "@stylelint/postcss-markdown" "^0.36.1" + autoprefixer "^9.8.0" + balanced-match "^1.0.0" + chalk "^4.1.0" + cosmiconfig "^6.0.0" + debug "^4.1.1" + execall "^2.0.0" + file-entry-cache "^5.0.1" + get-stdin "^8.0.0" + global-modules "^2.0.0" + globby "^11.0.1" + globjoin "^0.1.4" + html-tags "^3.1.0" + ignore "^5.1.8" + import-lazy "^4.0.0" + imurmurhash "^0.1.4" + known-css-properties "^0.19.0" + leven "^3.1.0" + lodash "^4.17.15" + log-symbols "^4.0.0" + mathml-tag-names "^2.1.3" + meow "^7.0.1" + micromatch "^4.0.2" + normalize-selector "^0.2.0" + postcss "^7.0.32" + postcss-html "^0.36.0" + postcss-less "^3.1.4" + postcss-media-query-parser "^0.2.3" + postcss-reporter "^6.0.1" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^4.0.2" + postcss-sass "^0.4.4" + postcss-scss "^2.1.1" + postcss-selector-parser "^6.0.2" + postcss-syntax "^0.36.2" + postcss-value-parser "^4.1.0" + resolve-from "^5.0.0" + slash "^3.0.0" + specificity "^0.4.1" + string-width "^4.2.0" + strip-ansi "^6.0.0" + style-search "^0.1.0" + sugarss "^2.0.0" + svg-tags "^1.0.0" + table "^5.4.6" + v8-compile-cache "^2.1.1" + write-file-atomic "^3.0.3" + +sugarss@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d" + integrity sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ== + dependencies: + postcss "^7.0.2" + +sumchecker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e" + integrity sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4= + dependencies: + debug "^2.2.0" + +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + +supercluster@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.1.0.tgz#f0a457426ec0ab95d69c5f03b51e049774b94479" + integrity sha512-LDasImUAFMhTqhK+cUXfy9C2KTUqJ3gucLjmNLNFmKWOnDUBxLFLH9oKuXOTCLveecmxh8fbk8kgh6Q0gsfe2w== + dependencies: + kdbush "^3.0.0" + +superscript-text@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/superscript-text/-/superscript-text-1.0.0.tgz#e7cb2752567360df50beb0610ce8df3d71d8dfd8" + integrity sha1-58snUlZzYN9QvrBhDOjfPXHY39g= + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +supports-color@~5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.0.1.tgz#1c5331f22250c84202805b2f17adf16699f3a39a" + integrity sha512-7FQGOlSQ+AQxBNXJpVDj8efTA/FtyB5wcNE1omXXJ0cq6jm1jjDwuROlYDbnzHqdNPqliWFhcioCWSyav+xBnA== + dependencies: + has-flag "^2.0.0" + +supports-hyperlinks@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" + integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +surface-nets@^1.0.0, surface-nets@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/surface-nets/-/surface-nets-1.0.2.tgz#e433c8cbba94a7274c6f4c99552b461bf1fc7a4b" + integrity sha1-5DPIy7qUpydMb0yZVStGG/H8eks= + dependencies: + ndarray-extract-contour "^1.0.0" + triangulate-hypercube "^1.0.0" + zero-crossings "^1.0.0" + +svg-arc-to-cubic-bezier@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz#390c450035ae1c4a0104d90650304c3bc814abe6" + integrity sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g== + +svg-path-bounds@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/svg-path-bounds/-/svg-path-bounds-1.0.1.tgz#bf458b783726bf53431b4633f2792f60748d9f74" + integrity sha1-v0WLeDcmv1NDG0Yz8nkvYHSNn3Q= + dependencies: + abs-svg-path "^0.1.1" + is-svg-path "^1.0.1" + normalize-svg-path "^1.0.0" + parse-svg-path "^0.1.2" + +svg-path-sdf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz#92957a31784c0eaf68945472c8dc6bf9e6d126fc" + integrity sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg== + dependencies: + bitmap-sdf "^1.0.0" + draw-svg-path "^1.0.0" + is-svg-path "^1.0.1" + parse-svg-path "^0.1.2" + svg-path-bounds "^1.0.1" + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= + +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^5.2.3, table@^5.4.6: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^0.1.8: + version "0.1.10" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" + integrity sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q= + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tape@^4.0.0: + version "4.13.3" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278" + integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw== + dependencies: + deep-equal "~1.1.1" + defined "~1.0.0" + dotignore "~0.1.2" + for-each "~0.3.3" + function-bind "~1.1.1" + glob "~7.1.6" + has "~1.0.3" + inherits "~2.0.4" + is-regex "~1.0.5" + minimist "~1.2.5" + object-inspect "~1.7.0" + resolve "~1.17.0" + resumer "~0.0.0" + string.prototype.trim "~1.2.1" + through "~2.3.8" + +tar-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + +tar@^4.4.12: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + 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" + +temp-file@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.3.7.tgz#686885d635f872748e384e871855958470aeb18a" + integrity sha512-9tBJKt7GZAQt/Rg0QzVWA8Am8c1EFl+CAv04/aBVqlx5oyfQ508sFIABshQ0xbZu6mBrFLWIUXO/bbLYghW70g== + dependencies: + async-exit-hook "^2.0.1" + fs-extra "^8.1.0" + +term-size@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" + integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f" + integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^3.1.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser-webpack-plugin@^2.3.2, terser-webpack-plugin@^2.3.5: + version "2.3.7" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.7.tgz#4910ff5d1a872168cc7fa6cd3749e2b0d60a8a0b" + integrity sha512-xzYyaHUNhzgaAdBsXxk2Yvo/x1NJdslUaussK3fdpBbvttm1iIwU+c26dj9UxJcwk2c5UWt5F55MUTIA8BE7Dg== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.3.1" + jest-worker "^25.4.0" + p-limit "^2.3.0" + schema-utils "^2.6.6" + serialize-javascript "^3.1.0" + source-map "^0.6.1" + terser "^4.6.12" + webpack-sources "^1.4.3" + +terser@^4.1.2, terser@^4.6.12: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +testcafe-browser-provider-electron@^0.0.14: + version "0.0.14" + resolved "https://registry.yarnpkg.com/testcafe-browser-provider-electron/-/testcafe-browser-provider-electron-0.0.14.tgz#093d4173084947858a255114f3442076b582b8a9" + integrity sha512-FcnOm1GMKPC0SWn5IFRitBJ6xSLWuLyzaZopZ+MH+Pp95hy4atVWbImDTJzTr4aHtPqs3GNdF1H7Ff2t7CmuNw== + dependencies: + babel-runtime "^6.25.0" + chrome-remote-interface "^0.27.0" + debug "4.1.1" + dedent "^0.7.0" + endpoint-utils "^1.0.2" + lodash "^4.17.4" + mustache "^2.3.0" + node-ipc "^9.1.0" + os-family "^1.0.0" + pify "^2.3.0" + pinkie "^2.0.4" + promisify-event "^1.0.0" + proxyquire "^1.7.10" + +testcafe-browser-tools@2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/testcafe-browser-tools/-/testcafe-browser-tools-2.0.12.tgz#33b0173b5d7cd4c1327a94139f93630e6012ca65" + integrity sha512-5oNNYlcZiDspqJB6L8CfI4vxjzkvARSZv3pa+JrFAoqYmEA3VPiAvzrn+P0zi0D5jEPkKngW2KTpq6r3GfdDNw== + dependencies: + array-find "^1.0.0" + dedent "^0.7.0" + del "^5.1.0" + execa "^3.3.0" + graceful-fs "^4.1.11" + linux-platform-info "^0.0.3" + lodash "^4.17.15" + mkdirp "^0.5.1" + mustache "^2.1.2" + nanoid "^2.1.3" + os-family "^1.0.0" + pify "^2.3.0" + pinkie "^2.0.1" + read-file-relative "^1.2.0" + which-promise "^1.0.0" + +testcafe-hammerhead@17.1.2: + version "17.1.2" + resolved "https://registry.yarnpkg.com/testcafe-hammerhead/-/testcafe-hammerhead-17.1.2.tgz#589e9dfe397bb5181725af177e7385a308e8a6f5" + integrity sha512-WkTRrZoMYIZkB0NGiT+xrlD71hcMDX/a34iHNdrUBwcw9o/xi7ym4YzyZO0LXrG5b1pzuLS3ll/o5OqkhfRZnw== + dependencies: + acorn-hammerhead "^0.3.0" + asar "^2.0.1" + bowser "1.6.0" + brotli "^1.3.1" + crypto-md5 "^1.0.0" + css "2.2.3" + debug "4.1.1" + esotope-hammerhead "0.5.3" + iconv-lite "0.5.1" + lodash "^4.17.13" + lru-cache "2.6.3" + match-url-wildcard "0.0.4" + merge-stream "^1.0.1" + mime "~1.4.1" + mustache "^2.1.1" + nanoid "^0.2.2" + os-family "^1.0.0" + parse5 "2.2.3" + pinkie "1.0.0" + read-file-relative "^1.2.0" + semver "5.5.0" + tough-cookie "2.3.3" + tunnel-agent "0.6.0" + webauth "^1.1.0" + +testcafe-legacy-api@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/testcafe-legacy-api/-/testcafe-legacy-api-4.0.0.tgz#700bacce8d16028250d41b643051645b4cfe7cd5" + integrity sha512-Tn+YEH8hqDPQs/1/d+A9G+FdfejougtoWX0wRxrLq5ECYy2qxwH8p9EGDUNatLm0IFIumVpcz2tSZkvRpfKLSg== + dependencies: + async "0.2.6" + babel-runtime "^5.8.34" + dedent "^0.6.0" + highlight-es "^1.0.0" + is-jquery-obj "^0.1.0" + lodash "^4.14.0" + moment "^2.14.1" + mustache "^2.2.1" + os-family "^1.0.0" + parse5 "^2.1.5" + pify "^2.3.0" + pinkie "^2.0.1" + strip-bom "^2.0.0" + +testcafe-react-selectors@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/testcafe-react-selectors/-/testcafe-react-selectors-4.0.0.tgz#75cb0396ced6121c4562f7fbe809a289664d62d7" + integrity sha512-di03HvtEqLzCaCkWd4PumWgfhgmz7K8XVduYUY0aCQ1p4zFtO2S1suAte6IvakvG8yAKr1oH5OL0yTdXgcPf6Q== + +testcafe-reporter-json@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/testcafe-reporter-json/-/testcafe-reporter-json-2.2.0.tgz#bb061e054489abdb62add745dd979896b618ea91" + integrity sha512-wfpNaZgGP2WoqdmnIXOyxcpwSzdH1HvzXSN397lJkXOrQrwhuGUThPDvyzPnZqxZSzXdDUvIPJm55tCMWbfymQ== + +testcafe-reporter-list@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/testcafe-reporter-list/-/testcafe-reporter-list-2.1.0.tgz#9fa89f71b97d3dfe64b4302d5e227dee69aec6b9" + integrity sha1-n6ifcbl9Pf5ktDAtXiJ97mmuxrk= + +testcafe-reporter-minimal@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/testcafe-reporter-minimal/-/testcafe-reporter-minimal-2.1.0.tgz#676f03547634143c6eaf3ab52868273a4bebf421" + integrity sha1-Z28DVHY0FDxurzq1KGgnOkvr9CE= + +testcafe-reporter-spec@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/testcafe-reporter-spec/-/testcafe-reporter-spec-2.1.1.tgz#8156fced0f5132486559ad560bc80676469275ec" + integrity sha1-gVb87Q9RMkhlWa1WC8gGdkaSdew= + +testcafe-reporter-xunit@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/testcafe-reporter-xunit/-/testcafe-reporter-xunit-2.1.0.tgz#e6d66c572ce15af266706af0fd610b2a841dd443" + integrity sha1-5tZsVyzhWvJmcGrw/WELKoQd1EM= + +testcafe@^1.8.0: + version "1.8.6" + resolved "https://registry.yarnpkg.com/testcafe/-/testcafe-1.8.6.tgz#7077964ffce0bdfd7ac590912068665f197703d0" + integrity sha512-h4cpvyBZqBXAxCqjaf3iswWFWJ4ZCtNP64+BniWj+bU0MZbTD64DOsyF92zQg09x+odQhU8Hm2zyCxKgAMCbtg== + dependencies: + "@types/node" "^10.12.19" + async-exit-hook "^1.1.2" + babel-core "^6.22.1" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-for-of-as-array "^1.1.1" + babel-plugin-transform-runtime "^6.22.0" + babel-preset-env "^1.1.8" + babel-preset-flow "^6.23.0" + babel-preset-react "^6.24.1" + babel-preset-stage-2 "^6.22.0" + babel-runtime "^6.22.0" + bin-v8-flags-filter "^1.1.2" + bowser "^2.8.1" + callsite "^1.0.0" + callsite-record "^4.0.0" + chai "^4.1.2" + chalk "^2.3.0" + chrome-remote-interface "^0.25.3" + coffeescript "^2.3.1" + commander "^2.8.1" + debug "^2.2.0" + dedent "^0.4.0" + del "^3.0.0" + device-specs "^1.0.0" + elegant-spinner "^1.0.1" + emittery "^0.4.1" + endpoint-utils "^1.0.2" + error-stack-parser "^1.3.6" + globby "^9.2.0" + graceful-fs "^4.1.11" + graphlib "^2.1.5" + import-lazy "^3.1.0" + indent-string "^1.2.2" + is-ci "^1.0.10" + is-docker "^2.0.0" + is-glob "^2.0.1" + is-stream "^1.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + log-update-async-hook "^2.0.2" + make-dir "^3.0.0" + map-reverse "^1.0.1" + mime-db "^1.41.0" + moment "^2.10.3" + moment-duration-format-commonjs "^1.0.0" + mustache "^2.1.2" + nanoid "^1.0.1" + node-version "^1.0.0" + os-family "^1.0.0" + parse5 "^1.5.0" + pify "^2.3.0" + pinkie "^2.0.4" + pngjs "^3.3.1" + promisify-event "^1.0.0" + qrcode-terminal "^0.10.0" + read-file-relative "^1.2.0" + replicator "^1.0.3" + resolve-cwd "^1.0.0" + resolve-from "^4.0.0" + sanitize-filename "^1.6.0" + source-map-support "^0.5.16" + strip-bom "^2.0.0" + testcafe-browser-tools "2.0.12" + testcafe-hammerhead "17.1.2" + testcafe-legacy-api "4.0.0" + testcafe-reporter-json "^2.1.0" + testcafe-reporter-list "^2.1.0" + testcafe-reporter-minimal "^2.1.0" + testcafe-reporter-spec "^2.1.1" + testcafe-reporter-xunit "^2.1.0" + time-limit-promise "^1.0.2" + tmp "0.0.28" + tree-kill "^1.1.0" + typescript "^3.3.3" + +text-cache@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/text-cache/-/text-cache-4.2.2.tgz#d0d30ba89b7312ea1c1a31cd9a4db56c1cef7fe7" + integrity sha512-zky+UDYiX0a/aPw/YTBD+EzKMlCTu1chFuCMZeAkgoRiceySdROu1V2kJXhCbtEdBhiOviYnAdGiSYl58HW0ZQ== + dependencies: + vectorize-text "^3.2.1" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +throttleit@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" + integrity sha1-z+34jmDADdlpe2H90qg0OptoDq8= + +through2@^0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0, through2@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" + integrity sha1-6zKE2k6jEbbMis42U3SKUqvyWj8= + dependencies: + readable-stream "~1.1.9" + xtend "~2.1.1" + +through2@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" + integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s= + dependencies: + readable-stream "~1.0.17" + xtend "~2.1.1" + +through@2, through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +time-limit-promise@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/time-limit-promise/-/time-limit-promise-1.0.4.tgz#33e928212273c70d52153c28ad2a7e3319b975f9" + integrity sha512-FLHDDsIDducw7MBcRWlFtW2Tm50DoKOSFf0Nzx17qwXj8REXCte0eUkHrJl9QU3Bl9arG3XNYX0PcHpZ9xyuLw== + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-invariant@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.0, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tinycolor2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" + integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g= + +tinyqueue@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" + integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== + +tmp-promise@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-1.1.0.tgz#bb924d239029157b9bc1d506a6aa341f8b13e64c" + integrity sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw== + dependencies: + bluebird "^3.5.0" + tmp "0.1.0" + +tmp@0.0.28: + version "0.0.28" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" + integrity sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA= + dependencies: + os-tmpdir "~1.0.1" + +tmp@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + dependencies: + rimraf "^2.6.3" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-array-buffer@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/to-array-buffer/-/to-array-buffer-3.2.0.tgz#cb684dd691a7368c3b249c2348d75227f7d4dbb4" + integrity sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ== + dependencies: + flatten-vertex-data "^1.0.2" + is-blob "^2.0.1" + string-to-arraybuffer "^1.0.0" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-float32@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-float32/-/to-float32-1.0.1.tgz#22d5921f38183164b9e7e9876158c0c16cb9753a" + integrity sha512-nOy2WSwae3xhZbc+05xiCuU3ZPPmH0L4Rg4Q1qiOGFSuNSCTB9nVJaGgGl3ZScxAclX/L8hJuDHJGDAzbfuKCQ== + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-px@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.0.1.tgz#5bbaed5e5d4f76445bcc903c293a2307dd324646" + integrity sha1-W7rtXl1PdkRbzJA8KTojB90yRkY= + dependencies: + parse-unit "^1.0.1" + +to-px@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.1.0.tgz#b6b269ed5db0cc9aefc15272a4c8bcb2ca1e99ca" + integrity sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw== + dependencies: + parse-unit "^1.0.1" + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +to-uint8@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/to-uint8/-/to-uint8-1.4.1.tgz#9f45694905b827f247d37bc8ec83b2818d81fac9" + integrity sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg== + dependencies: + arr-flatten "^1.1.0" + clamp "^1.0.1" + is-base64 "^0.1.0" + is-float-array "^1.0.0" + to-array-buffer "^3.0.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +topojson-client@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99" + integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== + dependencies: + commander "2" + +tough-cookie@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + integrity sha1-C2GKVWW23qkL80JdBNVe3EdadWE= + dependencies: + punycode "^1.4.1" + +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +tree-kill@^1.1.0, tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +triangulate-hypercube@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/triangulate-hypercube/-/triangulate-hypercube-1.0.1.tgz#d8071db2ebfcfd51f308d0bcf2a5c48a5b36d137" + integrity sha1-2Acdsuv8/VHzCNC88qXEils20Tc= + dependencies: + gamma "^0.1.0" + permutation-parity "^1.0.0" + permutation-rank "^1.0.0" + +triangulate-polyline@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/triangulate-polyline/-/triangulate-polyline-1.0.3.tgz#bf8ba877a85054103feb9fa5a61b4e8d7017814d" + integrity sha1-v4uod6hQVBA/65+lphtOjXAXgU0= + dependencies: + cdt2d "^1.0.0" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +trim-trailing-lines@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz#7f0739881ff76657b7776e10874128004b625a94" + integrity sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + dependencies: + glob "^7.1.2" + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= + dependencies: + utf8-byte-length "^1.0.1" + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.8.1, tslib@^1.9.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@0.6.0, tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + +turntable-camera-controller@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz#8dbd3fe00550191c65164cb888971049578afd99" + integrity sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk= + dependencies: + filtered-vector "^1.2.1" + gl-mat4 "^1.0.2" + gl-vec3 "^1.0.2" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +two-product@^1.0.0, two-product@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/two-product/-/two-product-1.0.2.tgz#67d95d4b257a921e2cb4bd7af9511f9088522eaa" + integrity sha1-Z9ldSyV6kh4stL16+VEfkIhSLqo= + +two-sum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/two-sum/-/two-sum-1.0.0.tgz#31d3f32239e4f731eca9df9155e2b297f008ab64" + integrity sha1-MdPzIjnk9zHsqd+RVeKyl/AIq2Q= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type-name@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/type-name/-/type-name-2.0.2.tgz#efe7d4123d8ac52afff7f40c7e4dec5266008fb4" + integrity sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q= + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" + integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + +typed-css-modules-webpack-plugin@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/typed-css-modules-webpack-plugin/-/typed-css-modules-webpack-plugin-0.1.3.tgz#b63b9e866a704436e8d1fbbafe3fccdec5af302f" + integrity sha512-conAPkJZyrwTXFQlqDWGd16WXuEbCBsIiwgO2/YZQUKsE/Ld+xE2i5d85Dk9brnqc2fh54WaoidLG4TNCjmMqQ== + dependencies: + chalk "^2.4.1" + css-modules-loader-core "^1.1.0" + glob "^7.1.3" + typed-css-modules "^0.6.3" + +typed-css-modules@^0.6.3: + version "0.6.4" + resolved "https://registry.yarnpkg.com/typed-css-modules/-/typed-css-modules-0.6.4.tgz#eb7385b5e9d0e5c654c992ecc8a246d0885c4560" + integrity sha512-2bL0dWY66wLGcz766HAwqJl4mnlUrx7D/dyUD9SPnab2QM1OsE6U842QhZhkEI5EoQdNziSLWqetHskdZ3MCxw== + dependencies: + "@types/css-modules-loader-core" "^1.1.0" + camelcase "^5.3.1" + chalk "^2.1.0" + chokidar "^3.4.0" + css-modules-loader-core "^1.1.0" + glob "^7.1.2" + is-there "^4.4.2" + mkdirp "^0.5.1" + yargs "^15.3.1" + +typed-styles@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" + integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== + +typedarray-pool@^1.0.0, typedarray-pool@^1.0.2, typedarray-pool@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/typedarray-pool/-/typedarray-pool-1.2.0.tgz#e7e90720144ba02b9ed660438af6f3aacfe33ac3" + integrity sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ== + dependencies: + bit-twiddle "^1.0.0" + dup "^1.0.0" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^3.3.3, typescript@^3.7.5: + version "3.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" + integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== + +ua-parser-js@^0.7.19: + version "0.7.21" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== + +uglify-js@^2.6.0: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +unified@^6.1.5: + version "6.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-6.2.0.tgz#7fbd630f719126d67d40c644b7e3f617035f6dba" + integrity sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^1.1.0" + trough "^1.0.0" + vfile "^2.0.0" + x-is-string "^0.1.0" + +unified@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.0.0.tgz#12b099f97ee8b36792dbad13d278ee2f696eed1d" + integrity sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +union-find@^1.0.0, union-find@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/union-find/-/union-find-1.0.2.tgz#292bac415e6ad3a89535d237010db4a536284e58" + integrity sha1-KSusQV5q06iVNdI3AQ20pTYoTlg= + +union-find@~0.0.3: + version "0.0.4" + resolved "https://registry.yarnpkg.com/union-find/-/union-find-0.0.4.tgz#b854b3301619bdad144b0014c78f96eac0d2f0f6" + integrity sha1-uFSzMBYZva0USwAUx4+W6sDS8PY= + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.0, uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-util-find-all-after@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz#95cc62f48812d879b4685a0512bf1b838da50e9a" + integrity sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw== + dependencies: + unist-util-is "^4.0.0" + +unist-util-is@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" + integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== + +unist-util-is@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.2.tgz#c7d1341188aa9ce5b3cff538958de9895f14a5de" + integrity sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ== + +unist-util-remove-position@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz#ec037348b6102c897703eee6d0294ca4755a2020" + integrity sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A== + dependencies: + unist-util-visit "^1.1.0" + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" + integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ== + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz#f6e3afee8bdbf961c0e6f028ea3c0480028c3d06" + integrity sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q== + +unist-util-visit-parents@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" + integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== + dependencies: + unist-util-is "^3.0.0" + +unist-util-visit-parents@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz#d4076af3011739c71d2ce99d05de37d545f4351d" + integrity sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@^1.1.0, unist-util-visit@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" + integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== + dependencies: + unist-util-visit-parents "^2.0.0" + +unist-util-visit@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.2.tgz#3843782a517de3d2357b4c193b24af2d9366afb7" + integrity sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@^1.1.0, unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-diff@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-diff/-/update-diff-1.1.0.tgz#f510182d81ee819fb82c3a6b22b62bbdeda7808f" + integrity sha1-9RAYLYHugZ+4LDprIrYrve2ngI8= + +update-notifier@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" + integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== + dependencies: + boxen "^4.2.0" + chalk "^3.0.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.3.1" + is-npm "^4.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.0.0" + pupa "^2.0.1" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-3.0.0.tgz#9f1f11b371acf6e51ed15a50db635e02eec18368" + integrity sha512-a84JJbIA5xTFTWyjjcPdnsu+41o/SNE8SpXMdUvXs6Q+LuhCD9E2+0VCiuDWqgo3GGXVlFHzArDmBpj9PgWn4A== + dependencies: + loader-utils "^1.2.3" + mime "^2.4.4" + schema-utils "^2.5.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url-parse@^1.4.3: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0, url@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utils-copy-error@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-copy-error/-/utils-copy-error-1.0.1.tgz#791de393c0f09890afd59f3cbea635f079a94fa5" + integrity sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U= + dependencies: + object-keys "^1.0.9" + utils-copy "^1.1.0" + +utils-copy@^1.0.0, utils-copy@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/utils-copy/-/utils-copy-1.1.1.tgz#6e2b97982aa8cd73e1182a3e6f8bec3c0f4058a7" + integrity sha1-biuXmCqozXPhGCo+b4vsPA9AWKc= + dependencies: + const-pinf-float64 "^1.0.0" + object-keys "^1.0.9" + type-name "^2.0.0" + utils-copy-error "^1.0.0" + utils-indexof "^1.0.0" + utils-regex-from-string "^1.0.0" + validate.io-array "^1.0.3" + validate.io-buffer "^1.0.1" + validate.io-nonnegative-integer "^1.0.0" + +utils-indexof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-indexof/-/utils-indexof-1.0.0.tgz#20feabf09ef1018b523643e8380e7bc83ec61b5c" + integrity sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w= + dependencies: + validate.io-array-like "^1.0.1" + validate.io-integer-primitive "^1.0.0" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +utils-regex-from-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz#fe1a2909f8de0ff0d5182c80fbc654d6a687d189" + integrity sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk= + dependencies: + regex-regex "^1.0.0" + validate.io-string-primitive "^1.0.0" + +uuid@^3.0.1, uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" + integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== + +v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + +v8-to-istanbul@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6" + integrity sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate.io-array-like@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz#7af9f7eb7b51715beb2215668ec5cce54faddb5a" + integrity sha1-evn363tRcVvrIhVmjsXM5U+t21o= + dependencies: + const-max-uint32 "^1.0.2" + validate.io-integer-primitive "^1.0.0" + +validate.io-array@^1.0.3, validate.io-array@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + integrity sha1-W1osr9j4uFq7L4hroVPy2Tond00= + +validate.io-buffer@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz#852d6734021914d5d13afc32531761e3720ed44e" + integrity sha1-hS1nNAIZFNXROvwyUxdh43IO1E4= + +validate.io-integer-primitive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz#a9aa010355fe8681c0fea6c1a74ad2419cadddc6" + integrity sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY= + dependencies: + validate.io-number-primitive "^1.0.0" + +validate.io-integer@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" + integrity sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg= + dependencies: + validate.io-number "^1.0.3" + +validate.io-matrix-like@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz#5ec32a75d0889dac736dea68bdd6145b155edfc3" + integrity sha1-XsMqddCInaxzbepovdYUWxVe38M= + +validate.io-ndarray-like@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz#d8a3b0ed165bbf1d2fc0d0073270cfa552295919" + integrity sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk= + +validate.io-nonnegative-integer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz#8069243a08c5f98e95413c929dfd7b18f3f6f29f" + integrity sha1-gGkkOgjF+Y6VQTySnf17GPP28p8= + dependencies: + validate.io-integer "^1.0.5" + +validate.io-number-primitive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz#d2e01f202989369dcf1155449564203afe584e55" + integrity sha1-0uAfICmJNp3PEVVElWQgOv5YTlU= + +validate.io-number@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" + integrity sha1-9j/+2iSL8opnqNSODjtGGhZluvg= + +validate.io-positive-integer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz#7ed2d03b4c27558cc66a00aab0f0e921814a6582" + integrity sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI= + dependencies: + validate.io-integer "^1.0.5" + +validate.io-string-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz#b8135b9fb1372bde02fdd53ad1d0ccd6de798fee" + integrity sha1-uBNbn7E3K94C/dU60dDM1t55j+4= + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vectorize-text@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/vectorize-text/-/vectorize-text-3.2.1.tgz#85921abd9685af775fd20a01041a2837fe51bdb5" + integrity sha512-rGojF+D9BB96iPZPUitfq5kaiS6eCJmfEel0NXOK/MzZSuXGiwhoop80PtaDas9/Hg/oaox1tI9g3h93qpuspg== + dependencies: + cdt2d "^1.0.0" + clean-pslg "^1.1.0" + ndarray "^1.0.11" + planar-graph-to-polyline "^1.0.0" + simplify-planar-graph "^2.0.1" + surface-nets "^1.0.0" + triangulate-polyline "^1.0.0" + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vfile-location@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.6.tgz#8a274f39411b8719ea5728802e10d9e0dff1519e" + integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== + +vfile-location@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.0.1.tgz#d78677c3546de0f7cd977544c367266764d31bb3" + integrity sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ== + +vfile-message@*, vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile-message@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1" + integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA== + dependencies: + unist-util-stringify-position "^1.1.1" + +vfile@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a" + integrity sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w== + dependencies: + is-buffer "^1.1.4" + replace-ext "1.0.0" + unist-util-stringify-position "^1.0.0" + vfile-message "^1.0.0" + +vfile@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.1.1.tgz#282d28cebb609183ac51703001bc18b3e3f17de9" + integrity sha512-lRjkpyDGjVlBA7cDQhQ+gNcvB1BGaTHYuSOcY3S7OhDmBtnzX95FhtZZDecSTDm6aajFymyve6S5DN4ZHGezdQ== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + replace-ext "1.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +vt-pbf@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.1.tgz#b0f627e39a10ce91d943b898ed2363d21899fb82" + integrity sha512-pHjWdrIoxurpmTcbfBWXaPwSmtPAHS105253P1qyEfSTV2HJddqjM+kIHquaT/L6lVJIk9ltTGc0IxR/G47hYA== + dependencies: + "@mapbox/point-geometry" "0.1.0" + "@mapbox/vector-tile" "^1.3.1" + pbf "^3.0.5" + +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +warning@^4.0.1, warning@^4.0.2, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" + integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.0" + watchpack-chokidar2 "^2.0.0" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +wdio-dot-reporter@~0.0.8: + version "0.0.10" + resolved "https://registry.yarnpkg.com/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz#facfb7c9c5984149951f59cbc3cd0752101cf0e0" + integrity sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg== + +weak-map@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.5.tgz#79691584d98607f5070bd3b70a40e6bb22e401eb" + integrity sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes= + +weakmap-shim@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/weakmap-shim/-/weakmap-shim-1.1.1.tgz#d65afd784109b2166e00ff571c33150ec2a40b49" + integrity sha1-1lr9eEEJshZuAP9XHDMVDsKkC0k= + +webauth@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webauth/-/webauth-1.1.0.tgz#64704f6b8026986605bc3ca629952e6e26fdd100" + integrity sha1-ZHBPa4AmmGYFvDymKZUubib90QA= + +webdriverio@^4.13.0: + version "4.14.4" + resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.14.4.tgz#f7a94e9a6530819796088f42b009833d83de0386" + integrity sha512-Knp2vzuzP5c5ybgLu+zTwy/l1Gh0bRP4zAr8NWcrStbuomm9Krn9oRF0rZucT6AyORpXinETzmeowFwIoo7mNA== + dependencies: + archiver "~2.1.0" + babel-runtime "^6.26.0" + css-parse "^2.0.0" + css-value "~0.0.1" + deepmerge "~2.0.1" + ejs "~2.5.6" + gaze "~1.1.2" + glob "~7.1.1" + grapheme-splitter "^1.0.2" + inquirer "~3.3.0" + json-stringify-safe "~5.0.1" + mkdirp "~0.5.1" + npm-install-package "~2.1.0" + optimist "~0.6.1" + q "~1.5.0" + request "^2.83.0" + rgb2hex "^0.1.9" + safe-buffer "~5.1.1" + supports-color "~5.0.0" + url "~0.11.0" + wdio-dot-reporter "~0.0.8" + wgxpath "~1.0.0" + +webgl-context@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webgl-context/-/webgl-context-2.2.0.tgz#8f37d7257cf6df1cd0a49e6a7b1b721b94cc86a0" + integrity sha1-jzfXJXz23xzQpJ5qextyG5TMhqA= + dependencies: + get-canvas-context "^1.0.1" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-bundle-analyzer@^3.6.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz#ce6b3f908daf069fd1f7266f692cbb3bded9ba16" + integrity sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.15" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-cli@^3.3.10: + version "3.3.12" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" + integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== + dependencies: + chalk "^2.4.2" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.1" + findup-sync "^3.0.0" + global-modules "^2.0.0" + import-local "^2.0.0" + interpret "^1.4.0" + loader-utils "^1.4.0" + supports-color "^6.1.0" + v8-compile-cache "^2.1.1" + yargs "^13.3.2" + +webpack-dev-middleware@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@^3.10.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" + integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.7" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "0.3.20" + sockjs-client "1.4.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.41.5: + version "4.43.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" + integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.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.3" + 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.1" + webpack-sources "^1.4.1" + +websocket-driver@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= + dependencies: + websocket-extensions ">=0.1.1" + +websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +wgxpath@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wgxpath/-/wgxpath-1.0.0.tgz#eef8a4b9d558cc495ad3a9a2b751597ecd9af690" + integrity sha1-7vikudVYzEla06mit1FZfs2a9pA= + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== + +whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + +which-promise@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-promise/-/which-promise-1.0.0.tgz#20b721df05b35b706176ffa10b0909aba4603035" + integrity sha1-ILch3wWzW3Bhdv+hCwkJq6RgMDU= + dependencies: + pify "^2.2.0" + pinkie-promise "^1.0.0" + which "^1.1.2" + +which@1, which@^1.1.2, which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +world-calendars@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/world-calendars/-/world-calendars-1.0.3.tgz#b25c5032ba24128ffc41d09faf4a5ec1b9c14335" + integrity sha1-slxQMrokEo/8QdCfr0pewbnBQzU= + dependencies: + object-assign "^4.1.0" + +wrap-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@3.3.x: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +ws@^6.0.0, ws@^6.1.0, ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +ws@^7.0.0, ws@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" + integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== + +x-is-string@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" + integrity sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI= + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xregexp@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" + integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== + dependencies: + "@babel/runtime-corejs3" "^7.8.3" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +xtend@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" + integrity sha1-7vax8ZjByN6vrYsXZaBNrUoBxak= + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + dependencies: + object-keys "~0.4.0" + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.7.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" + integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.1, yargs-parser@^18.1.3: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.3.0, yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^14.2.0: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + +yargs@^15.3.1: + version "15.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" + integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.1" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yarn@^1.21.1: + version "1.22.4" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.4.tgz#01c1197ca5b27f21edc8bc472cd4c8ce0e5a470e" + integrity sha512-oYM7hi/lIWm9bCoDMEWgffW8aiNZXCWeZ1/tGy0DWrN6vmzjCXIKu2Y21o8DYVBUtiktwKcNoxyGl/2iKLUNGA== + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +zero-crossings@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/zero-crossings/-/zero-crossings-1.0.1.tgz#c562bd3113643f3443a245d12406b88b69b9a9ff" + integrity sha1-xWK9MRNkPzRDokXRJAa4i2m5qf8= + dependencies: + cwise-compiler "^1.0.0" + +zip-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" + integrity sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ= + dependencies: + archiver-utils "^1.3.0" + compress-commons "^1.2.0" + lodash "^4.8.0" + readable-stream "^2.0.0" From aae9015f1609c56308e78dcf1812f8d6e50a7b7a Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 21 Jun 2020 18:09:58 -0700 Subject: [PATCH 08/66] prepping for conversion --- .flowconfig | 28 - app/{index.js => index.tsx} | 1 - package-lock.json | 27841 ---------------------------------- 3 files changed, 27870 deletions(-) delete mode 100644 .flowconfig rename app/{index.js => index.tsx} (99%) delete mode 100644 package-lock.json diff --git a/.flowconfig b/.flowconfig deleted file mode 100644 index 8ae0734c..00000000 --- a/.flowconfig +++ /dev/null @@ -1,28 +0,0 @@ -[ignore] -/app/main.prod.js -/app/main.prod.js.map -/app/utils/lib/.* -/app/dist/.* -/resources/.* -/node_modules/webpack-cli -/release/.* -/dll/.* -/release/.* -/git/.* - - -[include] - -[libs] - -[options] -esproposal.class_static_fields=enable -esproposal.class_instance_fields=enable -esproposal.export_star_as=enable -module.name_mapper.extension='css' -> '/internals/flow/CSSModule.js.flow' -module.name_mapper.extension='styl' -> '/internals/flow/CSSModule.js.flow' -module.name_mapper.extension='scss' -> '/internals/flow/CSSModule.js.flow' -module.name_mapper.extension='png' -> '/internals/flow/WebpackAsset.js.flow' -module.name_mapper.extension='jpg' -> '/internals/flow/WebpackAsset.js.flow' -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue diff --git a/app/index.js b/app/index.tsx similarity index 99% rename from app/index.js rename to app/index.tsx index 7f10fe2d..b1abd173 100644 --- a/app/index.js +++ b/app/index.tsx @@ -5,7 +5,6 @@ import Root from './containers/Root'; import { configureStore, history } from './store/configureStore'; import './app.global.css'; - const store = configureStore(); // Register for debugging diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 1fe5fbc0..00000000 --- a/package-lock.json +++ /dev/null @@ -1,27841 +0,0 @@ -{ - "name": "BrainWaves", - "version": "0.13.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "3d-view": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/3d-view/-/3d-view-2.0.0.tgz", - "integrity": "sha1-gxrpQtdQjFCAHj4G+v4ejFdOF74=", - "requires": { - "matrix-camera-controller": "^2.1.1", - "orbit-camera-controller": "^4.0.0", - "turntable-camera-controller": "^3.0.0" - } - }, - "7zip-bin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.0.3.tgz", - "integrity": "sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA==", - "dev": true - }, - "@ant-design/css-animation": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@ant-design/css-animation/-/css-animation-1.7.2.tgz", - "integrity": "sha512-bvVOe7A+r7lws58B7r+fgnQDK90cV45AXuvGx6i5CCSX1W/M3AJnHsNggDANBxEtWdNdFWcDd5LorB+RdSIlBw==" - }, - "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.1" - } - }, - "@babel/compat-data": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz", - "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", - "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.2", - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.2", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.2", - "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": { - "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" - } - } - } - }, - "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", - "requires": { - "@babel/types": "^7.10.2", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz", - "integrity": "sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", - "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz", - "integrity": "sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-builder-react-jsx-experimental": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz", - "integrity": "sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-module-imports": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", - "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.10.1", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", - "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz", - "integrity": "sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-regex": "^7.10.1", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-define-map": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", - "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/types": "^7.10.1", - "lodash": "^4.17.13" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", - "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz", - "integrity": "sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz", - "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==", - "dev": true, - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", - "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-wrap-function": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" - }, - "@babel/helper-wrap-function": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz", - "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helpers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", - "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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" - } - } - } - }, - "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz", - "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-remap-async-to-generator": "^7.10.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz", - "integrity": "sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.1.tgz", - "integrity": "sha512-xBfteh352MTke2U1NpclzMDmAmCdQ2fBZjhZQQfGTjXw6qcRYMkt528sA1U8o0ThDCSeuETXIj5bOGdxN+5gkw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-decorators": "^7.10.1" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz", - "integrity": "sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz", - "integrity": "sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz", - "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz", - "integrity": "sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-numeric-separator": "^7.10.1" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", - "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.1" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz", - "integrity": "sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", - "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz", - "integrity": "sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz", - "integrity": "sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", - "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.1.tgz", - "integrity": "sha512-a9OAbQhKOwSle1Vr0NJu/ISg1sPfdEkfRKWpgPuzhnWWzForou2gIeUIIwjAMHRekhhpJ7eulZlYs0H14Cbi+g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.1.tgz", - "integrity": "sha512-b3pWVncLBYoPP60UOTc7NMlbtsHQ6ITim78KQejNHK6WJ2mzV5kCcg4mIWpasAfJEgwVTibwo2e+FU7UEIKQUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.1.tgz", - "integrity": "sha512-ypC4jwfIVF72og0dgvEcFRdOM2V9Qm1tu7RGmdZOlhsccyK0wisXmMObGuWEOd5jQ+K9wcIgSNftCpk2vkjUfQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz", - "integrity": "sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.1.tgz", - "integrity": "sha512-XyHIFa9kdrgJS91CUH+ccPVTnJShr8nLGc5bG2IhGXv5p1Rd+8BleGE5yzIg2Nc1QZAdHDa0Qp4m6066OL96Iw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz", - "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz", - "integrity": "sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz", - "integrity": "sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz", - "integrity": "sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-remap-async-to-generator": "^7.10.1" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz", - "integrity": "sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz", - "integrity": "sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "lodash": "^4.17.13" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", - "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-define-map": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", - "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz", - "integrity": "sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz", - "integrity": "sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz", - "integrity": "sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz", - "integrity": "sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.1.tgz", - "integrity": "sha512-i4o0YwiJBIsIx7/liVCZ3Q2WkWr1/Yu39PksBOnh/khW2SwIFsGa5Ze+MSon5KbDfrEHP9NeyefAgvUSXzaEkw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-flow": "^7.10.1" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz", - "integrity": "sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz", - "integrity": "sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz", - "integrity": "sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz", - "integrity": "sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz", - "integrity": "sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", - "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz", - "integrity": "sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.10.1", - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz", - "integrity": "sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz", - "integrity": "sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz", - "integrity": "sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz", - "integrity": "sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", - "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz", - "integrity": "sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz", - "integrity": "sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.10.1", - "@babel/helper-builder-react-jsx-experimental": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-jsx": "^7.10.1" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.1.tgz", - "integrity": "sha512-XwDy/FFoCfw9wGFtdn5Z+dHh6HXKHkC6DwKNWpN74VWinUagZfDcEJc3Y8Dn5B3WMVnAllX8Kviaw7MtC5Epwg==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx-experimental": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-jsx": "^7.10.1" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.1.tgz", - "integrity": "sha512-4p+RBw9d1qV4S749J42ZooeQaBomFPrSxa9JONLHJ1TxCBo3TzJ79vtmG2S2erUT8PDDrPdw4ZbXGr2/1+dILA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-jsx": "^7.10.1" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz", - "integrity": "sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-jsx": "^7.10.1" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.1.tgz", - "integrity": "sha512-mfhoiai083AkeewsBHUpaS/FM1dmUENHBMpS/tugSJ7VXqXO5dCN1Gkint2YvM1Cdv1uhmAKt1ZOuAjceKmlLA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", - "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz", - "integrity": "sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz", - "integrity": "sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz", - "integrity": "sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz", - "integrity": "sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-regex": "^7.10.1" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", - "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz", - "integrity": "sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz", - "integrity": "sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz", - "integrity": "sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/preset-env": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", - "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.10.1", - "@babel/helper-compilation-targets": "^7.10.2", - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-proposal-async-generator-functions": "^7.10.1", - "@babel/plugin-proposal-class-properties": "^7.10.1", - "@babel/plugin-proposal-dynamic-import": "^7.10.1", - "@babel/plugin-proposal-json-strings": "^7.10.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", - "@babel/plugin-proposal-numeric-separator": "^7.10.1", - "@babel/plugin-proposal-object-rest-spread": "^7.10.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.1", - "@babel/plugin-proposal-private-methods": "^7.10.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.1", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.1", - "@babel/plugin-transform-arrow-functions": "^7.10.1", - "@babel/plugin-transform-async-to-generator": "^7.10.1", - "@babel/plugin-transform-block-scoped-functions": "^7.10.1", - "@babel/plugin-transform-block-scoping": "^7.10.1", - "@babel/plugin-transform-classes": "^7.10.1", - "@babel/plugin-transform-computed-properties": "^7.10.1", - "@babel/plugin-transform-destructuring": "^7.10.1", - "@babel/plugin-transform-dotall-regex": "^7.10.1", - "@babel/plugin-transform-duplicate-keys": "^7.10.1", - "@babel/plugin-transform-exponentiation-operator": "^7.10.1", - "@babel/plugin-transform-for-of": "^7.10.1", - "@babel/plugin-transform-function-name": "^7.10.1", - "@babel/plugin-transform-literals": "^7.10.1", - "@babel/plugin-transform-member-expression-literals": "^7.10.1", - "@babel/plugin-transform-modules-amd": "^7.10.1", - "@babel/plugin-transform-modules-commonjs": "^7.10.1", - "@babel/plugin-transform-modules-systemjs": "^7.10.1", - "@babel/plugin-transform-modules-umd": "^7.10.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.10.1", - "@babel/plugin-transform-object-super": "^7.10.1", - "@babel/plugin-transform-parameters": "^7.10.1", - "@babel/plugin-transform-property-literals": "^7.10.1", - "@babel/plugin-transform-regenerator": "^7.10.1", - "@babel/plugin-transform-reserved-words": "^7.10.1", - "@babel/plugin-transform-shorthand-properties": "^7.10.1", - "@babel/plugin-transform-spread": "^7.10.1", - "@babel/plugin-transform-sticky-regex": "^7.10.1", - "@babel/plugin-transform-template-literals": "^7.10.1", - "@babel/plugin-transform-typeof-symbol": "^7.10.1", - "@babel/plugin-transform-unicode-escapes": "^7.10.1", - "@babel/plugin-transform-unicode-regex": "^7.10.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.10.2", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/preset-flow": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.10.1.tgz", - "integrity": "sha512-FuQsibb5PaX07fF1XUO5gjjxdEZbcJv8+ugPDaeFEsBIvUTib8hCtEJow/c2F0jq9ZUjpHCQ8IQKNHRvKE1kJQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-transform-flow-strip-types": "^7.10.1" - } - }, - "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", - "dev": true, - "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.10.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.1.tgz", - "integrity": "sha512-Rw0SxQ7VKhObmFjD/cUcKhPTtzpeviEFX1E6PgP+cYOhQ98icNqtINNFANlsdbQHrmeWnqdxA4Tmnl1jy5tp3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-transform-react-display-name": "^7.10.1", - "@babel/plugin-transform-react-jsx": "^7.10.1", - "@babel/plugin-transform-react-jsx-development": "^7.10.1", - "@babel/plugin-transform-react-jsx-self": "^7.10.1", - "@babel/plugin-transform-react-jsx-source": "^7.10.1", - "@babel/plugin-transform-react-pure-annotations": "^7.10.1" - } - }, - "@babel/register": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.10.1.tgz", - "integrity": "sha512-sl96+kB3IA2B9EzpwwBmYadOT14vw3KaXOknGDbJaZCOj52GDA4Tivudq9doCJcB+bEIKCEARZYwRgBBsCGXyg==", - "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "lodash": "^4.17.13", - "make-dir": "^2.1.0", - "pirates": "^4.0.0", - "source-map-support": "^0.5.16" - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "@babel/runtime": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", - "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs2": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.10.2.tgz", - "integrity": "sha512-ZLwsFnNm3WpIARU1aLFtufjMHsmEnc8TjtrfAjmbgMbeoyR+LuQoyESoNdTfeDhL6IdY12SpeycXMgSgl8XGXA==", - "requires": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs3": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.2.tgz", - "integrity": "sha512-+a2M/u7r15o3dV1NEizr9bRi+KUVnrs/qYxF0Z06DAPx/4VCWaz1WA7EcbE+uqGgt39lp5akWGmHsTseIkHkHg==", - "dev": true, - "requires": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "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 - }, - "@blueprintjs/core": { - "version": "3.28.2", - "resolved": "https://registry.npmjs.org/@blueprintjs/core/-/core-3.28.2.tgz", - "integrity": "sha512-EGl6tByE4ME+ZvhZYr3Idq3T0otL5r6WLRgUEXLVUq8gzmPKSGHfJKPOisMZY9NEsrVUhwfl0c9vA1Wu1B6NsA==", - "dev": true, - "requires": { - "@blueprintjs/icons": "^3.18.1", - "@types/dom4": "^2.0.1", - "classnames": "^2.2", - "dom4": "^2.1.5", - "normalize.css": "^8.0.1", - "popper.js": "^1.16.1", - "react-lifecycles-compat": "^3.0.4", - "react-popper": "^1.3.7", - "react-transition-group": "^2.9.0", - "resize-observer-polyfill": "^1.5.1", - "tslib": "~1.10.0" - }, - "dependencies": { - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "react-transition-group": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", - "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", - "dev": true, - "requires": { - "dom-helpers": "^3.4.0", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" - } - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - } - } - }, - "@blueprintjs/icons": { - "version": "3.18.1", - "resolved": "https://registry.npmjs.org/@blueprintjs/icons/-/icons-3.18.1.tgz", - "integrity": "sha512-24FihaUmhjTVr1wIXAdqblMjrnxE3g4Rx46BEERNd5xvfS0yeR/MMICStVTOfUQViWkn9uN4Ghe2SPFlHK/FPA==", - "dev": true, - "requires": { - "classnames": "^2.2", - "tslib": "~1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - } - } - }, - "@choojs/findup": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", - "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", - "requires": { - "commander": "^2.15.1" - } - }, - "@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" - } - }, - "@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - } - }, - "@electron/get": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.2.tgz", - "integrity": "sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "global-agent": "^2.0.2", - "global-tunnel-ng": "^2.7.1", - "got": "^9.6.0", - "progress": "^2.0.3", - "sanitize-filename": "^1.6.2", - "sumchecker": "^3.0.1" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "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": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.0.1.tgz", - "integrity": "sha512-9t1KUe/93coV1rBSxMmBAOIK3/HVpwxArCA1CxskKyRiv6o8J70V8C/V3OJminVCTa2M0hQI9AWRd5wxu2dAHw==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1", - "chalk": "^4.0.0", - "jest-message-util": "^26.0.1", - "jest-util": "^26.0.1", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.0.1.tgz", - "integrity": "sha512-Xq3eqYnxsG9SjDC+WLeIgf7/8KU6rddBxH+SCt18gEpOhAGYC/Mq+YbtlNcIdwjnnT+wDseXSbU0e5X84Y4jTQ==", - "dev": true, - "requires": { - "@jest/console": "^26.0.1", - "@jest/reporters": "^26.0.1", - "@jest/test-result": "^26.0.1", - "@jest/transform": "^26.0.1", - "@jest/types": "^26.0.1", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.0.1", - "jest-config": "^26.0.1", - "jest-haste-map": "^26.0.1", - "jest-message-util": "^26.0.1", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.0.1", - "jest-resolve-dependencies": "^26.0.1", - "jest-runner": "^26.0.1", - "jest-runtime": "^26.0.1", - "jest-snapshot": "^26.0.1", - "jest-util": "^26.0.1", - "jest-validate": "^26.0.1", - "jest-watcher": "^26.0.1", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.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 - }, - "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" - } - } - } - }, - "@jest/environment": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.0.1.tgz", - "integrity": "sha512-xBDxPe8/nx251u0VJ2dFAFz2H23Y98qdIaNwnMK6dFQr05jc+Ne/2np73lOAx+5mSBO/yuQldRrQOf6hP1h92g==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.0.1", - "@jest/types": "^26.0.1", - "jest-mock": "^26.0.1" - } - }, - "@jest/fake-timers": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.0.1.tgz", - "integrity": "sha512-Oj/kCBnTKhm7CR+OJSjZty6N1bRDr9pgiYQr4wY221azLz5PHi08x/U+9+QpceAYOWheauLP8MhtSVFrqXQfhg==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1", - "@sinonjs/fake-timers": "^6.0.1", - "jest-message-util": "^26.0.1", - "jest-mock": "^26.0.1", - "jest-util": "^26.0.1" - } - }, - "@jest/globals": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.0.1.tgz", - "integrity": "sha512-iuucxOYB7BRCvT+TYBzUqUNuxFX1hqaR6G6IcGgEqkJ5x4htNKo1r7jk1ji9Zj8ZMiMw0oB5NaA7k5Tx6MVssA==", - "dev": true, - "requires": { - "@jest/environment": "^26.0.1", - "@jest/types": "^26.0.1", - "expect": "^26.0.1" - } - }, - "@jest/reporters": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.0.1.tgz", - "integrity": "sha512-NWWy9KwRtE1iyG/m7huiFVF9YsYv/e+mbflKRV84WDoJfBqUrNRyDbL/vFxQcYLl8IRqI4P3MgPn386x76Gf2g==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.0.1", - "@jest/test-result": "^26.0.1", - "@jest/transform": "^26.0.1", - "@jest/types": "^26.0.1", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "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": "^26.0.1", - "jest-resolve": "^26.0.1", - "jest-util": "^26.0.1", - "jest-worker": "^26.0.0", - "node-notifier": "^7.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.1.3" - }, - "dependencies": { - "jest-worker": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", - "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", - "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 - } - } - }, - "@jest/source-map": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.0.0.tgz", - "integrity": "sha512-S2Z+Aj/7KOSU2TfW0dyzBze7xr95bkm5YXNUqqCek+HE0VbNNSNzrRwfIi5lf7wvzDTSS0/ib8XQ1krFNyYgbQ==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "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==", - "dev": true - } - } - }, - "@jest/test-result": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.0.1.tgz", - "integrity": "sha512-oKwHvOI73ICSYRPe8WwyYPTtiuOAkLSbY8/MfWF3qDEd/sa8EDyZzin3BaXTqufir/O/Gzea4E8Zl14XU4Mlyg==", - "dev": true, - "requires": { - "@jest/console": "^26.0.1", - "@jest/types": "^26.0.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.0.1.tgz", - "integrity": "sha512-ssga8XlwfP8YjbDcmVhwNlrmblddMfgUeAkWIXts1V22equp2GMIHxm7cyeD5Q/B0ZgKPK/tngt45sH99yLLGg==", - "dev": true, - "requires": { - "@jest/test-result": "^26.0.1", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.0.1", - "jest-runner": "^26.0.1", - "jest-runtime": "^26.0.1" - } - }, - "@jest/transform": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.0.1.tgz", - "integrity": "sha512-pPRkVkAQ91drKGbzCfDOoHN838+FSbYaEAvBXvKuWeeRRUD8FjwXkqfUNUZL6Ke48aA/1cqq/Ni7kVMCoqagWA==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.0.1", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.0.1", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.0.1", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.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 - } - } - }, - "@jest/types": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.0.1.tgz", - "integrity": "sha512-IbtjvqI9+eS1qFnOIEL7ggWmT+iK/U+Vde9cGWtYb/b6XgKb3X44ZAe/z9YZzoAAZ/E92m0DqrilF934IGNnQA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@mapbox/geojson-rewind": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.0.tgz", - "integrity": "sha512-73l/qJQgj/T/zO1JXVfuVvvKDgikD/7D/rHAD28S9BG1OTstgmftrmqfCx4U+zQAmtsB6HcDA3a7ymdnJZAQgg==", - "requires": { - "concat-stream": "~2.0.0", - "minimist": "^1.2.5" - }, - "dependencies": { - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "@mapbox/geojson-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", - "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" - }, - "@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha1-zlblOfg1UrWNENZy6k1vya3HsjQ=" - }, - "@mapbox/mapbox-gl-supported": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", - "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==" - }, - "@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=" - }, - "@mapbox/tiny-sdf": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.1.1.tgz", - "integrity": "sha512-Ihn1nZcGIswJ5XGbgFAvVumOgWpvIjBX9jiRlIl46uQG9vJOF51ViBYHF95rEZupuyQbEmhLaDPLQlU7fUTsBg==" - }, - "@mapbox/unitbezier": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", - "integrity": "sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4=" - }, - "@mapbox/vector-tile": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", - "requires": { - "@mapbox/point-geometry": "~0.1.0" - } - }, - "@mapbox/whoots-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" - }, - "@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" - } - }, - "@nteract/actions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@nteract/actions/-/actions-6.0.0.tgz", - "integrity": "sha512-WxU82zz/YINTvgKVD2f7rLgWrPxIsZ04VVfAgAk/x23LvfZ/wZvho1ED9zloH18wjkrDJgdKaPaarlTJ4jujbw==", - "dev": true, - "requires": { - "@nteract/commutable": "^7.2.12", - "@nteract/messaging": "^7.0.7", - "@nteract/types": "^6.0.7", - "immutable": "^4.0.0-rc.12", - "rx-jupyter": "^5.5.9" - } - }, - "@nteract/commutable": { - "version": "7.2.12", - "resolved": "https://registry.npmjs.org/@nteract/commutable/-/commutable-7.2.12.tgz", - "integrity": "sha512-6cgjLkH5/xButb1VQEGwHxBa93GBAShyJFyG2jMYONZqy6vPU2MwlMRQYA1aaa16LsOcei1FFf7DKOBWYkue3g==", - "requires": { - "immutable": "^4.0.0-rc.12", - "uuid": "^8.0.0" - } - }, - "@nteract/core": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@nteract/core/-/core-14.0.0.tgz", - "integrity": "sha512-Kiv+wytwINr9zI1ttn0UaohfOi5EEwX2acxs1HUG5gx2b0zhwHtMhedkCIXvyOahppsslQ03gnXoIS++wQuETA==", - "dev": true, - "requires": { - "@nteract/actions": "^6.0.0", - "@nteract/commutable": "^7.2.12", - "@nteract/epics": "^4.0.9", - "@nteract/reducers": "^4.0.0", - "@nteract/selectors": "^2.8.10", - "@nteract/types": "^6.0.7", - "redux-logger": "^3.0.6" - } - }, - "@nteract/epics": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@nteract/epics/-/epics-4.0.9.tgz", - "integrity": "sha512-Sd0t4SHSzDWPAUM+h/UWEmgMfx8Snvkv7+f/Og1q0qRXeEH6gPJxZLUQ8l0q612wB4XmAMG7M3xk26N41SSt4A==", - "dev": true, - "requires": { - "@nteract/actions": "^6.0.0", - "@nteract/commutable": "^7.2.12", - "@nteract/messaging": "^7.0.7", - "@nteract/mythic-notifications": "^0.1.9", - "@nteract/selectors": "^2.8.10", - "@nteract/types": "^6.0.7", - "file-saver": "^2.0.0", - "redux": "^4.0.1", - "redux-observable": "^2.0.0-alpha.0", - "rx-jupyter": "^5.5.9", - "rxjs": "^6.3.3" - }, - "dependencies": { - "file-saver": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", - "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==", - "dev": true - }, - "redux-observable": { - "version": "2.0.0-alpha.0", - "resolved": "https://registry.npmjs.org/redux-observable/-/redux-observable-2.0.0-alpha.0.tgz", - "integrity": "sha512-w0RsVGprIFiYi1AhFCOATiv3ld2AtuobvbcVsLvX19p8eAwLowWl2OrKYcCq/QEeEpmSHTXutXfVfcBnzaWmdw==", - "dev": true - } - } - }, - "@nteract/markdown": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nteract/markdown/-/markdown-3.0.1.tgz", - "integrity": "sha512-Dr79niruytzbcDsLLS5NoPIzvVJ3YkJX18O0hmZAmrVn2Ni8L5VW+ZymWsSgRBogDgrYQzhV4L1MmIC/X6rbUg==", - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "@nteract/mathjax": "^3.0.1", - "babel-runtime": "^6.26.0", - "react-markdown": "^4.0.0" - } - }, - "@nteract/mathjax": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nteract/mathjax/-/mathjax-3.0.1.tgz", - "integrity": "sha512-jL4a2KjY9wzcg7dG3HvufKMXOk+FxWQ6BFH6p3fwJUerbf3SF6H/RlaLxuMgFP+Tv+sHVXo7FHTTTIIsRyuv8g==", - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "babel-runtime": "^6.26.0" - } - }, - "@nteract/messaging": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@nteract/messaging/-/messaging-7.0.7.tgz", - "integrity": "sha512-ucfiyQf48ecYOKrIUrIwb20LfPhx2YdM0iSejVycM7QR3CP8V3p4CccdCjcJHbv7aI9RgfgGp4FUp8Exbh3weA==", - "requires": { - "@nteract/types": "^6.0.7", - "@types/uuid": "^8.0.0", - "lodash.clonedeep": "^4.5.0", - "rxjs": "^6.3.3", - "uuid": "^8.0.0" - } - }, - "@nteract/mythic-notifications": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@nteract/mythic-notifications/-/mythic-notifications-0.1.9.tgz", - "integrity": "sha512-z56zROjdLF8cUG4/yBxHb749rZ5v9IZUwEfadOdO9Q1fXZk9aEmg6yMMT/Y4AzLtgW35m2nbX+4SzNi/neSOKg==", - "dev": true, - "requires": { - "@blueprintjs/core": "^3.7.0", - "@nteract/myths": "^0.1.9" - } - }, - "@nteract/myths": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@nteract/myths/-/myths-0.1.9.tgz", - "integrity": "sha512-aPLUamd0kTnzy+8usMsGs+kgMfxfx2QNvDuxd5+ko+9DKuyMJx8quNuqphlxaLXNGiJrnfNi5krXaAyNEil3Sw==", - "dev": true, - "requires": { - "react-redux": "^6.0.0", - "redux": "^4.0.0", - "redux-observable": "^2.0.0-alpha.0", - "rxjs": "^6.3.3" - }, - "dependencies": { - "react-redux": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-6.0.1.tgz", - "integrity": "sha512-T52I52Kxhbqy/6TEfBv85rQSDz6+Y28V/pf52vDWs1YRXG19mcFOGfHnY2HsNFHyhP+ST34Aih98fvt6tqwVcQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.3.1", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.2.4", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^16.8.2" - } - }, - "redux-observable": { - "version": "2.0.0-alpha.0", - "resolved": "https://registry.npmjs.org/redux-observable/-/redux-observable-2.0.0-alpha.0.tgz", - "integrity": "sha512-w0RsVGprIFiYi1AhFCOATiv3ld2AtuobvbcVsLvX19p8eAwLowWl2OrKYcCq/QEeEpmSHTXutXfVfcBnzaWmdw==", - "dev": true - } - } - }, - "@nteract/reducers": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nteract/reducers/-/reducers-4.0.0.tgz", - "integrity": "sha512-Jv02jYk4XdhLUSzcRQCW0x8TR1QBGb/3iFhNoq3zIhRmGofP68WnhMayS+s6e+xNq1BsHXJy49U7QmAoQFqkBg==", - "dev": true, - "requires": { - "@nteract/actions": "^6.0.0", - "@nteract/commutable": "^7.2.12", - "@nteract/types": "^6.0.7", - "escape-carriage": "^1.3.0", - "immutable": "^4.0.0-rc.12", - "lodash.has": "^4.5.2", - "redux": "^4.0.1", - "redux-immutable": "^4.0.0", - "uuid": "^8.0.0" - } - }, - "@nteract/selectors": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/@nteract/selectors/-/selectors-2.8.10.tgz", - "integrity": "sha512-CJUmuYL76ThY7E57/XCfb9i3le8JQ2cKCqBqvULFPkCx9qcmKqWjMp47EJxUvRdRYyVBkqhpnTF0FgGi7LPPGg==", - "dev": true, - "requires": { - "@nteract/commutable": "^7.2.12", - "@nteract/types": "^6.0.7", - "immutable": "^4.0.0-rc.12", - "reselect": "^4.0.0", - "rx-jupyter": "^5.5.9" - } - }, - "@nteract/transform-vdom": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@nteract/transform-vdom/-/transform-vdom-2.2.5.tgz", - "integrity": "sha512-q6FbWlrSEWUmQpDV1DBPcw5FZpUcQbKOQ2a59vY/qcQ/Qjh1KUCC+gortso+WIE4P36eHZRxKz5ptCu5i47OLg==", - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "babel-runtime": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "@nteract/transforms": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@nteract/transforms/-/transforms-4.4.7.tgz", - "integrity": "sha512-G84BeBfzfdAg3cAV78ES9/yxe2ZNitg7j8MCKKx4iNS9vqeQbO92vyBsBW2D6qlddefU/RB5/HUvvtNUpd0ZRw==", - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "@nteract/markdown": "^3.0.1", - "@nteract/mathjax": "^3.0.1", - "@nteract/transform-vdom": "^2.2.5", - "ansi-to-react": "^3.3.5", - "babel-runtime": "^6.26.0", - "react-json-tree": "^0.11.0" - } - }, - "@nteract/types": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@nteract/types/-/types-6.0.7.tgz", - "integrity": "sha512-sv4X97iXVHXVoPBl2m/xxO396GwujUSfm+7Cx6W5ziGUxSBjs4ydGTn2Uy6zv1MRa7Gwv9uJ/Sl8hgm7vY80Tw==", - "requires": { - "@nteract/commutable": "^7.2.12", - "immutable": "^4.0.0-rc.12", - "rxjs": "^6.3.3", - "uuid": "^8.0.0" - } - }, - "@octokit/auth-token": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.2.tgz", - "integrity": "sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ==", - "dev": true, - "requires": { - "@octokit/types": "^5.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.3.tgz", - "integrity": "sha512-Y900+r0gIz+cWp6ytnkibbD95ucEzDSKzlEnaWS52hbCDNcCJYO5mRmWW7HRAnDc7am+N/5Lnd8MppSaTYx1Yg==", - "dev": true, - "requires": { - "@octokit/types": "^5.0.0", - "is-plain-object": "^3.0.0", - "universal-user-agent": "^5.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", - "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", - "dev": true, - "requires": { - "isobject": "^4.0.0" - } - }, - "isobject": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", - "dev": true - }, - "universal-user-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", - "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", - "dev": true, - "requires": { - "os-name": "^3.1.0" - } - } - } - }, - "@octokit/plugin-paginate-rest": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz", - "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.1" - }, - "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz", - "integrity": "sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==", - "dev": true - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz", - "integrity": "sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.1", - "deprecation": "^2.3.1" - }, - "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/request": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.5.tgz", - "integrity": "sha512-atAs5GAGbZedvJXXdjtKljin+e2SltEs48B3naJjqWupYl2IUBbB/CJisyjbNHcKpHzb3E+OYEZ46G8eakXgQg==", - "dev": true, - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.0.0", - "@octokit/types": "^5.0.0", - "deprecation": "^2.0.0", - "is-plain-object": "^3.0.0", - "node-fetch": "^2.3.0", - "once": "^1.4.0", - "universal-user-agent": "^5.0.0" - }, - "dependencies": { - "@octokit/request-error": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.2.tgz", - "integrity": "sha512-2BrmnvVSV1MXQvEkrb9zwzP0wXFNbPJij922kYBTLIlIafukrGOb+ABBT2+c6wZiuyWDH1K1zmjGQ0toN/wMWw==", - "dev": true, - "requires": { - "@octokit/types": "^5.0.1", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "is-plain-object": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", - "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", - "dev": true, - "requires": { - "isobject": "^4.0.0" - } - }, - "isobject": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", - "dev": true - }, - "universal-user-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", - "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", - "dev": true, - "requires": { - "os-name": "^3.1.0" - } - } - } - }, - "@octokit/request-error": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.1.tgz", - "integrity": "sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/rest": { - "version": "16.43.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.1.tgz", - "integrity": "sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw==", - "dev": true, - "requires": { - "@octokit/auth-token": "^2.4.0", - "@octokit/plugin-paginate-rest": "^1.1.1", - "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "2.4.0", - "@octokit/request": "^5.2.0", - "@octokit/request-error": "^1.0.2", - "atob-lite": "^2.0.0", - "before-after-hook": "^2.0.0", - "btoa-lite": "^1.0.0", - "deprecation": "^2.0.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "lodash.uniq": "^4.5.0", - "octokit-pagination-methods": "^1.1.0", - "once": "^1.4.0", - "universal-user-agent": "^4.0.0" - }, - "dependencies": { - "atob-lite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", - "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=", - "dev": true - } - } - }, - "@octokit/types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.0.1.tgz", - "integrity": "sha512-GorvORVwp244fGKEt3cgt/P+M0MGy4xEDbckw+K5ojEezxyMDgCaYPKVct+/eWQfZXOT7uq0xRpmrl/+hliabA==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - }, - "@plotly/d3-sankey": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", - "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", - "requires": { - "d3-array": "1", - "d3-collection": "1", - "d3-shape": "^1.2.0" - } - }, - "@plotly/d3-sankey-circular": { - "version": "0.33.1", - "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz", - "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==", - "requires": { - "d3-array": "^1.2.1", - "d3-collection": "^1.0.4", - "d3-shape": "^1.2.0", - "elementary-circuits-directed-graph": "^1.0.4" - } - }, - "@semantic-ui-react/event-stack": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.1.tgz", - "integrity": "sha512-SA7VOu/tY3OkooR++mm9voeQrJpYXjJaMHO1aFCcSouS2xhqMR9Gnz0LEGLOR0h9ueWPBKaQzKIrx3FTTJZmUQ==", - "requires": { - "exenv": "^1.2.2", - "prop-types": "^15.6.2" - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@sinonjs/commons": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", - "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sinonjs/formatio": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", - "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^5.0.2" - } - }, - "@sinonjs/samsam": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.0.3.tgz", - "integrity": "sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "@stardust-ui/react-component-event-listener": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@stardust-ui/react-component-event-listener/-/react-component-event-listener-0.38.0.tgz", - "integrity": "sha512-sIP/e0dyOrrlb8K7KWumfMxj/gAifswTBC4o68Aa+C/GA73ccRp/6W1VlHvF/dlOR4KLsA+5SKnhjH36xzPsWg==", - "requires": { - "@babel/runtime": "^7.1.2", - "prop-types": "^15.7.2" - } - }, - "@stardust-ui/react-component-ref": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@stardust-ui/react-component-ref/-/react-component-ref-0.38.0.tgz", - "integrity": "sha512-xjs6WnvJVueSIXMWw0C3oWIgAPpcD03qw43oGOjUXqFktvpNkB73JoKIhS4sCrtQxBdct75qqr4ZL6JiyPcESw==", - "requires": { - "@babel/runtime": "^7.1.2", - "prop-types": "^15.7.2", - "react-is": "^16.6.3" - } - }, - "@stylelint/postcss-css-in-js": { - "version": "0.37.1", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.1.tgz", - "integrity": "sha512-UMf2Rni3JGKi3ZwYRGMYJ5ipOA5ENJSKMtYA/pE1ZLURwdh7B5+z2r73RmWvub+N0UuH1Lo+TGfCgYwPvqpXNw==", - "dev": true, - "requires": { - "@babel/core": ">=7.9.0" - } - }, - "@stylelint/postcss-markdown": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz", - "integrity": "sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==", - "dev": true, - "requires": { - "remark": "^12.0.0", - "unist-util-find-all-after": "^3.0.1" - } - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@turf/area": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.0.1.tgz", - "integrity": "sha512-Zv+3N1ep9P5JvR0YOYagLANyapGWQBh8atdeR3bKpWcigVXFsEKNUw03U/5xnh+cKzm7yozHD6MFJkqQv55y0g==", - "requires": { - "@turf/helpers": "6.x", - "@turf/meta": "6.x" - } - }, - "@turf/bbox": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.0.1.tgz", - "integrity": "sha512-EGgaRLettBG25Iyx7VyUINsPpVj1x3nFQFiGS3ER8KCI1MximzNLsam3eXRabqQDjyAKyAE1bJ4EZEpGvspQxw==", - "requires": { - "@turf/helpers": "6.x", - "@turf/meta": "6.x" - } - }, - "@turf/centroid": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.0.2.tgz", - "integrity": "sha512-auyDauOtC4eddH7GC3CHFTDu2PKhpSeKCRhwhHhXtJqn2dWCJQNIoCeJRmfXRIbzCWhWvgvQafvvhq8HNvmvWw==", - "requires": { - "@turf/helpers": "6.x", - "@turf/meta": "6.x" - } - }, - "@turf/helpers": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.1.4.tgz", - "integrity": "sha512-vJvrdOZy1ngC7r3MDA7zIGSoIgyrkWcGnNIEaqn/APmw+bVLF2gAW7HIsdTxd12s5wQMqEpqIQrmrbRRZ0xC7g==" - }, - "@turf/meta": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.0.2.tgz", - "integrity": "sha512-VA7HJkx7qF1l3+GNGkDVn2oXy4+QoLP6LktXAaZKjuT1JI0YESat7quUkbCMy4zP9lAUuvS4YMslLyTtr919FA==", - "requires": { - "@turf/helpers": "6.x" - } - }, - "@types/babel__core": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.8.tgz", - "integrity": "sha512-KXBiQG2OXvaPWFPDS1rD8yV9vO0OuWIqAEqLsbfX0oU2REN5KuoMnZ1gClWcBhO5I3n6oTVAmrMufOvRqdmFTQ==", - "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.12", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.12.tgz", - "integrity": "sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/cacheable-request": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", - "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@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/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/dom4": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/dom4/-/dom4-2.0.1.tgz", - "integrity": "sha512-kSkVAvWmMZiCYtvqjqQEwOmvKwcH+V4uiv3qPQ8pAh1Xl39xggGEo8gHUqV4waYGHezdFw0rKBR8Jt0CrQSDZA==", - "dev": true - }, - "@types/fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", - "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==", - "dev": true - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/keyv": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", - "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@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/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", - "dev": true - }, - "@types/node": { - "version": "14.0.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", - "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/prettier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.1.tgz", - "integrity": "sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ==", - "dev": true - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@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/ungap__url-search-params": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@types/ungap__url-search-params/-/ungap__url-search-params-0.1.0.tgz", - "integrity": "sha512-mTtzm7iHpnXk47opmJFNFB854RZD5lXpkkwsxnlCmz2x6MMpVYG3KbYlOAmW3+96dIvPNrD2a7qNLuKumTF2aA==", - "dev": true - }, - "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", - "dev": true - }, - "@types/uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-xSQfNcvOiE5f9dyd4Kzxbof1aTrLobL278pGLKOZI6esGfZ7ts9Ka16CzIN6Y8hFHE1C7jIBZokULhK1bOgjRw==" - }, - "@types/web-bluetooth": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.2.tgz", - "integrity": "sha1-XPCBwyAyNUNxLEnEntUgv2XurRo=" - }, - "@types/webdriverio": { - "version": "4.13.3", - "resolved": "https://registry.npmjs.org/@types/webdriverio/-/webdriverio-4.13.3.tgz", - "integrity": "sha512-AfSQM1xTO9Ax+u9uSQPDuw69DQ0qA2RMoKHn86jCgWNcwKVUjGMSP4sfSl3JOfcZN8X/gWvn7znVPp2/g9zcJA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", - "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 - }, - "@types/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "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": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "@ungap/url-search-params": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@ungap/url-search-params/-/url-search-params-0.2.0.tgz", - "integrity": "sha512-KVPTXfdofx9g/1OnO4js0Sos/ITghfNxw+DHJUyXG+X83KEMyJV+fQ6zyd2jTUwqall/SCJlV7p/HDqJbbF5WQ==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@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==", - "dev": true - }, - "@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==", - "dev": true - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", - "dev": true, - "requires": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - } - }, - "a-big-triangle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/a-big-triangle/-/a-big-triangle-1.0.3.tgz", - "integrity": "sha1-7v0wsCqPUl6LH3K7a7GwwWdRx5Q=", - "requires": { - "gl-buffer": "^2.1.1", - "gl-vao": "^1.2.0", - "weak-map": "^1.0.5" - } - }, - "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 - }, - "abs-svg-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", - "integrity": "sha1-32Acjo0roQ1KdtYl4japo5wnI78=" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "accessibility-developer-tools": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz", - "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=" - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" - }, - "acorn-es7-plugin": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz", - "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=" - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", - "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==" - }, - "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 - }, - "add-line-numbers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/add-line-numbers/-/add-line-numbers-1.0.1.tgz", - "integrity": "sha1-SNu96kfb0jTer+rGyTzqb3C0t+M=", - "requires": { - "pad-left": "^1.0.2" - } - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", - "dev": true - }, - "affine-hull": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/affine-hull/-/affine-hull-1.0.0.tgz", - "integrity": "sha1-dj/x040GPOt+Jy8X7k17vK+QXF0=", - "requires": { - "robust-orientation": "^1.1.3" - } - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "airbnb-prop-types": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz", - "integrity": "sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==", - "dev": true, - "requires": { - "array.prototype.find": "^2.1.0", - "function.prototype.name": "^1.1.1", - "has": "^1.0.3", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.1.0", - "prop-types": "^15.7.2", - "prop-types-exact": "^1.2.0", - "react-is": "^16.9.0" - } - }, - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "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-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==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "almost-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", - "integrity": "sha1-+FHGMROHV5lCdqou++jfowZszN0=" - }, - "alpha-complex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/alpha-complex/-/alpha-complex-1.0.0.tgz", - "integrity": "sha1-kIZYcNawVCrnPAwTHU75iWabctI=", - "requires": { - "circumradius": "^1.0.0", - "delaunay-triangulate": "^1.1.6" - } - }, - "alpha-shape": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/alpha-shape/-/alpha-shape-1.0.0.tgz", - "integrity": "sha1-yDEJkj7P2mZ9IWP+Tyb+JHJvZKk=", - "requires": { - "alpha-complex": "^1.0.0", - "simplicial-complex-boundary": "^1.0.0" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "anser": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz", - "integrity": "sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==" - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, - "requires": { - "string-width": "^3.0.0" - } - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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" - } - }, - "ansi-to-react": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/ansi-to-react/-/ansi-to-react-3.3.5.tgz", - "integrity": "sha512-uAI8NOh+/5PC1poTnLwhuO7whaxPst1lZCeq+7P7hlP0A6GRXjXu1f5qprTwT3NHtjIWyMcFJAL0Im0HyB2XeQ==", - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "anser": "^1.4.1", - "babel-runtime": "^6.26.0", - "escape-carriage": "^1.2.0" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "app-builder-bin": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.9.tgz", - "integrity": "sha512-NSjtqZ3x2kYiDp3Qezsgukx/AUzKPr3Xgf9by4cYt05ILWGAptepeeu0Uv+7MO+41o6ujhLixTou8979JGg2Kg==", - "dev": true - }, - "app-builder-lib": { - "version": "22.7.0", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.7.0.tgz", - "integrity": "sha512-blRKwV8h0ztualXS50ciCTo39tbuDGNS+ldcy8+KLvKXuT6OpYnSJ7M6MSfPT+xWatshMHJV1rJx3Tl+k/Sn/g==", - "dev": true, - "requires": { - "7zip-bin": "~5.0.3", - "@develar/schema-utils": "~2.6.5", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "22.7.0", - "builder-util-runtime": "8.7.1", - "chromium-pickle-js": "^0.2.0", - "debug": "^4.2.0", - "ejs": "^3.1.3", - "electron-publish": "22.7.0", - "fs-extra": "^9.0.0", - "hosted-git-info": "^3.0.4", - "is-ci": "^2.0.0", - "isbinaryfile": "^4.0.6", - "js-yaml": "^3.14.0", - "lazy-val": "^1.0.4", - "minimatch": "^3.0.4", - "normalize-package-data": "^2.5.0", - "read-config-file": "6.0.0", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.2", - "temp-file": "^3.3.7" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz", - "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==", - "dev": true, - "requires": { - "lru-cache": "^5.1.1" - } - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "archiver": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", - "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=", - "dev": true, - "requires": { - "archiver-utils": "^1.3.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "zip-stream": "^1.2.0" - } - }, - "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash": "^4.8.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } - } - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "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=", - "dev": true - }, - "array-bounds": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", - "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "array-find": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", - "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "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-normalize": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", - "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", - "requires": { - "array-bounds": "^1.0.0" - } - }, - "array-range": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", - "integrity": "sha1-9W5GWRhDYRxqVvd+8C7afFAIm/w=" - }, - "array-rearrange": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz", - "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==" - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "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=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "array.prototype.find": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.1.tgz", - "integrity": "sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.4" - } - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "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=", - "dev": true - }, - "ast-metadata-inferer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.2.0.tgz", - "integrity": "sha512-6yPph2NeCHNxoI/ZmjklYaLOSZDAx+0L0+wsXnF56FxmjxvUlYZSWcj1KXtXO8IufruQTzVFOjg1+IzdDazSPg==", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, - "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": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "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==", - "dev": true - }, - "async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "atob-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-1.0.0.tgz", - "integrity": "sha1-uI3KYAaSK5YglPdVaCa6sxxKKWs=" - }, - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true, - "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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 - }, - "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": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.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.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", - "dev": true - }, - "axobject-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", - "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==", - "dev": true - }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, - "babel-jest": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.0.1.tgz", - "integrity": "sha512-Z4GGmSNQ8pX3WS1O+6v3fo41YItJJZsVxG5gIQ+HuB/iuAQBJxMTHTwz292vuYws1LnHfwSRgoqI+nxdy/pcvw==", - "dev": true, - "requires": { - "@jest/transform": "^26.0.1", - "@jest/types": "^26.0.1", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - } - }, - "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", - "dev": true, - "requires": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", - "schema-utils": "^2.6.5" - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "babel-plugin-dev-expression": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-dev-expression/-/babel-plugin-dev-expression-0.2.2.tgz", - "integrity": "sha512-y32lfBif+c2FIh5dwGfcc/IfX5aw/Bru7Du7W2n17sJE/GJGAsmIk5DPW/8JOoeKpXW5evJfJOvRq5xkiS6vng==", - "dev": true - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-flow-runtime": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/babel-plugin-flow-runtime/-/babel-plugin-flow-runtime-0.19.0.tgz", - "integrity": "sha512-3kOv7UW5ojT/MfcqEjr+JOgWykLfWK7bdKozUyE6BrHNm13Auy+BviYNYW35nDWKtN6H7O5Pduxpvgl3P/UvrQ==", - "dev": true, - "requires": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "camelcase": "^3.0.0", - "flow-config-parser": "^0.3.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } - } - }, - "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": "26.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.0.0.tgz", - "integrity": "sha512-+AuoehOrjt9irZL7DOt2+4ZaTM6dlu1s5TTS46JBa0/qem4dy7VNW3tMb96qeEqcIh20LD73TVNtmVEeymTG7w==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", - "dev": true - }, - "babel-preset-current-node-syntax": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", - "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", - "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-import-meta": "^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-fbjs": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz", - "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==", - "dev": true, - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" - } - }, - "babel-preset-jest": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.0.0.tgz", - "integrity": "sha512-9ce+DatAa31DpR4Uir8g4Ahxs5K4W4L8refzt+qHWQANb6LhGcAEfIFgLUwk67oya2cCUd6t4eUMtO/z64ocNw==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.0.0", - "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==" - } - } - }, - "babylon": { - "version": "7.0.0-beta.47", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz", - "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==" - }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "barycentric": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/barycentric/-/barycentric-1.0.1.tgz", - "integrity": "sha1-8VYruJGyb0/sRjqC7to2V4AOxog=", - "requires": { - "robust-linear-solve": "^1.0.0" - } - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "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==", - "dev": true - } - } - }, - "base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" - }, - "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==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "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" - } - }, - "before-after-hook": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", - "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", - "dev": true - }, - "bfj": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", - "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "check-types": "^8.0.3", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - } - }, - "big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", - "dev": true - }, - "big-rat": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/big-rat/-/big-rat-1.0.4.tgz", - "integrity": "sha1-do0JO7V5MN0Y7Vdcf8on3FORreo=", - "requires": { - "bit-twiddle": "^1.0.2", - "bn.js": "^4.11.6", - "double-bits": "^1.1.1" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, - "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==", - "dev": true, - "optional": true - }, - "binary-search-bounds": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", - "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==" - }, - "bit-twiddle": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", - "integrity": "sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4=" - }, - "bitmap-sdf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz", - "integrity": "sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg==", - "requires": { - "clamp": "^1.0.1" - } - }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5" - } - }, - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "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 - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boolean": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz", - "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==", - "dev": true, - "optional": true - }, - "boundary-cells": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/boundary-cells/-/boundary-cells-2.0.1.tgz", - "integrity": "sha1-6QWo0UGc9Hyza+Pb9SXbXiTeAEI=", - "requires": { - "tape": "^4.0.0" - } - }, - "box-intersect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/box-intersect/-/box-intersect-1.0.2.tgz", - "integrity": "sha512-yJeMwlmFPG1gIa7Rs/cGXeI6iOj6Qz5MG5PE61xLKpElUGzmJ4abm+qsLpzxKJFpsSDq742BQEocr8dI2t8Nxw==", - "requires": { - "bit-twiddle": "^1.0.2", - "typedarray-pool": "^1.1.0" - } - }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.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" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "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" - } - }, - "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 - }, - "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" - } - }, - "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 - } - } - }, - "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==", - "dev": true, - "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=", - "dev": true - }, - "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 - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "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==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", - "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001043", - "electron-to-chromium": "^1.3.413", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" - } - }, - "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" - } - }, - "btoa-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", - "dev": true - }, - "buble": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.8.tgz", - "integrity": "sha512-IoGZzrUTY5fKXVkgGHw3QeXFMUNBFv+9l8a4QJKG1JhG3nCMHTdEX1DCOg8568E2Q9qvAQIiSokv6Jsgx8p2cA==", - "requires": { - "acorn": "^6.1.1", - "acorn-dynamic-import": "^4.0.0", - "acorn-jsx": "^5.0.1", - "chalk": "^2.4.2", - "magic-string": "^0.25.3", - "minimist": "^1.2.0", - "os-homedir": "^2.0.0", - "regexpu-core": "^4.5.4" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - }, - "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" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "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" - } - } - } - }, - "bubleify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bubleify/-/bubleify-1.2.1.tgz", - "integrity": "sha512-vp3NHmaQVoKaKWvi15FTMinPNjfp+47+/kFJ9ifezdMF/CBLArCxDVUh+FQE3qRxCRj1qyjJqilTBHHqlM8MaQ==", - "requires": { - "buble": "^0.19.3" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "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-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-indexof-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz", - "integrity": "sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8=", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "dev": true - }, - "builder-util": { - "version": "22.7.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.7.0.tgz", - "integrity": "sha512-UV3MKL0mwjMq2y9JlBf28Cegpj0CrIXcjGkO0TXn+QZ6Yy9rY6lHOuUvpQ19ct2Qh1o+QSwH3Q1nKUf5viJBBg==", - "dev": true, - "requires": { - "7zip-bin": "~5.0.3", - "@types/debug": "^4.1.5", - "@types/fs-extra": "^9.0.1", - "app-builder-bin": "3.5.9", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "8.7.1", - "chalk": "^4.0.0", - "debug": "^4.2.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "js-yaml": "^3.14.0", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.3.7" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - } - } - }, - "builder-util-runtime": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.1.tgz", - "integrity": "sha512-uEBH1nAnTvzjcsrh2XI3qOzJ39h0+9kuIuwj+kCc3a07TZNGShfJcai8fFzL3mNgGjEFxoq+XMssR11r+FOFSg==", - "dev": true, - "requires": { - "debug": "^4.2.0", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } - } - }, - "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=", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "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" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "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" - } - }, - "cacheable-lookup": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", - "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", - "dev": true, - "requires": { - "@types/keyv": "^3.1.1", - "keyv": "^4.0.0" - }, - "dependencies": { - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "keyv": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.1.tgz", - "integrity": "sha512-xz6Jv6oNkbhrFCvCP7HQa8AaII8y8LRpoSm661NOKLr4uHuBwhX4epXrPQgF3+xdJnN4Esm5X0xwY4bOlALOtw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - } - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "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" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "caniuse-db": { - "version": "1.0.30001083", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001083.tgz", - "integrity": "sha512-UORZDifiPy1KAGZ8mvTnN+0DcIxfgSALNqPZr52cIOBNjNHn5o88n3eelwpO8+ECM2LsHDorrgZBfrdPVgOhJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001083", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001083.tgz", - "integrity": "sha512-CnYJ27awX4h7yj5glfK7r1TOI13LBytpLzEgfj0s4mY75/F8pnQcYjL+oVpmS38FB59+vU0gscQ9D8tc+lIXvA==", - "dev": true - }, - "canvas-fit": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", - "integrity": "sha1-rhO+Zq3kL1vg5IfjRfzjCl5bXl8=", - "requires": { - "element-size": "^1.1.1" - } - }, - "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 - }, - "ccount": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", - "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==", - "dev": true - }, - "cdt2d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cdt2d/-/cdt2d-1.0.0.tgz", - "integrity": "sha1-TyEkNLzWe9s9aLj+9KzcLFRBUUE=", - "requires": { - "binary-search-bounds": "^2.0.3", - "robust-in-sphere": "^1.1.3", - "robust-orientation": "^1.1.3" - } - }, - "cell-orientation": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cell-orientation/-/cell-orientation-1.0.1.tgz", - "integrity": "sha1-tQStlqZq0obZ7dmFoiU9A7gNKFA=" - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dev": true, - "requires": { - "traverse": ">=0.3.0 <0.4" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.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" - } - }, - "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" - } - } - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", - "dev": true - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true - }, - "check-types": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", - "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "dependencies": { - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", - "dev": true, - "optional": true, - "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.4.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==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "circumcenter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/circumcenter/-/circumcenter-1.0.0.tgz", - "integrity": "sha1-INeqE7F/usUvUtpPVMasi5Bu5Sk=", - "requires": { - "dup": "^1.0.0", - "robust-linear-solve": "^1.0.0" - } - }, - "circumradius": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/circumradius/-/circumradius-1.0.0.tgz", - "integrity": "sha1-cGxEfj5VzR7T0RvRM+N8JSzDBbU=", - "requires": { - "circumcenter": "^1.0.0" - } - }, - "clamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", - "integrity": "sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ=" - }, - "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==", - "dev": true, - "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=", - "dev": true, - "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==" - }, - "clean-pslg": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/clean-pslg/-/clean-pslg-1.1.2.tgz", - "integrity": "sha1-vTXHRgt+irWp92Gl7VF5aqPIbBE=", - "requires": { - "big-rat": "^1.0.3", - "box-intersect": "^1.0.1", - "nextafter": "^1.0.0", - "rat-vec": "^1.1.1", - "robust-segment-intersect": "^1.0.1", - "union-find": "^1.0.2", - "uniq": "^1.0.1" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-boxes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", - "dev": true - }, - "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=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-spinners": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz", - "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==", - "dev": true - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "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" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "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" - } - }, - "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 - }, - "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 - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "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" - } - } - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "clone-regexp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.1.tgz", - "integrity": "sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw==", - "dev": true, - "requires": { - "is-regexp": "^1.0.0", - "is-supported-regexp-flag": "^1.0.0" - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "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 - }, - "collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" - }, - "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=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-alpha": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", - "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==", - "requires": { - "color-parse": "^1.3.8" - } - }, - "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" - }, - "dependencies": { - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - } - } - }, - "color-diff": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/color-diff/-/color-diff-0.1.7.tgz", - "integrity": "sha1-bbeM2UgqjkWdQIIer0tQMoPcuOI=", - "dev": true - }, - "color-id": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", - "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", - "requires": { - "clamp": "^1.0.1" - } - }, - "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==" - }, - "color-normalize": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz", - "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==", - "requires": { - "clamp": "^1.0.1", - "color-rgba": "^2.1.1", - "dtype": "^2.0.0" - } - }, - "color-parse": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.3.8.tgz", - "integrity": "sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA==", - "requires": { - "color-name": "^1.0.0", - "defined": "^1.0.0", - "is-plain-obj": "^1.1.0" - } - }, - "color-rgba": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.1.1.tgz", - "integrity": "sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==", - "requires": { - "clamp": "^1.0.1", - "color-parse": "^1.3.8", - "color-space": "^1.14.6" - } - }, - "color-space": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.16.0.tgz", - "integrity": "sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==", - "requires": { - "hsluv": "^0.0.3", - "mumath": "^3.3.4" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colorette": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.0.tgz", - "integrity": "sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw==", - "dev": true - }, - "colorguard": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorguard/-/colorguard-1.2.1.tgz", - "integrity": "sha512-qYVKTg626qpDg4/eBnPXidEPXn5+krbYqHVfyyEFBWV5z3IF4p44HKY/eE2t1ohlcrlIkDgHmFJMfQ8qMLnSFw==", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "color-diff": "^0.1.3", - "log-symbols": "^1.0.2", - "object-assign": "^4.0.1", - "pipetteur": "^2.0.0", - "plur": "^2.0.0", - "postcss": "^5.0.4", - "postcss-reporter": "^1.2.1", - "text-table": "^0.2.0", - "yargs": "^1.2.6" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "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" - } - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-reporter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-1.4.1.tgz", - "integrity": "sha1-wTbwpbFhkV83ndN2XGEHX357mvI=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "lodash": "^4.1.0", - "log-symbols": "^1.0.2", - "postcss": "^5.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 - }, - "yargs": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.3.3.tgz", - "integrity": "sha1-BU3oth8i7v23IHBZ6u+da4P7kxo=", - "dev": true - } - } - }, - "colormap": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/colormap/-/colormap-2.3.1.tgz", - "integrity": "sha512-TEzNlo/qYp6pBoR2SK9JiV+DG1cmUcVO/+DEJqVPSHIKNlWh5L5L4FYog7b/h0bAnhKhpOAvx/c1dFp2QE9sFw==", - "requires": { - "lerp": "^1.0.3" - } - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "compare-angle": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/compare-angle/-/compare-angle-1.0.1.tgz", - "integrity": "sha1-pOtjQW6jx0f8a9bItjZotN5PoSk=", - "requires": { - "robust-orientation": "^1.0.2", - "robust-product": "^1.0.0", - "robust-sum": "^1.0.0", - "signum": "^0.0.0", - "two-sum": "^1.0.0" - } - }, - "compare-cell": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/compare-cell/-/compare-cell-1.0.0.tgz", - "integrity": "sha1-qetwj24OQa73qlZrEw8ZaNyeGqo=" - }, - "compare-oriented-cell": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/compare-oriented-cell/-/compare-oriented-cell-1.0.1.tgz", - "integrity": "sha1-ahSf7vnfxPj8YjWOUd1C7/u9w54=", - "requires": { - "cell-orientation": "^1.0.1", - "compare-cell": "^1.0.0" - } - }, - "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==", - "dev": true - }, - "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "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==", - "dev": true, - "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": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "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 - } - } - }, - "compute-dims": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/compute-dims/-/compute-dims-1.1.0.tgz", - "integrity": "sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg==", - "requires": { - "utils-copy": "^1.0.0", - "validate.io-array": "^1.0.6", - "validate.io-matrix-like": "^1.0.2", - "validate.io-ndarray-like": "^1.0.0", - "validate.io-positive-integer": "^1.0.0" - } - }, - "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" - } - }, - "concurrently": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.2.0.tgz", - "integrity": "sha512-XxcDbQ4/43d6CxR7+iV8IZXhur4KbmEJk1CetVMUqCy34z9l0DkszbY+/9wvmSnToTej0SYomc2WSRH+L0zVJw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "date-fns": "^2.0.1", - "lodash": "^4.17.15", - "read-pkg": "^4.0.1", - "rxjs": "^6.5.2", - "spawn-command": "^0.0.2-1", - "supports-color": "^6.1.0", - "tree-kill": "^1.2.2", - "yargs": "^13.3.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "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" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.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==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - } - } - }, - "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, - "optional": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "const-max-uint32": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/const-max-uint32/-/const-max-uint32-1.0.2.tgz", - "integrity": "sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY=" - }, - "const-pinf-float64": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz", - "integrity": "sha1-9u+w15+cCYbT558pI6v5twtj1yY=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "convex-hull": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/convex-hull/-/convex-hull-1.0.3.tgz", - "integrity": "sha1-IKOqbOh/St6i/30XlxyfwcZ+H/8=", - "requires": { - "affine-hull": "^1.0.0", - "incremental-convex-hull": "^1.0.1", - "monotone-convex-hull-2d": "^1.0.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==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "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" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "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" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "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.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", - "dev": true, - "requires": { - "browserslist": "^4.8.5", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-js-pure": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", - "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", - "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": "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" - }, - "dependencies": { - "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 - } - } - }, - "country-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", - "integrity": "sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY=" - }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "requires": { - "buffer": "^5.1.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - } - } - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "dev": true, - "requires": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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" - } - }, - "create-react-context": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", - "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", - "requires": { - "gud": "^1.0.0", - "warning": "^4.0.3" - } - }, - "cross-env": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", - "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "dependencies": { - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true - }, - "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==", - "dev": true, - "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" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "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==", - "dev": true - } - } - }, - "css-color-list": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/css-color-list/-/css-color-list-0.0.1.tgz", - "integrity": "sha1-hxjoaVrnosyHh76HFfHACKfyixU=", - "dev": true, - "requires": { - "css-color-names": "0.0.1" - } - }, - "css-color-names": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.1.tgz", - "integrity": "sha1-XQVI+iVkVu3kqaDCrHqxnT6xrYE=", - "dev": true - }, - "css-font": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", - "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==", - "requires": { - "css-font-size-keywords": "^1.0.0", - "css-font-stretch-keywords": "^1.0.1", - "css-font-style-keywords": "^1.0.1", - "css-font-weight-keywords": "^1.0.0", - "css-global-keywords": "^1.0.1", - "css-system-font-keywords": "^1.0.0", - "pick-by-alias": "^1.2.0", - "string-split-by": "^1.0.0", - "unquote": "^1.1.0" - } - }, - "css-font-size-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", - "integrity": "sha1-hUh1rOmspqjS7g00WkSq6btttss=" - }, - "css-font-stretch-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", - "integrity": "sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA=" - }, - "css-font-style-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", - "integrity": "sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ=" - }, - "css-font-weight-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", - "integrity": "sha1-m8BGcayFvHJLV07106yWsNYE/Zc=" - }, - "css-global-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", - "integrity": "sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk=" - }, - "css-loader": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", - "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", - "dev": true, - "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.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.0", - "semver": "^6.3.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "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 - } - } - }, - "css-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", - "dev": true, - "requires": { - "css": "^2.0.0" - } - }, - "css-rule-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz", - "integrity": "sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=", - "dev": true, - "requires": { - "css-tokenize": "^1.0.1", - "duplexer2": "0.0.2", - "ldjson-stream": "^1.2.1", - "through2": "^0.6.3" - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, - "css-system-font-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", - "integrity": "sha1-hcbwhquk6zLFcaMIav/ENLhII+0=" - }, - "css-tokenize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz", - "integrity": "sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^1.0.33" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "css-value": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", - "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=", - "dev": true - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "csscolorparser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", - "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs=" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "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.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "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.10", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.10.tgz", - "integrity": "sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==" - }, - "cubic-hermite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cubic-hermite/-/cubic-hermite-1.0.0.tgz", - "integrity": "sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU=" - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cwise": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/cwise/-/cwise-1.0.10.tgz", - "integrity": "sha1-JO7mBy69/WuMb12tsXCQtkmxK+8=", - "requires": { - "cwise-compiler": "^1.1.1", - "cwise-parser": "^1.0.0", - "static-module": "^1.0.0", - "uglify-js": "^2.6.0" - } - }, - "cwise-compiler": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", - "integrity": "sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU=", - "requires": { - "uniq": "^1.0.0" - } - }, - "cwise-parser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cwise-parser/-/cwise-parser-1.0.3.tgz", - "integrity": "sha1-jkk8F9VPl8sDCp6YVLyGyd+zVP4=", - "requires": { - "esprima": "^1.0.3", - "uniq": "^1.0.0" - }, - "dependencies": { - "esprima": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", - "integrity": "sha1-CZNQL+r2aBODJXVvMPmlH+7sEek=" - } - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "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.16.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", - "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", - "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" - } - }, - "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" - } - }, - "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.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - }, - "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" - } - }, - "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.2.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", - "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", - "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.4", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.4.tgz", - "integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw==" - }, - "d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", - "requires": { - "d3-array": "1" - } - }, - "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" - } - }, - "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" - } - }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", - "dev": true - }, - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "date-fns": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.14.0.tgz", - "integrity": "sha512-1zD+68jhFgDIM0rF05rcwYO8cExdNqxjq4xP1QKM60Q45mnO6zaMWB4tOzrIr4M4GSLntsKeE4c9Bdl2jhL/yw==", - "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=" - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - } - }, - "decimal.js": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", - "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", - "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=", - "dev": true - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-diff": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", - "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=", - "dev": true - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "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=" - }, - "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 - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - }, - "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" - } - }, - "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" - } - } - } - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "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==", - "dev": true - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "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 - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delaunay-triangulate": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/delaunay-triangulate/-/delaunay-triangulate-1.1.6.tgz", - "integrity": "sha1-W7yiGweBmNS8PHV5ajXLuYwllUw=", - "requires": { - "incremental-convex-hull": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "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==", - "dev": true, - "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=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-kerning": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz", - "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==" - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true - }, - "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 - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", - "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "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 - } - } - }, - "dev-null": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz", - "integrity": "sha1-WiBc48Ky73e2I41roXnrdMag6Bg=", - "dev": true - }, - "devtron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/devtron/-/devtron-1.4.0.tgz", - "integrity": "sha1-tedIvW6Vu+cL/MaKrm/mlhGUQeE=", - "requires": { - "accessibility-developer-tools": "^2.11.0", - "highlight.js": "^9.3.0", - "humanize-plus": "^1.8.1" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.0.0.tgz", - "integrity": "sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==", - "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==", - "dev": true, - "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 - } - } - }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, - "dmg-builder": { - "version": "22.7.0", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.7.0.tgz", - "integrity": "sha512-5Ea2YEz6zSNbyGzZD+O9/MzmaXb6oa15cSKWo4JQ1xP4rorOpte7IOj2jcwYjtc+Los2gu1lvT314OC1OZIWgg==", - "dev": true, - "requires": { - "app-builder-lib": "22.7.0", - "builder-util": "22.7.0", - "fs-extra": "^9.0.0", - "iconv-lite": "^0.5.1", - "js-yaml": "^3.14.0", - "sanitize-filename": "^1.6.3" - }, - "dependencies": { - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "iconv-lite": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - } - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "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" - } - }, - "doiuse": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-2.6.0.tgz", - "integrity": "sha1-GJLRC2Gpo1at2/K2FJM+gfi7ODQ=", - "dev": true, - "requires": { - "browserslist": "^1.1.1", - "caniuse-db": "^1.0.30000187", - "css-rule-stream": "^1.1.0", - "duplexer2": "0.0.2", - "jsonfilter": "^1.1.2", - "ldjson-stream": "^1.2.1", - "lodash": "^4.0.0", - "multimatch": "^2.0.0", - "postcss": "^5.0.8", - "source-map": "^0.4.2", - "through2": "^0.6.3", - "yargs": "^3.5.4" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.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 - } - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "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": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "dom-align": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz", - "integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA==" - }, - "dom-helpers": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz", - "integrity": "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==", - "requires": { - "@babel/runtime": "^7.8.7", - "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" - } - }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "dom4": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/dom4/-/dom4-2.1.5.tgz", - "integrity": "sha512-gJbnVGq5zaBUY0lUh0LUEVGYrtN75Ks8ZwpwOYvnVFrKy/qzXK4R/1WuLIFExWj/tBxbRAkTzZUGJHXmqsBNjQ==", - "dev": true - }, - "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==", - "dev": true - }, - "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": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "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.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.1.0.tgz", - "integrity": "sha512-CD9M0Dm1iaHfQ1R/TI+z3/JWp/pgub0j4jIQKH89ARR4ATAV2nbaOQS5XxU9maJP5jHaPdDDQSEHuE2UmpUTKg==", - "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==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - }, - "dependencies": { - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - } - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", - "requires": { - "minimatch": "^3.0.4" - } - }, - "double-bits": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/double-bits/-/double-bits-1.1.1.tgz", - "integrity": "sha1-WKu6RUlNpND6Nrc60RoobJGEscY=" - }, - "draw-svg-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", - "integrity": "sha1-bxFtli3TFLmepTTW9Y3WbNvWk3k=", - "requires": { - "abs-svg-path": "~0.1.1", - "normalize-svg-path": "~0.1.0" - } - }, - "dtype": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", - "integrity": "sha1-zQUjI84GFETs0uj1dI9popvihDQ=" - }, - "dup": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", - "integrity": "sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk=" - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "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" - } - }, - "earcut": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.2.tgz", - "integrity": "sha512-eZoZPPJcUHnfRZ0PjLvx2qBordSiO8ofC3vt+qACLM95u+4DovnbYNpQtJh0DNsWj8RnxrQytD4WA8gj5cRIaQ==" - }, - "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" - } - }, - "edges-to-adjacency-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/edges-to-adjacency-list/-/edges-to-adjacency-list-1.0.0.tgz", - "integrity": "sha1-wUbS4ISt37p0pRKTxuAZmkn3V/E=", - "requires": { - "uniq": "^1.0.0" - } - }, - "editorconfig": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz", - "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==", - "dev": true, - "requires": { - "bluebird": "^3.0.5", - "commander": "^2.9.0", - "lru-cache": "^3.2.0", - "semver": "^5.1.0", - "sigmund": "^1.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", - "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", - "dev": true, - "requires": { - "pseudomap": "^1.0.1" - } - } - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "ejs": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.3.tgz", - "integrity": "sha512-wmtrUGyfSC23GC/B1SMv2ogAUgbQEtDmTIhfqielrG5ExIM9TP4UoYdi90jLF1aTcsWCJNEO0UrgKzP0y3nTSg==", - "dev": true, - "requires": { - "jake": "^10.6.1" - } - }, - "electron": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/electron/-/electron-9.0.4.tgz", - "integrity": "sha512-QzkeZNAiNB7KxcdoQKSoaiVT/GQdB4Vt0/ZZOuU8tIKABAsni2I7ztiAbUzxcsnQsqEBSfChuPuDQ5A4VbbzPg==", - "dev": true, - "requires": { - "@electron/get": "^1.0.1", - "@types/node": "^12.0.12", - "extract-zip": "^1.0.3" - }, - "dependencies": { - "@types/node": { - "version": "12.12.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.47.tgz", - "integrity": "sha512-yzBInQFhdY8kaZmqoL2+3U5dSTMrKaYcb561VU+lDzAYvqt+2lojvBEy+hmpSNuXnPTx7m9+04CzWYOUqWME2A==", - "dev": true - } - } - }, - "electron-builder": { - "version": "22.7.0", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.7.0.tgz", - "integrity": "sha512-t6E3oMutpST64YWbZCg7HodEwJOsnjUF1vnDIHm2MW6CFZPX8tlCK6efqaV66LU0E0Nkp/JH6TE5bCqQ1+VdPQ==", - "dev": true, - "requires": { - "@types/yargs": "^15.0.5", - "app-builder-lib": "22.7.0", - "bluebird-lst": "^1.0.9", - "builder-util": "22.7.0", - "builder-util-runtime": "8.7.1", - "chalk": "^4.0.0", - "dmg-builder": "22.7.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "lazy-val": "^1.0.4", - "read-config-file": "6.0.0", - "sanitize-filename": "^1.6.3", - "update-notifier": "^4.1.0", - "yargs": "^15.3.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 - }, - "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" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "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" - } - }, - "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" - } - }, - "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 - }, - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.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 - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "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" - } - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - }, - "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" - } - }, - "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" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "electron-chromedriver": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/electron-chromedriver/-/electron-chromedriver-9.0.0.tgz", - "integrity": "sha512-+MuukzicyfduXO/4yQv9ygLKaScttJNbWtg77A9fs2YhbkISjObWaCF3eJNZL+edZXRfaF/6D4XuXvklQCmwQg==", - "dev": true, - "requires": { - "@electron/get": "^1.12.2", - "extract-zip": "^2.0.0" - }, - "dependencies": { - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - } - }, - "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" - } - } - } - }, - "electron-debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-3.1.0.tgz", - "integrity": "sha512-SWEqLj4MgfV3tGuO5eBLQ5/Nr6M+KPxsnE0bUJZvQebGJus6RAcdmvd7L+l0Ji31h2mmrN23l2tHFtCa2FvurA==", - "requires": { - "electron-is-dev": "^1.1.0", - "electron-localshortcut": "^3.1.0" - } - }, - "electron-devtools-installer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.0.0.tgz", - "integrity": "sha512-zll3w/8PvnPiGmL5tBtgSSoSjWnUljsOjJYsYYU12PKLljzWyfD6S75LKTZFn21VYxVbae2OwmjM5uFStLp6nQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.2", - "semver": "^7.2.1", - "unzip-crx": "^0.2.0" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "electron-is-accelerator": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", - "integrity": "sha1-UJ5RDCala1Xhf4Y6SwThEYRqsns=" - }, - "electron-is-dev": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.2.0.tgz", - "integrity": "sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw==" - }, - "electron-localshortcut": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz", - "integrity": "sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q==", - "requires": { - "debug": "^4.0.1", - "electron-is-accelerator": "^0.1.0", - "keyboardevent-from-electron-accelerator": "^2.0.0", - "keyboardevents-areequal": "^0.2.1" - } - }, - "electron-publish": { - "version": "22.7.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.7.0.tgz", - "integrity": "sha512-hmU69xlb6vvAV3QfpHYDlkdZMFdBAgDbptoxbLFrnTq5bOkcL8AaDbvxeoZ4+lvqgs29NwqGpkHo2oN+p/hCfg==", - "dev": true, - "requires": { - "@types/fs-extra": "^9.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "22.7.0", - "builder-util-runtime": "8.7.1", - "chalk": "^4.0.0", - "fs-extra": "^9.0.0", - "lazy-val": "^1.0.4", - "mime": "^2.4.5" - }, - "dependencies": { - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - } - } - }, - "electron-rebuild": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.11.0.tgz", - "integrity": "sha512-cn6AqZBQBVtaEyj5jZW1/LOezZZ22PA1HvhEP7asvYPJ8PDF4i4UFt9be4i9T7xJKiSiomXvY5Fd+dSq3FXZxA==", - "dev": true, - "requires": { - "colors": "^1.3.3", - "debug": "^4.1.1", - "detect-libc": "^1.0.3", - "fs-extra": "^8.1.0", - "node-abi": "^2.11.0", - "node-gyp": "^6.0.1", - "ora": "^3.4.0", - "spawn-rx": "^3.0.0", - "yargs": "^14.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "node-gyp": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-6.1.0.tgz", - "integrity": "sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.1.2", - "request": "^2.88.0", - "rimraf": "^2.6.3", - "semver": "^5.7.1", - "tar": "^4.4.12", - "which": "^1.3.1" - } - }, - "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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - } - }, - "yargs-parser": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "electron-to-chromium": { - "version": "1.3.474", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.474.tgz", - "integrity": "sha512-fPkSgT9IBKmVJz02XioNsIpg0WYmkPrvU1lUJblMMJALxyE7/32NGvbJQKKxpNokozPvqfqkuUqVClYsvetcLw==", - "dev": true - }, - "element-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", - "integrity": "sha1-ZOXxWdlxIWMYRby67K8nnDm1404=" - }, - "elementary-circuits-directed-graph": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.2.0.tgz", - "integrity": "sha512-eOQofnrNqebPtC29PvyNMGUBdMrIw5i8nOoC/2VOlSF84tf5+ZXnRkIk7TgdT22jFXK68CC7aA881KRmNYf/Pg==", - "requires": { - "strongly-connected-components": "^1.0.1" - } - }, - "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==", - "dev": true, - "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-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "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=", - "dev": true - }, - "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": "0.9.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", - "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.2.0", - "tapable": "^0.1.8" - } - }, - "enquirer": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.5.tgz", - "integrity": "sha512-BNT1C08P9XD0vNg3J475yIUG+mVdp9T6towYFHUv897X0KoHBjB1shyrNmhmtHWKP17iSWgo7Gqh7BBuzLZMSA==", - "dev": true, - "requires": { - "ansi-colors": "^3.2.1" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - } - } - }, - "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" - }, - "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==", - "dev": true - }, - "enzyme": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", - "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", - "dev": true, - "requires": { - "array.prototype.flat": "^1.2.3", - "cheerio": "^1.0.0-rc.3", - "enzyme-shallow-equal": "^1.0.1", - "function.prototype.name": "^1.1.2", - "has": "^1.0.3", - "html-element-map": "^1.2.0", - "is-boolean-object": "^1.0.1", - "is-callable": "^1.1.5", - "is-number-object": "^1.0.4", - "is-regex": "^1.0.5", - "is-string": "^1.0.5", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.7.0", - "object-is": "^1.0.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.1", - "object.values": "^1.1.1", - "raf": "^3.4.1", - "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.2.1" - } - }, - "enzyme-adapter-react-16": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.2.tgz", - "integrity": "sha512-SkvDrb8xU3lSxID8Qic9rB8pvevDbLybxPK6D/vW7PrT0s2Cl/zJYuXvsd1EBTz0q4o3iqG3FJhpYz3nUNpM2Q==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.13.0", - "enzyme-shallow-equal": "^1.0.1", - "has": "^1.0.3", - "object.assign": "^4.1.0", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "react-is": "^16.12.0", - "react-test-renderer": "^16.0.0-0", - "semver": "^5.7.0" - } - }, - "enzyme-adapter-utils": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.0.tgz", - "integrity": "sha512-YuEtfQp76Lj5TG1NvtP2eGJnFKogk/zT70fyYHXK2j3v6CtuHqc8YmgH/vaiBfL8K1SgVVbQXtTcgQZFwzTVyQ==", - "dev": true, - "requires": { - "airbnb-prop-types": "^2.15.0", - "function.prototype.name": "^1.1.2", - "object.assign": "^4.1.0", - "object.fromentries": "^2.0.2", - "prop-types": "^15.7.2", - "semver": "^5.7.1" - } - }, - "enzyme-shallow-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.1.tgz", - "integrity": "sha512-hGA3i1so8OrYOZSM9whlkNmVHOicJpsjgTzC+wn2JMJXhq1oO4kA4bJ5MsfzSIcC71aLDKzJ6gZpIxrqt3QTAQ==", - "dev": true, - "requires": { - "has": "^1.0.3", - "object-is": "^1.0.2" - } - }, - "enzyme-to-json": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.5.0.tgz", - "integrity": "sha512-clusXRsiaQhG7+wtyc4t7MU8N3zCOgf4eY9+CeSenYzKlFST4lxerfOvnWd4SNaToKhkuba+w6m242YpQOS7eA==", - "dev": true, - "requires": { - "lodash": "^4.17.15", - "react-is": "^16.12.0" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "dependencies": { - "is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", - "requires": { - "has-symbols": "^1.0.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==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es2015-proxy": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/es2015-proxy/-/es2015-proxy-0.1.7.tgz", - "integrity": "sha1-2U0nvu0B/Jfuo5kHYYTtc+ML9hA=" - }, - "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-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "optional": true - }, - "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-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "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" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escape-carriage": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.0.tgz", - "integrity": "sha512-ATWi5MD8QlAGQOeMgI8zTp671BG8aKvAC0M7yenlxU4CRLGO/sKthxVUyjiOFKjHdIo+6dZZUNFgHFeVEaKfGQ==" - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "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=" - }, - "escodegen": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.2.tgz", - "integrity": "sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A==", - "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==", - "optional": true - } - } - }, - "eslint": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.2.0.tgz", - "integrity": "sha512-B3BtEyaDKC5MlfDa2Ha8/D6DsS4fju95zs0hjS3HdGazw+LNayai38A25qMppK37wWGWNYSPOR6oYzlz5MHsRQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.1.0", - "eslint-utils": "^2.0.0", - "eslint-visitor-keys": "^1.2.0", - "espree": "^7.1.0", - "esquery": "^1.2.0", - "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.4.1", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "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 - }, - "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" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "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" - } - }, - "strip-json-comments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "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 - } - } - }, - "eslint-config-airbnb": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.1.0.tgz", - "integrity": "sha512-kZFuQC/MPnH7KJp6v95xsLBf63G/w7YqdPfQ0MUanxQ7zcKUNG8j+sSY860g3NwCBOa62apw16J6pRN+AOgXzw==", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "^14.1.0", - "object.assign": "^4.1.0", - "object.entries": "^1.1.1" - } - }, - "eslint-config-airbnb-base": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", - "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.9", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2" - } - }, - "eslint-config-erb": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-erb/-/eslint-config-erb-0.3.0.tgz", - "integrity": "sha512-cndLCtBXqS4wPCSJbyUSGiZ6qzgxxevcF/uYxx1EOX7WElii73xhw8PEl1fagRvAS60vF5SMYwkFUlQynWyUAQ==", - "dev": true, - "requires": { - "babel-eslint": "^10.0.3" - } - }, - "eslint-config-prettier": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", - "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "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 - } - } - }, - "eslint-import-resolver-webpack": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.1.tgz", - "integrity": "sha512-O/sUAXk6GWrICiN8JUkkjdt9uZpqZHP+FVnTxtEILL6EZMaPSrnP4lGPSFwcKsv7O211maqq4Nz60+dh236hVg==", - "dev": true, - "requires": { - "array-find": "^1.0.0", - "debug": "^2.6.9", - "enhanced-resolve": "^0.9.1", - "find-root": "^1.1.0", - "has": "^1.0.3", - "interpret": "^1.2.0", - "lodash": "^4.17.15", - "node-libs-browser": "^1.0.0 || ^2.0.0", - "resolve": "^1.13.1", - "semver": "^5.7.1" - }, - "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 - } - } - }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "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" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "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==", - "dev": true, - "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=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-compat": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-3.7.0.tgz", - "integrity": "sha512-A3uzSYqUjNj6rMyaBuU3l8wSCadZjeZRZ7WF3eU9vUT0JItiqRysjmYELkHHCpH8l7wRprUu4MZPr37lFCw7iA==", - "dev": true, - "requires": { - "ast-metadata-inferer": "^0.2.0-0", - "browserslist": "^4.12.0", - "caniuse-db": "^1.0.30001059", - "core-js": "^3.6.5", - "lodash.memoize": "4.1.2", - "mdn-browser-compat-data": "^1.0.21", - "semver": "7.3.2" - }, - "dependencies": { - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "eslint-plugin-flowtype": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.1.3.tgz", - "integrity": "sha512-UU+BbIxBflqJ171yxbd/HcOktCmOdhXbchIVIq/yBvKpLZXvfzNDOyJGcnuQYLaH840hdoIdU/bqxhoW6I0rIQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15", - "string-natural-compare": "^3.0.1" - } - }, - "eslint-plugin-import": { - "version": "2.21.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz", - "integrity": "sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.3", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" - }, - "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" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-jest": { - "version": "23.13.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.13.2.tgz", - "integrity": "sha512-qZit+moTXTyZFNDqSIR88/L3rdBlTU7CuW6XmyErD2FfHEkdoLgThkRbiQjzgYnX6rfgLx3Ci4eJmF4Ui5v1Cw==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "^2.5.0" - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.4.5", - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", - "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" - } - }, - "eslint-plugin-prettier": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", - "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-plugin-promise": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", - "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", - "dev": true - }, - "eslint-plugin-react": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.0.tgz", - "integrity": "sha512-rqe1abd0vxMjmbPngo4NaYxTcR3Y4Hrmc/jg4T+sYz63yqlmJRknpEQfmWY+eDWPuMmix6iUIK+mv0zExjeLgA==", - "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", - "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" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.4.tgz", - "integrity": "sha512-equAdEIsUETLFNCmmCkiCGq6rkSK5MoJhXFPFYeUebcjKgBmWWcgVOqZyQC8Bv1BwVCnTq9tBxgJFgAJTWoJtA==", - "dev": true - }, - "eslint-plugin-testcafe": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testcafe/-/eslint-plugin-testcafe-0.2.1.tgz", - "integrity": "sha1-QIn2RtrbabE3agHX5ggYSQfmA2s=", - "dev": true - }, - "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz", - "integrity": "sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ==", - "dev": true - }, - "espree": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz", - "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==", - "dev": true, - "requires": { - "acorn": "^7.2.0", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.2.0" - }, - "dependencies": { - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", - "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.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", - "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==", - "dev": true, - "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=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "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==", - "dev": true, - "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": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.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" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "execall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", - "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", - "dev": true, - "requires": { - "clone-regexp": "^1.0.0" - } - }, - "exenv": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" - }, - "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=", - "dev": true, - "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==", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true - } - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "expect": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.0.1.tgz", - "integrity": "sha512-QcCy4nygHeqmbw564YxNbHTJlXh47dVID2BUP52cZFpLU9zHViMFK6h07cC1wf7GYCTIigTdAXhVua8Yl1FkKg==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.0.0", - "jest-matcher-utils": "^26.0.1", - "jest-message-util": "^26.0.1", - "jest-regex-util": "^26.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" - } - }, - "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" - } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "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 - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "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==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "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==", - "dev": true - } - } - }, - "extract-frustum-planes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz", - "integrity": "sha1-l9VwP/BWTIw8aDjKxF+ee8UsnvU=" - }, - "extract-text-webpack-plugin": { - "version": "4.0.0-beta.0", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz", - "integrity": "sha512-Hypkn9jUTnFr0DpekNam53X47tXn3ucY08BQumv7kdGgeVUBLq3DJHJTi6HNxv4jl9W+Skxjz9+RnK0sJyqqjA==", - "dev": true, - "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "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" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "falafel": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz", - "integrity": "sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==", - "requires": { - "acorn": "^7.1.1", - "foreach": "^2.0.5", - "isarray": "^2.0.1", - "object-keys": "^1.0.6" - }, - "dependencies": { - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==" - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } - } - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-async": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/fast-async/-/fast-async-7.0.6.tgz", - "integrity": "sha512-/iUa3eSQC+Xh5tN6QcVLsEsN7b1DaPIoTZo++VpLLIxtdNW2tEmMZex4TcrMeRnBwMOpZwue2CB171wjt5Kgqg==", - "requires": { - "@babel/generator": "^7.0.0-beta.44", - "@babel/helper-module-imports": "^7.0.0-beta.44", - "babylon": "^7.0.0-beta.44", - "nodent-runtime": "^3.2.1", - "nodent-transform": "^3.2.4" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.3.tgz", - "integrity": "sha512-fWSEEcoqcYqlFJrpSH5dJTwv6o0r+2bLAmnlne8OQMbFhpSTQXA8Ngp6q1DGA4B+eewHeuH5ndZeiV2qyXXNsA==", - "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" - } - }, - "fast-isnumeric": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz", - "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==", - "requires": { - "is-string-blank": "^1.0.1" - } - }, - "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=" - }, - "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "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" - } - }, - "fbjs-scripts": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz", - "integrity": "sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ==", - "dev": true, - "requires": { - "@babel/core": "^7.0.0", - "ansi-colors": "^1.0.1", - "babel-preset-fbjs": "^3.2.0", - "core-js": "^2.4.1", - "cross-spawn": "^5.1.0", - "fancy-log": "^1.3.2", - "object-assign": "^4.0.1", - "plugin-error": "^0.1.2", - "semver": "^5.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "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" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "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": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "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": "6.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", - "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "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" - } - }, - "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==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "file-saver": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.8.tgz", - "integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg==" - }, - "filelist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.1.tgz", - "integrity": "sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", - "dev": 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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "filtered-vector": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/filtered-vector/-/filtered-vector-1.2.4.tgz", - "integrity": "sha1-VkU8A030MC0pPKjs3qw/kKvGeNM=", - "requires": { - "binary-search-bounds": "^1.0.0", - "cubic-hermite": "^1.0.0" - }, - "dependencies": { - "binary-search-bounds": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", - "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=" - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "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 - } - } - }, - "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" - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "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==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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" - } - }, - "find-yarn-workspace-root": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz", - "integrity": "sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==", - "dev": true, - "requires": { - "fs-extra": "^4.0.3", - "micromatch": "^3.1.4" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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" - } - }, - "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==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, - "flatten-vertex-data": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", - "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", - "requires": { - "dtype": "^2.0.0" - } - }, - "flip-pixels": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flip-pixels/-/flip-pixels-1.0.2.tgz", - "integrity": "sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA==" - }, - "flow-bin": { - "version": "0.127.0", - "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.127.0.tgz", - "integrity": "sha512-ywvCCdV4NJWzrqjFrMU5tAiVGyBiXjsJQ1+/kj8thXyX15V17x8BFvNwoAH97NrUU8T1HzmFBjLzWc0l2319qg==", - "dev": true - }, - "flow-config-parser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/flow-config-parser/-/flow-config-parser-0.3.0.tgz", - "integrity": "sha1-cEkW77qIzSUYq02PkzB5VxJ2E48=", - "dev": true - }, - "flow-runtime": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/flow-runtime/-/flow-runtime-0.17.0.tgz", - "integrity": "sha512-x621HugMPrtU68ddiRX0TkNRif9PS6ml3oeP6oo0k+Kv2issqCmifC4ZX59XnLUh9dfmBcj4GoZJXu4oe8L28Q==", - "dev": true - }, - "flow-typed": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flow-typed/-/flow-typed-3.1.0.tgz", - "integrity": "sha512-y9AbG5/ZQDyCs2ROmJqYKUCornCPOLJQL06TE1TwNCGTzKYDqLgkYeINCthd9EL8FyzWkTLI0mOSL82dU20hJA==", - "dev": true, - "requires": { - "@octokit/rest": "^16.43.1", - "colors": "^1.4.0", - "flowgen": "^1.10.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.6", - "got": "^10.5.7", - "md5": "^2.2.1", - "mkdirp": "^1.0.3", - "prettier": "^1.19.1", - "rimraf": "^3.0.2", - "semver": "^7.1.3", - "table": "^5.4.6", - "through": "^2.3.8", - "unzipper": "^0.10.8", - "which": "^2.0.2", - "yargs": "^15.1.0" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", - "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", - "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.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" - } - }, - "cacheable-request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", - "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^2.0.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "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" - } - }, - "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" - } - }, - "decompress-response": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", - "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", - "dev": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, - "defer-to-connect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", - "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==", - "dev": true - }, - "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 - }, - "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" - } - }, - "got": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", - "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", - "dev": true, - "requires": { - "@sindresorhus/is": "^2.0.0", - "@szmarczak/http-timer": "^4.0.0", - "@types/cacheable-request": "^6.0.1", - "cacheable-lookup": "^2.0.0", - "cacheable-request": "^7.0.1", - "decompress-response": "^5.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^5.0.0", - "lowercase-keys": "^2.0.0", - "mimic-response": "^2.1.0", - "p-cancelable": "^2.0.0", - "p-event": "^4.0.0", - "responselike": "^2.0.0", - "to-readable-stream": "^2.0.0", - "type-fest": "^0.10.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 - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "keyv": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.1.tgz", - "integrity": "sha512-xz6Jv6oNkbhrFCvCP7HQa8AaII8y8LRpoSm661NOKLr4uHuBwhX4epXrPQgF3+xdJnN4Esm5X0xwY4bOlALOtw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true - }, - "p-cancelable": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", - "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", - "dev": true - }, - "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 - }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "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" - } - }, - "to-readable-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", - "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", - "dev": true - }, - "type-fest": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", - "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.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" - } - }, - "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" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "flowgen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/flowgen/-/flowgen-1.11.0.tgz", - "integrity": "sha512-WpoBjzcZadnAw5FatlUbvFWUWXkI2/LjrwTl5fl3MVDh+KdvYgFzgRXDDKH/O2uUlwjfpveiJJJx8TwL7Se84A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/highlight": "^7.9.0", - "commander": "^5.1.0", - "lodash": "^4.17.15", - "prettier": "^2.0.5", - "shelljs": "^0.8.4", - "typescript": "^3.4", - "typescript-compiler": "^1.4.1-2" - }, - "dependencies": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - } - } - }, - "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==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", - "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", - "dev": true, - "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==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "font-atlas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz", - "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==", - "requires": { - "css-font": "^1.0.0" - } - }, - "font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" - }, - "font-measure": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", - "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", - "requires": { - "css-font": "^1.2.0" - } - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "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=", - "dev": true - }, - "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-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "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" - }, - "dependencies": { - "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" - } - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "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.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function.prototype.name": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.2.tgz", - "integrity": "sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "functions-have-names": "^1.2.0" - } - }, - "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=" - }, - "functions-have-names": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.1.tgz", - "integrity": "sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA==", - "dev": true - }, - "gamma": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/gamma/-/gamma-0.1.0.tgz", - "integrity": "sha1-MxVkNAO/J5BsqAqzfDbs6UQO8zA=" - }, - "gather-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", - "integrity": "sha1-szmUr0V6gRVwDUEPMXczy+egkEs=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": 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" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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" - } - }, - "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" - } - }, - "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" - } - } - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "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 - }, - "geojson-vt": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", - "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" - }, - "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-canvas-context": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", - "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" - }, - "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-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "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 - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getopts": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz", - "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==", - "dev": true - }, - "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" - } - }, - "gl-axes3d": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/gl-axes3d/-/gl-axes3d-1.5.3.tgz", - "integrity": "sha512-KRYbguKQcDQ6PcB9g1pgqB8Ly4TY1DQODpPKiDTasyWJ8PxQk0t2Q7XoQQijNqvsguITCpVVCzNb5GVtIWiVlQ==", - "requires": { - "bit-twiddle": "^1.0.2", - "dup": "^1.0.0", - "extract-frustum-planes": "^1.0.0", - "gl-buffer": "^2.1.2", - "gl-mat4": "^1.2.0", - "gl-shader": "^4.2.1", - "gl-state": "^1.0.0", - "gl-vao": "^1.3.0", - "gl-vec4": "^1.0.1", - "glslify": "^7.0.0", - "robust-orientation": "^1.1.3", - "split-polygon": "^1.0.0", - "vectorize-text": "^3.2.1" - } - }, - "gl-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/gl-buffer/-/gl-buffer-2.1.2.tgz", - "integrity": "sha1-LbjZwaVSf7oM25EonCBuiCuInNs=", - "requires": { - "ndarray": "^1.0.15", - "ndarray-ops": "^1.1.0", - "typedarray-pool": "^1.0.0" - } - }, - "gl-cone3d": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/gl-cone3d/-/gl-cone3d-1.5.2.tgz", - "integrity": "sha512-1JNeHH4sUtUmDA4ZK7Om8/kShwb8IZVAsnxaaB7IPRJsNGciLj1sTpODrJGeMl41RNkex5kXD2SQFrzyEAR2Rw==", - "requires": { - "colormap": "^2.3.1", - "gl-buffer": "^2.1.2", - "gl-mat4": "^1.2.0", - "gl-shader": "^4.2.1", - "gl-texture2d": "^2.1.0", - "gl-vao": "^1.3.0", - "gl-vec3": "^1.1.3", - "glsl-inverse": "^1.0.0", - "glsl-out-of-range": "^1.0.4", - "glsl-specular-cook-torrance": "^2.0.1", - "glslify": "^7.0.0", - "ndarray": "^1.0.18" - } - }, - "gl-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gl-constants/-/gl-constants-1.0.0.tgz", - "integrity": "sha1-WXpQTjZHUP9QJTqjX43qevSl0jM=" - }, - "gl-contour2d": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/gl-contour2d/-/gl-contour2d-1.1.7.tgz", - "integrity": "sha512-GdebvJ9DtT3pJDpoE+eU2q+Wo9S3MijPpPz5arZbhK85w2bARmpFpVfPaDlZqWkB644W3BlH8TVyvAo1KE4Bhw==", - "requires": { - "binary-search-bounds": "^2.0.4", - "cdt2d": "^1.0.0", - "clean-pslg": "^1.1.2", - "gl-buffer": "^2.1.2", - "gl-shader": "^4.2.1", - "glslify": "^7.0.0", - "iota-array": "^1.0.0", - "ndarray": "^1.0.18", - "surface-nets": "^1.0.2" - } - }, - "gl-error3d": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/gl-error3d/-/gl-error3d-1.0.16.tgz", - "integrity": "sha512-TGJewnKSp7ZnqGgG3XCF9ldrDbxZrO+OWlx6oIet4OdOM//n8xJ5isArnIV/sdPJnFbhfoLxWrW9f5fxHFRQ1A==", - "requires": { - "gl-buffer": "^2.1.2", - "gl-shader": "^4.2.1", - "gl-vao": "^1.3.0", - "glsl-out-of-range": "^1.0.4", - "glslify": "^7.0.0" - } - }, - "gl-fbo": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/gl-fbo/-/gl-fbo-2.0.5.tgz", - "integrity": "sha1-D6daSXz3h2lVMGkcjwSrtvtV+iI=", - "requires": { - "gl-texture2d": "^2.0.0" - } - }, - "gl-format-compiler-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/gl-format-compiler-error/-/gl-format-compiler-error-1.0.3.tgz", - "integrity": "sha1-DHmxdRiZzpcy6GJA8JCqQemEcag=", - "requires": { - "add-line-numbers": "^1.0.1", - "gl-constants": "^1.0.0", - "glsl-shader-name": "^1.0.0", - "sprintf-js": "^1.0.3" - } - }, - "gl-heatmap2d": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/gl-heatmap2d/-/gl-heatmap2d-1.0.6.tgz", - "integrity": "sha512-+agzSv4R5vsaH+AGYVz5RVzBK10amqAa+Bwj205F13JjNSGS91M1L9Yb8zssCv2FIjpP+1Mp73cFBYrQFfS1Jg==", - "requires": { - "binary-search-bounds": "^2.0.4", - "gl-buffer": "^2.1.2", - "gl-shader": "^4.2.1", - "glslify": "^7.0.0", - "iota-array": "^1.0.0", - "typedarray-pool": "^1.1.0" - } - }, - "gl-line3d": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/gl-line3d/-/gl-line3d-1.2.1.tgz", - "integrity": "sha512-eeb0+RI2ZBRqMYJK85SgsRiJK7c4aiOjcnirxv0830A3jmOc99snY3AbPcV8KvKmW0Yaf3KA4e+qNCbHiTOTnA==", - "requires": { - "binary-search-bounds": "^2.0.4", - "gl-buffer": "^2.1.2", - "gl-shader": "^4.2.1", - "gl-texture2d": "^2.1.0", - "gl-vao": "^1.3.0", - "glsl-out-of-range": "^1.0.4", - "glslify": "^7.0.0", - "ndarray": "^1.0.18" - } - }, - "gl-mat2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gl-mat2/-/gl-mat2-1.0.1.tgz", - "integrity": "sha1-FCUFcwpcL+Hp8l2ezj0NbMJxCjA=" - }, - "gl-mat3": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gl-mat3/-/gl-mat3-1.0.0.tgz", - "integrity": "sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI=" - }, - "gl-mat4": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", - "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" - }, - "gl-matrix": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", - "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" - }, - "gl-matrix-invert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gl-matrix-invert/-/gl-matrix-invert-1.0.0.tgz", - "integrity": "sha1-o2173jZUxFkKEn7nxo9uE/6oxj0=", - "requires": { - "gl-mat2": "^1.0.0", - "gl-mat3": "^1.0.0", - "gl-mat4": "^1.0.0" - } - }, - "gl-mesh3d": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/gl-mesh3d/-/gl-mesh3d-2.3.1.tgz", - "integrity": "sha512-pXECamyGgu4/9HeAQSE5OEUuLBGS1aq9V4BCsTcxsND4fNLaajEkYKUz/WY2QSYElqKdsMBVsldGiKRKwlybqA==", - "requires": { - "barycentric": "^1.0.1", - "colormap": "^2.3.1", - "gl-buffer": "^2.1.2", - "gl-mat4": "^1.2.0", - "gl-shader": "^4.2.1", - "gl-texture2d": "^2.1.0", - "gl-vao": "^1.3.0", - "glsl-out-of-range": "^1.0.4", - "glsl-specular-cook-torrance": "^2.0.1", - "glslify": "^7.0.0", - "ndarray": "^1.0.18", - "normals": "^1.1.0", - "polytope-closest-point": "^1.0.0", - "simplicial-complex-contour": "^1.0.2", - "typedarray-pool": "^1.1.0" - } - }, - "gl-plot2d": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/gl-plot2d/-/gl-plot2d-1.4.4.tgz", - "integrity": "sha512-0UhKiiqeampLtydv6NMNrKEilc0Ui5oaJtvHLbLZ5u/1ttT1XjOY5Yk8LzfqozA/No4a9omxjSKnH+tvSn+rQQ==", - "requires": { - "binary-search-bounds": "^2.0.4", - "gl-buffer": "^2.1.2", - "gl-select-static": "^2.0.6", - "gl-shader": "^4.2.1", - "glsl-inverse": "^1.0.0", - "glslify": "^7.0.0", - "text-cache": "^4.2.2" - } - }, - "gl-plot3d": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-2.4.5.tgz", - "integrity": "sha512-cKAqMXFRHTCFxH8r1/ACdk5hyfnA9djfiAM8zVQrqu0qLEttUu0i1fq0pr+d5m0HPuNcK8wEc4F3VjL2hrDcGQ==", - "requires": { - "3d-view": "^2.0.0", - "a-big-triangle": "^1.0.3", - "gl-axes3d": "^1.5.3", - "gl-fbo": "^2.0.5", - "gl-mat4": "^1.2.0", - "gl-select-static": "^2.0.6", - "gl-shader": "^4.2.1", - "gl-spikes3d": "^1.0.10", - "glslify": "^7.0.0", - "has-passive-events": "^1.0.0", - "is-mobile": "^2.2.1", - "mouse-change": "^1.4.0", - "mouse-event-offset": "^3.0.2", - "mouse-wheel": "^1.2.0", - "ndarray": "^1.0.18", - "right-now": "^1.0.0" - } - }, - "gl-pointcloud2d": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/gl-pointcloud2d/-/gl-pointcloud2d-1.0.3.tgz", - "integrity": "sha512-OS2e1irvJXVRpg/GziXj10xrFJm9kkRfFoB6BLUvkjCQV7ZRNNcs2CD+YSK1r0gvMwTg2T3lfLM3UPwNtz+4Xw==", - "requires": { - "gl-buffer": "^2.1.2", - "gl-shader": "^4.2.1", - "glslify": "^7.0.0", - "typedarray-pool": "^1.1.0" - } - }, - "gl-quat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gl-quat/-/gl-quat-1.0.0.tgz", - "integrity": "sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU=", - "requires": { - "gl-mat3": "^1.0.0", - "gl-vec3": "^1.0.3", - "gl-vec4": "^1.0.0" - } - }, - "gl-scatter3d": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/gl-scatter3d/-/gl-scatter3d-1.2.3.tgz", - "integrity": "sha512-nXqPlT1w5Qt51dTksj+DUqrZqwWAEWg0PocsKcoDnVNv0X8sGA+LBZ0Y+zrA+KNXUL0PPCX9WR9cF2uJAZl1Sw==", - "requires": { - "gl-buffer": "^2.1.2", - "gl-mat4": "^1.2.0", - "gl-shader": "^4.2.1", - "gl-vao": "^1.3.0", - "glsl-out-of-range": "^1.0.4", - "glslify": "^7.0.0", - "is-string-blank": "^1.0.1", - "typedarray-pool": "^1.1.0", - "vectorize-text": "^3.2.1" - } - }, - "gl-select-box": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/gl-select-box/-/gl-select-box-1.0.4.tgz", - "integrity": "sha512-mKsCnglraSKyBbQiGq0Ila0WF+m6Tr+EWT2yfaMn/Sh9aMHq5Wt0F/l6Cf/Ed3CdERq5jHWAY5yxLviZteYu2w==", - "requires": { - "gl-buffer": "^2.1.2", - "gl-shader": "^4.2.1", - "glslify": "^7.0.0" - } - }, - "gl-select-static": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/gl-select-static/-/gl-select-static-2.0.6.tgz", - "integrity": "sha512-p4DmBG1DMo/47/fV3oqPcU6uTqHy0eI1vATH1fm8OVDqlzWnLv3786tdEunZWG6Br7DUdH6NgWhuy4gAlt+TAQ==", - "requires": { - "bit-twiddle": "^1.0.2", - "cwise": "^1.0.10", - "gl-fbo": "^2.0.5", - "ndarray": "^1.0.18", - "typedarray-pool": "^1.1.0" - } - }, - "gl-shader": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/gl-shader/-/gl-shader-4.2.1.tgz", - "integrity": "sha1-vJuAjpKTxRtmjojeYVsMETcI3C8=", - "requires": { - "gl-format-compiler-error": "^1.0.2", - "weakmap-shim": "^1.1.0" - } - }, - "gl-spikes2d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/gl-spikes2d/-/gl-spikes2d-1.0.2.tgz", - "integrity": "sha512-QVeOZsi9nQuJJl7NB3132CCv5KA10BWxAY2QgJNsKqbLsG53B/TrGJpjIAohnJftdZ4fT6b3ZojWgeaXk8bOOA==" - }, - "gl-spikes3d": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/gl-spikes3d/-/gl-spikes3d-1.0.10.tgz", - "integrity": "sha512-lT3xroowOFxMvlhT5Mof76B2TE02l5zt/NIWljhczV2FFHgIVhA4jMrd5dIv1so1RXMBDJIKu0uJI3QKliDVLg==", - "requires": { - "gl-buffer": "^2.1.2", - "gl-shader": "^4.2.1", - "gl-vao": "^1.3.0", - "glslify": "^7.0.0" - } - }, - "gl-state": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gl-state/-/gl-state-1.0.0.tgz", - "integrity": "sha1-Ji+qdYNbC5xTLBLzitxCXR0wzRc=", - "requires": { - "uniq": "^1.0.0" - } - }, - "gl-streamtube3d": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/gl-streamtube3d/-/gl-streamtube3d-1.4.1.tgz", - "integrity": "sha512-rH02v00kgwgdpkXVo7KsSoPp38bIAYR9TE1iONjcQ4cQAlDhrGRauqT/P5sUaOIzs17A2DxWGcXM+EpNQs9pUA==", - "requires": { - "gl-cone3d": "^1.5.2", - "gl-vec3": "^1.1.3", - "gl-vec4": "^1.0.1", - "glsl-inverse": "^1.0.0", - "glsl-out-of-range": "^1.0.4", - "glsl-specular-cook-torrance": "^2.0.1", - "glslify": "^7.0.0" - } - }, - "gl-surface3d": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/gl-surface3d/-/gl-surface3d-1.5.2.tgz", - "integrity": "sha512-rWSQwEQDkB0T5CDEDFJwJc4VgwwJaAyFRSJ92NJlrTSwDlsEsWdzG9+APx6FWJMwkOpIoZGWqv+csswK2kMMLQ==", - "requires": { - "binary-search-bounds": "^2.0.4", - "bit-twiddle": "^1.0.2", - "colormap": "^2.3.1", - "dup": "^1.0.0", - "gl-buffer": "^2.1.2", - "gl-mat4": "^1.2.0", - "gl-shader": "^4.2.1", - "gl-texture2d": "^2.1.0", - "gl-vao": "^1.3.0", - "glsl-out-of-range": "^1.0.4", - "glsl-specular-beckmann": "^1.1.2", - "glslify": "^7.0.0", - "ndarray": "^1.0.18", - "ndarray-gradient": "^1.0.0", - "ndarray-ops": "^1.2.2", - "ndarray-pack": "^1.2.1", - "ndarray-scratch": "^1.2.0", - "surface-nets": "^1.0.2", - "typedarray-pool": "^1.1.0" - } - }, - "gl-text": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.1.8.tgz", - "integrity": "sha512-whnq9DEFYbW92C4ONwk2eT0YkzmVPHoADnEtuzMOmit87XhgAhBrNs3lK9EgGjU/MoWYvlF6RkI8Kl7Yuo1hUw==", - "requires": { - "bit-twiddle": "^1.0.2", - "color-normalize": "^1.5.0", - "css-font": "^1.2.0", - "detect-kerning": "^2.1.2", - "es6-weak-map": "^2.0.3", - "flatten-vertex-data": "^1.0.2", - "font-atlas": "^2.1.0", - "font-measure": "^1.2.2", - "gl-util": "^3.1.2", - "is-plain-obj": "^1.1.0", - "object-assign": "^4.1.1", - "parse-rect": "^1.2.0", - "parse-unit": "^1.0.1", - "pick-by-alias": "^1.2.0", - "regl": "^1.3.11", - "to-px": "^1.0.1", - "typedarray-pool": "^1.1.0" - } - }, - "gl-texture2d": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/gl-texture2d/-/gl-texture2d-2.1.0.tgz", - "integrity": "sha1-/2gk5+fDGoum/c2+nlxpXX4hh8c=", - "requires": { - "ndarray": "^1.0.15", - "ndarray-ops": "^1.2.2", - "typedarray-pool": "^1.1.0" - } - }, - "gl-util": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz", - "integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==", - "requires": { - "is-browser": "^2.0.1", - "is-firefox": "^1.0.3", - "is-plain-obj": "^1.1.0", - "number-is-integer": "^1.0.1", - "object-assign": "^4.1.0", - "pick-by-alias": "^1.2.0", - "weak-map": "^1.0.5" - } - }, - "gl-vao": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/gl-vao/-/gl-vao-1.3.0.tgz", - "integrity": "sha1-6ekqqVWIyrnVwvBLaTRAw99pGSM=" - }, - "gl-vec3": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gl-vec3/-/gl-vec3-1.1.3.tgz", - "integrity": "sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw==" - }, - "gl-vec4": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gl-vec4/-/gl-vec4-1.0.1.tgz", - "integrity": "sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ=" - }, - "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-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^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==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "global-agent": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.12.tgz", - "integrity": "sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.1", - "core-js": "^3.6.5", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "dependencies": { - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", - "dev": true, - "optional": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "optional": true - } - } - }, - "global-dirs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", - "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", - "dev": true, - "requires": { - "ini": "^1.3.5" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "global-tunnel-ng": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", - "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", - "dev": true, - "optional": true, - "requires": { - "encodeurl": "^1.0.2", - "lodash": "^4.17.10", - "npm-conf": "^1.1.3", - "tunnel": "^0.0.6" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globalthis": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", - "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", - "dev": true, - "optional": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "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=", - "dev": true - } - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", - "dev": true - }, - "globule": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", - "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "glsl-inject-defines": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", - "integrity": "sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q=", - "requires": { - "glsl-token-inject-block": "^1.0.0", - "glsl-token-string": "^1.0.1", - "glsl-tokenizer": "^2.0.2" - } - }, - "glsl-inverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-inverse/-/glsl-inverse-1.0.0.tgz", - "integrity": "sha1-EsCx0GX1WERNHm/q95td34qRiuY=" - }, - "glsl-out-of-range": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/glsl-out-of-range/-/glsl-out-of-range-1.0.4.tgz", - "integrity": "sha512-fCcDu2LCQ39VBvfe1FbhuazXEf0CqMZI9OYXrYlL6uUARG48CTAbL04+tZBtVM0zo1Ljx4OLu2AxNquq++lxWQ==" - }, - "glsl-resolve": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", - "integrity": "sha1-iUvvc5ENeSyBtRQxgANdCnivdtM=", - "requires": { - "resolve": "^0.6.1", - "xtend": "^2.1.2" - }, - "dependencies": { - "resolve": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", - "integrity": "sha1-3ZV5gufnNt699TtYpN2RdUV13UY=" - }, - "xtend": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=" - } - } - }, - "glsl-shader-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-shader-name/-/glsl-shader-name-1.0.0.tgz", - "integrity": "sha1-osMLO6c0mb77DMcYTXx3M91LSH0=", - "requires": { - "atob-lite": "^1.0.0", - "glsl-tokenizer": "^2.0.2" - } - }, - "glsl-specular-beckmann": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glsl-specular-beckmann/-/glsl-specular-beckmann-1.1.2.tgz", - "integrity": "sha1-/OkFaTPs3yRWJ4N2pU0IKJPndfE=" - }, - "glsl-specular-cook-torrance": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/glsl-specular-cook-torrance/-/glsl-specular-cook-torrance-2.0.1.tgz", - "integrity": "sha1-qJHMBsjHtPRyhwK0gk/ay7ln148=", - "requires": { - "glsl-specular-beckmann": "^1.1.1" - } - }, - "glsl-token-assignments": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", - "integrity": "sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8=" - }, - "glsl-token-defines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", - "integrity": "sha1-y4kqqVmTYjFyhHDU90AySJaX+p0=", - "requires": { - "glsl-tokenizer": "^2.0.0" - } - }, - "glsl-token-depth": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", - "integrity": "sha1-I8XjDuK9JViEtKKLyFC495HpXYQ=" - }, - "glsl-token-descope": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", - "integrity": "sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY=", - "requires": { - "glsl-token-assignments": "^2.0.0", - "glsl-token-depth": "^1.1.0", - "glsl-token-properties": "^1.0.0", - "glsl-token-scope": "^1.1.0" - } - }, - "glsl-token-inject-block": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", - "integrity": "sha1-4QFfWYDBCRgkraomJfHf3ovQADQ=" - }, - "glsl-token-properties": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", - "integrity": "sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4=" - }, - "glsl-token-scope": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", - "integrity": "sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E=" - }, - "glsl-token-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", - "integrity": "sha1-WUQdL4V958NEnJRWZgIezjWOSOw=" - }, - "glsl-token-whitespace-trim": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", - "integrity": "sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA=" - }, - "glsl-tokenizer": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", - "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", - "requires": { - "through2": "^0.6.3" - } - }, - "glslify": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.0.0.tgz", - "integrity": "sha512-yw8jDQIe9FlSH5NiZEqSAsCPj9HI7nhXgXLAgSv2Nm9eBPsFJmyN9+rNwbiozJapcj9xtc/71rMYlN9cxp1B8Q==", - "requires": { - "bl": "^1.0.0", - "concat-stream": "^1.5.2", - "duplexify": "^3.4.5", - "falafel": "^2.1.0", - "from2": "^2.3.0", - "glsl-resolve": "0.0.1", - "glsl-token-whitespace-trim": "^1.0.0", - "glslify-bundle": "^5.0.0", - "glslify-deps": "^1.2.5", - "minimist": "^1.2.0", - "resolve": "^1.1.5", - "stack-trace": "0.0.9", - "static-eval": "^2.0.0", - "through2": "^2.0.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "glslify-bundle": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", - "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", - "requires": { - "glsl-inject-defines": "^1.0.1", - "glsl-token-defines": "^1.0.0", - "glsl-token-depth": "^1.1.1", - "glsl-token-descope": "^1.0.2", - "glsl-token-scope": "^1.1.1", - "glsl-token-string": "^1.0.1", - "glsl-token-whitespace-trim": "^1.0.0", - "glsl-tokenizer": "^2.0.2", - "murmurhash-js": "^1.0.0", - "shallow-copy": "0.0.1" - } - }, - "glslify-deps": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.1.tgz", - "integrity": "sha512-Ogm179MCazwIRyEqs3g3EOY4Y3XIAa0yl8J5RE9rJC6QH1w8weVOp2RZu0mvnYy/2xIas1w166YR2eZdDkWQxg==", - "requires": { - "@choojs/findup": "^0.2.0", - "events": "^1.0.2", - "glsl-resolve": "0.0.1", - "glsl-tokenizer": "^2.0.0", - "graceful-fs": "^4.1.2", - "inherits": "^2.0.1", - "map-limit": "0.0.1", - "resolve": "^1.0.0" - } - }, - "gonzales-pe": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "grid-index": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", - "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" - }, - "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 - }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "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" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "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==" - }, - "has-hover": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", - "integrity": "sha1-PZdDeusZnGK4rAisvcU9O8UsF/c=", - "requires": { - "is-browser": "^2.0.1" - } - }, - "has-passive-events": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", - "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", - "requires": { - "is-browser": "^2.0.1" - } - }, - "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-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hazardous": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/hazardous/-/hazardous-0.3.0.tgz", - "integrity": "sha512-VLSlBMoLTnfScKBJTycufZ2OHLO06eS3Q0mxNdHJ+egd1QLqeLitxDeGeUuoIgOqSPer+uqZCxiv43a1EVmwdg==", - "requires": { - "callsite": "^1.0.0" - } - }, - "highlight.js": { - "version": "9.18.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz", - "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==" - }, - "history": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.0.0.tgz", - "integrity": "sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg==", - "requires": { - "@babel/runtime": "^7.7.6" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - } - }, - "home-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-dir/-/home-dir-1.0.0.tgz", - "integrity": "sha1-KRfrRL3JByztqUJXlUOEfjAX/k4=" - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "dev": true - }, - "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==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsluv": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", - "integrity": "sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw=" - }, - "html-element-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.2.0.tgz", - "integrity": "sha512-0uXq8HsuG1v2TmQ8QkIhzbrqeskE4kn52Q18QJ9iAA/SnHoEKXWiUxHQtclRsCFWEUD2So34X+0+pZZu862nnw==", - "dev": true, - "requires": { - "array-filter": "^1.0.0" - } - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", - "dev": true - }, - "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 - }, - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", - "dev": true - }, - "html-to-react": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.4.3.tgz", - "integrity": "sha512-txe09A3vxW8yEZGJXJ1is5gGDfBEVACmZDSgwDyH5EsfRdOubBwBCg63ZThZP0xBn0UE4FyvMXZXmohusCxDcg==", - "requires": { - "domhandler": "^3.0", - "htmlparser2": "^4.1.0", - "lodash.camelcase": "^4.3.0", - "ramda": "^0.27" - } - }, - "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-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "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==", - "dev": true, - "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=", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "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=", - "dev": true - }, - "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 - }, - "humanize-plus": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/humanize-plus/-/humanize-plus-1.8.2.tgz", - "integrity": "sha1-pls0RZrWNnrbs3B6gqPJ+RYWcDA=" - }, - "husky": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", - "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.6.0", - "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" - } - }, - "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==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "dev": true, - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "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": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "image-palette": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/image-palette/-/image-palette-2.1.0.tgz", - "integrity": "sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ==", - "requires": { - "color-id": "^1.1.0", - "pxls": "^2.0.0", - "quantize": "^1.0.2" - } - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, - "immutable": { - "version": "4.0.0-rc.12", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz", - "integrity": "sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==" - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "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" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "in-publish": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", - "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", - "dev": true - }, - "incremental-convex-hull": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz", - "integrity": "sha1-UUKMFMudmmFEv+abKFH7N3M0vh4=", - "requires": { - "robust-orientation": "^1.1.2", - "simplicial-complex": "^1.0.0" - } - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "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==" - }, - "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.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.2.0.tgz", - "integrity": "sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ==", - "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-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" - } - }, - "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 - }, - "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" - } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "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" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "interval-tree-1d": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interval-tree-1d/-/interval-tree-1d-1.0.3.tgz", - "integrity": "sha1-j9veArayx9verWNry+2OCHENhcE=", - "requires": { - "binary-search-bounds": "^1.0.0" - }, - "dependencies": { - "binary-search-bounds": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", - "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=" - } - } - }, - "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" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "invert-permutation": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-permutation/-/invert-permutation-1.0.0.tgz", - "integrity": "sha1-oKeAQurbNrwXVR54fv0UOa3VSTM=" - }, - "iota-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", - "integrity": "sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc=" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", - "dev": true - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", - "dev": true - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-base64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-base64/-/is-base64-0.1.0.tgz", - "integrity": "sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg==" - }, - "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==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-blob": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz", - "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==" - }, - "is-boolean-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", - "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", - "dev": true - }, - "is-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", - "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" - }, - "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.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "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==" - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "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==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "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==", - "dev": true, - "optional": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" - }, - "is-firefox": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", - "integrity": "sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI=" - }, - "is-float-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-float-array/-/is-float-array-1.0.0.tgz", - "integrity": "sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ==" - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, - "is-iexplorer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", - "integrity": "sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY=" - }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - } - }, - "is-mobile": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.1.tgz", - "integrity": "sha512-6zELsfVFr326eq2CI53yvqq6YBanOxKBybwDT+MbMS2laBnK6Ez8m5XHSuTQQbnKRfpDzCod1CMWW5q3wZYMvA==" - }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - }, - "dependencies": { - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - } - } - }, - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "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==", - "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": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "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-string-blank": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", - "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==" - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, - "is-supported-regexp-flag": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz", - "integrity": "sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==", - "dev": true - }, - "is-svg-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz", - "integrity": "sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA=" - }, - "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==", - "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=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" - }, - "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==", - "dev": true - }, - "is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isbinaryfile": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", - "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", - "dev": true - }, - "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=", - "dev": true - }, - "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.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.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 - } - } - }, - "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" - } - }, - "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" - } - }, - "jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", - "dev": true, - "requires": { - "async": "0.9.x", - "chalk": "^2.4.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "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==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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" - } - } - } - }, - "jest": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.0.1.tgz", - "integrity": "sha512-29Q54kn5Bm7ZGKIuH2JRmnKl85YRigp0o0asTc6Sb6l2ch1DCXIeZTLLFy9ultJvhkTqbswF5DEx4+RlkmCxWg==", - "dev": true, - "requires": { - "@jest/core": "^26.0.1", - "import-local": "^3.0.2", - "jest-cli": "^26.0.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 - }, - "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" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "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" - } - }, - "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" - } - }, - "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 - }, - "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 - }, - "jest-cli": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.0.1.tgz", - "integrity": "sha512-pFLfSOBcbG9iOZWaMK4Een+tTxi/Wcm34geqZEqrst9cZDkTQ1LZ2CnBrTlHWuYAiTMFr0EQeK52ScyFU8wK+w==", - "dev": true, - "requires": { - "@jest/core": "^26.0.1", - "@jest/test-result": "^26.0.1", - "@jest/types": "^26.0.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.0.1", - "jest-util": "^26.0.1", - "jest-validate": "^26.0.1", - "prompts": "^2.0.1", - "yargs": "^15.3.1" - } - }, - "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" - } - }, - "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" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-changed-files": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.0.1.tgz", - "integrity": "sha512-q8LP9Sint17HaE2LjxQXL+oYWW/WeeXMPE2+Op9X3mY8IEGFVc14xRxFjUuXUbcPAlDLhtWdIEt59GdQbn76Hw==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "execa": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", - "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "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" - } - }, - "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 - }, - "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 - }, - "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" - } - }, - "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" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - } - } - }, - "jest-config": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.0.1.tgz", - "integrity": "sha512-9mWKx2L1LFgOXlDsC4YSeavnblN6A4CPfXFiobq+YYLaBMymA/SczN7xYTSmLaEYHZOcB98UdoN4m5uNt6tztg==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.0.1", - "@jest/types": "^26.0.1", - "babel-jest": "^26.0.1", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.0.1", - "jest-environment-node": "^26.0.1", - "jest-get-type": "^26.0.0", - "jest-jasmine2": "^26.0.1", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.0.1", - "jest-util": "^26.0.1", - "jest-validate": "^26.0.1", - "micromatch": "^4.0.2", - "pretty-format": "^26.0.1" - } - }, - "jest-diff": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.0.1.tgz", - "integrity": "sha512-odTcHyl5X+U+QsczJmOjWw5tPvww+y9Yim5xzqxVl/R1j4z71+fHW4g8qu1ugMmKdFdxw+AtQgs5mupPnzcIBQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.0.0", - "jest-get-type": "^26.0.0", - "pretty-format": "^26.0.1" - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.0.1.tgz", - "integrity": "sha512-OTgJlwXCAR8NIWaXFL5DBbeS4QIYPuNASkzSwMCJO+ywo9BEa6TqkaSWsfR7VdbMLdgYJqSfQcIyjJCNwl5n4Q==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1", - "chalk": "^4.0.0", - "jest-get-type": "^26.0.0", - "jest-util": "^26.0.1", - "pretty-format": "^26.0.1" - } - }, - "jest-environment-jsdom": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.0.1.tgz", - "integrity": "sha512-u88NJa3aptz2Xix2pFhihRBAatwZHWwSiRLBDBQE1cdJvDjPvv7ZGA0NQBxWwDDn7D0g1uHqxM8aGgfA9Bx49g==", - "dev": true, - "requires": { - "@jest/environment": "^26.0.1", - "@jest/fake-timers": "^26.0.1", - "@jest/types": "^26.0.1", - "jest-mock": "^26.0.1", - "jest-util": "^26.0.1", - "jsdom": "^16.2.2" - } - }, - "jest-environment-node": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.0.1.tgz", - "integrity": "sha512-4FRBWcSn5yVo0KtNav7+5NH5Z/tEgDLp7VRQVS5tCouWORxj+nI+1tOLutM07Zb2Qi7ja+HEDoOUkjBSWZg/IQ==", - "dev": true, - "requires": { - "@jest/environment": "^26.0.1", - "@jest/fake-timers": "^26.0.1", - "@jest/types": "^26.0.1", - "jest-mock": "^26.0.1", - "jest-util": "^26.0.1" - } - }, - "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", - "dev": true - }, - "jest-haste-map": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.0.1.tgz", - "integrity": "sha512-J9kBl/EdjmDsvyv7CiyKY5+DsTvVOScenprz/fGqfLg/pm1gdjbwwQ98nW0t+OIt+f+5nAVaElvn/6wP5KO7KA==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1", - "@types/graceful-fs": "^4.1.2", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-serializer": "^26.0.0", - "jest-util": "^26.0.1", - "jest-worker": "^26.0.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" - }, - "dependencies": { - "jest-worker": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", - "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-jasmine2": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.0.1.tgz", - "integrity": "sha512-ILaRyiWxiXOJ+RWTKupzQWwnPaeXPIoLS5uW41h18varJzd9/7I0QJGqg69fhTT1ev9JpSSo9QtalriUN0oqOg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.0.1", - "@jest/source-map": "^26.0.0", - "@jest/test-result": "^26.0.1", - "@jest/types": "^26.0.1", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.0.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.0.1", - "jest-matcher-utils": "^26.0.1", - "jest-message-util": "^26.0.1", - "jest-runtime": "^26.0.1", - "jest-snapshot": "^26.0.1", - "jest-util": "^26.0.1", - "pretty-format": "^26.0.1", - "throat": "^5.0.0" - } - }, - "jest-leak-detector": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.0.1.tgz", - "integrity": "sha512-93FR8tJhaYIWrWsbmVN1pQ9ZNlbgRpfvrnw5LmgLRX0ckOJ8ut/I35CL7awi2ecq6Ca4lL59bEK9hr7nqoHWPA==", - "dev": true, - "requires": { - "jest-get-type": "^26.0.0", - "pretty-format": "^26.0.1" - } - }, - "jest-matcher-utils": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.0.1.tgz", - "integrity": "sha512-PUMlsLth0Azen8Q2WFTwnSkGh2JZ8FYuwijC8NR47vXKpsrKmA1wWvgcj1CquuVfcYiDEdj985u5Wmg7COEARw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.0.1", - "jest-get-type": "^26.0.0", - "pretty-format": "^26.0.1" - } - }, - "jest-message-util": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.0.1.tgz", - "integrity": "sha512-CbK8uQREZ8umUfo8+zgIfEt+W7HAHjQCoRaNs4WxKGhAYBGwEyvxuK81FXa7VeB9pwDEXeeKOB2qcsNVCAvB7Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.0.1", - "@types/stack-utils": "^1.0.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - } - }, - "jest-mock": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.0.1.tgz", - "integrity": "sha512-MpYTBqycuPYSY6xKJognV7Ja46/TeRbAZept987Zp+tuJvMN0YBWyyhG9mXyYQaU3SBI0TUlSaO5L3p49agw7Q==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1" - } - }, - "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": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.0.1.tgz", - "integrity": "sha512-6jWxk0IKZkPIVTvq6s72RH735P8f9eCJW3IM5CX/SJFeKq1p2cZx0U49wf/SdMlhaB/anann5J2nCJj6HrbezQ==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.1", - "jest-util": "^26.0.1", - "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", - "slash": "^3.0.0" - }, - "dependencies": { - "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" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "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 - } - } - }, - "jest-resolve-dependencies": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.0.1.tgz", - "integrity": "sha512-9d5/RS/ft0vB/qy7jct/qAhzJsr6fRQJyGAFigK3XD4hf9kIbEH5gks4t4Z7kyMRhowU6HWm/o8ILqhaHdSqLw==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.0.1" - } - }, - "jest-runner": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.0.1.tgz", - "integrity": "sha512-CApm0g81b49Znm4cZekYQK67zY7kkB4umOlI2Dx5CwKAzdgw75EN+ozBHRvxBzwo1ZLYZ07TFxkaPm+1t4d8jA==", - "dev": true, - "requires": { - "@jest/console": "^26.0.1", - "@jest/environment": "^26.0.1", - "@jest/test-result": "^26.0.1", - "@jest/types": "^26.0.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.0.1", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.0.1", - "jest-jasmine2": "^26.0.1", - "jest-leak-detector": "^26.0.1", - "jest-message-util": "^26.0.1", - "jest-resolve": "^26.0.1", - "jest-runtime": "^26.0.1", - "jest-util": "^26.0.1", - "jest-worker": "^26.0.0", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "jest-worker": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", - "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - } - } - }, - "jest-runtime": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.0.1.tgz", - "integrity": "sha512-Ci2QhYFmANg5qaXWf78T2Pfo6GtmIBn2rRaLnklRyEucmPccmCKvS9JPljcmtVamsdMmkyNkVFb9pBTD6si9Lw==", - "dev": true, - "requires": { - "@jest/console": "^26.0.1", - "@jest/environment": "^26.0.1", - "@jest/fake-timers": "^26.0.1", - "@jest/globals": "^26.0.1", - "@jest/source-map": "^26.0.0", - "@jest/test-result": "^26.0.1", - "@jest/transform": "^26.0.1", - "@jest/types": "^26.0.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.0.1", - "jest-haste-map": "^26.0.1", - "jest-message-util": "^26.0.1", - "jest-mock": "^26.0.1", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.0.1", - "jest-snapshot": "^26.0.1", - "jest-util": "^26.0.1", - "jest-validate": "^26.0.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.3.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 - }, - "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" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "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" - } - }, - "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" - } - }, - "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 - }, - "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" - } - }, - "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 - }, - "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" - } - }, - "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" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-serializer": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.0.0.tgz", - "integrity": "sha512-sQGXLdEGWFAE4wIJ2ZaIDb+ikETlUirEOBsLXdoBbeLhTHkZUJwgk3+M8eyFizhM6le43PDCCKPA1hzkSDo4cQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.0.1.tgz", - "integrity": "sha512-jxd+cF7+LL+a80qh6TAnTLUZHyQoWwEHSUFJjkw35u3Gx+BZUNuXhYvDqHXr62UQPnWo2P6fvQlLjsU93UKyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.0.1", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.0.1", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.0.1", - "jest-get-type": "^26.0.0", - "jest-matcher-utils": "^26.0.1", - "jest-message-util": "^26.0.1", - "jest-resolve": "^26.0.1", - "make-dir": "^3.0.0", - "natural-compare": "^1.4.0", - "pretty-format": "^26.0.1", - "semver": "^7.3.2" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "jest-util": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.0.1.tgz", - "integrity": "sha512-byQ3n7ad1BO/WyFkYvlWQHTsomB6GIewBh8tlGtusiylAlaxQ1UpS0XYH0ngOyhZuHVLN79Qvl6/pMiDMSSG1g==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "make-dir": "^3.0.0" - } - }, - "jest-validate": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.0.1.tgz", - "integrity": "sha512-u0xRc+rbmov/VqXnX3DlkxD74rHI/CfS5xaV2VpeaVySjbb1JioNVOyly5b56q2l9ZKe7bVG5qWmjfctkQb0bA==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.0.0", - "leven": "^3.1.0", - "pretty-format": "^26.0.1" - }, - "dependencies": { - "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.0.1.tgz", - "integrity": "sha512-pdZPydsS8475f89kGswaNsN3rhP6lnC3/QDCppP7bg1L9JQz7oU9Mb/5xPETk1RHDCWeqmVC47M4K5RR7ejxFw==", - "dev": true, - "requires": { - "@jest/test-result": "^26.0.1", - "@jest/types": "^26.0.1", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.0.1", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", - "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" - }, - "js-base64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", - "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", - "dev": true - }, - "js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.2.2.tgz", - "integrity": "sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.0.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", - "dev": true - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "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==", - "dev": true - }, - "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-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "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 - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonfilter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/jsonfilter/-/jsonfilter-1.1.2.tgz", - "integrity": "sha1-Ie987cdRk4E8dZMulqmL4gW6WhE=", - "dev": true, - "requires": { - "JSONStream": "^0.8.4", - "minimist": "^1.1.0", - "stream-combiner": "^0.2.1", - "through2": "^0.6.3" - } - }, - "jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", - "dev": true - }, - "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.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" - } - }, - "jszip": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", - "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, - "jupyter-paths": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/jupyter-paths/-/jupyter-paths-2.0.3.tgz", - "integrity": "sha512-cQuCfHtKINnwiVTu1Ljm7Pk+tRZiV2wJkZLn0fUmZIJ76v9cIw/nu3PXgUYZ3T120eYxg6oELRxGkXianCowZQ==", - "requires": { - "home-dir": "^1.0.0" - } - }, - "just-extend": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", - "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", - "dev": true - }, - "kdbush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", - "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" - }, - "kernelspecs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kernelspecs/-/kernelspecs-2.0.0.tgz", - "integrity": "sha512-lce4pPDrs4VdxKYTEBnGLT81A3yNP8syyMAq5AejE+CKAkiXQXrHZaHO1F4c/RmgkKKF1Otis1XrpBxOOQsdnw==", - "requires": { - "jupyter-paths": "^2.0.0" - } - }, - "keyboard-key": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keyboard-key/-/keyboard-key-1.1.0.tgz", - "integrity": "sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ==" - }, - "keyboardevent-from-electron-accelerator": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz", - "integrity": "sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA==" - }, - "keyboardevents-areequal": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", - "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==" - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "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" - } - }, - "klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "known-css-properties": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.2.0.tgz", - "integrity": "sha512-UTCzU28rRI9wkb8qSGoZa9pgWvxr4LjP2MEhi9XHb/1XMOJy0uTnIxaxzj8My/PORG+kQG6VzAcGvRw66eIOfA==", - "dev": true - }, - "lab.js": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/lab.js/-/lab.js-20.0.1.tgz", - "integrity": "sha512-+j8g+SiAhDdhctFcxaQ2EjTkvijWyDXkssrnvTaaJBXdJazBeK2KYnPrgTXx6aAHnGAK13uDtg6l0xVF99NfWQ==", - "requires": { - "@babel/runtime": "^7.8.0", - "common-tags": "^1.8.0", - "core-js": "^3.6.1", - "cross-env": "^5.2.0", - "es2015-proxy": "^0.1.7", - "es6-promise": "^4.1.0", - "fast-async": "^7.0.0", - "file-saver": "^1.3.8", - "lodash": "^4.17.10", - "nodent": "^3.2.6", - "seedrandom": "^3.0.5", - "shim-keyboard-event-key": "^1.0.2", - "terser-webpack-plugin": "^2.3.5", - "ua-parser-js": "^0.7.19", - "whatwg-fetch": "^2.0.4" - }, - "dependencies": { - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" - }, - "cross-env": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz", - "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==", - "requires": { - "cross-spawn": "^6.0.5" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lazy-val": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", - "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "ldjson-stream": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz", - "integrity": "sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=", - "dev": true, - "requires": { - "split2": "^0.2.1", - "through2": "^0.6.1" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" - }, - "lerp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/lerp/-/lerp-1.0.3.tgz", - "integrity": "sha1-oYyJaPkXiW3hXM/MKNVaa3Med24=" - }, - "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 - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "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.2.10", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.10.tgz", - "integrity": "sha512-dgelFaNH6puUGAcU+OVMgbfpKSerNYsPSn6+nlbRDjovL0KigpsVpCu0PFZG6BJxX8gnHJqaZlR9krZamQsb0w==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "cli-truncate": "2.1.0", - "commander": "^5.1.0", - "cosmiconfig": "^6.0.0", - "debug": "^4.1.1", - "dedent": "^0.7.0", - "enquirer": "^2.3.5", - "execa": "^4.0.1", - "listr2": "^2.1.0", - "log-symbols": "^4.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": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - }, - "execa": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", - "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "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" - } - }, - "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 - }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "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" - } - }, - "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" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - } - } - }, - "listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", - "dev": true - }, - "listr2": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.1.7.tgz", - "integrity": "sha512-XCC1sWLkBFFIMIRwG/LedgHUzN2XLEo02ZqXn6fwuP0GlXGE5BCuL6EAbQFb4vZB+++YEonzEXDPWQe+jCoF6Q==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "cli-truncate": "^2.1.0", - "figures": "^3.2.0", - "indent-string": "^4.0.0", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rxjs": "^6.5.5", - "through": "^2.3.8" - }, - "dependencies": { - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - } - } - }, - "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=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "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": "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" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" - }, - "lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.flow": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.has": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", - "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", - "dev": true - }, - "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.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "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==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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" - } - } - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-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" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "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" - } - }, - "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 - }, - "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" - } - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "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" - } - } - } - }, - "loglevel": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", - "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", - "dev": true - }, - "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" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "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" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "macos-release": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", - "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==", - "dev": true - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "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" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-limit": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", - "integrity": "sha1-63lhAxwPDo0AG/LVb6toXViCLzg=", - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "requires": { - "wrappy": "1" - } - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "mapbox-gl": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.10.1.tgz", - "integrity": "sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg==", - "requires": { - "@mapbox/geojson-rewind": "^0.5.0", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "minimist": "^1.2.5", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.0.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - } - }, - "marching-simplex-table": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/marching-simplex-table/-/marching-simplex-table-1.0.0.tgz", - "integrity": "sha1-vBYlbg+Pm1WKqbKHL4gy2UM/Uuo=", - "requires": { - "convex-hull": "^1.0.3" - } - }, - "markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" - }, - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "requires": { - "repeat-string": "^1.0.0" - } - }, - "mat4-decompose": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mat4-decompose/-/mat4-decompose-1.0.4.tgz", - "integrity": "sha1-ZetP451wh496RE60Yk1S9+frL68=", - "requires": { - "gl-mat4": "^1.0.1", - "gl-vec3": "^1.0.2" - } - }, - "mat4-interpolate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz", - "integrity": "sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q=", - "requires": { - "gl-mat4": "^1.0.1", - "gl-vec3": "^1.0.2", - "mat4-decompose": "^1.0.3", - "mat4-recompose": "^1.0.3", - "quat-slerp": "^1.0.0" - } - }, - "mat4-recompose": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mat4-recompose/-/mat4-recompose-1.0.4.tgz", - "integrity": "sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0=", - "requires": { - "gl-mat4": "^1.0.1" - } - }, - "matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "optional": true, - "requires": { - "escape-string-regexp": "^4.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "optional": true - } - } - }, - "math-log2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", - "integrity": "sha1-+4lBvl9evol55xjmJzsXjlhpRWU=" - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", - "dev": true - }, - "matrix-camera-controller": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/matrix-camera-controller/-/matrix-camera-controller-2.1.3.tgz", - "integrity": "sha1-NeUmDMHNVQliunmfLY1OlLGjk3A=", - "requires": { - "binary-search-bounds": "^1.0.0", - "gl-mat4": "^1.1.2", - "gl-vec3": "^1.0.3", - "mat4-interpolate": "^1.0.3" - }, - "dependencies": { - "binary-search-bounds": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", - "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=" - } - } - }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "dev": true, - "requires": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - } - }, - "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==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdast-add-list-metadata": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz", - "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==", - "requires": { - "unist-util-visit-parents": "1.1.2" - } - }, - "mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", - "dev": true, - "requires": { - "unist-util-visit": "^2.0.0" - }, - "dependencies": { - "unist-util-is": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", - "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==", - "dev": true - }, - "unist-util-visit": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz", - "integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz", - "integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - } - } - }, - "mdn-browser-compat-data": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.25.tgz", - "integrity": "sha512-4klqILpitRnmWRai5Ols/GXP1eGDYMluAcBRoNZnGNkV2OnkDmpA9hUlM+9pTFym5FGDO5TAm3HweVSVc7ziiQ==", - "dev": true, - "requires": { - "extend": "3.0.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^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 - } - } - }, - "memory-fs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", - "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "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" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "dev": true - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.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==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "mini-create-react-context": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", - "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==", - "requires": { - "@babel/runtime": "^7.5.5", - "tiny-warning": "^1.0.3" - } - }, - "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==", - "dev": true - }, - "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=", - "dev": true - }, - "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==" - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", - "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "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" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "moment": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", - "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==" - }, - "monotone-convex-hull-2d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz", - "integrity": "sha1-R/Xa6t88Sv03dkuqGqh4ekDu4Iw=", - "requires": { - "robust-orientation": "^1.1.3" - } - }, - "moo": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", - "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==", - "dev": true - }, - "mouse-change": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", - "integrity": "sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8=", - "requires": { - "mouse-event": "^1.0.0" - } - }, - "mouse-event": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", - "integrity": "sha1-s3ie23EJmX1aky0dAdqhVDpQFzI=" - }, - "mouse-event-offset": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", - "integrity": "sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ=" - }, - "mouse-wheel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", - "integrity": "sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w=", - "requires": { - "right-now": "^1.0.0", - "signum": "^1.0.0", - "to-px": "^1.0.1" - }, - "dependencies": { - "signum": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", - "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" - } - } - }, - "mousetrap": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", - "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" - }, - "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" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "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" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "mumath": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/mumath/-/mumath-3.3.4.tgz", - "integrity": "sha1-SNSg8P2MrU57Mglu6JsWGmPTC78=", - "requires": { - "almost-equal": "^1.1.0" - } - }, - "murmurhash-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", - "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" - }, - "muse-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/muse-js/-/muse-js-3.1.0.tgz", - "integrity": "sha512-uH/yAfQIL0rOvgtbxFPb5C07X+M4vAD/2vDkVbi+NKocT2ADbbg2igHjiNvdN6dRhom9VfZ2S6HG2dvjnXa2jQ==", - "requires": { - "@types/web-bluetooth": "^0.0.2", - "rxjs": "^6.0.0 || ^5.6.0-forward-compat.4" - } - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "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" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "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 - }, - "ndarray": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", - "integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==", - "requires": { - "iota-array": "^1.0.0", - "is-buffer": "^1.0.2" - } - }, - "ndarray-extract-contour": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ndarray-extract-contour/-/ndarray-extract-contour-1.0.1.tgz", - "integrity": "sha1-Cu4ROjozsia5DEiIz4d79HUTBeQ=", - "requires": { - "typedarray-pool": "^1.0.0" - } - }, - "ndarray-fill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ndarray-fill/-/ndarray-fill-1.0.2.tgz", - "integrity": "sha1-owpg9xiODJWC/N1YiWrNy1IqHtY=", - "requires": { - "cwise": "^1.0.10" - } - }, - "ndarray-gradient": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ndarray-gradient/-/ndarray-gradient-1.0.0.tgz", - "integrity": "sha1-t0kaUVxqZJ8ZpiMk//byf8jCU5M=", - "requires": { - "cwise-compiler": "^1.0.0", - "dup": "^1.0.0" - } - }, - "ndarray-homography": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ndarray-homography/-/ndarray-homography-1.0.0.tgz", - "integrity": "sha1-w1UW6oa8KGK06ASiNqJwcwn+KWs=", - "requires": { - "gl-matrix-invert": "^1.0.0", - "ndarray-warp": "^1.0.0" - } - }, - "ndarray-linear-interpolate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ndarray-linear-interpolate/-/ndarray-linear-interpolate-1.0.0.tgz", - "integrity": "sha1-eLySuFuavBW25n7mWCj54hN65ys=" - }, - "ndarray-ops": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ndarray-ops/-/ndarray-ops-1.2.2.tgz", - "integrity": "sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4=", - "requires": { - "cwise-compiler": "^1.0.0" - } - }, - "ndarray-pack": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz", - "integrity": "sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo=", - "requires": { - "cwise-compiler": "^1.1.2", - "ndarray": "^1.0.13" - } - }, - "ndarray-scratch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ndarray-scratch/-/ndarray-scratch-1.2.0.tgz", - "integrity": "sha1-YwRjbWLrqT20cnrBPGkzQdulDgE=", - "requires": { - "ndarray": "^1.0.14", - "ndarray-ops": "^1.2.1", - "typedarray-pool": "^1.0.2" - } - }, - "ndarray-sort": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ndarray-sort/-/ndarray-sort-1.0.1.tgz", - "integrity": "sha1-/qBbTLg0x/TgIWo1TzynUTAN/Wo=", - "requires": { - "typedarray-pool": "^1.0.0" - } - }, - "ndarray-warp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ndarray-warp/-/ndarray-warp-1.0.1.tgz", - "integrity": "sha1-qKElqqu6C+v5O9bKg+ar1oIqNOA=", - "requires": { - "cwise": "^1.0.4", - "ndarray-linear-interpolate": "^1.0.0" - } - }, - "nearley": { - "version": "2.19.3", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.19.3.tgz", - "integrity": "sha512-FpAy1PmTsUpOtgxr23g4jRNvJHYzZEW2PixXeSzksLR/ykPfwKhAodc2+9wQhY+JneWLcvkDw6q7FJIsIdF/aQ==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "moo": "^0.5.0", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6", - "semver": "^5.4.1" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "nextafter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nextafter/-/nextafter-1.0.0.tgz", - "integrity": "sha1-t9d7U1MQ4+CX5gJauwqQNHfsGjo=", - "requires": { - "double-bits": "^1.1.0" - } - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "nise": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.3.tgz", - "integrity": "sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^6.0.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node-abi": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.18.0.tgz", - "integrity": "sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw==", - "dev": true, - "requires": { - "semver": "^5.4.1" - } - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, - "node-gyp": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.0.0.tgz", - "integrity": "sha512-ZW34qA3CJSPKDz2SJBHKRvyNQN0yWO5EGKKksJc+jElu9VA468gwJTyTArC1iOXU7rN3Wtfg/CMt/dBAOFIjvg==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^4.0.3", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^2.6.3", - "semver": "^7.3.2", - "tar": "^6.0.1", - "which": "^2.0.2" - }, - "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "minizlib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", - "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "tar": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", - "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.0", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "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==", - "dev": true, - "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": { - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "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": "7.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-7.0.1.tgz", - "integrity": "sha512-VkzhierE7DBmQEElhTGJIoiZa1oqRijOtgOlsXg32KrJRXsPy0NXFBqWGW/wTswnJlDCs5viRYaqWguqzsKcmg==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^7.2.1", - "shellwords": "^0.1.1", - "uuid": "^7.0.3", - "which": "^2.0.2" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "optional": true - }, - "uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true, - "optional": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "node-releases": { - "version": "1.1.58", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", - "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", - "dev": true - }, - "node-sass": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", - "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "2.2.5", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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" - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "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" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "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 - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "nodent": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/nodent/-/nodent-3.2.11.tgz", - "integrity": "sha512-y+ofPYAJvGJB50B95pE26iPJqdTzgYKW3AjsqdLQboetJxH8tGRn1vr1gIe+z7PA7ZwcEUTOrahj6RaVzU2ivA==", - "requires": { - "nodent-compiler": "^3.2.11", - "nodent-runtime": "^3.2.1", - "resolve": "^1.5.0" - } - }, - "nodent-compiler": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/nodent-compiler/-/nodent-compiler-3.2.11.tgz", - "integrity": "sha512-rfDrGWdgIJYomPUzR8nXiWNuIhJ7cVodPeZP3Ho65LEycuaX2uVNZ0ytpcfrmUKzdFeLRtye9+pHe8OynPZuPQ==", - "requires": { - "acorn": ">= 2.5.2 <= 5.7.3", - "acorn-es7-plugin": "^1.1.7", - "nodent-transform": "^3.2.9", - "source-map": "^0.5.7" - } - }, - "nodent-runtime": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/nodent-runtime/-/nodent-runtime-3.2.1.tgz", - "integrity": "sha512-7Ws63oC+215smeKJQCxzrK21VFVlCFBkwl0MOObt0HOpVQXs3u483sAmtkF33nNqZ5rSOQjB76fgyPBmAUrtCA==" - }, - "nodent-transform": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/nodent-transform/-/nodent-transform-3.2.9.tgz", - "integrity": "sha512-4a5FH4WLi+daH/CGD5o/JWRR8W5tlCkd3nrDSkxbOzscJTyTUITltvOJeQjg3HJ1YgEuNyiPhQbvbtRjkQBByQ==" - }, - "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-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==", - "dev": true, - "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==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", - "dev": true - }, - "normalize-svg-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", - "integrity": "sha1-RWNg5g7Odfvve11+FgSA5//Rb+U=" - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true - }, - "normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", - "dev": true - }, - "normals": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/normals/-/normals-1.1.0.tgz", - "integrity": "sha1-MltZXtNK/kZ6bFWhT9kIV4f/WcA=" - }, - "npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "dev": true, - "optional": true, - "requires": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "optional": true - } - } - }, - "npm-install-package": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz", - "integrity": "sha1-1+/jz816sAYUuJbqUxGdyaslkSU=", - "dev": true - }, - "npm-logical-tree": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz", - "integrity": "sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg==", - "dev": true - }, - "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=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-integer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz", - "integrity": "sha1-5ZvKFy/+0nMY55x862y3LAlbIVI=", - "requires": { - "is-finite": "^1.0.1" - } - }, - "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 - }, - "numeric": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/numeric/-/numeric-1.2.6.tgz", - "integrity": "sha1-dlsCvvl5iPz4gNTrPza4D6MTNao=" - }, - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "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==" - }, - "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "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-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "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.2", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", - "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "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.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "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" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "octokit-pagination-methods": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", - "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "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==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onecolor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/onecolor/-/onecolor-3.1.0.tgz", - "integrity": "sha512-YZSypViXzu3ul5LMu/m6XjJ9ol8qAy9S2VjHl5E6UlhUH1KGKWabyEJifn0Jjpw23bYDzC2ucKMPGiH5kfwSGQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", - "dev": true - }, - "opener": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", - "dev": true - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "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==", - "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==", - "dev": true, - "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" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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" - } - } - } - }, - "orbit-camera-controller": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz", - "integrity": "sha1-bis28OeHhmPDMPUNqbfOaGwncAU=", - "requires": { - "filtered-vector": "^1.2.1", - "gl-mat4": "^1.0.3" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-2.0.0.tgz", - "integrity": "sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q==" - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "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" - } - }, - "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" - } - } - } - }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "dev": true, - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - } - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "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-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "requires": { - "p-timeout": "^3.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "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-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.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==" - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.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 - } - } - }, - "pad-left": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-1.0.2.tgz", - "integrity": "sha1-GeVzXqmDlaJs7carkm6tEPMQDUw=", - "requires": { - "repeat-string": "^1.3.0" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "papaparse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.2.0.tgz", - "integrity": "sha512-ylq1wgUSnagU+MKQtNeVqrPhZuMYBvOSL00DHycFTCxownF95gpLAk1HiHdUW77N8yxRq1qHXLdlIPyBSG9NSA==" - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "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" - } - }, - "parenthesis": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.7.tgz", - "integrity": "sha512-iMtu+HCbLXVrpf6Ys/4YKhcFxbux3xK4ZVB9r+a2kMSqeeQWQoDNYlXIsOjwlT2ldYXZ3k5PVeBnYn7fbAo/Bg==" - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "dev": true, - "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-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse-rect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", - "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", - "requires": { - "pick-by-alias": "^1.2.0" - } - }, - "parse-svg-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", - "integrity": "sha1-en7A0esG+lMlx9PgCbhZoJtdSes=" - }, - "parse-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", - "integrity": "sha1-fhu21b7zh0wo45JSaiVBFwKR7s8=" - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "patch-package": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.2.2.tgz", - "integrity": "sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==", - "dev": true, - "requires": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^1.2.1", - "fs-extra": "^7.0.1", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.0", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "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" - } - } - } - }, - "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==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "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==" - }, - "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=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "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": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "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=", - "dev": true - } - } - }, - "pbf": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", - "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", - "requires": { - "ieee754": "^1.1.12", - "resolve-protobuf-schema": "^2.1.0" - } - }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "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" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "permutation-parity": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/permutation-parity/-/permutation-parity-1.0.0.tgz", - "integrity": "sha1-AXTVH8pwSxG5pLFSsj1Tf9xrXvQ=", - "requires": { - "typedarray-pool": "^1.0.0" - } - }, - "permutation-rank": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/permutation-rank/-/permutation-rank-1.0.0.tgz", - "integrity": "sha1-n9mLvOzwj79ZlLXq3JSmLmeUg7U=", - "requires": { - "invert-permutation": "^1.0.0", - "typedarray-pool": "^1.0.0" - } - }, - "pick-by-alias": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", - "integrity": "sha1-X3yysfIabh6ISgyHhVqko3NhEHs=" - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pipetteur": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pipetteur/-/pipetteur-2.0.3.tgz", - "integrity": "sha1-GVV2CVno0aEcsqUOyD7sRwYz5J8=", - "dev": true, - "requires": { - "onecolor": "^3.0.4", - "synesthesia": "^1.0.1" - } - }, - "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": "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" - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "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=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "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=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "planar-dual": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/planar-dual/-/planar-dual-1.0.2.tgz", - "integrity": "sha1-tqQjVSOxsMt55fkm+OozXdmC1WM=", - "requires": { - "compare-angle": "^1.0.0", - "dup": "^1.0.0" - } - }, - "planar-graph-to-polyline": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/planar-graph-to-polyline/-/planar-graph-to-polyline-1.0.5.tgz", - "integrity": "sha1-iCuGBRmbqIv9RkyVUzA1VsUrmIo=", - "requires": { - "edges-to-adjacency-list": "^1.0.0", - "planar-dual": "^1.0.0", - "point-in-big-polygon": "^2.0.0", - "robust-orientation": "^1.0.1", - "robust-sum": "^1.0.0", - "two-product": "^1.0.0", - "uniq": "^1.0.0" - } - }, - "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" - } - }, - "plotly.js": { - "version": "1.54.2", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.54.2.tgz", - "integrity": "sha512-iwy1s14C+9553BGLQGK0OKMtaKF/M+EAFDdIrEa2IVFTuYhd08y2yAGq79f9fVbXO3ijo++gOGlszj5mAthCaA==", - "requires": { - "@plotly/d3-sankey": "0.7.2", - "@plotly/d3-sankey-circular": "0.33.1", - "@turf/area": "^6.0.1", - "@turf/bbox": "^6.0.1", - "@turf/centroid": "^6.0.2", - "alpha-shape": "^1.0.0", - "canvas-fit": "^1.5.0", - "color-normalize": "^1.5.0", - "color-rgba": "^2.1.1", - "convex-hull": "^1.0.3", - "country-regex": "^1.1.0", - "d3": "^3.5.17", - "d3-force": "^1.2.1", - "d3-hierarchy": "^1.1.9", - "d3-interpolate": "^1.4.0", - "delaunay-triangulate": "^1.1.6", - "es6-promise": "^4.2.8", - "fast-isnumeric": "^1.1.4", - "gl-cone3d": "^1.5.2", - "gl-contour2d": "^1.1.7", - "gl-error3d": "^1.0.16", - "gl-heatmap2d": "^1.0.6", - "gl-line3d": "1.2.1", - "gl-mat4": "^1.2.0", - "gl-mesh3d": "^2.3.1", - "gl-plot2d": "^1.4.4", - "gl-plot3d": "^2.4.5", - "gl-pointcloud2d": "^1.0.3", - "gl-scatter3d": "^1.2.3", - "gl-select-box": "^1.0.4", - "gl-spikes2d": "^1.0.2", - "gl-streamtube3d": "^1.4.1", - "gl-surface3d": "^1.5.2", - "gl-text": "^1.1.8", - "glslify": "^7.0.0", - "has-hover": "^1.0.1", - "has-passive-events": "^1.0.0", - "is-mobile": "^2.2.1", - "mapbox-gl": "1.10.1", - "matrix-camera-controller": "^2.1.3", - "mouse-change": "^1.4.0", - "mouse-event-offset": "^3.0.2", - "mouse-wheel": "^1.2.0", - "ndarray": "^1.0.19", - "ndarray-fill": "^1.0.2", - "ndarray-homography": "^1.0.0", - "parse-svg-path": "^0.1.2", - "point-cluster": "^3.1.8", - "polybooljs": "^1.2.0", - "regl": "^1.6.1", - "regl-error2d": "^2.0.8", - "regl-line2d": "^3.0.15", - "regl-scatter2d": "^3.1.8", - "regl-splom": "^1.0.8", - "right-now": "^1.0.0", - "robust-orientation": "^1.1.3", - "sane-topojson": "^4.0.0", - "strongly-connected-components": "^1.0.1", - "superscript-text": "^1.0.0", - "svg-path-sdf": "^1.1.3", - "tinycolor2": "^1.4.1", - "to-px": "1.0.1", - "topojson-client": "^3.1.0", - "webgl-context": "^2.2.0", - "world-calendars": "^1.0.3" - }, - "dependencies": { - "d3": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", - "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" - } - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "dev": true, - "requires": { - "irregular-plurals": "^1.0.0" - } - }, - "point-cluster": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/point-cluster/-/point-cluster-3.1.8.tgz", - "integrity": "sha512-7klIr45dpMeZuqjIK9+qBg3m2IhyZJNJkdqjJFw0Olq75FM8ojrTMjClVUrMjNYRVqtwztxCHH71Fyjhg+YwyQ==", - "requires": { - "array-bounds": "^1.0.1", - "array-normalize": "^1.1.4", - "binary-search-bounds": "^2.0.4", - "bubleify": "^1.1.0", - "clamp": "^1.0.1", - "defined": "^1.0.0", - "dtype": "^2.0.0", - "flatten-vertex-data": "^1.0.2", - "is-obj": "^1.0.1", - "math-log2": "^1.0.1", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0" - } - }, - "point-in-big-polygon": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/point-in-big-polygon/-/point-in-big-polygon-2.0.0.tgz", - "integrity": "sha1-ObYT6mzxfWtD4Yj3fzTETGszulU=", - "requires": { - "binary-search-bounds": "^1.0.0", - "interval-tree-1d": "^1.0.1", - "robust-orientation": "^1.1.3", - "slab-decomposition": "^1.0.1" - }, - "dependencies": { - "binary-search-bounds": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", - "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=" - } - } - }, - "polybooljs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.0.tgz", - "integrity": "sha1-tDkMLgedTCYtOyUExiiNlbp6R1g=" - }, - "polytope-closest-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz", - "integrity": "sha1-5uV/QIGrXox3i4Ee8G4sSK4zjD8=", - "requires": { - "numeric": "^1.2.6" - } - }, - "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" - }, - "portfinder": { - "version": "1.0.26", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", - "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "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" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "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=", - "dev": true - }, - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "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" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "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 - }, - "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==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-html": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", - "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", - "dev": true, - "requires": { - "htmlparser2": "^3.10.0" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "postcss-less": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-0.14.0.tgz", - "integrity": "sha1-xjGwicbM5CK5oQ86lY0r7dOBkyQ=", - "dev": true, - "requires": { - "postcss": "^5.0.21" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-reporter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-3.0.0.tgz", - "integrity": "sha1-CeoPN6RExWk4eGBuCbAY6+/3z48=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "lodash": "^4.1.0", - "log-symbols": "^1.0.2", - "postcss": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "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" - } - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^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 - } - } - }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", - "dev": true - }, - "postcss-safe-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", - "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", - "dev": true, - "requires": { - "postcss": "^7.0.26" - } - }, - "postcss-sass": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", - "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", - "dev": true, - "requires": { - "gonzales-pe": "^4.3.0", - "postcss": "^7.0.21" - } - }, - "postcss-scss": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.6.tgz", - "integrity": "sha512-4EFYGHcEw+H3E06PT/pQQri06u/1VIIPjeJQaM8skB80vZuXMhp4cSNV5azmdNkontnOID/XYWEvEEELLFB1ww==", - "dev": true, - "requires": { - "postcss": "^6.0.23" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "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" - } - }, - "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": "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" - } - } - } - }, - "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==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-sorting": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-2.1.0.tgz", - "integrity": "sha1-MrHpr6kTuyJaatB21QPY+YO7SoI=", - "dev": true, - "requires": { - "lodash": "^4.17.4", - "postcss": "^5.2.17" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-syntax": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", - "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", - "dev": true - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "potpack": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.1.tgz", - "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "prettier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", - "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", - "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": "26.0.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.0.1.tgz", - "integrity": "sha512-SWxz6MbupT3ZSlL0Po4WF/KujhQaVehijR2blyRDCzk9e45EaYMVhMBn49fnRuHxtkSpXTes1GxNpVmH86Bxfw==", - "dev": true, - "requires": { - "@jest/types": "^26.0.1", - "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" - } - } - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "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-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "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==", - "dev": true, - "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, - "optional": true - }, - "protocol-buffers-schema": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.4.0.tgz", - "integrity": "sha512-G/2kcamPF2S49W5yaMGdIpkG6+5wZF0fzBteLKgEHjbNzqjZQ85aAs1iJGto31EJaSTkNvHs5IXuHSaTLWBAiA==" - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "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==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "pupa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", - "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "pure-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" - }, - "pxls": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/pxls/-/pxls-2.3.2.tgz", - "integrity": "sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw==", - "requires": { - "arr-flatten": "^1.1.0", - "compute-dims": "^1.1.0", - "flip-pixels": "^1.0.2", - "is-browser": "^2.1.0", - "is-buffer": "^2.0.3", - "to-uint8": "^1.4.1" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - } - } - }, - "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 - }, - "quantize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz", - "integrity": "sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4=" - }, - "quat-slerp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/quat-slerp/-/quat-slerp-1.0.1.tgz", - "integrity": "sha1-K6oVzjprvcMkHZcusXKDE57Wnyk=", - "requires": { - "gl-quat": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" - }, - "quote-stream": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", - "integrity": "sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs=", - "requires": { - "minimist": "0.0.8", - "through2": "~0.4.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "ramda": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.0.tgz", - "integrity": "sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==" - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "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==", - "dev": true - } - } - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "rat-vec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/rat-vec/-/rat-vec-1.1.1.tgz", - "integrity": "sha1-Dd4rZrezS7G80qI4BerIBth/0X8=", - "requires": { - "big-rat": "^1.0.3" - } - }, - "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==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "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" - } - }, - "rc-align": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.0.tgz", - "integrity": "sha512-0mKKfiZGo7VNiRCmnI4MTOG72pBFF0H08zebqcJyXcAm2hgAqTUtvt4I0pjMHh1WdYg+iQDjowpB5X8mZTN2vw==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "dom-align": "^1.7.0", - "rc-util": "^5.0.1", - "resize-observer-polyfill": "^1.5.1" - } - }, - "rc-animate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-3.1.0.tgz", - "integrity": "sha512-8FsM+3B1H+0AyTyGggY6JyVldHTs1CyYT8CfTmG/nGHHXlecvSLeICJhcKgRLjUiQlctNnRtB1rwz79cvBVmrw==", - "requires": { - "@ant-design/css-animation": "^1.7.2", - "classnames": "^2.2.6", - "raf": "^3.4.0", - "rc-util": "^5.0.1" - } - }, - "rc-slider": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.3.1.tgz", - "integrity": "sha512-c52PWPyrfJWh28K6dixAm0906L3/4MUIxqrNQA4TLnC/Z+cBNycWJUZoJerpwSOE1HdM3XDwixCsmtFc/7aWlQ==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-tooltip": "^4.0.0", - "rc-util": "^5.0.0", - "shallowequal": "^1.1.0" - } - }, - "rc-tooltip": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-4.2.1.tgz", - "integrity": "sha512-oykuaGsHg7RFvPUaxUpxo7ScEqtH61C66x4JUmjlFlSS8gSx2L8JFtfwM1D68SLBxUqGqJObtxj4TED75gQTiA==", - "requires": { - "rc-trigger": "^4.2.1" - } - }, - "rc-trigger": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-4.3.0.tgz", - "integrity": "sha512-jnGNzosXmDdivMBjPCYe/AfOXTpJU2/xQ9XukgoXDQEoZq/9lcI1r7eUIfq70WlWpLxlUEqQktiV3hwyy6Nw9g==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "raf": "^3.4.1", - "rc-align": "^4.0.0", - "rc-animate": "^3.0.0", - "rc-util": "^5.0.1" - } - }, - "rc-util": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.0.4.tgz", - "integrity": "sha512-cd19RCrE0DJH6UcJ9+V3eaXA/5sNWyVKOKkWl8ZM2OqgNzVb8fv0obf/TkuvSN43tmTsgqY8k7OqpFYHhmef8g==", - "requires": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - } - }, - "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-base16-styling": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.5.3.tgz", - "integrity": "sha1-OFjyTpxN2MvT9wLz901YHKKRcmk=", - "requires": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" - } - }, - "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-hot-loader": { - "version": "4.12.21", - "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.21.tgz", - "integrity": "sha512-Ynxa6ROfWUeKWsTHxsrL2KMzujxJVPjs385lmB2t5cHUxdoRPGind9F00tOkdc1l5WBleOF4XEAMILY1KPIIDA==", - "requires": { - "fast-levenshtein": "^2.0.6", - "global": "^4.3.0", - "hoist-non-react-statics": "^3.3.0", - "loader-utils": "^1.1.0", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.1.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "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==" - }, - "react-json-tree": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.11.2.tgz", - "integrity": "sha512-aYhUPj1y5jR3ZQ+G3N7aL8FbTyO03iLwnVvvEikLcNFqNTyabdljo9xDftZndUBFyyyL0aK3qGO9+8EilILHUw==", - "requires": { - "babel-runtime": "^6.6.1", - "prop-types": "^15.5.8", - "react-base16-styling": "^0.5.1" - } - }, - "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-markdown": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-4.3.1.tgz", - "integrity": "sha512-HQlWFTbDxTtNY6bjgp3C3uv1h2xcjCSi1zAEzfBW9OwJJvENSYiLXWNXN5hHLsoqai7RnZiiHzcnWdXk2Splzw==", - "requires": { - "html-to-react": "^1.3.4", - "mdast-add-list-metadata": "1.0.1", - "prop-types": "^15.7.2", - "react-is": "^16.8.6", - "remark-parse": "^5.0.0", - "unified": "^6.1.5", - "unist-util-visit": "^1.3.0", - "xtend": "^4.0.1" - } - }, - "react-plotly.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.4.0.tgz", - "integrity": "sha512-BCkxMe8yWqu3nP/hw9A1KCIuoL67WV5/k68SL9yhEkF6UG+pAuIev9Q3cMKtNkQJZhsYFpOmlqrpPjIdUFACOQ==", - "requires": { - "prop-types": "^15.7.2" - } - }, - "react-popper": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.7.tgz", - "integrity": "sha512-nmqYTx7QVjCm3WUZLeuOomna138R1luC4EqkW3hxJUrAe+3eNz3oFCLYdnPwILfn0mX1Ew2c3wctrjlUMYYUww==", - "requires": { - "@babel/runtime": "^7.1.2", - "create-react-context": "^0.3.0", - "deep-equal": "^1.1.1", - "popper.js": "^1.14.4", - "prop-types": "^15.6.1", - "typed-styles": "^0.0.7", - "warning": "^4.0.2" - } - }, - "react-redux": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.0.tgz", - "integrity": "sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA==", - "requires": { - "@babel/runtime": "^7.5.5", - "hoist-non-react-statics": "^3.3.0", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^16.9.0" - } - }, - "react-router": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", - "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", - "requires": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "dependencies": { - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - } - } - }, - "react-router-dom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", - "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", - "requires": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.2.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "dependencies": { - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - } - } - }, - "react-router-redux": { - "version": "5.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/react-router-redux/-/react-router-redux-5.0.0-alpha.9.tgz", - "integrity": "sha512-euSgNIANnRXr4GydIuwA7RZCefrLQzIw5WdXspS8NPYbV+FxrKSS9MKG7U9vb6vsKHONnA4VxrVNWfnMUnUQAw==", - "requires": { - "history": "^4.7.2", - "prop-types": "^15.6.0", - "react-router": "^4.2.0" - }, - "dependencies": { - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "react-router": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", - "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", - "requires": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.1", - "warning": "^4.0.1" - } - } - } - }, - "react-test-renderer": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.13.1.tgz", - "integrity": "sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.19.1" - } - }, - "react-toastify": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-6.0.5.tgz", - "integrity": "sha512-1YXSb6Jr478c1TJEyVpxLHFvtmeXGMvdpZc0fke/7lK+MoLBC+NFgB74bq+C2SZe6LdK+K1voEURJoY88WqWvA==", - "requires": { - "classnames": "^2.2.6", - "prop-types": "^15.7.2", - "react-transition-group": "^4.4.1" - } - }, - "react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "read-config-file": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.0.0.tgz", - "integrity": "sha512-PHjROSdpceKUmqS06wqwP92VrM46PZSTubmNIMJ5DrMwg1OgenSTSEHIkCa6TiOJ+y/J0xnG1fFwG3M+Oi1aNA==", - "dev": true, - "requires": { - "dotenv": "^8.2.0", - "dotenv-expand": "^5.1.0", - "js-yaml": "^3.13.1", - "json5": "^2.1.2", - "lazy-val": "^1.0.4" - }, - "dependencies": { - "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" - } - } - } - }, - "read-file-stdin": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/read-file-stdin/-/read-file-stdin-0.2.1.tgz", - "integrity": "sha1-JezP86FTtoCa+ssj7hU4fbng7mE=", - "dev": true, - "requires": { - "gather-stream": "^1.0.0" - } - }, - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "dev": true, - "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "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=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "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.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "requires": { - "minimatch": "3.0.4" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - } - } - }, - "reduce-simplicial-complex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz", - "integrity": "sha1-dNaWovg196bc2SBl/YxRgfLt+Lw=", - "requires": { - "cell-orientation": "^1.0.1", - "compare-cell": "^1.0.0", - "compare-oriented-cell": "^1.0.1" - } - }, - "redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", - "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" - } - }, - "redux-immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redux-immutable/-/redux-immutable-4.0.0.tgz", - "integrity": "sha1-Ohoy32Y2ZGK2NpHw4dw15HK7yfM=", - "dev": true - }, - "redux-logger": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", - "integrity": "sha1-91VZZvMJjzyIYExEnPC69XeCdL8=", - "dev": true, - "requires": { - "deep-diff": "^0.3.5" - } - }, - "redux-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redux-observable/-/redux-observable-1.2.0.tgz", - "integrity": "sha512-yeR90RP2WzZzCxxnQPlh2uFzyfFLsfXu8ROh53jGDPXVqj71uNDMmvi/YKQkd9ofiVoO4OYb1snbowO49tCEMg==" - }, - "redux-thunk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" - }, - "reflect.ownkeys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", - "dev": true - }, - "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" - }, - "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==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4", - "private": "^0.1.8" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regex-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regex-regex/-/regex-regex-1.0.0.tgz", - "integrity": "sha1-kEih6uuHD01IDavHb8Qs3MC8OnI=" - }, - "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==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "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" - } - }, - "registry-auth-token": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", - "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - }, - "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=" - } - } - }, - "regl": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/regl/-/regl-1.6.1.tgz", - "integrity": "sha512-7Z9rmpEqmLNwC9kCYCyfyu47eWZaQWeNpwZfwz99QueXN8B/Ow40DB0N+OeUeM/yu9pZAB01+JgJ+XghGveVoA==" - }, - "regl-error2d": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.8.tgz", - "integrity": "sha512-5nszdicXbimRUnYB42i+O7KPcla7PzI62nZLCP6qVRKlQCf3rSrWbikMNd1S84LE8+deWHWcb8rZ/v7rZ9qmmw==", - "requires": { - "array-bounds": "^1.0.1", - "bubleify": "^1.2.0", - "color-normalize": "^1.5.0", - "flatten-vertex-data": "^1.0.2", - "object-assign": "^4.1.1", - "pick-by-alias": "^1.2.0", - "to-float32": "^1.0.1", - "update-diff": "^1.1.0" - } - }, - "regl-line2d": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.0.15.tgz", - "integrity": "sha512-RuQbg9iZ6MyuInG8izF6zjQ/2g4qL6sg1egiuFalWzaGSvuve/IWBsIcqKTlwpiEsRt9b4cHu9NYs2fLt1gYJw==", - "requires": { - "array-bounds": "^1.0.1", - "array-normalize": "^1.1.4", - "bubleify": "^1.2.0", - "color-normalize": "^1.5.0", - "earcut": "^2.1.5", - "es6-weak-map": "^2.0.3", - "flatten-vertex-data": "^1.0.2", - "glslify": "^7.0.0", - "object-assign": "^4.1.1", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0", - "to-float32": "^1.0.1" - } - }, - "regl-scatter2d": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.1.8.tgz", - "integrity": "sha512-Z9MYAUx9t8e3MsiHBbJAEstbIqauXxzcL9DmuKXQuRWfCMF2DBytYJtE0FpbQU6639wEMAJ54SEIlISWF8sQ2g==", - "requires": { - "array-range": "^1.0.1", - "array-rearrange": "^2.2.2", - "clamp": "^1.0.1", - "color-id": "^1.1.0", - "color-normalize": "1.5.0", - "color-rgba": "^2.1.1", - "flatten-vertex-data": "^1.0.2", - "glslify": "^7.0.0", - "image-palette": "^2.1.0", - "is-iexplorer": "^1.0.0", - "object-assign": "^4.1.1", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0", - "point-cluster": "^3.1.8", - "to-float32": "^1.0.1", - "update-diff": "^1.1.0" - } - }, - "regl-splom": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.8.tgz", - "integrity": "sha512-4GQTgcArCbGLsXhgalWVBxeW7OXllnu+Gvil/4SbQQmtiqLCl+xgF79pISKY9mLXTlobxiX7cVKdjGjp25559A==", - "requires": { - "array-bounds": "^1.0.1", - "array-range": "^1.0.1", - "bubleify": "^1.2.0", - "color-alpha": "^1.0.4", - "defined": "^1.0.0", - "flatten-vertex-data": "^1.0.2", - "left-pad": "^1.3.0", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0", - "point-cluster": "^3.1.8", - "raf": "^3.4.1", - "regl-scatter2d": "^3.1.2" - } - }, - "remark": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.0.tgz", - "integrity": "sha512-oX4lMIS0csgk8AEbzY0h2jdR0ngiCHOpwwpxjmRa5TqAkeknY+tkhjRJGZqnCmvyuWh55/0SW5WY3R3nn3PH9A==", - "dev": true, - "requires": { - "remark-parse": "^8.0.0", - "remark-stringify": "^8.0.0", - "unified": "^9.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dev": true, - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "remark-parse": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.2.tgz", - "integrity": "sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ==", - "dev": true, - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - } - }, - "unified": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", - "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==", - "dev": true, - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "unist-util-is": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", - "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==", - "dev": true - }, - "unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "dev": true, - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dev": true, - "requires": { - "@types/unist": "^2.0.2" - } - }, - "unist-util-visit": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz", - "integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz", - "integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - }, - "vfile": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.1.tgz", - "integrity": "sha512-lRjkpyDGjVlBA7cDQhQ+gNcvB1BGaTHYuSOcY3S7OhDmBtnzX95FhtZZDecSTDm6aajFymyve6S5DN4ZHGezdQ==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - } - }, - "vfile-location": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz", - "integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==", - "dev": true - }, - "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - } - } - }, - "remark-parse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", - "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==", - "requires": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" - } - }, - "remark-stringify": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.0.tgz", - "integrity": "sha512-FSPZv1ds76oAZjurhhuV5qXSUSoz6QRPuwYK38S41sLHwg4oB7ejnmZshj7qwjgYLf93kdz6BOX9j5aidNE7rA==", - "dev": true, - "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - }, - "dependencies": { - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dev": true, - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - } - } - }, - "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=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" - }, - "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": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "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" - } - }, - "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=", - "dev": true - }, - "reselect": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", - "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==", - "dev": true - }, - "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.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "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" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - } - } - }, - "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-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "resolve-protobuf-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "requires": { - "protocol-buffers-schema": "^3.3.1" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.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=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "requires": { - "through": "~2.3.4" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rgb2hex": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.10.tgz", - "integrity": "sha512-vKz+kzolWbL3rke/xeTE2+6vHmZnNxGyDnaVW4OckntAIcc7DcZzWkQSfxMDwqHS8vhgySnIFyBUH7lIk6PxvQ==", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" - } - }, - "right-now": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", - "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" - }, - "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" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "roarr": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.3.tgz", - "integrity": "sha512-AEjYvmAhlyxOeB9OqPUzQCo3kuAkNfuDk/HqWbZdFsqDFpapkTjiw+p4svNEoRLvuqNTxqfL+s+gtD4eDgZ+CA==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.0", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - } - }, - "robust-compress": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/robust-compress/-/robust-compress-1.0.0.tgz", - "integrity": "sha1-TPYsSzGNgwhRYBK7jBF1Lzkymxs=" - }, - "robust-determinant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/robust-determinant/-/robust-determinant-1.1.0.tgz", - "integrity": "sha1-jsrnm3nKqz509t6+IjflORon6cc=", - "requires": { - "robust-compress": "^1.0.0", - "robust-scale": "^1.0.0", - "robust-sum": "^1.0.0", - "two-product": "^1.0.0" - } - }, - "robust-dot-product": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/robust-dot-product/-/robust-dot-product-1.0.0.tgz", - "integrity": "sha1-yboBeL0sMEv9cl9Y6Inx2UYARVM=", - "requires": { - "robust-sum": "^1.0.0", - "two-product": "^1.0.0" - } - }, - "robust-in-sphere": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/robust-in-sphere/-/robust-in-sphere-1.1.3.tgz", - "integrity": "sha1-HFiD0WpOkjkpR27zSBmFe/Kpz3U=", - "requires": { - "robust-scale": "^1.0.0", - "robust-subtract": "^1.0.0", - "robust-sum": "^1.0.0", - "two-product": "^1.0.0" - } - }, - "robust-linear-solve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/robust-linear-solve/-/robust-linear-solve-1.0.0.tgz", - "integrity": "sha1-DNasUEBpGm8qo81jEdcokFyjofE=", - "requires": { - "robust-determinant": "^1.1.0" - } - }, - "robust-orientation": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/robust-orientation/-/robust-orientation-1.1.3.tgz", - "integrity": "sha1-2v9bANO+TmByLw6cAVbvln8cIEk=", - "requires": { - "robust-scale": "^1.0.2", - "robust-subtract": "^1.0.0", - "robust-sum": "^1.0.0", - "two-product": "^1.0.2" - } - }, - "robust-product": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/robust-product/-/robust-product-1.0.0.tgz", - "integrity": "sha1-aFJQAHzbunzx3nW/9tKScBEJir4=", - "requires": { - "robust-scale": "^1.0.0", - "robust-sum": "^1.0.0" - } - }, - "robust-scale": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/robust-scale/-/robust-scale-1.0.2.tgz", - "integrity": "sha1-d1Ey7QlULQKOWLLMecBikLz3jDI=", - "requires": { - "two-product": "^1.0.2", - "two-sum": "^1.0.0" - } - }, - "robust-segment-intersect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/robust-segment-intersect/-/robust-segment-intersect-1.0.1.tgz", - "integrity": "sha1-MlK2oPwboUreaRXMvgnLzpqrHBw=", - "requires": { - "robust-orientation": "^1.1.3" - } - }, - "robust-subtract": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/robust-subtract/-/robust-subtract-1.0.0.tgz", - "integrity": "sha1-4LFk4e2LpOOl3aRaEgODSNvtPpo=" - }, - "robust-sum": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/robust-sum/-/robust-sum-1.0.0.tgz", - "integrity": "sha1-FmRuUlKStNJdgnV6KGlV4Lv6U9k=" - }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, - "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.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "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=" - }, - "rx-jupyter": { - "version": "5.5.9", - "resolved": "https://registry.npmjs.org/rx-jupyter/-/rx-jupyter-5.5.9.tgz", - "integrity": "sha512-REXooBzBQPX5f3rkuSgXp1iy6butUsC4+yQrYVL9M+OcBptW13HL676RkIosc6Y62dbbKEcXnzcXrj5V6ifqVg==", - "dev": true, - "requires": { - "@nteract/commutable": "^7.2.12", - "@nteract/messaging": "^7.0.7", - "@types/ungap__url-search-params": "^0.1.0", - "@ungap/url-search-params": "^0.2.0", - "js-cookie": "^2.2.0", - "rxjs": "^6.3.3", - "url-join": "^4.0.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "*" - } - }, - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "rxjs-compat": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.5.5.tgz", - "integrity": "sha512-F42sssVbUyWH4vJswEo6m+Eh02xHv3q93n8S7nUJO58R7sbc3CvJIOts605zdaBhWa1xMB9aVSyqPqhQ5q3eXg==" - }, - "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=", - "dev": true, - "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" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "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" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.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-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "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" - } - }, - "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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "sane-topojson": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sane-topojson/-/sane-topojson-4.0.0.tgz", - "integrity": "sha512-bJILrpBboQfabG3BNnHI2hZl52pbt80BE09u4WhnrmzuF2JbMKZdl62G5glXskJ46p+gxE2IzOwGj/awR4g8AA==" - }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" - }, - "dependencies": { - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - } - } - }, - "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==", - "dev": true, - "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": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "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.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semantic-ui-css": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/semantic-ui-css/-/semantic-ui-css-2.4.1.tgz", - "integrity": "sha512-Pkp0p9oWOxlH0kODx7qFpIRYpK1T4WJOO4lNnpNPOoWKCrYsfHqYSKgk5fHfQtnWnsAKy7nLJMW02bgDWWFZFg==", - "requires": { - "jquery": "x.*" - } - }, - "semantic-ui-react": { - "version": "0.88.2", - "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.88.2.tgz", - "integrity": "sha512-+02kN2z8PuA/cMdvDUsHhbJmBzxxgOXVHMFr9XK7zGb0wkW9A6OPQMFokWz7ozlVtKjN6r7zsb+Qvjk/qq1OWw==", - "requires": { - "@babel/runtime": "^7.1.2", - "@semantic-ui-react/event-stack": "^3.1.0", - "@stardust-ui/react-component-event-listener": "~0.38.0", - "@stardust-ui/react-component-ref": "~0.38.0", - "classnames": "^2.2.6", - "keyboard-key": "^1.0.4", - "lodash": "^4.17.15", - "prop-types": "^15.7.2", - "react-is": "^16.8.6", - "react-popper": "^1.3.4", - "shallowequal": "^1.1.0" - } - }, - "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-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "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==", - "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==", - "dev": true, - "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==", - "dev": true, - "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=", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "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==", - "dev": true - } - } - }, - "serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "optional": true, - "requires": { - "type-fest": "^0.13.1" - } - }, - "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "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" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.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-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "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==", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "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==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "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=" - }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "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 - }, - "shim-keyboard-event-key": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/shim-keyboard-event-key/-/shim-keyboard-event-key-1.0.3.tgz", - "integrity": "sha512-PTNRkOxDlZ2+Xz4CbKJJsh/pe1DJdaC+b4HHV02A1aEWNmwh1g9am0ZiU/ktu3uVfQrY3yDHTOVhst3xpLhw2A==" - }, - "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==" - }, - "signum": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/signum/-/signum-0.0.0.tgz", - "integrity": "sha1-q1UbEAM1EHCnBHg/GgnF52kfnPY=" - }, - "simple-statistics": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.1.0.tgz", - "integrity": "sha512-aA7JgiiptQJFB1xJDySzUJ64XTtl1zkR5U79Qa0AxSYVTxws2UlsZt/chyJm+2lMt3xIPKzAsNzVhZhMUXlY+g==" - }, - "simplicial-complex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simplicial-complex/-/simplicial-complex-1.0.0.tgz", - "integrity": "sha1-bDOk7Wn81Nkbe8rdOzC2NoPq4kE=", - "requires": { - "bit-twiddle": "^1.0.0", - "union-find": "^1.0.0" - } - }, - "simplicial-complex-boundary": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simplicial-complex-boundary/-/simplicial-complex-boundary-1.0.1.tgz", - "integrity": "sha1-csn/HiTeqjdMm7L6DL8MCB6++BU=", - "requires": { - "boundary-cells": "^2.0.0", - "reduce-simplicial-complex": "^1.0.0" - } - }, - "simplicial-complex-contour": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/simplicial-complex-contour/-/simplicial-complex-contour-1.0.2.tgz", - "integrity": "sha1-iQqsrChDZTQBEFRc8mKaJuBL+dE=", - "requires": { - "marching-simplex-table": "^1.0.0", - "ndarray": "^1.0.15", - "ndarray-sort": "^1.0.0", - "typedarray-pool": "^1.1.0" - } - }, - "simplify-js": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/simplify-js/-/simplify-js-1.2.4.tgz", - "integrity": "sha512-vITfSlwt7h/oyrU42R83mtzFpwYk3+mkH9bOHqq/Qw6n8rtR7aE3NZQ5fbcyCUVVmuMJR6ynsAhOfK2qoah8Jg==" - }, - "simplify-planar-graph": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/simplify-planar-graph/-/simplify-planar-graph-2.0.1.tgz", - "integrity": "sha1-vIWJNyXzLo+oriVoE5hEbSy892Y=", - "requires": { - "robust-orientation": "^1.0.1", - "simplicial-complex": "^0.3.3" - }, - "dependencies": { - "bit-twiddle": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-0.0.2.tgz", - "integrity": "sha1-wurruVKjuUrMFASX4c3NLxoz9Y4=" - }, - "simplicial-complex": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/simplicial-complex/-/simplicial-complex-0.3.3.tgz", - "integrity": "sha1-TDDK1X+eRXKd2PMGyHU1efRr6Z4=", - "requires": { - "bit-twiddle": "~0.0.1", - "union-find": "~0.0.3" - } - }, - "union-find": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/union-find/-/union-find-0.0.4.tgz", - "integrity": "sha1-uFSzMBYZva0USwAUx4+W6sDS8PY=" - } - } - }, - "sinon": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.2.tgz", - "integrity": "sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.2", - "@sinonjs/fake-timers": "^6.0.1", - "@sinonjs/formatio": "^5.0.1", - "@sinonjs/samsam": "^5.0.3", - "diff": "^4.0.2", - "nise": "^4.0.1", - "supports-color": "^7.1.0" - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slab-decomposition": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/slab-decomposition/-/slab-decomposition-1.0.2.tgz", - "integrity": "sha1-He1WdU1AixBznxRRA9/GGAf2UTQ=", - "requires": { - "binary-search-bounds": "^1.0.0", - "functional-red-black-tree": "^1.0.0", - "robust-orientation": "^1.1.3" - }, - "dependencies": { - "binary-search-bounds": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", - "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=" - } - } - }, - "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": "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" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "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==", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true - } - } - }, - "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==", - "dev": true, - "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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "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==", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.4.0", - "websocket-driver": "0.6.5" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "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.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "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==", - "dev": true, - "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.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "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=", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", - "dev": true - }, - "spawn-rx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-3.0.0.tgz", - "integrity": "sha512-dw4Ryg/KMNfkKa5ezAR5aZe9wNwPdKlnHEXtHOjVnyEDSPQyOpIPPRtcIiu7127SmtHhaCjw21yC43HliW0iIg==", - "dev": true, - "requires": { - "debug": "^2.5.1", - "lodash.assign": "^4.2.0", - "rxjs": "^6.3.1" - }, - "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 - } - } - }, - "spawnteract": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/spawnteract/-/spawnteract-5.0.1.tgz", - "integrity": "sha512-7R+unoZfdInm/fAqLeCirqoF8clth3N5SQBohAdv/LhYNJ0I6tnL0AN2catX8T+KedwsgujaeTTuyukB6Jc+Ew==", - "requires": { - "execa": "^0.10.0", - "jsonfile": "^3.0.0", - "jupyter-paths": "^2.0.0", - "kernelspecs": "^2.0.0", - "mkdirp": "^0.5.1", - "portfinder": "^1.0.13", - "uuid": "^3.0.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "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==", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "specificity": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.2.tgz", - "integrity": "sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A==", - "dev": true - }, - "spectron": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/spectron/-/spectron-11.0.0.tgz", - "integrity": "sha512-YRiB0TTpJa8ofNML/k1fJShe+m7U/E2HnFZsdZK57ekWIzlTHF+Lq7ZvuKGxMbpooU/OZkLObZfitemxhBVH4w==", - "dev": true, - "requires": { - "@types/webdriverio": "^4.8.0", - "dev-null": "^0.1.1", - "electron-chromedriver": "^9.0.0", - "request": "^2.87.0", - "split": "^1.0.0", - "webdriverio": "^4.13.0" - } - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-polygon": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split-polygon/-/split-polygon-1.0.0.tgz", - "integrity": "sha1-DqzIoTanaxKj2VJW6n2kXbDC0kc=", - "requires": { - "robust-dot-product": "^1.0.0", - "robust-sum": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "split2": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz", - "integrity": "sha1-At2smtwD7Au3jBKC7Aecpuha6QA=", - "dev": true, - "requires": { - "through2": "~0.6.1" - } - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" - }, - "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": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, - "stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" - }, - "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true - }, - "state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" - }, - "static-eval": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", - "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", - "requires": { - "escodegen": "^1.11.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "static-module": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz", - "integrity": "sha1-J9qYg8QajNCSNvhC8MHrxu32PYY=", - "requires": { - "concat-stream": "~1.6.0", - "duplexer2": "~0.0.2", - "escodegen": "~1.3.2", - "falafel": "^2.1.0", - "has": "^1.0.0", - "object-inspect": "~0.4.0", - "quote-stream": "~0.0.0", - "readable-stream": "~1.0.27-1", - "shallow-copy": "~0.0.1", - "static-eval": "~0.2.0", - "through2": "~0.4.1" - }, - "dependencies": { - "escodegen": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", - "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", - "requires": { - "esprima": "~1.1.1", - "estraverse": "~1.5.0", - "esutils": "~1.0.0", - "source-map": "~0.1.33" - } - }, - "esprima": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", - "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=" - }, - "estraverse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", - "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=" - }, - "esutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", - "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "object-inspect": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", - "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=" - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "static-eval": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.4.tgz", - "integrity": "sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns=", - "requires": { - "escodegen": "~0.0.24" - }, - "dependencies": { - "escodegen": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", - "integrity": "sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M=", - "requires": { - "esprima": "~1.0.2", - "estraverse": "~1.3.0", - "source-map": ">= 0.1.2" - } - }, - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" - }, - "estraverse": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz", - "integrity": "sha1-N8K4k+8T1yPydth41g2FNRUqbEI=" - } - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stdin": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", - "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=", - "dev": true - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "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==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==" - }, - "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-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.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 - }, - "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" - } - } - } - }, - "string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", - "dev": true - }, - "string-split-by": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", - "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", - "requires": { - "parenthesis": "^3.1.5" - } - }, - "string-to-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz", - "integrity": "sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q==", - "requires": { - "atob-lite": "^2.0.0", - "is-base64": "^0.1.0" - }, - "dependencies": { - "atob-lite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", - "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=" - } - } - }, - "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" - } - }, - "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.trim": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", - "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "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-entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", - "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", - "dev": true, - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.2", - "is-hexadecimal": "^1.0.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" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "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-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - } - } - }, - "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 - }, - "strongly-connected-components": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", - "integrity": "sha1-CSDitN9nyOrulsa2I0/inoc9upk=" - }, - "style-loader": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", - "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.6.6" - }, - "dependencies": { - "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" - } - }, - "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==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", - "dev": true - }, - "stylefmt": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/stylefmt/-/stylefmt-6.0.3.tgz", - "integrity": "sha512-Bs7/Tf9QoPEtT8QuCFjUfMfjwy6gX1IYZ4zW4se4I6D/kpDqsAOToKTcX0TYoxrP9X0T0xGnHXRRqTmNoesAeA==", - "dev": true, - "requires": { - "colorette": "^1.0.5", - "css-color-list": "^0.0.1", - "diff": "^3.2.0", - "editorconfig": "^0.13.2", - "getopts": "^2.1.1", - "globby": "^6.1.0", - "postcss": "^6.0.1", - "postcss-scss": "^1.0.0", - "postcss-sorting": "^2.1.0", - "postcss-value-parser": "^3.3.0", - "stdin": "^0.0.1", - "stylelint": "^7.10.1", - "stylelint-order": "^0.4.4" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "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" - } - }, - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - } - }, - "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" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "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 - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "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" - }, - "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" - } - }, - "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 - } - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "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" - } - }, - "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 - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "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" - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "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 - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "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" - } - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.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 - }, - "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" - }, - "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 - }, - "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" - } - } - } - }, - "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" - } - }, - "stylelint": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-7.13.0.tgz", - "integrity": "sha1-ER+Xttpy53XICADWu29fhpmXeF0=", - "dev": true, - "requires": { - "autoprefixer": "^6.0.0", - "balanced-match": "^0.4.0", - "chalk": "^2.0.1", - "colorguard": "^1.2.0", - "cosmiconfig": "^2.1.1", - "debug": "^2.6.0", - "doiuse": "^2.4.1", - "execall": "^1.0.0", - "file-entry-cache": "^2.0.0", - "get-stdin": "^5.0.0", - "globby": "^6.0.0", - "globjoin": "^0.1.4", - "html-tags": "^2.0.0", - "ignore": "^3.2.0", - "imurmurhash": "^0.1.4", - "known-css-properties": "^0.2.0", - "lodash": "^4.17.4", - "log-symbols": "^1.0.2", - "mathml-tag-names": "^2.0.0", - "meow": "^3.3.0", - "micromatch": "^2.3.11", - "normalize-selector": "^0.2.0", - "pify": "^2.3.0", - "postcss": "^5.0.20", - "postcss-less": "^0.14.0", - "postcss-media-query-parser": "^0.2.0", - "postcss-reporter": "^3.0.0", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-scss": "^0.4.0", - "postcss-selector-parser": "^2.1.1", - "postcss-value-parser": "^3.1.1", - "resolve-from": "^3.0.0", - "specificity": "^0.3.0", - "string-width": "^2.0.0", - "style-search": "^0.1.0", - "stylehacks": "^2.3.2", - "sugarss": "^0.2.0", - "svg-tags": "^1.0.0", - "table": "^4.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 - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "dependencies": { - "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" - }, - "dependencies": { - "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 - } - } - } - } - }, - "postcss-scss": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-0.4.1.tgz", - "integrity": "sha1-rXcbgfD3L19IRdCKpg+TVXZT1Uw=", - "dev": true, - "requires": { - "postcss": "^5.2.13" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "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" - } - }, - "table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", - "dev": true, - "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - } - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - } - } - }, - "stylehacks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-2.3.2.tgz", - "integrity": "sha1-ZMg+BDimjJ7fRJ6MVSp9mrYAmws=", - "dev": true, - "requires": { - "browserslist": "^1.1.3", - "chalk": "^1.1.1", - "log-symbols": "^1.0.2", - "minimist": "^1.2.0", - "plur": "^2.1.2", - "postcss": "^5.0.18", - "postcss-reporter": "^1.3.3", - "postcss-selector-parser": "^2.0.0", - "read-file-stdin": "^0.2.1", - "text-table": "^0.2.0", - "write-file-stdout": "0.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "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" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "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" - } - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-reporter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-1.4.1.tgz", - "integrity": "sha1-wTbwpbFhkV83ndN2XGEHX357mvI=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "lodash": "^4.1.0", - "log-symbols": "^1.0.2", - "postcss": "^5.0.0" - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "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 - } - } - }, - "stylelint": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.6.0.tgz", - "integrity": "sha512-55gG2pNjVr183JJM/tlr3KAua6vTVX7Ho/lgKKuCIWszTZ1gmrXjX4Wok53SI8wRYFPbwKAcJGULQ77OJxTcNw==", - "dev": true, - "requires": { - "@stylelint/postcss-css-in-js": "^0.37.1", - "@stylelint/postcss-markdown": "^0.36.1", - "autoprefixer": "^9.8.0", - "balanced-match": "^1.0.0", - "chalk": "^4.0.0", - "cosmiconfig": "^6.0.0", - "debug": "^4.1.1", - "execall": "^2.0.0", - "file-entry-cache": "^5.0.1", - "get-stdin": "^8.0.0", - "global-modules": "^2.0.0", - "globby": "^11.0.1", - "globjoin": "^0.1.4", - "html-tags": "^3.1.0", - "ignore": "^5.1.8", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "known-css-properties": "^0.19.0", - "leven": "^3.1.0", - "lodash": "^4.17.15", - "log-symbols": "^4.0.0", - "mathml-tag-names": "^2.1.3", - "meow": "^7.0.1", - "micromatch": "^4.0.2", - "normalize-selector": "^0.2.0", - "postcss": "^7.0.32", - "postcss-html": "^0.36.0", - "postcss-less": "^3.1.4", - "postcss-media-query-parser": "^0.2.3", - "postcss-reporter": "^6.0.1", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^4.0.2", - "postcss-sass": "^0.4.4", - "postcss-scss": "^2.1.1", - "postcss-selector-parser": "^6.0.2", - "postcss-syntax": "^0.36.2", - "postcss-value-parser": "^4.1.0", - "resolve-from": "^5.0.0", - "slash": "^3.0.0", - "specificity": "^0.4.1", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "style-search": "^0.1.0", - "sugarss": "^2.0.0", - "svg-tags": "^1.0.0", - "table": "^5.4.6", - "v8-compile-cache": "^2.1.1", - "write-file-atomic": "^3.0.3" - }, - "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 - }, - "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 - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "autoprefixer": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", - "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001061", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.30", - "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "clone-regexp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", - "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", - "dev": true, - "requires": { - "is-regexp": "^2.0.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "execall": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", - "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", - "dev": true, - "requires": { - "clone-regexp": "^2.1.0" - } - }, - "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true - }, - "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", - "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", - "dev": true - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "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 - }, - "is-regexp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", - "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", - "dev": true - }, - "known-css-properties": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.19.0.tgz", - "integrity": "sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA==", - "dev": true - }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "map-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", - "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", - "dev": true - }, - "meow": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", - "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "arrify": "^2.0.1", - "camelcase": "^6.0.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "^4.0.2", - "normalize-package-data": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - } - }, - "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" - } - }, - "postcss-less": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", - "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "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" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - } - } - }, - "postcss-scss": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", - "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", - "dev": true, - "requires": { - "postcss": "^7.0.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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 - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "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" - } - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "sugarss": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", - "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "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" - } - }, - "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - } - } - }, - "stylelint-config-prettier": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-8.0.1.tgz", - "integrity": "sha512-RcjNW7MUaNVqONhJH4+rtlAE3ow/9SsAM0YWV0Lgu3dbTKdWTa/pQXRdFWgoHWpzUKn+9oBKR5x8JdH+20wmgw==", - "dev": true - }, - "stylelint-config-recommended": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz", - "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==", - "dev": true - }, - "stylelint-config-standard": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz", - "integrity": "sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==", - "dev": true, - "requires": { - "stylelint-config-recommended": "^3.0.0" - } - }, - "stylelint-order": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-0.4.4.tgz", - "integrity": "sha1-2338oFQbUGIBDH4uIedFeR/AiKw=", - "dev": true, - "requires": { - "lodash": "^4.17.4", - "postcss": "^5.2.16", - "stylelint": "^7.9.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - } - }, - "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" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "dev": true - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "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" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "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" - } - }, - "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 - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-scss": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-0.4.1.tgz", - "integrity": "sha1-rXcbgfD3L19IRdCKpg+TVXZT1Uw=", - "dev": true, - "requires": { - "postcss": "^5.2.13" - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "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 - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "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" - } - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "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" - }, - "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 - }, - "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" - } - } - } - }, - "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" - } - }, - "stylelint": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-7.13.0.tgz", - "integrity": "sha1-ER+Xttpy53XICADWu29fhpmXeF0=", - "dev": true, - "requires": { - "autoprefixer": "^6.0.0", - "balanced-match": "^0.4.0", - "chalk": "^2.0.1", - "colorguard": "^1.2.0", - "cosmiconfig": "^2.1.1", - "debug": "^2.6.0", - "doiuse": "^2.4.1", - "execall": "^1.0.0", - "file-entry-cache": "^2.0.0", - "get-stdin": "^5.0.0", - "globby": "^6.0.0", - "globjoin": "^0.1.4", - "html-tags": "^2.0.0", - "ignore": "^3.2.0", - "imurmurhash": "^0.1.4", - "known-css-properties": "^0.2.0", - "lodash": "^4.17.4", - "log-symbols": "^1.0.2", - "mathml-tag-names": "^2.0.0", - "meow": "^3.3.0", - "micromatch": "^2.3.11", - "normalize-selector": "^0.2.0", - "pify": "^2.3.0", - "postcss": "^5.0.20", - "postcss-less": "^0.14.0", - "postcss-media-query-parser": "^0.2.0", - "postcss-reporter": "^3.0.0", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-scss": "^0.4.0", - "postcss-selector-parser": "^2.1.1", - "postcss-value-parser": "^3.1.1", - "resolve-from": "^3.0.0", - "specificity": "^0.3.0", - "string-width": "^2.0.0", - "style-search": "^0.1.0", - "stylehacks": "^2.3.2", - "sugarss": "^0.2.0", - "svg-tags": "^1.0.0", - "table": "^4.0.1" - }, - "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" - } - }, - "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" - } - } - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - }, - "table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", - "dev": true, - "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - }, - "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" - } - }, - "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" - } - } - } - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - } - } - }, - "sugarss": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-0.2.0.tgz", - "integrity": "sha1-rDQjdWMyfG/4l7ZHQr9q7BkK054=", - "dev": true, - "requires": { - "postcss": "^5.2.4" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "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": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "requires": { - "debug": "^4.1.0" - } - }, - "supercluster": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.0.tgz", - "integrity": "sha512-LDasImUAFMhTqhK+cUXfy9C2KTUqJ3gucLjmNLNFmKWOnDUBxLFLH9oKuXOTCLveecmxh8fbk8kgh6Q0gsfe2w==", - "requires": { - "kdbush": "^3.0.0" - } - }, - "superscript-text": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", - "integrity": "sha1-58snUlZzYN9QvrBhDOjfPXHY39g=" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.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" - } - }, - "surface-nets": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/surface-nets/-/surface-nets-1.0.2.tgz", - "integrity": "sha1-5DPIy7qUpydMb0yZVStGG/H8eks=", - "requires": { - "ndarray-extract-contour": "^1.0.0", - "triangulate-hypercube": "^1.0.0", - "zero-crossings": "^1.0.0" - } - }, - "svg-arc-to-cubic-bezier": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", - "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==" - }, - "svg-path-bounds": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.1.tgz", - "integrity": "sha1-v0WLeDcmv1NDG0Yz8nkvYHSNn3Q=", - "requires": { - "abs-svg-path": "^0.1.1", - "is-svg-path": "^1.0.1", - "normalize-svg-path": "^1.0.0", - "parse-svg-path": "^0.1.2" - }, - "dependencies": { - "normalize-svg-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.0.1.tgz", - "integrity": "sha1-b3Ka1rcLtMpO/y/ksQdInv4dVv4=", - "requires": { - "svg-arc-to-cubic-bezier": "^3.0.0" - } - } - } - }, - "svg-path-sdf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", - "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", - "requires": { - "bitmap-sdf": "^1.0.0", - "draw-svg-path": "^1.0.0", - "is-svg-path": "^1.0.1", - "parse-svg-path": "^0.1.2", - "svg-path-bounds": "^1.0.1" - } - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "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==" - }, - "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 - }, - "synesthesia": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/synesthesia/-/synesthesia-1.0.1.tgz", - "integrity": "sha1-XvlepUjA1cbm+btLDQcx3/hkp3c=", - "dev": true, - "requires": { - "css-color-names": "0.0.3" - }, - "dependencies": { - "css-color-names": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.3.tgz", - "integrity": "sha1-3gzvFvTYqoIioyDVttfpu62nufY=", - "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" - } - }, - "tapable": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", - "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", - "dev": true - }, - "tape": { - "version": "4.13.3", - "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.3.tgz", - "integrity": "sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==", - "requires": { - "deep-equal": "~1.1.1", - "defined": "~1.0.0", - "dotignore": "~0.1.2", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.6", - "has": "~1.0.3", - "inherits": "~2.0.4", - "is-regex": "~1.0.5", - "minimist": "~1.2.5", - "object-inspect": "~1.7.0", - "resolve": "~1.17.0", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.2.1", - "through": "~2.3.8" - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": 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" - }, - "dependencies": { - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "tar-fs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", - "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - }, - "dependencies": { - "bl": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", - "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "tar-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", - "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", - "dev": true, - "requires": { - "bl": "^4.0.1", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - } - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "temp-file": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.3.7.tgz", - "integrity": "sha512-9tBJKt7GZAQt/Rg0QzVWA8Am8c1EFl+CAv04/aBVqlx5oyfQ508sFIABshQ0xbZu6mBrFLWIUXO/bbLYghW70g==", - "dev": true, - "requires": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^8.1.0" - } - }, - "term-size": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", - "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", - "dev": true - }, - "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" - } - }, - "terser": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", - "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", - "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": "2.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.7.tgz", - "integrity": "sha512-xzYyaHUNhzgaAdBsXxk2Yvo/x1NJdslUaussK3fdpBbvttm1iIwU+c26dj9UxJcwk2c5UWt5F55MUTIA8BE7Dg==", - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.3.1", - "jest-worker": "^25.4.0", - "p-limit": "^2.3.0", - "schema-utils": "^2.6.6", - "serialize-javascript": "^3.1.0", - "source-map": "^0.6.1", - "terser": "^4.6.12", - "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==" - } - } - }, - "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-cache": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/text-cache/-/text-cache-4.2.2.tgz", - "integrity": "sha512-zky+UDYiX0a/aPw/YTBD+EzKMlCTu1chFuCMZeAkgoRiceySdROu1V2kJXhCbtEdBhiOviYnAdGiSYl58HW0ZQ==", - "requires": { - "vectorize-text": "^3.2.1" - } - }, - "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 - }, - "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=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" - }, - "tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" - }, - "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-array-buffer": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/to-array-buffer/-/to-array-buffer-3.2.0.tgz", - "integrity": "sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ==", - "requires": { - "flatten-vertex-data": "^1.0.2", - "is-blob": "^2.0.1", - "string-to-arraybuffer": "^1.0.0" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, - "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-float32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.0.1.tgz", - "integrity": "sha512-nOy2WSwae3xhZbc+05xiCuU3ZPPmH0L4Rg4Q1qiOGFSuNSCTB9nVJaGgGl3ZScxAclX/L8hJuDHJGDAzbfuKCQ==" - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-px": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", - "integrity": "sha1-W7rtXl1PdkRbzJA8KTojB90yRkY=", - "requires": { - "parse-unit": "^1.0.1" - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "to-uint8": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/to-uint8/-/to-uint8-1.4.1.tgz", - "integrity": "sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg==", - "requires": { - "arr-flatten": "^1.1.0", - "clamp": "^1.0.1", - "is-base64": "^0.1.0", - "is-float-array": "^1.0.0", - "to-array-buffer": "^3.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "topojson-client": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", - "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", - "requires": { - "commander": "2" - } - }, - "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" - } - }, - "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "triangulate-hypercube": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/triangulate-hypercube/-/triangulate-hypercube-1.0.1.tgz", - "integrity": "sha1-2Acdsuv8/VHzCNC88qXEils20Tc=", - "requires": { - "gamma": "^0.1.0", - "permutation-parity": "^1.0.0", - "permutation-rank": "^1.0.0" - } - }, - "triangulate-polyline": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/triangulate-polyline/-/triangulate-polyline-1.0.3.tgz", - "integrity": "sha1-v4uod6hQVBA/65+lphtOjXAXgU0=", - "requires": { - "cdt2d": "^1.0.0" - } - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-trailing-lines": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz", - "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==" - }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "^7.1.2" - } - }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", - "dev": true, - "requires": { - "utf8-byte-length": "^1.0.1" - } - }, - "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", - "dev": true - }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - }, - "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=", - "dev": true - }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "optional": true - }, - "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" - } - }, - "turntable-camera-controller": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz", - "integrity": "sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk=", - "requires": { - "filtered-vector": "^1.2.1", - "gl-mat4": "^1.0.2", - "gl-vec3": "^1.0.2" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "two-product": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/two-product/-/two-product-1.0.2.tgz", - "integrity": "sha1-Z9ldSyV6kh4stL16+VEfkIhSLqo=" - }, - "two-sum": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/two-sum/-/two-sum-1.0.0.tgz", - "integrity": "sha1-MdPzIjnk9zHsqd+RVeKyl/AIq2Q=" - }, - "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=", - "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.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "type-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", - "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=" - }, - "typed-styles": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", - "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-pool": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", - "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", - "requires": { - "bit-twiddle": "^1.0.0", - "dup": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - }, - "typescript-compiler": { - "version": "1.4.1-2", - "resolved": "https://registry.npmjs.org/typescript-compiler/-/typescript-compiler-1.4.1-2.tgz", - "integrity": "sha1-uk99si2RU0oZKdkACdzhYety/T8=", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz", - "integrity": "sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.7.0", - "source-map": "^0.6.1", - "uglify-js": "^3.6.0", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "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==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "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==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", - "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 - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "uglify-js": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.4.tgz", - "integrity": "sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA==", - "dev": true, - "requires": { - "commander": "~2.20.3" - } - } - } - }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - } - } - }, - "unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "requires": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "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==" - }, - "unified": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", - "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^2.0.0", - "x-is-string": "^0.1.0" - } - }, - "union-find": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/union-find/-/union-find-1.0.2.tgz", - "integrity": "sha1-KSusQV5q06iVNdI3AQ20pTYoTlg=" - }, - "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==", - "dev": true, - "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" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "unist-util-find-all-after": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz", - "integrity": "sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw==", - "dev": true, - "requires": { - "unist-util-is": "^4.0.0" - }, - "dependencies": { - "unist-util-is": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", - "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==", - "dev": true - } - } - }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-remove-position": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", - "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", - "requires": { - "unist-util-visit": "^1.1.0" - } - }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - }, - "dependencies": { - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } - } - }, - "unist-util-visit-parents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz", - "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q==" - }, - "universal-user-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", - "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", - "dev": true, - "requires": { - "os-name": "^3.1.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 - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true - } - } - }, - "unzip-crx": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/unzip-crx/-/unzip-crx-0.2.0.tgz", - "integrity": "sha1-TAuqi9rHViVnVL7KeEPBPXuFjBg=", - "dev": true, - "requires": { - "jszip": "^3.1.0", - "mkdirp": "^0.5.1", - "yaku": "^0.16.6" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dev": true, - "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - }, - "dependencies": { - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "update-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", - "integrity": "sha1-9RAYLYHugZ+4LDprIrYrve2ngI8=" - }, - "update-notifier": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", - "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", - "dev": true, - "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.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" - } - } - } - }, - "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=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "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=", - "dev": true - } - } - }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "url-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.0.tgz", - "integrity": "sha512-IzgAAIC8wRrg6NYkFIJY09vtktQcsvU8V6HhtQj9PTefbYImzLB1hufqo4m+RyM5N3mLx5BqJKccgxJS+W3kqw==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.26", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "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" - } - }, - "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==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-copy": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/utils-copy/-/utils-copy-1.1.1.tgz", - "integrity": "sha1-biuXmCqozXPhGCo+b4vsPA9AWKc=", - "requires": { - "const-pinf-float64": "^1.0.0", - "object-keys": "^1.0.9", - "type-name": "^2.0.0", - "utils-copy-error": "^1.0.0", - "utils-indexof": "^1.0.0", - "utils-regex-from-string": "^1.0.0", - "validate.io-array": "^1.0.3", - "validate.io-buffer": "^1.0.1", - "validate.io-nonnegative-integer": "^1.0.0" - } - }, - "utils-copy-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-copy-error/-/utils-copy-error-1.0.1.tgz", - "integrity": "sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U=", - "requires": { - "object-keys": "^1.0.9", - "utils-copy": "^1.1.0" - } - }, - "utils-indexof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-indexof/-/utils-indexof-1.0.0.tgz", - "integrity": "sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w=", - "requires": { - "validate.io-array-like": "^1.0.1", - "validate.io-integer-primitive": "^1.0.0" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "utils-regex-from-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz", - "integrity": "sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk=", - "requires": { - "regex-regex": "^1.0.0", - "validate.io-string-primitive": "^1.0.0" - } - }, - "uuid": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz", - "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==" - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", - "dev": true - }, - "v8-to-istanbul": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", - "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "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 - } - } - }, - "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==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate.io-array": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", - "integrity": "sha1-W1osr9j4uFq7L4hroVPy2Tond00=" - }, - "validate.io-array-like": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz", - "integrity": "sha1-evn363tRcVvrIhVmjsXM5U+t21o=", - "requires": { - "const-max-uint32": "^1.0.2", - "validate.io-integer-primitive": "^1.0.0" - } - }, - "validate.io-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz", - "integrity": "sha1-hS1nNAIZFNXROvwyUxdh43IO1E4=" - }, - "validate.io-integer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", - "integrity": "sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg=", - "requires": { - "validate.io-number": "^1.0.3" - } - }, - "validate.io-integer-primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz", - "integrity": "sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY=", - "requires": { - "validate.io-number-primitive": "^1.0.0" - } - }, - "validate.io-matrix-like": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz", - "integrity": "sha1-XsMqddCInaxzbepovdYUWxVe38M=" - }, - "validate.io-ndarray-like": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz", - "integrity": "sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk=" - }, - "validate.io-nonnegative-integer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz", - "integrity": "sha1-gGkkOgjF+Y6VQTySnf17GPP28p8=", - "requires": { - "validate.io-integer": "^1.0.5" - } - }, - "validate.io-number": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", - "integrity": "sha1-9j/+2iSL8opnqNSODjtGGhZluvg=" - }, - "validate.io-number-primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz", - "integrity": "sha1-0uAfICmJNp3PEVVElWQgOv5YTlU=" - }, - "validate.io-positive-integer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz", - "integrity": "sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI=", - "requires": { - "validate.io-integer": "^1.0.5" - } - }, - "validate.io-string-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz", - "integrity": "sha1-uBNbn7E3K94C/dU60dDM1t55j+4=" - }, - "value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vectorize-text": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/vectorize-text/-/vectorize-text-3.2.1.tgz", - "integrity": "sha512-rGojF+D9BB96iPZPUitfq5kaiS6eCJmfEel0NXOK/MzZSuXGiwhoop80PtaDas9/Hg/oaox1tI9g3h93qpuspg==", - "requires": { - "cdt2d": "^1.0.0", - "clean-pslg": "^1.1.0", - "ndarray": "^1.0.11", - "planar-graph-to-polyline": "^1.0.0", - "simplify-planar-graph": "^2.0.1", - "surface-nets": "^1.0.0", - "triangulate-polyline": "^1.0.0" - } - }, - "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" - } - }, - "vfile": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", - "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", - "requires": { - "is-buffer": "^1.1.4", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - }, - "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" - }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", - "requires": { - "unist-util-stringify-position": "^1.1.1" - } - }, - "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==", - "dev": true - }, - "vt-pbf": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.1.tgz", - "integrity": "sha512-pHjWdrIoxurpmTcbfBWXaPwSmtPAHS105253P1qyEfSTV2HJddqjM+kIHquaT/L6lVJIk9ltTGc0IxR/G47hYA==", - "requires": { - "@mapbox/point-geometry": "0.1.0", - "@mapbox/vector-tile": "^1.3.1", - "pbf": "^3.0.5" - } - }, - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "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" - } - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "watchpack": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", - "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", - "dev": true, - "requires": { - "chokidar": "^3.4.0", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - } - }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "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=", - "dev": true, - "optional": true, - "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==", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "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=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "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" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "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=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "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=", - "dev": true, - "optional": true, - "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=", - "dev": true, - "optional": true, - "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=", - "dev": true, - "optional": true, - "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=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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==", - "dev": true, - "optional": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "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" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "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=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "wdio-dot-reporter": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz", - "integrity": "sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg==", - "dev": true - }, - "weak-map": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", - "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" - }, - "weakmap-shim": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/weakmap-shim/-/weakmap-shim-1.1.1.tgz", - "integrity": "sha1-1lr9eEEJshZuAP9XHDMVDsKkC0k=" - }, - "webdriverio": { - "version": "4.14.4", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.14.4.tgz", - "integrity": "sha512-Knp2vzuzP5c5ybgLu+zTwy/l1Gh0bRP4zAr8NWcrStbuomm9Krn9oRF0rZucT6AyORpXinETzmeowFwIoo7mNA==", - "dev": true, - "requires": { - "archiver": "~2.1.0", - "babel-runtime": "^6.26.0", - "css-parse": "^2.0.0", - "css-value": "~0.0.1", - "deepmerge": "~2.0.1", - "ejs": "~2.5.6", - "gaze": "~1.1.2", - "glob": "~7.1.1", - "grapheme-splitter": "^1.0.2", - "inquirer": "~3.3.0", - "json-stringify-safe": "~5.0.1", - "mkdirp": "~0.5.1", - "npm-install-package": "~2.1.0", - "optimist": "~0.6.1", - "q": "~1.5.0", - "request": "^2.83.0", - "rgb2hex": "^0.1.9", - "safe-buffer": "~5.1.1", - "supports-color": "~5.0.0", - "url": "~0.11.0", - "wdio-dot-reporter": "~0.0.8", - "wgxpath": "~1.0.0" - }, - "dependencies": { - "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-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "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==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "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" - } - } - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "deepmerge": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz", - "integrity": "sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ==", - "dev": true - }, - "ejs": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", - "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==", - "dev": true - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "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" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "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" - } - }, - "supports-color": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.0.1.tgz", - "integrity": "sha512-7FQGOlSQ+AQxBNXJpVDj8efTA/FtyB5wcNE1omXXJ0cq6jm1jjDwuROlYDbnzHqdNPqliWFhcioCWSyav+xBnA==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - } - } - } - } - }, - "webgl-context": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", - "integrity": "sha1-jzfXJXz23xzQpJ5qextyG5TMhqA=", - "requires": { - "get-canvas-context": "^1.0.1" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "webpack": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", - "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.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.3", - "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.1", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "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" - } - }, - "enhanced-resolve": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz", - "integrity": "sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ==", - "dev": true, - "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==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "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==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "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==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "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==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "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=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "terser-webpack-plugin": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", - "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^3.1.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz", - "integrity": "sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1", - "bfj": "^6.1.1", - "chalk": "^2.4.1", - "commander": "^2.18.0", - "ejs": "^2.6.1", - "express": "^4.16.3", - "filesize": "^3.6.1", - "gzip-size": "^5.0.0", - "lodash": "^4.17.15", - "mkdirp": "^0.5.1", - "opener": "^1.5.1", - "ws": "^6.0.0" - }, - "dependencies": { - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", - "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==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "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 - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "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" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "webpack-cli": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", - "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", - "dev": true, - "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "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" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "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" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.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==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.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==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "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=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "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=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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" - }, - "dependencies": { - "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" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "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" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.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==", - "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==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.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==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.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 - }, - "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": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "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==", - "dev": true, - "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==" - } - } - }, - "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", - "dev": true, - "requires": { - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "wgxpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wgxpath/-/wgxpath-1.0.0.tgz", - "integrity": "sha1-7vikudVYzEla06mit1FZfs2a9pA=", - "dev": true - }, - "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": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, - "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": "8.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", - "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "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 - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "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 - }, - "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" - } - } - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.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 - }, - "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 - }, - "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" - } - } - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, - "windows-release": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.1.tgz", - "integrity": "sha512-Pngk/RDCaI/DkuHPlGTdIkDiTAnAkyMjoQMZqRsxydNl1qGXNIoZrB7RK8g53F2tEgQBMqQJHQdYZuQEEAu54A==", - "dev": true, - "requires": { - "execa": "^1.0.0" - }, - "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" - } - }, - "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" - } - } - } - }, - "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==" - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "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==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "world-calendars": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", - "integrity": "sha1-slxQMrokEo/8QdCfr0pewbnBQzU=", - "requires": { - "object-assign": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.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" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "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==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "write-file-stdout": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/write-file-stdout/-/write-file-stdout-0.0.2.tgz", - "integrity": "sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE=", - "dev": true - }, - "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==" - }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "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 - }, - "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==", - "dev": true - }, - "yaku": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz", - "integrity": "sha1-HRlceKqbW/hHnIlblQT9TwhHmE4=", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "zero-crossings": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/zero-crossings/-/zero-crossings-1.0.1.tgz", - "integrity": "sha1-xWK9MRNkPzRDokXRJAa4i2m5qf8=", - "requires": { - "cwise-compiler": "^1.0.0" - } - }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", - "dev": true, - "requires": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" - } - } - } -} From 07f16d5026be8f9c568713b53d4c67057bec18fd Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 21 Jun 2020 18:23:48 -0700 Subject: [PATCH 09/66] flow -> ts --- ...alyzeComponent.js => AnalyzeComponent.tsx} | 419 ++++-------- .../{CleanSidebar.js => CleanSidebar.tsx} | 90 +-- app/components/CleanComponent/index.js | 235 ------- app/components/CleanComponent/index.tsx | 176 +++++ .../{ConnectModal.js => ConnectModal.tsx} | 156 ++--- .../{HelpSidebar.js => HelpSidebar.tsx} | 96 +-- ...eTestComponent.js => PreTestComponent.tsx} | 96 +-- .../{RunComponent.js => RunComponent.tsx} | 133 ++-- app/components/CollectComponent/index.js | 140 ---- app/components/CollectComponent/index.tsx | 97 +++ .../DesignComponent/CustomDesignComponent.js | 636 ------------------ .../DesignComponent/CustomDesignComponent.tsx | 432 ++++++++++++ app/components/DesignComponent/ParamSlider.js | 36 - .../DesignComponent/ParamSlider.tsx | 26 + .../DesignComponent/StimuliDesignColumn.js | 122 ---- .../DesignComponent/StimuliDesignColumn.tsx | 94 +++ .../{StimuliRow.js => StimuliRow.tsx} | 46 +- .../DesignComponent/{index.js => index.tsx} | 199 ++---- ...mponent.js => EEGExplorationComponent.tsx} | 82 +-- .../HomeComponent/OverviewComponent.js | 141 ---- .../HomeComponent/OverviewComponent.tsx | 103 +++ .../HomeComponent/{index.js => index.tsx} | 215 ++---- .../{InputCollect.js => InputCollect.tsx} | 73 +- .../{InputModal.js => InputModal.tsx} | 44 +- ...terPlotWidget.js => JupyterPlotWidget.tsx} | 43 +- app/components/PreviewButtonComponent.js | 24 - app/components/PreviewButtonComponent.tsx | 21 + app/components/PreviewExperimentComponent.js | 57 -- app/components/PreviewExperimentComponent.tsx | 53 ++ .../SecondaryNavSegment.js | 27 - .../SecondaryNavSegment.tsx | 19 + .../{index.js => index.tsx} | 57 +- .../SignalQualityIndicatorComponent.js | 70 -- .../SignalQualityIndicatorComponent.tsx | 59 ++ ...aryNavSegment.js => PrimaryNavSegment.tsx} | 17 +- app/components/TopNavComponent/index.js | 117 ---- app/components/TopNavComponent/index.tsx | 88 +++ ...ViewerComponent.js => ViewerComponent.tsx} | 43 +- app/components/d3Classes/EEGViewer.js | 248 ------- app/components/d3Classes/EEGViewer.ts | 168 +++++ .../svgs/ClickableHeadDiagramSVG.js | 421 ------------ .../svgs/ClickableHeadDiagramSVG.tsx | 140 ++++ .../svgs/SignalQualityIndicatorSVG.js | 321 --------- .../svgs/SignalQualityIndicatorSVG.tsx | 135 ++++ 44 files changed, 2194 insertions(+), 3821 deletions(-) rename app/components/{AnalyzeComponent.js => AnalyzeComponent.tsx} (53%) mode change 100755 => 100644 rename app/components/CleanComponent/{CleanSidebar.js => CleanSidebar.tsx} (53%) delete mode 100644 app/components/CleanComponent/index.js create mode 100644 app/components/CleanComponent/index.tsx rename app/components/CollectComponent/{ConnectModal.js => ConnectModal.tsx} (60%) rename app/components/CollectComponent/{HelpSidebar.js => HelpSidebar.tsx} (52%) rename app/components/CollectComponent/{PreTestComponent.js => PreTestComponent.tsx} (57%) rename app/components/CollectComponent/{RunComponent.js => RunComponent.tsx} (55%) delete mode 100644 app/components/CollectComponent/index.js create mode 100644 app/components/CollectComponent/index.tsx delete mode 100644 app/components/DesignComponent/CustomDesignComponent.js create mode 100644 app/components/DesignComponent/CustomDesignComponent.tsx delete mode 100644 app/components/DesignComponent/ParamSlider.js create mode 100644 app/components/DesignComponent/ParamSlider.tsx delete mode 100644 app/components/DesignComponent/StimuliDesignColumn.js create mode 100644 app/components/DesignComponent/StimuliDesignColumn.tsx rename app/components/DesignComponent/{StimuliRow.js => StimuliRow.tsx} (64%) rename app/components/DesignComponent/{index.js => index.tsx} (59%) rename app/components/{EEGExplorationComponent.js => EEGExplorationComponent.tsx} (54%) delete mode 100644 app/components/HomeComponent/OverviewComponent.js create mode 100644 app/components/HomeComponent/OverviewComponent.tsx rename app/components/HomeComponent/{index.js => index.tsx} (66%) rename app/components/{InputCollect.js => InputCollect.tsx} (53%) rename app/components/{InputModal.js => InputModal.tsx} (64%) rename app/components/{JupyterPlotWidget.js => JupyterPlotWidget.tsx} (63%) delete mode 100644 app/components/PreviewButtonComponent.js create mode 100644 app/components/PreviewButtonComponent.tsx delete mode 100644 app/components/PreviewExperimentComponent.js create mode 100644 app/components/PreviewExperimentComponent.tsx delete mode 100644 app/components/SecondaryNavComponent/SecondaryNavSegment.js create mode 100644 app/components/SecondaryNavComponent/SecondaryNavSegment.tsx rename app/components/SecondaryNavComponent/{index.js => index.tsx} (51%) delete mode 100644 app/components/SignalQualityIndicatorComponent.js create mode 100644 app/components/SignalQualityIndicatorComponent.tsx rename app/components/TopNavComponent/{PrimaryNavSegment.js => PrimaryNavSegment.tsx} (52%) delete mode 100644 app/components/TopNavComponent/index.js create mode 100644 app/components/TopNavComponent/index.tsx rename app/components/{ViewerComponent.js => ViewerComponent.tsx} (78%) delete mode 100644 app/components/d3Classes/EEGViewer.js create mode 100644 app/components/d3Classes/EEGViewer.ts delete mode 100644 app/components/svgs/ClickableHeadDiagramSVG.js create mode 100644 app/components/svgs/ClickableHeadDiagramSVG.tsx delete mode 100644 app/components/svgs/SignalQualityIndicatorSVG.js create mode 100644 app/components/svgs/SignalQualityIndicatorSVG.tsx diff --git a/app/components/AnalyzeComponent.js b/app/components/AnalyzeComponent.tsx old mode 100755 new mode 100644 similarity index 53% rename from app/components/AnalyzeComponent.js rename to app/components/AnalyzeComponent.tsx index 9c687d66..e4bd8e7b --- a/app/components/AnalyzeComponent.js +++ b/app/components/AnalyzeComponent.tsx @@ -1,81 +1,67 @@ -// @flow -import React, { Component } from 'react'; -import { - Grid, - Icon, - Segment, - Header, - Dropdown, - Divider, - Button, - Checkbox, - Sidebar, -} from 'semantic-ui-react'; -import { isNil } from 'lodash'; -import Plot from 'react-plotly.js'; -import styles from './styles/common.css'; -import { - DEVICES, - MUSE_CHANNELS, - EMOTIV_CHANNELS, - KERNEL_STATUS, - EXPERIMENTS, -} from '../constants/constants'; -import { - readWorkspaceCleanedEEGData, - getSubjectNamesFromFiles, - readWorkspaceBehaviorData, - readBehaviorData, - storeAggregatedBehaviorData, -} from '../utils/filesystem/storage'; -import { aggregateDataForPlot, aggregateBehaviorDataToSave } from '../utils/behavior/compute'; -import SecondaryNavComponent from './SecondaryNavComponent'; -import ClickableHeadDiagramSVG from './svgs/ClickableHeadDiagramSVG'; -import JupyterPlotWidget from './JupyterPlotWidget'; -import { HelpButton } from './CollectComponent/HelpSidebar'; + +import React, { Component } from "react"; +import { Grid, Icon, Segment, Header, Dropdown, Divider, Button, Checkbox, Sidebar } from "semantic-ui-react"; +import { isNil } from "lodash"; +import Plot from "react-plotly.js"; +import styles from "./styles/common.css"; +import { DEVICES, MUSE_CHANNELS, EMOTIV_CHANNELS, KERNEL_STATUS, EXPERIMENTS } from "../constants/constants"; +import { readWorkspaceCleanedEEGData, getSubjectNamesFromFiles, readWorkspaceBehaviorData, readBehaviorData, storeAggregatedBehaviorData } from "../utils/filesystem/storage"; +import { aggregateDataForPlot, aggregateBehaviorDataToSave } from "../utils/behavior/compute"; +import SecondaryNavComponent from "./SecondaryNavComponent"; +import ClickableHeadDiagramSVG from "./svgs/ClickableHeadDiagramSVG"; +import JupyterPlotWidget from "./JupyterPlotWidget"; +import { HelpButton } from "./CollectComponent/HelpSidebar"; const ANALYZE_STEPS = { OVERVIEW: 'OVERVIEW', ERP: 'ERP', - BEHAVIOR: 'BEHAVIOR', + BEHAVIOR: 'BEHAVIOR' }; const ANALYZE_STEPS_BEHAVIOR = { - BEHAVIOR: 'BEHAVIOR', + BEHAVIOR: 'BEHAVIOR' }; interface Props { title: string; - type: ?EXPERIMENTS; + type: EXPERIMENTS | null | undefined; deviceType: DEVICES; isEEGEnabled: boolean; - kernel: ?Kernel; + kernel: Kernel | null | undefined; kernelStatus: KERNEL_STATUS; - mainChannel: ?any; - epochsInfo: ?Array<{ [string]: number | string }>; - channelInfo: ?Array; - psdPlot: ?{ [string]: string }; - topoPlot: ?{ [string]: string }; - erpPlot: ?{ [string]: string }; + mainChannel: any | null | undefined; + epochsInfo: Array<{ + [key: string]: number | string; + }> | null | undefined; + channelInfo: Array | null | undefined; + psdPlot: { + [key: string]: string; + } | null | undefined; + topoPlot: { + [key: string]: string; + } | null | undefined; + erpPlot: { + [key: string]: string; + } | null | undefined; jupyterActions: Object; } interface State { activeStep: string; selectedChannel: string; - eegFilePaths: Array; - behaviorFilePaths: Array; - selectedFilePaths: Array; - selectedBehaviorFilePaths: Array; - selectedSubjects: Array; + eegFilePaths: Array<{ + key: string; + text: string; + value: {name: string;dir: string;}; + } | null | undefined>; + behaviorFilePaths: Array<{ + key: string; + text: string; + value: string; + } | null | undefined>; + selectedFilePaths: Array; + selectedBehaviorFilePaths: Array; + selectedSubjects: Array; selectedDependentVariable: string; removeOutliers: boolean; showDataPoints: boolean; @@ -83,34 +69,27 @@ interface State { displayOutlierVisible: boolean; displayMode: string; helpMode: string; - dependentVariables: Array; + dependentVariables: Array<{ + key: string; + text: string; + value: string; + } | null | undefined>; } // TODO: Add a channel callback from reading epochs so this screen can be aware of which channels are // available in dataset export default class Analyze extends Component { - // props: Props; - // state: State; - // handleChannelSelect: (string) => void; - // handleStepClick: (Object, Object) => void; - // handleDatasetChange: (Object, Object) => void; - // handleBehaviorDatasetChange: (Object, Object) => void; // handleDependentVariableChange: (Object, Object) => void; + // handleRemoveOutliers: (Object, Object) => void; // handleDisplayModeChange: (string) => void; // handleDataPoints: (Object, Object) => void; // saveSelectedDatasets: () => void; // handleStepClick: (Object, Object) => void; // toggleDisplayInfoVisibility: () => void; - constructor(props: Props) { super(props); this.state = { - activeStep: - this.props.isEEGEnabled === true ? ANALYZE_STEPS.OVERVIEW : ANALYZE_STEPS.BEHAVIOR, + activeStep: this.props.isEEGEnabled === true ? ANALYZE_STEPS.OVERVIEW : ANALYZE_STEPS.BEHAVIOR, eegFilePaths: [{ key: '', text: '', value: '' }], behaviorFilePaths: [{ key: '', text: '', value: '' }], dependentVariables: [{ key: '', text: '', value: '' }], @@ -126,7 +105,7 @@ export default class Analyze extends Component { selectedFilePaths: [], selectedBehaviorFilePaths: [], selectedSubjects: [], - selectedChannel: props.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS[0] : MUSE_CHANNELS[0], + selectedChannel: props.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS[0] : MUSE_CHANNELS[0] }; this.handleChannelSelect = this.handleChannelSelect.bind(this); this.handleDatasetChange = this.handleDatasetChange.bind(this); @@ -148,22 +127,22 @@ export default class Analyze extends Component { } const behavioralData = await readWorkspaceBehaviorData(this.props.title); this.setState({ - eegFilePaths: workspaceCleanData.map((filepath) => ({ + eegFilePaths: workspaceCleanData.map(filepath => ({ key: filepath.name, text: filepath.name, - value: filepath.path, + value: filepath.path })), - behaviorFilePaths: behavioralData.map((filepath) => ({ + behaviorFilePaths: behavioralData.map(filepath => ({ key: filepath.name, text: filepath.name, - value: filepath.path, + value: filepath.path })), - dependentVariables: ['Response Time', 'Accuracy'].map((dv) => ({ + dependentVariables: ['Response Time', 'Accuracy'].map(dv => ({ key: dv, text: dv, - value: dv, + value: dv })), - selectedDependentVariable: 'Response Time', + selectedDependentVariable: 'Response Time' }); } @@ -174,24 +153,21 @@ export default class Analyze extends Component { handleDatasetChange(event: Object, data: Object) { this.setState({ selectedFilePaths: data.value, - selectedSubjects: getSubjectNamesFromFiles(data.value), + selectedSubjects: getSubjectNamesFromFiles(data.value) }); this.props.jupyterActions.loadCleanedEpochs(data.value); } handleBehaviorDatasetChange(event: Object, data: Object) { - const { dataToPlot, layout } = aggregateDataForPlot( - readBehaviorData(data.value), - this.state.selectedDependentVariable, - this.state.removeOutliers, - this.state.showDataPoints, - this.state.displayMode - ); + const { + dataToPlot, + layout + } = aggregateDataForPlot(readBehaviorData(data.value), this.state.selectedDependentVariable, this.state.removeOutliers, this.state.showDataPoints, this.state.displayMode); this.setState({ selectedBehaviorFilePaths: data.value, selectedSubjects: getSubjectNamesFromFiles(data.value), dataToPlot, - layout, + layout }); } @@ -199,82 +175,70 @@ export default class Analyze extends Component { const behavioralData = await readWorkspaceBehaviorData(this.props.title); if (behavioralData.length != this.state.behaviorFilePaths.length) { this.setState({ - behaviorFilePaths: behavioralData.map((filepath) => ({ + behaviorFilePaths: behavioralData.map(filepath => ({ key: filepath.name, text: filepath.name, - value: filepath.path, - })), + value: filepath.path + })) }); } } handleDependentVariableChange(event: Object, data: Object) { - const { dataToPlot, layout } = aggregateDataForPlot( - readBehaviorData(this.state.selectedBehaviorFilePaths), - data.value, - this.state.removeOutliers, - this.state.showDataPoints, - this.state.displayMode - ); + const { + dataToPlot, + layout + } = aggregateDataForPlot(readBehaviorData(this.state.selectedBehaviorFilePaths), data.value, this.state.removeOutliers, this.state.showDataPoints, this.state.displayMode); this.setState({ selectedDependentVariable: data.value, dataToPlot, - layout, + layout }); } handleRemoveOutliers(event: Object, data: Object) { - const { dataToPlot, layout } = aggregateDataForPlot( - readBehaviorData(this.state.selectedBehaviorFilePaths), - this.state.selectedDependentVariable, - !this.state.removeOutliers, - this.state.showDataPoints, - this.state.displayMode - ); + const { + dataToPlot, + layout + } = aggregateDataForPlot(readBehaviorData(this.state.selectedBehaviorFilePaths), this.state.selectedDependentVariable, !this.state.removeOutliers, this.state.showDataPoints, this.state.displayMode); this.setState({ removeOutliers: !this.state.removeOutliers, dataToPlot, layout, - helpMode: 'outliers', + helpMode: 'outliers' }); } handleDataPoints(event: Object, data: Object) { - const { dataToPlot, layout } = aggregateDataForPlot( - readBehaviorData(this.state.selectedBehaviorFilePaths), - this.state.selectedDependentVariable, - this.state.removeOutliers, - !this.state.showDataPoints, - this.state.displayMode - ); + const { + dataToPlot, + layout + } = aggregateDataForPlot(readBehaviorData(this.state.selectedBehaviorFilePaths), this.state.selectedDependentVariable, this.state.removeOutliers, !this.state.showDataPoints, this.state.displayMode); this.setState({ showDataPoints: !this.state.showDataPoints, dataToPlot, - layout, + layout }); } handleDisplayModeChange(displayMode) { if (this.state.selectedBehaviorFilePaths && this.state.selectedBehaviorFilePaths.length > 0) { - const { dataToPlot, layout } = aggregateDataForPlot( - readBehaviorData(this.state.selectedBehaviorFilePaths), - this.state.selectedDependentVariable, - this.state.removeOutliers, - this.state.showDataPoints, - displayMode - ); + const { + dataToPlot, + layout + } = aggregateDataForPlot(readBehaviorData(this.state.selectedBehaviorFilePaths), this.state.selectedDependentVariable, this.state.removeOutliers, this.state.showDataPoints, displayMode); this.setState({ dataToPlot, layout, displayMode, - helpMode: displayMode, + helpMode: displayMode }); } } toggleDisplayInfoVisibility() { this.setState({ - isSidebarVisible: !this.state.isSidebarVisible, + isSidebarVisible: !this.state.isSidebarVisible }); } @@ -289,7 +253,7 @@ export default class Analyze extends Component { this.props.jupyterActions.loadERP(channelName); } - concatSubjectNames = (subjects: Array) => { + concatSubjectNames = (subjects: Array) => { if (subjects.length < 1) { return ''; } @@ -298,30 +262,20 @@ export default class Analyze extends Component { renderEpochLabels() { if (!isNil(this.props.epochsInfo) && this.state.selectedFilePaths.length >= 1) { - const numberConditions = this.props.epochsInfo.filter( - (infoObj) => infoObj.name !== 'Drop Percentage' && infoObj.name !== 'Total Epochs' - ).length; + const numberConditions = this.props.epochsInfo.filter(infoObj => infoObj.name !== 'Drop Percentage' && infoObj.name !== 'Total Epochs').length; let colors; if (numberConditions === 4) { colors = ['red', 'yellow', 'green', 'blue']; } else { colors = ['red', 'green', 'teal', 'orange']; } - return ( -
- {this.props.epochsInfo - .filter( - (infoObj) => infoObj.name !== 'Drop Percentage' && infoObj.name !== 'Total Epochs' - ) - .map((infoObj, index) => ( - <> + return
+ {this.props.epochsInfo.filter(infoObj => infoObj.name !== 'Drop Percentage' && infoObj.name !== 'Total Epochs').map((infoObj, index) => <>
{infoObj.name}
{infoObj.value} - - ))} -
- ); + )} +
; } return
; } @@ -329,74 +283,51 @@ export default class Analyze extends Component { renderHelpContent() { switch (this.state.helpMode) { case 'datapoints': - return this.renderHelp( - 'Data Points', - `In this graph, each dot refers to one data point, clustered by group (e.g., conditions). + return this.renderHelp('Data Points', `In this graph, each dot refers to one data point, clustered by group (e.g., conditions). It’s the most “neutral” way of presenting the data, of course, but it may be difficult to see any patterns. - Why is it always a good idea to look at all your datapoints before interpreting any trends in the data?` - ); + Why is it always a good idea to look at all your datapoints before interpreting any trends in the data?`); case 'errorbars': - return this.renderHelp( - 'Bar Graph', - `Bar graphs are the most common way to summarize data. + return this.renderHelp('Bar Graph', `Bar graphs are the most common way to summarize data. It allows you to compare mean values between groups of datapoints (e.g., conditions), and the error bars give some indication of the variance (here: the standard error of the mean). Importantly, this way of summarizing data assumes that the mean is in fact representative of the data. Many researchers have veered away from bar graphs because they can be deceptive, especially without error bars. - Can you think of any such cases?` - ); + Can you think of any such cases?`); case 'whiskers': - return this.renderHelp( - 'Box Plot', - `Box plots summarize the data in a more informative way: + return this.renderHelp('Box Plot', `Box plots summarize the data in a more informative way: they actually tell you something about the distribution of datapoints within a group, by taking the median as its reference point instead of the mean (the median is the “middle” point in a dataset after sorting it from the lowest to the highest value). The boxes represent so-called “quartiles” which are cut off at the value right between the median and the smallest value or highest value in the dataset. The lines (“whiskers”) show how much variability there is in the data outside of those quartiles; any outliers are shown as individual points. Can you go through each plot and describe exactly what you see? - When you toggle between this view and the bar graph view, do the data look very different?` - ); - case 'outliers': - default: - return this.renderHelp( - 'Outliers', - `A datapoint is tagged as an “outlier” if its value exceeds 2 standard deviations below or above the mean of all data in the group. + When you toggle between this view and the bar graph view, do the data look very different?`); + case 'outliers':default: + return this.renderHelp('Outliers', `A datapoint is tagged as an “outlier” if its value exceeds 2 standard deviations below or above the mean of all data in the group. If a datapoint is unusually high or low (it “deviates”) compared to the rest of the group, it is likely a special case that doesn’t tell us anything informative about the group as a whole. Removing such outliers can help unskew the data. What might outliers mean in your dataset? - Can you think of any other cases where identifying outliers can be helpful?` - ); + Can you think of any other cases where identifying outliers can be helpful?`); + } } renderHelp(header: string, content: string) { - return ( - <> + return <> -

- +

- + - +

- +

- - - - + {this.renderHelpContent()} - - ); + ; + } } render() { - return ( -

- + return
+ {this.renderSectionContent()} -
- ); +
; } -} +} \ No newline at end of file diff --git a/app/components/CleanComponent/CleanSidebar.js b/app/components/CleanComponent/CleanSidebar.tsx similarity index 53% rename from app/components/CleanComponent/CleanSidebar.js rename to app/components/CleanComponent/CleanSidebar.tsx index 5819d2f8..d04ffae7 100644 --- a/app/components/CleanComponent/CleanSidebar.js +++ b/app/components/CleanComponent/CleanSidebar.tsx @@ -1,6 +1,6 @@ -import React, { Component } from 'react'; -import { Segment, Header, Menu, Icon, Button, Grid } from 'semantic-ui-react'; -import styles from '../styles/collect.css'; +import React, { Component } from "react"; +import { Segment, Header, Menu, Icon, Button, Grid } from "semantic-ui-react"; +import styles from "../styles/collect.css"; const HELP_STEP = { MENU: 0, @@ -11,7 +11,7 @@ const HELP_STEP = { LEARN_BRAIN: 5, LEARN_BLINK: 6, LEARN_THOUGHTS: 7, - LEARN_ALPHA: 8, + LEARN_ALPHA: 8 }; interface Props { @@ -22,11 +22,12 @@ interface State { helpStep: HELP_STEP; } export default class CleanSidebar extends Component { + props: Props; constructor(props) { super(props); this.state = { - helpStep: HELP_STEP.MENU, + helpStep: HELP_STEP.MENU }; this.handleStartLearn = this.handleStartLearn.bind(this); this.handleStartSignal = this.handleStartSignal.bind(this); @@ -43,10 +44,7 @@ export default class CleanSidebar extends Component { } handleNext() { - if ( - this.state.helpStep === HELP_STEP.SIGNAL_MOVEMENT || - this.state.helpStep === HELP_STEP.LEARN_ALPHA - ) { + if (this.state.helpStep === HELP_STEP.SIGNAL_MOVEMENT || this.state.helpStep === HELP_STEP.LEARN_ALPHA) { this.setState({ helpStep: HELP_STEP.MENU }); } else { this.setState({ helpStep: this.state.helpStep + 1 }); @@ -58,8 +56,7 @@ export default class CleanSidebar extends Component { } renderMenu() { - return ( - <> + return <>
What would you like to do? @@ -77,13 +74,11 @@ export default class CleanSidebar extends Component {
- - ); + ; } renderHelp(header: string, content: string) { - return ( - <> + return <>
{header} @@ -102,72 +97,37 @@ export default class CleanSidebar extends Component { - - ); + ; } renderHelpContent() { switch (this.state.helpStep) { case HELP_STEP.SIGNAL_EXPLANATION: - return this.renderHelp( - 'Improve the signal quality', - 'In order to collect quality data, you want to make sure that all electrodes have a strong connection' - ); + return this.renderHelp('Improve the signal quality', 'In order to collect quality data, you want to make sure that all electrodes have a strong connection'); case HELP_STEP.SIGNAL_SALINE: - return this.renderHelp( - 'Tip #1: Saturate the sensors in saline', - 'Make sure the sensors are thoroughly soaked with saline solution. They should be wet to the touch' - ); + return this.renderHelp('Tip #1: Saturate the sensors in saline', 'Make sure the sensors are thoroughly soaked with saline solution. They should be wet to the touch'); case HELP_STEP.SIGNAL_CONTACT: - return this.renderHelp( - 'Tip #2: Ensure the sensors are making firm contact', - 'Re-seat the headset to make sure that all sensors contact the head with some tension. You may need to sweep hair out of the way to accomplish this' - ); + return this.renderHelp('Tip #2: Ensure the sensors are making firm contact', 'Re-seat the headset to make sure that all sensors contact the head with some tension. You may need to sweep hair out of the way to accomplish this'); case HELP_STEP.SIGNAL_MOVEMENT: - return this.renderHelp( - 'Tip #3: Stay still', - 'To reduce noise during your experiment, ensure your subject is relaxed and has both feet on the floor. Sometimes, focusing on relaxing the jaw and the tongue can improve the EEG signal' - ); + return this.renderHelp('Tip #3: Stay still', 'To reduce noise during your experiment, ensure your subject is relaxed and has both feet on the floor. Sometimes, focusing on relaxing the jaw and the tongue can improve the EEG signal'); case HELP_STEP.LEARN_BRAIN: - return this.renderHelp( - 'Your brain produces electricity', - 'Using the device that you are wearing, we can detect the electrical activity of your brain.' - ); + return this.renderHelp('Your brain produces electricity', 'Using the device that you are wearing, we can detect the electrical activity of your brain.'); case HELP_STEP.LEARN_BLINK: - return this.renderHelp( - 'Try blinking your eyes', - 'Does the signal change? Eye movements create noise in the EEG signal' - ); + return this.renderHelp('Try blinking your eyes', 'Does the signal change? Eye movements create noise in the EEG signal'); case HELP_STEP.LEARN_THOUGHTS: - return this.renderHelp( - 'Try thinking of a cat', - "Does the signal change? Although EEG can measure overall brain activity, it's not capable of reading minds" - ); + return this.renderHelp('Try thinking of a cat', "Does the signal change? Although EEG can measure overall brain activity, it's not capable of reading minds"); case HELP_STEP.LEARN_ALPHA: - return this.renderHelp( - 'Try closing your eyes for 10 seconds', - 'You may notice a change in your signal due to an increase in alpha waves' - ); - case HELP_STEP.MENU: - default: + return this.renderHelp('Try closing your eyes for 10 seconds', 'You may notice a change in your signal due to an increase in alpha waves'); + case HELP_STEP.MENU:default: return this.renderMenu(); + } } render() { - return ( - - - - ); - } - } - - render() { - return ( - - - - - - - - -
- Clean -
-
-
- - - -
Select & Clean
-

- Ready to clean some data? Select a subject and one or more EEG recordings, then - launch the editor -

-
Select Subject
- -
Select Recordings
- - this.state.selectedSubject === - filepath.value.split(path.sep)[filepath.value.split(path.sep).length - 3] - )} - onChange={this.handleRecordingChange} - /> -
-
- - {this.renderEpochLabels()} - {this.renderAnalyzeButton()} - -
-
-
-
- ); - } -} diff --git a/app/components/CleanComponent/index.tsx b/app/components/CleanComponent/index.tsx new file mode 100644 index 00000000..b17335e1 --- /dev/null +++ b/app/components/CleanComponent/index.tsx @@ -0,0 +1,176 @@ + +import React, { Component } from "react"; +import { Grid, Button, Icon, Segment, Header, Dropdown, Sidebar, SidebarPusher, Divider } from "semantic-ui-react"; +import { Link } from "react-router-dom"; +import { isNil } from "lodash"; +import styles from "./../styles/collect.css"; +import { EXPERIMENTS, DEVICES, KERNEL_STATUS } from "../../constants/constants"; +import { Kernel } from "../../constants/interfaces"; +import { readWorkspaceRawEEGData } from "../../utils/filesystem/storage"; +import CleanSidebar from "./CleanSidebar"; +import * as path from "path"; + +interface Props { + type: EXPERIMENTS | null | undefined; + title: string; + deviceType: DEVICES; + mainChannel: any | null | undefined; + kernel: Kernel | null | undefined; + kernelStatus: KERNEL_STATUS; + epochsInfo: Array<{ + [key: string]: number | string; + }> | null | undefined; + jupyterActions: Object; + experimentActions: Object; + subject: string; + session: number; +} + +interface State { + subjects: Array; + eegFilePaths: Array<{ + key: string; + text: string; + value: {name: string;dir: string;}; + } | null | undefined>; + selectedSubject: string; + selectedFilePaths: Array; +} + +export default class Clean extends Component { + + props: Props; + state: State; + handleRecordingChange: (arg0: Object, arg1: Object) => void; + handleLoadData: () => void; + handleSubjectChange: (arg0: Object, arg1: Object) => void; + icons: string[]; + + constructor(props: Props) { + super(props); + this.state = { + subjects: [], + eegFilePaths: [{ key: '', text: '', value: '' }], + selectedFilePaths: [], + selectedSubject: props.subject + }; + this.handleRecordingChange = this.handleRecordingChange.bind(this); + this.handleLoadData = this.handleLoadData.bind(this); + this.handleSidebarToggle = this.handleSidebarToggle.bind(this); + this.handleSubjectChange = this.handleSubjectChange.bind(this); + this.icons = props.type === EXPERIMENTS.N170 ? ['smile', 'home', 'x', 'book'] : ['star', 'star outline', 'x', 'book']; + } + + async componentDidMount() { + const workspaceRawData = await readWorkspaceRawEEGData(this.props.title); + if (this.props.kernelStatus === KERNEL_STATUS.OFFLINE) { + this.props.jupyterActions.launchKernel(); + } + this.setState({ + subjects: workspaceRawData.map(filepath => filepath.path.split(path.sep)[filepath.path.split(path.sep).length - 3]).reduce((acc, curr) => { + if (acc.find(subject => subject.key === curr)) { + return acc; + } + return acc.concat({ + key: curr, + text: curr, + value: curr + }); + }, []), + eegFilePaths: workspaceRawData.map(filepath => ({ + key: filepath.name, + text: filepath.name, + value: filepath.path + })) + }); + } + + handleRecordingChange(event: Object, data: Object) { + this.setState({ selectedFilePaths: data.value }); + } + + handleSubjectChange(event: Object, data: Object) { + this.setState({ selectedSubject: data.value, selectedFilePaths: [] }); + } + + handleLoadData() { + this.props.experimentActions.setSubject(this.state.selectedSubject); + this.props.jupyterActions.loadEpochs(this.state.selectedFilePaths); + } + + handleSidebarToggle() { + this.setState({ isSidebarVisible: !this.state.isSidebarVisible }); + } + + renderEpochLabels() { + if (!isNil(this.props.epochsInfo) && this.state.selectedFilePaths.length >= 1) { + return + {this.props.epochsInfo.map((infoObj, index) => + + {infoObj.name} +

{infoObj.value}

+
)} +
; + } + return
; + } + + renderAnalyzeButton() { + if (!isNil(this.props.epochsInfo) && this.props.epochsInfo.find(infoObj => infoObj.name === 'Drop Percentage').value >= 2) { + return + + ; + } + } + + render() { + return + + + + + + + +
+ Clean +
+
+
+ + + +
Select & Clean
+

+ Ready to clean some data? Select a subject and one or more EEG recordings, then + launch the editor +

+
Select Subject
+ +
Select Recordings
+ this.state.selectedSubject === filepath.value.split(path.sep)[filepath.value.split(path.sep).length - 3])} onChange={this.handleRecordingChange} /> +
+
+ + {this.renderEpochLabels()} + {this.renderAnalyzeButton()} + +
+
+
+
; + } +} \ No newline at end of file diff --git a/app/components/CollectComponent/ConnectModal.js b/app/components/CollectComponent/ConnectModal.tsx similarity index 60% rename from app/components/CollectComponent/ConnectModal.js rename to app/components/CollectComponent/ConnectModal.tsx index 8ad605e4..e127616b 100644 --- a/app/components/CollectComponent/ConnectModal.js +++ b/app/components/CollectComponent/ConnectModal.tsx @@ -1,20 +1,15 @@ -import React, { Component } from 'react'; -import { isNil, debounce } from 'lodash'; -import { Modal, Button, Segment, List, Grid, Divider } from 'semantic-ui-react'; -import { - DEVICES, - DEVICE_AVAILABILITY, - CONNECTION_STATUS, - SCREENS, -} from '../../constants/constants'; -import styles from '../styles/collect.css'; +import React, { Component } from "react"; +import { isNil, debounce } from "lodash"; +import { Modal, Button, Segment, List, Grid, Divider } from "semantic-ui-react"; +import { DEVICES, DEVICE_AVAILABILITY, CONNECTION_STATUS, SCREENS } from "../../constants/constants"; +import styles from "../styles/collect.css"; interface Props { history: Object; open: boolean; onClose: () => void; connectedDevice: Object; - signalQualityObservable: ?any; + signalQualityObservable: any | null | undefined; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; @@ -23,21 +18,20 @@ interface Props { } interface State { - selectedDevice: ?any; + selectedDevice: any | null | undefined; instructionProgress: number; } const INSTRUCTION_PROGRESS = { SEARCHING: 0, TURN_ON: 1, - COMPUTER_CONNECTABILITY: 2, + COMPUTER_CONNECTABILITY: 2 }; export default class ConnectModal extends Component { - // handleConnect: () => void; // handleSearch: () => void; - // handleStartTutorial: () => void; + // handleStartTutorial: () => void; static getDeviceName(device: any) { if (!isNil(device)) { return isNil(device.name) ? device.id : device.name; @@ -49,30 +43,24 @@ export default class ConnectModal extends Component { super(props); this.state = { selectedDevice: null, - instructionProgress: INSTRUCTION_PROGRESS.SEARCHING, + instructionProgress: INSTRUCTION_PROGRESS.SEARCHING }; this.handleSearch = debounce(this.handleSearch.bind(this), 300, { leading: true, - trailing: false, + trailing: false }); this.handleConnect = debounce(this.handleConnect.bind(this), 1000, { leading: true, - trailing: false, + trailing: false }); this.handleinstructionProgress = this.handleinstructionProgress.bind(this); } componentWillUpdate(nextProps: Props) { - if ( - nextProps.deviceAvailability === DEVICE_AVAILABILITY.NONE && - this.props.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING - ) { + if (nextProps.deviceAvailability === DEVICE_AVAILABILITY.NONE && this.props.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING) { this.setState({ instructionProgress: 1 }); } - if ( - nextProps.deviceAvailability === DEVICE_AVAILABILITY.AVAILABLE && - this.props.deviceAvailability === DEVICE_AVAILABILITY.NONE - ) { + if (nextProps.deviceAvailability === DEVICE_AVAILABILITY.AVAILABLE && this.props.deviceAvailability === DEVICE_AVAILABILITY.NONE) { this.setState({ instructionProgress: 0 }); } } @@ -93,53 +81,36 @@ export default class ConnectModal extends Component { } renderAvailableDeviceList() { - return ( - + return - {this.props.availableDevices.map((device) => ( - - this.setState({ selectedDevice: device })} - /> + {this.props.availableDevices.map(device => + this.setState({ selectedDevice: device })} /> {ConnectModal.getDeviceName(device)} - - ))} + )} - - ); + ; } renderContent() { if (this.props.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING) { - return ( - <> + return <> Searching for available headset(s)... - - ); + ; } if (this.props.connectionStatus === CONNECTION_STATUS.CONNECTING) { - return ( - <> + return <> Connecting to {ConnectModal.getDeviceName(this.state.selectedDevice)} ... - - ); + ; } if (this.state.instructionProgress === INSTRUCTION_PROGRESS.TURN_ON) { - return ( - <> + return <> Turn your headset on Make sure your headset is on and fully charged. @@ -150,35 +121,21 @@ export default class ConnectModal extends Component { - {this.state.step !== 0 && ( - - )} + } - - - ); + ; } if (this.state.instructionProgress === INSTRUCTION_PROGRESS.COMPUTER_CONNECTABILITY) { - return ( - <> + return <> Insert the USB Receiver Insert the USB receiver into a USB port on your computer. Ensure that the LED on the @@ -188,11 +145,7 @@ export default class ConnectModal extends Component { - @@ -203,12 +156,10 @@ export default class ConnectModal extends Component { - - ); + ; } if (this.props.deviceAvailability === DEVICE_AVAILABILITY.AVAILABLE) { - return ( - <> + return <> Headset(s) found Please select which headset you would like to connect. {this.renderAvailableDeviceList()} @@ -216,21 +167,12 @@ export default class ConnectModal extends Component { - - @@ -241,34 +183,14 @@ export default class ConnectModal extends Component { Don't see your device? - - ); + ; } } render() { - return ( - - - - ); + ; } renderHelpContent() { switch (this.state.helpStep) { case HELP_STEP.SIGNAL_EXPLANATION: - return this.renderHelp( - 'Improve the signal quality', - 'In order to collect quality data, you want to make sure that all electrodes have a strong connection' - ); + return this.renderHelp('Improve the signal quality', 'In order to collect quality data, you want to make sure that all electrodes have a strong connection'); case HELP_STEP.SIGNAL_SALINE: - return this.renderHelp( - 'Tip #1: Saturate the sensors in saline', - 'Make sure the sensors are thoroughly soaked with saline solution. They should be wet to the touch' - ); + return this.renderHelp('Tip #1: Saturate the sensors in saline', 'Make sure the sensors are thoroughly soaked with saline solution. They should be wet to the touch'); case HELP_STEP.SIGNAL_CONTACT: - return this.renderHelp( - 'Tip #2: Ensure the sensors are making firm contact', - 'Re-seat the headset to make sure that all sensors contact the head with some tension. Take extra care to make sure the reference electrodes (the ones right behind the ears) make proper contact. You may need to sweep hair out of the way to accomplish this' - ); + return this.renderHelp('Tip #2: Ensure the sensors are making firm contact', 'Re-seat the headset to make sure that all sensors contact the head with some tension. Take extra care to make sure the reference electrodes (the ones right behind the ears) make proper contact. You may need to sweep hair out of the way to accomplish this'); case HELP_STEP.SIGNAL_MOVEMENT: - return this.renderHelp( - 'Tip #3: Stay still', - 'To reduce noise during your experiment, ensure your subject is relaxed and has both feet on the floor. Sometimes, focusing on relaxing the jaw and the tongue can improve the EEG signal' - ); + return this.renderHelp('Tip #3: Stay still', 'To reduce noise during your experiment, ensure your subject is relaxed and has both feet on the floor. Sometimes, focusing on relaxing the jaw and the tongue can improve the EEG signal'); case HELP_STEP.LEARN_BRAIN: - return this.renderHelp( - 'Your brain produces electricity', - 'Using the device that you are wearing, we can detect the electrical activity of your brain.' - ); + return this.renderHelp('Your brain produces electricity', 'Using the device that you are wearing, we can detect the electrical activity of your brain.'); case HELP_STEP.LEARN_BLINK: - return this.renderHelp( - 'Try blinking your eyes', - 'Does the signal change? Eye movements create noise in the EEG signal' - ); + return this.renderHelp('Try blinking your eyes', 'Does the signal change? Eye movements create noise in the EEG signal'); case HELP_STEP.LEARN_THOUGHTS: - return this.renderHelp( - 'Try thinking of a cat', - "Does the signal change? Although EEG can measure overall brain activity, it's not capable of reading minds" - ); + return this.renderHelp('Try thinking of a cat', "Does the signal change? Although EEG can measure overall brain activity, it's not capable of reading minds"); case HELP_STEP.LEARN_ALPHA: - return this.renderHelp( - 'Try closing your eyes for 10 seconds', - 'You may notice a change in your signal due to an increase in alpha waves' - ); - case HELP_STEP.MENU: - default: + return this.renderHelp('Try closing your eyes for 10 seconds', 'You may notice a change in your signal due to an increase in alpha waves'); + case HELP_STEP.MENU:default: return this.renderMenu(); + } } render() { - return ( - + return @@ -170,17 +143,12 @@ export default class PreTestComponent extends Component { {this.renderSignalQualityOrPreview()} - + {this.renderHelpButton()} - - ); + ; } -} +} \ No newline at end of file diff --git a/app/components/CollectComponent/RunComponent.js b/app/components/CollectComponent/RunComponent.tsx similarity index 55% rename from app/components/CollectComponent/RunComponent.js rename to app/components/CollectComponent/RunComponent.tsx index 8758d20d..571f1c90 100644 --- a/app/components/CollectComponent/RunComponent.js +++ b/app/components/CollectComponent/RunComponent.tsx @@ -1,27 +1,31 @@ -// @flow -import React, { Component } from 'react'; -import { Grid, Button, Segment, Header, Divider } from 'semantic-ui-react'; -import { Link } from 'react-router-dom'; -import styles from '../styles/common.css'; -import InputCollect from '../InputCollect'; -import { injectEmotivMarker } from '../../utils/eeg/emotiv'; -import { injectMuseMarker } from '../../utils/eeg/muse'; -import { EXPERIMENTS, DEVICES } from '../../constants/constants'; -import { ExperimentWindow } from '../../utils/labjs'; -import { checkFileExists, getImages } from '../../utils/filesystem/storage'; -import { MainTimeline, Trial, ExperimentParameters } from '../../constants/interfaces'; - -import { remote } from 'electron'; - -const { dialog } = remote; + +import React, { Component } from "react"; +import { Grid, Button, Segment, Header, Divider } from "semantic-ui-react"; +import { Link } from "react-router-dom"; +import styles from "../styles/common.css"; +import InputCollect from "../InputCollect"; +import { injectEmotivMarker } from "../../utils/eeg/emotiv"; +import { injectMuseMarker } from "../../utils/eeg/muse"; +import { EXPERIMENTS, DEVICES } from "../../constants/constants"; +import { ExperimentWindow } from "../../utils/labjs"; +import { checkFileExists, getImages } from "../../utils/filesystem/storage"; +import { MainTimeline, Trial, ExperimentParameters } from "../../constants/interfaces"; + +import { remote } from "electron"; + +const { + dialog +} = remote; interface Props { - type: ?EXPERIMENTS; + type: EXPERIMENTS | null | undefined; title: string; isRunning: boolean; params: ExperimentParameters; mainTimeline: MainTimeline; - trials: { [string]: Trial }; + trials: { + [key: string]: Trial; + }; timelines: {}; subject: string; group: string; @@ -36,17 +40,14 @@ interface State { } export default class Run extends Component { - // props: Props; - // state: State; - // handleStartExperiment: () => void; + // insertLabJsCallback: () => void; // handleCloseInputCollect: (string, string, number) => void; // handleClean: () => void; - constructor(props: Props) { super(props); this.state = { - isInputCollectOpen: props.subject.length === 0, + isInputCollectOpen: props.subject.length === 0 }; this.handleStartExperiment = this.handleStartExperiment.bind(this); this.insertLabJsCallback = this.insertLabJsCallback.bind(this); @@ -61,13 +62,15 @@ export default class Run extends Component { handleStartExperiment() { const filename = `${this.props.subject}-${this.props.group}-${this.props.session}-behavior.csv`; - const { subject, title } = this.props; + const { + subject, + title + } = this.props; const fileExists = checkFileExists(title, subject, filename); if (fileExists) { const options = { buttons: ['No', 'Yes'], - message: - 'You already have a file with the same name. If you continue the experiment, the current file will be deleted. Do you really want to overwrite the data?', + message: 'You already have a file with the same name. If you continue the experiment, the current file will be deleted. Do you really want to overwrite the data?' }; const response = dialog.showMessageBox(options); if (response === 1) { @@ -100,32 +103,22 @@ export default class Run extends Component { renderCleanButton() { if (this.props.session > 1 && this.props.isEEGEnabled) { - return ( - + return - - ); + ; } } renderExperiment() { if (!this.props.isRunning) { - return ( -
+ return
{this.props.title}
-
-
- ); +
; } - return ( -
- { - this.props.experimentActions.stop({ data: csv }); - }, - }} - /> -
- ); + return
+ { + this.props.experimentActions.stop({ data: csv }); + } + }} /> +
; } render() { - return ( -
+ return
{this.renderExperiment()} - this.setState({ isInputCollectOpen: false })} - header='Enter Data' - data={{ - subject: this.props.subject, - group: this.props.group, - session: this.props.session, - }} - /> -
- ); + this.setState({ isInputCollectOpen: false })} header='Enter Data' data={{ + subject: this.props.subject, + group: this.props.group, + session: this.props.session + }} /> +
; } -} +} \ No newline at end of file diff --git a/app/components/CollectComponent/index.js b/app/components/CollectComponent/index.js deleted file mode 100644 index 93b57e0f..00000000 --- a/app/components/CollectComponent/index.js +++ /dev/null @@ -1,140 +0,0 @@ -// @flow -import React, { Component } from 'react'; -import { isNil } from 'lodash'; -import { - EXPERIMENTS, - DEVICES, - CONNECTION_STATUS, - DEVICE_AVAILABILITY, -} from '../../constants/constants'; -import { MainTimeline, Trial, ExperimentParameters } from '../../constants/interfaces'; -import PreTestComponent from './PreTestComponent'; -import ConnectModal from './ConnectModal'; -import RunComponent from './RunComponent'; - -interface Props { - history: Object; - experimentActions: Object; - connectedDevice: Object; - signalQualityObservable: ?any; - deviceType: DEVICES; - deviceAvailability: DEVICE_AVAILABILITY; - connectionStatus: CONNECTION_STATUS; - deviceActions: Object; - availableDevices: Array; - type: ?EXPERIMENTS; - isRunning: boolean; - params: ?ExperimentParameters; - mainTimeline: ?MainTimeline; - trials: ?{ [string]: Trial }; - timelines: ?{}; - subject: string; - group: string; - session: number; - isEEGEnabled: boolean; -} - -interface State { - isConnectModalOpen: boolean; - isRunComponentOpen: boolean; -} - -export default class Collect extends Component { - // props: Props; - // state: State; - // handleStartConnect: () => void; - // handleConnectModalClose: () => void; - // handleRunComponentOpen: () => void; - // handleRunComponentClose: () => void; - - constructor(props: Props) { - super(props); - this.state = { - isConnectModalOpen: false, - isRunComponentOpen: !props.isEEGEnabled, - }; - this.handleStartConnect = this.handleStartConnect.bind(this); - this.handleConnectModalClose = this.handleConnectModalClose.bind(this); - this.handleRunComponentOpen = this.handleRunComponentOpen.bind(this); - this.handleRunComponentClose = this.handleRunComponentClose.bind(this); - if (isNil(props.params)) { - props.experimentActions.loadDefaultTimeline(); - } - } - - componentDidMount() { - if (this.props.connectionStatus !== CONNECTION_STATUS.CONNECTED && this.props.isEEGEnabled) { - this.handleStartConnect(); - } - } - - componentDidUpdate = (prevProps: Props, prevState: State) => { - if ( - this.props.connectionStatus === CONNECTION_STATUS.CONNECTED && - prevState.isConnectModalOpen - ) { - this.setState({ isConnectModalOpen: false }); - } - }; - - handleStartConnect() { - this.setState({ isConnectModalOpen: true }); - this.props.deviceActions.setDeviceAvailability(DEVICE_AVAILABILITY.SEARCHING); - } - - handleConnectModalClose() { - this.setState({ isConnectModalOpen: false }); - } - - handleRunComponentOpen() { - this.setState({ isRunComponentOpen: true }); - } - - handleRunComponentClose() { - this.setState({ isRunComponentOpen: false }); - } - - render() { - if (this.state.isRunComponentOpen) { - return ; - } - return ( - <> - - - - ); - } -} diff --git a/app/components/CollectComponent/index.tsx b/app/components/CollectComponent/index.tsx new file mode 100644 index 00000000..9265d9e0 --- /dev/null +++ b/app/components/CollectComponent/index.tsx @@ -0,0 +1,97 @@ + +import React, { Component } from "react"; +import { isNil } from "lodash"; +import { EXPERIMENTS, DEVICES, CONNECTION_STATUS, DEVICE_AVAILABILITY } from "../../constants/constants"; +import { MainTimeline, Trial, ExperimentParameters } from "../../constants/interfaces"; +import PreTestComponent from "./PreTestComponent"; +import ConnectModal from "./ConnectModal"; +import RunComponent from "./RunComponent"; + +interface Props { + history: Object; + experimentActions: Object; + connectedDevice: Object; + signalQualityObservable: any | null | undefined; + deviceType: DEVICES; + deviceAvailability: DEVICE_AVAILABILITY; + connectionStatus: CONNECTION_STATUS; + deviceActions: Object; + availableDevices: Array; + type: EXPERIMENTS | null | undefined; + isRunning: boolean; + params: ExperimentParameters | null | undefined; + mainTimeline: MainTimeline | null | undefined; + trials: { + [key: string]: Trial; + } | null | undefined; + timelines: {} | null | undefined; + subject: string; + group: string; + session: number; + isEEGEnabled: boolean; +} + +interface State { + isConnectModalOpen: boolean; + isRunComponentOpen: boolean; +} + +export default class Collect extends Component { + + // handleConnectModalClose: () => void; + // handleRunComponentOpen: () => void; + // handleRunComponentClose: () => void; + constructor(props: Props) { + super(props); + this.state = { + isConnectModalOpen: false, + isRunComponentOpen: !props.isEEGEnabled + }; + this.handleStartConnect = this.handleStartConnect.bind(this); + this.handleConnectModalClose = this.handleConnectModalClose.bind(this); + this.handleRunComponentOpen = this.handleRunComponentOpen.bind(this); + this.handleRunComponentClose = this.handleRunComponentClose.bind(this); + if (isNil(props.params)) { + props.experimentActions.loadDefaultTimeline(); + } + } + + componentDidMount() { + if (this.props.connectionStatus !== CONNECTION_STATUS.CONNECTED && this.props.isEEGEnabled) { + this.handleStartConnect(); + } + } + + componentDidUpdate = (prevProps: Props, prevState: State) => { + if (this.props.connectionStatus === CONNECTION_STATUS.CONNECTED && prevState.isConnectModalOpen) { + this.setState({ isConnectModalOpen: false }); + } + }; + + handleStartConnect() { + this.setState({ isConnectModalOpen: true }); + this.props.deviceActions.setDeviceAvailability(DEVICE_AVAILABILITY.SEARCHING); + } + + handleConnectModalClose() { + this.setState({ isConnectModalOpen: false }); + } + + handleRunComponentOpen() { + this.setState({ isRunComponentOpen: true }); + } + + handleRunComponentClose() { + this.setState({ isRunComponentOpen: false }); + } + + render() { + if (this.state.isRunComponentOpen) { + return ; + } + return <> + + + ; + } +} \ No newline at end of file diff --git a/app/components/DesignComponent/CustomDesignComponent.js b/app/components/DesignComponent/CustomDesignComponent.js deleted file mode 100644 index 1a3edeb8..00000000 --- a/app/components/DesignComponent/CustomDesignComponent.js +++ /dev/null @@ -1,636 +0,0 @@ -// @flow -import React, { Component } from 'react'; -import { Grid, Button, Segment, Header, Form, Checkbox, Image, Table } from 'semantic-ui-react'; -import { isNil } from 'lodash'; -import styles from '../styles/common.css'; -import { EXPERIMENTS, SCREENS } from '../../constants/constants'; -import { - MainTimeline, - Trial, - ExperimentParameters, - ExperimentDescription, -} from '../../constants/interfaces'; -import SecondaryNavComponent from '../SecondaryNavComponent'; -import PreviewExperimentComponent from '../PreviewExperimentComponent'; -import StimuliDesignColumn from './StimuliDesignColumn'; -import ParamSlider from './ParamSlider'; -import PreviewButton from '../PreviewButtonComponent'; -import researchQuestionImage from '../../assets/common/ResearchQuestion2.png'; -import methodsImage from '../../assets/common/Methods2.png'; -import hypothesisImage from '../../assets/common/Hypothesis2.png'; -import { loadProtocol } from '../../utils/labjs/functions'; -import { readImages } from '../../utils/filesystem/storage'; -import StimuliRow from './StimuliRow'; - -const CUSTOM_STEPS = { - OVERVIEW: 'OVERVIEW', - CONDITIONS: 'CONDITIONS', - TRIALS: 'TRIALS', - PARAMETERS: 'PARAMETERS', - INSTRUCTIONS: 'INSTRUCTIONS', - PREVIEW: 'PREVIEW', -}; - -const FIELDS = { - QUESTION: 'Research Question', - HYPOTHESIS: 'Hypothesis', - METHODS: 'Methods', - INTRO: 'Experiment Instructions', - HELP: 'Instructions for the task screen', -}; - -interface Props { - history: Object; - type: ?EXPERIMENTS; - title: string; - params: ExperimentParameters; - mainTimeline: MainTimeline; - trials: { [string]: Trial }; - timelines: {}; - experimentActions: Object; - isEEGEnabled: boolean; - description: ExperimentDescription; -} - -interface State { - activeStep: string; - isPreviewing: boolean; - description: ExperimentDescription; - params: ExperimentParameters; - saved: boolean; -} - -export default class CustomDesign extends Component { - // props: Props; - // state: State; - // handleStepClick: (string) => void; - // handleStartExperiment: (Object) => void; - // handlePreview: () => void; - // handleSaveParams: () => void; - // handleProgressBar: (Object, Object) => void; - - constructor(props: Props) { - super(props); - this.state = { - activeStep: CUSTOM_STEPS.OVERVIEW, - isPreviewing: true, - description: props.description, - params: props.params, - saved: false, - }; - this.handleStepClick = this.handleStepClick.bind(this); - this.handleStartExperiment = this.handleStartExperiment.bind(this); - this.handlePreview = this.handlePreview.bind(this); - this.handleSaveParams = this.handleSaveParams.bind(this); - this.handleProgressBar = this.handleProgressBar.bind(this); - this.handleEEGEnabled = this.handleEEGEnabled.bind(this); - if (isNil(props.params)) { - props.experimentActions.loadDefaultTimeline(); - } - this.endPreview = this.endPreview.bind(this); - } - - endPreview() { - // this.setState({ isPreviewing: false }); - } - - handleStepClick(step: string) { - this.handleSaveParams(); - this.setState({ activeStep: step }); - } - - handleProgressBar(event: Object, data: Object) { - this.setState({ - params: { ...this.state.params, showProgessBar: data.checked }, - }); - } - - handleEEGEnabled(event: Object, data: Object) { - this.props.experimentActions.setEEGEnabled(data.checked); - } - - handleStartExperiment() { - this.props.history.push(SCREENS.COLLECT.route); - } - - handlePreview(e) { - e.target.blur(); - this.setState({ isPreviewing: !this.state.isPreviewing }); - } - - handleSaveParams() { - this.props.experimentActions.setParams(this.state.params); - this.props.experimentActions.setDescription(this.state.description); - this.props.experimentActions.saveWorkspace(); - this.setState({ saved: true }); - } - - renderSectionContent() { - const stimi = [ - { name: 'stimulus1', number: 1 }, - { name: 'stimulus2', number: 2 }, - { name: 'stimulus3', number: 3 }, - { name: 'stimulus4', number: 4 }, - ]; - switch (this.state.activeStep) { - case CUSTOM_STEPS.OVERVIEW: - default: - return ( - - - -
- - this.setState({ - description: { - ...this.state.description, - question: data.value, - }, - saved: false, - }) - } - /> - -
- - -
- - this.setState({ - description: { - ...this.state.description, - hypothesis: data.value, - }, - saved: false, - }) - } - /> - -
- - -
- - this.setState({ - description: { - ...this.state.description, - methods: data.value, - }, - saved: false, - }) - } - /> - -
-
- ); - - case CUSTOM_STEPS.CONDITIONS: - return ( - - -
Conditions
-

- Select the folder with images for each condition and choose the correct response. - You can upload image files with the following extensions: ".png", ".jpg", ".jpeg". - Make sure when you preview your experiment that the resolution is high enough. You - can resize or compress your images in an image editing program or on one of the - websites online. -

-
- - - - - - Condition - - Default Key Response - Condition Folder - - - - - {stimi.map(({ name, number }) => ( - trial.type === number).length - } - onChange={async (key, data, changedName) => { - await this.setState({ - params: { - ...this.state.params, - [changedName]: { ...this.state.params[changedName], [key]: data }, - }, - }); - let newStimuli = []; - await stimi.map((stimul) => { - let dirStimuli = []; - const dir = this.state.params[stimul.name].dir; - if (dir && typeof dir !== 'undefined' && dir !== '') { - dirStimuli = readImages(dir).map((i) => ({ - dir: dir, - filename: i, - name: i, - condition: this.state.params[stimul.name].title, - response: this.state.params[stimul.name].response, - phase: 'main', - type: stimul.number, - })); - } - if (dirStimuli.length) dirStimuli[0].phase = 'practice'; - newStimuli = newStimuli.concat(...dirStimuli); - }); - this.setState({ - params: { - ...this.state.params, - stimuli: [...newStimuli], - nbTrials: newStimuli.filter((t) => t.phase === 'main').length, - nbPracticeTrials: newStimuli.filter((t) => t.phase === 'practice').length, - }, - saved: false, - }); - }} - /> - ))} - -
-
- ); - - case CUSTOM_STEPS.TRIALS: - return ( - -
-
-
Trials
-

Edit the correct key response and type of each trial.

-
- -
-
- - - this.setState({ - params: { - ...this.state.params, - randomize: data.value, - }, - saved: false, - }) - } - placeholder='Response' - options={[ - { key: 'random', text: 'Random', value: 'random' }, - { key: 'sequential', text: 'Sequential', value: 'sequential' }, - ]} - /> - - this.setState({ - params: { - ...this.state.params, - nbTrials: parseInt(data.value), - }, - saved: false, - }) - } - /> - - this.setState({ - params: { - ...this.state.params, - nbPracticeTrials: parseInt(data.value), - }, - saved: false, - }) - } - /> - -
-
-
- - - - - - Name - - Condition - Correct Key Response - Trial Type - - - - {this.state.params.stimuli && - this.state.params.stimuli.map((e, num) => ( - this.state.params[`stimulus${n}`].title)} - {...e} - onDelete={(num) => { - const stimuli = this.state.params.stimuli; - stimuli.splice(num, 1); - const nbPracticeTrials = stimuli.filter((s) => s.phase === 'practice') - .length; - const nbTrials = stimuli.filter((s) => s.phase === 'main').length; - this.setState({ - params: { - ...this.state.params, - stimuli: [...stimuli], - nbPracticeTrials, - nbTrials, - }, - saved: false, - }); - }} - onChange={(num, key, data) => { - const stimuli = this.state.params.stimuli; - stimuli[num][key] = data; - let nbPracticeTrials = this.state.params.nbPracticeTrials; - let nbTrials = this.state.params.nbTrials; - if (key === 'phase') { - nbPracticeTrials = stimuli.filter((s) => s.phase === 'practice').length; - nbTrials = stimuli.filter((s) => s.phase === 'main').length; - } - this.setState({ - params: { - ...this.state.params, - stimuli: [...stimuli], - nbPracticeTrials, - nbTrials, - }, - saved: false, - }); - }} - /> - ))} - -
-
- ); - - case CUSTOM_STEPS.PARAMETERS: - return ( - - - -
Inter-trial interval
-

- Select the inter-trial interval duration. This is the amount of time between - trials measured from the end of one trial to the start of the next one. -

-
- - - this.setState({ - params: { ...this.state.params, iti: value }, - saved: false, - }) - } - /> - -
- - - -
Image duration
-

- Select the time of presentation or make it self-paced - present the image until - participants respond. -

-
- - - this.setState({ - params: { ...this.state.params, selfPaced: !this.state.params.selfPaced }, - saved: false, - }) - } - /> - - - {!this.state.params.selfPaced ? ( - - - this.setState({ - params: { ...this.state.params, presentationTime: value }, - saved: false, - }) - } - /> - - ) : ( - - )} -
-
- ); - - case CUSTOM_STEPS.INSTRUCTIONS: - return ( - - - -
Experiment Instructions
-

Edit the instruction that will be displayed on the first screen.

-
- - this.setState({ - params: { ...this.state.params, intro: data.value }, - saved: false, - }) - } - /> - -
-
- - - -
Instructions for the task screen
-

Edit the instruction that will be displayed in the footer during the task.

-
- - this.setState({ - params: { ...this.state.params, taskHelp: data.value }, - saved: false, - }) - } - /> - -
-
-
- ); - - case CUSTOM_STEPS.PREVIEW: - return ( - - - - - - - - this.handlePreview(e)} - /> - - - - ); - } - } - - render() { - return ( -
- this.handleEEGEnabled(event, data)} - className={styles.EEGToggle} - /> - } - saveButton={ - - } - /> - {this.renderSectionContent()} -
- ); - } -} diff --git a/app/components/DesignComponent/CustomDesignComponent.tsx b/app/components/DesignComponent/CustomDesignComponent.tsx new file mode 100644 index 00000000..d687b39d --- /dev/null +++ b/app/components/DesignComponent/CustomDesignComponent.tsx @@ -0,0 +1,432 @@ + +import React, { Component } from "react"; +import { Grid, Button, Segment, Header, Form, Checkbox, Image, Table } from "semantic-ui-react"; +import { isNil } from "lodash"; +import styles from "../styles/common.css"; +import { EXPERIMENTS, SCREENS } from "../../constants/constants"; +import { MainTimeline, Trial, ExperimentParameters, ExperimentDescription } from "../../constants/interfaces"; +import SecondaryNavComponent from "../SecondaryNavComponent"; +import PreviewExperimentComponent from "../PreviewExperimentComponent"; +import StimuliDesignColumn from "./StimuliDesignColumn"; +import ParamSlider from "./ParamSlider"; +import PreviewButton from "../PreviewButtonComponent"; +import researchQuestionImage from "../../assets/common/ResearchQuestion2.png"; +import methodsImage from "../../assets/common/Methods2.png"; +import hypothesisImage from "../../assets/common/Hypothesis2.png"; +import { loadProtocol } from "../../utils/labjs/functions"; +import { readImages } from "../../utils/filesystem/storage"; +import StimuliRow from "./StimuliRow"; + +const CUSTOM_STEPS = { + OVERVIEW: 'OVERVIEW', + CONDITIONS: 'CONDITIONS', + TRIALS: 'TRIALS', + PARAMETERS: 'PARAMETERS', + INSTRUCTIONS: 'INSTRUCTIONS', + PREVIEW: 'PREVIEW' +}; + +const FIELDS = { + QUESTION: 'Research Question', + HYPOTHESIS: 'Hypothesis', + METHODS: 'Methods', + INTRO: 'Experiment Instructions', + HELP: 'Instructions for the task screen' +}; + +interface Props { + history: Object; + type: EXPERIMENTS | null | undefined; + title: string; + params: ExperimentParameters; + mainTimeline: MainTimeline; + trials: { + [key: string]: Trial; + }; + timelines: {}; + experimentActions: Object; + isEEGEnabled: boolean; + description: ExperimentDescription; +} + +interface State { + activeStep: string; + isPreviewing: boolean; + description: ExperimentDescription; + params: ExperimentParameters; + saved: boolean; +} + +export default class CustomDesign extends Component { + // handleStartExperiment: (Object) => void; + + // handlePreview: () => void; + // handleSaveParams: () => void; + // handleProgressBar: (Object, Object) => void; + constructor(props: Props) { + super(props); + this.state = { + activeStep: CUSTOM_STEPS.OVERVIEW, + isPreviewing: true, + description: props.description, + params: props.params, + saved: false + }; + this.handleStepClick = this.handleStepClick.bind(this); + this.handleStartExperiment = this.handleStartExperiment.bind(this); + this.handlePreview = this.handlePreview.bind(this); + this.handleSaveParams = this.handleSaveParams.bind(this); + this.handleProgressBar = this.handleProgressBar.bind(this); + this.handleEEGEnabled = this.handleEEGEnabled.bind(this); + if (isNil(props.params)) { + props.experimentActions.loadDefaultTimeline(); + } + this.endPreview = this.endPreview.bind(this); + } + + endPreview() {// this.setState({ isPreviewing: false }); + } + + handleStepClick(step: string) { + this.handleSaveParams(); + this.setState({ activeStep: step }); + } + + handleProgressBar(event: Object, data: Object) { + this.setState({ + params: { ...this.state.params, showProgessBar: data.checked } + }); + } + + handleEEGEnabled(event: Object, data: Object) { + this.props.experimentActions.setEEGEnabled(data.checked); + } + + handleStartExperiment() { + this.props.history.push(SCREENS.COLLECT.route); + } + + handlePreview(e) { + e.target.blur(); + this.setState({ isPreviewing: !this.state.isPreviewing }); + } + + handleSaveParams() { + this.props.experimentActions.setParams(this.state.params); + this.props.experimentActions.setDescription(this.state.description); + this.props.experimentActions.saveWorkspace(); + this.setState({ saved: true }); + } + + renderSectionContent() { + const stimi = [{ name: 'stimulus1', number: 1 }, { name: 'stimulus2', number: 2 }, { name: 'stimulus3', number: 3 }, { name: 'stimulus4', number: 4 }]; + switch (this.state.activeStep) { + case CUSTOM_STEPS.OVERVIEW:default: + return + + +
+ this.setState({ + description: { + ...this.state.description, + question: data.value + }, + saved: false + })} /> + +
+ + +
+ this.setState({ + description: { + ...this.state.description, + hypothesis: data.value + }, + saved: false + })} /> + +
+ + +
+ this.setState({ + description: { + ...this.state.description, + methods: data.value + }, + saved: false + })} /> + +
+
; + + case CUSTOM_STEPS.CONDITIONS: + return + +
Conditions
+

+ Select the folder with images for each condition and choose the correct response. + You can upload image files with the following extensions: ".png", ".jpg", ".jpeg". + Make sure when you preview your experiment that the resolution is high enough. You + can resize or compress your images in an image editing program or on one of the + websites online. +

+
+ + + + + + Condition + + Default Key Response + Condition Folder + + + + + {stimi.map(({ + name, + number + }) => trial.type === number).length} onChange={async (key, data, changedName) => { + await this.setState({ + params: { + ...this.state.params, + [changedName]: { ...this.state.params[changedName], [key]: data } + } + }); + let newStimuli = []; + await stimi.map(stimul => { + let dirStimuli = []; + const dir = this.state.params[stimul.name].dir; + if (dir && typeof dir !== 'undefined' && dir !== '') { + dirStimuli = readImages(dir).map(i => ({ + dir: dir, + filename: i, + name: i, + condition: this.state.params[stimul.name].title, + response: this.state.params[stimul.name].response, + phase: 'main', + type: stimul.number + })); + } + if (dirStimuli.length) dirStimuli[0].phase = 'practice'; + newStimuli = newStimuli.concat(...dirStimuli); + }); + this.setState({ + params: { + ...this.state.params, + stimuli: [...newStimuli], + nbTrials: newStimuli.filter(t => t.phase === 'main').length, + nbPracticeTrials: newStimuli.filter(t => t.phase === 'practice').length + }, + saved: false + }); + }} />)} + +
+
; + + case CUSTOM_STEPS.TRIALS: + return +
+
+
Trials
+

Edit the correct key response and type of each trial.

+
+ +
+
+ + this.setState({ + params: { + ...this.state.params, + randomize: data.value + }, + saved: false + })} placeholder='Response' options={[{ key: 'random', text: 'Random', value: 'random' }, { key: 'sequential', text: 'Sequential', value: 'sequential' }]} /> + this.setState({ + params: { + ...this.state.params, + nbTrials: parseInt(data.value) + }, + saved: false + })} /> + this.setState({ + params: { + ...this.state.params, + nbPracticeTrials: parseInt(data.value) + }, + saved: false + })} /> + +
+
+
+ + + + + + Name + + Condition + Correct Key Response + Trial Type + + + + {this.state.params.stimuli && this.state.params.stimuli.map((e, num) => this.state.params[`stimulus${n}`].title)} {...e} onDelete={num => { + const stimuli = this.state.params.stimuli; + stimuli.splice(num, 1); + const nbPracticeTrials = stimuli.filter(s => s.phase === 'practice').length; + const nbTrials = stimuli.filter(s => s.phase === 'main').length; + this.setState({ + params: { + ...this.state.params, + stimuli: [...stimuli], + nbPracticeTrials, + nbTrials + }, + saved: false + }); + }} onChange={(num, key, data) => { + const stimuli = this.state.params.stimuli; + stimuli[num][key] = data; + let nbPracticeTrials = this.state.params.nbPracticeTrials; + let nbTrials = this.state.params.nbTrials; + if (key === 'phase') { + nbPracticeTrials = stimuli.filter(s => s.phase === 'practice').length; + nbTrials = stimuli.filter(s => s.phase === 'main').length; + } + this.setState({ + params: { + ...this.state.params, + stimuli: [...stimuli], + nbPracticeTrials, + nbTrials + }, + saved: false + }); + }} />)} + +
+
; + + case CUSTOM_STEPS.PARAMETERS: + return + + +
Inter-trial interval
+

+ Select the inter-trial interval duration. This is the amount of time between + trials measured from the end of one trial to the start of the next one. +

+
+ + this.setState({ + params: { ...this.state.params, iti: value }, + saved: false + })} /> + +
+ + + +
Image duration
+

+ Select the time of presentation or make it self-paced - present the image until + participants respond. +

+
+ + this.setState({ + params: { ...this.state.params, selfPaced: !this.state.params.selfPaced }, + saved: false + })} /> + + + {!this.state.params.selfPaced ? + this.setState({ + params: { ...this.state.params, presentationTime: value }, + saved: false + })} /> + : } +
+
; + + case CUSTOM_STEPS.INSTRUCTIONS: + return + + +
Experiment Instructions
+

Edit the instruction that will be displayed on the first screen.

+
+ this.setState({ + params: { ...this.state.params, intro: data.value }, + saved: false + })} /> + +
+
+ + + +
Instructions for the task screen
+

Edit the instruction that will be displayed in the footer during the task.

+
+ this.setState({ + params: { ...this.state.params, taskHelp: data.value }, + saved: false + })} /> + +
+
+
; + + case CUSTOM_STEPS.PREVIEW: + return + + + + + + + this.handlePreview(e)} /> + + + ; + + } + } + + render() { + return
+ this.handleEEGEnabled(event, data)} className={styles.EEGToggle} />} saveButton={} /> + {this.renderSectionContent()} +
; + } +} \ No newline at end of file diff --git a/app/components/DesignComponent/ParamSlider.js b/app/components/DesignComponent/ParamSlider.js deleted file mode 100644 index 18e73274..00000000 --- a/app/components/DesignComponent/ParamSlider.js +++ /dev/null @@ -1,36 +0,0 @@ -import { Segment } from 'semantic-ui-react'; -import React, { PureComponent } from 'react'; -import Slider from 'rc-slider'; -import styles from '../styles/common.css'; - -interface Props { - value: number; - label: string; - onChange: (number) => void; -} - -export default class ParamSlider extends PureComponent { - render() { - const { marks, ms_conversion } = this.props; - return ( -
-

{this.props.label}

- - {this.props.label !== 'Practice trials' || Object.keys(marks).length > 1 ? ( - this.props.onChange(value * parseInt(ms_conversion, 10))} - defaultValue={1} - /> - ) : ( -
You have not chosen any practice trials.
- )} -
-
- ); - } -} diff --git a/app/components/DesignComponent/ParamSlider.tsx b/app/components/DesignComponent/ParamSlider.tsx new file mode 100644 index 00000000..d4e1b91c --- /dev/null +++ b/app/components/DesignComponent/ParamSlider.tsx @@ -0,0 +1,26 @@ +import { Segment } from "semantic-ui-react"; +import React, { PureComponent } from "react"; +import Slider from "rc-slider"; +import styles from "../styles/common.css"; + +interface Props { + value: number; + label: string; + onChange: (arg0: number) => void; +} + +export default class ParamSlider extends PureComponent { + + render() { + const { + marks, + ms_conversion + } = this.props; + return
+

{this.props.label}

+ + {this.props.label !== 'Practice trials' || Object.keys(marks).length > 1 ? this.props.onChange(value * parseInt(ms_conversion, 10))} defaultValue={1} /> :
You have not chosen any practice trials.
} +
+
; + } +} \ No newline at end of file diff --git a/app/components/DesignComponent/StimuliDesignColumn.js b/app/components/DesignComponent/StimuliDesignColumn.js deleted file mode 100644 index 9facaacf..00000000 --- a/app/components/DesignComponent/StimuliDesignColumn.js +++ /dev/null @@ -1,122 +0,0 @@ -/* Breaking this component on its own is done mainly to increase performance. Text input is slow otherwise */ - -import React, { Component } from 'react'; -import { Form, Button, Table, Icon } from 'semantic-ui-react'; -import { toast } from 'react-toastify'; -import { readImages } from '../../utils/filesystem/storage'; -import { loadFromSystemDialog } from '../../utils/filesystem/select'; -import { FILE_TYPES } from '../../constants/constants'; -import * as path from 'path'; -import styles from '../styles/common.css'; - -interface Props { - num: number; - title: string; - response: string; - dir: string; - onChange: (string, string) => void; -} - -const RESPONSE_OPTIONS = new Array(10).fill(0).map((_, i) => ({ - key: i.toString(), - text: i.toString(), - value: i.toString(), -})); - -export default class StimuliDesignColumn extends Component { - constructor(props: Props) { - super(props); - this.handleSelectFolder = this.handleSelectFolder.bind(this); - this.handleRemoveFolder = this.handleRemoveFolder.bind(this); - this.state = { - numberImages: undefined, - }; - } - - shouldComponentUpdate(nextProps) { - if ( - nextProps.title !== this.props.title || - nextProps.response !== this.props.response || - nextProps.dir !== this.props.dir - ) { - return true; - } - return false; - } - - async handleSelectFolder() { - const dir = await loadFromSystemDialog(FILE_TYPES.STIMULUS_DIR); - if (dir) { - const images = readImages(dir); - if (images.length < 1) { - toast.error('No images in folder!'); - } - this.setState({ - numberImages: images.length, - }); - this.props.onChange('dir', dir, `stimulus${this.props.num}`); - } - } - - handleRemoveFolder() { - this.setState({ - numberImages: 0, - }); - this.props.onChange('dir', '', `stimulus${this.props.num}`); - } - - render() { - return ( - - - {this.props.num} -
- - this.props.onChange('title', data.value, `stimulus${this.props.num}`) - } - placeholder='Enter condition name' - /> - -
- - - - this.props.onChange('response', data.value, `stimulus${this.props.num}`) - } - placeholder='Select' - options={RESPONSE_OPTIONS} - /> - - - - {this.props.dir ? ( -
-
- Folder{' '} - {this.props.dir && - this.props.dir - .split(path.sep) - .slice(-1) - .join(' / ')} -
-
( {this.state.numberImages || this.props.numberImages} images )
-
- -
-
- ) : ( - - )} -
-
- ); - } -} diff --git a/app/components/DesignComponent/StimuliDesignColumn.tsx b/app/components/DesignComponent/StimuliDesignColumn.tsx new file mode 100644 index 00000000..88b7534b --- /dev/null +++ b/app/components/DesignComponent/StimuliDesignColumn.tsx @@ -0,0 +1,94 @@ +/* Breaking this component on its own is done mainly to increase performance. Text input is slow otherwise */ + +import React, { Component } from "react"; +import { Form, Button, Table, Icon } from "semantic-ui-react"; +import { toast } from "react-toastify"; +import { readImages } from "../../utils/filesystem/storage"; +import { loadFromSystemDialog } from "../../utils/filesystem/select"; +import { FILE_TYPES } from "../../constants/constants"; +import * as path from "path"; +import styles from "../styles/common.css"; + +interface Props { + num: number; + title: string; + response: string; + dir: string; + onChange: (arg0: string, arg1: string) => void; +} + +const RESPONSE_OPTIONS = new Array(10).fill(0).map((_, i) => ({ + key: i.toString(), + text: i.toString(), + value: i.toString() +})); + +export default class StimuliDesignColumn extends Component { + + constructor(props: Props) { + super(props); + this.handleSelectFolder = this.handleSelectFolder.bind(this); + this.handleRemoveFolder = this.handleRemoveFolder.bind(this); + this.state = { + numberImages: undefined + }; + } + + shouldComponentUpdate(nextProps) { + if (nextProps.title !== this.props.title || nextProps.response !== this.props.response || nextProps.dir !== this.props.dir) { + return true; + } + return false; + } + + async handleSelectFolder() { + const dir = await loadFromSystemDialog(FILE_TYPES.STIMULUS_DIR); + if (dir) { + const images = readImages(dir); + if (images.length < 1) { + toast.error('No images in folder!'); + } + this.setState({ + numberImages: images.length + }); + this.props.onChange('dir', dir, `stimulus${this.props.num}`); + } + } + + handleRemoveFolder() { + this.setState({ + numberImages: 0 + }); + this.props.onChange('dir', '', `stimulus${this.props.num}`); + } + + render() { + return + + {this.props.num} +
+ this.props.onChange('title', data.value, `stimulus${this.props.num}`)} placeholder='Enter condition name' /> + +
+ + + this.props.onChange('response', data.value, `stimulus${this.props.num}`)} placeholder='Select' options={RESPONSE_OPTIONS} /> + + + + {this.props.dir ?
+
+ Folder{' '} + {this.props.dir && this.props.dir.split(path.sep).slice(-1).join(' / ')} +
+
( {this.state.numberImages || this.props.numberImages} images )
+
+ +
+
: } +
+
; + } +} \ No newline at end of file diff --git a/app/components/DesignComponent/StimuliRow.js b/app/components/DesignComponent/StimuliRow.tsx similarity index 64% rename from app/components/DesignComponent/StimuliRow.js rename to app/components/DesignComponent/StimuliRow.tsx index 6150b889..2e3e333f 100644 --- a/app/components/DesignComponent/StimuliRow.js +++ b/app/components/DesignComponent/StimuliRow.tsx @@ -1,27 +1,27 @@ /* Breaking this component on its own is done mainly to increase performance. Text input is slow otherwise */ -import React, { Component } from 'react'; -import { Segment, Form, Button, Table, Dropdown } from 'semantic-ui-react'; -import styles from '../styles/common.css'; +import React, { Component } from "react"; +import { Segment, Form, Button, Table, Dropdown } from "semantic-ui-react"; +import styles from "../styles/common.css"; interface Props { num: number; response: string; dir: string; condition: string; - onChange: (string, string) => void; + onChange: (arg0: string, arg1: string) => void; } const RESPONSE_OPTIONS = new Array(10).fill(0).map((_, i) => ({ key: i.toString(), text: i.toString(), - value: i.toString(), + value: i.toString() })); export default class StimuliRow extends Component { + render() { - return ( - + return
{this.props.num + 1}.
{this.props.name}
@@ -32,22 +32,12 @@ export default class StimuliRow extends Component {
- this.props.onChange(this.props.num, 'response', data.value)} - placeholder='Response' - options={RESPONSE_OPTIONS} - /> + this.props.onChange(this.props.num, 'response', data.value)} placeholder='Response' options={RESPONSE_OPTIONS} /> -
+
{this.props.phase === 'main' ? 'Experimental' : 'Practice'}
@@ -55,26 +45,20 @@ export default class StimuliRow extends Component { this.props.onChange(this.props.num, 'phase', 'main')}>
Experimental
- this.props.onChange(this.props.num, 'phase', 'practice')} - > + this.props.onChange(this.props.num, 'phase', 'practice')}>
Practice
- - - ); + ; } } @@ -90,4 +74,4 @@ export default class StimuliRow extends Component { // options={[{key: 'main', text: 'Experimental', value: 'main'}, // {key: 'practice', text: 'Practice', value: 'practice'}]} // className={styles.trialsTrialTypeRowSelector} -// /> +// /> \ No newline at end of file diff --git a/app/components/DesignComponent/index.js b/app/components/DesignComponent/index.tsx similarity index 59% rename from app/components/DesignComponent/index.js rename to app/components/DesignComponent/index.tsx index 50fa5f8a..37ed5773 100644 --- a/app/components/DesignComponent/index.js +++ b/app/components/DesignComponent/index.tsx @@ -1,48 +1,43 @@ -// @flow -import React, { Component } from 'react'; -import { Grid, Button, Segment, Header, Image, Checkbox } from 'semantic-ui-react'; -import { isNil } from 'lodash'; -import styles from '../styles/common.css'; -import { EXPERIMENTS, SCREENS } from '../../constants/constants'; -import { readWorkspaces } from '../../utils/filesystem/storage'; -import { - MainTimeline, - Trial, - ExperimentParameters, - ExperimentDescription, -} from '../../constants/interfaces'; -import SecondaryNavComponent from '../SecondaryNavComponent'; -import PreviewExperimentComponent from '../PreviewExperimentComponent'; -import CustomDesign from './CustomDesignComponent'; -import PreviewButton from '../PreviewButtonComponent'; - -import facesHousesOverview from '../../assets/common/FacesHouses.png'; -import stroopOverview from '../../assets/common/Stroop.png'; -import multitaskingOverview from '../../assets/common/Multitasking.png'; -import searchOverview from '../../assets/common/VisualSearch.png'; -import customOverview from '../../assets/common/Custom.png'; + +import React, { Component } from "react"; +import { Grid, Button, Segment, Header, Image, Checkbox } from "semantic-ui-react"; +import { isNil } from "lodash"; +import styles from "../styles/common.css"; +import { EXPERIMENTS, SCREENS } from "../../constants/constants"; +import { readWorkspaces } from "../../utils/filesystem/storage"; +import { MainTimeline, Trial, ExperimentParameters, ExperimentDescription } from "../../constants/interfaces"; +import SecondaryNavComponent from "../SecondaryNavComponent"; +import PreviewExperimentComponent from "../PreviewExperimentComponent"; +import CustomDesign from "./CustomDesignComponent"; +import PreviewButton from "../PreviewButtonComponent"; + +import facesHousesOverview from "../../assets/common/FacesHouses.png"; +import stroopOverview from "../../assets/common/Stroop.png"; +import multitaskingOverview from "../../assets/common/Multitasking.png"; +import searchOverview from "../../assets/common/VisualSearch.png"; +import customOverview from "../../assets/common/Custom.png"; // conditions images -import multiConditionShape from '../../assets/multi/multiConditionShape.png'; -import multiConditionDots from '../../assets/multi/multiConditionDots.png'; -import conditionFace from '../../assets/face_house/faces/Face1.jpg'; -import conditionHouse from '../../assets/face_house/houses/House1.jpg'; -import conditionOrangeT from '../../assets/search/conditionOrangeT.png'; -import conditionNoOrangeT from '../../assets/search/conditionNoOrangeT.png'; -import conditionCongruent from '../../assets/stroop/match_g.png'; -import conditionIncongruent from '../../assets/stroop/mismatch6_r.png'; +import multiConditionShape from "../../assets/multi/multiConditionShape.png"; +import multiConditionDots from "../../assets/multi/multiConditionDots.png"; +import conditionFace from "../../assets/face_house/faces/Face1.jpg"; +import conditionHouse from "../../assets/face_house/houses/House1.jpg"; +import conditionOrangeT from "../../assets/search/conditionOrangeT.png"; +import conditionNoOrangeT from "../../assets/search/conditionNoOrangeT.png"; +import conditionCongruent from "../../assets/stroop/match_g.png"; +import conditionIncongruent from "../../assets/stroop/mismatch6_r.png"; -import { loadProtocol } from '../../utils/labjs/functions'; -import { toast } from 'react-toastify'; -import InputModal from '../InputModal'; +import { loadProtocol } from "../../utils/labjs/functions"; +import { toast } from "react-toastify"; +import InputModal from "../InputModal"; -import { shell } from 'electron'; +import { shell } from "electron"; const DESIGN_STEPS = { OVERVIEW: 'OVERVIEW', BACKGROUND: 'BACKGROUND', PROTOCOL: 'PROTOCOL', - PREVIEW: 'PREVIEW', + PREVIEW: 'PREVIEW' }; interface Props { @@ -52,7 +47,9 @@ interface Props { title: string; params: ExperimentParameters; mainTimeline: MainTimeline; - trials: { [string]: Trial }; + trials: { + [key: string]: Trial; + }; timelines: {}; experimentActions: Object; description: ExperimentDescription; @@ -67,21 +64,18 @@ interface State { } export default class Design extends Component { - // props: Props; - // state: State; - // handleStepClick: (Object, Object) => void; // handleStartExperiment: (Object) => void; + // handleCustomizeExperiment: (Object) => void; // handlePreview: (Object) => void; // handleLoadCustomExperiment: (string) => void; - constructor(props: Props) { super(props); this.state = { activeStep: DESIGN_STEPS.OVERVIEW, isPreviewing: false, isNewExperimentModalOpen: false, - recentWorkspaces: [], + recentWorkspaces: [] }; this.handleStepClick = this.handleStepClick.bind(this); this.handleStartExperiment = this.handleStartExperiment.bind(this); @@ -109,7 +103,7 @@ export default class Design extends Component { handleCustomizeExperiment() { this.setState({ - isNewExperimentModalOpen: true, + isNewExperimentModalOpen: true }); } @@ -127,7 +121,7 @@ export default class Design extends Component { this.props.experimentActions.createNewWorkspace({ title, type: EXPERIMENTS.CUSTOM, - paradigm: 'Custom', + paradigm: 'Custom' // paradigm: this.props.paradigm }); this.props.experimentActions.saveWorkspace(); @@ -170,10 +164,10 @@ export default class Design extends Component { case 'multiConditionShape': return multiConditionShape; break; - case 'multiConditionDots': - default: + case 'multiConditionDots':default: return multiConditionDots; break; + } } @@ -195,25 +189,17 @@ export default class Design extends Component { return searchOverview; break; - case EXPERIMENTS.CUSTOM: - default: + case EXPERIMENTS.CUSTOM:default: return customOverview; break; + } } renderSectionContent() { switch (this.state.activeStep) { - case DESIGN_STEPS.OVERVIEW: - default: - return ( - + case DESIGN_STEPS.OVERVIEW:default: + return @@ -228,12 +214,10 @@ export default class Design extends Component { - - ); + ; case DESIGN_STEPS.BACKGROUND: - return ( - + return @@ -262,27 +246,19 @@ export default class Design extends Component {
- {this.props.background_links.map((link) => ( - - ))} + )}
-
- ); +
; case DESIGN_STEPS.PROTOCOL: - return ( - + return @@ -295,9 +271,7 @@ export default class Design extends Component { - + @@ -309,9 +283,7 @@ export default class Design extends Component { - + @@ -323,35 +295,18 @@ export default class Design extends Component { - - ); + ; case DESIGN_STEPS.PREVIEW: - return ( - - - + return + + - this.handlePreview(e)} - /> + this.handlePreview(e)} /> - - ); + ; + } } @@ -359,32 +314,10 @@ export default class Design extends Component { if (this.props.type === EXPERIMENTS.CUSTOM) { return ; } - return ( -
- this.handleEEGEnabled(event, data)} - className={styles.EEGToggle} - /> - } - canEditExperiment={this.props.paradigm === 'Faces and Houses'} - /> + return
+ this.handleEEGEnabled(event, data)} className={styles.EEGToggle} />} canEditExperiment={this.props.paradigm === 'Faces and Houses'} /> {this.renderSectionContent()} - this.setState({ isNewExperimentModalOpen: false })} - header='Enter a title for this experiment' - /> -
- ); + this.setState({ isNewExperimentModalOpen: false })} header='Enter a title for this experiment' /> +
; } -} +} \ No newline at end of file diff --git a/app/components/EEGExplorationComponent.js b/app/components/EEGExplorationComponent.tsx similarity index 54% rename from app/components/EEGExplorationComponent.js rename to app/components/EEGExplorationComponent.tsx index 154815fc..2d8abced 100644 --- a/app/components/EEGExplorationComponent.js +++ b/app/components/EEGExplorationComponent.tsx @@ -1,17 +1,17 @@ -// @flow -import React, { Component } from 'react'; -import { Grid, Button, Header, Segment, Image, Divider } from 'semantic-ui-react'; -import { PLOTTING_INTERVAL, CONNECTION_STATUS, DEVICE_AVAILABILITY } from '../constants/constants'; -import eegImage from '../assets/common/EEG.png'; -import SignalQualityIndicatorComponent from './SignalQualityIndicatorComponent'; -import ViewerComponent from './ViewerComponent'; -import ConnectModal from './CollectComponent/ConnectModal'; -import styles from './styles/common.css'; + +import React, { Component } from "react"; +import { Grid, Button, Header, Segment, Image, Divider } from "semantic-ui-react"; +import { PLOTTING_INTERVAL, CONNECTION_STATUS, DEVICE_AVAILABILITY } from "../constants/constants"; +import eegImage from "../assets/common/EEG.png"; +import SignalQualityIndicatorComponent from "./SignalQualityIndicatorComponent"; +import ViewerComponent from "./ViewerComponent"; +import ConnectModal from "./CollectComponent/ConnectModal"; +import styles from "./styles/common.css"; interface Props { history: Object; connectedDevice: Object; - signalQualityObservable: ?any; + signalQualityObservable: any | null | undefined; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; @@ -24,15 +24,13 @@ interface State { } export default class Home extends Component { - // props: Props; - // state: State; + // handleConnectModalClose: () => void; // handleStartConnect: () => void; - constructor(props: Props) { super(props); this.state = { - isConnectModalOpen: false, + isConnectModalOpen: false }; this.handleConnectModalClose = this.handleConnectModalClose.bind(this); this.handleStartConnect = this.handleStartConnect.bind(this); @@ -40,10 +38,7 @@ export default class Home extends Component { } componentDidUpdate = (prevProps: Props, prevState: State) => { - if ( - this.props.connectionStatus === CONNECTION_STATUS.CONNECTED && - prevState.isConnectModalOpen - ) { + if (this.props.connectionStatus === CONNECTION_STATUS.CONNECTED && prevState.isConnectModalOpen) { this.setState({ isConnectModalOpen: false }); } }; @@ -64,21 +59,10 @@ export default class Home extends Component { } render() { - return ( - - {this.props.connectionStatus === CONNECTION_STATUS.CONNECTED && ( - + return + {this.props.connectionStatus === CONNECTION_STATUS.CONNECTED && - +
@@ -86,16 +70,10 @@ export default class Home extends Component { Disconnect EEG Device
- +
-
- )} - {this.props.connectionStatus !== CONNECTION_STATUS.CONNECTED && ( - + } + {this.props.connectionStatus !== CONNECTION_STATUS.CONNECTED && @@ -112,22 +90,8 @@ export default class Home extends Component { - - - )} -
- ); + +
} +
; } -} +} \ No newline at end of file diff --git a/app/components/HomeComponent/OverviewComponent.js b/app/components/HomeComponent/OverviewComponent.js deleted file mode 100644 index 2309d325..00000000 --- a/app/components/HomeComponent/OverviewComponent.js +++ /dev/null @@ -1,141 +0,0 @@ -import React, { Component } from 'react'; -import { Grid, Header, Button, Segment } from 'semantic-ui-react'; -import { isNil } from 'lodash'; -import styles from '../styles/common.css'; -import { EXPERIMENTS } from '../../constants/constants'; -import SecondaryNavComponent from '../SecondaryNavComponent'; -import PreviewExperimentComponent from '../PreviewExperimentComponent'; -import PreviewButton from '../PreviewButtonComponent'; -import { loadProtocol } from '../../utils/labjs/functions'; - -const OVERVIEW_STEPS = { - OVERVIEW: 'OVERVIEW', - BACKGROUND: 'BACKGROUND', - PROTOCOL: 'PROTOCOL', -}; - -interface Props { - type: EXPERIMENTS; - onStartExperiment: (EXPERIMENTS) => void; - onCloseOverview: () => void; -} - -interface State { - activeStep: OVERVIEW_STEPS; - isPreviewing: boolean; -} - -export default class OverviewComponent extends Component { - constructor(props) { - super(props); - this.state = { - activeStep: OVERVIEW_STEPS.OVERVIEW, - isPreviewing: false, - }; - this.handleStepClick = this.handleStepClick.bind(this); - this.handlePreview = this.handlePreview.bind(this); - this.endPreview = this.endPreview.bind(this); - } - - handleStepClick(step: string) { - this.setState({ activeStep: step }); - } - - handlePreview(e) { - e.target.blur(); - this.setState((prevState) => ({ ...prevState, isPreviewing: !prevState.isPreviewing })); - } - - endPreview() { - this.setState({ isPreviewing: false }); - } - - renderSectionContent() { - switch (this.state.activeStep) { - case OVERVIEW_STEPS.PROTOCOL: - return ( - - - - - - - {this.props.protocol} - - this.handlePreview(e)} - /> - - - ); - case OVERVIEW_STEPS.BACKGROUND: - return ( - - -
{this.props.background_title}
-
- - - {this.props.background} - - -
- ); - case OVERVIEW_STEPS.OVERVIEW: - default: - return ( - - -
{this.props.type}
-
- - - {this.props.overview} - - -
- ); - } - } - - render() { - return ( - <> - - } - /> -
{this.renderSectionContent()}
- - ); - } -} diff --git a/app/components/HomeComponent/OverviewComponent.tsx b/app/components/HomeComponent/OverviewComponent.tsx new file mode 100644 index 00000000..b2dd8cd0 --- /dev/null +++ b/app/components/HomeComponent/OverviewComponent.tsx @@ -0,0 +1,103 @@ +import React, { Component } from "react"; +import { Grid, Header, Button, Segment } from "semantic-ui-react"; +import { isNil } from "lodash"; +import styles from "../styles/common.css"; +import { EXPERIMENTS } from "../../constants/constants"; +import SecondaryNavComponent from "../SecondaryNavComponent"; +import PreviewExperimentComponent from "../PreviewExperimentComponent"; +import PreviewButton from "../PreviewButtonComponent"; +import { loadProtocol } from "../../utils/labjs/functions"; + +const OVERVIEW_STEPS = { + OVERVIEW: 'OVERVIEW', + BACKGROUND: 'BACKGROUND', + PROTOCOL: 'PROTOCOL' +}; + +interface Props { + type: EXPERIMENTS; + onStartExperiment: (arg0: EXPERIMENTS) => void; + onCloseOverview: () => void; +} + +interface State { + activeStep: OVERVIEW_STEPS; + isPreviewing: boolean; +} + +export default class OverviewComponent extends Component { + + constructor(props) { + super(props); + this.state = { + activeStep: OVERVIEW_STEPS.OVERVIEW, + isPreviewing: false + }; + this.handleStepClick = this.handleStepClick.bind(this); + this.handlePreview = this.handlePreview.bind(this); + this.endPreview = this.endPreview.bind(this); + } + + handleStepClick(step: string) { + this.setState({ activeStep: step }); + } + + handlePreview(e) { + e.target.blur(); + this.setState(prevState => ({ ...prevState, isPreviewing: !prevState.isPreviewing })); + } + + endPreview() { + this.setState({ isPreviewing: false }); + } + + renderSectionContent() { + switch (this.state.activeStep) { + case OVERVIEW_STEPS.PROTOCOL: + return + + + + + + {this.props.protocol} + + this.handlePreview(e)} /> + + ; + case OVERVIEW_STEPS.BACKGROUND: + return + +
{this.props.background_title}
+
+ + + {this.props.background} + + +
; + case OVERVIEW_STEPS.OVERVIEW:default: + return + +
{this.props.type}
+
+ + + {this.props.overview} + + +
; + + } + } + + render() { + return <> + } /> +
{this.renderSectionContent()}
+ ; + } +} \ No newline at end of file diff --git a/app/components/HomeComponent/index.js b/app/components/HomeComponent/index.tsx similarity index 66% rename from app/components/HomeComponent/index.js rename to app/components/HomeComponent/index.tsx index 2cb8d5c5..b4072d65 100644 --- a/app/components/HomeComponent/index.js +++ b/app/components/HomeComponent/index.tsx @@ -1,46 +1,37 @@ -import React, { Component } from 'react'; -import { isNil } from 'lodash'; -import { Grid, Button, Header, Segment, Image, Table } from 'semantic-ui-react'; -import { toast } from 'react-toastify'; -import * as moment from 'moment'; +import React, { Component } from "react"; +import { isNil } from "lodash"; +import { Grid, Button, Header, Segment, Image, Table } from "semantic-ui-react"; +import { toast } from "react-toastify"; +import * as moment from "moment"; -import styles from '../styles/common.css'; -import { - EXPERIMENTS, - SCREENS, - KERNEL_STATUS, - CONNECTION_STATUS, - DEVICE_AVAILABILITY, -} from '../../constants/constants'; -import faceHouseIcon from '../../assets/common/FacesHouses.png'; -import stroopIcon from '../../assets/common/Stroop.png'; -import multitaskingIcon from '../../assets/common/Multitasking.png'; -import searchIcon from '../../assets/common/VisualSearch.png'; -import customIcon from '../../assets/common/Custom.png'; -import appLogo from '../../assets/common/app_logo.png'; -import divingMan from '../../assets/common/divingMan.svg'; -import { - readWorkspaces, - readAndParseState, - openWorkspaceDir, - deleteWorkspaceDir, -} from '../../utils/filesystem/storage'; +import styles from "../styles/common.css"; +import { EXPERIMENTS, SCREENS, KERNEL_STATUS, CONNECTION_STATUS, DEVICE_AVAILABILITY } from "../../constants/constants"; +import faceHouseIcon from "../../assets/common/FacesHouses.png"; +import stroopIcon from "../../assets/common/Stroop.png"; +import multitaskingIcon from "../../assets/common/Multitasking.png"; +import searchIcon from "../../assets/common/VisualSearch.png"; +import customIcon from "../../assets/common/Custom.png"; +import appLogo from "../../assets/common/app_logo.png"; +import divingMan from "../../assets/common/divingMan.svg"; +import { readWorkspaces, readAndParseState, openWorkspaceDir, deleteWorkspaceDir } from "../../utils/filesystem/storage"; -import InputModal from '../InputModal'; -import SecondaryNavComponent from '../SecondaryNavComponent'; -import OverviewComponent from './OverviewComponent'; -import { loadProtocol } from '../../utils/labjs/functions'; -import EEGExplorationComponent from '../EEGExplorationComponent'; +import InputModal from "../InputModal"; +import SecondaryNavComponent from "../SecondaryNavComponent"; +import OverviewComponent from "./OverviewComponent"; +import { loadProtocol } from "../../utils/labjs/functions"; +import EEGExplorationComponent from "../EEGExplorationComponent"; -import { remote } from 'electron'; +import { remote } from "electron"; -const { dialog } = remote; +const { + dialog +} = remote; const HOME_STEPS = { // TODO: maybe change the recent and new labels, but not necessary right now RECENT: 'MY EXPERIMENTS', NEW: 'EXPERIMENT BANK', - EXPLORE: 'EXPLORE EEG DATA', + EXPLORE: 'EXPLORE EEG DATA' }; interface Props { @@ -48,7 +39,7 @@ interface Props { history: Object; jupyterActions: Object; connectedDevice: Object; - signalQualityObservable: ?any; + signalQualityObservable: any | null | undefined; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; @@ -66,15 +57,11 @@ interface State { } export default class Home extends Component { - // props: Props; - // state: State; - // handleNewExperiment: (EXPERIMENTS) => void; - // handleStepClick: (string) => void; + // handleLoadCustomExperiment: (string) => void; // handleOpenOverview: (EXPERIMENTS) => void; // handleCloseOverview: () => void; // handleDeleteWorkspace: (string) => void; - constructor(props: Props) { super(props); this.state = { @@ -82,7 +69,7 @@ export default class Home extends Component { recentWorkspaces: [], isNewExperimentModalOpen: false, isOverviewComponentOpen: false, - overviewExperimentType: EXPERIMENTS.NONE, + overviewExperimentType: EXPERIMENTS.NONE }; this.handleStepClick = this.handleStepClick.bind(this); this.handleNewExperiment = this.handleNewExperiment.bind(this); @@ -103,7 +90,7 @@ export default class Home extends Component { handleNewExperiment(experimentType: EXPERIMENTS) { if (experimentType === EXPERIMENTS.CUSTOM) { this.setState({ - isNewExperimentModalOpen: true, + isNewExperimentModalOpen: true }); // If pre-designed experiment, load existing workspace } else if (this.state.recentWorkspaces.includes(experimentType)) { @@ -113,7 +100,7 @@ export default class Home extends Component { this.props.experimentActions.createNewWorkspace({ title: experimentType, type: experimentType, - paradigm: experimentType, + paradigm: experimentType }); this.props.history.push(SCREENS.DESIGN.route); } @@ -133,7 +120,7 @@ export default class Home extends Component { this.props.experimentActions.createNewWorkspace({ title, type: EXPERIMENTS.CUSTOM, - paradigm: EXPERIMENTS.CUSTOM, + paradigm: EXPERIMENTS.CUSTOM }); this.props.history.push(SCREENS.DESIGN.route); } @@ -149,20 +136,20 @@ export default class Home extends Component { handleOpenOverview(type: EXPERIMENTS) { this.setState({ overviewExperimentType: type, - isOverviewComponentOpen: true, + isOverviewComponentOpen: true }); } handleCloseOverview() { this.setState({ - isOverviewComponentOpen: false, + isOverviewComponentOpen: false }); } handleDeleteWorkspace(dir) { const options = { buttons: ['No', 'Yes'], - message: 'Do you really want to delete the experiment?', + message: 'Do you really want to delete the experiment?' }; const response = dialog.showMessageBox(options); if (response === 1) { @@ -175,10 +162,8 @@ export default class Home extends Component { renderSectionContent() { switch (this.state.activeStep) { case HOME_STEPS.RECENT: - return ( - - {this.state.recentWorkspaces.length > 0 ? ( - + return + {this.state.recentWorkspaces.length > 0 ?
@@ -191,18 +176,17 @@ export default class Home extends Component { - {this.state.recentWorkspaces - .sort((a, b) => { - const aTime = readAndParseState(a).params.dateModified || 0; - const bTime = readAndParseState(b).params.dateModified || 0; - return bTime - aTime; - }) - .map((dir) => { - const { - params: { dateModified }, - } = readAndParseState(dir); - return ( - + {this.state.recentWorkspaces.sort((a, b) => { + const aTime = readAndParseState(a).params.dateModified || 0; + const bTime = readAndParseState(b).params.dateModified || 0; + return bTime - aTime; + }).map(dir => { + const { + params: { + dateModified + } + } = readAndParseState(dir); + return {dir} {dateModified && moment.default(dateModified).fromNow()} @@ -218,13 +202,10 @@ export default class Home extends Component { Open Experiment - - ); - })} + ; + })} -
- ) : ( - + :
You don't have any experiments yet @@ -235,22 +216,14 @@ export default class Home extends Component { - - )} - - ); - case HOME_STEPS.NEW: - default: - return ( - + } + ; + case HOME_STEPS.NEW:default: + return - this.handleNewExperiment(EXPERIMENTS.N170)} - > + this.handleNewExperiment(EXPERIMENTS.N170)}> @@ -273,11 +246,7 @@ export default class Home extends Component { - this.handleNewExperiment(EXPERIMENTS.STROOP)} - > + this.handleNewExperiment(EXPERIMENTS.STROOP)}> @@ -302,11 +271,7 @@ export default class Home extends Component { - this.handleNewExperiment(EXPERIMENTS.MULTI)} - > + this.handleNewExperiment(EXPERIMENTS.MULTI)}> @@ -329,11 +294,7 @@ export default class Home extends Component { - this.handleNewExperiment(EXPERIMENTS.SEARCH)} - > + this.handleNewExperiment(EXPERIMENTS.SEARCH)}> @@ -355,11 +316,7 @@ export default class Home extends Component { - this.handleNewExperiment(EXPERIMENTS.CUSTOM)} - > + this.handleNewExperiment(EXPERIMENTS.CUSTOM)}> @@ -379,59 +336,27 @@ export default class Home extends Component { - - ); + ; case HOME_STEPS.EXPLORE: - return ( - - ); + return ; + } } renderOverviewOrHome() { if (this.state.isOverviewComponentOpen) { - return ( - - ); + return ; } - return ( - <> - } - steps={HOME_STEPS} - activeStep={this.state.activeStep} - onStepClick={this.handleStepClick} - /> + return <> + } steps={HOME_STEPS} activeStep={this.state.activeStep} onStepClick={this.handleStepClick} />
{this.renderSectionContent()}
- - ); + ; } render() { - return ( -
+ return
{this.renderOverviewOrHome()} - this.setState({ isNewExperimentModalOpen: false })} - header='Enter a title for this experiment' - /> -
- ); + this.setState({ isNewExperimentModalOpen: false })} header='Enter a title for this experiment' /> +
; } -} +} \ No newline at end of file diff --git a/app/components/InputCollect.js b/app/components/InputCollect.tsx similarity index 53% rename from app/components/InputCollect.js rename to app/components/InputCollect.tsx index 203d4ae7..d522a4c2 100644 --- a/app/components/InputCollect.js +++ b/app/components/InputCollect.tsx @@ -1,13 +1,13 @@ -// @flow -import React, { Component } from 'react'; -import { Input, Modal, Button } from 'semantic-ui-react'; -import { debounce } from 'lodash'; -import styles from './styles/common.css'; + +import React, { Component } from "react"; +import { Input, Modal, Button } from "semantic-ui-react"; +import { debounce } from "lodash"; +import styles from "./styles/common.css"; interface Props { open: boolean; - onClose: (string) => void; - onExit: (string) => void; + onClose: (arg0: string) => void; + onExit: (arg0: string) => void; header: string; } @@ -21,13 +21,10 @@ interface State { } export default class InputCollect extends Component { - // props: Props; - // state: State; - // handleTextEntry: (Object, Object, string) => void; + // handleClose: () => void; // handleExit: () => void; // handleEnterSubmit: (Object) => void; - constructor(props: Props) { super(props); this.state = { @@ -36,7 +33,7 @@ export default class InputCollect extends Component { session: this.props.data && this.props.data.session, isError: false, isSubjectError: false, - isSessionError: false, + isSessionError: false }; this.handleTextEntry = this.handleTextEntry.bind(this); this.handleClose = this.handleClose.bind(this); @@ -55,16 +52,12 @@ export default class InputCollect extends Component { handleClose() { if (this.state.subject.length >= 1 && this.state.session) { - this.props.onClose( - this.sanitizeTextInput(this.state.subject), - this.sanitizeTextInput(this.state.group), - this.state.session - ); + this.props.onClose(this.sanitizeTextInput(this.state.subject), this.sanitizeTextInput(this.state.group), this.state.session); } else { - if(this.state.subject.length < 1) { + if (this.state.subject.length < 1) { this.setState({ isSubjectError: true }); } - if(!this.state.session) { + if (!this.state.session) { this.setState({ isSessionError: true }); } } @@ -81,52 +74,22 @@ export default class InputCollect extends Component { } render() { - return ( - + return Enter Subject ID - this.handleTextEntry(object, data, 'subject')} - onKeyDown={this.handleEnterSubmit} - value={this.state.subject} - autoFocus - /> + this.handleTextEntry(object, data, 'subject')} onKeyDown={this.handleEnterSubmit} value={this.state.subject} autoFocus /> Enter group name (optional) - this.handleTextEntry(object, data, 'group')} - onKeyDown={this.handleEnterSubmit} - value={this.state.group} - /> + this.handleTextEntry(object, data, 'group')} onKeyDown={this.handleEnterSubmit} value={this.state.group} /> Enter session number - this.handleTextEntry(object, data, 'session')} - onKeyDown={this.handleEnterSubmit} - value={this.state.session} - type="number" - /> + this.handleTextEntry(object, data, 'session')} onKeyDown={this.handleEnterSubmit} value={this.state.session} type="number" /> - ); + ; } } render() { - return ( - + return {this.renderResults()} {this.renderSaveButton()} - - ); + ; } -} +} \ No newline at end of file diff --git a/app/components/PreviewButtonComponent.js b/app/components/PreviewButtonComponent.js deleted file mode 100644 index 92a59f5f..00000000 --- a/app/components/PreviewButtonComponent.js +++ /dev/null @@ -1,24 +0,0 @@ -import React, { PureComponent } from 'react'; -import { Button } from 'semantic-ui-react'; - -interface Props { - isPreviewing: boolean; - onClick: () => void; -} - -export default class PreviewButton extends PureComponent { - render() { - if (!this.props.isPreviewing) { - return ( - - ); - } - return ( - - ); - } -} diff --git a/app/components/PreviewButtonComponent.tsx b/app/components/PreviewButtonComponent.tsx new file mode 100644 index 00000000..9213f861 --- /dev/null +++ b/app/components/PreviewButtonComponent.tsx @@ -0,0 +1,21 @@ +import React, { PureComponent } from "react"; +import { Button } from "semantic-ui-react"; + +interface Props { + isPreviewing: boolean; + onClick: () => void; +} + +export default class PreviewButton extends PureComponent { + + render() { + if (!this.props.isPreviewing) { + return ; + } + return ; + } +} \ No newline at end of file diff --git a/app/components/PreviewExperimentComponent.js b/app/components/PreviewExperimentComponent.js deleted file mode 100644 index 7a6f5d4c..00000000 --- a/app/components/PreviewExperimentComponent.js +++ /dev/null @@ -1,57 +0,0 @@ -// @flow -import React, { Component } from 'react'; -import { Segment } from 'semantic-ui-react'; -import { ExperimentWindow } from '../utils/labjs'; -import styles from './styles/collect.css'; - -import { getImages } from '../utils/filesystem/storage'; -import { MainTimeline, Trial, ExperimentParameters } from '../constants/interfaces'; - -interface Props { - params: ExperimentParameters; - isPreviewing: boolean; - mainTimeline: MainTimeline; - trials: { [string]: Trial }; - timelines: {}; -} - -export default class PreviewExperimentComponent extends Component { - // props: Props; - - constructor(props: Props) { - super(props); - } - - handleImages() { - return getImages(this.props.params); - } - - insertPreviewLabJsCallback(e) { - console.log('EEG marker', e); - } - - render() { - if (!this.props.isPreviewing) { - return ( -
- The experiment will be shown in the window -
- ) - } - return ( -
- { - this.props.onEnd(); - }, - }} - /> -
- ); - } -} diff --git a/app/components/PreviewExperimentComponent.tsx b/app/components/PreviewExperimentComponent.tsx new file mode 100644 index 00000000..ac3dcb80 --- /dev/null +++ b/app/components/PreviewExperimentComponent.tsx @@ -0,0 +1,53 @@ + +import React, { Component } from "react"; +import { Segment } from "semantic-ui-react"; +import { ExperimentWindow } from "../utils/labjs"; +import styles from "./styles/collect.css"; + +import { getImages } from "../utils/filesystem/storage"; +import { MainTimeline, Trial, ExperimentParameters } from "../constants/interfaces"; + +interface Props { + params: ExperimentParameters; + isPreviewing: boolean; + mainTimeline: MainTimeline; + trials: { + [key: string]: Trial; + }; + timelines: {}; +} + +export default class PreviewExperimentComponent extends Component { + // props: Props; + + constructor(props: Props) { + super(props); + } + + handleImages() { + return getImages(this.props.params); + } + + insertPreviewLabJsCallback(e) { + console.log('EEG marker', e); + } + + render() { + if (!this.props.isPreviewing) { + return
+ The experiment will be shown in the window +
; + } + return
+ { + this.props.onEnd(); + } + }} /> +
; + } +} \ No newline at end of file diff --git a/app/components/SecondaryNavComponent/SecondaryNavSegment.js b/app/components/SecondaryNavComponent/SecondaryNavSegment.js deleted file mode 100644 index 0c55bfd8..00000000 --- a/app/components/SecondaryNavComponent/SecondaryNavSegment.js +++ /dev/null @@ -1,27 +0,0 @@ -import React, { Component } from 'react'; -import { Grid } from 'semantic-ui-react'; -import styles from '../styles/secondarynav.css'; - -interface Props { - title: string; - style: string; - onClick: () => void; -} - -export default class SecondaryNavSegment extends Component { - // props: Props; - - render() { - return ( - - {this.props.title} - - ); - } -} diff --git a/app/components/SecondaryNavComponent/SecondaryNavSegment.tsx b/app/components/SecondaryNavComponent/SecondaryNavSegment.tsx new file mode 100644 index 00000000..4a4e11d6 --- /dev/null +++ b/app/components/SecondaryNavComponent/SecondaryNavSegment.tsx @@ -0,0 +1,19 @@ +import React, { Component } from "react"; +import { Grid } from "semantic-ui-react"; +import styles from "../styles/secondarynav.css"; + +interface Props { + title: string; + style: string; + onClick: () => void; +} + +export default class SecondaryNavSegment extends Component { + // props: Props; + + render() { + return + {this.props.title} + ; + } +} \ No newline at end of file diff --git a/app/components/SecondaryNavComponent/index.js b/app/components/SecondaryNavComponent/index.tsx similarity index 51% rename from app/components/SecondaryNavComponent/index.js rename to app/components/SecondaryNavComponent/index.tsx index 6145c07f..2c8b4052 100644 --- a/app/components/SecondaryNavComponent/index.js +++ b/app/components/SecondaryNavComponent/index.tsx @@ -1,19 +1,22 @@ -import React, { Component } from 'react'; -import { Grid, Header, Dropdown } from 'semantic-ui-react'; -import styles from '../styles/secondarynav.css'; -import SecondaryNavSegment from './SecondaryNavSegment'; -import { NavLink } from 'react-router-dom'; -import { SCREENS } from '../../constants/constants'; +import React, { Component } from "react"; +import { Grid, Header, Dropdown } from "semantic-ui-react"; +import styles from "../styles/secondarynav.css"; +import SecondaryNavSegment from "./SecondaryNavSegment"; +import { NavLink } from "react-router-dom"; +import { SCREENS } from "../../constants/constants"; interface Props { title: string | React.ReactNode; - steps: { [string]: string }; + steps: { + [key: string]: string; + }; activeStep: string; - onStepClick: (string) => void; + onStepClick: (arg0: string) => void; button?: React.ReactNode; } export default class SecondaryNavComponent extends Component { + shouldComponentUpdate(nextProps) { return nextProps.activeStep !== this.props.activeStep; } @@ -26,42 +29,24 @@ export default class SecondaryNavComponent extends Component { } renderSteps() { - return ( - <> - {Object.values(this.props.steps).map((stepTitle) => ( - this.props.onStepClick(stepTitle)} - /> - ))} - - ); + return <> + {Object.values(this.props.steps).map(stepTitle => this.props.onStepClick(stepTitle)} />)} + ; } render() { - return ( - + return {this.renderTitle()} {this.renderSteps()} - {this.props.enableEEGToggle && ( - + {this.props.enableEEGToggle &&
- e.stopPropagation()} - > + e.stopPropagation()}>
Enable EEG
{this.props.enableEEGToggle}
@@ -74,9 +59,7 @@ export default class SecondaryNavComponent extends Component {
{this.props.saveButton}
-
- )} -
- ); +
} +
; } -} +} \ No newline at end of file diff --git a/app/components/SignalQualityIndicatorComponent.js b/app/components/SignalQualityIndicatorComponent.js deleted file mode 100644 index 85a910e6..00000000 --- a/app/components/SignalQualityIndicatorComponent.js +++ /dev/null @@ -1,70 +0,0 @@ -// @flow -import React, { Component } from 'react'; -import { isNil } from 'lodash'; -import { Segment } from 'semantic-ui-react'; -import * as d3 from 'd3'; -import { Observable } from 'rxjs'; -import SignalQualityIndicatorSVG from './svgs/SignalQualityIndicatorSVG'; - -interface Props { - signalQualityObservable: ?Observable; - plottingInterval: ?number; -} - -class SignalQualityIndicatorComponent extends Component { - // signalQualitySubscription: Subscription; - - constructor(props: Props) { - super(props); - this.signalQualitySubscription = null; - } - - componentDidMount() { - if (!isNil(this.props.signalQualityObservable)) { - this.subscribeToObservable(this.props.signalQualityObservable); - } - } - - componentDidUpdate(prevProps: Props) { - if (this.props.signalQualityObservable !== prevProps.signalQualityObservable) { - this.subscribeToObservable(this.props.signalQualityObservable); - } - } - - componentWillUnmount() { - if (!isNil(this.signalQualitySubscription)) { - this.signalQualitySubscription.unsubscribe(); - } - } - - subscribeToObservable(observable: any) { - if (!isNil(this.signalQualitySubscription)) { - this.signalQualitySubscription.unsubscribe(); - } - - this.signalQualitySubscription = observable.subscribe( - (epoch) => { - Object.keys(epoch.signalQuality).forEach((key) => { - d3.select(`#${key}`) - .attr('visibility', 'show') - .attr('stroke', '#000') - .transition() - .duration(this.props.plottingInterval) - .ease(d3.easeLinear) - .attr('fill', epoch.signalQuality[key]); - }); - }, - (error) => new Error(`Error in signalQualitySubscription ${error}`) - ); - } - - render() { - return ( - - - - ); - } -} - -export default SignalQualityIndicatorComponent; diff --git a/app/components/SignalQualityIndicatorComponent.tsx b/app/components/SignalQualityIndicatorComponent.tsx new file mode 100644 index 00000000..8e9d9980 --- /dev/null +++ b/app/components/SignalQualityIndicatorComponent.tsx @@ -0,0 +1,59 @@ + +import React, { Component } from "react"; +import { isNil } from "lodash"; +import { Segment } from "semantic-ui-react"; +import * as d3 from "d3"; +import { Observable } from "rxjs"; +import SignalQualityIndicatorSVG from "./svgs/SignalQualityIndicatorSVG"; + +interface Props { + signalQualityObservable: Observable | null | undefined; + plottingInterval: number | null | undefined; +} + +class SignalQualityIndicatorComponent extends Component { + // signalQualitySubscription: Subscription; + + constructor(props: Props) { + super(props); + this.signalQualitySubscription = null; + } + + componentDidMount() { + if (!isNil(this.props.signalQualityObservable)) { + this.subscribeToObservable(this.props.signalQualityObservable); + } + } + + componentDidUpdate(prevProps: Props) { + if (this.props.signalQualityObservable !== prevProps.signalQualityObservable) { + this.subscribeToObservable(this.props.signalQualityObservable); + } + } + + componentWillUnmount() { + if (!isNil(this.signalQualitySubscription)) { + this.signalQualitySubscription.unsubscribe(); + } + } + + subscribeToObservable(observable: any) { + if (!isNil(this.signalQualitySubscription)) { + this.signalQualitySubscription.unsubscribe(); + } + + this.signalQualitySubscription = observable.subscribe(epoch => { + Object.keys(epoch.signalQuality).forEach(key => { + d3.select(`#${key}`).attr('visibility', 'show').attr('stroke', '#000').transition().duration(this.props.plottingInterval).ease(d3.easeLinear).attr('fill', epoch.signalQuality[key]); + }); + }, error => new Error(`Error in signalQualitySubscription ${error}`)); + } + + render() { + return + + ; + } +} + +export default SignalQualityIndicatorComponent; \ No newline at end of file diff --git a/app/components/TopNavComponent/PrimaryNavSegment.js b/app/components/TopNavComponent/PrimaryNavSegment.tsx similarity index 52% rename from app/components/TopNavComponent/PrimaryNavSegment.js rename to app/components/TopNavComponent/PrimaryNavSegment.tsx index 92dd89e2..14c18856 100644 --- a/app/components/TopNavComponent/PrimaryNavSegment.js +++ b/app/components/TopNavComponent/PrimaryNavSegment.tsx @@ -1,7 +1,7 @@ -import React, { Component } from 'react'; -import { Grid } from 'semantic-ui-react'; -import { NavLink } from 'react-router-dom'; -import styles from '../styles/topnavbar.css'; +import React, { Component } from "react"; +import { Grid } from "semantic-ui-react"; +import { NavLink } from "react-router-dom"; +import styles from "../styles/topnavbar.css"; interface Props { style: string; @@ -11,14 +11,13 @@ interface Props { } export default class PrimaryNavSegment extends Component { + render() { - return ( - + return
{this.props.order}
{this.props.title}
-
- ); +
; } -} +} \ No newline at end of file diff --git a/app/components/TopNavComponent/index.js b/app/components/TopNavComponent/index.js deleted file mode 100644 index 33c60c3d..00000000 --- a/app/components/TopNavComponent/index.js +++ /dev/null @@ -1,117 +0,0 @@ -import React, { Component } from 'react'; -import { Grid, Button, Segment, Image, Dropdown } from 'semantic-ui-react'; -import { NavLink } from 'react-router-dom'; -import { EXPERIMENTS, SCREENS } from '../../constants/constants'; -import styles from '../styles/topnavbar.css'; -import PrimaryNavSegment from './PrimaryNavSegment'; -import { readAndParseState, readWorkspaces } from '../../utils/filesystem/storage'; -import BrainwavesIcon from '../../assets/common/Brainwaves_Icon_big.png'; -import { isNil } from 'lodash'; - -interface Props { - title: ?string; - location: { pathname: string, search: string, hash: string }; - isRunning: boolean; - experimentActions: Object; - type: EXPERIMENTS; -} - -interface State { - recentWorkspaces: Array; -} - -export default class TopNavComponent extends Component { - // props: Props; - - state = { - recentWorkspaces: [], - }; - - getStyleForScreen(navSegmentScreen: SCREENS) { - if (navSegmentScreen.route === this.props.location.pathname) { - return styles.activeNavColumn; - } - - const routeOrder = Object.values(SCREENS).find( - (screen) => screen.route === navSegmentScreen.route - ).order; - const currentOrder = Object.values(SCREENS).find( - (screen) => screen.route === this.props.location.pathname - ).order; - if (currentOrder > routeOrder) { - return styles.visitedNavColumn; - } - return styles.initialNavColumn; - } - - handleLoadRecentWorkspace(dir: string) { - const recentWorkspaceState = readAndParseState(dir); - if (!isNil(recentWorkspaceState)) { - this.props.experimentActions.setState(recentWorkspaceState); - } - } - - updateWorkspaces = () => { - this.setState({ recentWorkspaces: readWorkspaces() }); - }; - - render() { - if ( - this.props.location.pathname === SCREENS.HOME.route || - this.props.location.pathname === SCREENS.BANK.route || - this.props.location.pathname === '/' || - this.props.isRunning - ) { - return null; - } - return ( - - - - - - Home - - - - - - - { - this.updateWorkspaces(); - }} - > - - {this.state.recentWorkspaces.map((workspace) => ( - this.handleLoadRecentWorkspace(workspace)} - > -

{workspace}

-
- ))} -
-
-
-
- - - - {this.props.isEEGEnabled ? ( - - ) : null} - {this.props.isEEGEnabled ? ( - - ) : ( - - )} -
- ); - } -} diff --git a/app/components/TopNavComponent/index.tsx b/app/components/TopNavComponent/index.tsx new file mode 100644 index 00000000..c8c78526 --- /dev/null +++ b/app/components/TopNavComponent/index.tsx @@ -0,0 +1,88 @@ +import React, { Component } from "react"; +import { Grid, Button, Segment, Image, Dropdown } from "semantic-ui-react"; +import { NavLink } from "react-router-dom"; +import { EXPERIMENTS, SCREENS } from "../../constants/constants"; +import styles from "../styles/topnavbar.css"; +import PrimaryNavSegment from "./PrimaryNavSegment"; +import { readAndParseState, readWorkspaces } from "../../utils/filesystem/storage"; +import BrainwavesIcon from "../../assets/common/Brainwaves_Icon_big.png"; +import { isNil } from "lodash"; + +interface Props { + title: string | null | undefined; + location: {pathname: string;search: string;hash: string;}; + isRunning: boolean; + experimentActions: Object; + type: EXPERIMENTS; +} + +interface State { + recentWorkspaces: Array; +} + +export default class TopNavComponent extends Component { + // props: Props; + + state = { + recentWorkspaces: [] + }; + + getStyleForScreen(navSegmentScreen: SCREENS) { + if (navSegmentScreen.route === this.props.location.pathname) { + return styles.activeNavColumn; + } + + const routeOrder = Object.values(SCREENS).find(screen => screen.route === navSegmentScreen.route).order; + const currentOrder = Object.values(SCREENS).find(screen => screen.route === this.props.location.pathname).order; + if (currentOrder > routeOrder) { + return styles.visitedNavColumn; + } + return styles.initialNavColumn; + } + + handleLoadRecentWorkspace(dir: string) { + const recentWorkspaceState = readAndParseState(dir); + if (!isNil(recentWorkspaceState)) { + this.props.experimentActions.setState(recentWorkspaceState); + } + } + + updateWorkspaces = () => { + this.setState({ recentWorkspaces: readWorkspaces() }); + }; + + render() { + if (this.props.location.pathname === SCREENS.HOME.route || this.props.location.pathname === SCREENS.BANK.route || this.props.location.pathname === '/' || this.props.isRunning) { + return null; + } + return + + + + + Home + + + + + + + { + this.updateWorkspaces(); + }}> + + {this.state.recentWorkspaces.map(workspace => this.handleLoadRecentWorkspace(workspace)}> +

{workspace}

+
)} +
+
+
+
+ + + + {this.props.isEEGEnabled ? : null} + {this.props.isEEGEnabled ? : } +
; + } +} \ No newline at end of file diff --git a/app/components/ViewerComponent.js b/app/components/ViewerComponent.tsx similarity index 78% rename from app/components/ViewerComponent.js rename to app/components/ViewerComponent.tsx index 381d9165..acab1305 100644 --- a/app/components/ViewerComponent.js +++ b/app/components/ViewerComponent.tsx @@ -1,13 +1,13 @@ -// @flow -import React, { Component } from 'react'; -import { Subscription, Observable } from 'rxjs'; -import { isNil } from 'lodash'; -import { MUSE_CHANNELS, EMOTIV_CHANNELS, DEVICES, VIEWER_DEFAULTS } from '../constants/constants'; + +import React, { Component } from "react"; +import { Subscription, Observable } from "rxjs"; +import { isNil } from "lodash"; +import { MUSE_CHANNELS, EMOTIV_CHANNELS, DEVICES, VIEWER_DEFAULTS } from "../constants/constants"; const Mousetrap = require('mousetrap'); interface Props { - signalQualityObservable: ?Observable; + signalQualityObservable: Observable | null | undefined; deviceType: DEVICES; plottingInterval: number; } @@ -19,16 +19,14 @@ interface State { } class ViewerComponent extends Component { - // props: Props; - // state: State; + // graphView: ?HTMLElement; // signalQualitySubscription: Subscription; - constructor(props: Props) { super(props); this.state = { ...VIEWER_DEFAULTS, - channels: props.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS : MUSE_CHANNELS, + channels: props.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS : MUSE_CHANNELS }; this.graphView = null; this.signalQualitySubscription = null; @@ -41,7 +39,7 @@ class ViewerComponent extends Component { plottingInterval: this.props.plottingInterval, channels: this.state.channels, domain: this.state.domain, - channelColours: this.state.channels.map(() => '#66B0A9'), + channelColours: this.state.channels.map(() => '#66B0A9') }); this.setKeyListeners(); if (!isNil(this.props.signalQualityObservable)) { @@ -56,7 +54,7 @@ class ViewerComponent extends Component { } if (this.props.deviceType !== prevProps.deviceType) { this.setState({ - channels: this.props.deviceType === DEVICES.MUSE ? MUSE_CHANNELS : EMOTIV_CHANNELS, + channels: this.props.deviceType === DEVICES.MUSE ? MUSE_CHANNELS : EMOTIV_CHANNELS }); } if (this.state.channels !== prevState.channels) { @@ -90,25 +88,14 @@ class ViewerComponent extends Component { if (!isNil(this.signalQualitySubscription)) { this.signalQualitySubscription.unsubscribe(); } - this.signalQualitySubscription = observable.subscribe( - (chunk) => { - this.graphView.send('newData', chunk); - }, - (error) => new Error(`Error in epochSubscription ${error}`) - ); + this.signalQualitySubscription = observable.subscribe(chunk => { + this.graphView.send('newData', chunk); + }, error => new Error(`Error in epochSubscription ${error}`)); } render() { - return ( - - ); + return ; } } -export default ViewerComponent; +export default ViewerComponent; \ No newline at end of file diff --git a/app/components/d3Classes/EEGViewer.js b/app/components/d3Classes/EEGViewer.js deleted file mode 100644 index d2e70078..00000000 --- a/app/components/d3Classes/EEGViewer.js +++ /dev/null @@ -1,248 +0,0 @@ -/* eslint prefer-template: 0 */ -const d3 = require('d3'); -const throttle = require('lodash/throttle'); -const simplify = require('simplify-js'); - -class EEGViewer { - constructor(svg, parameters) { - this.channels = parameters.channels; - this.plottingInterval = parameters.plottingInterval; // NOTE: Plotting interval in Ms - this.domain = parameters.domain + this.plottingInterval; - this.channelColours = parameters.channelColours; - this.downsampling = 2; - this.lineWidth = 1.75; - this.zoom = 1; - this.zoomScalar = 1.5; - this.canvas = d3.select(svg); - this.margin = { top: 20, right: 10, bottom: 0, left: 20 }; - this.channelMaxs = new Array(this.channels.length).fill(100); - this.channelMins = new Array(this.channels.length).fill(-100); - this.lastTimestamp = new Date().getTime(); - this.firstTimestamp = this.lastTimestamp - this.domain; - - this.resetData(); - this.init(); - const resize = this.resize.bind(this); - d3.select(window).on('resize.updatesvg', throttle(resize, 200)); - } - - updateData(epoch) { - const { - info: { samplingRate, startTime }, - } = epoch; - this.lastTimestamp = startTime + epoch.data[0].length / (samplingRate / 1000); - this.firstTimestamp = this.lastTimestamp - this.domain; - for (let i = 0; i < this.channels.length; i++) { - this.data[i] = this.data[i] - .concat( - simplify( - epoch.data[i].map((dataPoint, index) => ({ - x: startTime + index / (samplingRate / 1000), - y: dataPoint, - })), - this.downsampling - ) - ) - .filter((sample) => sample.x >= this.firstTimestamp); - } - - this.channelColours = this.channels.map((channelName) => epoch.signalQuality[channelName]); - this.redraw(); - } - - updateChannels(channels) { - this.channels = channels; - this.resetData(); - this.init(); - } - - updateDomain(domain) { - this.domain = domain; - this.resetData(); - this.init(); - } - - zoomIn() { - this.zoom /= this.zoomScalar; - this.redraw(); - } - - zoomOut() { - this.zoom *= this.zoomScalar; - this.redraw(); - } - - autoScale() { - this.channelMaxs = this.data.map((channelData) => - EEGViewer.findExtreme(channelData, (a, b) => a > b) - ); - this.channelMins = this.data.map((channelData) => - EEGViewer.findExtreme(channelData, (a, b) => a < b) - ); - this.zoom = 1; - this.redraw(); - } - - resetData() { - this.data = new Array(this.channels.length).fill([{ x: this.lastTimestamp, y: 0 }]); - this.channelMaxs = new Array(this.channels.length).fill(100); - this.channelMins = new Array(this.channels.length).fill(-100); - } - - init() { - try { - d3.selectAll('svg > *').remove(); - this.width = - parseInt(d3.select('#graph').style('width'), 10) - (this.margin.left + this.margin.right); - this.height = - parseInt(d3.select('#graph').style('height'), 10) - (this.margin.top + this.margin.bottom); - this.graph = this.canvas - .attr('width', this.width) - .attr('height', this.height) - .append('g') - .attr('transform', 'translate(' + this.margin.left + ',' + this.margin.top + ')'); - this.addScales(); - this.addAxes(); - this.addLines(); - } catch (e) { - console.error(e); - } - } - - addScales() { - this.xScale = d3 - .scaleTime() - .domain([this.lastTimestamp, this.firstTimestamp + this.plottingInterval]) - .range([this.width, 0]); - - this.yScaleLines = d3.scaleLinear(); - - this.yScaleLabels = d3 - .scaleLinear() - .domain([this.channels.length - 1, 0]) - .range([ - (this.channels.length - 1) * (this.height / this.channels.length) + - this.height / this.channels.length / 2, - this.height / this.channels.length / 2, - ]); - } - - addAxes() { - this.yAxis = d3 - .axisLeft() - .scale(this.yScaleLabels) - .tickSize(2) - .tickFormat((d, i) => this.channels[i].replace(/\s/g, '')) - .tickValues(d3.range(this.channels.length)); - - this.axisY = this.graph - .append('g') - .attr('class', 'axis') - .call(this.yAxis); - } - - addLines() { - this.graph.selectAll('.legend').remove(); - this.graph.select('#lines').remove(); - this.graph.selectAll('#clip').remove(); - this.paths = []; - this.graph - .append('clipPath') - .attr('id', 'clip') - .append('rect') - .attr('height', this.height + this.height / this.channels.length) - .attr('width', this.width) - .attr('transform', 'translate(0,' + -this.height / this.channels.length + ')'); - this.lines = this.graph - .append('g') - .attr('id', 'lines') - .attr('clip-path', 'url(#clip)'); - this.line = d3 - .line() - .x((d) => this.xScale(d.x)) - .y((d) => this.yScaleLines(d.y)) - .curve(d3.curveLinear) - .defined((d) => d.y); - - for (let i = 0; i < this.channels.length; i++) { - const channelData = this.data[i]; - - this.yScaleLines - .domain([this.channelMins[i] / this.zoom, this.channelMaxs[i] / this.zoom]) - .range(EEGViewer.getLineRange(i, this.channels.length, this.height)); - - this.paths[i] = this.lines - .append('path') - .data([channelData]) - .attr('class', 'line') - .attr('id', 'line' + i + 1) - .attr('d', this.line) - .attr('stroke', this.channelColours[i]) - .attr('stroke-width', this.lineWidth); - } - } - - redraw() { - if (this.paths != null) { - for (let i = 0; i < this.channels.length; i++) { - const channelData = this.data[i]; - this.yScaleLines - .domain([this.channelMins[i] / this.zoom, this.channelMaxs[i] / this.zoom]) - .range(EEGViewer.getLineRange(i, this.channels.length, this.height)); - - this.paths[i] - .interrupt() - .transition() - .duration(this.plottingInterval) - .ease(d3.easeLinear) - .attr( - 'transform', - 'translate(' + - -(this.xScale(channelData[channelData.length - 1].x) - this.width) + - ', 0)' - ) - .attr('stroke', this.channelColours[i]); - - this.paths[i] - .data([channelData]) - .attr('d', this.line) - .attr('transform', 'translate(0,0)'); - } - - this.xScale - .domain([this.lastTimestamp, this.firstTimestamp + this.plottingInterval]) - .range([this.width, 0]); - } - } - - resize() { - if (this.paths != null) { - this.width = - parseInt(d3.select('#graph').style('width'), 10) - (this.margin.left + this.margin.right); - this.height = - parseInt(d3.select('#graph').style('height'), 10) - (this.margin.top + this.margin.bottom); - this.lines.attr('height', this.height).attr('width', this.width); - this.xScale.range([this.width, 0]); - this.yScaleLines.range([this.height, 0]); - this.yScaleLabels.range([ - (this.channels.length - 1) * (this.height / this.channels.length) + - this.height / this.channels.length / 2, - this.height / this.channels.length / 2, - ]); - this.axisY.call(this.yAxis); - this.addLines(); - } - } - - static findExtreme(data, comparison) { - return data - .slice(data.slice(data.length / 2)) - .reduce((acc, curr) => (comparison(curr.y, acc) ? curr.y : acc), data[0].y); - } - - static getLineRange(index, nbChannels, height) { - return [(index + 1) * (height / nbChannels), index * (height / nbChannels)]; - } -} - -module.exports = EEGViewer; diff --git a/app/components/d3Classes/EEGViewer.ts b/app/components/d3Classes/EEGViewer.ts new file mode 100644 index 00000000..a0080246 --- /dev/null +++ b/app/components/d3Classes/EEGViewer.ts @@ -0,0 +1,168 @@ +/* eslint prefer-template: 0 */ +const d3 = require('d3'); +const throttle = require('lodash/throttle'); +const simplify = require('simplify-js'); + +class EEGViewer { + + constructor(svg, parameters) { + this.channels = parameters.channels; + this.plottingInterval = parameters.plottingInterval; // NOTE: Plotting interval in Ms + this.domain = parameters.domain + this.plottingInterval; + this.channelColours = parameters.channelColours; + this.downsampling = 2; + this.lineWidth = 1.75; + this.zoom = 1; + this.zoomScalar = 1.5; + this.canvas = d3.select(svg); + this.margin = { top: 20, right: 10, bottom: 0, left: 20 }; + this.channelMaxs = new Array(this.channels.length).fill(100); + this.channelMins = new Array(this.channels.length).fill(-100); + this.lastTimestamp = new Date().getTime(); + this.firstTimestamp = this.lastTimestamp - this.domain; + + this.resetData(); + this.init(); + const resize = this.resize.bind(this); + d3.select(window).on('resize.updatesvg', throttle(resize, 200)); + } + + updateData(epoch) { + const { + info: { + samplingRate, + startTime + } + } = epoch; + this.lastTimestamp = startTime + epoch.data[0].length / (samplingRate / 1000); + this.firstTimestamp = this.lastTimestamp - this.domain; + for (let i = 0; i < this.channels.length; i++) { + this.data[i] = this.data[i].concat(simplify(epoch.data[i].map((dataPoint, index) => ({ + x: startTime + index / (samplingRate / 1000), + y: dataPoint + })), this.downsampling)).filter(sample => sample.x >= this.firstTimestamp); + } + + this.channelColours = this.channels.map(channelName => epoch.signalQuality[channelName]); + this.redraw(); + } + + updateChannels(channels) { + this.channels = channels; + this.resetData(); + this.init(); + } + + updateDomain(domain) { + this.domain = domain; + this.resetData(); + this.init(); + } + + zoomIn() { + this.zoom /= this.zoomScalar; + this.redraw(); + } + + zoomOut() { + this.zoom *= this.zoomScalar; + this.redraw(); + } + + autoScale() { + this.channelMaxs = this.data.map(channelData => EEGViewer.findExtreme(channelData, (a, b) => a > b)); + this.channelMins = this.data.map(channelData => EEGViewer.findExtreme(channelData, (a, b) => a < b)); + this.zoom = 1; + this.redraw(); + } + + resetData() { + this.data = new Array(this.channels.length).fill([{ x: this.lastTimestamp, y: 0 }]); + this.channelMaxs = new Array(this.channels.length).fill(100); + this.channelMins = new Array(this.channels.length).fill(-100); + } + + init() { + try { + d3.selectAll('svg > *').remove(); + this.width = parseInt(d3.select('#graph').style('width'), 10) - (this.margin.left + this.margin.right); + this.height = parseInt(d3.select('#graph').style('height'), 10) - (this.margin.top + this.margin.bottom); + this.graph = this.canvas.attr('width', this.width).attr('height', this.height).append('g').attr('transform', 'translate(' + this.margin.left + ',' + this.margin.top + ')'); + this.addScales(); + this.addAxes(); + this.addLines(); + } catch (e) { + console.error(e); + } + } + + addScales() { + this.xScale = d3.scaleTime().domain([this.lastTimestamp, this.firstTimestamp + this.plottingInterval]).range([this.width, 0]); + + this.yScaleLines = d3.scaleLinear(); + + this.yScaleLabels = d3.scaleLinear().domain([this.channels.length - 1, 0]).range([(this.channels.length - 1) * (this.height / this.channels.length) + this.height / this.channels.length / 2, this.height / this.channels.length / 2]); + } + + addAxes() { + this.yAxis = d3.axisLeft().scale(this.yScaleLabels).tickSize(2).tickFormat((d, i) => this.channels[i].replace(/\s/g, '')).tickValues(d3.range(this.channels.length)); + + this.axisY = this.graph.append('g').attr('class', 'axis').call(this.yAxis); + } + + addLines() { + this.graph.selectAll('.legend').remove(); + this.graph.select('#lines').remove(); + this.graph.selectAll('#clip').remove(); + this.paths = []; + this.graph.append('clipPath').attr('id', 'clip').append('rect').attr('height', this.height + this.height / this.channels.length).attr('width', this.width).attr('transform', 'translate(0,' + -this.height / this.channels.length + ')'); + this.lines = this.graph.append('g').attr('id', 'lines').attr('clip-path', 'url(#clip)'); + this.line = d3.line().x(d => this.xScale(d.x)).y(d => this.yScaleLines(d.y)).curve(d3.curveLinear).defined(d => d.y); + + for (let i = 0; i < this.channels.length; i++) { + const channelData = this.data[i]; + + this.yScaleLines.domain([this.channelMins[i] / this.zoom, this.channelMaxs[i] / this.zoom]).range(EEGViewer.getLineRange(i, this.channels.length, this.height)); + + this.paths[i] = this.lines.append('path').data([channelData]).attr('class', 'line').attr('id', 'line' + i + 1).attr('d', this.line).attr('stroke', this.channelColours[i]).attr('stroke-width', this.lineWidth); + } + } + + redraw() { + if (this.paths != null) { + for (let i = 0; i < this.channels.length; i++) { + const channelData = this.data[i]; + this.yScaleLines.domain([this.channelMins[i] / this.zoom, this.channelMaxs[i] / this.zoom]).range(EEGViewer.getLineRange(i, this.channels.length, this.height)); + + this.paths[i].interrupt().transition().duration(this.plottingInterval).ease(d3.easeLinear).attr('transform', 'translate(' + -(this.xScale(channelData[channelData.length - 1].x) - this.width) + ', 0)').attr('stroke', this.channelColours[i]); + + this.paths[i].data([channelData]).attr('d', this.line).attr('transform', 'translate(0,0)'); + } + + this.xScale.domain([this.lastTimestamp, this.firstTimestamp + this.plottingInterval]).range([this.width, 0]); + } + } + + resize() { + if (this.paths != null) { + this.width = parseInt(d3.select('#graph').style('width'), 10) - (this.margin.left + this.margin.right); + this.height = parseInt(d3.select('#graph').style('height'), 10) - (this.margin.top + this.margin.bottom); + this.lines.attr('height', this.height).attr('width', this.width); + this.xScale.range([this.width, 0]); + this.yScaleLines.range([this.height, 0]); + this.yScaleLabels.range([(this.channels.length - 1) * (this.height / this.channels.length) + this.height / this.channels.length / 2, this.height / this.channels.length / 2]); + this.axisY.call(this.yAxis); + this.addLines(); + } + } + + static findExtreme(data, comparison) { + return data.slice(data.slice(data.length / 2)).reduce((acc, curr) => comparison(curr.y, acc) ? curr.y : acc, data[0].y); + } + + static getLineRange(index, nbChannels, height) { + return [(index + 1) * (height / nbChannels), index * (height / nbChannels)]; + } +} + +module.exports = EEGViewer; \ No newline at end of file diff --git a/app/components/svgs/ClickableHeadDiagramSVG.js b/app/components/svgs/ClickableHeadDiagramSVG.js deleted file mode 100644 index 459bccca..00000000 --- a/app/components/svgs/ClickableHeadDiagramSVG.js +++ /dev/null @@ -1,421 +0,0 @@ -import React from 'react'; - -interface Props { - channelinfo: Array; - onChannelClick: (string) => void; -} - -const SvgComponent = (props: Props) => ( - - Signal Quality Indicator - - - - - - - - - - - - props.onChannelClick('T7')} - > - - - T7 - - - props.onChannelClick('FC5')} - visibility={props.channelinfo.includes('FC5') ? 'show' : 'hidden'} - > - - - FC5 - - - props.onChannelClick('FC6')} - visibility={props.channelinfo.includes('FC6') ? 'show' : 'hidden'} - > - - - FC6 - - - props.onChannelClick('F3')} - visibility={props.channelinfo.includes('F3') ? 'show' : 'hidden'} - > - - - F3 - - - props.onChannelClick('F4')} - visibility={props.channelinfo.includes('F4') ? 'show' : 'hidden'} - > - - - F4 - - - props.onChannelClick('AF3')} - visibility={props.channelinfo.includes('AF3') ? 'show' : 'hidden'} - > - - - AF3 - - - props.onChannelClick('AF4')} - visibility={props.channelinfo.includes('AF4') ? 'show' : 'hidden'} - > - - - AF4 - - - props.onChannelClick('M1')} - visibility={props.channelinfo.includes('M1') ? 'show' : 'hidden'} - > - - - M1 - - - props.onChannelClick('P7')} - visibility={props.channelinfo.includes('P7') ? 'show' : 'hidden'} - > - - - P7 - - - props.onChannelClick('O1')} - visibility={props.channelinfo.includes('O1') ? 'show' : 'hidden'} - > - - - O1 - - - props.onChannelClick('O2')} - visibility={props.channelinfo.includes('O2') ? 'show' : 'hidden'} - > - - - O2 - - - props.onChannelClick('P8')} - visibility={props.channelinfo.includes('P8') ? 'show' : 'hidden'} - > - - - P8 - - - props.onChannelClick('T8')} - visibility={props.channelinfo.includes('T8') ? 'show' : 'hidden'} - > - - - T8 - - - props.onChannelClick('M2')} - visibility={props.channelinfo.includes('M2') ? 'show' : 'hidden'} - > - - - M2 - - - props.onChannelClick('TP10')} - visibility={props.channelinfo.includes('TP10') ? 'show' : 'hidden'} - > - - - TP10 - - - props.onChannelClick('Fpz')} - visibility={props.channelinfo.includes('Fpz') ? 'show' : 'hidden'} - > - - - F - - pz - - - - props.onChannelClick('TP9')} - visibility={props.channelinfo.includes('TP9') ? 'show' : 'hidden'} - > - - - TP9 - - - props.onChannelClick('AF7')} - visibility={props.channelinfo.includes('AF7') ? 'show' : 'hidden'} - > - - - AF7 - - - props.onChannelClick('AF8')} - visibility={props.channelinfo.includes('AF8') ? 'show' : 'hidden'} - > - - - AF8 - - - -); - -export default SvgComponent; diff --git a/app/components/svgs/ClickableHeadDiagramSVG.tsx b/app/components/svgs/ClickableHeadDiagramSVG.tsx new file mode 100644 index 00000000..19fa09a4 --- /dev/null +++ b/app/components/svgs/ClickableHeadDiagramSVG.tsx @@ -0,0 +1,140 @@ +import React from "react"; + +interface Props { + channelinfo: Array; + onChannelClick: (arg0: string) => void; +} + +const SvgComponent = (props: Props) => + Signal Quality Indicator + + + + + + + + + + + + props.onChannelClick('T7')}> + + + T7 + + + props.onChannelClick('FC5')} visibility={props.channelinfo.includes('FC5') ? 'show' : 'hidden'}> + + + FC5 + + + props.onChannelClick('FC6')} visibility={props.channelinfo.includes('FC6') ? 'show' : 'hidden'}> + + + FC6 + + + props.onChannelClick('F3')} visibility={props.channelinfo.includes('F3') ? 'show' : 'hidden'}> + + + F3 + + + props.onChannelClick('F4')} visibility={props.channelinfo.includes('F4') ? 'show' : 'hidden'}> + + + F4 + + + props.onChannelClick('AF3')} visibility={props.channelinfo.includes('AF3') ? 'show' : 'hidden'}> + + + AF3 + + + props.onChannelClick('AF4')} visibility={props.channelinfo.includes('AF4') ? 'show' : 'hidden'}> + + + AF4 + + + props.onChannelClick('M1')} visibility={props.channelinfo.includes('M1') ? 'show' : 'hidden'}> + + + M1 + + + props.onChannelClick('P7')} visibility={props.channelinfo.includes('P7') ? 'show' : 'hidden'}> + + + P7 + + + props.onChannelClick('O1')} visibility={props.channelinfo.includes('O1') ? 'show' : 'hidden'}> + + + O1 + + + props.onChannelClick('O2')} visibility={props.channelinfo.includes('O2') ? 'show' : 'hidden'}> + + + O2 + + + props.onChannelClick('P8')} visibility={props.channelinfo.includes('P8') ? 'show' : 'hidden'}> + + + P8 + + + props.onChannelClick('T8')} visibility={props.channelinfo.includes('T8') ? 'show' : 'hidden'}> + + + T8 + + + props.onChannelClick('M2')} visibility={props.channelinfo.includes('M2') ? 'show' : 'hidden'}> + + + M2 + + + props.onChannelClick('TP10')} visibility={props.channelinfo.includes('TP10') ? 'show' : 'hidden'}> + + + TP10 + + + props.onChannelClick('Fpz')} visibility={props.channelinfo.includes('Fpz') ? 'show' : 'hidden'}> + + + F + + pz + + + + props.onChannelClick('TP9')} visibility={props.channelinfo.includes('TP9') ? 'show' : 'hidden'}> + + + TP9 + + + props.onChannelClick('AF7')} visibility={props.channelinfo.includes('AF7') ? 'show' : 'hidden'}> + + + AF7 + + + props.onChannelClick('AF8')} visibility={props.channelinfo.includes('AF8') ? 'show' : 'hidden'}> + + + AF8 + + + ; + +export default SvgComponent; \ No newline at end of file diff --git a/app/components/svgs/SignalQualityIndicatorSVG.js b/app/components/svgs/SignalQualityIndicatorSVG.js deleted file mode 100644 index 0420ed70..00000000 --- a/app/components/svgs/SignalQualityIndicatorSVG.js +++ /dev/null @@ -1,321 +0,0 @@ -import React from 'react'; - -const SvgComponent = (props) => ( - - Signal Quality Indicator - - - - - - - - - - - - - - - T7 - - - - - - FC5 - - - - - - FC6 - - - - - - F3 - - - - - - F4 - - - - - - AF3 - - - - - - AF4 - - - - - - M1 - - - - - - P7 - - - - - - O1 - - - - - - O2 - - - - - - P8 - - - - - - T8 - - - - - - M2 - - - - - - TP10 - - - - - - F - - pz - - - - - - - TP9 - - - - - - AF7 - - - - - - AF8 - - - -); - -export default SvgComponent; diff --git a/app/components/svgs/SignalQualityIndicatorSVG.tsx b/app/components/svgs/SignalQualityIndicatorSVG.tsx new file mode 100644 index 00000000..0dba1619 --- /dev/null +++ b/app/components/svgs/SignalQualityIndicatorSVG.tsx @@ -0,0 +1,135 @@ +import React from "react"; + +const SvgComponent = props => + Signal Quality Indicator + + + + + + + + + + + + + + + T7 + + + + + + FC5 + + + + + + FC6 + + + + + + F3 + + + + + + F4 + + + + + + AF3 + + + + + + AF4 + + + + + + M1 + + + + + + P7 + + + + + + O1 + + + + + + O2 + + + + + + P8 + + + + + + T8 + + + + + + M2 + + + + + + TP10 + + + + + + F + + pz + + + + + + + TP9 + + + + + + AF7 + + + + + + AF8 + + + ; + +export default SvgComponent; \ No newline at end of file From 6c7410b4ae7e723a77e1ddff2a43c4f36dd74276 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 21 Jun 2020 18:24:32 -0700 Subject: [PATCH 10/66] prettier --- app/actions/deviceActions.js | 16 +- app/actions/experimentActions.js | 26 +- app/actions/jupyterActions.js | 12 +- app/app.html | 4 +- app/components/styles/secondarynav.css | 6 +- app/components/styles/topnavbar.css | 4 +- app/constants/constants.js | 28 +- app/constants/interfaces.js | 8 +- app/containers/AnalyzeContainer.js | 4 +- app/containers/App.js | 2 +- app/containers/CleanContainer.js | 4 +- app/containers/CollectContainer.js | 4 +- app/containers/ExperimentDesignContainer.js | 4 +- app/containers/HomeContainer.js | 4 +- app/containers/TopNavBarContainer.js | 4 +- app/epics/deviceEpics.js | 109 +-- app/epics/experimentEpics.js | 68 +- app/epics/jupyterEpics.js | 188 +++-- app/main.dev.js | 14 +- app/menu.js | 104 +-- app/reducers/deviceReducer.js | 29 +- app/reducers/experimentReducer.js | 37 +- app/reducers/index.js | 2 +- app/reducers/jupyterReducer.js | 27 +- app/routes.js | 25 +- app/store/configureStore.dev.js | 6 +- app/store/configureStore.js | 4 +- app/utils/behavior/compute.js | 364 +++++---- app/utils/eeg/cortex.js | 44 +- app/utils/eeg/emotiv.js | 28 +- app/utils/eeg/muse.js | 34 +- app/utils/eeg/pipes.js | 61 +- app/utils/filesystem/dialog.js | 12 +- app/utils/filesystem/select.js | 2 +- app/utils/filesystem/storage.js | 88 +- app/utils/filesystem/write.js | 7 +- app/utils/jupyter/cells.js | 43 +- app/utils/jupyter/functions.js | 3 +- app/utils/jupyter/pipes.js | 8 +- app/utils/labjs/functions.js | 6 +- app/utils/labjs/index.js | 34 +- app/utils/labjs/lab.css | 76 +- app/utils/labjs/protocols/custom.js | 10 +- app/utils/labjs/protocols/faceshouses.js | 105 ++- app/utils/labjs/protocols/multi.js | 31 +- app/utils/labjs/protocols/search.js | 24 +- app/utils/labjs/protocols/stroop.js | 28 +- app/utils/labjs/scripts/custom.js | 857 ++++++++++---------- app/utils/labjs/scripts/faceshouses.js | 178 ++-- app/utils/labjs/scripts/multitasking.js | 362 +++++---- app/utils/labjs/scripts/stroop.js | 194 +++-- app/utils/labjs/scripts/visualsearch.js | 195 +++-- app/viewer.html | 103 ++- appveyor.yml | 2 +- environment.yml | 26 +- 55 files changed, 2107 insertions(+), 1561 deletions(-) diff --git a/app/actions/deviceActions.js b/app/actions/deviceActions.js index 48cd5f2e..86719165 100644 --- a/app/actions/deviceActions.js +++ b/app/actions/deviceActions.js @@ -12,19 +12,19 @@ export const SET_DEVICE_AVAILABILITY = 'SET_DEVICE_AVAILABILITY'; // ------------------------------------------------------------------------- // Actions -export const connectToDevice = (payload) => ({ +export const connectToDevice = payload => ({ payload, - type: CONNECT_TO_DEVICE, + type: CONNECT_TO_DEVICE }); -export const disconnectFromDevice = (payload) => ({ +export const disconnectFromDevice = payload => ({ payload, - type: EXPERIMENT_CLEANUP, + type: EXPERIMENT_CLEANUP }); -export const setConnectionStatus = (payload) => ({ +export const setConnectionStatus = payload => ({ payload, - type: SET_CONNECTION_STATUS, + type: SET_CONNECTION_STATUS }); -export const setDeviceAvailability = (payload) => ({ +export const setDeviceAvailability = payload => ({ payload, - type: SET_DEVICE_AVAILABILITY, + type: SET_DEVICE_AVAILABILITY }); diff --git a/app/actions/experimentActions.js b/app/actions/experimentActions.js index 2965b79e..1bff6996 100644 --- a/app/actions/experimentActions.js +++ b/app/actions/experimentActions.js @@ -24,20 +24,20 @@ export const SET_EEG_ENABLED = 'SET_EEG_ENABLED'; export const start = () => ({ type: START }); export const pause = () => ({ type: PAUSE }); // export const stop = () => ({ type: STOP }); -export const stop = (payload) => ({ payload, type: STOP }); -export const setType = (payload) => ({ payload, type: SET_TYPE }); -export const setParadigm = (payload) => ({ payload, type: SET_PARADIGM }); -export const setSubject = (payload) => ({ payload, type: SET_SUBJECT }); -export const setGroup = (payload) => ({ payload, type: SET_GROUP }); -export const setSession = (payload) => ({ payload, type: SET_SESSION }); -export const setParams = (payload) => ({ payload, type: SET_PARAMS }); -export const setDescription = (payload) => ({ payload, type: SET_DESCRIPTION }); -export const createNewWorkspace = (payload) => ({ +export const stop = payload => ({ payload, type: STOP }); +export const setType = payload => ({ payload, type: SET_TYPE }); +export const setParadigm = payload => ({ payload, type: SET_PARADIGM }); +export const setSubject = payload => ({ payload, type: SET_SUBJECT }); +export const setGroup = payload => ({ payload, type: SET_GROUP }); +export const setSession = payload => ({ payload, type: SET_SESSION }); +export const setParams = payload => ({ payload, type: SET_PARAMS }); +export const setDescription = payload => ({ payload, type: SET_DESCRIPTION }); +export const createNewWorkspace = payload => ({ payload, - type: CREATE_NEW_WORKSPACE, + type: CREATE_NEW_WORKSPACE }); export const loadDefaultTimeline = () => ({ type: LOAD_DEFAULT_TIMELINE }); -export const setTitle = (payload) => ({ payload, type: SET_TITLE }); +export const setTitle = payload => ({ payload, type: SET_TITLE }); export const saveWorkspace = () => ({ type: SAVE_WORKSPACE }); -export const setState = (payload) => ({ payload, type: SET_EXPERIMENT_STATE }); -export const setEEGEnabled = (payload) => ({ payload, type: SET_EEG_ENABLED }); +export const setState = payload => ({ payload, type: SET_EXPERIMENT_STATE }); +export const setEEGEnabled = payload => ({ payload, type: SET_EEG_ENABLED }); diff --git a/app/actions/jupyterActions.js b/app/actions/jupyterActions.js index f3234fd3..85057fbf 100644 --- a/app/actions/jupyterActions.js +++ b/app/actions/jupyterActions.js @@ -21,30 +21,30 @@ export const requestKernelInfo = () => ({ type: REQUEST_KERNEL_INFO }); export const sendExecuteRequest = (payload: string) => ({ payload, - type: SEND_EXECUTE_REQUEST, + type: SEND_EXECUTE_REQUEST }); export const loadEpochs = (payload: Array) => ({ payload, - type: LOAD_EPOCHS, + type: LOAD_EPOCHS }); export const loadCleanedEpochs = (payload: Array) => ({ payload, - type: LOAD_CLEANED_EPOCHS, + type: LOAD_CLEANED_EPOCHS }); export const loadPSD = () => ({ - type: LOAD_PSD, + type: LOAD_PSD }); export const loadERP = (payload: ?string) => ({ payload, - type: LOAD_ERP, + type: LOAD_ERP }); export const loadTopo = () => ({ - type: LOAD_TOPO, + type: LOAD_TOPO }); export const cleanEpochs = () => ({ type: CLEAN_EPOCHS }); diff --git a/app/app.html b/app/app.html index bbc73efa..c014b00e 100644 --- a/app/app.html +++ b/app/app.html @@ -37,7 +37,9 @@ ); document.write( - scripts.map((script) => ` diff --git a/app/components/styles/secondarynav.css b/app/components/styles/secondarynav.css index bcb8ae27..e1004b97 100644 --- a/app/components/styles/secondarynav.css +++ b/app/components/styles/secondarynav.css @@ -36,14 +36,14 @@ .activeSecondaryNavSegment:hover { } -.secondaryNavContainerExpName{ +.secondaryNavContainerExpName { font-family: Lato; font-style: normal; font-weight: normal !important; font-size: 24px !important; line-height: 29px !important; letter-spacing: -0.2px !important; - color: #1A1A1A !important; + color: #1a1a1a !important; } .settingsButtons { @@ -51,7 +51,7 @@ grid-template-columns: 2fr 4fr; } -.dropdownSettings{ +.dropdownSettings { font-size: 27px; color: #666666; display: grid !important; diff --git a/app/components/styles/topnavbar.css b/app/components/styles/topnavbar.css index 11743809..0b05d79b 100644 --- a/app/components/styles/topnavbar.css +++ b/app/components/styles/topnavbar.css @@ -99,13 +99,13 @@ margin-left: 20px !important; } -.exitWorkspaceBtn{ +.exitWorkspaceBtn { font-family: Gothic A1 !important; font-style: normal !important; font-weight: 900 !important; font-size: 24px !important; line-height: 30px !important; - color: #007C70 !important; + color: #007c70 !important; border: none !important; height: 30px; min-width: 30px; diff --git a/app/constants/constants.js b/app/constants/constants.js index 0b6e4b00..574416f9 100644 --- a/app/constants/constants.js +++ b/app/constants/constants.js @@ -6,7 +6,7 @@ export const EXPERIMENTS = { STROOP: 'Stroop Task', MULTI: 'Multi-tasking', SEARCH: 'Visual search', - CUSTOM: 'Custom', + CUSTOM: 'Custom' }; export const SCREENS = { @@ -17,14 +17,14 @@ export const SCREENS = { RUN: { route: '/run', title: 'RUN', order: 5 }, CLEAN: { route: '/clean', title: 'CLEAN', order: 3 }, ANALYZE: { route: '/analyze', title: 'ANALYZE', order: 4 }, - ANALYZEBEHAVIOR: { route: '/analyze', title: 'ANALYZE', order: 3 }, + ANALYZEBEHAVIOR: { route: '/analyze', title: 'ANALYZE', order: 3 } }; export const DEVICES = { NONE: 'NONE', MUSE: 'MUSE', EMOTIV: 'EMOTIV', - GANGLION: 'GANGLION', // One day ;) + GANGLION: 'GANGLION' // One day ;) }; export const CONNECTION_STATUS = { @@ -34,26 +34,26 @@ export const CONNECTION_STATUS = { NO_DEVICES: 'NO_DEVICES', NOT_YET_CONNECTED: 'NOT_YET_CONNECTED', SEARCHING: 'SEARCHING', - BLUETOOTH_DISABLED: 'BLUETOOTH_DISABLED', + BLUETOOTH_DISABLED: 'BLUETOOTH_DISABLED' }; export const KERNEL_STATUS = { OFFLINE: 'Offline', BUSY: 'Busy', IDLE: 'Idle', - STARTING: 'Starting', + STARTING: 'Starting' }; export const DEVICE_AVAILABILITY = { NONE: 'NONE', SEARCHING: 'SEARCHING', - AVAILABLE: 'AVAILABLE', + AVAILABLE: 'AVAILABLE' }; // Names of variables in the jupyter kernel export const JUPYTER_VARIABLE_NAMES = { RAW_EPOCHS: 'raw_epochs', - CLEAN_EPOCHS: 'clean_epochs', + CLEAN_EPOCHS: 'clean_epochs' }; export const SEARCH_TIMER = 3000; @@ -65,7 +65,7 @@ export const EVENTS = { STIMULUS_3: 3, STIMULUS_4: 4, TARGET: 2, - NONTARGET: 1, + NONTARGET: 1 }; export const CHANNELS = { @@ -89,7 +89,7 @@ export const CHANNELS = { AF7: { index: 1, color: '#7EA0C5' }, AF8: { index: 2, color: '#8BD6E9' }, TP10: { index: 3, color: '#66B0A9' }, - AUX: { index: 4, color: '#E7789E' }, + AUX: { index: 4, color: '#E7789E' } }; export const EMOTIV_CHANNELS = [ @@ -106,7 +106,7 @@ export const EMOTIV_CHANNELS = [ 'FC6', 'F4', 'F8', - 'AF4', + 'AF4' ]; export const MUSE_CHANNELS = ['TP9', 'AF7', 'AF8', 'TP10', 'AUX']; @@ -119,23 +119,23 @@ export const PLOTTING_INTERVAL = 250; // ms export const VIEWER_DEFAULTS = { domain: 5000, // ms zoom: 1, - autoScale: false, + autoScale: false }; export const SIGNAL_QUALITY = { BAD: '#ed5a5a', OK: '#FFCD39', GREAT: '#66B0A9', - DISCONNECTED: '#BFBFBF', + DISCONNECTED: '#BFBFBF' }; export const SIGNAL_QUALITY_THRESHOLDS = { BAD: 15, OK: 10, - GREAT: 1.5, // Below 1.5 usually indicates not connected to anything + GREAT: 1.5 // Below 1.5 usually indicates not connected to anything }; export const FILE_TYPES = { STIMULUS_DIR: 'STIMULUS_DIR', - TIMELINE: 'TIMELINE', + TIMELINE: 'TIMELINE' }; diff --git a/app/constants/interfaces.js b/app/constants/interfaces.js index d9cbd3b1..3742cd56 100644 --- a/app/constants/interfaces.js +++ b/app/constants/interfaces.js @@ -19,13 +19,13 @@ export type ExperimentParameters = { // Setting this to any prevents ridiculous flow runtime errors showProgessBar: any, stimulus1: { dir: string, type: EVENTS, title: string, response: string }, - stimulus2: { dir: string, type: EVENTS, title: string, response: string }, + stimulus2: { dir: string, type: EVENTS, title: string, response: string } }; export type ExperimentDescription = { question: string, hypothesis: string, - methods: string, + methods: string }; // Array of timeline and trial ids that will be presented in experiment @@ -38,7 +38,7 @@ export interface Trial { stimulus?: string | StimulusVariable; trial_duration?: number | (() => number); post_trial_gap?: number; - on_load?: (string) => void | StimulusVariable; + on_load?: string => void | StimulusVariable; choices?: Array; } @@ -47,7 +47,7 @@ export type Timeline = { id: string, timeline: Array, sample?: SampleParameter, - timeline_variables?: Array, + timeline_variables?: Array }; export interface SampleParameter { diff --git a/app/containers/AnalyzeContainer.js b/app/containers/AnalyzeContainer.js index 81010f30..628a685e 100644 --- a/app/containers/AnalyzeContainer.js +++ b/app/containers/AnalyzeContainer.js @@ -11,14 +11,14 @@ function mapStateToProps(state) { type: state.experiment.type, deviceType: state.device.deviceType, isEEGEnabled: state.experiment.isEEGEnabled, - ...state.jupyter, + ...state.jupyter }; } function mapDispatchToProps(dispatch) { return { experimentActions: bindActionCreators(experimentActions, dispatch), - jupyterActions: bindActionCreators(jupyterActions, dispatch), + jupyterActions: bindActionCreators(jupyterActions, dispatch) }; } diff --git a/app/containers/App.js b/app/containers/App.js index 48fe51b7..27bc16cf 100644 --- a/app/containers/App.js +++ b/app/containers/App.js @@ -4,7 +4,7 @@ import { ToastContainer } from 'react-toastify'; import TopNav from './TopNavBarContainer'; type Props = { - children: React.Node, + children: React.Node }; export default class App extends React.Component { diff --git a/app/containers/CleanContainer.js b/app/containers/CleanContainer.js index db8b3660..fa27941e 100644 --- a/app/containers/CleanContainer.js +++ b/app/containers/CleanContainer.js @@ -13,14 +13,14 @@ function mapStateToProps(state) { group: state.experiment.group, session: state.experiment.session, deviceType: state.device.deviceType, - ...state.jupyter, + ...state.jupyter }; } function mapDispatchToProps(dispatch) { return { experimentActions: bindActionCreators(experimentActions, dispatch), - jupyterActions: bindActionCreators(jupyterActions, dispatch), + jupyterActions: bindActionCreators(jupyterActions, dispatch) }; } diff --git a/app/containers/CollectContainer.js b/app/containers/CollectContainer.js index 53d73656..bbb10f25 100644 --- a/app/containers/CollectContainer.js +++ b/app/containers/CollectContainer.js @@ -8,14 +8,14 @@ import * as experimentActions from '../actions/experimentActions'; function mapStateToProps(state) { return { ...state.device, - ...state.experiment, + ...state.experiment }; } function mapDispatchToProps(dispatch) { return { deviceActions: bindActionCreators(deviceActions, dispatch), - experimentActions: bindActionCreators(experimentActions, dispatch), + experimentActions: bindActionCreators(experimentActions, dispatch) }; } diff --git a/app/containers/ExperimentDesignContainer.js b/app/containers/ExperimentDesignContainer.js index 494f4630..b0508bf6 100644 --- a/app/containers/ExperimentDesignContainer.js +++ b/app/containers/ExperimentDesignContainer.js @@ -6,13 +6,13 @@ import * as experimentActions from '../actions/experimentActions'; function mapStateToProps(state) { return { - ...state.experiment, + ...state.experiment }; } function mapDispatchToProps(dispatch) { return { - experimentActions: bindActionCreators(experimentActions, dispatch), + experimentActions: bindActionCreators(experimentActions, dispatch) }; } diff --git a/app/containers/HomeContainer.js b/app/containers/HomeContainer.js index 48ddbe74..8a1ac6d0 100644 --- a/app/containers/HomeContainer.js +++ b/app/containers/HomeContainer.js @@ -9,7 +9,7 @@ import * as experimentActions from '../actions/experimentActions'; function mapStateToProps(state) { return { ...state.device, - kernelStatus: state.jupyter.kernelStatus, + kernelStatus: state.jupyter.kernelStatus }; } @@ -17,7 +17,7 @@ function mapDispatchToProps(dispatch) { return { deviceActions: bindActionCreators(deviceActions, dispatch), jupyterActions: bindActionCreators(jupyterActions, dispatch), - experimentActions: bindActionCreators(experimentActions, dispatch), + experimentActions: bindActionCreators(experimentActions, dispatch) }; } diff --git a/app/containers/TopNavBarContainer.js b/app/containers/TopNavBarContainer.js index 49bb3d1d..f93dac46 100644 --- a/app/containers/TopNavBarContainer.js +++ b/app/containers/TopNavBarContainer.js @@ -10,13 +10,13 @@ function mapStateToProps(state) { location: state.router.location, isRunning: state.experiment.isRunning, type: state.experiment.type, - isEEGEnabled: state.experiment.isEEGEnabled, + isEEGEnabled: state.experiment.isEEGEnabled }; } function mapDispatchToProps(dispatch) { return { - experimentActions: bindActionCreators(experimentActions, dispatch), + experimentActions: bindActionCreators(experimentActions, dispatch) }; } diff --git a/app/epics/deviceEpics.js b/app/epics/deviceEpics.js index ea8cb128..b3c48bef 100644 --- a/app/epics/deviceEpics.js +++ b/app/epics/deviceEpics.js @@ -7,27 +7,27 @@ import { CONNECT_TO_DEVICE, SET_DEVICE_AVAILABILITY, setDeviceAvailability, - setConnectionStatus, + setConnectionStatus } from '../actions/deviceActions'; import { getEmotiv, connectToEmotiv, createRawEmotivObservable, createEmotivSignalQualityObservable, - disconnectFromEmotiv, + disconnectFromEmotiv } from '../utils/eeg/emotiv'; import { getMuse, connectToMuse, createRawMuseObservable, createMuseSignalQualityObservable, - disconnectFromMuse, + disconnectFromMuse } from '../utils/eeg/muse'; import { CONNECTION_STATUS, DEVICES, DEVICE_AVAILABILITY, - SEARCH_TIMER, + SEARCH_TIMER } from '../constants/constants'; import { EXPERIMENT_CLEANUP } from './experimentEpics'; @@ -43,34 +43,34 @@ export const DEVICE_CLEANUP = 'DEVICE_CLEANUP'; // ------------------------------------------------------------------------- // Action Creators -const deviceFound = (payload) => ({ +const deviceFound = payload => ({ payload, - type: DEVICE_FOUND, + type: DEVICE_FOUND }); -const setDeviceType = (payload) => ({ +const setDeviceType = payload => ({ payload, - type: SET_DEVICE_TYPE, + type: SET_DEVICE_TYPE }); -const setRawObservable = (payload) => ({ +const setRawObservable = payload => ({ payload, - type: SET_RAW_OBSERVABLE, + type: SET_RAW_OBSERVABLE }); -const setSignalQualityObservable = (payload) => ({ +const setSignalQualityObservable = payload => ({ payload, - type: SET_SIGNAL_OBSERVABLE, + type: SET_SIGNAL_OBSERVABLE }); -const setAvailableDevices = (payload) => ({ +const setAvailableDevices = payload => ({ payload, - type: SET_AVAILABLE_DEVICES, + type: SET_AVAILABLE_DEVICES }); -const setDeviceInfo = (payload) => ({ +const setDeviceInfo = payload => ({ payload, - type: SET_DEVICE_INFO, + type: SET_DEVICE_INFO }); const cleanup = () => ({ type: DEVICE_CLEANUP }); @@ -79,36 +79,36 @@ const cleanup = () => ({ type: DEVICE_CLEANUP }); // Epics // NOTE: Uses a Promise "then" inside b/c Observable.from leads to loss of user gesture propagation for web bluetooth -const searchMuseEpic = (action$) => +const searchMuseEpic = action$ => action$.ofType(SET_DEVICE_AVAILABILITY).pipe( pluck('payload'), - filter((status) => status === DEVICE_AVAILABILITY.SEARCHING), + filter(status => status === DEVICE_AVAILABILITY.SEARCHING), map(getMuse), - mergeMap((promise) => + mergeMap(promise => promise.then( - (devices) => devices, - (error) => { + devices => devices, + error => { // This error will fire a bit too promiscuously until we fix windows web bluetooth // toast.error(`"Device Error: " ${error.toString()}`); return []; } ) ), - filter((devices) => devices), // filter out nulls if running on win7 - filter((devices) => devices.length >= 1), + filter(devices => devices), // filter out nulls if running on win7 + filter(devices => devices.length >= 1), map(deviceFound) ); -const searchEmotivEpic = (action$) => +const searchEmotivEpic = action$ => action$.ofType(SET_DEVICE_AVAILABILITY).pipe( pluck('payload'), - filter((status) => status === DEVICE_AVAILABILITY.SEARCHING), + filter(status => status === DEVICE_AVAILABILITY.SEARCHING), filter(() => process.platform === 'darwin' || process.platform === 'win32'), map(getEmotiv), - mergeMap((promise) => + mergeMap(promise => promise.then( - (devices) => devices, - (error) => { + devices => devices, + error => { if (error.message.includes('client.queryHeadsets')) { toast.error( 'Could not connect to Cortex Service. Please connect to the internet and install Cortex to use Emotiv EEG', @@ -122,44 +122,54 @@ const searchEmotivEpic = (action$) => } ) ), - filter((devices) => devices.length >= 1), + filter(devices => devices.length >= 1), map(deviceFound) ); const deviceFoundEpic = (action$, state$) => action$.ofType(DEVICE_FOUND).pipe( pluck('payload'), - map((foundDevices) => + map(foundDevices => foundDevices.reduce((acc, curr) => { - if (acc.find((device) => device.id === curr.id)) { + if (acc.find(device => device.id === curr.id)) { return acc; } return acc.concat(curr); }, state$.value.device.availableDevices) ), - mergeMap((devices) => - of(setAvailableDevices(devices), setDeviceAvailability(DEVICE_AVAILABILITY.AVAILABLE)) + mergeMap(devices => + of( + setAvailableDevices(devices), + setDeviceAvailability(DEVICE_AVAILABILITY.AVAILABLE) + ) ) ); const searchTimerEpic = (action$, state$) => action$.ofType(SET_DEVICE_AVAILABILITY).pipe( pluck('payload'), - filter((status) => status === DEVICE_AVAILABILITY.SEARCHING), + filter(status => status === DEVICE_AVAILABILITY.SEARCHING), mergeMap(() => timer(SEARCH_TIMER)), - filter(() => state$.value.device.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING), + filter( + () => + state$.value.device.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING + ), map(() => setDeviceAvailability(DEVICE_AVAILABILITY.NONE)) ); -const connectEpic = (action$) => +const connectEpic = action$ => action$.ofType(CONNECT_TO_DEVICE).pipe( pluck('payload'), - map((device) => (isNil(device.name) ? connectToEmotiv(device) : connectToMuse(device))), - mergeMap((promise) => promise.then((deviceInfo) => deviceInfo)), - mergeMap((deviceInfo) => { + map(device => + isNil(device.name) ? connectToEmotiv(device) : connectToMuse(device) + ), + mergeMap(promise => promise.then(deviceInfo => deviceInfo)), + mergeMap(deviceInfo => { if (!isNil(deviceInfo) && !isNil(deviceInfo.samplingRate)) { return of( - setDeviceType(deviceInfo.name.includes('Muse') ? DEVICES.MUSE : DEVICES.EMOTIV), + setDeviceType( + deviceInfo.name.includes('Muse') ? DEVICES.MUSE : DEVICES.EMOTIV + ), setDeviceInfo(deviceInfo), setConnectionStatus(CONNECTION_STATUS.CONNECTED) ); @@ -168,7 +178,7 @@ const connectEpic = (action$) => }) ); -const isConnectingEpic = (action$) => +const isConnectingEpic = action$ => action$ .ofType(CONNECT_TO_DEVICE) .pipe(map(() => setConnectionStatus(CONNECTION_STATUS.CONNECTING))); @@ -187,21 +197,28 @@ const setRawObservableEpic = (action$, state$) => const setSignalQualityObservableEpic = (action$, state$) => action$.ofType(SET_RAW_OBSERVABLE).pipe( pluck('payload'), - map((rawObservable) => { + map(rawObservable => { if (state$.value.device.deviceType === DEVICES.EMOTIV) { return createEmotivSignalQualityObservable( rawObservable, state$.value.device.connectedDevice ); } - return createMuseSignalQualityObservable(rawObservable, state$.value.device.connectedDevice); + return createMuseSignalQualityObservable( + rawObservable, + state$.value.device.connectedDevice + ); }), map(setSignalQualityObservable) ); const deviceCleanupEpic = (action$, state$) => action$.ofType(EXPERIMENT_CLEANUP).pipe( - filter(() => state$.value.device.connectionStatus !== CONNECTION_STATUS.NOT_YET_CONNECTED), + filter( + () => + state$.value.device.connectionStatus !== + CONNECTION_STATUS.NOT_YET_CONNECTED + ), map(() => { if (state$.value.device.deviceType === DEVICES.EMOTIV) { disconnectFromEmotiv(); @@ -224,9 +241,9 @@ const rootEpic = (action$, state$) => setSignalQualityObservableEpic, deviceCleanupEpic )(action$, state$).pipe( - catchError((error) => + catchError(error => of(error).pipe( - tap((err) => toast.error(`"Device Error: " ${err.toString()}`)), + tap(err => toast.error(`"Device Error: " ${err.toString()}`)), map(cleanup) ) ) diff --git a/app/epics/experimentEpics.js b/app/epics/experimentEpics.js index a6cd545c..6b9d6395 100644 --- a/app/epics/experimentEpics.js +++ b/app/epics/experimentEpics.js @@ -9,7 +9,7 @@ import { takeUntil, throttleTime, ignoreElements, - tap, + tap } from 'rxjs/operators'; import { setType, @@ -23,18 +23,27 @@ import { SAVE_WORKSPACE, CREATE_NEW_WORKSPACE, SET_SUBJECT, - SET_GROUP, + SET_GROUP } from '../actions/experimentActions'; -import { DEVICES, MUSE_CHANNELS, EMOTIV_CHANNELS, CONNECTION_STATUS } from '../constants/constants'; +import { + DEVICES, + MUSE_CHANNELS, + EMOTIV_CHANNELS, + CONNECTION_STATUS +} from '../constants/constants'; import { loadProtocol, getBehaviouralData } from '../utils/labjs/functions'; -import { createEEGWriteStream, writeHeader, writeEEGData } from '../utils/filesystem/write'; +import { + createEEGWriteStream, + writeHeader, + writeEEGData +} from '../utils/filesystem/write'; import { getWorkspaceDir, storeExperimentState, restoreExperimentState, createWorkspaceDir, storeBehaviouralData, - readWorkspaceBehaviorData, + readWorkspaceBehaviorData } from '../utils/filesystem/storage'; import { createEmotivRecord, stopEmotivRecord } from '../utils/eeg/emotiv'; @@ -48,35 +57,35 @@ export const EXPERIMENT_CLEANUP = 'EXPERIMENT_CLEANUP'; // ------------------------------------------------------------------------- // Action Creators -const setTimeline = (payload) => ({ +const setTimeline = payload => ({ payload, - type: SET_TIMELINE, + type: SET_TIMELINE }); -const setIsRunning = (payload) => ({ +const setIsRunning = payload => ({ payload, - type: SET_IS_RUNNING, + type: SET_IS_RUNNING }); const updateSession = () => ({ type: UPDATE_SESSION }); -const setSession = (payload) => ({ +const setSession = payload => ({ payload, - type: SET_SESSION, + type: SET_SESSION }); const cleanup = () => ({ - type: EXPERIMENT_CLEANUP, + type: EXPERIMENT_CLEANUP }); // ------------------------------------------------------------------------- // Epics -const createNewWorkspaceEpic = (action$) => +const createNewWorkspaceEpic = action$ => action$.ofType(CREATE_NEW_WORKSPACE).pipe( pluck('payload'), - tap((workspaceInfo) => createWorkspaceDir(workspaceInfo.title)), - mergeMap((workspaceInfo) => + tap(workspaceInfo => createWorkspaceDir(workspaceInfo.title)), + mergeMap(workspaceInfo => of( setType(workspaceInfo.type), setParadigm(workspaceInfo.paradigm), @@ -97,7 +106,9 @@ const startEpic = (action$, state$) => action$.ofType(START).pipe( filter(() => !state$.value.experiment.isRunning), map(() => { - if (state$.value.device.connectionStatus === CONNECTION_STATUS.CONNECTED) { + if ( + state$.value.device.connectionStatus === CONNECTION_STATUS.CONNECTED + ) { const writeStream = createEEGWriteStream( state$.value.experiment.title, state$.value.experiment.subject, @@ -107,16 +118,21 @@ const startEpic = (action$, state$) => writeHeader( writeStream, - state$.value.device.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS : MUSE_CHANNELS + state$.value.device.deviceType === DEVICES.EMOTIV + ? EMOTIV_CHANNELS + : MUSE_CHANNELS ); if (state$.value.device.deviceType === DEVICES.EMOTIV) { - createEmotivRecord(state$.value.experiment.subject, state$.value.experiment.session); + createEmotivRecord( + state$.value.experiment.subject, + state$.value.experiment.session + ); } state$.value.device.rawObservable .pipe(takeUntil(action$.ofType(STOP, EXPERIMENT_CLEANUP))) - .subscribe((eegData) => writeEEGData(writeStream, eegData)); + .subscribe(eegData => writeEEGData(writeStream, eegData)); } }), mapTo(true), @@ -152,10 +168,12 @@ const experimentStopEpic = (action$, state$) => const updateSessionEpic = (action$, state$) => action$.ofType(UPDATE_SESSION).pipe( - mergeMap(() => from(readWorkspaceBehaviorData(state$.value.experiment.title))), - map((behaviorFiles) => { + mergeMap(() => + from(readWorkspaceBehaviorData(state$.value.experiment.title)) + ), + map(behaviorFiles => { if (behaviorFiles.length > 0) { - const subjectFiles = behaviorFiles.filter((filepath) => + const subjectFiles = behaviorFiles.filter(filepath => filepath.name.startsWith(state$.value.experiment.subject) ); return subjectFiles.length + 1; @@ -165,10 +183,10 @@ const updateSessionEpic = (action$, state$) => map(setSession) ); -const autoSaveEpic = (action$) => +const autoSaveEpic = action$ => action$.ofType('@@router/LOCATION_CHANGE').pipe( pluck('payload', 'pathname'), - filter((pathname) => pathname !== '/' && pathname !== '/home'), + filter(pathname => pathname !== '/' && pathname !== '/home'), map(saveWorkspace) ); @@ -184,7 +202,7 @@ const saveWorkspaceEpic = (action$, state$) => const navigationCleanupEpic = (action$, state$) => action$.ofType('@@router/LOCATION_CHANGE').pipe( pluck('payload', 'pathname'), - filter((pathname) => pathname === '/' || pathname === '/home'), + filter(pathname => pathname === '/' || pathname === '/home'), tap(() => restoreExperimentState(state$.value.experiment)), map(cleanup) ); diff --git a/app/epics/jupyterEpics.js b/app/epics/jupyterEpics.js index d3d8f3c7..bc55bb8f 100644 --- a/app/epics/jupyterEpics.js +++ b/app/epics/jupyterEpics.js @@ -1,6 +1,14 @@ import { combineEpics } from 'redux-observable'; import { from, of } from 'rxjs'; -import { map, mergeMap, tap, pluck, ignoreElements, filter, take } from 'rxjs/operators'; +import { + map, + mergeMap, + tap, + pluck, + ignoreElements, + filter, + take +} from 'rxjs/operators'; import { find } from 'kernelspecs'; import { launchSpec } from 'spawnteract'; import { createMainChannel } from 'enchannel-zmq-backend'; @@ -20,7 +28,7 @@ import { CLEAN_EPOCHS, CLOSE_KERNEL, loadTopo, - loadERP, + loadERP } from '../actions/jupyterActions'; import { imports, @@ -35,19 +43,19 @@ import { plotPSD, plotERP, plotTopoMap, - saveEpochs, + saveEpochs } from '../utils/jupyter/cells'; import { EMOTIV_CHANNELS, EVENTS, DEVICES, MUSE_CHANNELS, - JUPYTER_VARIABLE_NAMES, + JUPYTER_VARIABLE_NAMES } from '../constants/constants'; import { parseSingleQuoteJSON, parseKernelStatus, - debugParseMessage, + debugParseMessage } from '../utils/jupyter/functions'; export const GET_EPOCHS_INFO = 'GET_EPOCHS_INFO'; @@ -69,102 +77,104 @@ export const RECEIVE_DISPLAY_DATA = 'RECEIVE_DISPLAY_DATA'; // ------------------------------------------------------------------------- // Action Creators -const getEpochsInfo = (payload) => ({ payload, type: GET_EPOCHS_INFO }); +const getEpochsInfo = payload => ({ payload, type: GET_EPOCHS_INFO }); const getChannelInfo = () => ({ type: GET_CHANNEL_INFO }); -const setKernel = (payload) => ({ +const setKernel = payload => ({ payload, - type: SET_KERNEL, + type: SET_KERNEL }); -const setKernelStatus = (payload) => ({ +const setKernelStatus = payload => ({ payload, - type: SET_KERNEL_STATUS, + type: SET_KERNEL_STATUS }); -const setKernelInfo = (payload) => ({ +const setKernelInfo = payload => ({ payload, - type: SET_KERNEL_INFO, + type: SET_KERNEL_INFO }); -const setMainChannel = (payload) => ({ +const setMainChannel = payload => ({ payload, - type: SET_MAIN_CHANNEL, + type: SET_MAIN_CHANNEL }); -const setEpochInfo = (payload) => ({ +const setEpochInfo = payload => ({ payload, - type: SET_EPOCH_INFO, + type: SET_EPOCH_INFO }); -const setChannelInfo = (payload) => ({ +const setChannelInfo = payload => ({ payload, - type: SET_CHANNEL_INFO, + type: SET_CHANNEL_INFO }); -const setPSDPlot = (payload) => ({ +const setPSDPlot = payload => ({ payload, - type: SET_PSD_PLOT, + type: SET_PSD_PLOT }); -const setTopoPlot = (payload) => ({ +const setTopoPlot = payload => ({ payload, - type: SET_TOPO_PLOT, + type: SET_TOPO_PLOT }); -const setERPPlot = (payload) => ({ +const setERPPlot = payload => ({ payload, - type: SET_ERP_PLOT, + type: SET_ERP_PLOT }); -const receiveExecuteReply = (payload) => ({ +const receiveExecuteReply = payload => ({ payload, - type: RECEIVE_EXECUTE_REPLY, + type: RECEIVE_EXECUTE_REPLY }); -const receiveExecuteResult = (payload) => ({ +const receiveExecuteResult = payload => ({ payload, - type: RECEIVE_EXECUTE_RESULT, + type: RECEIVE_EXECUTE_RESULT }); -const receiveDisplayData = (payload) => ({ +const receiveDisplayData = payload => ({ payload, - type: RECEIVE_DISPLAY_DATA, + type: RECEIVE_DISPLAY_DATA }); -const receiveStream = (payload) => ({ +const receiveStream = payload => ({ payload, - type: RECEIVE_STREAM, + type: RECEIVE_STREAM }); // ------------------------------------------------------------------------- // Epics -const launchEpic = (action$) => +const launchEpic = action$ => action$.ofType(LAUNCH_KERNEL).pipe( mergeMap(() => from(find('brainwaves'))), - tap((kernelInfo) => { + tap(kernelInfo => { if (isNil(kernelInfo)) { - toast.error("Could not find 'brainwaves' jupyter kernel. Have you installed Python?"); + toast.error( + "Could not find 'brainwaves' jupyter kernel. Have you installed Python?" + ); } }), - filter((kernelInfo) => !isNil(kernelInfo)), - mergeMap((kernelInfo) => + filter(kernelInfo => !isNil(kernelInfo)), + mergeMap(kernelInfo => from( launchSpec(kernelInfo.spec, { // No STDIN, opt in to STDOUT and STDERR as node streams - stdio: ['ignore', 'pipe', 'pipe'], + stdio: ['ignore', 'pipe', 'pipe'] }) ) ), - tap((kernel) => { + tap(kernel => { // Route everything that we won't get in messages to our own stdout - kernel.spawn.stdout.on('data', (data) => { + kernel.spawn.stdout.on('data', data => { const text = data.toString(); console.log('KERNEL STDOUT: ', text); }); - kernel.spawn.stderr.on('data', (data) => { + kernel.spawn.stderr.on('data', data => { const text = data.toString(); console.log('KERNEL STDERR: ', text); toast.error('Jupyter: ', text); @@ -177,12 +187,12 @@ const launchEpic = (action$) => map(setKernel) ); -const setUpChannelEpic = (action$) => +const setUpChannelEpic = action$ => action$.ofType(SET_KERNEL).pipe( pluck('payload'), - mergeMap((kernel) => from(createMainChannel(kernel.config))), - tap((mainChannel) => mainChannel.next(executeRequest(imports()))), - tap((mainChannel) => mainChannel.next(executeRequest(utils()))), + mergeMap(kernel => from(createMainChannel(kernel.config))), + tap(mainChannel => mainChannel.next(executeRequest(imports()))), + tap(mainChannel => mainChannel.next(executeRequest(utils()))), map(setMainChannel) ); @@ -190,7 +200,7 @@ const receiveChannelMessageEpic = (action$, state$) => action$.ofType(SET_MAIN_CHANNEL).pipe( mergeMap(() => state$.value.jupyter.mainChannel.pipe( - map((msg) => { + map(msg => { console.log(debugParseMessage(msg)); switch (msg['header']['msg_type']) { case 'kernel_info_reply': @@ -208,7 +218,7 @@ const receiveChannelMessageEpic = (action$, state$) => default: } }), - filter((action) => !isNil(action)) + filter(action => !isNil(action)) ) ) ); @@ -223,9 +233,11 @@ const requestKernelInfoEpic = (action$, state$) => const loadEpochsEpic = (action$, state$) => action$.ofType(LOAD_EPOCHS).pipe( pluck('payload'), - filter((filePathsArray) => filePathsArray.length >= 1), - map((filePathsArray) => - state$.value.jupyter.mainChannel.next(executeRequest(loadCSV(filePathsArray))) + filter(filePathsArray => filePathsArray.length >= 1), + map(filePathsArray => + state$.value.jupyter.mainChannel.next( + executeRequest(loadCSV(filePathsArray)) + ) ), awaitOkMessage(action$), execute(filterIIR(1, 30), state$), @@ -236,14 +248,16 @@ const loadEpochsEpic = (action$, state$) => [state$.value.experiment.params.stimulus1.title]: EVENTS.STIMULUS_1, [state$.value.experiment.params.stimulus2.title]: EVENTS.STIMULUS_2, [state$.value.experiment.params.stimulus3.title]: EVENTS.STIMULUS_3, - [state$.value.experiment.params.stimulus4.title]: EVENTS.STIMULUS_4, + [state$.value.experiment.params.stimulus4.title]: EVENTS.STIMULUS_4 }, -0.1, 0.8 ) ), - tap((e)=> {console.log('e', e)}), - map((epochEventsCommand) => + tap(e => { + console.log('e', e); + }), + map(epochEventsCommand => state$.value.jupyter.mainChannel.next(executeRequest(epochEventsCommand)) ), awaitOkMessage(action$), @@ -253,13 +267,19 @@ const loadEpochsEpic = (action$, state$) => const loadCleanedEpochsEpic = (action$, state$) => action$.ofType(LOAD_CLEANED_EPOCHS).pipe( pluck('payload'), - filter((filePathsArray) => filePathsArray.length >= 1), - map((filePathsArray) => - state$.value.jupyter.mainChannel.next(executeRequest(loadCleanedEpochs(filePathsArray))) + filter(filePathsArray => filePathsArray.length >= 1), + map(filePathsArray => + state$.value.jupyter.mainChannel.next( + executeRequest(loadCleanedEpochs(filePathsArray)) + ) ), awaitOkMessage(action$), mergeMap(() => - of(getEpochsInfo(JUPYTER_VARIABLE_NAMES.CLEAN_EPOCHS), getChannelInfo(), loadTopo()) + of( + getEpochsInfo(JUPYTER_VARIABLE_NAMES.CLEAN_EPOCHS), + getChannelInfo(), + loadTopo() + ) ) ); @@ -270,7 +290,9 @@ const cleanEpochsEpic = (action$, state$) => action$.ofType(RECEIVE_STREAM).pipe( pluck('payload'), filter( - (msg) => msg.channel === 'iopub' && msg.content.text.includes('Channels marked as bad') + msg => + msg.channel === 'iopub' && + msg.content.text.includes('Channels marked as bad') ), take(1) ) @@ -292,22 +314,24 @@ const cleanEpochsEpic = (action$, state$) => const getEpochsInfoEpic = (action$, state$) => action$.ofType(GET_EPOCHS_INFO).pipe( pluck('payload'), - map((variableName) => - state$.value.jupyter.mainChannel.next(executeRequest(requestEpochsInfo(variableName))) + map(variableName => + state$.value.jupyter.mainChannel.next( + executeRequest(requestEpochsInfo(variableName)) + ) ), mergeMap(() => action$.ofType(RECEIVE_EXECUTE_RESULT).pipe( pluck('payload'), - filter((msg) => msg.channel === 'iopub' && !isNil(msg.content.data)), + filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), pluck('content', 'data', 'text/plain'), - filter((msg) => msg.includes('Drop Percentage')), + filter(msg => msg.includes('Drop Percentage')), take(1) ) ), - map((epochInfoString) => - parseSingleQuoteJSON(epochInfoString).map((infoObj) => ({ + map(epochInfoString => + parseSingleQuoteJSON(epochInfoString).map(infoObj => ({ name: Object.keys(infoObj)[0], - value: infoObj[Object.keys(infoObj)[0]], + value: infoObj[Object.keys(infoObj)[0]] })) ), map(setEpochInfo) @@ -319,14 +343,16 @@ const getChannelInfoEpic = (action$, state$) => mergeMap(() => action$.ofType(RECEIVE_EXECUTE_RESULT).pipe( pluck('payload'), - filter((msg) => msg.channel === 'iopub' && !isNil(msg.content.data)), + filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), pluck('content', 'data', 'text/plain'), // Filter to prevent this from reading requestEpochsInfo returns - filter((msg) => !msg.includes('Drop Percentage')), + filter(msg => !msg.includes('Drop Percentage')), take(1) ) ), - map((channelInfoString) => setChannelInfo(parseSingleQuoteJSON(channelInfoString))) + map(channelInfoString => + setChannelInfo(parseSingleQuoteJSON(channelInfoString)) + ) ); const loadPSDEpic = (action$, state$) => @@ -336,7 +362,7 @@ const loadPSDEpic = (action$, state$) => action$.ofType(RECEIVE_DISPLAY_DATA).pipe( pluck('payload'), // PSD graphs should have two axes - filter((msg) => msg.content.data['text/plain'].includes('2 Axes')), + filter(msg => msg.content.data['text/plain'].includes('2 Axes')), pluck('content', 'data'), take(1) ) @@ -348,13 +374,17 @@ const loadTopoEpic = (action$, state$) => action$.ofType(LOAD_TOPO).pipe( execute(plotTopoMap(), state$), mergeMap(() => - action$.ofType(RECEIVE_DISPLAY_DATA).pipe(pluck('payload'), pluck('content', 'data'), take(1)) + action$ + .ofType(RECEIVE_DISPLAY_DATA) + .pipe(pluck('payload'), pluck('content', 'data'), take(1)) ), - mergeMap((topoPlot) => + mergeMap(topoPlot => of( setTopoPlot(topoPlot), loadERP( - state$.value.device.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS[0] : MUSE_CHANNELS[0] + state$.value.device.deviceType === DEVICES.EMOTIV + ? EMOTIV_CHANNELS[0] + : MUSE_CHANNELS[0] ) ) ) @@ -363,23 +393,27 @@ const loadTopoEpic = (action$, state$) => const loadERPEpic = (action$, state$) => action$.ofType(LOAD_ERP).pipe( pluck('payload'), - map((channelName) => { + map(channelName => { if (MUSE_CHANNELS.includes(channelName)) { return MUSE_CHANNELS.indexOf(channelName); } else if (EMOTIV_CHANNELS.includes(channelName)) { return EMOTIV_CHANNELS.indexOf(channelName); } - console.warn('channel name supplied to loadERPEpic does not belong to either device'); + console.warn( + 'channel name supplied to loadERPEpic does not belong to either device' + ); return EMOTIV_CHANNELS[0]; }), - map((channelIndex) => - state$.value.jupyter.mainChannel.next(executeRequest(plotERP(channelIndex))) + map(channelIndex => + state$.value.jupyter.mainChannel.next( + executeRequest(plotERP(channelIndex)) + ) ), mergeMap(() => action$.ofType(RECEIVE_DISPLAY_DATA).pipe( pluck('payload'), // ERP graphs should have 1 axis according to MNE - filter((msg) => msg.content.data['text/plain'].includes('1 Axes')), + filter(msg => msg.content.data['text/plain'].includes('1 Axes')), pluck('content', 'data'), take(1) ) diff --git a/app/main.dev.js b/app/main.dev.js index dc506ba1..b72237b6 100644 --- a/app/main.dev.js +++ b/app/main.dev.js @@ -23,7 +23,10 @@ if (process.env.NODE_ENV === 'production') { sourceMapSupport.install(); } -if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') { +if ( + process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' +) { require('electron-debug')(); const path = require('path'); const p = path.join(__dirname, '..', 'app', 'node_modules'); @@ -36,7 +39,7 @@ const installExtensions = async () => { const extensions = ['REACT_DEVELOPER_TOOLS', 'REDUX_DEVTOOLS']; return Promise.all( - extensions.map((name) => installer.default(installer[name], forceDownload)) + extensions.map(name => installer.default(installer[name], forceDownload)) ).catch(console.log); }; @@ -53,14 +56,17 @@ app.on('window-all-closed', () => { }); app.on('ready', async () => { - if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') { + if ( + process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' + ) { await installExtensions(); } mainWindow = new BrowserWindow({ show: false, width: 1280, - height: 800, + height: 800 }); mainWindow.setMinimumSize(1075, 708); diff --git a/app/menu.js b/app/menu.js index 3adfc42f..51fc3346 100644 --- a/app/menu.js +++ b/app/menu.js @@ -9,12 +9,17 @@ export default class MenuBuilder { } buildMenu() { - if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') { + if ( + process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' + ) { this.setupDevelopmentEnvironment(); } const template = - process.platform === 'darwin' ? this.buildDarwinTemplate() : this.buildDefaultTemplate(); + process.platform === 'darwin' + ? this.buildDarwinTemplate() + : this.buildDefaultTemplate(); const menu = Menu.buildFromTemplate(template); Menu.setApplicationMenu(menu); @@ -31,8 +36,8 @@ export default class MenuBuilder { label: 'Inspect element', click: () => { this.mainWindow.inspectElement(x, y); - }, - }, + } + } ]).popup(this.mainWindow); }); } @@ -43,7 +48,7 @@ export default class MenuBuilder { submenu: [ { label: 'About BrainWaves', - selector: 'orderFrontStandardAboutPanel:', + selector: 'orderFrontStandardAboutPanel:' }, { type: 'separator' }, { label: 'Services', submenu: [] }, @@ -51,12 +56,12 @@ export default class MenuBuilder { { label: 'Hide BrainWaves', accelerator: 'Command+H', - selector: 'hide:', + selector: 'hide:' }, { label: 'Hide Others', accelerator: 'Command+Shift+H', - selector: 'hideOtherApplications:', + selector: 'hideOtherApplications:' }, { label: 'Show All', selector: 'unhideAllApplications:' }, { type: 'separator' }, @@ -65,9 +70,9 @@ export default class MenuBuilder { accelerator: 'Command+Q', click: () => { app.quit(); - }, - }, - ], + } + } + ] }; const subMenuEdit = { label: 'Edit', @@ -81,9 +86,9 @@ export default class MenuBuilder { { label: 'Select All', accelerator: 'Command+A', - selector: 'selectAll:', - }, - ], + selector: 'selectAll:' + } + ] }; const subMenuViewDev = { label: 'View', @@ -93,23 +98,23 @@ export default class MenuBuilder { accelerator: 'Command+R', click: () => { this.mainWindow.webContents.reload(); - }, + } }, { label: 'Toggle Full Screen', accelerator: 'Ctrl+Command+F', click: () => { this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - }, + } }, { label: 'Toggle Developer Tools', accelerator: 'Alt+Command+I', click: () => { this.mainWindow.toggleDevTools(); - }, - }, - ], + } + } + ] }; const subMenuViewProd = { label: 'View', @@ -119,9 +124,9 @@ export default class MenuBuilder { accelerator: 'Ctrl+Command+F', click: () => { this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - }, - }, - ], + } + } + ] }; const subMenuWindow = { label: 'Window', @@ -129,15 +134,16 @@ export default class MenuBuilder { { label: 'Minimize', accelerator: 'Command+M', - selector: 'performMiniaturize:', + selector: 'performMiniaturize:' }, { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' }, { type: 'separator' }, - { label: 'Bring All to Front', selector: 'arrangeInFront:' }, - ], + { label: 'Bring All to Front', selector: 'arrangeInFront:' } + ] }; - const subMenuView = process.env.NODE_ENV === 'development' ? subMenuViewDev : subMenuViewProd; + const subMenuView = + process.env.NODE_ENV === 'development' ? subMenuViewDev : subMenuViewProd; return [subMenuAbout, subMenuEdit, subMenuView, subMenuWindow]; } @@ -149,16 +155,16 @@ export default class MenuBuilder { submenu: [ { label: '&Open', - accelerator: 'Ctrl+O', + accelerator: 'Ctrl+O' }, { label: '&Close', accelerator: 'Ctrl+W', click: () => { this.mainWindow.close(); - }, - }, - ], + } + } + ] }, { label: '&View', @@ -170,32 +176,36 @@ export default class MenuBuilder { accelerator: 'Ctrl+R', click: () => { this.mainWindow.webContents.reload(); - }, + } }, { label: 'Toggle &Full Screen', accelerator: 'F11', click: () => { - this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - }, + this.mainWindow.setFullScreen( + !this.mainWindow.isFullScreen() + ); + } }, { label: 'Toggle &Developer Tools', accelerator: 'Alt+Ctrl+I', click: () => { this.mainWindow.toggleDevTools(); - }, - }, + } + } ] : [ { label: 'Toggle &Full Screen', accelerator: 'F11', click: () => { - this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - }, - }, - ], + this.mainWindow.setFullScreen( + !this.mainWindow.isFullScreen() + ); + } + } + ] }, { label: 'Help', @@ -204,28 +214,30 @@ export default class MenuBuilder { label: 'Learn More', click() { shell.openExternal('http://electron.atom.io'); - }, + } }, { label: 'Documentation', click() { - shell.openExternal('https://github.com/atom/electron/tree/master/docs#readme'); - }, + shell.openExternal( + 'https://github.com/atom/electron/tree/master/docs#readme' + ); + } }, { label: 'Community Discussions', click() { shell.openExternal('https://discuss.atom.io/c/electron'); - }, + } }, { label: 'Search Issues', click() { shell.openExternal('https://github.com/atom/electron/issues'); - }, - }, - ], - }, + } + } + ] + } ]; return templateDefault; diff --git a/app/reducers/deviceReducer.js b/app/reducers/deviceReducer.js index ce681675..c7dd2e46 100644 --- a/app/reducers/deviceReducer.js +++ b/app/reducers/deviceReducer.js @@ -7,9 +7,13 @@ import { SET_CONNECTION_STATUS, SET_RAW_OBSERVABLE, SET_SIGNAL_OBSERVABLE, - DEVICE_CLEANUP, + DEVICE_CLEANUP } from '../epics/deviceEpics'; -import { DEVICES, CONNECTION_STATUS, DEVICE_AVAILABILITY } from '../constants/constants'; +import { + DEVICES, + CONNECTION_STATUS, + DEVICE_AVAILABILITY +} from '../constants/constants'; import { ActionType, DeviceInfo } from '../constants/interfaces'; import { SET_DEVICE_AVAILABILITY } from '../actions/deviceActions'; @@ -30,51 +34,54 @@ const initialState = { deviceAvailability: DEVICE_AVAILABILITY.NONE, rawObservable: null, signalQualityObservable: null, - deviceType: DEVICES.EMOTIV, + deviceType: DEVICES.EMOTIV }; -export default function device(state: DeviceStateType = initialState, action: ActionType) { +export default function device( + state: DeviceStateType = initialState, + action: ActionType +) { switch (action.type) { case SET_DEVICE_TYPE: return { ...state, - deviceType: action.payload, + deviceType: action.payload }; case SET_DEVICE_INFO: return { ...state, - connectedDevice: action.payload, + connectedDevice: action.payload }; case SET_AVAILABLE_DEVICES: return { ...state, - availableDevices: action.payload, + availableDevices: action.payload }; case SET_CONNECTION_STATUS: return { ...state, - connectionStatus: action.payload, + connectionStatus: action.payload }; case SET_DEVICE_AVAILABILITY: return { ...state, - deviceAvailability: action.payload, + deviceAvailability: action.payload }; case SET_RAW_OBSERVABLE: return { ...state, - rawObservable: action.payload, + rawObservable: action.payload }; case SET_SIGNAL_OBSERVABLE: return { ...state, - signalQualityObservable: action.payload, + signalQualityObservable: action.payload }; case DEVICE_CLEANUP: diff --git a/app/reducers/experimentReducer.js b/app/reducers/experimentReducer.js index c553594c..f8367605 100644 --- a/app/reducers/experimentReducer.js +++ b/app/reducers/experimentReducer.js @@ -3,7 +3,7 @@ import { SET_TIMELINE, SET_IS_RUNNING, SET_SESSION, - EXPERIMENT_CLEANUP, + EXPERIMENT_CLEANUP } from '../epics/experimentEpics'; import { SET_TYPE, @@ -14,7 +14,7 @@ import { SET_EXPERIMENT_STATE, SET_PARAMS, SET_DESCRIPTION, - SET_EEG_ENABLED, + SET_EEG_ENABLED } from '../actions/experimentActions'; import { EXPERIMENTS } from '../constants/constants'; import { @@ -22,7 +22,7 @@ import { Trial, ActionType, ExperimentDescription, - ExperimentParameters, + ExperimentParameters } from '../constants/interfaces'; export interface ExperimentStateType { @@ -54,80 +54,83 @@ const initialState = { session: 1, isRunning: false, isEEGEnabled: false, - description: { question: '', hypothesis: '', methods: '' }, + description: { question: '', hypothesis: '', methods: '' } }; -export default function experiment(state: ExperimentStateType = initialState, action: ActionType) { +export default function experiment( + state: ExperimentStateType = initialState, + action: ActionType +) { switch (action.type) { case SET_TYPE: return { ...state, - type: action.payload, + type: action.payload }; case SET_PARADIGM: return { ...state, - paradigm: action.payload, + paradigm: action.payload }; case SET_SUBJECT: return { ...state, - subject: action.payload, + subject: action.payload }; case SET_GROUP: return { ...state, - group: action.payload, + group: action.payload }; case SET_SESSION: return { ...state, - session: action.payload, + session: action.payload }; case SET_PARAMS: return { ...state, - params: { ...state.params, ...action.payload }, + params: { ...state.params, ...action.payload } }; case SET_TIMELINE: return { ...state, - ...action.payload, + ...action.payload }; case SET_TITLE: return { ...state, - title: action.payload, + title: action.payload }; case SET_DESCRIPTION: return { ...state, - description: action.payload, + description: action.payload }; case SET_IS_RUNNING: return { ...state, - isRunning: action.payload, + isRunning: action.payload }; case SET_EEG_ENABLED: return { ...state, - isEEGEnabled: action.payload, + isEEGEnabled: action.payload }; case SET_EXPERIMENT_STATE: return { - ...action.payload, + ...action.payload }; case EXPERIMENT_CLEANUP: diff --git a/app/reducers/index.js b/app/reducers/index.js index 71494b4f..0f1874ab 100644 --- a/app/reducers/index.js +++ b/app/reducers/index.js @@ -9,7 +9,7 @@ const rootReducer = combineReducers({ jupyter, device, experiment, - router, + router }); export default rootReducer; diff --git a/app/reducers/jupyterReducer.js b/app/reducers/jupyterReducer.js index 1a423107..c2f700f2 100644 --- a/app/reducers/jupyterReducer.js +++ b/app/reducers/jupyterReducer.js @@ -9,7 +9,7 @@ import { SET_PSD_PLOT, SET_TOPO_PLOT, SET_ERP_PLOT, - RECEIVE_EXECUTE_RETURN, + RECEIVE_EXECUTE_RETURN } from '../epics/jupyterEpics'; import { ActionType, Kernel } from '../constants/interfaces'; import { KERNEL_STATUS } from '../constants/constants'; @@ -34,27 +34,30 @@ const initialState = { channelInfo: [], psdPlot: null, topoPlot: null, - erpPlot: null, + erpPlot: null }; -export default function jupyter(state: JupyterStateType = initialState, action: ActionType) { +export default function jupyter( + state: JupyterStateType = initialState, + action: ActionType +) { switch (action.type) { case SET_KERNEL: return { ...state, - kernel: action.payload, + kernel: action.payload }; case SET_KERNEL_STATUS: return { ...state, - kernelStatus: action.payload, + kernelStatus: action.payload }; case SET_MAIN_CHANNEL: return { ...state, - mainChannel: action.payload, + mainChannel: action.payload }; case SET_KERNEL_INFO: @@ -63,31 +66,31 @@ export default function jupyter(state: JupyterStateType = initialState, action: case SET_EPOCH_INFO: return { ...state, - epochsInfo: action.payload, + epochsInfo: action.payload }; case SET_CHANNEL_INFO: return { ...state, - channelInfo: action.payload, + channelInfo: action.payload }; case SET_PSD_PLOT: return { ...state, - psdPlot: action.payload, + psdPlot: action.payload }; case SET_TOPO_PLOT: return { ...state, - topoPlot: action.payload, + topoPlot: action.payload }; case SET_ERP_PLOT: return { ...state, - erpPlot: action.payload, + erpPlot: action.payload }; case EXPERIMENT_CLEANUP: @@ -95,7 +98,7 @@ export default function jupyter(state: JupyterStateType = initialState, action: ...state, epochsInfo: null, psdPlot: null, - erpPlot: null, + erpPlot: null }; case RECEIVE_EXECUTE_RETURN: diff --git a/app/routes.js b/app/routes.js index 1db8f084..b67cd81e 100644 --- a/app/routes.js +++ b/app/routes.js @@ -11,17 +11,15 @@ import { SCREENS } from './constants/constants'; const renderMergedProps = (component, ...rest) => { const finalProps = Object.assign({}, ...rest); - return ( - React.createElement(component, finalProps) - ); -} + return React.createElement(component, finalProps); +}; const PropsRoute = ({ component, ...rest }) => ( renderMergedProps(component, routeProps, rest)} /> - ) +); export default () => ( @@ -29,9 +27,20 @@ export default () => ( - - - + + + ); diff --git a/app/store/configureStore.dev.js b/app/store/configureStore.dev.js index ed220453..b910476a 100644 --- a/app/store/configureStore.dev.js +++ b/app/store/configureStore.dev.js @@ -26,7 +26,7 @@ const configureStore = (initialState?: AppState) => { // Logging Middleware const logger = createLogger({ level: 'info', - collapsed: true, + collapsed: true }); // Skip redux logs in console during the tests @@ -42,14 +42,14 @@ const configureStore = (initialState?: AppState) => { const actionCreators = { ...deviceActions, ...jupyterActions, - ...routerActions, + ...routerActions }; // If Redux DevTools Extension is installed use it, otherwise use Redux compose /* eslint-disable no-underscore-dangle */ const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ // Options: http://zalmoxisus.github.io/redux-devtools-extension/API/Arguments.html - actionCreators, + actionCreators }) : compose; /* eslint-enable no-underscore-dangle */ diff --git a/app/store/configureStore.js b/app/store/configureStore.js index 77fc8e67..e0c7e576 100644 --- a/app/store/configureStore.js +++ b/app/store/configureStore.js @@ -2,7 +2,9 @@ import configureStoreDev from './configureStore.dev'; import configureStoreProd from './configureStore.prod'; const selectedConfigureStore = - process.env.NODE_ENV === 'production' ? configureStoreProd : configureStoreDev; + process.env.NODE_ENV === 'production' + ? configureStoreProd + : configureStoreDev; export const { configureStore } = selectedConfigureStore; diff --git a/app/utils/behavior/compute.js b/app/utils/behavior/compute.js index f6979a8d..1efc46b3 100644 --- a/app/utils/behavior/compute.js +++ b/app/utils/behavior/compute.js @@ -2,45 +2,52 @@ import * as ss from 'simple-statistics'; import * as path from 'path'; export const aggregateBehaviorDataToSave = (data, removeOutliers) => { - const processedData = data.map((result) => { + const processedData = data.map(result => { if (path.basename(result.meta.datafile).includes('aggregated')) { return transformAggregated(result); } - return filterData(result, removeOutliers); - + return filterData(result, removeOutliers); }); - const aggregatedData = processedData.map((e) => { - const conditionsArray = e.map((row) => row.condition); + const aggregatedData = processedData.map(e => { + const conditionsArray = e.map(row => row.condition); const unsortedConditions = [...new Set(conditionsArray)].sort(); - const conditions = unsortedConditions.sort((a, b) => parseInt(a) - parseInt(b)); + const conditions = unsortedConditions.sort( + (a, b) => parseInt(a) - parseInt(b) + ); let rtMean = {}, accuracyPercent = {}; for (const condition of conditions) { const rt = e - .filter((row) => row.response_given === 'yes') - .filter((row) => row.correct_response === 'true') - .filter((row) => row.condition === condition) - .map((row) => row.reaction_time) - .map((value) => parseFloat(value)); + .filter(row => row.response_given === 'yes') + .filter(row => row.correct_response === 'true') + .filter(row => row.condition === condition) + .map(row => row.reaction_time) + .map(value => parseFloat(value)); rtMean[condition] = Math.round(ss.mean(rt)); const accuracy = e.filter( - (row) => + row => row.condition === condition && row.correct_response === 'true' && row.response_given === 'yes' ); accuracyPercent[condition] = accuracy.length - ? Math.round(100 * (accuracy.length / e.filter((r) => r.condition === condition).length)) - : ss.mean(e.filter((r) => r.condition === condition).map((r) => r.accuracy)); + ? Math.round( + 100 * + (accuracy.length / + e.filter(r => r.condition === condition).length) + ) + : ss.mean( + e.filter(r => r.condition === condition).map(r => r.accuracy) + ); } const row = { - subject: e.map((r) => r.subject)[0], - group: e.map((r) => r.group)[0], - session: e.map((r) => r.session)[0], + subject: e.map(r => r.subject)[0], + group: e.map(r => r.group)[0], + session: e.map(r => r.session)[0] }; for (const condition of conditions) { - row[`RT_${ condition}`] = rtMean[condition]; - row[`Accuracy_${ condition}`] = accuracyPercent[condition]; + row[`RT_${condition}`] = rtMean[condition]; + row[`Accuracy_${condition}`] = accuracyPercent[condition]; } return row; }); @@ -55,15 +62,19 @@ export const aggregateDataForPlot = ( displayMode ) => { if (data && data.length > 0) { - const processedData = data.map((result) => { + const processedData = data.map(result => { if (path.basename(result.meta.datafile).includes('aggregated')) { return transformAggregated(result); } return filterData(result, removeOutliers); }); const colors = ['#28619E', '#3DBBDB']; - const unsortedConditions = [...new Set(processedData[0].map((row) => row.condition))].sort(); - const conditions = unsortedConditions.sort((a, b) => parseInt(a) - parseInt(b)); + const unsortedConditions = [ + ...new Set(processedData[0].map(row => row.condition)) + ].sort(); + const conditions = unsortedConditions.sort( + (a, b) => parseInt(a) - parseInt(b) + ); switch (dependentVariable) { case 'RT': default: @@ -88,14 +99,16 @@ export const aggregateDataForPlot = ( } }; -const transformAggregated = (result) => { +const transformAggregated = result => { const unsortedConditions = result.meta.fields - .filter((field) => field.startsWith('RT_')) - .map((c) => c.split('RT_')[1]) + .filter(field => field.startsWith('RT_')) + .map(c => c.split('RT_')[1]) .sort(); - const conditions = unsortedConditions.sort((a, b) => parseInt(a) - parseInt(b)); - const transformed = conditions.map((condition) => - result.data.map((e) => ({ + const conditions = unsortedConditions.sort( + (a, b) => parseInt(a) - parseInt(b) + ); + const transformed = conditions.map(condition => + result.data.map(e => ({ reaction_time: parseFloat(e[`RT_${condition}`]), subject: path.parse(result.meta.datafile).name, condition, @@ -103,7 +116,7 @@ const transformAggregated = (result) => { session: e.session, accuracy: parseFloat(e[`Accuracy_${condition}`]), response_given: 'yes', - correct_response: 'true', + correct_response: 'true' })) ); const data = transformed.reduce((acc, item) => acc.concat(item), []); @@ -111,10 +124,9 @@ const transformAggregated = (result) => { }; const filterData = (data, removeOutliers) => { - let filteredData = data.data - .filter((row) => row.trial_number && row.phase !== 'practice') - .map((row) => ({ + .filter(row => row.trial_number && row.phase !== 'practice') + .map(row => ({ condition: row.condition, subject: path.parse(data.meta.datafile).name.split('-')[0], group: path.parse(data.meta.datafile).name.split('-')[1], @@ -122,35 +134,49 @@ const filterData = (data, removeOutliers) => { reaction_time: Math.round(parseFloat(row.reaction_time)), correct_response: row.correct_response, trial_number: row.trial_number, - response_given: row.response_given, + response_given: row.response_given })); if (removeOutliers) { try { const mean = ss.mean( filteredData - .filter((r) => r.response_given === 'yes' && r.correct_response === 'true') - .map((r) => r.reaction_time) + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .map(r => r.reaction_time) ); const standardDeviation = ss.sampleStandardDeviation( filteredData - .filter((r) => r.response_given === 'yes' && r.correct_response === 'true') - .map((r) => r.reaction_time) + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .map(r => r.reaction_time) ); const upperBoarder = mean + 2 * standardDeviation; const lowerBoarder = mean - 2 * standardDeviation; filteredData = filteredData.filter( - (r) => - (r.reaction_time > lowerBoarder && r.reaction_time < upperBoarder) || isNaN(r.reaction_time) + r => + (r.reaction_time > lowerBoarder && r.reaction_time < upperBoarder) || + isNaN(r.reaction_time) ); } catch (err) { - alert('Calculation of the mean and the standard deviation requires at least two completed trials in each condition.'); + alert( + 'Calculation of the mean and the standard deviation requires at least two completed trials in each condition.' + ); return filteredData; } } return filteredData; }; -const computeRT = (data, dependentVariable, conditions, showDataPoints, colors, displayMode) => { +const computeRT = ( + data, + dependentVariable, + conditions, + showDataPoints, + colors, + displayMode +) => { let dataToPlot = 0; let maxValue = 0; switch (displayMode) { @@ -160,18 +186,24 @@ const computeRT = (data, dependentVariable, conditions, showDataPoints, colors, dataToPlot = conditions.reduce((obj, condition, i) => { const xRaw = data .reduce((a, b) => a.concat(b), []) - .filter((r) => r.response_given === 'yes' && r.correct_response === 'true') - .filter((e) => e.condition === condition) - .map((r) => r.subject); + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .filter(e => e.condition === condition) + .map(r => r.subject); const y = data .reduce((a, b) => a.concat(b), []) - .filter((r) => r.response_given === 'yes' && r.correct_response === 'true') - .filter((e) => e.condition === condition) - .map((r) => r.reaction_time); + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .filter(e => e.condition === condition) + .map(r => r.reaction_time); maxValue = Math.max(...y) > maxValue ? Math.max(...y) : maxValue; const subjects = Array.from(new Set(xRaw)); - const x = xRaw.map((x) => subjects.indexOf(x) + 1 + i / 4 + (Math.random() - 0.5) / 5); - tickValuesX = subjects.map((x) => subjects.indexOf(x) + 1 + 1 / 8); + const x = xRaw.map( + x => subjects.indexOf(x) + 1 + i / 4 + (Math.random() - 0.5) / 5 + ); + tickValuesX = subjects.map(x => subjects.indexOf(x) + 1 + 1 / 8); tickTextX = subjects; obj[condition] = { x, y }; return obj; @@ -180,54 +212,79 @@ const computeRT = (data, dependentVariable, conditions, showDataPoints, colors, dataToPlot['ticktext'] = tickTextX; dataToPlot['lowerLimit'] = 0; dataToPlot['upperLimit'] = maxValue > 1000 ? maxValue + 100 : 1000; - return makeDataPointsGraph(dataToPlot, conditions, colors, dependentVariable); + return makeDataPointsGraph( + dataToPlot, + conditions, + colors, + dependentVariable + ); case 'errorbars': let maxValueSE = 0; dataToPlot = conditions.reduce((obj, condition) => { const xRaw = data .reduce((a, b) => a.concat(b), []) - .filter((r) => r.response_given === 'yes' && r.correct_response === 'true') - .filter((e) => e.condition === condition) - .map((r) => r.subject); + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .filter(e => e.condition === condition) + .map(r => r.subject); const x = Array.from(new Set(xRaw)); - const data_condition = data.map((d) => + const data_condition = data.map(d => d - .filter((r) => r.response_given === 'yes' && r.correct_response === 'true') - .filter((e) => e.condition == condition) + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .filter(e => e.condition == condition) ); - const y_bars_prep = x.map((a) => - data_condition.map((d) => d.filter((e) => e.subject === a)).filter((d) => d.length > 0) + const y_bars_prep = x.map(a => + data_condition + .map(d => d.filter(e => e.subject === a)) + .filter(d => d.length > 0) ); const y = y_bars_prep - .map((y) => ss.mean(y.reduce((a, b) => a.concat(b), []).map((r) => r.reaction_time))) - .map((v) => Math.round(v)); + .map(y => + ss.mean( + y.reduce((a, b) => a.concat(b), []).map(r => r.reaction_time) + ) + ) + .map(v => Math.round(v)); maxValue = Math.max(...y) > maxValue ? Math.max(...y) : maxValue; - const stErrorFunction = (array) => + const stErrorFunction = array => ss.sampleStandardDeviation(array) / Math.sqrt(array.length); const stErrors = data_condition - .map((a) => (a.length > 1 ? stErrorFunction(a.map((r) => r.reaction_time)) : 0)) - .map((v) => Math.round(v)); - maxValueSE = Math.max(...stErrors) > maxValueSE ? Math.max(...stErrors) : maxValueSE; + .map(a => + a.length > 1 ? stErrorFunction(a.map(r => r.reaction_time)) : 0 + ) + .map(v => Math.round(v)); + maxValueSE = + Math.max(...stErrors) > maxValueSE + ? Math.max(...stErrors) + : maxValueSE; obj[condition] = { x, y, stErrors }; return obj; }, {}); dataToPlot['lowerLimit'] = 0; - dataToPlot['upperLimit'] = maxValue + maxValueSE > 1000 ? maxValue + maxValueSE + 100 : 1000; + dataToPlot['upperLimit'] = + maxValue + maxValueSE > 1000 ? maxValue + maxValueSE + 100 : 1000; return makeBarGraph(dataToPlot, conditions, colors, dependentVariable); case 'whiskers': dataToPlot = conditions.reduce((obj, condition, i) => { const x = data .reduce((a, b) => a.concat(b), []) - .filter((r) => r.response_given === 'yes' && r.correct_response === 'true') - .filter((e) => e.condition === condition) - .map((r) => r.subject); + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .filter(e => e.condition === condition) + .map(r => r.subject); const y = data .reduce((a, b) => a.concat(b), []) - .filter((r) => r.response_given === 'yes' && r.correct_response === 'true') - .filter((e) => e.condition === condition) - .map((r) => r.reaction_time); + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .filter(e => e.condition === condition) + .map(r => r.reaction_time); maxValue = Math.max(...y) > maxValue ? Math.max(...y) : maxValue; obj[condition] = { x, y }; return obj; @@ -253,33 +310,35 @@ const computeAccuracy = ( default: let tickValuesX, tickTextX; dataToPlot = conditions.reduce((obj, condition, i) => { - const correctDataForCondition = data.map((d) => d.filter((e) => e.condition == condition)); + const correctDataForCondition = data.map(d => + d.filter(e => e.condition == condition) + ); const y = correctDataForCondition - .map((d) => { - if (d.filter((l) => l.accuracy).length > 0) { - return d.map((l) => l.accuracy); + .map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => l.accuracy); } - const c = d.filter( - (e) => e.response_given === 'yes' && e.correct_response === 'true' - ); - return Math.round((c.length / d.length) * 100); - + const c = d.filter( + e => e.response_given === 'yes' && e.correct_response === 'true' + ); + return Math.round((c.length / d.length) * 100); }) .reduce((acc, item) => acc.concat(item), []); const xRaw = correctDataForCondition - .map((d) => { - if (d.filter((l) => l.accuracy).length > 0) { - return d.map((l) => l.subject); + .map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => l.subject); } - return d.map((r) => r.subject)[0]; - + return d.map(r => r.subject)[0]; }) .reduce((acc, item) => acc.concat(item), []); const subjects = Array.from(new Set(xRaw)); - const x = xRaw.map((x) => subjects.indexOf(x) + 1 + i / 4 + (Math.random() - 0.5) / 5); - tickValuesX = subjects.map((x) => subjects.indexOf(x) + 1 + 1 / 8); + const x = xRaw.map( + x => subjects.indexOf(x) + 1 + i / 4 + (Math.random() - 0.5) / 5 + ); + tickValuesX = subjects.map(x => subjects.indexOf(x) + 1 + 1 / 8); tickTextX = subjects; obj[condition] = { x, y }; return obj; @@ -288,42 +347,55 @@ const computeAccuracy = ( dataToPlot['ticktext'] = tickTextX; dataToPlot['lowerLimit'] = 0; dataToPlot['upperLimit'] = 105; - return makeDataPointsGraph(dataToPlot, conditions, colors, dependentVariable); + return makeDataPointsGraph( + dataToPlot, + conditions, + colors, + dependentVariable + ); case 'errorbars': dataToPlot = conditions.reduce((obj, condition, i) => { - const correctDataForCondition = data.map((d) => d.filter((e) => e.condition == condition)); + const correctDataForCondition = data.map(d => + d.filter(e => e.condition == condition) + ); const transformedData = correctDataForCondition - .map((d) => { - if (d.filter((l) => l.accuracy).length > 0) { - return d.map((l) => ({ + .map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => ({ accuracy: l.accuracy, - subject: l.subject, + subject: l.subject })); } - const c = d.filter( - (e) => e.response_given === 'yes' && e.correct_response === 'true' - ); - return { - accuracy: Math.round((c.length / d.length) * 100), - subject: d.map((r) => r.subject)[0], - }; - + const c = d.filter( + e => e.response_given === 'yes' && e.correct_response === 'true' + ); + return { + accuracy: Math.round((c.length / d.length) * 100), + subject: d.map(r => r.subject)[0] + }; }) .reduce((acc, item) => acc.concat(item), []); - const subjects = Array.from(new Set(transformedData.map((e) => e.subject))); - const y = subjects.map((subject) => - ss.mean(transformedData.filter((e) => e.subject === subject).map((d) => d.accuracy)) + const subjects = Array.from( + new Set(transformedData.map(e => e.subject)) + ); + const y = subjects.map(subject => + ss.mean( + transformedData + .filter(e => e.subject === subject) + .map(d => d.accuracy) + ) ); - const stErrorFunction = (array) => + const stErrorFunction = array => ss.sampleStandardDeviation(array) / Math.sqrt(array.length); - const stErrors = subjects.map((subject) => { - const array = transformedData.filter((e) => e.subject === subject).map((d) => d.accuracy); + const stErrors = subjects.map(subject => { + const array = transformedData + .filter(e => e.subject === subject) + .map(d => d.accuracy); if (array.length > 1) { return stErrorFunction(array); } - return 0; - + return 0; }); obj[condition] = { x: subjects, y, stErrors }; return obj; @@ -334,26 +406,26 @@ const computeAccuracy = ( case 'whiskers': dataToPlot = conditions.reduce((obj, condition, i) => { - const correctDataForCondition = data.map((d) => d.filter((e) => e.condition == condition)); + const correctDataForCondition = data.map(d => + d.filter(e => e.condition == condition) + ); const y = correctDataForCondition - .map((d) => { - if (d.filter((l) => l.accuracy).length > 0) { - return d.map((l) => l.accuracy); + .map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => l.accuracy); } - const c = d.filter( - (e) => e.response_given === 'yes' && e.correct_response === 'true' - ); - return Math.round((c.length / d.length) * 100); - + const c = d.filter( + e => e.response_given === 'yes' && e.correct_response === 'true' + ); + return Math.round((c.length / d.length) * 100); }) .reduce((acc, item) => acc.concat(item), []); const xRaw = correctDataForCondition - .map((d) => { - if (d.filter((l) => l.accuracy).length > 0) { - return d.map((l) => l.subject); + .map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => l.subject); } - return d.map((r) => r.subject)[0]; - + return d.map(r => r.subject)[0]; }) .reduce((acc, item) => acc.concat(item), []); obj[condition] = { x: xRaw, y }; @@ -379,27 +451,29 @@ const makeDataPointsGraph = (data, conditions, colors, dependentVariable) => { marker: { color: colors[i], size: 7, - symbol: symbols[i], + symbol: symbols[i] }, - mode: 'markers', + mode: 'markers' }; }); const layout = { xaxis: { tickvals: data.tickvals, - ticktext: data.ticktext, + ticktext: data.ticktext }, yaxis: { title: `${ - dependentVariable == 'Response Time' ? 'Response Time (milliseconds)' : '% correct' + dependentVariable == 'Response Time' + ? 'Response Time (milliseconds)' + : '% correct' }`, - range: [data.lowerLimit, data.upperLimit], + range: [data.lowerLimit, data.upperLimit] }, - title: `${dependentVariable}`, + title: `${dependentVariable}` }; return { dataToPlot, - layout, + layout }; }; @@ -413,29 +487,31 @@ const makeBarGraph = (data, conditions, colors, dependentVariable) => { type: 'bar', marker: { color: colors[i], - size: 7, + size: 7 }, error_y: { type: 'data', array: dataForCondition.stErrors, - visible: true, - }, + visible: true + } }; }); const layout = { yaxis: { title: `${ - dependentVariable == 'Response Time' ? 'Response Time (milliseconds)' : '% correct' + dependentVariable == 'Response Time' + ? 'Response Time (milliseconds)' + : '% correct' }`, zeroline: false, - range: [data.lowerLimit, data.upperLimit], + range: [data.lowerLimit, data.upperLimit] }, barmode: 'group', - title: `${dependentVariable}`, + title: `${dependentVariable}` }; return { dataToPlot, - layout, + layout }; }; @@ -451,25 +527,27 @@ const makeBoxPlot = (data, conditions, colors, dependentVariable) => { marker: { color: colors[i], size: 7, - symbol: symbols[i], + symbol: symbols[i] }, boxpoints: 'false', - pointpos: 0, + pointpos: 0 }; }); const layout = { yaxis: { title: `${ - dependentVariable == 'Response Time' ? 'Response Time (milliseconds)' : '% correct' + dependentVariable == 'Response Time' + ? 'Response Time (milliseconds)' + : '% correct' }`, zeroline: false, - range: [data.lowerLimit, data.upperLimit], + range: [data.lowerLimit, data.upperLimit] }, boxmode: 'group', - title: `${dependentVariable}`, + title: `${dependentVariable}` }; return { dataToPlot, - layout, + layout }; }; diff --git a/app/utils/eeg/cortex.js b/app/utils/eeg/cortex.js index 3a98b150..7534efdc 100644 --- a/app/utils/eeg/cortex.js +++ b/app/utils/eeg/cortex.js @@ -23,7 +23,7 @@ const EventEmitter = require('events'); const CORTEX_URL = 'wss://localhost:6868'; -const safeParse = (msg) => { +const safeParse = msg => { try { return JSON.parse(msg); } catch (_) { @@ -60,18 +60,18 @@ class Cortex extends EventEmitter { this._log('ws: Socket closed'); }); this.verbose = options.verbose !== null ? options.verbose : 1; - this.handleError = (error) => { + this.handleError = error => { throw new JSONRPCError(error); }; this.ready = new Promise( - (resolve) => this.ws.addEventListener('open', resolve), + resolve => this.ws.addEventListener('open', resolve), this.handleError ) .then(() => this._log('ws: Socket opened')) .then(() => this.call('inspectApi')) - .then((methods) => { - methods.forEach((m) => { + .then(methods => { + methods.forEach(m => { this.defineMethod(m.methodName, m.params); }); this._log(`rpc: Added ${methods.length} methods from inspectApi`); @@ -86,7 +86,10 @@ class Cortex extends EventEmitter { if ('id' in data) { const id = data.id; - this._log(`[${id}] <-`, data.result ? 'success' : `error (${data.error.message})`); + this._log( + `[${id}] <-`, + data.result ? 'success' : `error (${data.error.message})` + ); if (this.requests[id]) { this.requests[id](data.error, data.result); } else { @@ -94,9 +97,12 @@ class Cortex extends EventEmitter { } } else if ('sid' in data) { const dataKeys = Object.keys(data).filter( - (k) => k !== 'sid' && k !== 'time' && Array.isArray(data[k]) + k => k !== 'sid' && k !== 'time' && Array.isArray(data[k]) + ); + dataKeys.forEach( + k => + this.emit(k, data) || this._warn('no listeners for stream event', k) ); - dataKeys.forEach((k) => this.emit(k, data) || this._warn('no listeners for stream event', k)); } else { this._log('rpc: Unrecognised data', data); } @@ -112,7 +118,7 @@ class Cortex extends EventEmitter { } init({ clientId, clientSecret, license, debit } = {}) { const token = this.getUserLogin() - .then((users) => { + .then(users => { if (users.length === 0) { return Promise.reject(new Error('No logged in user')); } @@ -120,13 +126,15 @@ class Cortex extends EventEmitter { }) .then(({ accessGranted }) => { if (!accessGranted) { - return Promise.reject(new Error('Please approve this application in the EMOTIV app')); + return Promise.reject( + new Error('Please approve this application in the EMOTIV app') + ); } return this.authorize({ clientId, clientSecret, license, - debit, + debit }).then(({ cortexToken }) => { this._log('init: Got auth token'); this._debug('init: Auth token', cortexToken); @@ -138,7 +146,7 @@ class Cortex extends EventEmitter { return token; } close() { - return new Promise((resolve) => { + return new Promise(resolve => { this.ws.close(); this.ws.once('close', resolve); }); @@ -162,17 +170,21 @@ class Cortex extends EventEmitter { } defineMethod(methodName, paramDefs = []) { if (this[methodName]) return; - const needsAuth = paramDefs.some((p) => p.name === 'cortexToken'); - const requiredParams = paramDefs.filter((p) => p.required).map((p) => p.name); + const needsAuth = paramDefs.some(p => p.name === 'cortexToken'); + const requiredParams = paramDefs.filter(p => p.required).map(p => p.name); this[methodName] = (params = {}) => { if (needsAuth && this.cortexToken && !params.cortexToken) { params = Object.assign({}, params, { cortexToken: this.cortexToken }); } - const missingParams = requiredParams.filter((p) => params[p] == null); + const missingParams = requiredParams.filter(p => params[p] == null); if (missingParams.length > 0) { return this.handleError( - new Error(`Missing required params for ${methodName}: ${missingParams.join(', ')}`) + new Error( + `Missing required params for ${methodName}: ${missingParams.join( + ', ' + )}` + ) ); } return this.call(methodName, params); diff --git a/app/utils/eeg/emotiv.js b/app/utils/eeg/emotiv.js index 1c60b873..77a276cf 100644 --- a/app/utils/eeg/emotiv.js +++ b/app/utils/eeg/emotiv.js @@ -30,7 +30,7 @@ export const getEmotiv = async () => { return devices; }; -export const connectToEmotiv = async (device) => { +export const connectToEmotiv = async device => { await client.ready; // Authenticate @@ -39,7 +39,7 @@ export const connectToEmotiv = async (device) => { clientId: CLIENT_ID, clientSecret: CLIENT_SECRET, license: LICENSE_ID, - debit: 1, + debit: 1 }); } catch (err) { toast.error(`Authentication failed. ${err.message}`); @@ -56,14 +56,14 @@ export const connectToEmotiv = async (device) => { try { const newSession = await client.createSession({ status: 'active', - headset: device.id, + headset: device.id }); session = newSession; return { name: session.headset.id, samplingRate: session.headset.settings.eegRate, - channels: EMOTIV_CHANNELS, + channels: EMOTIV_CHANNELS }; } catch (err) { toast.error(`Session creation failed. ${err.message} `); @@ -74,7 +74,7 @@ export const disconnectFromEmotiv = async () => { console.log('disconnecting form emotiv'); const sessionStatus = await client.updateSession({ session: session.id, - status: 'close', + status: 'close' }); return sessionStatus; }; @@ -87,7 +87,7 @@ export const createRawEmotivObservable = async () => { try { await client.subscribe({ session: session.id, - streams: ['eeg', 'dev'], + streams: ['eeg', 'dev'] }); } catch (err) { toast.error(`EEG connection failed. ${err.message}`); @@ -97,7 +97,7 @@ export const createRawEmotivObservable = async () => { }; // Creates an observable that will epoch, filter, and add signal quality to EEG stream -export const createEmotivSignalQualityObservable = (rawObservable) => { +export const createEmotivSignalQualityObservable = rawObservable => { const signalQualityObservable = fromEvent(client, 'dev'); const samplingRate = 128; const channels = EMOTIV_CHANNELS; @@ -105,16 +105,16 @@ export const createEmotivSignalQualityObservable = (rawObservable) => { return rawObservable.pipe( addInfo({ samplingRate, - channels, + channels }), epoch({ duration: intervalSamples, - interval: intervalSamples, + interval: intervalSamples }), bandpassFilter({ nbChannels: channels.length, lowCutoff: 1, - highCutoff: 50, + highCutoff: 50 }), withLatestFrom(signalQualityObservable, integrateSignalQuality), parseEmotivSignalQuality(), @@ -129,7 +129,7 @@ export const injectEmotivMarker = (value, time) => { export const createEmotivRecord = (subjectName, sessionNumber) => { client.createRecord({ session: session.id, - title: `${subjectName}_${sessionNumber}`, + title: `${subjectName}_${sessionNumber}` }); }; @@ -144,7 +144,7 @@ export const stopEmotivRecord = () => { // 14 EEG channels in data // timestamp in ms // Event marker in marker if present -const createEEGSample = (eegEvent) => { +const createEEGSample = eegEvent => { const prunedArray = new Array(EMOTIV_CHANNELS.length); for (let i = 0; i < EMOTIV_CHANNELS.length; i++) { prunedArray[i] = eegEvent.eeg[i + 2]; @@ -163,7 +163,7 @@ const integrateSignalQuality = (newEpoch, devSample) => ({ ...newEpoch, signalQuality: Object.assign( ...devSample.dev[2].map((signalQuality, index) => ({ - [EMOTIV_CHANNELS[index]]: signalQuality, + [EMOTIV_CHANNELS[index]]: signalQuality })) - ), + ) }); diff --git a/app/utils/eeg/muse.js b/app/utils/eeg/muse.js index ff8350bf..ae2b076d 100644 --- a/app/utils/eeg/muse.js +++ b/app/utils/eeg/muse.js @@ -1,11 +1,20 @@ import 'hazardous'; import { withLatestFrom, share, startWith, filter } from 'rxjs/operators'; -import { addInfo, epoch, bandpassFilter, addSignalQuality } from '@neurosity/pipes'; +import { + addInfo, + epoch, + bandpassFilter, + addSignalQuality +} from '@neurosity/pipes'; import { release } from 'os'; import { MUSE_SERVICE, MuseClient, zipSamples } from 'muse-js'; import { from } from 'rxjs'; import { parseMuseSignalQuality } from './pipes'; -import { MUSE_SAMPLING_RATE, MUSE_CHANNELS, PLOTTING_INTERVAL } from '../../constants/constants'; +import { + MUSE_SAMPLING_RATE, + MUSE_CHANNELS, + PLOTTING_INTERVAL +} from '../../constants/constants'; const INTER_SAMPLE_INTERVAL = -(1 / 256) * 1000; @@ -27,18 +36,18 @@ export const getMuse = async () => { return null; } device = await bluetooth.requestDevice({ - filters: [{ services: [MUSE_SERVICE] }], + filters: [{ services: [MUSE_SERVICE] }] }); } else { device = await navigator.bluetooth.requestDevice({ - filters: [{ services: [MUSE_SERVICE] }], + filters: [{ services: [MUSE_SERVICE] }] }); } return [device]; }; // Attempts to connect to a muse device. If successful, returns a device info object -export const connectToMuse = async (device) => { +export const connectToMuse = async device => { if (process.platform === 'win32') { const gatt = await device.gatt.connect(); await client.connect(gatt); @@ -48,7 +57,7 @@ export const connectToMuse = async (device) => { return { name: client.deviceName, samplingRate: MUSE_SAMPLING_RATE, - channels: MUSE_CHANNELS, + channels: MUSE_CHANNELS }; }; @@ -60,29 +69,32 @@ export const createRawMuseObservable = async () => { const eegStream = await client.eegReadings; const markers = await client.eventMarkers.pipe(startWith({ timestamp: 0 })); return from(zipSamples(eegStream)).pipe( - filter((sample) => !sample.data.includes(NaN)), + filter(sample => !sample.data.includes(NaN)), withLatestFrom(markers, synchronizeTimestamp), share() ); }; // Creates an observable that will epoch, filter, and add signal quality to EEG stream -export const createMuseSignalQualityObservable = (rawObservable, deviceInfo) => { +export const createMuseSignalQualityObservable = ( + rawObservable, + deviceInfo +) => { const { samplingRate, channels: channelNames } = deviceInfo; const intervalSamples = (PLOTTING_INTERVAL * samplingRate) / 1000; return rawObservable.pipe( addInfo({ samplingRate, - channelNames, + channelNames }), epoch({ duration: intervalSamples, - interval: intervalSamples, + interval: intervalSamples }), bandpassFilter({ nbChannels: channelNames.length, lowCutoff: 1, - highCutoff: 50, + highCutoff: 50 }), addSignalQuality(), parseMuseSignalQuality() diff --git a/app/utils/eeg/pipes.js b/app/utils/eeg/pipes.js index db1fb615..256019e0 100644 --- a/app/utils/eeg/pipes.js +++ b/app/utils/eeg/pipes.js @@ -1,47 +1,54 @@ import { pipe } from 'rxjs'; import { map } from 'rxjs/operators'; -import { SIGNAL_QUALITY, SIGNAL_QUALITY_THRESHOLDS } from '../../constants/constants'; +import { + SIGNAL_QUALITY, + SIGNAL_QUALITY_THRESHOLDS +} from '../../constants/constants'; export const parseMuseSignalQuality = () => pipe( - map((epoch) => ({ + map(epoch => ({ ...epoch, signalQuality: Object.assign( {}, - ...Object.entries(epoch.signalQuality).map(([channelName, signalQuality]) => { - if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.BAD) { - return { [channelName]: SIGNAL_QUALITY.BAD }; - } - if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.OK) { - return { [channelName]: SIGNAL_QUALITY.OK }; - } - if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.GREAT) { - return { [channelName]: SIGNAL_QUALITY.GREAT }; + ...Object.entries(epoch.signalQuality).map( + ([channelName, signalQuality]) => { + if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.BAD) { + return { [channelName]: SIGNAL_QUALITY.BAD }; + } + if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.OK) { + return { [channelName]: SIGNAL_QUALITY.OK }; + } + if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.GREAT) { + return { [channelName]: SIGNAL_QUALITY.GREAT }; + } + return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; } - return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; - }) - ), + ) + ) })) ); export const parseEmotivSignalQuality = () => pipe( - map((epoch) => ({ + map(epoch => ({ ...epoch, signalQuality: Object.assign( {}, - ...Object.entries(epoch.signalQuality).map(([channelName, signalQuality]) => { - if (signalQuality === 0) { - return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; - } - if (signalQuality === 3) { - return { [channelName]: SIGNAL_QUALITY.OK }; - } - if (signalQuality === 4) { - return { [channelName]: SIGNAL_QUALITY.GREAT }; + ...Object.entries(epoch.signalQuality).map( + ([channelName, signalQuality]) => { + if (signalQuality === 0) { + return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; + } + if (signalQuality === 3) { + return { [channelName]: SIGNAL_QUALITY.OK }; + } + if (signalQuality === 4) { + return { [channelName]: SIGNAL_QUALITY.GREAT }; + } + return { [channelName]: SIGNAL_QUALITY.BAD }; } - return { [channelName]: SIGNAL_QUALITY.BAD }; - }) - ), + ) + ) })) ); diff --git a/app/utils/filesystem/dialog.js b/app/utils/filesystem/dialog.js index 0005c141..76889ae6 100644 --- a/app/utils/filesystem/dialog.js +++ b/app/utils/filesystem/dialog.js @@ -17,13 +17,13 @@ export const loadDialog = (event, arg) => { } }; -const selectTimeline = (event) => { +const selectTimeline = event => { dialog.showOpenDialog( { title: 'Select a jsPsych timeline file', - properties: ['openFile', 'promptToCreate'], + properties: ['openFile', 'promptToCreate'] }, - (filePaths) => { + filePaths => { if (filePaths) { event.sender.send('loadDialogReply', filePaths[0]); } @@ -31,13 +31,13 @@ const selectTimeline = (event) => { ); }; -const selectStimulusFolder = (event) => { +const selectStimulusFolder = event => { dialog.showOpenDialog( { title: 'Select a folder of images', - properties: ['openDirectory'], + properties: ['openDirectory'] }, - (dir) => { + dir => { if (dir) { event.sender.send('loadDialogReply', dir[0]); } else { diff --git a/app/utils/filesystem/select.js b/app/utils/filesystem/select.js index 5fc3d1d8..4c8c7012 100644 --- a/app/utils/filesystem/select.js +++ b/app/utils/filesystem/select.js @@ -8,7 +8,7 @@ import { ipcRenderer } from 'electron'; import { FILE_TYPES } from '../../constants/constants'; export const loadFromSystemDialog = (fileType: FILE_TYPES) => - new Promise((resolve) => { + new Promise(resolve => { ipcRenderer.send('loadDialog', fileType); ipcRenderer.on('loadDialogReply', (event, result) => { resolve(result); diff --git a/app/utils/filesystem/storage.js b/app/utils/filesystem/storage.js index 881e42db..582e7e2c 100755 --- a/app/utils/filesystem/storage.js +++ b/app/utils/filesystem/storage.js @@ -19,13 +19,15 @@ const { dialog } = remote; // Creating and Getting // Creates a new directory for a given workspace with the passed title if it doesn't already exist -export const createWorkspaceDir = (title: string) => mkdirPathSync(getWorkspaceDir(title)); +export const createWorkspaceDir = (title: string) => + mkdirPathSync(getWorkspaceDir(title)); // Gets the absolute path for a workspace from a given title export const getWorkspaceDir = (title: string) => path.join(workspaces, title); // Opens a workspace folder in explorer (or other native OS filesystem browser) -export const openWorkspaceDir = (title: string) => shell.openItem(path.join(workspaces, title)); +export const openWorkspaceDir = (title: string) => + shell.openItem(path.join(workspaces, title)); // ----------------------------------------------------------------------------------------------- // Storing @@ -42,7 +44,7 @@ export const storeExperimentState = (state: ExperimentStateType) => { }; export const restoreExperimentState = (state: ExperimentStateType) => { - if(state.type !== 'NONE'){ + if (state.type !== 'NONE') { const timestampedState = { ...state, subject: '', @@ -54,7 +56,7 @@ export const restoreExperimentState = (state: ExperimentStateType) => { JSON.stringify(timestampedState) ); } -} +}; export const storeBehaviouralData = ( csv: string, @@ -66,7 +68,7 @@ export const storeBehaviouralData = ( const dir = path.join(getWorkspaceDir(title), 'Data', subject, 'Behavior'); const filename = `${subject}-${group}-${session}-behavior.csv`; mkdirPathSync(dir); - fs.writeFile(path.join(dir, filename), csv, (err) => { + fs.writeFile(path.join(dir, filename), csv, err => { if (err) { console.error(err); } @@ -74,11 +76,15 @@ export const storeBehaviouralData = ( }; // Stores an image to workspace dir -export const storeJupyterImage = (title: string, imageTitle: string, rawData: Buffer) => { +export const storeJupyterImage = ( + title: string, + imageTitle: string, + rawData: Buffer +) => { const dir = path.join(getWorkspaceDir(title), 'Results', 'Images'); const filename = `${imageTitle}.png`; mkdirPathSync(dir); - fs.writeFile(path.join(dir, filename), rawData, (err) => { + fs.writeFile(path.join(dir, filename), rawData, err => { if (err) { console.error(err); } @@ -91,7 +97,9 @@ export const storeJupyterImage = (title: string, imageTitle: string, rawData: Bu // Returns a list of workspaces in the workspaces directory. Will make the workspaces dir if it doesn't exist yet export const readWorkspaces = () => { try { - return fs.readdirSync(workspaces).filter((workspace) => workspace !== '.DS_Store'); + return fs + .readdirSync(workspaces) + .filter(workspace => workspace !== '.DS_Store'); } catch (e) { if (e.code === 'ENOENT') { mkdirPathSync(workspaces); @@ -106,10 +114,10 @@ export const readWorkspaceRawEEGData = async (title: string) => { try { const files = await recursive(getWorkspaceDir(title)); const rawFiles = files - .filter((filepath) => filepath.slice(-7).includes('raw.csv')) - .map((filepath) => ({ + .filter(filepath => filepath.slice(-7).includes('raw.csv')) + .map(filepath => ({ name: path.basename(filepath), - path: filepath, + path: filepath })); return rawFiles; } catch (e) { @@ -125,10 +133,10 @@ export const readWorkspaceCleanedEEGData = async (title: string) => { try { const files = await recursive(getWorkspaceDir(title)); return files - .filter((filepath) => filepath.slice(-7).includes('epo.fif')) - .map((filepath) => ({ + .filter(filepath => filepath.slice(-7).includes('epo.fif')) + .map(filepath => ({ name: path.basename(filepath), - path: filepath, + path: filepath })); } catch (e) { console.log(e); @@ -141,10 +149,10 @@ export const readWorkspaceBehaviorData = async (title: string) => { try { const files = await recursive(getWorkspaceDir(title)); const behaviorFiles = files - .filter((filepath) => filepath.slice(-12).includes('behavior.csv')) - .map((filepath) => ({ + .filter(filepath => filepath.slice(-12).includes('behavior.csv')) + .map(filepath => ({ name: path.basename(filepath), - path: filepath, + path: filepath })); return behaviorFiles; } catch (e) { @@ -158,7 +166,9 @@ export const readWorkspaceBehaviorData = async (title: string) => { // Reads an experiment state tree from disk and parses it from JSON export const readAndParseState = (dir: string) => { try { - return JSON.parse(fs.readFileSync(path.join(workspaces, dir, 'appState.json'))); + return JSON.parse( + fs.readFileSync(path.join(workspaces, dir, 'appState.json')) + ); } catch (e) { if (e.code === 'ENOENT') { console.log('appState does not exist for recent workspace'); @@ -169,34 +179,38 @@ export const readAndParseState = (dir: string) => { // Reads a list of images that are in a directory export const readImages = (dir: string) => - fs.readdirSync(dir).filter((filename) => { + fs.readdirSync(dir).filter(filename => { const extension = filename.slice(-3).toLowerCase(); return ( - extension === 'png' || extension === 'jpg' || extension === 'gif' || extension === 'peg' // support .jpeg? + extension === 'png' || + extension === 'jpg' || + extension === 'gif' || + extension === 'peg' // support .jpeg? ); }); // Returns an array of images that are used in a timeline for use in preloading export const getImages = (params: ExperimentParameters) => readdirSync(params.stimulus1.dir) - .map((filename) => path.join(params.stimulus1.dir, filename)) + .map(filename => path.join(params.stimulus1.dir, filename)) .concat( - readdirSync(params.stimulus2.dir).map((filename) => path.join(params.stimulus2.dir, filename)) + readdirSync(params.stimulus2.dir).map(filename => + path.join(params.stimulus2.dir, filename) + ) ); - // ----------------------------------------------------------------------------------------------- // Util export const getSubjectNamesFromFiles = (filePaths: Array) => filePaths - .map((filePath) => path.basename(filePath)) - .map((fileName) => fileName.substring(0, fileName.indexOf('-'))); + .map(filePath => path.basename(filePath)) + .map(fileName => fileName.substring(0, fileName.indexOf('-'))); // Read CSV files with behavioral data and return an object export const readBehaviorData = (files: Array) => { try { - return files.map((file) => { + return files.map(file => { const csv = fs.readFileSync(file, 'utf-8'); const obj = convertCSVToObject(csv); obj.meta.datafile = file; @@ -217,11 +231,11 @@ const saveFileOnDisk = (data, title) => { dialog.showSaveDialog( { title: 'Select a folder to save the data', - defaultPath: path.join(getWorkspaceDir(title), 'Data', `aggregated.csv`), + defaultPath: path.join(getWorkspaceDir(title), 'Data', `aggregated.csv`) }, - (filename) => { + filename => { if (filename && typeof filename !== 'undefined') { - fs.writeFile(filename, data, (err) => { + fs.writeFile(filename, data, err => { if (err) console.error(err); }); } @@ -230,15 +244,15 @@ const saveFileOnDisk = (data, title) => { }; // convert a csv file to an object with Papaparse -const convertCSVToObject = (csv) => { +const convertCSVToObject = csv => { const data = Papa.parse(csv, { - header: true, + header: true }); return data; }; // convert an object to a csv file with Papaparse -const convertObjectToSCV = (data) => { +const convertObjectToSCV = data => { const csv = Papa.unparse(data); return csv; }; @@ -250,7 +264,13 @@ export const deleteWorkspaceDir = (title: string) => { // Check whether the file with the given name already exists in the filesystem export const checkFileExists = (title, subject, filename) => { - const file = path.join(getWorkspaceDir(title), 'Data', subject, 'Behavior', filename); + const file = path.join( + getWorkspaceDir(title), + 'Data', + subject, + 'Behavior', + filename + ); const fileExists = fs.existsSync(file); return fileExists; -} +}; diff --git a/app/utils/filesystem/write.js b/app/utils/filesystem/write.js index b493687b..baeceb41 100644 --- a/app/utils/filesystem/write.js +++ b/app/utils/filesystem/write.js @@ -30,7 +30,10 @@ export const createEEGWriteStream = ( // Writes the header for a simple CSV EEG file format. // timestamp followed by channels, followed by markers -export const writeHeader = (writeStream: fs.WriteStream, channels: Array) => { +export const writeHeader = ( + writeStream: fs.WriteStream, + channels: Array +) => { try { const headerLabels = `Timestamp,${channels.join(',')},Marker\n`; writeStream.write(headerLabels); @@ -57,6 +60,6 @@ export const writeEEGData = (writeStream: fs.WriteStream, eegData: EEGData) => { // Helper functions // Creates a directory path if it doesn't exist -export const mkdirPathSync = (dirPath) => { +export const mkdirPathSync = dirPath => { mkdirp.sync(dirPath); }; diff --git a/app/utils/jupyter/cells.js b/app/utils/jupyter/cells.js index 8aba381a..f745fdae 100644 --- a/app/utils/jupyter/cells.js +++ b/app/utils/jupyter/cells.js @@ -16,30 +16,32 @@ export const imports = () => 'import numpy as np', 'import seaborn as sns', 'from matplotlib import pyplot as plt', - "plt.style.use('fivethirtyeight')", + "plt.style.use('fivethirtyeight')" ].join('\n'); -export const utils = () => readFileSync(path.join(__dirname, '/utils/jupyter/utils.py'), 'utf8'); +export const utils = () => + readFileSync(path.join(__dirname, '/utils/jupyter/utils.py'), 'utf8'); export const loadCSV = (filePathArray: Array) => [ - `files = [${filePathArray.map((filePath) => formatFilePath(filePath))}]`, + `files = [${filePathArray.map(filePath => formatFilePath(filePath))}]`, `replace_ch_names = None`, - `raw = load_data(files, replace_ch_names)`, + `raw = load_data(files, replace_ch_names)` ].join('\n'); export const loadCleanedEpochs = (filePathArray: Array) => [ - `files = [${filePathArray.map((filePath) => formatFilePath(filePath))}]`, + `files = [${filePathArray.map(filePath => formatFilePath(filePath))}]`, `clean_epochs = concatenate_epochs([read_epochs(file) for file in files])`, - `conditions = OrderedDict({key: [value] for (key, value) in clean_epochs.event_id.items()})`, + `conditions = OrderedDict({key: [value] for (key, value) in clean_epochs.event_id.items()})` ].join('\n'); // NOTE: this command includes a ';' to prevent returning data export const filterIIR = (lowCutoff: number, highCutoff: number) => `raw.filter(${lowCutoff}, ${highCutoff}, method='iir');`; -export const plotPSD = () => [`%matplotlib inline`, `raw.plot_psd(fmin=1, fmax=30)`].join('\n'); +export const plotPSD = () => + [`%matplotlib inline`, `raw.plot_psd(fmin=1, fmax=30)`].join('\n'); export const epochEvents = ( eventIDs: { [string]: number }, @@ -47,7 +49,9 @@ export const epochEvents = ( tmax: number, reject?: Array | string = 'None' ) => { - const IDs = Object.keys(eventIDs).filter(k => k !== "").reduce((res,key) => (res[key] = eventIDs[key], res), {} ) + const IDs = Object.keys(eventIDs) + .filter(k => k !== '') + .reduce((res, key) => ((res[key] = eventIDs[key]), res), {}); const command = [ `event_id = ${JSON.stringify(IDs)}`, `tmin=${tmin}`, @@ -59,19 +63,21 @@ export const epochEvents = ( `raw_epochs = Epochs(raw, events=events, event_id=event_id, tmin=tmin, tmax=tmax, baseline=baseline, reject=reject, preload=True, verbose=False, picks=picks)`, - `conditions = OrderedDict({key: [value] for (key, value) in raw_epochs.event_id.items()})`, + `conditions = OrderedDict({key: [value] for (key, value) in raw_epochs.event_id.items()})` ].join('\n'); return command; }; -export const requestEpochsInfo = (variableName: string) => `get_epochs_info(${variableName})`; +export const requestEpochsInfo = (variableName: string) => + `get_epochs_info(${variableName})`; -export const requestChannelInfo = () => `[ch for ch in clean_epochs.ch_names if ch != 'Marker']`; +export const requestChannelInfo = () => + `[ch for ch in clean_epochs.ch_names if ch != 'Marker']`; export const cleanEpochsPlot = () => [ `%matplotlib`, - `raw_epochs.plot(scalings='auto', n_epochs=6, title="Clean Data", events=None)`, + `raw_epochs.plot(scalings='auto', n_epochs=6, title="Clean Data", events=None)` ].join('\n'); export const plotTopoMap = () => @@ -81,15 +87,22 @@ export const plotERP = (channelIndex: number) => [ `%matplotlib inline`, `X, y = plot_conditions(clean_epochs, ch_ind=${channelIndex}, conditions=conditions, - ci=97.5, n_boot=1000, title='', diff_waveform=None)`, + ci=97.5, n_boot=1000, title='', diff_waveform=None)` ].join('\n'); export const saveEpochs = (workspaceDir: string, subject: string) => `raw_epochs.save(${formatFilePath( - path.join(workspaceDir, 'Data', subject, 'EEG', `${subject}-cleaned-epo.fif`) + path.join( + workspaceDir, + 'Data', + subject, + 'EEG', + `${subject}-cleaned-epo.fif` + ) )})`; // ------------------------------------------- // Helper methods -const formatFilePath = (filePath: string) => `"${filePath.replace(/\\/g, '/')}"`; +const formatFilePath = (filePath: string) => + `"${filePath.replace(/\\/g, '/')}"`; diff --git a/app/utils/jupyter/functions.js b/app/utils/jupyter/functions.js index 7688f024..81c49315 100644 --- a/app/utils/jupyter/functions.js +++ b/app/utils/jupyter/functions.js @@ -1,6 +1,7 @@ import { KERNEL_STATUS } from '../../constants/constants'; -export const parseSingleQuoteJSON = (string: string) => JSON.parse(string.replace(/'/g, '"')); +export const parseSingleQuoteJSON = (string: string) => + JSON.parse(string.replace(/'/g, '"')); export const parseKernelStatus = (msg: Object) => { switch (msg['content']['execution_state']) { diff --git a/app/utils/jupyter/pipes.js b/app/utils/jupyter/pipes.js index b5ffe1bf..07d8252a 100644 --- a/app/utils/jupyter/pipes.js +++ b/app/utils/jupyter/pipes.js @@ -5,14 +5,16 @@ import { RECEIVE_EXECUTE_REPLY } from '../../epics/jupyterEpics'; // Refactor this so command can be calculated either up stream or inside pipe export const execute = (command, state$) => - pipe(map(() => state$.value.jupyter.mainChannel.next(executeRequest(command)))); + pipe( + map(() => state$.value.jupyter.mainChannel.next(executeRequest(command))) + ); -export const awaitOkMessage = (action$) => +export const awaitOkMessage = action$ => pipe( mergeMap(() => action$.ofType(RECEIVE_EXECUTE_REPLY).pipe( pluck('payload'), - filter((msg) => msg.channel === 'shell' && msg.content.status === 'ok'), + filter(msg => msg.channel === 'shell' && msg.content.status === 'ok'), take(1) ) ) diff --git a/app/utils/labjs/functions.js b/app/utils/labjs/functions.js index 09ff5963..966f2ec8 100644 --- a/app/utils/labjs/functions.js +++ b/app/utils/labjs/functions.js @@ -9,7 +9,11 @@ import { buildMultiTimeline } from './protocols/multi'; import { buildSearchTimeline } from './protocols/search'; import { buildCustomTimeline } from './protocols/custom'; -import { MainTimeline, Trial, ExperimentParameters } from '../../constants/interfaces'; +import { + MainTimeline, + Trial, + ExperimentParameters +} from '../../constants/interfaces'; // loads a protocol of the experiment export const loadProtocol = (paradigm: EXPERIMENTS) => { diff --git a/app/utils/labjs/index.js b/app/utils/labjs/index.js index 2583e54c..54e5ead8 100644 --- a/app/utils/labjs/index.js +++ b/app/utils/labjs/index.js @@ -32,10 +32,15 @@ class ExperimentWindow extends Component { case 'Faces and Houses': faceshouses.parameters = props.settings.params; faceshouses.parameters.title = props.settings.title; - faceshouses.files = props.settings.params.stimuli.map(image => ( - { [path.join(image.dir, image.filename)] : path.join(image.dir, image.filename) } - )).reduce((obj, item) => { - obj[Object.keys(item)[0]] = Object.values(item)[0] + faceshouses.files = props.settings.params.stimuli + .map(image => ({ + [path.join(image.dir, image.filename)]: path.join( + image.dir, + image.filename + ) + })) + .reduce((obj, item) => { + obj[Object.keys(item)[0]] = Object.values(item)[0]; return obj; }, {}); this.study = lab.util.fromObject(clonedeep(faceshouses), lab); @@ -44,10 +49,15 @@ class ExperimentWindow extends Component { default: custom.parameters = props.settings.params; custom.parameters.title = props.settings.title; - custom.files = props.settings.params.stimuli.map(image => ( - { [path.join(image.dir, image.filename)] : path.join(image.dir, image.filename) } - )).reduce((obj, item) => { - obj[Object.keys(item)[0]] = Object.values(item)[0] + custom.files = props.settings.params.stimuli + .map(image => ({ + [path.join(image.dir, image.filename)]: path.join( + image.dir, + image.filename + ) + })) + .reduce((obj, item) => { + obj[Object.keys(item)[0]] = Object.values(item)[0]; return obj; }, {}); this.study = lab.util.fromObject(clonedeep(custom), lab); @@ -59,10 +69,10 @@ class ExperimentWindow extends Component { this.study = undefined; props.settings.on_finish(csv); }); - this.study.parameters.callbackForEEG = (e) => { + this.study.parameters.callbackForEEG = e => { props.settings.eventCallback(e, new Date().getTime()); }; - this.study.options.events['keydown'] = async (e) => { + this.study.options.events['keydown'] = async e => { if (e.code === 'Escape') { if (this.study) { await this.study.internals.controller.audioContext.close(); @@ -85,8 +95,8 @@ class ExperimentWindow extends Component { render() { return ( -
-
+
+

Loading Experiment

The experiment is loading and should start in a few seconds

diff --git a/app/utils/labjs/lab.css b/app/utils/labjs/lab.css index baef0bc8..cdd9c6bc 100755 --- a/app/utils/labjs/lab.css +++ b/app/utils/labjs/lab.css @@ -8,7 +8,7 @@ --border-radius-container: 5px; --border-radius-content: 4px; /* Typography */ - --font-family: "Arial", sans-serif; + --font-family: 'Arial', sans-serif; --font-family-mono: Droid Mono, Menlo, Consolas, monospace; --font-size: 18px; --line-height: 1.4em; @@ -26,7 +26,9 @@ :root { box-sizing: border-box; } -*, *::before, *::after { +*, +*::before, +*::after { box-sizing: inherit; } @@ -49,12 +51,15 @@ body { /* width: 900px; width: var(--width-container); */ } -header, footer, main { +header, +footer, +main { padding: 24px; padding: var(--padding-internal); } /* Individual parts: Height, borders and background */ -header, footer { +header, +footer { min-height: 8vh; min-height: var(--height-min-header-footer); } @@ -113,8 +118,8 @@ main { } .container.fullscreen { /* IE11 miscalculates the height, so add some slack */ - min-height: calc(100vh - 3*24px); - min-height: calc(100vh - 3*var(--padding-internal)); + min-height: calc(100vh - 3 * 24px); + min-height: calc(100vh - 3 * var(--padding-internal)); } } @@ -138,27 +143,31 @@ footer { /* Typography */ :root { - font-family: "Arial", sans-serif; + font-family: 'Arial', sans-serif; font-family: var(--font-family); font-size: 18px; font-size: var(--font-size); line-height: 1.4em; line-height: var(--line-height); } -header, footer, main { +header, +footer, +main { /* Set display style explicitly for legacy browsers that are unfamiliar with these elements */ display: block; text-align: center; } -h1, h2, h3 { +h1, +h2, +h3 { line-height: 1.4em; line-height: var(--line-height); } hr { border: none; border-top: 2px solid #e5e5e5; - border-top: 2px solid var(--color-border) + border-top: 2px solid var(--color-border); } /* Special elements: Keyboard buttons */ @@ -277,7 +286,8 @@ kbd.big { .text-muted a { color: rgb(60, 89, 156); } -small, .small { +small, +.small { font-size: 0.9rem; } .font-weight-bold { @@ -303,7 +313,7 @@ code { display: none; } .hide-if-empty:empty { - display: none + display: none; } /* Alerts */ @@ -325,14 +335,17 @@ code { } /* Background styles (experimental) */ -.alert, .background-dark { +.alert, +.background-dark { background-color: #f8f8f8; background-color: var(--color-gray-background); } -.alert.alert-danger, .background-danger { +.alert.alert-danger, +.background-danger { background-color: #e9afaf; } -.alert.alert-warning, .background-warning { +.alert.alert-warning, +.background-warning { background-color: #ffe6a5; } .background-ok { @@ -340,8 +353,11 @@ code { } /* Form elements */ -input, select, button, textarea { - font-family: "Arial", sans-serif; +input, +select, +button, +textarea { + font-family: 'Arial', sans-serif; font-family: var(--font-family); font-size: 0.9rem; line-height: 1.4em; @@ -353,10 +369,10 @@ input, select, button, textarea { margin: 8px 0; padding: 8px; } -input[type="checkbox"] { +input[type='checkbox'] { margin: 0 10px; } -input[type="range"] { +input[type='range'] { border: none; } input + label { @@ -411,7 +427,8 @@ table { width: 100%; border-collapse: collapse; } -table td, table th { +table td, +table th { padding: 10px 8px 8px; } /* Table borders (except for plain) */ @@ -431,7 +448,7 @@ table:not(.table-plain) > tbody > tr:last-child > th { /* Striped rows */ table.table-striped tr:nth-child(odd) td { background-color: #efefef; - background-color: var(--color-border-internal) + background-color: var(--color-border-internal); } /* Progress bar */ @@ -459,15 +476,15 @@ table.table-striped tr:nth-child(odd) td { position: absolute; top: 0; -webkit-animation-duration: 0.5s; - animation-duration: 0.5s; + animation-duration: 0.5s; -webkit-animation-name: popover; - animation-name: popover; + animation-name: popover; } /* Width, for some reason, needs to be set explicitly */ .container.fullscreen .popover { - width: calc(100vw - 2*24px); - width: calc(100vw - 2*var(--padding-internal)); + width: calc(100vw - 2 * 24px); + width: calc(100vw - 2 * var(--padding-internal)); } .popover > * { @@ -484,23 +501,23 @@ table.table-striped tr:nth-child(odd) td { @-webkit-keyframes popover { from { -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); } to { -webkit-transform: none; - transform: none; + transform: none; } } @keyframes popover { from { -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); } to { -webkit-transform: none; - transform: none; + transform: none; } } @@ -511,5 +528,4 @@ table.table-striped tr:nth-child(odd) td { top: -8px; } - /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGFydGVya2l0L2xpYi9sYWIuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlCQUF5QjtBQUN6QjtFQUNFLFlBQVk7RUFDWix5QkFBeUI7RUFDekIsNkJBQTZCO0VBQzdCLGdDQUFnQztFQUNoQyx5QkFBeUI7RUFDekIsK0JBQStCO0VBQy9CLDZCQUE2QjtFQUM3QixnQkFBZ0I7RUFDaEIsbUNBQW1DO0VBQ25DLDJEQUEyRDtFQUMzRCxrQkFBa0I7RUFDbEIscUJBQXFCO0VBQ3JCLDhFQUE4RTtFQUM5RSxrQ0FBOEM7RUFBOUMsOENBQThDO0VBQzlDLFlBQVk7RUFDWix3QkFBd0I7RUFDeEIsaUNBQWlDO0VBQ2pDLGlDQUFpQztFQUNqQyw4QkFBOEI7Q0FDL0I7O0FBRUQsMENBQTBDO0FBQzFDO0VBQ0UsdUJBQXVCO0NBQ3hCO0FBQ0Q7RUFDRSxvQkFBb0I7Q0FDckI7O0FBRUQsb0JBQW9CO0FBQ3BCO0VBQ0UsVUFBVTtDQUNYOztBQUVEO0VBQ0UsaUJBQXNDO0VBQXRDLHNDQUFzQztFQUN0QyxnQkFBNEM7RUFBNUMsNENBQTRDO0VBQzVDLHNDQUFzQztFQUN0QyxrQkFBcUM7RUFBckMscUNBQXFDO0VBQ3JDLGFBQThCO0VBQTlCLDhCQUE4QjtDQUMvQjtBQUNEO0VBQ0UsY0FBaUM7RUFBakMsaUNBQWlDO0NBQ2xDO0FBQ0Qsc0RBQXNEO0FBQ3REO0VBQ0UsZ0JBQTRDO0VBQTVDLDRDQUE0QztDQUM3QztBQUNEO0VBQ0UsZ0JBQTRDO0VBQTVDLDRDQUE0QztDQUM3Qzs7QUFFRCx1QkFBdUI7QUFDdkI7RUFDRSwrQkFBK0I7RUFDL0IsYUFBZ0M7RUFBaEMsZ0NBQWdDO0VBQ2hDLGlDQUFvRDtFQUFwRCxvREFBb0Q7RUFDcEQsNEJBQStDO0VBQS9DLCtDQUErQztFQUMvQyxxQ0FBcUM7RUFDckMsY0FBYztFQUNkLHVCQUF1QjtDQUN4QjtBQUNEO0VBQ0Usc0JBQXNCO0VBQ3RCLFFBQVE7Q0FDVDs7QUFFRCxzQkFBc0I7QUFDdEI7RUFDRSxVQUFVO0VBQ1YsYUFBYTtFQUNiLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsYUFBYTtFQUNiLGtCQUFrQjtDQUNuQjs7QUFFRCxtQ0FBbUM7QUFDbkM7RUFDRTtJQUNFLFVBQVU7SUFDVixhQUFhO0lBQ2IsaUJBQWlCO0lBQ2pCLGFBQWE7SUFDYixrQkFBa0I7R0FDbkI7Q0FDRjs7QUFFRCx3RUFBd0U7QUFDeEU7RUFDRTtJQUNFLGNBQWM7R0FDZjtFQUNEO0lBQ0Usc0RBQXNEO0lBQ3RELGlDQUFvRDtJQUFwRCxvREFBb0Q7R0FDckQ7Q0FDRjs7QUFFRCw2QkFBNkI7QUFDN0I7RUFDRSwwQkFBc0M7RUFBdEMsc0NBQXNDO0VBQ3RDLG1CQUE4QztFQUE5Qyw4Q0FBOEM7Q0FDL0M7QUFDRDtFQUNFLGlDQUFzRDtFQUF0RCxzREFBc0Q7Q0FDdkQ7QUFDRDtFQUNFLDhCQUFtRDtFQUFuRCxtREFBbUQ7RUFDbkQsMEJBQStDO0VBQS9DLCtDQUErQztDQUNoRDs7QUFFRCxnQkFBZ0I7QUFDaEI7RUFDRSxpQ0FBZ0M7RUFBaEMsZ0NBQWdDO0VBQ2hDLGdCQUE0QjtFQUE1Qiw0QkFBNEI7RUFDNUIsbUJBQWdDO0VBQWhDLGdDQUFnQztDQUNqQztBQUNEO0VBQ0U7K0NBQzZDO0VBQzdDLGVBQWU7RUFDZixtQkFBbUI7Q0FDcEI7QUFDRDtFQUNFLG1CQUFnQztFQUFoQyxnQ0FBZ0M7Q0FDakM7QUFDRDtFQUNFLGFBQWE7RUFDYiw4QkFBeUM7RUFBekMseUNBQXlDO0NBQzFDOztBQUVELHdDQUF3QztBQUN4QztFQUNFLGlCQUFpQjtFQUNqQixzQkFBc0I7RUFDdEIsa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQixrQkFBa0I7RUFDbEIscUJBQXFCO0VBQ3JCLFdBQVc7RUFDWCxvREFBcUM7RUFBckMscUNBQXFDO0VBQ3JDLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsMkJBQTJCO0VBQzNCLHdCQUF3QjtFQUN4QixtQkFBNEM7RUFBNUMsNENBQTRDO0VBQzVDLHFDQUFxQztDQUN0QztBQUNEO0VBQ0Usa0JBQWtCO0VBQ2xCLHNCQUFzQjtFQUN0Qix3QkFBd0I7Q0FDekI7O0FBRUQsdUJBQXVCO0FBQ3ZCO0VBQ0UsWUFBWTtDQUNiO0FBQ0Q7RUFDRSxpQkFBc0M7RUFBdEMsc0NBQXNDO0NBQ3ZDO0FBQ0Q7RUFDRSw2QkFBa0Q7RUFBbEQsa0RBQWtEO0NBQ25EO0FBQ0Q7RUFDRSwyQkFBZ0Q7RUFBaEQsZ0RBQWdEO0NBQ2pEO0FBQ0Qsc0NBQXNDO0FBQ3RDOzs7Ozs7Ozs7O0VBVUUsY0FBYztDQUNmO0FBQ0Q7RUFDRSx3QkFBd0I7Q0FDekI7QUFDRDtFQUNFLG9CQUFvQjtDQUNyQjtBQUNEO0VBQ0Usc0JBQXNCO0NBQ3ZCO0FBQ0Q7RUFDRSw0QkFBNEI7Q0FDN0I7QUFDRDtFQUNFLHdCQUF3QjtDQUN6QjtBQUNEO0VBQ0UsMEJBQTBCO0NBQzNCO0FBQ0Q7O0VBRUUsK0JBQStCO0NBQ2hDO0FBQ0Q7O0VBRUUsOEJBQThCO0NBQy9CO0FBQ0Q7O0VBRUUsdUJBQXVCO0NBQ3hCO0FBQ0Q7O0VBRUUsd0JBQXdCO0NBQ3pCO0FBQ0Q7O0VBRUUsb0JBQW9CO0NBQ3JCO0FBQ0Q7O0VBRUUsc0JBQXNCO0NBQ3ZCO0FBQ0Qsb0JBQW9CO0FBQ3BCO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxtQkFBbUI7Q0FDcEI7QUFDRDtFQUNFLGtCQUFrQjtDQUNuQjtBQUNEO0VBQ0Usb0JBQW9CO0NBQ3JCO0FBQ0Q7RUFDRSxlQUFpQztFQUFqQyxpQ0FBaUM7Q0FDbEM7QUFDRDtFQUNFLHdCQUF3QjtDQUN6QjtBQUNEO0VBQ0Usa0JBQWtCO0NBQ25CO0FBQ0Q7RUFDRSxrQkFBa0I7Q0FDbkI7QUFDRDtFQUNFLG1CQUFtQjtDQUNwQjtBQUNEO0VBQ0Usb0RBQXFDO0VBQXJDLHFDQUFxQztFQUNyQywwQkFBK0M7RUFBL0MsK0NBQStDO0VBQy9DLGFBQWE7RUFDYixtQkFBbUI7Q0FDcEI7O0FBRUQsZ0JBQWdCO0FBQ2hCO0VBQ0UsbUJBQW1CO0NBQ3BCO0FBQ0Q7RUFDRSxjQUFjO0NBQ2Y7QUFDRDtFQUNFLGFBQWE7Q0FDZDs7QUFFRCxZQUFZO0FBQ1o7RUFDRSwwQkFBc0M7RUFBdEMsc0NBQXNDO0VBQ3RDLG1CQUE0QztFQUE1Qyw0Q0FBNEM7RUFDNUMsd0JBQXdCO0VBQ3hCLGVBQWU7Q0FDaEI7QUFDRDtFQUNFLGVBQWU7RUFDZixzQkFBc0I7Q0FDdkI7QUFDRDtFQUNFLGVBQWU7RUFDZixzQkFBc0I7Q0FDdkI7O0FBRUQsc0NBQXNDO0FBQ3RDO0VBQ0UsMEJBQStDO0VBQS9DLCtDQUErQztDQUNoRDtBQUNEO0VBQ0UsMEJBQTBCO0NBQzNCO0FBQ0Q7RUFDRSwwQkFBMEI7Q0FDM0I7QUFDRDtFQUNFLDBCQUEwQjtDQUMzQjs7QUFFRCxtQkFBbUI7QUFDbkI7RUFDRSxpQ0FBZ0M7RUFBaEMsZ0NBQWdDO0VBQ2hDLGtCQUFrQjtFQUNsQixtQkFBZ0M7RUFBaEMsZ0NBQWdDO0VBQ2hDLDBCQUFzQztFQUF0QyxzQ0FBc0M7RUFDdEMsbUJBQTRDO0VBQTVDLDRDQUE0QztFQUM1QyxjQUFjO0VBQ2QsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxlQUFlO0NBQ2hCO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCLENBQUMsNkNBQTZDO0NBQ2hFO0FBQ0Q7RUFDRSx3QkFBd0I7RUFDeEIsbUJBQW1CO0VBQ25CLHFCQUFxQjtDQUN0QjtBQUNEO0VBQ0UsbUJBQW1CO0VBQ25CLDBCQUEwQjtDQUMzQjtBQUNEO0VBQ0UsZUFBZTtFQUNmLGVBQTJDO0VBQTNDLDJDQUEyQztFQUMzQyxpQkFBaUI7Q0FDbEI7QUFDRCxrQkFBa0I7QUFDbEI7RUFDRSxzQkFBc0I7RUFDdEIsY0FBYztDQUNmO0FBQ0Q7RUFDRSxvQkFBb0I7RUFDcEIsbUJBQW1CO0NBQ3BCO0FBQ0Q7RUFDRSxVQUFVO0NBQ1g7QUFDRDtFQUNFLDJCQUEyQjtDQUM1QjtBQUNEO0VBQ0UsMkJBQTJCO0NBQzVCO0FBQ0Q7RUFDRSwwQkFBc0M7RUFBdEMsc0NBQXNDO0VBQ3RDLDBCQUFzQztFQUF0QyxzQ0FBc0M7RUFDdEMsZ0JBQWdCO0NBQ2pCOztBQUVELFdBQVc7QUFDWDtFQUNFLFlBQVk7RUFDWiwwQkFBMEI7Q0FDM0I7QUFDRDtFQUNFLHNCQUFzQjtDQUN2QjtBQUNELHNDQUFzQztBQUN0Qzs7OztFQUlFLGlDQUE2QztFQUE3Qyw2Q0FBNkM7Q0FDOUM7QUFDRDs7OztFQUlFLHFDQUFxQztDQUN0QztBQUNELGtCQUFrQjtBQUNsQjtFQUNFLDBCQUE4QztFQUE5Qyw4Q0FBOEM7Q0FDL0M7O0FBRUQsa0JBQWtCO0FBQ2xCO0VBQ0UsWUFBWTtFQUNaLFlBQVk7RUFDWixpQkFBaUI7RUFDakIsd0JBQXdCO0VBQ3hCLG1CQUFtQjtFQUNuQiwwQkFBc0M7RUFBdEMsc0NBQXNDO0NBQ3ZDO0FBQ0Q7RUFDRSxVQUFVO0VBQ1YsZ0JBQWdCO0VBQ2hCLDBCQUErQztFQUEvQywrQ0FBK0M7RUFDL0MsZ0NBQXFEO0VBQXJELHFEQUFxRDtFQUNyRCx3QkFBd0I7Q0FDekI7O0FBRUQsY0FBYztBQUNkO0VBQ0UsbUJBQW1CO0VBQ25CLE9BQU87RUFDUCxpQ0FBeUI7VUFBekIseUJBQXlCO0VBQ3pCLGdDQUF3QjtVQUF4Qix3QkFBd0I7Q0FDekI7O0FBRUQsd0RBQXdEO0FBQ3hEO0VBQ0UsNEJBQStDO0VBQS9DLCtDQUErQztDQUNoRDs7QUFFRDtFQUNFLFdBQVc7RUFDWCxlQUFlO0NBQ2hCOztBQUVEO0VBQ0UsYUFBOEI7RUFBOUIsOEJBQThCO0NBQy9COztBQUVELDJCQUEyQjtBQUMzQjtFQUNFO0lBQ0UsNENBQW9DO1lBQXBDLG9DQUFvQztHQUNyQzs7RUFFRDtJQUNFLHdCQUFnQjtZQUFoQixnQkFBZ0I7R0FDakI7Q0FDRjtBQVJEO0VBQ0U7SUFDRSw0Q0FBb0M7WUFBcEMsb0NBQW9DO0dBQ3JDOztFQUVEO0lBQ0Usd0JBQWdCO1lBQWhCLGdCQUFnQjtHQUNqQjtDQUNGOztBQUVEO0VBQ0Usa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQixrQkFBa0I7RUFDbEIsVUFBVTtDQUNYIiwiZmlsZSI6ImxhYi5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBCYXNpYyBjb25maWd1cmF0aW9uICovXG46cm9vdCB7XG4gIC8qIExheW91dCAqL1xuICAtLXdpZHRoLWNvbnRhaW5lcjogOTAwcHg7XG4gIC0td2lkdGgtbWluLWNvbnRhaW5lcjogMzIwcHg7XG4gIC0taGVpZ2h0LW1pbi1oZWFkZXItZm9vdGVyOiA4dmg7XG4gIC0tcGFkZGluZy1pbnRlcm5hbDogMjRweDtcbiAgLS1ib3JkZXItcmFkaXVzLWNvbnRhaW5lcjogNXB4O1xuICAtLWJvcmRlci1yYWRpdXMtY29udGVudDogNHB4O1xuICAvKiBUeXBvZ3JhcGh5ICovXG4gIC0tZm9udC1mYW1pbHk6IFwiQXJpYWxcIiwgc2Fucy1zZXJpZjtcbiAgLS1mb250LWZhbWlseS1tb25vOiBEcm9pZCBNb25vLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZTtcbiAgLS1mb250LXNpemU6IDE4cHg7XG4gIC0tbGluZS1oZWlnaHQ6IDEuNGVtO1xuICAvKiAobGluZSBoZWlnaHQgaXMgc3BlY2lmaWVkIGluIGVtIHNvIHRoYXQgaXQgYWRhcHRzIHRvIHZhcnlpbmcgZm9udCBzaXplcykgKi9cbiAgLS1wYXJhZ3JhcGgtbWFyZ2luLXZlcnRpY2FsOiB2YXIoLS1mb250LXNpemUpO1xuICAvKiBDb2xvcnMgKi9cbiAgLS1jb2xvci1ib3JkZXI6ICNlNWU1ZTU7XG4gIC0tY29sb3ItYm9yZGVyLWludGVybmFsOiAjZWZlZmVmO1xuICAtLWNvbG9yLWdyYXktYmFja2dyb3VuZDogI2Y4ZjhmODtcbiAgLS1jb2xvci1ncmF5LWNvbnRlbnQ6ICM4ZDhkOGQ7XG59XG5cbi8qIFNldCBib3ggbW9kZWwgdG8gYm9yZGVyLWJveCBnbG9iYWxseSAqL1xuOnJvb3Qge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuKiwgKjo6YmVmb3JlLCAqOjphZnRlciB7XG4gIGJveC1zaXppbmc6IGluaGVyaXQ7XG59XG5cbi8qIENvbnRlbnQgbGF5b3V0ICovXG5ib2R5IHtcbiAgbWFyZ2luOiAwO1xufVxuXG4uY29udGFpbmVyIHtcbiAgbWluLXdpZHRoOiB2YXIoLS13aWR0aC1taW4tY29udGFpbmVyKTtcbiAgbWluLWhlaWdodDogdmFyKC0taGVpZ2h0LW1pbi1oZWFkZXItZm9vdGVyKTtcbiAgLyogVXNlIHBhZ2Utc3R5bGUgbGF5b3V0IGJ5IGRlZmF1bHQgKi9cbiAgbWFyZ2luOiB2YXIoLS1wYWRkaW5nLWludGVybmFsKSBhdXRvO1xuICB3aWR0aDogdmFyKC0td2lkdGgtY29udGFpbmVyKTtcbn1cbmhlYWRlciwgZm9vdGVyLCBtYWluIHtcbiAgcGFkZGluZzogdmFyKC0tcGFkZGluZy1pbnRlcm5hbCk7XG59XG4vKiBJbmRpdmlkdWFsIHBhcnRzOiBIZWlnaHQsIGJvcmRlcnMgYW5kIGJhY2tncm91bmQgKi9cbmhlYWRlciwgZm9vdGVyIHtcbiAgbWluLWhlaWdodDogdmFyKC0taGVpZ2h0LW1pbi1oZWFkZXItZm9vdGVyKTtcbn1cbm1haW4ge1xuICBtaW4taGVpZ2h0OiB2YXIoLS1oZWlnaHQtbWluLWhlYWRlci1mb290ZXIpO1xufVxuXG4vKiBGdWxsc2NyZWVuIGxheW91dCAqL1xuLmNvbnRhaW5lci5mdWxsc2NyZWVuIHtcbiAgLyogRnVsbCBzY3JlZW4gbWludXMgbWFyZ2lucyAqL1xuICBtYXJnaW46IHZhcigtLXBhZGRpbmctaW50ZXJuYWwpO1xuICBtaW4taGVpZ2h0OiBjYWxjKDEwMHZoIC0gMip2YXIoLS1wYWRkaW5nLWludGVybmFsKSk7XG4gIHdpZHRoOiBjYWxjKDEwMHZ3IC0gMip2YXIoLS1wYWRkaW5nLWludGVybmFsKSk7XG4gIC8qIERpc3BsYXkgY29udGVudCB1c2luZyBmbGV4Ym94ZXMgKi9cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cbi5jb250YWluZXIuZnVsbHNjcmVlbiBtYWluIHtcbiAgLyogRmxleCBwb3NpdGlvbmluZyAqL1xuICBmbGV4OiAxO1xufVxuXG4vKiBGcmFtZWxlc3MgbGF5b3V0ICovXG4uY29udGFpbmVyLmZyYW1lbGVzcyB7XG4gIG1hcmdpbjogMDtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiAwO1xufVxuLmNvbnRhaW5lci5mdWxsc2NyZWVuLmZyYW1lbGVzcyB7XG4gIHdpZHRoOiAxMDB2dztcbiAgbWluLWhlaWdodDogMTAwdmg7XG59XG5cbi8qIFJlbW92ZSBmcmFtZSBvbiBzbWFsbCBzY3JlZW5zICovXG5AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpLCAobWF4LWhlaWdodDogNjAwcHgpIHtcbiAgLmNvbnRhaW5lci5mdWxsc2NyZWVuIHtcbiAgICBtYXJnaW46IDA7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgd2lkdGg6IDEwMHZ3O1xuICAgIG1pbi1oZWlnaHQ6IDEwMHZoO1xuICB9XG59XG5cbi8qIEZsZXhib3ggZml4IGZvciBJRTExLCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL3BoaWxpcHdhbHRvbi9mbGV4YnVncyAqL1xuQG1lZGlhIGFsbCBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBub25lKSwgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgYm9keSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuICAuY29udGFpbmVyLmZ1bGxzY3JlZW4ge1xuICAgIC8qIElFMTEgbWlzY2FsY3VsYXRlcyB0aGUgaGVpZ2h0LCBzbyBhZGQgc29tZSBzbGFjayAqL1xuICAgIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSAzKnZhcigtLXBhZGRpbmctaW50ZXJuYWwpKTtcbiAgfVxufVxuXG4vKiBCb3JkZXJzIGFuZCBiYWNrZ3JvdW5kcyAqL1xuLmNvbnRhaW5lciB7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbG9yLWJvcmRlcik7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMtY29udGFpbmVyKTtcbn1cbmhlYWRlciB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jb2xvci1ib3JkZXItaW50ZXJuYWwpO1xufVxuZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWNvbG9yLWJvcmRlci1pbnRlcm5hbCk7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWdyYXktYmFja2dyb3VuZCk7XG59XG5cbi8qIFR5cG9ncmFwaHkgKi9cbjpyb290IHtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5KTtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUpO1xuICBsaW5lLWhlaWdodDogdmFyKC0tbGluZS1oZWlnaHQpO1xufVxuaGVhZGVyLCBmb290ZXIsIG1haW4ge1xuICAvKiBTZXQgZGlzcGxheSBzdHlsZSBleHBsaWNpdGx5IGZvciBsZWdhY3kgYnJvd3NlcnNcbiAgICAgdGhhdCBhcmUgdW5mYW1pbGlhciB3aXRoIHRoZXNlIGVsZW1lbnRzICovXG4gIGRpc3BsYXk6IGJsb2NrO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5oMSwgaDIsIGgzIHtcbiAgbGluZS1oZWlnaHQ6IHZhcigtLWxpbmUtaGVpZ2h0KTtcbn1cbmhyIHtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItdG9wOiAycHggc29saWQgdmFyKC0tY29sb3ItYm9yZGVyKVxufVxuXG4vKiBTcGVjaWFsIGVsZW1lbnRzOiBLZXlib2FyZCBidXR0b25zICovXG5rYmQge1xuICAvKiBQb3NpdGlvbmluZyAqL1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1pbi13aWR0aDogMS41cmVtO1xuICBtaW4taGVpZ2h0OiAxLjVyZW07XG4gIHBhZGRpbmc6IDAgMC4zcmVtO1xuICBwYWRkaW5nLXRvcDogMC4xNXJlbTtcbiAgLyogRm9udHMgKi9cbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5LW1vbm8pO1xuICBmb250LXNpemU6IDAuOXJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAvKiBCYWNrZ3JvdW5kIGFuZCBib3JkZXIgKi9cbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMtY29udGVudCk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxODAsIDE4MCwgMTgwKTtcbn1cbmtiZC5iaWcge1xuICBmb250LXNpemU6IDEuNHJlbTtcbiAgcGFkZGluZy10b3A6IDAuMzc1cmVtO1xuICBib3JkZXItcmFkaXVzOiAwLjEyNXJlbTtcbn1cblxuLyogQWxpZ25tZW50IGhlbHBlcnMgKi9cbi53LTEwMCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuLnctcyB7XG4gIG1heC13aWR0aDogdmFyKC0td2lkdGgtbWluLWNvbnRhaW5lcik7XG59XG4udy1tIHtcbiAgbWF4LXdpZHRoOiBjYWxjKDEuNSAqIHZhcigtLXdpZHRoLW1pbi1jb250YWluZXIpKTtcbn1cbi53LWwge1xuICBtYXgtd2lkdGg6IGNhbGMoMiAqIHZhcigtLXdpZHRoLW1pbi1jb250YWluZXIpKTtcbn1cbi8qIEJsb2NrIGFsaWdubWVudCBiYXNlZCBvbiBmbGV4Ym94ICovXG4uY29udGVudC12ZXJ0aWNhbC10b3AsXG4uY29udGVudC12ZXJ0aWNhbC1jZW50ZXIsXG4uY29udGVudC12ZXJ0aWNhbC1ib3R0b20sXG4uY29udGVudC1ob3Jpem9udGFsLWxlZnQsXG4uY29udGVudC1ob3Jpem9udGFsLWNlbnRlcixcbi5jb250ZW50LWhvcml6b250YWwtcmlnaHQsXG4uY29udGVudC1ob3Jpem9udGFsLXNwYWNlLWJldHdlZW4sXG4uY29udGVudC12ZXJ0aWNhbC1zcGFjZS1iZXR3ZWVuLFxuLmNvbnRlbnQtaG9yaXpvbnRhbC1zcGFjZS1hcm91bmQsXG4uY29udGVudC12ZXJ0aWNhbC1zcGFjZS1hcm91bmQge1xuICBkaXNwbGF5OiBmbGV4O1xufVxuLmNvbnRlbnQtdmVydGljYWwtdG9wIHtcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG59XG4uY29udGVudC12ZXJ0aWNhbC1jZW50ZXIge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuLmNvbnRlbnQtdmVydGljYWwtYm90dG9tIHtcbiAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xufVxuLmNvbnRlbnQtaG9yaXpvbnRhbC1sZWZ0IHtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xufVxuLmNvbnRlbnQtaG9yaXpvbnRhbC1jZW50ZXIge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cbi5jb250ZW50LWhvcml6b250YWwtcmlnaHQge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xufVxuLmNvbnRlbnQtaG9yaXpvbnRhbC1zcGFjZS1iZXR3ZWVuLFxuLmNvbnRlbnQtdmVydGljYWwtc3BhY2UtYmV0d2VlbiB7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcbn1cbi5jb250ZW50LWhvcml6b250YWwtc3BhY2UtYXJvdW5kLFxuLmNvbnRlbnQtdmVydGljYWwtc3BhY2UtYXJvdW5kIHtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XG59XG4uY29udGVudC12ZXJ0aWNhbC1zcGFjZS1hcm91bmQsXG4uY29udGVudC12ZXJ0aWNhbC1zcGFjZS1iZXR3ZWVuIHtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cbi5jb250ZW50LXZlcnRpY2FsLXNwYWNlLWJldHdlZW4uY29udGVudC1ob3Jpem9udGFsLXJpZ2h0LFxuLmNvbnRlbnQtdmVydGljYWwtc3BhY2UtYXJvdW5kLmNvbnRlbnQtaG9yaXpvbnRhbC1yaWdodCB7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xufVxuLmNvbnRlbnQtdmVydGljYWwtc3BhY2UtYmV0d2Vlbi5jb250ZW50LWhvcml6b250YWwtY2VudGVyLFxuLmNvbnRlbnQtdmVydGljYWwtc3BhY2UtYXJvdW5kLmNvbnRlbnQtaG9yaXpvbnRhbC1jZW50ZXIge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuLmNvbnRlbnQtdmVydGljYWwtc3BhY2UtYmV0d2Vlbi5jb250ZW50LWhvcml6b250YWwtcmlnaHQsXG4uY29udGVudC12ZXJ0aWNhbC1zcGFjZS1hcm91bmQuY29udGVudC1ob3Jpem9udGFsLXJpZ2h0IHtcbiAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xufVxuLyogVGV4dCBhbGlnbm1lbnQgKi9cbi50ZXh0LWxlZnQge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuLnRleHQtY2VudGVyIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLnRleHQtcmlnaHQge1xuICB0ZXh0LWFsaWduOiByaWdodDtcbn1cbi50ZXh0LWp1c3RpZnkge1xuICB0ZXh0LWFsaWduOiBqdXN0aWZ5O1xufVxuLnRleHQtbXV0ZWQge1xuICBjb2xvcjogdmFyKC0tY29sb3ItZ3JheS1jb250ZW50KTtcbn1cbi50ZXh0LW11dGVkIGEge1xuICBjb2xvcjogcmdiKDYwLCA4OSwgMTU2KTtcbn1cbnNtYWxsLCAuc21hbGwge1xuICBmb250LXNpemU6IDAuOXJlbTtcbn1cbi5mb250LXdlaWdodC1ib2xkIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4uZm9udC1pdGFsaWMge1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5jb2RlIHtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5LW1vbm8pO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1ncmF5LWJhY2tncm91bmQpO1xuICBwYWRkaW5nOiAycHg7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbn1cblxuLyogVmlzaWJpbGl0eSAqL1xuLmludmlzaWJsZSB7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cbi5oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLmhpZGUtaWYtZW1wdHk6ZW1wdHkge1xuICBkaXNwbGF5OiBub25lXG59XG5cbi8qIEFsZXJ0cyAqL1xuLmFsZXJ0IHtcbiAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tY29sb3ItYm9yZGVyKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyLXJhZGl1cy1jb250ZW50KTtcbiAgcGFkZGluZzogMTZweCAxNnB4IDE0cHg7XG4gIG1hcmdpbjogMTZweCAwO1xufVxuLmFsZXJ0LmFsZXJ0LWRhbmdlciB7XG4gIGNvbG9yOiAjYTAyYzJjO1xuICBib3JkZXItY29sb3I6ICNhMDJjMmM7XG59XG4uYWxlcnQuYWxlcnQtd2FybmluZyB7XG4gIGNvbG9yOiAjZjZhOTAyO1xuICBib3JkZXItY29sb3I6ICNmZmI0MDA7XG59XG5cbi8qIEJhY2tncm91bmQgc3R5bGVzIChleHBlcmltZW50YWwpICovXG4uYWxlcnQsIC5iYWNrZ3JvdW5kLWRhcmsge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1ncmF5LWJhY2tncm91bmQpO1xufVxuLmFsZXJ0LmFsZXJ0LWRhbmdlciwgLmJhY2tncm91bmQtZGFuZ2VyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U5YWZhZjtcbn1cbi5hbGVydC5hbGVydC13YXJuaW5nLCAuYmFja2dyb3VuZC13YXJuaW5nIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZTZhNTtcbn1cbi5iYWNrZ3JvdW5kLW9rIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2MzZTZjYjtcbn1cblxuLyogRm9ybSBlbGVtZW50cyAqL1xuaW5wdXQsIHNlbGVjdCwgYnV0dG9uLCB0ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseSk7XG4gIGZvbnQtc2l6ZTogMC45cmVtO1xuICBsaW5lLWhlaWdodDogdmFyKC0tbGluZS1oZWlnaHQpO1xuICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1jb2xvci1ib3JkZXIpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXItcmFkaXVzLWNvbnRlbnQpO1xuICBtYXJnaW46IDhweCAwO1xuICBwYWRkaW5nOiA4cHg7XG59XG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBtYXJnaW46IDAgMTBweDtcbn1cbmlucHV0W3R5cGU9XCJyYW5nZVwiXSB7XG4gIGJvcmRlcjogbm9uZTtcbn1cbmlucHV0ICsgbGFiZWwge1xuICBtYXJnaW4tbGVmdDogMnB4O1xufVxuc2VsZWN0IHtcbiAgcGFkZGluZzogOHB4IDVweDsgLyogc2VsZWN0cyBoYXZlIGEgd2VpcmQgdmVydGljYWwgYWxpZ25tZW50ICovXG59XG5idXR0b24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBwYWRkaW5nOiA4cHggOHB4IDZweDtcbn1cbmJ1dHRvbjpob3ZlciB7XG4gIGJvcmRlci1jb2xvcjogI2RkZDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZmNmYztcbn1cbnRleHRhcmVhIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogdmFyKC0tcGFyYWdyYXBoLW1hcmdpbi12ZXJ0aWNhbCkgMDtcbiAgcmVzaXplOiB2ZXJ0aWNhbDtcbn1cbi8qIElucHV0IGdyb3VwcyAqL1xuLmlucHV0LWdyb3VwIHtcbiAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xuICBtYXJnaW46IDhweCAwO1xufVxuLmlucHV0LWdyb3VwICoge1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICBib3JkZXItcmFkaXVzOiAwcHg7XG59XG4uaW5wdXQtZ3JvdXAgaW5wdXQge1xuICBtYXJnaW46IDA7XG59XG4uaW5wdXQtZ3JvdXAgKjpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci1yYWRpdXM6IDRweCAwIDAgNHB4O1xufVxuLmlucHV0LWdyb3VwICo6bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAgNHB4IDRweCAwO1xufVxuLmlucHV0LWdyb3VwIC5pbnB1dC1ncm91cC1hZGRvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJvcmRlcik7XG4gIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWNvbG9yLWJvcmRlcik7XG4gIHBhZGRpbmc6IDAgMTBweDtcbn1cblxuLyogVGFibGUgKi9cbnRhYmxlIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG59XG50YWJsZSB0ZCwgdGFibGUgdGgge1xuICBwYWRkaW5nOiAxMHB4IDhweCA4cHg7XG59XG4vKiBUYWJsZSBib3JkZXJzIChleGNlcHQgZm9yIHBsYWluKSAqL1xudGFibGU6bm90KC50YWJsZS1wbGFpbikgPiB0ciA+IHRkLFxudGFibGU6bm90KC50YWJsZS1wbGFpbikgPiB0ciA+IHRoLFxudGFibGU6bm90KC50YWJsZS1wbGFpbikgPiB0Ym9keSA+IHRyID4gdGQsXG50YWJsZTpub3QoLnRhYmxlLXBsYWluKSA+IHRib2R5ID4gdHIgPiB0aCB7XG4gIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1jb2xvci1ib3JkZXIpO1xufVxudGFibGU6bm90KC50YWJsZS1wbGFpbikgPiB0cjpsYXN0LWNoaWxkID4gdGQsXG50YWJsZTpub3QoLnRhYmxlLXBsYWluKSA+IHRyOmxhc3QtY2hpbGQgPiB0aCxcbnRhYmxlOm5vdCgudGFibGUtcGxhaW4pID4gdGJvZHkgPiB0cjpsYXN0LWNoaWxkID4gdGQsXG50YWJsZTpub3QoLnRhYmxlLXBsYWluKSA+IHRib2R5ID4gdHI6bGFzdC1jaGlsZCA+IHRoIHtcbiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xufVxuLyogU3RyaXBlZCByb3dzICovXG50YWJsZS50YWJsZS1zdHJpcGVkIHRyOm50aC1jaGlsZChvZGQpIHRkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItYm9yZGVyLWludGVybmFsKVxufVxuXG4vKiBQcm9ncmVzcyBiYXIgKi9cbi5wcm9ncmVzcyB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDhweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgbWFyZ2luOiAwLjJyZW0gMCAwLjRyZW07XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sb3ItYm9yZGVyKTtcbn1cbi5wcm9ncmVzcyAucHJvZ3Jlc3MtYmFyIHtcbiAgd2lkdGg6IDAlO1xuICBtaW4taGVpZ2h0OiA4cHg7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWdyYXktYmFja2dyb3VuZCk7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWNvbG9yLWJvcmRlci1pbnRlcm5hbCk7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xufVxuXG4vKiBQb3BvdmVycyAqL1xuLnBvcG92ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjVzO1xuICBhbmltYXRpb24tbmFtZTogcG9wb3Zlcjtcbn1cblxuLyogV2lkdGgsIGZvciBzb21lIHJlYXNvbiwgbmVlZHMgdG8gYmUgc2V0IGV4cGxpY2l0bHkgKi9cbi5jb250YWluZXIuZnVsbHNjcmVlbiAucG9wb3ZlciB7XG4gIHdpZHRoOiBjYWxjKDEwMHZ3IC0gMip2YXIoLS1wYWRkaW5nLWludGVybmFsKSk7XG59XG5cbi5wb3BvdmVyID4gKiB7XG4gIHdpZHRoOiA4MCU7XG4gIG1hcmdpbjogMCBhdXRvO1xufVxuXG4uY29udGFpbmVyOm5vdCguZnVsbHNjcmVlbikgLnBvcG92ZXIge1xuICB3aWR0aDogdmFyKC0td2lkdGgtY29udGFpbmVyKTtcbn1cblxuLyogU2xpZGUgaW4gZnJvbSB0aGUgdG9wICovXG5Aa2V5ZnJhbWVzIHBvcG92ZXIge1xuICBmcm9tIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0xMDAlLCAwKTtcbiAgfVxuXG4gIHRvIHtcbiAgICB0cmFuc2Zvcm06IG5vbmU7XG4gIH1cbn1cblxuLnBvcG92ZXIgPiAuYWxlcnQ6Zmlyc3QtY2hpbGQge1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nLXRvcDogMjRweDtcbiAgdG9wOiAtOHB4O1xufVxuXG4iXX0= */ diff --git a/app/utils/labjs/protocols/custom.js b/app/utils/labjs/protocols/custom.js index 48216919..38ee3677 100644 --- a/app/utils/labjs/protocols/custom.js +++ b/app/utils/labjs/protocols/custom.js @@ -32,7 +32,13 @@ export const buildCustomTimeline = () => ({ protocol_condition_second_title: `Houses`, protocol_condition_second: `If you see a house, press “9”.`, overview_links: [], - background_links: [{name: 'Link 1', address: 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn'}], + background_links: [ + { + name: 'Link 1', + address: + 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn' + } + ], protocal_links: [], params: { imageHeight: '500px', @@ -73,7 +79,7 @@ export const buildCustomTimeline = () => ({ type: 4, response: '' }, - stimuli: [], + stimuli: [] }, mainTimeline: ['intro', 'faceHouseTimeline', 'end'], // array of trial and timeline ids trials: { diff --git a/app/utils/labjs/protocols/faceshouses.js b/app/utils/labjs/protocols/faceshouses.js index 46faa6a5..66f610e3 100644 --- a/app/utils/labjs/protocols/faceshouses.js +++ b/app/utils/labjs/protocols/faceshouses.js @@ -8,20 +8,76 @@ const facesDir = path.join(rootFolder, 'assets', 'face_house', 'faces'); const housesDir = path.join(rootFolder, 'assets', 'face_house', 'houses'); const fixation = path.join(rootFolder, 'assets', 'common', 'fixationcross.png'); -const stimuli = ['Face1', 'Face2', 'Face3', 'Face4', 'Face5', 'Face6', 'Face7', 'Face8', 'Face9', 'Face10', -'Face11', 'Face12', 'Face13', 'Face14', 'Face15', 'Face16', 'Face17', 'Face18', 'Face19', 'Face20', -'Face21', 'Face22', 'Face23', 'Face24', 'Face25', 'Face26', 'Face27', 'Face28', 'Face29', 'Face30', -'House1', 'House2', 'House3', 'House4', 'House5', 'House6', 'House7', 'House8', 'House9', 'House10', -'House11', 'House12', 'House13', 'House14', 'House15', 'House16', 'House17', 'House18', 'House19', 'House20', -'House21', 'House22', 'House23', 'House24', 'House25', 'House26', 'House27', 'House28', 'House29', 'House30'].map(s => ({ +const stimuli = [ + 'Face1', + 'Face2', + 'Face3', + 'Face4', + 'Face5', + 'Face6', + 'Face7', + 'Face8', + 'Face9', + 'Face10', + 'Face11', + 'Face12', + 'Face13', + 'Face14', + 'Face15', + 'Face16', + 'Face17', + 'Face18', + 'Face19', + 'Face20', + 'Face21', + 'Face22', + 'Face23', + 'Face24', + 'Face25', + 'Face26', + 'Face27', + 'Face28', + 'Face29', + 'Face30', + 'House1', + 'House2', + 'House3', + 'House4', + 'House5', + 'House6', + 'House7', + 'House8', + 'House9', + 'House10', + 'House11', + 'House12', + 'House13', + 'House14', + 'House15', + 'House16', + 'House17', + 'House18', + 'House19', + 'House20', + 'House21', + 'House22', + 'House23', + 'House24', + 'House25', + 'House26', + 'House27', + 'House28', + 'House29', + 'House30' +].map(s => ({ condition: s.startsWith('Face') ? 'Face' : 'House', dir: s.startsWith('Face') ? facesDir : housesDir, filename: `${s}.jpg`, name: s, response: s.startsWith('Face') ? '1' : '9', phase: 'main', - type: s.startsWith('Face') ? EVENTS.STIMULUS_1 : EVENTS.STIMULUS_2, -})) + type: s.startsWith('Face') ? EVENTS.STIMULUS_1 : EVENTS.STIMULUS_2 +})); // phase: ['Face1', 'House1'].includes(s) ? 'practice' : 'main', @@ -52,8 +108,9 @@ export const buildN170Timeline = () => ({ background_links: [ { name: 'Link 1', - address: 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn', - }, + address: + 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn' + } ], protocal_links: [], params: { @@ -75,42 +132,42 @@ export const buildN170Timeline = () => ({ dir: facesDir, title: 'Face', type: EVENTS.STIMULUS_1, - response: '1', + response: '1' }, stimulus2: { dir: housesDir, title: 'House', type: EVENTS.STIMULUS_2, - response: '9', + response: '9' }, stimulus3: { dir: '', title: '', type: 3, - response: '', + response: '' }, stimulus4: { dir: '', title: '', type: 4, - response: '', + response: '' }, - stimuli, + stimuli }, mainTimeline: ['intro', 'faceHouseTimeline', 'end'], // array of trial and timeline ids trials: { intro: { type: 'callback-html-display', id: 'intro', - post_trial_gap: 1000, + post_trial_gap: 1000 }, end: { id: 'end', type: 'callback-html-display', stimulus: 'Thanks for participating. Press any key to continue', response_ends_trial: true, - post_trial_gap: 500, - }, + post_trial_gap: 500 + } }, timelines: { faceHouseTimeline: { @@ -120,13 +177,13 @@ export const buildN170Timeline = () => ({ id: 'interTrial', type: 'callback-image-display', stimulus: fixation, - response_ends_trial: false, + response_ends_trial: false }, { id: 'trial', - response_ends_trial: false, - }, - ], - }, - }, + response_ends_trial: false + } + ] + } + } }); diff --git a/app/utils/labjs/protocols/multi.js b/app/utils/labjs/protocols/multi.js index 4184243d..47b323da 100644 --- a/app/utils/labjs/protocols/multi.js +++ b/app/utils/labjs/protocols/multi.js @@ -35,12 +35,13 @@ export const buildMultiTimeline = () => ({ { name: 'Link 1', address: - 'https://www.scientificamerican.com/podcast/episode/the-myth-of-multitasking-09-07-15/', + 'https://www.scientificamerican.com/podcast/episode/the-myth-of-multitasking-09-07-15/' }, { name: 'Link 2', - address: 'https://www.scientificamerican.com/article/multitasking-two-tasks/', - }, + address: + 'https://www.scientificamerican.com/article/multitasking-two-tasks/' + } ], protocal_links: [], params: { @@ -55,29 +56,29 @@ export const buildMultiTimeline = () => ({ dir: facesDir, title: 'No switching', type: EVENTS.STIMULUS_1, - response: '1', + response: '1' }, stimulus2: { dir: housesDir, title: 'Switching', type: EVENTS.STIMULUS_2, - response: '9', - }, + response: '9' + } }, mainTimeline: ['intro', 'multiTaskingTimeline', 'end'], // array of trial and timeline ids trials: { intro: { type: 'callback-html-display', id: 'intro', - post_trial_gap: 1000, + post_trial_gap: 1000 }, end: { id: 'end', type: 'callback-html-display', stimulus: 'Thanks for participating. Press any key to continue', response_ends_trial: true, - post_trial_gap: 500, - }, + post_trial_gap: 500 + } }, timelines: { faceHouseTimeline: { @@ -87,13 +88,13 @@ export const buildMultiTimeline = () => ({ id: 'interTrial', type: 'callback-image-display', stimulus: fixation, - response_ends_trial: false, + response_ends_trial: false }, { id: 'trial', - response_ends_trial: false, - }, - ], - }, - }, + response_ends_trial: false + } + ] + } + } }); diff --git a/app/utils/labjs/protocols/search.js b/app/utils/labjs/protocols/search.js index 710d5d43..eb3af316 100644 --- a/app/utils/labjs/protocols/search.js +++ b/app/utils/labjs/protocols/search.js @@ -48,29 +48,29 @@ export const buildSearchTimeline = () => ({ dir: facesDir, title: '5 and 10 letters', type: EVENTS.STIMULUS_1, - response: '1', + response: '1' }, stimulus2: { dir: housesDir, title: '15 and 20 letters', type: EVENTS.STIMULUS_2, - response: '9', - }, + response: '9' + } }, mainTimeline: ['intro', 'visualSearchTimeline', 'end'], // array of trial and timeline ids trials: { intro: { type: 'callback-html-display', id: 'intro', - post_trial_gap: 1000, + post_trial_gap: 1000 }, end: { id: 'end', type: 'callback-html-display', stimulus: 'Thanks for participating. Press any key to continue', response_ends_trial: true, - post_trial_gap: 500, - }, + post_trial_gap: 500 + } }, timelines: { faceHouseTimeline: { @@ -80,13 +80,13 @@ export const buildSearchTimeline = () => ({ id: 'interTrial', type: 'callback-image-display', stimulus: fixation, - response_ends_trial: false, + response_ends_trial: false }, { id: 'trial', - response_ends_trial: false, - }, - ], - }, - }, + response_ends_trial: false + } + ] + } + } }); diff --git a/app/utils/labjs/protocols/stroop.js b/app/utils/labjs/protocols/stroop.js index a0173931..36117c90 100644 --- a/app/utils/labjs/protocols/stroop.js +++ b/app/utils/labjs/protocols/stroop.js @@ -38,8 +38,8 @@ export const buildStroopTimeline = () => ({ { name: 'Link 1', address: - 'https://www.psychologytoday.com/us/blog/play-in-mind/201204/when-red-looks-blue-and-yes-means-no', - }, + 'https://www.psychologytoday.com/us/blog/play-in-mind/201204/when-red-looks-blue-and-yes-means-no' + } ], protocal_links: [], params: { @@ -54,29 +54,29 @@ export const buildStroopTimeline = () => ({ dir: facesDir, title: 'Incongruent', type: EVENTS.STIMULUS_1, - response: '1', + response: '1' }, stimulus2: { dir: housesDir, title: 'Congruent', type: EVENTS.STIMULUS_2, - response: '9', - }, + response: '9' + } }, mainTimeline: ['intro', 'stroopTimeline', 'end'], // array of trial and timeline ids trials: { intro: { type: 'callback-html-display', id: 'intro', - post_trial_gap: 1000, + post_trial_gap: 1000 }, end: { id: 'end', type: 'callback-html-display', stimulus: 'Thanks for participating. Press any key to continue', response_ends_trial: true, - post_trial_gap: 500, - }, + post_trial_gap: 500 + } }, timelines: { faceHouseTimeline: { @@ -86,13 +86,13 @@ export const buildStroopTimeline = () => ({ id: 'interTrial', type: 'callback-image-display', stimulus: fixation, - response_ends_trial: false, + response_ends_trial: false }, { id: 'trial', - response_ends_trial: false, - }, - ], - }, - }, + response_ends_trial: false + } + ] + } + } }); diff --git a/app/utils/labjs/scripts/custom.js b/app/utils/labjs/scripts/custom.js index 30dcec80..db233e45 100644 --- a/app/utils/labjs/scripts/custom.js +++ b/app/utils/labjs/scripts/custom.js @@ -1,479 +1,522 @@ // Define study const studyObject = { - "title": "root", - "type": "lab.flow.Sequence", - "parameters": {}, - "plugins": [], - "metadata": {}, - "files": {}, - "responses": {}, - "content": [ + title: 'root', + type: 'lab.flow.Sequence', + parameters: {}, + plugins: [], + metadata: {}, + files: {}, + responses: {}, + content: [ { - "type": "lab.flow.Sequence", - "files": {}, - "parameters": {}, - "responses": {}, - "messageHandlers": {}, - "title": "The face-house task", - "content": [ + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'The face-house task', + content: [ { - "type": "lab.html.Screen", - "files": {}, - "parameters": {}, - "responses": { - "keypress(Space)": "continue", - "keypress(q)": "skipPractice" + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue', + 'keypress(q)': 'skipPractice' }, - "messageHandlers": {}, - "title": "Instruction", - "content": "\u003Cheader class=\"content-vertical-center content-horizontal-center\"\u003E\n \u003Ch1\u003E${this.parameters.title || \"The face-house task\"}\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class=\"content-vertical-center content-horizontal-center\"\u003E\n \n\u003C\u002Ffooter\u003E" + messageHandlers: {}, + title: 'Instruction', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003E${this.parameters.title || "The face-house task"}\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' }, { - "type": "lab.flow.Loop", - "files": {}, - "parameters": {}, - "templateParameters": [], - "sample": { - "mode": "draw-shuffle", - "n": "" + type: 'lab.flow.Loop', + files: {}, + parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle', + n: '' }, - "responses": {}, - "messageHandlers": { - "before:prepare": function anonymous( -) { -let initParameters = [...this.parameters.stimuli] || []; -initParameters = initParameters.filter(t => t.phase === 'practice') || []; -let numberTrials = this.parameters.nbPracticeTrials; -if(initParameters.length === 0){ - numberTrials = 0; -} -const randomize = this.parameters.randomize; -const trialsLength = initParameters.length; -if(numberTrials > trialsLength){ - const append = [...initParameters] - const multiply = Math.ceil(numberTrials / trialsLength); - for (let i = 0; i < multiply; i++){ - initParameters = initParameters.concat(append) - } -} + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + let initParameters = [...this.parameters.stimuli] || []; + initParameters = + initParameters.filter(t => t.phase === 'practice') || []; + let numberTrials = this.parameters.nbPracticeTrials; + if (initParameters.length === 0) { + numberTrials = 0; + } + const randomize = this.parameters.randomize; + const trialsLength = initParameters.length; + if (numberTrials > trialsLength) { + const append = [...initParameters]; + const multiply = Math.ceil(numberTrials / trialsLength); + for (let i = 0; i < multiply; i++) { + initParameters = initParameters.concat(append); + } + } -function shuffle(a) { - let j, x, i - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)) - x = a[i] - a[i] = a[j] - a[j] = x - } - return a -} + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; + } -if(randomize === 'random'){ - shuffle(initParameters); -} + if (randomize === 'random') { + shuffle(initParameters); + } -const trialConstructor = ( file ) => ({ - 'condition': file.condition, - 'image': `${file.dir}/${file.filename}`, - 'correctResponse': file.response, - 'phase': 'practice', - 'name': file.name, - 'type': file.type, - }) + const trialConstructor = file => ({ + condition: file.condition, + image: `${file.dir}/${file.filename}`, + correctResponse: file.response, + phase: 'practice', + name: file.name, + type: file.type + }); -// balance design across conditions -const conditions = Array.from(new Set(initParameters.map(p => p.condition))); -const conditionsParameters = {}; -for (const c of conditions) { - conditionsParameters[c] = initParameters.filter(p => p.condition == c) -} -const numberConditionsTrials = Math.ceil(numberTrials / conditions.length); -let balancedParameters = []; -for (let i = 0; i < numberConditionsTrials; i++){ - for (const c of conditions) { - balancedParameters = balancedParameters.concat(conditionsParameters[c][i % conditionsParameters[c].length]) - } -} -initParameters = [...balancedParameters.slice(0, numberTrials)]; + // balance design across conditions + const conditions = Array.from( + new Set(initParameters.map(p => p.condition)) + ); + const conditionsParameters = {}; + for (const c of conditions) { + conditionsParameters[c] = initParameters.filter( + p => p.condition == c + ); + } + const numberConditionsTrials = Math.ceil( + numberTrials / conditions.length + ); + let balancedParameters = []; + for (let i = 0; i < numberConditionsTrials; i++) { + for (const c of conditions) { + balancedParameters = balancedParameters.concat( + conditionsParameters[c][i % conditionsParameters[c].length] + ); + } + } + initParameters = [...balancedParameters.slice(0, numberTrials)]; -let practiceParameters = []; -for (let i = 0; i < numberTrials; i++){ - practiceParameters = practiceParameters.concat(trialConstructor(initParameters[i])) -} + let practiceParameters = []; + for (let i = 0; i < numberTrials; i++) { + practiceParameters = practiceParameters.concat( + trialConstructor(initParameters[i]) + ); + } -// assign options values to parameters of this task -this.options.templateParameters = practiceParameters; -if(randomize === 'random'){ - this.options.shuffle = true; -} else { - this.options.shuffle = false; -} -} + // assign options values to parameters of this task + this.options.templateParameters = practiceParameters; + if (randomize === 'random') { + this.options.shuffle = true; + } else { + this.options.shuffle = false; + } + } }, - "title": "Practice loop", - "shuffleGroups": [], - "template": { - "type": "lab.flow.Sequence", - "files": {}, - "parameters": {}, - "responses": {}, - "messageHandlers": {}, - "title": "Trial", - "content": [ + title: 'Practice loop', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [ { - "type": "lab.canvas.Screen", - "content": [ + type: 'lab.canvas.Screen', + content: [ { - "type": "rect", - "left": 0, - "top": 0, - "angle": 0, - "width": 10, - "height": "50", - "stroke": null, - "strokeWidth": 1, - "fill": "black" + type: 'rect', + left: 0, + top: 0, + angle: 0, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' }, { - "type": "rect", - "left": 0, - "top": 0, - "angle": 90, - "width": 10, - "height": "50", - "stroke": null, - "strokeWidth": 1, - "fill": "black" + type: 'rect', + left: 0, + top: 0, + angle: 90, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' } ], - "files": {}, - "parameters": {}, - "responses": {}, - "messageHandlers": {}, - "viewport": [ - 800, - 600 - ], - "title": "Fixation cross", - "timeout": "${parameters.iti}" + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${parameters.iti}' }, { - "type": "lab.html.Screen", - "files": {}, - "responses": {}, - "parameters": {}, - "messageHandlers": { - "before:prepare": function anonymous( -) { -// This code registers an event listener for this screen. -// We have a timeout for this screen, but we also want to record responses. -// On a keydown event, we record the key and the time of response. -// We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). -// "this" in the code means the lab.js experiment. -const responses = [... new Set(this.parameters.stimuli.map( e => (e.response)))]; -this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length-2]); -this.data.response_given = 'no'; + type: 'lab.html.Screen', + files: {}, + responses: {}, + parameters: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + // This code registers an event listener for this screen. + // We have a timeout for this screen, but we also want to record responses. + // On a keydown event, we record the key and the time of response. + // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). + // "this" in the code means the lab.js experiment. + const responses = [ + ...new Set(this.parameters.stimuli.map(e => e.response)) + ]; + this.data.trial_number = + 1 + + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); + this.data.response_given = 'no'; -this.options.events = { - 'keydown': (event) => { - if(responses.includes(event.key)){ - this.data.reaction_time = this.timer; - if(this.parameters.phase === 'task') this.data.response_given = 'yes'; - this.data.response = event.key; - if(this.data.response == this.parameters.correctResponse){ - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - this.end(); - } - } -} -}, - "run": function anonymous( -) { -this.parameters.callbackForEEG(this.parameters.type); -} + this.options.events = { + keydown: event => { + if (responses.includes(event.key)) { + this.data.reaction_time = this.timer; + if (this.parameters.phase === 'task') + this.data.response_given = 'yes'; + this.data.response = event.key; + if ( + this.data.response == + this.parameters.correctResponse + ) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + this.end(); + } + } + }; + }, + run: function anonymous() { + this.parameters.callbackForEEG(this.parameters.type); + } }, - "title": "Stimulus", - "timeout": "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - "content": "\u003Cmain class=\"content-horizontal-center content-vertical-center\"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class=\"content-vertical-center content-horizontal-center\"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E" + title: 'Stimulus', + timeout: + "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + content: + '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' }, { - "type": "lab.canvas.Screen", - "content": [ + type: 'lab.canvas.Screen', + content: [ { - "type": "i-text", - "left": 0, - "top": 0, - "angle": 0, - "width": 895.3, - "height": 36.16, - "stroke": null, - "strokeWidth": 1, - "fill": "${ state.correct_response ? 'green' : 'red' }", - "text": "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", - "fontStyle": "normal", - "fontWeight": "bold", - "fontSize": "52", - "fontFamily": "sans-serif", - "lineHeight": 1.16, - "textAlign": "center" + type: 'i-text', + left: 0, + top: 0, + angle: 0, + width: 895.3, + height: 36.16, + stroke: null, + strokeWidth: 1, + fill: "${ state.correct_response ? 'green' : 'red' }", + text: + "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", + fontStyle: 'normal', + fontWeight: 'bold', + fontSize: '52', + fontFamily: 'sans-serif', + lineHeight: 1.16, + textAlign: 'center' } ], - "files": {}, - "parameters": {}, - "responses": {}, - "messageHandlers": { - "end": function anonymous() { - this.data.correct_response = false; - }}, - "viewport": [ - 800, - 600 - ], - "title": "Feedback", - "tardy": true, - "timeout": "1000", - "skip": "${ parameters.phase === 'task' }" + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + end: function anonymous() { + this.data.correct_response = false; + } + }, + viewport: [800, 600], + title: 'Feedback', + tardy: true, + timeout: '1000', + skip: "${ parameters.phase === 'task' }" } ] } }, { - "type": "lab.html.Screen", - "files": {}, - "parameters": {}, - "responses": { - "keypress(Space)": "continue" + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue' }, - "messageHandlers": {}, - "title": "Main task", - "content": "\u003Cheader class=\"content-vertical-center content-horizontal-center\"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class=\"content-vertical-center content-horizontal-center\"\u003E\n \n\u003C\u002Ffooter\u003E" + messageHandlers: {}, + title: 'Main task', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' }, { - "type": "lab.flow.Loop", - "files": {}, - "parameters": {}, - "templateParameters": [], - "sample": { - "mode": "draw-shuffle", - "n": "" + type: 'lab.flow.Loop', + files: {}, + parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle', + n: '' }, - "responses": {}, - "messageHandlers": { - "before:prepare": function anonymous( -) { -let initialParameters = [...this.parameters.stimuli] || []; -initialParameters = initialParameters.filter(t => t.phase === 'main') || []; -let numberTrials = this.parameters.nbTrials; -if(initialParameters.length === 0){ - numberTrials = 0; -} -const randomize = this.parameters.randomize; -const trialsLength = initialParameters.length; -if(numberTrials > trialsLength){ - const append = [...initialParameters] - const multiply = Math.ceil(numberTrials / trialsLength); - for (let i = 0; i < multiply; i++){ - initialParameters = initialParameters.concat(append) - } -} + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + let initialParameters = [...this.parameters.stimuli] || []; + initialParameters = + initialParameters.filter(t => t.phase === 'main') || []; + let numberTrials = this.parameters.nbTrials; + if (initialParameters.length === 0) { + numberTrials = 0; + } + const randomize = this.parameters.randomize; + const trialsLength = initialParameters.length; + if (numberTrials > trialsLength) { + const append = [...initialParameters]; + const multiply = Math.ceil(numberTrials / trialsLength); + for (let i = 0; i < multiply; i++) { + initialParameters = initialParameters.concat(append); + } + } -function shuffle(a) { - let j, x, i - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)) - x = a[i] - a[i] = a[j] - a[j] = x - } - return a -} + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; + } -if(randomize === 'random'){ - shuffle(initialParameters); -} + if (randomize === 'random') { + shuffle(initialParameters); + } -const trialConstructor = ( file ) => ({ - 'condition': file.condition, - 'image': `${file.dir}/${file.filename}`, - 'correctResponse': file.response, - 'phase': 'task', - 'name': file.name, - 'type': file.type, - }) -// balance design across conditions -const conditions = Array.from(new Set(initialParameters.map(p => p.condition))); -const conditionsParameters = {}; -for (const c of conditions) { - conditionsParameters[c] = initialParameters.filter(p => p.condition == c) -} -const numberConditionsTrials = Math.ceil(numberTrials / conditions.length); -let balancedParameters = []; -for (let i = 0; i < numberConditionsTrials; i++){ - for (const c of conditions) { - balancedParameters = balancedParameters.concat(conditionsParameters[c][i % conditionsParameters[c].length]) - } -} -initialParameters = [...balancedParameters.slice(0, numberTrials)]; + const trialConstructor = file => ({ + condition: file.condition, + image: `${file.dir}/${file.filename}`, + correctResponse: file.response, + phase: 'task', + name: file.name, + type: file.type + }); + // balance design across conditions + const conditions = Array.from( + new Set(initialParameters.map(p => p.condition)) + ); + const conditionsParameters = {}; + for (const c of conditions) { + conditionsParameters[c] = initialParameters.filter( + p => p.condition == c + ); + } + const numberConditionsTrials = Math.ceil( + numberTrials / conditions.length + ); + let balancedParameters = []; + for (let i = 0; i < numberConditionsTrials; i++) { + for (const c of conditions) { + balancedParameters = balancedParameters.concat( + conditionsParameters[c][i % conditionsParameters[c].length] + ); + } + } + initialParameters = [ + ...balancedParameters.slice(0, numberTrials) + ]; -let trialParameters = []; -for (let i = 0; i < numberTrials; i++){ - trialParameters = [...trialParameters.concat(trialConstructor(initialParameters[i]))] -} -// assign options values to parameters of this task -this.options.templateParameters = trialParameters; -if(randomize === 'random'){ - this.options.shuffle = true; -} else { - this.options.shuffle = false; -} -} + let trialParameters = []; + for (let i = 0; i < numberTrials; i++) { + trialParameters = [ + ...trialParameters.concat( + trialConstructor(initialParameters[i]) + ) + ]; + } + // assign options values to parameters of this task + this.options.templateParameters = trialParameters; + if (randomize === 'random') { + this.options.shuffle = true; + } else { + this.options.shuffle = false; + } + } }, - "title": "Experiment loop", - "shuffleGroups": [], - "template": { - "type": "lab.flow.Sequence", - "files": {}, - "parameters": {}, - "responses": {}, - "messageHandlers": {}, - "title": "Trial", - "content": [ + title: 'Experiment loop', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [ { - "type": "lab.canvas.Screen", - "content": [ + type: 'lab.canvas.Screen', + content: [ { - "type": "rect", - "left": 0, - "top": 0, - "angle": 0, - "width": 10, - "height": "50", - "stroke": null, - "strokeWidth": 1, - "fill": "black" + type: 'rect', + left: 0, + top: 0, + angle: 0, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' }, { - "type": "rect", - "left": 0, - "top": 0, - "angle": 90, - "width": 10, - "height": "50", - "stroke": null, - "strokeWidth": 1, - "fill": "black" + type: 'rect', + left: 0, + top: 0, + angle: 90, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' } ], - "files": {}, - "parameters": {}, - "responses": {}, - "messageHandlers": {}, - "viewport": [ - 800, - 600 - ], - "title": "Fixation cross", - "timeout": "${parameters.iti}" + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${parameters.iti}' }, { - "type": "lab.html.Screen", - "files": {}, - "responses": {}, - "parameters": {}, - "messageHandlers": { - "before:prepare": function anonymous( -) { -// This code registers an event listener for this screen. -// We have a timeout for this screen, but we also want to record responses. -// On a keydown event, we record the key and the time of response. -// We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). -// "this" in the code means the lab.js experiment. -const responses = [... new Set(this.parameters.stimuli.map( e => (e.response)))]; -this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length-2]); -this.data.response_given = 'no'; + type: 'lab.html.Screen', + files: {}, + responses: {}, + parameters: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + // This code registers an event listener for this screen. + // We have a timeout for this screen, but we also want to record responses. + // On a keydown event, we record the key and the time of response. + // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). + // "this" in the code means the lab.js experiment. + const responses = [ + ...new Set(this.parameters.stimuli.map(e => e.response)) + ]; + this.data.trial_number = + 1 + + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); + this.data.response_given = 'no'; -this.options.events = { - 'keydown': (event) => { - if(responses.includes(event.key)){ - this.data.reaction_time = this.timer; - if(this.parameters.phase === 'task') this.data.response_given = 'yes'; - this.data.response = event.key; - if(this.data.response == this.parameters.correctResponse){ - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - this.end(); - } - } -} -}, - "run": function anonymous( -) { -this.parameters.callbackForEEG(this.parameters.type); -} + this.options.events = { + keydown: event => { + if (responses.includes(event.key)) { + this.data.reaction_time = this.timer; + if (this.parameters.phase === 'task') + this.data.response_given = 'yes'; + this.data.response = event.key; + if ( + this.data.response == + this.parameters.correctResponse + ) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + this.end(); + } + } + }; + }, + run: function anonymous() { + this.parameters.callbackForEEG(this.parameters.type); + } }, - "title": "Stimulus", - "timeout": "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - "timeout": "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - "content": "\u003Cmain class=\"content-horizontal-center content-vertical-center\"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class=\"content-vertical-center content-horizontal-center\"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E" + title: 'Stimulus', + timeout: + "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + timeout: + "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + content: + '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' }, { - "type": "lab.canvas.Screen", - "content": [ + type: 'lab.canvas.Screen', + content: [ { - "type": "i-text", - "left": 0, - "top": 0, - "angle": 0, - "width": 895.3, - "height": 36.16, - "stroke": null, - "strokeWidth": 1, - "fill": "${ state.correct_response ? 'green' : 'red' }", - "text": "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", - "fontStyle": "normal", - "fontWeight": "bold", - "fontSize": "52", - "fontFamily": "sans-serif", - "lineHeight": 1.16, - "textAlign": "center" + type: 'i-text', + left: 0, + top: 0, + angle: 0, + width: 895.3, + height: 36.16, + stroke: null, + strokeWidth: 1, + fill: "${ state.correct_response ? 'green' : 'red' }", + text: + "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", + fontStyle: 'normal', + fontWeight: 'bold', + fontSize: '52', + fontFamily: 'sans-serif', + lineHeight: 1.16, + textAlign: 'center' } ], - "files": {}, - "parameters": {}, - "responses": {}, - "messageHandlers": {}, - "viewport": [ - 800, - 600 - ], - "title": "Feedback", - "tardy": true, - "timeout": "1000", - "skip": "${ parameters.phase === 'task' }" + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Feedback', + tardy: true, + timeout: '1000', + skip: "${ parameters.phase === 'task' }" } ] } }, { - "type": "lab.html.Screen", - "files": {}, - "parameters": {}, - "responses": { - "keypress(Space)": "end" + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'end' }, - "messageHandlers": {}, - "title": "End", - "content": "\u003Cheader class=\"content-vertical-center content-horizontal-center\"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n" + messageHandlers: {}, + title: 'End', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' } ] } ] -} +}; // export export default studyObject; diff --git a/app/utils/labjs/scripts/faceshouses.js b/app/utils/labjs/scripts/faceshouses.js index a3364574..3a3338f8 100644 --- a/app/utils/labjs/scripts/faceshouses.js +++ b/app/utils/labjs/scripts/faceshouses.js @@ -22,12 +22,12 @@ const studyObject = { parameters: {}, responses: { 'keypress(Space)': 'continue', - 'keypress(q)': 'skipPractice', + 'keypress(q)': 'skipPractice' }, messageHandlers: {}, title: 'Instruction', content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EThe face-house task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E', + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EThe face-house task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' }, { type: 'lab.flow.Loop', @@ -36,7 +36,7 @@ const studyObject = { templateParameters: [], sample: { mode: 'draw-shuffle', - n: '', + n: '' }, responses: {}, messageHandlers: { @@ -72,22 +72,28 @@ const studyObject = { shuffle(initParameters); } - const trialConstructor = (file) => ({ + const trialConstructor = file => ({ condition: file.condition, image: `${file.dir}/${file.filename}`, correctResponse: file.response, phase: 'practice', name: file.name, - type: file.type, + type: file.type }); // balance design across conditions - const conditions = Array.from(new Set(initParameters.map((p) => p.condition))); + const conditions = Array.from( + new Set(initParameters.map(p => p.condition)) + ); const conditionsParameters = {}; for (const c of conditions) { - conditionsParameters[c] = initParameters.filter((p) => p.condition == c); + conditionsParameters[c] = initParameters.filter( + p => p.condition == c + ); } - const numberConditionsTrials = Math.ceil(numberTrials / conditions.length); + const numberConditionsTrials = Math.ceil( + numberTrials / conditions.length + ); let balancedParameters = []; for (let i = 0; i < numberConditionsTrials; i++) { for (const c of conditions) { @@ -100,7 +106,9 @@ const studyObject = { let practiceParameters = []; for (let i = 0; i < numberTrials; i++) { - practiceParameters = practiceParameters.concat(trialConstructor(initParameters[i])); + practiceParameters = practiceParameters.concat( + trialConstructor(initParameters[i]) + ); } // assign options values to parameters of this task @@ -110,7 +118,7 @@ const studyObject = { } else { this.options.shuffle = false; } - }, + } }, title: 'Practice loop', shuffleGroups: [], @@ -134,7 +142,7 @@ const studyObject = { height: '50', stroke: null, strokeWidth: 1, - fill: 'black', + fill: 'black' }, { type: 'rect', @@ -145,8 +153,8 @@ const studyObject = { height: '50', stroke: null, strokeWidth: 1, - fill: 'black', - }, + fill: 'black' + } ], files: {}, parameters: {}, @@ -154,7 +162,7 @@ const studyObject = { messageHandlers: {}, viewport: [800, 600], title: 'Fixation cross', - timeout: '${parameters.iti}', + timeout: '${parameters.iti}' }, { type: 'lab.html.Screen', @@ -168,36 +176,47 @@ const studyObject = { // On a keydown event, we record the key and the time of response. // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). // "this" in the code means the lab.js experiment. - const responses = [...new Set(this.parameters.stimuli.map((e) => e.response))]; + const responses = [ + ...new Set(this.parameters.stimuli.map(e => e.response)) + ]; this.data.trial_number = 1 + - parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); this.data.response_given = 'no'; this.options.events = { - keydown: (event) => { + keydown: event => { if (responses.includes(event.key)) { this.data.reaction_time = this.timer; - if (this.parameters.phase === 'task') this.data.response_given = 'yes'; + if (this.parameters.phase === 'task') + this.data.response_given = 'yes'; this.data.response = event.key; - if (this.data.response == this.parameters.correctResponse) { + if ( + this.data.response == + this.parameters.correctResponse + ) { this.data.correct_response = true; } else { this.data.correct_response = false; } this.end(); } - }, + } }; }, run: function anonymous() { this.parameters.callbackForEEG(this.parameters.type); - }, + } }, title: 'Stimulus', - timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + timeout: + "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", content: - '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', + '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' }, { type: 'lab.canvas.Screen', @@ -219,8 +238,8 @@ const studyObject = { fontSize: '52', fontFamily: 'sans-serif', lineHeight: 1.16, - textAlign: 'center', - }, + textAlign: 'center' + } ], files: {}, parameters: {}, @@ -228,28 +247,28 @@ const studyObject = { messageHandlers: { end: function anonymous() { this.data.correct_response = false; - }, + } }, viewport: [800, 600], title: 'Feedback', tardy: true, timeout: '1000', - skip: "${ parameters.phase === 'task' }", - }, - ], - }, + skip: "${ parameters.phase === 'task' }" + } + ] + } }, { type: 'lab.html.Screen', files: {}, parameters: {}, responses: { - 'keypress(Space)': 'continue', + 'keypress(Space)': 'continue' }, messageHandlers: {}, title: 'Main task', content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E', + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' }, { type: 'lab.flow.Loop', @@ -258,13 +277,14 @@ const studyObject = { templateParameters: [], sample: { mode: 'draw-shuffle', - n: '', + n: '' }, responses: {}, messageHandlers: { 'before:prepare': function anonymous() { let initialParameters = [...this.parameters.stimuli] || []; - initialParameters = initialParameters.filter((t) => t.phase === 'main') || []; + initialParameters = + initialParameters.filter(t => t.phase === 'main') || []; let numberTrials = this.parameters.nbTrials; if (initialParameters.length === 0) { numberTrials = 0; @@ -294,21 +314,27 @@ const studyObject = { shuffle(initialParameters); } - const trialConstructor = (file) => ({ + const trialConstructor = file => ({ condition: file.condition, image: `${file.dir}/${file.filename}`, correctResponse: file.response, phase: 'task', name: file.name, - type: file.type, + type: file.type }); // balance design across conditions - const conditions = Array.from(new Set(initialParameters.map((p) => p.condition))); + const conditions = Array.from( + new Set(initialParameters.map(p => p.condition)) + ); const conditionsParameters = {}; for (const c of conditions) { - conditionsParameters[c] = initialParameters.filter((p) => p.condition == c); + conditionsParameters[c] = initialParameters.filter( + p => p.condition == c + ); } - const numberConditionsTrials = Math.ceil(numberTrials / conditions.length); + const numberConditionsTrials = Math.ceil( + numberTrials / conditions.length + ); let balancedParameters = []; for (let i = 0; i < numberConditionsTrials; i++) { for (const c of conditions) { @@ -317,12 +343,16 @@ const studyObject = { ); } } - initialParameters = [...balancedParameters.slice(0, numberTrials)]; + initialParameters = [ + ...balancedParameters.slice(0, numberTrials) + ]; let trialParameters = []; for (let i = 0; i < numberTrials; i++) { trialParameters = [ - ...trialParameters.concat(trialConstructor(initialParameters[i])), + ...trialParameters.concat( + trialConstructor(initialParameters[i]) + ) ]; } // assign options values to parameters of this task @@ -332,7 +362,7 @@ const studyObject = { } else { this.options.shuffle = false; } - }, + } }, title: 'Experiment loop', shuffleGroups: [], @@ -356,7 +386,7 @@ const studyObject = { height: '50', stroke: null, strokeWidth: 1, - fill: 'black', + fill: 'black' }, { type: 'rect', @@ -367,8 +397,8 @@ const studyObject = { height: '50', stroke: null, strokeWidth: 1, - fill: 'black', - }, + fill: 'black' + } ], files: {}, parameters: {}, @@ -376,7 +406,7 @@ const studyObject = { messageHandlers: {}, viewport: [800, 600], title: 'Fixation cross', - timeout: '${parameters.iti}', + timeout: '${parameters.iti}' }, { type: 'lab.html.Screen', @@ -390,37 +420,49 @@ const studyObject = { // On a keydown event, we record the key and the time of response. // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). // "this" in the code means the lab.js experiment. - const responses = [...new Set(this.parameters.stimuli.map((e) => e.response))]; + const responses = [ + ...new Set(this.parameters.stimuli.map(e => e.response)) + ]; this.data.trial_number = 1 + - parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); this.data.response_given = 'no'; this.options.events = { - keydown: (event) => { + keydown: event => { if (responses.includes(event.key)) { this.data.reaction_time = this.timer; - if (this.parameters.phase === 'task') this.data.response_given = 'yes'; + if (this.parameters.phase === 'task') + this.data.response_given = 'yes'; this.data.response = event.key; - if (this.data.response == this.parameters.correctResponse) { + if ( + this.data.response == + this.parameters.correctResponse + ) { this.data.correct_response = true; } else { this.data.correct_response = false; } this.end(); } - }, + } }; }, run: function anonymous() { this.parameters.callbackForEEG(this.parameters.type); - }, + } }, title: 'Stimulus', - timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + timeout: + "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + timeout: + "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", content: - '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', + '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' }, { type: 'lab.canvas.Screen', @@ -442,8 +484,8 @@ const studyObject = { fontSize: '52', fontFamily: 'sans-serif', lineHeight: 1.16, - textAlign: 'center', - }, + textAlign: 'center' + } ], files: {}, parameters: {}, @@ -453,26 +495,26 @@ const studyObject = { title: 'Feedback', tardy: true, timeout: '1000', - skip: "${ parameters.phase === 'task' }", - }, - ], - }, + skip: "${ parameters.phase === 'task' }" + } + ] + } }, { type: 'lab.html.Screen', files: {}, parameters: {}, responses: { - 'keypress(Space)': 'end', + 'keypress(Space)': 'end' }, messageHandlers: {}, title: 'End', content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n', - }, - ], - }, - ], + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' + } + ] + } + ] }; // export diff --git a/app/utils/labjs/scripts/multitasking.js b/app/utils/labjs/scripts/multitasking.js index 37a9ffff..7253e4bf 100644 --- a/app/utils/labjs/scripts/multitasking.js +++ b/app/utils/labjs/scripts/multitasking.js @@ -1,7 +1,12 @@ import * as path from 'path'; const rootFolder = __dirname; -const assetsDirectory = path.join(rootFolder, 'assets', 'labjs', 'multitasking'); +const assetsDirectory = path.join( + rootFolder, + 'assets', + 'labjs', + 'multitasking' +); // Define study const studyObject = { @@ -26,12 +31,12 @@ const studyObject = { files: {}, parameters: {}, responses: { - 'keypress(Space)': 'continue', + 'keypress(Space)': 'continue' }, messageHandlers: {}, title: 'Intro', content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EThe multi-tasking test\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E', + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EThe multi-tasking test\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' }, { type: 'lab.html.Screen', @@ -46,24 +51,26 @@ const studyObject = { 'example_2.png': `${assetsDirectory}/example_2.png`, 'example_3.png': `${assetsDirectory}/example_3.png`, 'example_4.png': `${assetsDirectory}/example_4.png`, - 'all_conditions.png': `${assetsDirectory}/all_conditions.png`, + 'all_conditions.png': `${assetsDirectory}/all_conditions.png` }, parameters: {}, responses: { - 'keypress(Space)': 'continue', + 'keypress(Space)': 'continue' }, messageHandlers: { 'before:prepare': function anonymous() { - this.options.events['keydown'] = (e) => { + this.options.events['keydown'] = e => { if (e.code === 'KeyQ') { this.data.skipTraining = true; this.end(); } if (e.code === 'ArrowLeft' || e.code === 'ArrowRight') { - const instructions = document.querySelectorAll('div.instruction'); + const instructions = document.querySelectorAll( + 'div.instruction' + ); let notFound = true; - instructions.forEach((i) => { + instructions.forEach(i => { if (i.style.display === 'block' && notFound) { const cur_id = parseInt(i.id.split('screen_')[1]); let next_id; @@ -75,19 +82,20 @@ const studyObject = { } if (next_id > 0 && next_id <= 10) { i.style.display = 'none'; - next_id = `screen_${ next_id}`; - document.querySelector(`#${next_id}`).style.display = 'block'; + next_id = `screen_${next_id}`; + document.querySelector(`#${next_id}`).style.display = + 'block'; notFound = false; } } }); } }; - }, + } }, title: 'Instructions', content: - '\u003Cmain\u003E\n\n\u003Cdiv class="instruction" id=\'screen_1\' style="display:block"\u003E\n \u003Cp\u003E\n In the following, you will respond to various figures. These are the figures that you will see: diamonds and rectangles with a filling of 2 or 3 dots:\n \u003C\u002Fp\u003E\n \u003Ctable\u003E\n \u003Cthead\u003E\n \u003Ctr\u003E\n \u003Cth\u003EDiamond with filling of 3 dots\u003C\u002Fth\u003E\n \u003Cth\u003EDiamond with filling of 2 dots\u003C\u002Fth\u003E\n \u003Cth\u003ERectangle with filling of 3 dots\u003C\u002Fth\u003E\n \u003Cth\u003ERectangle with filling of 2 dots\u003C\u002Fth\u003E\n \u003C\u002Ftr\u003E\n \u003C\u002Fthead\u003E\n \u003Ctbody\u003E\n \u003Ctr\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'diamond_3.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'diamond_2.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'rectangle_3.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'rectangle_2.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003C\u002Ftr\u003E\n \u003C\u002Ftbody\u003E\n \u003C\u002Ftable\u003E\n \u003Cp\u003E\n Use the right arrow key to move to the next instruction.\n \u003C\u002Fp\u003E\n\n \u003Cp\u003E\n If you want to skip the instruction with practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_2\' style="display:none"\u003E\n\n \u003Cp\u003E\n You will be shown these figures in sequences of trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Each time you will need to respond with a button press.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n How exactly will be explained in the next screens.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_3\' style="display:none"\u003E\n \u003Cp\u003E\n In the shape task, a diamond requires a b button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, a rectangle requires a n button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In this task, ignore the filling (dots) of the shape!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'shape.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_4\' style="display:none"\u003E\n \u003Cp\u003E\n In the filling task, a filling of two dots requires a b button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, a filling with three dots requires a n button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, ignore the outer shape!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'filling.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_5\' style="display:none"\u003E\n \u003Cp\u003E\n Example 1. If you see a figure in the upper part of the frame, you know you need to do the shape task, that is easy, because the word shape is at the top. Here you see a diamond, which requires a button press of the keyboard key \u003Cstrong\u003E\u003Cem\u003Eb\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, entirely ignore the filling dots!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_1.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_6\' style="display:none" style="width:400px"\u003E\n \u003Cp\u003E\n Example 2. If you see a figure in the lower part of the frame, you know you need to do the filling task, that is easy, because the word filling is at the bottom. This diamond is filled with 3 dots, and thus press the keyboard key \u003Cstrong\u003E\u003Cem\u003En\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, entirely ignore the outer shape (here a diamond)!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_2.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_7\' style="display:none"\u003E\n \u003Cimg src=${this.files[\'example_3.png\']} style="width:400px"\u003E\n \u003Cp\u003E\n Example 3. If you see a figure in the upper part of the frame, you know you need to do the shape task, that is easy, because the word shape is at the top. Here you see a rectangle, which requires the \u003Cstrong\u003E\u003Cem\u003En\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E key.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, entirely ignore the filling (here 2 dots)!!!\n \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_8\' style="display:none"\u003E\n \u003Cp\u003E\n Example 4. If you see a figure in the lower part of the frame, you know you need to do the filling task, that is easy, because the word filling is at the bottom. This diamond is filled with 2 dots, and thus press \u003Cstrong\u003E\u003Cem\u003Eb\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E key.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, entirely ignore the outer shape (here a diamond)!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_4.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\n\u003Cdiv class="instruction" id=\'screen_9\' style="display:none"\u003E\n \u003Cp\u003E\n Here, you can see how to respond in all conditions...\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Just look at shape in the shape task, and at the dots in the filling task...\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'all_conditions.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_10\' style="display:none"\u003E\n \u003Cp\u003E\n Are you ready? Press the space bar on your keyboard to quit the instructions and start doing the practice trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Or you can browse back to the previous screens until you understand what you need to do in the two tasks (use the arrow keys).\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n If you want to skip practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter\u003E\n \u003Cp\u003E\n Use left\u002Fright arrow keys to go further or back.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', + '\u003Cmain\u003E\n\n\u003Cdiv class="instruction" id=\'screen_1\' style="display:block"\u003E\n \u003Cp\u003E\n In the following, you will respond to various figures. These are the figures that you will see: diamonds and rectangles with a filling of 2 or 3 dots:\n \u003C\u002Fp\u003E\n \u003Ctable\u003E\n \u003Cthead\u003E\n \u003Ctr\u003E\n \u003Cth\u003EDiamond with filling of 3 dots\u003C\u002Fth\u003E\n \u003Cth\u003EDiamond with filling of 2 dots\u003C\u002Fth\u003E\n \u003Cth\u003ERectangle with filling of 3 dots\u003C\u002Fth\u003E\n \u003Cth\u003ERectangle with filling of 2 dots\u003C\u002Fth\u003E\n \u003C\u002Ftr\u003E\n \u003C\u002Fthead\u003E\n \u003Ctbody\u003E\n \u003Ctr\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'diamond_3.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'diamond_2.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'rectangle_3.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'rectangle_2.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003C\u002Ftr\u003E\n \u003C\u002Ftbody\u003E\n \u003C\u002Ftable\u003E\n \u003Cp\u003E\n Use the right arrow key to move to the next instruction.\n \u003C\u002Fp\u003E\n\n \u003Cp\u003E\n If you want to skip the instruction with practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_2\' style="display:none"\u003E\n\n \u003Cp\u003E\n You will be shown these figures in sequences of trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Each time you will need to respond with a button press.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n How exactly will be explained in the next screens.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_3\' style="display:none"\u003E\n \u003Cp\u003E\n In the shape task, a diamond requires a b button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, a rectangle requires a n button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In this task, ignore the filling (dots) of the shape!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'shape.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_4\' style="display:none"\u003E\n \u003Cp\u003E\n In the filling task, a filling of two dots requires a b button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, a filling with three dots requires a n button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, ignore the outer shape!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'filling.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_5\' style="display:none"\u003E\n \u003Cp\u003E\n Example 1. If you see a figure in the upper part of the frame, you know you need to do the shape task, that is easy, because the word shape is at the top. Here you see a diamond, which requires a button press of the keyboard key \u003Cstrong\u003E\u003Cem\u003Eb\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, entirely ignore the filling dots!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_1.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_6\' style="display:none" style="width:400px"\u003E\n \u003Cp\u003E\n Example 2. If you see a figure in the lower part of the frame, you know you need to do the filling task, that is easy, because the word filling is at the bottom. This diamond is filled with 3 dots, and thus press the keyboard key \u003Cstrong\u003E\u003Cem\u003En\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, entirely ignore the outer shape (here a diamond)!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_2.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_7\' style="display:none"\u003E\n \u003Cimg src=${this.files[\'example_3.png\']} style="width:400px"\u003E\n \u003Cp\u003E\n Example 3. If you see a figure in the upper part of the frame, you know you need to do the shape task, that is easy, because the word shape is at the top. Here you see a rectangle, which requires the \u003Cstrong\u003E\u003Cem\u003En\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E key.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, entirely ignore the filling (here 2 dots)!!!\n \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_8\' style="display:none"\u003E\n \u003Cp\u003E\n Example 4. If you see a figure in the lower part of the frame, you know you need to do the filling task, that is easy, because the word filling is at the bottom. This diamond is filled with 2 dots, and thus press \u003Cstrong\u003E\u003Cem\u003Eb\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E key.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, entirely ignore the outer shape (here a diamond)!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_4.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\n\u003Cdiv class="instruction" id=\'screen_9\' style="display:none"\u003E\n \u003Cp\u003E\n Here, you can see how to respond in all conditions...\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Just look at shape in the shape task, and at the dots in the filling task...\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'all_conditions.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_10\' style="display:none"\u003E\n \u003Cp\u003E\n Are you ready? Press the space bar on your keyboard to quit the instructions and start doing the practice trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Or you can browse back to the previous screens until you understand what you need to do in the two tasks (use the arrow keys).\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n If you want to skip practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter\u003E\n \u003Cp\u003E\n Use left\u002Fright arrow keys to go further or back.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' }, { type: 'lab.canvas.Frame', @@ -108,42 +116,42 @@ const studyObject = { block: 'shape', task: 'training', num_trials: '10', - cond: 'No switching', + cond: 'No switching' }, { block: 'filling', task: 'training', num_trials: '10', - cond: 'No switching', + cond: 'No switching' }, { block: 'mixed', task: 'training', num_trials: '20', - cond: 'Switching', + cond: 'Switching' }, { block: 'shape', task: 'main', num_trials: '20', - cond: 'No switching', + cond: 'No switching' }, { block: 'filling', task: 'main', num_trials: '20', - cond: 'No switching', + cond: 'No switching' }, { block: 'mixed', task: 'main', num_trials: '40', - cond: 'Switching', - }, + cond: 'Switching' + } ], sample: { mode: 'sequential', - n: '6', + n: '6' }, responses: {}, messageHandlers: {}, @@ -157,7 +165,8 @@ const studyObject = { responses: {}, messageHandlers: {}, title: 'Block sequence', - skip: "${this.parameters.task === 'training' && this.state.skipTraining === true}", + skip: + "${this.parameters.task === 'training' && this.state.skipTraining === true}", content: [ { type: 'lab.canvas.Screen', @@ -208,7 +217,7 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '277', - styles: {}, + styles: {} }, { type: 'i-text', @@ -257,7 +266,7 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '278', - styles: {}, + styles: {} }, { type: 'i-text', @@ -305,17 +314,17 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '279', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, responses: { - 'keypress(Space)': 'continue', + 'keypress(Space)': 'continue' }, messageHandlers: {}, viewport: [800, 600], - title: 'Ready', + title: 'Ready' }, { type: 'lab.canvas.Screen', @@ -325,7 +334,8 @@ const studyObject = { version: '2.7.0', originX: 'left', originY: 'center', - left: "${this.parameters.block === 'mixed' ? 1000 : -120}", + left: + "${this.parameters.block === 'mixed' ? 1000 : -120}", top: -64, width: 372.81, height: 78.11, @@ -380,7 +390,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '5': { stroke: null, @@ -394,7 +404,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '6': { stroke: null, @@ -408,7 +418,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '7': { stroke: null, @@ -422,7 +432,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '8': { stroke: null, @@ -436,7 +446,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '9': { stroke: null, @@ -450,7 +460,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '10': { stroke: null, @@ -464,7 +474,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '11': { stroke: null, @@ -478,7 +488,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '12': { stroke: null, @@ -492,7 +502,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '13': { stroke: null, @@ -506,7 +516,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '14': { stroke: null, @@ -520,7 +530,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '15': { stroke: null, @@ -534,7 +544,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '16': { stroke: null, @@ -548,7 +558,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '17': { stroke: null, @@ -562,7 +572,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '18': { stroke: null, @@ -576,7 +586,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '19': { stroke: null, @@ -590,7 +600,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '20': { stroke: null, @@ -604,7 +614,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '21': { stroke: null, @@ -618,7 +628,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '22': { stroke: null, @@ -632,7 +642,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '23': { stroke: null, @@ -646,7 +656,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '24': { stroke: null, @@ -660,7 +670,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '25': { stroke: null, @@ -674,7 +684,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '26': { stroke: null, @@ -688,7 +698,7 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', + textBackgroundColor: '' }, '27': { stroke: null, @@ -702,10 +712,10 @@ const studyObject = { overline: false, linethrough: false, deltaY: 0, - textBackgroundColor: '', - }, - }, - }, + textBackgroundColor: '' + } + } + } }, { type: 'i-text', @@ -754,14 +764,15 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '300', - styles: {}, + styles: {} }, { type: 'i-text', version: '2.7.0', originX: 'left', originY: 'center', - left: "${this.parameters.block === 'mixed' ? -120 : 1000}", + left: + "${this.parameters.block === 'mixed' ? -120 : 1000}", top: -75, width: 247.08, height: 120.05, @@ -789,7 +800,8 @@ const studyObject = { transformMatrix: null, skewX: 0, skewY: 0, - text: 'A block with a mix\nof the shape & \nthe filling task', + text: + 'A block with a mix\nof the shape & \nthe filling task', fontSize: 32, fontWeight: 'normal', fontFamily: 'sans-serif', @@ -802,17 +814,17 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '397', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, responses: { - 'keypress(Space)': 'continue', + 'keypress(Space)': 'continue' }, messageHandlers: {}, viewport: [800, 600], - title: 'Block description', + title: 'Block description' }, { type: 'lab.canvas.Screen', @@ -863,8 +875,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '276', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -872,7 +884,7 @@ const studyObject = { messageHandlers: {}, viewport: [800, 600], title: 'Concentrate', - timeout: '1000', + timeout: '1000' }, { type: 'lab.canvas.Screen', @@ -913,7 +925,7 @@ const studyObject = { radius: 27.5, startAngle: 0, endAngle: 6.283185307179586, - id: '273', + id: '273' }, { type: 'i-text', @@ -961,8 +973,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '274', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -970,7 +982,7 @@ const studyObject = { messageHandlers: {}, viewport: [800, 600], title: '3', - timeout: '1000', + timeout: '1000' }, { type: 'lab.canvas.Screen', @@ -1011,7 +1023,7 @@ const studyObject = { radius: 27.5, startAngle: 0, endAngle: 6.283185307179586, - id: '273', + id: '273' }, { type: 'i-text', @@ -1059,8 +1071,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '274', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -1068,7 +1080,7 @@ const studyObject = { messageHandlers: {}, viewport: [800, 600], title: '2', - timeout: '1000', + timeout: '1000' }, { type: 'lab.canvas.Screen', @@ -1109,7 +1121,7 @@ const studyObject = { radius: 27.5, startAngle: 0, endAngle: 6.283185307179586, - id: '273', + id: '273' }, { type: 'i-text', @@ -1157,8 +1169,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '274', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -1166,7 +1178,7 @@ const studyObject = { messageHandlers: {}, viewport: [800, 600], title: '1', - timeout: '1000', + timeout: '1000' }, { type: 'lab.flow.Loop', @@ -1175,7 +1187,7 @@ const studyObject = { templateParameters: [], sample: { mode: 'draw', - n: '', + n: '' }, responses: {}, messageHandlers: { @@ -1197,16 +1209,23 @@ const studyObject = { ? ['shape', 'filling'] : [this.parameters.block, this.parameters.block]; - function trialConstructor(block, dots, form, cor_response) { + function trialConstructor( + block, + dots, + form, + cor_response + ) { return { type: block, dots, form, - cor_response, + cor_response }; } - const numberBlocks = Math.ceil(this.parameters.num_trials / 4); + const numberBlocks = Math.ceil( + this.parameters.num_trials / 4 + ); for (let i = 1; i <= numberBlocks; i++) { for (const block of blocks) { @@ -1246,7 +1265,7 @@ const studyObject = { 0, this.parameters.num_trials ); - }, + } }, title: 'Trial loop', shuffleGroups: [], @@ -1296,7 +1315,7 @@ const studyObject = { skewY: 0, rx: 0, ry: 0, - id: '17', + id: '17' }, { type: 'line', @@ -1335,15 +1354,17 @@ const studyObject = { x1: -200, x2: 200, y1: 0, - y2: 0, + y2: 0 }, { type: 'rect', version: '2.7.0', originX: 'center', originY: 'center', - left: "${this.parameters.form === 'square' ? 0 : 1000}", - top: "${this.parameters.type === 'shape' ? -75 : 75}", + left: + "${this.parameters.form === 'square' ? 0 : 1000}", + top: + "${this.parameters.type === 'shape' ? -75 : 75}", width: '100', height: '100', fill: 'transparent', @@ -1372,7 +1393,7 @@ const studyObject = { skewY: 0, rx: 0, ry: 0, - id: '91', + id: '91' }, { type: 'circle', @@ -1380,7 +1401,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '0', - top: "${this.parameters.type === 'shape' ? -50 : 50}", + top: + "${this.parameters.type === 'shape' ? -50 : 50}", width: 20, height: 20, fill: 'black', @@ -1410,15 +1432,17 @@ const studyObject = { radius: 10, startAngle: 0, endAngle: 6.283185307179586, - id: '105', + id: '105' }, { type: 'rect', version: '2.7.0', originX: 'center', originY: 'center', - left: "${this.parameters.form === 'diamond' ? 0 : 1000}", - top: "${this.parameters.type === 'shape' ? -75 : 75}", + left: + "${this.parameters.form === 'diamond' ? 0 : 1000}", + top: + "${this.parameters.type === 'shape' ? -75 : 75}", width: 80, height: 80, fill: 'transparent', @@ -1447,7 +1471,7 @@ const studyObject = { skewY: 0, rx: 0, ry: 0, - id: '98', + id: '98' }, { type: 'circle', @@ -1455,7 +1479,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '${this.parameters.dots === 3 ? 0 : 1000}', - top: "${this.parameters.type === 'shape' ? -75 : 75}", + top: + "${this.parameters.type === 'shape' ? -75 : 75}", width: 20, height: 20, fill: 'black', @@ -1485,7 +1510,7 @@ const studyObject = { radius: 10, startAngle: 0, endAngle: 6.283185307179586, - id: '103', + id: '103' }, { type: 'circle', @@ -1493,7 +1518,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '0', - top: "${this.parameters.type === 'shape' ? -100 : 100}", + top: + "${this.parameters.type === 'shape' ? -100 : 100}", width: 20, height: 20, fill: 'black', @@ -1523,7 +1549,7 @@ const studyObject = { radius: 10, startAngle: 0, endAngle: 6.283185307179586, - id: '104', + id: '104' }, { type: 'i-text', @@ -1571,7 +1597,7 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '112', - styles: {}, + styles: {} }, { type: 'i-text', @@ -1619,14 +1645,14 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '113', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, responses: { 'keypress(b)': 'b', - 'keypress(n)': 'n', + 'keypress(n)': 'n' }, messageHandlers: { run: function anonymous() { @@ -1634,12 +1660,12 @@ const studyObject = { this.parameters.cond === 'Switching' ? 1 : 2 ); this.data.correct = 'empty'; - }, + } }, viewport: [800, 600], title: 'Stimulus', correctResponse: '${parameters.cor_response}', - timeout: '5000', + timeout: '5000' }, { type: 'lab.canvas.Screen', @@ -1677,7 +1703,8 @@ const studyObject = { transformMatrix: null, skewX: 0, skewY: 0, - text: "${this.state.correct ? '' : 'That was the wrong key.'} ", + text: + "${this.state.correct ? '' : 'That was the wrong key.'} ", fontSize: 32, fontWeight: 'normal', fontFamily: 'sans-serif', @@ -1690,7 +1717,7 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '37', - styles: {}, + styles: {} }, { type: 'i-text', @@ -1725,7 +1752,8 @@ const studyObject = { transformMatrix: null, skewX: 0, skewY: 0, - text: "${this.state.correct === 'empty' ? 'The time is up' : ''} ", + text: + "${this.state.correct === 'empty' ? 'The time is up' : ''} ", fontSize: 32, fontWeight: 'normal', fontFamily: 'sans-serif', @@ -1738,7 +1766,7 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '310', - styles: {}, + styles: {} }, { type: 'rect', @@ -1775,7 +1803,7 @@ const studyObject = { skewY: 0, rx: 0, ry: 0, - id: '36', + id: '36' }, { type: 'line', @@ -1814,7 +1842,7 @@ const studyObject = { x1: -200, x2: 200, y1: 0, - y2: 0, + y2: 0 }, { type: 'i-text', @@ -1862,7 +1890,7 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '126', - styles: {}, + styles: {} }, { type: 'i-text', @@ -1910,8 +1938,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '127', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -1921,12 +1949,17 @@ const studyObject = { this.data.trial_number = 1 + parseInt( - this.options.id.split('_')[this.options.id.split('_').length - 2] + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] ); this.data.condition = this.parameters.cond; this.data.reaction_time = this.state.duration; - if (this.state.response === this.parameters.cor_response) { + if ( + this.state.response === + this.parameters.cor_response + ) { this.data.correct_response = true; } else { this.data.correct_response = false; @@ -1938,12 +1971,12 @@ const studyObject = { } else { this.data.phase = 'practice'; } - }, + } }, viewport: [800, 600], title: 'Feedback', timeout: '${this.parameters.iti}', - tardy: true, + tardy: true }, { type: 'lab.canvas.Screen', @@ -1983,7 +2016,7 @@ const studyObject = { skewY: 0, rx: 0, ry: 0, - id: '123', + id: '123' }, { type: 'line', @@ -2022,7 +2055,7 @@ const studyObject = { x1: -50, x2: 50, y1: 0, - y2: 0, + y2: 0 }, { type: 'i-text', @@ -2033,7 +2066,8 @@ const studyObject = { top: -195, width: 78.2, height: 36.16, - fill: "${this.parameters.type === 'shape' ? 'black' : 'lightgrey'}", + fill: + "${this.parameters.type === 'shape' ? 'black' : 'lightgrey'}", stroke: null, strokeWidth: 1, strokeDashArray: null, @@ -2070,7 +2104,7 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '128', - styles: {}, + styles: {} }, { type: 'i-text', @@ -2081,7 +2115,8 @@ const studyObject = { top: '195', width: 85.36, height: 36.16, - fill: "${this.parameters.type === 'filling' ? 'black' : 'lightgrey'}", + fill: + "${this.parameters.type === 'filling' ? 'black' : 'lightgrey'}", stroke: null, strokeWidth: 1, strokeDashArray: null, @@ -2118,7 +2153,7 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '129', - styles: {}, + styles: {} }, { type: 'rect', @@ -2126,7 +2161,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '120', - top: "${this.parameters.type === 'shape' ? -90 : 1000}", + top: + "${this.parameters.type === 'shape' ? -90 : 1000}", width: 80, height: 80, fill: 'transparent', @@ -2155,7 +2191,7 @@ const studyObject = { skewY: 0, rx: 0, ry: 0, - id: '130', + id: '130' }, { type: 'rect', @@ -2163,7 +2199,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '-120', - top: "${this.parameters.type === 'shape' ? -90 : 1000}", + top: + "${this.parameters.type === 'shape' ? -90 : 1000}", width: 60, height: 60, fill: 'transparent', @@ -2192,7 +2229,7 @@ const studyObject = { skewY: 0, rx: 0, ry: 0, - id: '131', + id: '131' }, { type: 'i-text', @@ -2200,7 +2237,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '-120', - top: "${this.parameters.type === 'shape' ? -25 : 1000}", + top: + "${this.parameters.type === 'shape' ? -25 : 1000}", width: 16, height: 36.16, fill: 'black', @@ -2240,7 +2278,7 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '132', - styles: {}, + styles: {} }, { type: 'i-text', @@ -2248,7 +2286,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '120', - top: "${this.parameters.type === 'shape' ? -25 : 1000}", + top: + "${this.parameters.type === 'shape' ? -25 : 1000}", width: 16, height: 36.16, fill: 'black', @@ -2288,7 +2327,7 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '133', - styles: {}, + styles: {} }, { type: 'i-text', @@ -2296,7 +2335,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '-120', - top: "${this.parameters.type === 'filling' ? 125 : 1000}", + top: + "${this.parameters.type === 'filling' ? 125 : 1000}", width: 16, height: 36.16, fill: 'black', @@ -2336,7 +2376,7 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '134', - styles: {}, + styles: {} }, { type: 'i-text', @@ -2344,7 +2384,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '120', - top: "${this.parameters.type === 'filling' ? 125 : 1000}", + top: + "${this.parameters.type === 'filling' ? 125 : 1000}", width: 16, height: 36.16, fill: 'black', @@ -2384,7 +2425,7 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '135', - styles: {}, + styles: {} }, { type: 'circle', @@ -2392,7 +2433,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '-120', - top: "${this.parameters.type === 'filling' ? 30 : 1000}", + top: + "${this.parameters.type === 'filling' ? 30 : 1000}", width: 20, height: 20, fill: 'black', @@ -2422,7 +2464,7 @@ const studyObject = { radius: 10, startAngle: 0, endAngle: 6.283185307179586, - id: '136', + id: '136' }, { type: 'circle', @@ -2430,7 +2472,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '-120', - top: "${this.parameters.type === 'filling' ? 90 : 1000}", + top: + "${this.parameters.type === 'filling' ? 90 : 1000}", width: 20, height: 20, fill: 'black', @@ -2460,7 +2503,7 @@ const studyObject = { radius: 10, startAngle: 0, endAngle: 6.283185307179586, - id: '137', + id: '137' }, { type: 'circle', @@ -2468,7 +2511,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '120', - top: "${this.parameters.type === 'filling' ? 90 : 1000}", + top: + "${this.parameters.type === 'filling' ? 90 : 1000}", width: 20, height: 20, fill: 'black', @@ -2498,7 +2542,7 @@ const studyObject = { radius: 10, startAngle: 0, endAngle: 6.283185307179586, - id: '138', + id: '138' }, { type: 'circle', @@ -2506,7 +2550,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '120', - top: "${this.parameters.type === 'filling' ? 60 : 1000}", + top: + "${this.parameters.type === 'filling' ? 60 : 1000}", width: 20, height: 20, fill: 'black', @@ -2536,7 +2581,7 @@ const studyObject = { radius: 10, startAngle: 0, endAngle: 6.283185307179586, - id: '139', + id: '139' }, { type: 'circle', @@ -2544,7 +2589,8 @@ const studyObject = { originX: 'center', originY: 'center', left: '120', - top: "${this.parameters.type === 'filling' ? 30 : 1000}", + top: + "${this.parameters.type === 'filling' ? 30 : 1000}", width: 20, height: 20, fill: 'black', @@ -2574,8 +2620,8 @@ const studyObject = { radius: 10, startAngle: 0, endAngle: 6.283185307179586, - id: '140', - }, + id: '140' + } ], files: {}, parameters: {}, @@ -2585,30 +2631,30 @@ const studyObject = { title: 'Pause', skip: '${this.state.correct === true}', timeout: '3000', - tardy: true, - }, - ], - }, - }, - ], - }, - }, + tardy: true + } + ] + } + } + ] + } + } }, { type: 'lab.html.Screen', files: {}, parameters: {}, responses: { - 'keypress(Space)': 'end', + 'keypress(Space)': 'end' }, messageHandlers: {}, title: 'End', content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n', - }, - ], - }, - ], + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' + } + ] + } + ] }; // export diff --git a/app/utils/labjs/scripts/stroop.js b/app/utils/labjs/scripts/stroop.js index d48ba2ac..a5d59f41 100644 --- a/app/utils/labjs/scripts/stroop.js +++ b/app/utils/labjs/scripts/stroop.js @@ -22,13 +22,13 @@ const studyObject = { type: 'lab.html.Screen', responses: { 'keypress(Space)': 'continue', - 'keypress(q)': 'skipPractice', + 'keypress(q)': 'skipPractice' }, title: 'Instruction', content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EStroop Task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Cp\u003E\n Welcome to the \u003Cstrong\u003EStroop experiment\u003C\u002Fstrong\u003E!\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n To indicate the color of the word, please use the keys \u003Cstrong\u003Er\u003C\u002Fstrong\u003E, \u003Cstrong\u003Eg\u003C\u002Fstrong\u003E, \u003Cstrong\u003Eb\u003C\u002Fstrong\u003E and \u003Cstrong\u003Ey\u003C\u002Fstrong\u003E for \u003Cspan style="color: red;"\u003Ered\u003C\u002Fspan\u003E, \u003Cspan style="color: green;"\u003Egreen\u003C\u002Fspan\u003E, \u003Cspan style="color: blue;"\u003Eblue\u003C\u002Fspan\u003E and \u003Cspan style="color: #c5ad0b;"\u003Eyellow\u003C\u002Fspan\u003E, respectively.\n \u003Cbr\u003E\n Please answer quickly, and as accurately as you can.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Press the the space bar on your keyboard to start doing the practice trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n If you want to skip the practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n\n\n', parameters: {}, - files: {}, + files: {} }, { type: 'lab.canvas.Frame', @@ -50,49 +50,49 @@ const studyObject = { { color: 'red', word: 'red', - phase: 'practice', + phase: 'practice' }, { color: 'green', word: 'green', - phase: 'practice', + phase: 'practice' }, { color: 'blue', word: 'blue', - phase: 'practice', + phase: 'practice' }, { color: '#ffe32a', word: 'yellow', - phase: 'practice', + phase: 'practice' }, { color: 'red', word: 'green', - phase: 'practice', + phase: 'practice' }, { color: 'green', word: 'blue', - phase: 'practice', + phase: 'practice' }, { color: 'blue', word: 'yellow', - phase: 'practice', + phase: 'practice' }, { color: '#ffe32a', word: 'red', - phase: 'practice', - }, + phase: 'practice' + } ], title: 'Practice task', parameters: {}, files: {}, sample: { - mode: 'draw-shuffle', + mode: 'draw-shuffle' }, shuffleGroups: [], template: { @@ -152,8 +152,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '5', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -161,11 +161,11 @@ const studyObject = { messageHandlers: { run: function anonymous() { this.data.correct = 'empty'; - }, + } }, viewport: [800, 600], title: 'Fixation cross', - timeout: '${this.parameters.iti}', + timeout: '${this.parameters.iti}' }, { type: 'lab.canvas.Screen', @@ -216,8 +216,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '6', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -225,12 +225,12 @@ const studyObject = { 'keydown(r)': 'red', 'keydown(g)': 'green', 'keydown(b)': 'blue', - 'keydown(y)': '#ffe32a', + 'keydown(y)': '#ffe32a' }, messageHandlers: {}, viewport: [800, 600], title: 'Stroop screen', - correctResponse: '${ this.parameters.color }', + correctResponse: '${ this.parameters.color }' }, { type: 'lab.canvas.Screen', @@ -268,7 +268,8 @@ const studyObject = { transformMatrix: null, skewX: 0, skewY: 0, - text: "${ state.correct ? 'Well done!' : 'Please respond accurately' }", + text: + "${ state.correct ? 'Well done!' : 'Please respond accurately' }", fontSize: '52', fontWeight: 'bold', fontFamily: 'sans-serif', @@ -281,8 +282,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '24', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -291,10 +292,16 @@ const studyObject = { 'before:prepare': function anonymous() { this.data.trial_number = 1 + - parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); this.data.condition = - this.parameters.congruent === 'yes' ? 'Match' : 'Mismatch'; + this.parameters.congruent === 'yes' + ? 'Match' + : 'Mismatch'; this.data.reaction_time = this.state.duration; @@ -304,29 +311,30 @@ const studyObject = { this.data.correct_response = false; } - this.data.response_given = this.state.correct === 'empty' ? 'no' : 'yes'; - }, + this.data.response_given = + this.state.correct === 'empty' ? 'no' : 'yes'; + } }, viewport: [800, 600], title: 'Inter-trial interval', timeout: "${ parameters.phase == 'practice' ? 1000 : 500 }", - tardy: true, - }, - ], - }, - }, + tardy: true + } + ] + } + } }, { messageHandlers: {}, type: 'lab.html.Screen', responses: { - 'keypress(Space)': 'continue', + 'keypress(Space)': 'continue' }, title: 'Main task', content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n\n\n', parameters: {}, - files: {}, + files: {} }, { type: 'lab.canvas.Frame', @@ -347,153 +355,153 @@ const studyObject = { color: 'red', word: 'red', phase: 'task', - congruent: 'yes', + congruent: 'yes' }, { color: 'red', word: 'red', phase: 'task', - congruent: 'yes', + congruent: 'yes' }, { color: 'red', word: 'red', phase: 'task', - congruent: 'yes', + congruent: 'yes' }, { color: 'red', word: 'green', phase: 'task', - congruent: 'no', + congruent: 'no' }, { color: 'red', word: 'blue', phase: 'task', - congruent: 'no', + congruent: 'no' }, { color: 'red', word: 'yellow', phase: 'task', - congruent: 'no', + congruent: 'no' }, { color: 'green', word: 'red', phase: 'task', - congruent: 'no', + congruent: 'no' }, { color: 'green', word: 'green', phase: 'task', - congruent: 'yes', + congruent: 'yes' }, { color: 'green', word: 'green', phase: 'task', - congruent: 'yes', + congruent: 'yes' }, { color: 'green', word: 'green', phase: 'task', - congruent: 'yes', + congruent: 'yes' }, { color: 'green', word: 'blue', phase: 'task', - congruent: 'no', + congruent: 'no' }, { color: 'green', word: 'yellow', phase: 'task', - congruent: 'no', + congruent: 'no' }, { color: 'blue', word: 'red', phase: 'task', - congruent: 'no', + congruent: 'no' }, { color: 'blue', word: 'green', phase: 'task', - congruent: 'no', + congruent: 'no' }, { color: 'blue', word: 'blue', phase: 'task', - congruent: 'yes', + congruent: 'yes' }, { color: 'blue', word: 'blue', phase: 'task', - congruent: 'yes', + congruent: 'yes' }, { color: 'blue', word: 'blue', phase: 'task', - congruent: 'yes', + congruent: 'yes' }, { color: 'blue', word: 'yellow', phase: 'task', - congruent: 'no', + congruent: 'no' }, { color: '#ffe32a', word: 'red', phase: 'task', - congruent: 'no', + congruent: 'no' }, { color: '#ffe32a', word: 'green', phase: 'task', - congruent: 'no', + congruent: 'no' }, { color: '#ffe32a', word: 'blue', phase: 'task', - congruent: 'no', + congruent: 'no' }, { color: '#ffe32a', word: 'yellow', phase: 'task', - congruent: 'yes', + congruent: 'yes' }, { color: '#ffe32a', word: 'yellow', phase: 'task', - congruent: 'yes', + congruent: 'yes' }, { color: '#ffe32a', word: 'yellow', phase: 'task', - congruent: 'yes', - }, + congruent: 'yes' + } ], title: 'Stroop task', parameters: {}, files: {}, sample: { mode: 'draw-shuffle', - n: '96', + n: '96' }, shuffleGroups: [], template: { @@ -553,8 +561,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '5', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -562,11 +570,11 @@ const studyObject = { messageHandlers: { run: function anonymous() { this.data.correct = 'empty'; - }, + } }, viewport: [800, 600], title: 'Fixation cross', - timeout: '${this.parameters.iti}', + timeout: '${this.parameters.iti}' }, { type: 'lab.canvas.Screen', @@ -617,8 +625,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '6', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -626,16 +634,18 @@ const studyObject = { 'keydown(r)': 'red', 'keydown(g)': 'green', 'keydown(b)': 'blue', - 'keydown(y)': '#ffe32a', + 'keydown(y)': '#ffe32a' }, messageHandlers: { run: function anonymous() { - this.parameters.callbackForEEG(this.parameters.congruent === 'yes' ? 1 : 2); - }, + this.parameters.callbackForEEG( + this.parameters.congruent === 'yes' ? 1 : 2 + ); + } }, viewport: [800, 600], title: 'Stroop screen', - correctResponse: '${ this.parameters.color }', + correctResponse: '${ this.parameters.color }' }, { type: 'lab.canvas.Screen', @@ -673,7 +683,8 @@ const studyObject = { transformMatrix: null, skewX: 0, skewY: 0, - text: "${ state.correct ? 'Well done!' : 'Please respond accurately' }", + text: + "${ state.correct ? 'Well done!' : 'Please respond accurately' }", fontSize: '52', fontWeight: 'bold', fontFamily: 'sans-serif', @@ -686,8 +697,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '24', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -696,10 +707,16 @@ const studyObject = { 'before:prepare': function anonymous() { this.data.trial_number = 1 + - parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); this.data.condition = - this.parameters.congruent === 'yes' ? 'Match' : 'Mismatch'; + this.parameters.congruent === 'yes' + ? 'Match' + : 'Mismatch'; this.data.reaction_time = this.state.duration; @@ -709,33 +726,34 @@ const studyObject = { this.data.correct_response = false; } - this.data.response_given = this.state.correct === 'empty' ? 'no' : 'yes'; - }, + this.data.response_given = + this.state.correct === 'empty' ? 'no' : 'yes'; + } }, viewport: [800, 600], title: 'Inter-trial interval', timeout: "${ parameters.phase == 'practice' ? 1000 : 500 }", - tardy: true, - }, - ], - }, - }, + tardy: true + } + ] + } + } }, { messageHandlers: {}, type: 'lab.html.Screen', responses: { - 'keypress(Space)': 'end', + 'keypress(Space)': 'end' }, title: 'Thanks', content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n', parameters: {}, - files: {}, - }, - ], - }, - ], + files: {} + } + ] + } + ] }; // export diff --git a/app/utils/labjs/scripts/visualsearch.js b/app/utils/labjs/scripts/visualsearch.js index 1aa23ff0..c06d69c0 100644 --- a/app/utils/labjs/scripts/visualsearch.js +++ b/app/utils/labjs/scripts/visualsearch.js @@ -22,11 +22,12 @@ const studyObject = { parameters: {}, responses: { 'keypress(Space)': 'next', - 'keypress(q)': 'skipPractice', + 'keypress(q)': 'skipPractice' }, messageHandlers: {}, title: 'Instruction', - "content": "\u003Cstyle\u003E\n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cheader\u003E\n \u003Ch1\u003EVisual search task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n \u003Cp\u003E\n Again, all you need to do is to find an \u003Cb\u003Eorange T\u003C\u002Fb\u003E. If you see the \u003Cb\u003Eorange T\u003C\u002Fb\u003E, press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E. Ignore the upside-down orange T, as well as blue Ts! IF THERE IS NO ORANGE T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E.\n It is very important to respond \u003Cb\u003EAS FAST AS YOU CAN\u003C\u002Fb\u003E.\n \u003C\u002Fp\u003E\n\n \u003Cdiv style=\"display:grid; grid-template-columns:1fr 1fr;\"\u003E\n \u003Cdiv\u003E\n \u003Cp\u003E\n Find \n \u003C\u002Fp\u003E\n \u003Cbr\u003E\n \u003Cdiv class=\"letter\" style=\"color:orange; height: 100px;\"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003Cdiv\u003E\n \u003Cp\u003E\n But do not respond to any of these distractors:\n \u003C\u002Fp\u003E\n \u003Cbr\u003E\n \u003Cdiv style=\"display:grid; grid-template-columns: 100px 50px; justify-content: center; \"\u003E\n \u003Cdiv class=\"letter\" style=\"color:lightblue;\"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003Cdiv class=\"letter\" style=\"color:orange; transform: rotate(-180deg);\"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n\n \u003Cp\u003E\n Press the space bar on your keyboard to start doing the practice trials.\n If you want to skip the practice trials and go directly to the task, press the \"q\" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fmain\u003E" + content: + '\u003Cstyle\u003E\n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cheader\u003E\n \u003Ch1\u003EVisual search task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n \u003Cp\u003E\n Again, all you need to do is to find an \u003Cb\u003Eorange T\u003C\u002Fb\u003E. If you see the \u003Cb\u003Eorange T\u003C\u002Fb\u003E, press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E. Ignore the upside-down orange T, as well as blue Ts! IF THERE IS NO ORANGE T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E.\n It is very important to respond \u003Cb\u003EAS FAST AS YOU CAN\u003C\u002Fb\u003E.\n \u003C\u002Fp\u003E\n\n \u003Cdiv style="display:grid; grid-template-columns:1fr 1fr;"\u003E\n \u003Cdiv\u003E\n \u003Cp\u003E\n Find \n \u003C\u002Fp\u003E\n \u003Cbr\u003E\n \u003Cdiv class="letter" style="color:orange; height: 100px;"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003Cdiv\u003E\n \u003Cp\u003E\n But do not respond to any of these distractors:\n \u003C\u002Fp\u003E\n \u003Cbr\u003E\n \u003Cdiv style="display:grid; grid-template-columns: 100px 50px; justify-content: center; "\u003E\n \u003Cdiv class="letter" style="color:lightblue;"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003Cdiv class="letter" style="color:orange; transform: rotate(-180deg);"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n\n \u003Cp\u003E\n Press the space bar on your keyboard to start doing the practice trials.\n If you want to skip the practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fmain\u003E' }, { type: 'lab.flow.Loop', @@ -34,7 +35,7 @@ const studyObject = { parameters: {}, templateParameters: [], sample: { - mode: 'draw-shuffle', + mode: 'draw-shuffle' }, responses: {}, messageHandlers: { @@ -52,11 +53,15 @@ const studyObject = { return a; } - const randomBetween = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; + const randomBetween = (min, max) => + Math.floor(Math.random() * (max - min + 1)) + min; const makeStimuliArray = (arrLen, stLen, isTarget) => { const arr = Array(arrLen).fill(0); - const shuffled = shuffle([...Array(arrLen).keys()]).slice(0, stLen); + const shuffled = shuffle([...Array(arrLen).keys()]).slice( + 0, + stLen + ); for (const p of shuffled) { if (randomBetween(0, 1) === 0) { arr[p] = 1; @@ -77,7 +82,7 @@ const studyObject = { stimuli: makeStimuliArray(arrLength, stimLength, isTarget), target: isTarget, size: stimLength, - phase: 'practice', + phase: 'practice' }; } @@ -112,7 +117,7 @@ const studyObject = { // assign options values to parameters of this task this.options.templateParameters = practiceTrialParameters; this.options.shuffle = true; // already shuffled before - }, + } }, title: 'Practice task', tardy: true, @@ -185,8 +190,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '15', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -195,12 +200,12 @@ const studyObject = { run: function anonymous() { this.data.response = 'noresponse'; this.data.correct = false; - }, + } }, viewport: [800, 600], title: 'Fixation cross', - timeout: '${this.parameters.iti}', - }, + timeout: '${this.parameters.iti}' + } }, { type: 'lab.html.Screen', @@ -208,7 +213,7 @@ const studyObject = { parameters: {}, responses: { 'keypress(b)': 'yes', - 'keypress(n)': 'no', + 'keypress(n)': 'no' }, messageHandlers: { run: function anonymous() { @@ -239,12 +244,12 @@ const studyObject = { d.appendChild(el); taskgrid.appendChild(d); } - }, + } }, title: 'Stimuli', content: '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', - correctResponse: '${this.parameters.target}', + correctResponse: '${this.parameters.target}' }, { type: 'lab.html.Screen', @@ -283,26 +288,34 @@ const studyObject = { } if (this.state.response === 'noresponse') { - document.querySelector('#feedback').innerHTML = 'Please respond.'; + document.querySelector('#feedback').innerHTML = + 'Please respond.'; return; } if (this.state.correct) { - document.querySelector('#feedback').innerHTML = 'Well done!'; + document.querySelector('#feedback').innerHTML = + 'Well done!'; document.querySelector('#feedback').style.color = 'green'; } else if (this.parameters.target === 'yes') { - document.querySelector('#feedback').innerHTML = 'Error! There was one!'; - document.querySelector('#target').style.border = 'solid'; - } else { - document.querySelector('#feedback').innerHTML = 'Error! There was none!'; - } + document.querySelector('#feedback').innerHTML = + 'Error! There was one!'; + document.querySelector('#target').style.border = 'solid'; + } else { + document.querySelector('#feedback').innerHTML = + 'Error! There was none!'; + } }, 'before:prepare': function anonymous() { this.data.trial_number = 1 + - parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); - this.data.condition = `${this.parameters.size } letters`; + this.data.condition = `${this.parameters.size} letters`; this.data.reaction_time = this.state.duration; // this.data.target = this.parameters.target; @@ -314,32 +327,33 @@ const studyObject = { } this.data.response_given = - this.parameters.phase === 'practice' || this.state.response === 'noresponse' + this.parameters.phase === 'practice' || + this.state.response === 'noresponse' ? 'no' : 'yes'; - }, + } }, title: 'Feedback', content: '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n .feedback{\n position: absolute;\n top: 50px;\n font-size: 2rem;\n font-weight: bold;\n color: #da5b1c;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n \u003Cdiv id="feedback" class="feedback"\u003E\n Feedback\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n\n', timeout: '2000', tardy: true, - skip: "${ parameters.phase === 'main' }", - }, - ], - }, + skip: "${ parameters.phase === 'main' }" + } + ] + } }, { type: 'lab.html.Screen', files: {}, parameters: {}, responses: { - 'keypress(Space)': 'continue', + 'keypress(Space)': 'continue' }, messageHandlers: {}, title: 'Main task instruction', content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n', + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n' }, { type: 'lab.flow.Loop', @@ -347,7 +361,7 @@ const studyObject = { parameters: {}, templateParameters: [], sample: { - mode: 'draw-shuffle', + mode: 'draw-shuffle' }, responses: {}, messageHandlers: { @@ -365,11 +379,15 @@ const studyObject = { return a; } - const randomBetween = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; + const randomBetween = (min, max) => + Math.floor(Math.random() * (max - min + 1)) + min; const makeStimuliArray = (arrLen, stLen, isTarget) => { const arr = Array(arrLen).fill(0); - const shuffled = shuffle([...Array(arrLen).keys()]).slice(0, stLen); + const shuffled = shuffle([...Array(arrLen).keys()]).slice( + 0, + stLen + ); for (const p of shuffled) { if (randomBetween(0, 1) === 0) { arr[p] = 1; @@ -390,26 +408,42 @@ const studyObject = { stimuli: makeStimuliArray(arrLength, stimLength, isTarget), target: isTarget, size: stimLength, - phase: 'main', + phase: 'main' }; } const numberTrials = 10; for (let i = 1; i <= numberTrials; i++) { - trialParameters = trialParameters.concat(trialConstructor(i, 5, 'yes')); - trialParameters = trialParameters.concat(trialConstructor(i, 5, 'no')); - trialParameters = trialParameters.concat(trialConstructor(i, 10, 'yes')); - trialParameters = trialParameters.concat(trialConstructor(i, 10, 'no')); - trialParameters = trialParameters.concat(trialConstructor(i, 15, 'yes')); - trialParameters = trialParameters.concat(trialConstructor(i, 15, 'no')); - trialParameters = trialParameters.concat(trialConstructor(i, 20, 'yes')); - trialParameters = trialParameters.concat(trialConstructor(i, 20, 'no')); + trialParameters = trialParameters.concat( + trialConstructor(i, 5, 'yes') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 5, 'no') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 10, 'yes') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 10, 'no') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 15, 'yes') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 15, 'no') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 20, 'yes') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 20, 'no') + ); } // assign options values to parameters of this task this.options.templateParameters = trialParameters; this.options.shuffle = true; // already shuffled before - }, + } }, title: 'Main task', shuffleGroups: [], @@ -480,8 +514,8 @@ const studyObject = { textBackgroundColor: '', charSpacing: 0, id: '15', - styles: {}, - }, + styles: {} + } ], files: {}, parameters: {}, @@ -490,12 +524,12 @@ const studyObject = { run: function anonymous() { this.data.response = 'noresponse'; this.data.correct = false; - }, + } }, viewport: [800, 600], title: 'Fixation cross', - timeout: '${this.parameters.iti}', - }, + timeout: '${this.parameters.iti}' + } }, { type: 'lab.html.Screen', @@ -503,11 +537,13 @@ const studyObject = { parameters: {}, responses: { 'keypress(b)': 'yes', - 'keypress(n)': 'no', + 'keypress(n)': 'no' }, messageHandlers: { run: function anonymous() { - this.parameters.callbackForEEG(parseInt(this.parameters.size) < 13 ? 2 : 1); + this.parameters.callbackForEEG( + parseInt(this.parameters.size) < 13 ? 2 : 1 + ); const taskgrid = document.querySelector('#taskgrid'); const stimuli = this.parameters.stimuli; @@ -535,12 +571,12 @@ const studyObject = { d.appendChild(el); taskgrid.appendChild(d); } - }, + } }, title: 'Stimuli', content: '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', - correctResponse: '${this.parameters.target}', + correctResponse: '${this.parameters.target}' }, { type: 'lab.html.Screen', @@ -579,26 +615,34 @@ const studyObject = { } if (this.state.response === 'noresponse') { - document.querySelector('#feedback').innerHTML = 'Please respond!'; + document.querySelector('#feedback').innerHTML = + 'Please respond!'; return; } if (this.state.correct) { - document.querySelector('#feedback').innerHTML = 'Well done!'; + document.querySelector('#feedback').innerHTML = + 'Well done!'; document.querySelector('#feedback').style.color = 'green'; } else if (this.parameters.target === 'yes') { - document.querySelector('#feedback').innerHTML = 'Error! There was one!'; - document.querySelector('#target').style.border = 'solid'; - } else { - document.querySelector('#feedback').innerHTML = 'Error! There was none!'; - } + document.querySelector('#feedback').innerHTML = + 'Error! There was one!'; + document.querySelector('#target').style.border = 'solid'; + } else { + document.querySelector('#feedback').innerHTML = + 'Error! There was none!'; + } }, 'before:prepare': function anonymous() { this.data.trial_number = 1 + - parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); - this.data.condition = `${this.parameters.size } letters`; + this.data.condition = `${this.parameters.size} letters`; this.data.reaction_time = this.state.duration; // this.data.target = this.parameters.target; @@ -610,36 +654,37 @@ const studyObject = { } this.data.response_given = - this.parameters.phase === 'practice' || this.state.response === 'noresponse' + this.parameters.phase === 'practice' || + this.state.response === 'noresponse' ? 'no' : 'yes'; - }, + } }, title: 'Feedback', content: '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n .feedback{\n position: absolute;\n top: 50px;\n font-size: 2rem;\n font-weight: bold;\n color: #da5b1c;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n \u003Cdiv id="feedback" class="feedback"\u003E\n Feedback\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n\n', timeout: '2000', tardy: true, - skip: "${ parameters.phase === 'main' }", - }, - ], - }, + skip: "${ parameters.phase === 'main' }" + } + ] + } }, { type: 'lab.html.Screen', files: {}, parameters: {}, responses: { - 'keypress(Space)': 'end', + 'keypress(Space)': 'end' }, messageHandlers: {}, title: 'End', content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n', - }, - ], - }, - ], + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' + } + ] + } + ] }; // export export default studyObject; diff --git a/app/viewer.html b/app/viewer.html index 8d33eb47..198ff3ff 100644 --- a/app/viewer.html +++ b/app/viewer.html @@ -1,69 +1,66 @@ - - - + + Viewer - + - + - - - - \ No newline at end of file + + diff --git a/appveyor.yml b/appveyor.yml index ba5c6de6..56158c1e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,7 +6,7 @@ environment: - nodejs_version: 9 cache: - - "%LOCALAPPDATA%/Yarn" + - '%LOCALAPPDATA%/Yarn' - node_modules -> package.json - app/node_modules -> app/package.json diff --git a/environment.yml b/environment.yml index 0e1be4b1..f504563b 100644 --- a/environment.yml +++ b/environment.yml @@ -1,16 +1,16 @@ name: brainwaves channels: -- defaults + - defaults dependencies: -- python>=3.6 -- pip -- numpy -- scipy -- matplotlib -- pyqt>=5.9 -- pandas -- seaborn -- jupyter -- pip: - - mne - - pyzmq>=18.0.1 + - python>=3.6 + - pip + - numpy + - scipy + - matplotlib + - pyqt>=5.9 + - pandas + - seaborn + - jupyter + - pip: + - mne + - pyzmq>=18.0.1 From ec212c731bd117c9cfa34cd5768b2feafb585d66 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Mon, 22 Jun 2020 21:34:53 -0700 Subject: [PATCH 11/66] more flow -ts --- .../{deviceActions.js => deviceActions.ts} | 4 +- ...erimentActions.js => experimentActions.ts} | 2 +- .../{jupyterActions.js => jupyterActions.ts} | 4 +- app/constants/{constants.js => constants.ts} | 19 +- .../{interfaces.js => interfaces.ts} | 44 +- ...nalyzeContainer.js => AnalyzeContainer.ts} | 14 +- app/containers/{App.js => App.tsx} | 18 +- .../{CleanContainer.js => CleanContainer.ts} | 14 +- ...ollectContainer.js => CollectContainer.ts} | 14 +- ...tainer.js => ExperimentDesignContainer.ts} | 12 +- .../{HomeContainer.js => HomeContainer.ts} | 16 +- app/containers/Root.js | 22 - app/containers/Root.tsx | 22 + ...vBarContainer.js => TopNavBarContainer.ts} | 12 +- app/css.d.ts | 9 + app/epics/deviceEpics.js | 252 -- app/epics/deviceEpics.ts | 119 + app/epics/experimentEpics.js | 221 -- app/epics/experimentEpics.ts | 94 + app/epics/index.js | 6 - app/epics/index.ts | 6 + app/epics/jupyterEpics.js | 447 --- app/epics/jupyterEpics.ts | 197 ++ app/{main.dev.js => main.dev.ts} | 21 +- app/main.prod.ts | 1507 ++++++++++ app/menu.js | 245 -- app/menu.ts | 184 ++ .../{deviceReducer.js => deviceReducer.ts} | 46 +- ...erimentReducer.js => experimentReducer.ts} | 67 +- app/reducers/index.js | 15 - app/reducers/index.ts | 15 + .../{jupyterReducer.js => jupyterReducer.ts} | 53 +- app/routes.js | 46 - app/routes.tsx | 31 + ...gureStore.dev.js => configureStore.dev.ts} | 38 +- app/store/configureStore.js | 11 - app/store/configureStore.prod.js | 22 - app/store/configureStore.prod.ts | 22 + app/store/configureStore.ts | 12 + app/utils/behavior/compute.js | 553 ---- app/utils/behavior/compute.ts | 354 +++ app/utils/eeg/{cortex.js => cortex.ts} | 101 +- app/utils/eeg/{emotiv.js => emotiv.ts} | 62 +- app/utils/eeg/{muse.js => muse.ts} | 78 +- app/utils/eeg/pipes.js | 54 - app/utils/eeg/pipes.ts | 35 + app/utils/filesystem/dialog.js | 48 - app/utils/filesystem/dialog.ts | 42 + app/utils/filesystem/select.js | 16 - app/utils/filesystem/select.ts | 15 + .../filesystem/{storage.js => storage.ts} | 155 +- app/utils/filesystem/{write.js => write.ts} | 28 +- app/utils/jupyter/cells.js | 108 - app/utils/jupyter/cells.ts | 43 + .../jupyter/{functions.js => functions.ts} | 16 +- app/utils/jupyter/pipes.js | 21 - app/utils/jupyter/pipes.ts | 9 + app/utils/labjs/functions.js | 44 - app/utils/labjs/functions.ts | 40 + app/utils/labjs/{index.js => index.tsx} | 69 +- .../labjs/protocols/{custom.js => custom.ts} | 38 +- .../{faceshouses.js => faceshouses.ts} | 101 +- .../labjs/protocols/{multi.js => multi.ts} | 46 +- .../labjs/protocols/{search.js => search.ts} | 27 +- .../labjs/protocols/{stroop.js => stroop.ts} | 38 +- app/utils/labjs/scripts/custom.js | 522 ---- app/utils/labjs/scripts/custom.ts | 436 +++ app/utils/labjs/scripts/faceshouses.js | 521 ---- app/utils/labjs/scripts/faceshouses.ts | 436 +++ app/utils/labjs/scripts/multitasking.js | 2661 ----------------- app/utils/labjs/scripts/multitasking.ts | 2502 ++++++++++++++++ app/utils/labjs/scripts/stroop.js | 760 ----- app/utils/labjs/scripts/stroop.ts | 669 +++++ app/utils/labjs/scripts/visualsearch.js | 690 ----- app/utils/labjs/scripts/visualsearch.ts | 591 ++++ app/{viewer.js => viewer.ts} | 2 +- 76 files changed, 7835 insertions(+), 7999 deletions(-) rename app/actions/{deviceActions.js => deviceActions.ts} (92%) rename app/actions/{experimentActions.js => experimentActions.ts} (99%) rename app/actions/{jupyterActions.js => jupyterActions.ts} (91%) rename app/constants/{constants.js => constants.ts} (95%) rename app/constants/{interfaces.js => interfaces.ts} (70%) rename app/containers/{AnalyzeContainer.js => AnalyzeContainer.ts} (63%) rename app/containers/{App.js => App.tsx} (50%) rename app/containers/{CleanContainer.js => CleanContainer.ts} (65%) rename app/containers/{CollectContainer.js => CollectContainer.ts} (56%) rename app/containers/{ExperimentDesignContainer.js => ExperimentDesignContainer.ts} (55%) rename app/containers/{HomeContainer.js => HomeContainer.ts} (57%) delete mode 100644 app/containers/Root.js create mode 100644 app/containers/Root.tsx rename app/containers/{TopNavBarContainer.js => TopNavBarContainer.ts} (65%) create mode 100644 app/css.d.ts delete mode 100644 app/epics/deviceEpics.js create mode 100644 app/epics/deviceEpics.ts delete mode 100644 app/epics/experimentEpics.js create mode 100644 app/epics/experimentEpics.ts delete mode 100644 app/epics/index.js create mode 100644 app/epics/index.ts delete mode 100644 app/epics/jupyterEpics.js create mode 100644 app/epics/jupyterEpics.ts rename app/{main.dev.js => main.dev.ts} (84%) create mode 100644 app/main.prod.ts delete mode 100644 app/menu.js create mode 100644 app/menu.ts rename app/reducers/{deviceReducer.js => deviceReducer.ts} (58%) rename app/reducers/{experimentReducer.js => experimentReducer.ts} (60%) delete mode 100644 app/reducers/index.js create mode 100644 app/reducers/index.ts rename app/reducers/{jupyterReducer.js => jupyterReducer.ts} (57%) delete mode 100644 app/routes.js create mode 100644 app/routes.tsx rename app/store/{configureStore.dev.js => configureStore.dev.ts} (60%) delete mode 100644 app/store/configureStore.js delete mode 100644 app/store/configureStore.prod.js create mode 100644 app/store/configureStore.prod.ts create mode 100644 app/store/configureStore.ts delete mode 100644 app/utils/behavior/compute.js create mode 100644 app/utils/behavior/compute.ts rename app/utils/eeg/{cortex.js => cortex.ts} (68%) rename app/utils/eeg/{emotiv.js => emotiv.ts} (76%) rename app/utils/eeg/{muse.js => muse.ts} (60%) delete mode 100644 app/utils/eeg/pipes.js create mode 100644 app/utils/eeg/pipes.ts delete mode 100644 app/utils/filesystem/dialog.js create mode 100644 app/utils/filesystem/dialog.ts delete mode 100644 app/utils/filesystem/select.js create mode 100644 app/utils/filesystem/select.ts rename app/utils/filesystem/{storage.js => storage.ts} (58%) mode change 100755 => 100644 rename app/utils/filesystem/{write.js => write.ts} (76%) delete mode 100644 app/utils/jupyter/cells.js create mode 100644 app/utils/jupyter/cells.ts rename app/utils/jupyter/{functions.js => functions.ts} (82%) delete mode 100644 app/utils/jupyter/pipes.js create mode 100644 app/utils/jupyter/pipes.ts delete mode 100644 app/utils/labjs/functions.js create mode 100644 app/utils/labjs/functions.ts rename app/utils/labjs/{index.js => index.tsx} (61%) rename app/utils/labjs/protocols/{custom.js => custom.ts} (87%) rename app/utils/labjs/protocols/{faceshouses.js => faceshouses.ts} (77%) rename app/utils/labjs/protocols/{multi.js => multi.ts} (84%) rename app/utils/labjs/protocols/{search.js => search.ts} (91%) rename app/utils/labjs/protocols/{stroop.js => stroop.ts} (87%) delete mode 100644 app/utils/labjs/scripts/custom.js create mode 100644 app/utils/labjs/scripts/custom.ts delete mode 100644 app/utils/labjs/scripts/faceshouses.js create mode 100644 app/utils/labjs/scripts/faceshouses.ts delete mode 100644 app/utils/labjs/scripts/multitasking.js create mode 100644 app/utils/labjs/scripts/multitasking.ts delete mode 100644 app/utils/labjs/scripts/stroop.js create mode 100644 app/utils/labjs/scripts/stroop.ts delete mode 100644 app/utils/labjs/scripts/visualsearch.js create mode 100644 app/utils/labjs/scripts/visualsearch.ts rename app/{viewer.js => viewer.ts} (99%) diff --git a/app/actions/deviceActions.js b/app/actions/deviceActions.ts similarity index 92% rename from app/actions/deviceActions.js rename to app/actions/deviceActions.ts index 86719165..8b000662 100644 --- a/app/actions/deviceActions.js +++ b/app/actions/deviceActions.ts @@ -1,4 +1,4 @@ -import { EXPERIMENT_CLEANUP } from '../epics/experimentEpics'; +import { EXPERIMENT_CLEANUP } from "../epics/experimentEpics"; // ------------------------------------------------------------------------- // Action Types @@ -27,4 +27,4 @@ export const setConnectionStatus = payload => ({ export const setDeviceAvailability = payload => ({ payload, type: SET_DEVICE_AVAILABILITY -}); +}); \ No newline at end of file diff --git a/app/actions/experimentActions.js b/app/actions/experimentActions.ts similarity index 99% rename from app/actions/experimentActions.js rename to app/actions/experimentActions.ts index 1bff6996..0a8001f8 100644 --- a/app/actions/experimentActions.js +++ b/app/actions/experimentActions.ts @@ -40,4 +40,4 @@ export const loadDefaultTimeline = () => ({ type: LOAD_DEFAULT_TIMELINE }); export const setTitle = payload => ({ payload, type: SET_TITLE }); export const saveWorkspace = () => ({ type: SAVE_WORKSPACE }); export const setState = payload => ({ payload, type: SET_EXPERIMENT_STATE }); -export const setEEGEnabled = payload => ({ payload, type: SET_EEG_ENABLED }); +export const setEEGEnabled = payload => ({ payload, type: SET_EEG_ENABLED }); \ No newline at end of file diff --git a/app/actions/jupyterActions.js b/app/actions/jupyterActions.ts similarity index 91% rename from app/actions/jupyterActions.js rename to app/actions/jupyterActions.ts index 85057fbf..a783a2f9 100644 --- a/app/actions/jupyterActions.js +++ b/app/actions/jupyterActions.ts @@ -38,7 +38,7 @@ export const loadPSD = () => ({ type: LOAD_PSD }); -export const loadERP = (payload: ?string) => ({ +export const loadERP = (payload: string | null | undefined) => ({ payload, type: LOAD_ERP }); @@ -49,4 +49,4 @@ export const loadTopo = () => ({ export const cleanEpochs = () => ({ type: CLEAN_EPOCHS }); -export const closeKernel = () => ({ type: CLOSE_KERNEL }); +export const closeKernel = () => ({ type: CLOSE_KERNEL }); \ No newline at end of file diff --git a/app/constants/constants.js b/app/constants/constants.ts similarity index 95% rename from app/constants/constants.js rename to app/constants/constants.ts index 574416f9..a687ade6 100644 --- a/app/constants/constants.js +++ b/app/constants/constants.ts @@ -92,22 +92,7 @@ export const CHANNELS = { AUX: { index: 4, color: '#E7789E' } }; -export const EMOTIV_CHANNELS = [ - 'AF3', - 'F7', - 'F3', - 'FC5', - 'T7', - 'P7', - 'O1', - 'O2', - 'P8', - 'T8', - 'FC6', - 'F4', - 'F8', - 'AF4' -]; +export const EMOTIV_CHANNELS = ['AF3', 'F7', 'F3', 'FC5', 'T7', 'P7', 'O1', 'O2', 'P8', 'T8', 'FC6', 'F4', 'F8', 'AF4']; export const MUSE_CHANNELS = ['TP9', 'AF7', 'AF8', 'TP10', 'AUX']; @@ -138,4 +123,4 @@ export const SIGNAL_QUALITY_THRESHOLDS = { export const FILE_TYPES = { STIMULUS_DIR: 'STIMULUS_DIR', TIMELINE: 'TIMELINE' -}; +}; \ No newline at end of file diff --git a/app/constants/interfaces.js b/app/constants/interfaces.ts similarity index 70% rename from app/constants/interfaces.js rename to app/constants/interfaces.ts index 3742cd56..8b5a943e 100644 --- a/app/constants/interfaces.js +++ b/app/constants/interfaces.ts @@ -2,7 +2,7 @@ * This file contains all the custom types that we use for Flow type checking */ -import { EVENTS } from './constants'; +import { EVENTS } from "./constants"; // TODO: Write interfaces for device objects (Observables, Classes, etc) @@ -10,22 +10,22 @@ import { EVENTS } from './constants'; // lab.js Experiment export type ExperimentParameters = { - trialDuration: number, - nbTrials: number, - iti: number, - jitter: number, - sampleType: string, - intro: string, + trialDuration: number; + nbTrials: number; + iti: number; + jitter: number; + sampleType: string; + intro: string; // Setting this to any prevents ridiculous flow runtime errors - showProgessBar: any, - stimulus1: { dir: string, type: EVENTS, title: string, response: string }, - stimulus2: { dir: string, type: EVENTS, title: string, response: string } + showProgessBar: any; + stimulus1: {dir: string;type: EVENTS;title: string;response: string;}; + stimulus2: {dir: string;type: EVENTS;title: string;response: string;}; }; export type ExperimentDescription = { - question: string, - hypothesis: string, - methods: string + question: string; + hypothesis: string; + methods: string; }; // Array of timeline and trial ids that will be presented in experiment @@ -36,18 +36,18 @@ export interface Trial { id: string; type: string; stimulus?: string | StimulusVariable; - trial_duration?: number | (() => number); + trial_duration?: number | () => number; post_trial_gap?: number; - on_load?: string => void | StimulusVariable; + on_load?: (arg0: string) => void | StimulusVariable; choices?: Array; } // Timeline of jsPsych trials export type Timeline = { - id: string, - timeline: Array, - sample?: SampleParameter, - timeline_variables?: Array + id: string; + timeline: Array; + sample?: SampleParameter; + timeline_variables?: Array; }; export interface SampleParameter { @@ -86,6 +86,6 @@ export interface DeviceInfo { // General export interface ActionType { - +payload: any; - +type: string; -} + readonly payload: any; + readonly type: string; +} \ No newline at end of file diff --git a/app/containers/AnalyzeContainer.js b/app/containers/AnalyzeContainer.ts similarity index 63% rename from app/containers/AnalyzeContainer.js rename to app/containers/AnalyzeContainer.ts index 628a685e..7481dcec 100644 --- a/app/containers/AnalyzeContainer.js +++ b/app/containers/AnalyzeContainer.ts @@ -1,9 +1,9 @@ -// @flow -import { bindActionCreators } from 'redux'; -import { connect } from 'react-redux'; -import Analyze from '../components/AnalyzeComponent'; -import * as experimentActions from '../actions/experimentActions'; -import * as jupyterActions from '../actions/jupyterActions'; + +import { bindActionCreators } from "redux"; +import { connect } from "react-redux"; +import Analyze from "../components/AnalyzeComponent"; +import * as experimentActions from "../actions/experimentActions"; +import * as jupyterActions from "../actions/jupyterActions"; function mapStateToProps(state) { return { @@ -22,4 +22,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(Analyze); +export default connect(mapStateToProps, mapDispatchToProps)(Analyze); \ No newline at end of file diff --git a/app/containers/App.js b/app/containers/App.tsx similarity index 50% rename from app/containers/App.js rename to app/containers/App.tsx index 27bc16cf..082cba0b 100644 --- a/app/containers/App.js +++ b/app/containers/App.tsx @@ -1,22 +1,20 @@ -// @flow -import * as React from 'react'; -import { ToastContainer } from 'react-toastify'; -import TopNav from './TopNavBarContainer'; + +import * as React from "react"; +import { ToastContainer } from "react-toastify"; +import TopNav from "./TopNavBarContainer"; type Props = { - children: React.Node + children: React.ReactNode; }; export default class App extends React.Component { // props: Props; render() { - return ( -
+ return
{this.props.children} -
- ); +
; } -} +} \ No newline at end of file diff --git a/app/containers/CleanContainer.js b/app/containers/CleanContainer.ts similarity index 65% rename from app/containers/CleanContainer.js rename to app/containers/CleanContainer.ts index fa27941e..c672fd6d 100644 --- a/app/containers/CleanContainer.js +++ b/app/containers/CleanContainer.ts @@ -1,9 +1,9 @@ -// @flow -import { bindActionCreators } from 'redux'; -import { connect } from 'react-redux'; -import CleanComponent from '../components/CleanComponent'; -import * as experimentActions from '../actions/experimentActions'; -import * as jupyterActions from '../actions/jupyterActions'; + +import { bindActionCreators } from "redux"; +import { connect } from "react-redux"; +import CleanComponent from "../components/CleanComponent"; +import * as experimentActions from "../actions/experimentActions"; +import * as jupyterActions from "../actions/jupyterActions"; function mapStateToProps(state) { return { @@ -24,4 +24,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(CleanComponent); +export default connect(mapStateToProps, mapDispatchToProps)(CleanComponent); \ No newline at end of file diff --git a/app/containers/CollectContainer.js b/app/containers/CollectContainer.ts similarity index 56% rename from app/containers/CollectContainer.js rename to app/containers/CollectContainer.ts index bbb10f25..4692fb1a 100644 --- a/app/containers/CollectContainer.js +++ b/app/containers/CollectContainer.ts @@ -1,9 +1,9 @@ -// @flow -import { bindActionCreators } from 'redux'; -import { connect } from 'react-redux'; -import Collect from '../components/CollectComponent'; -import * as deviceActions from '../actions/deviceActions'; -import * as experimentActions from '../actions/experimentActions'; + +import { bindActionCreators } from "redux"; +import { connect } from "react-redux"; +import Collect from "../components/CollectComponent"; +import * as deviceActions from "../actions/deviceActions"; +import * as experimentActions from "../actions/experimentActions"; function mapStateToProps(state) { return { @@ -19,4 +19,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(Collect); +export default connect(mapStateToProps, mapDispatchToProps)(Collect); \ No newline at end of file diff --git a/app/containers/ExperimentDesignContainer.js b/app/containers/ExperimentDesignContainer.ts similarity index 55% rename from app/containers/ExperimentDesignContainer.js rename to app/containers/ExperimentDesignContainer.ts index b0508bf6..679f1269 100644 --- a/app/containers/ExperimentDesignContainer.js +++ b/app/containers/ExperimentDesignContainer.ts @@ -1,8 +1,8 @@ -// @flow -import { bindActionCreators } from 'redux'; -import { connect } from 'react-redux'; -import Design from '../components/DesignComponent'; -import * as experimentActions from '../actions/experimentActions'; + +import { bindActionCreators } from "redux"; +import { connect } from "react-redux"; +import Design from "../components/DesignComponent"; +import * as experimentActions from "../actions/experimentActions"; function mapStateToProps(state) { return { @@ -16,4 +16,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(Design); +export default connect(mapStateToProps, mapDispatchToProps)(Design); \ No newline at end of file diff --git a/app/containers/HomeContainer.js b/app/containers/HomeContainer.ts similarity index 57% rename from app/containers/HomeContainer.js rename to app/containers/HomeContainer.ts index 8a1ac6d0..30318f5b 100644 --- a/app/containers/HomeContainer.js +++ b/app/containers/HomeContainer.ts @@ -1,10 +1,10 @@ -// @flow -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import Home from '../components/HomeComponent'; -import * as deviceActions from '../actions/deviceActions'; -import * as jupyterActions from '../actions/jupyterActions'; -import * as experimentActions from '../actions/experimentActions'; + +import { connect } from "react-redux"; +import { bindActionCreators } from "redux"; +import Home from "../components/HomeComponent"; +import * as deviceActions from "../actions/deviceActions"; +import * as jupyterActions from "../actions/jupyterActions"; +import * as experimentActions from "../actions/experimentActions"; function mapStateToProps(state) { return { @@ -21,4 +21,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(Home); +export default connect(mapStateToProps, mapDispatchToProps)(Home); \ No newline at end of file diff --git a/app/containers/Root.js b/app/containers/Root.js deleted file mode 100644 index 0c1b8b54..00000000 --- a/app/containers/Root.js +++ /dev/null @@ -1,22 +0,0 @@ -// @flow -import React, { Component } from 'react'; -import { Provider } from 'react-redux'; -import { ConnectedRouter } from 'react-router-redux'; -import Routes from '../routes'; - -interface Props { - store: {}; - history: {}; -} - -export default class Root extends Component { - render() { - return ( - - - - - - ); - } -} diff --git a/app/containers/Root.tsx b/app/containers/Root.tsx new file mode 100644 index 00000000..5480e760 --- /dev/null +++ b/app/containers/Root.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { Provider } from 'react-redux'; +import { ConnectedRouter } from 'connected-react-router'; +import { hot } from 'react-hot-loader/root'; +import { History } from 'history'; +import { Store } from '../reducers/types'; +import Routes from '../Routes'; + +interface Props { + store: Store; + history: History; +} + +const Root = ({ store, history }: Props) => ( + + + + + +); + +export default hot(Root); diff --git a/app/containers/TopNavBarContainer.js b/app/containers/TopNavBarContainer.ts similarity index 65% rename from app/containers/TopNavBarContainer.js rename to app/containers/TopNavBarContainer.ts index f93dac46..bdfb18c8 100644 --- a/app/containers/TopNavBarContainer.js +++ b/app/containers/TopNavBarContainer.ts @@ -1,8 +1,8 @@ -// @flow -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import TopNavComponent from '../components/TopNavComponent'; -import * as experimentActions from '../actions/experimentActions'; + +import { connect } from "react-redux"; +import { bindActionCreators } from "redux"; +import TopNavComponent from "../components/TopNavComponent"; +import * as experimentActions from "../actions/experimentActions"; function mapStateToProps(state) { return { @@ -20,4 +20,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(TopNavComponent); +export default connect(mapStateToProps, mapDispatchToProps)(TopNavComponent); \ No newline at end of file diff --git a/app/css.d.ts b/app/css.d.ts new file mode 100644 index 00000000..f27c653e --- /dev/null +++ b/app/css.d.ts @@ -0,0 +1,9 @@ +declare module '*.scss' { + const content: { [className: string]: string }; + export default content; + } + + declare module '*.css' { + const content: { [className: string]: string }; + export default content; + } diff --git a/app/epics/deviceEpics.js b/app/epics/deviceEpics.js deleted file mode 100644 index b3c48bef..00000000 --- a/app/epics/deviceEpics.js +++ /dev/null @@ -1,252 +0,0 @@ -import { combineEpics } from 'redux-observable'; -import { of, from, timer } from 'rxjs'; -import { map, pluck, mergeMap, tap, filter, catchError } from 'rxjs/operators'; -import { isNil } from 'lodash'; -import { toast } from 'react-toastify'; -import { - CONNECT_TO_DEVICE, - SET_DEVICE_AVAILABILITY, - setDeviceAvailability, - setConnectionStatus -} from '../actions/deviceActions'; -import { - getEmotiv, - connectToEmotiv, - createRawEmotivObservable, - createEmotivSignalQualityObservable, - disconnectFromEmotiv -} from '../utils/eeg/emotiv'; -import { - getMuse, - connectToMuse, - createRawMuseObservable, - createMuseSignalQualityObservable, - disconnectFromMuse -} from '../utils/eeg/muse'; -import { - CONNECTION_STATUS, - DEVICES, - DEVICE_AVAILABILITY, - SEARCH_TIMER -} from '../constants/constants'; -import { EXPERIMENT_CLEANUP } from './experimentEpics'; - -export const DEVICE_FOUND = 'DEVICE_FOUND'; -export const SET_DEVICE_TYPE = 'DEVICE_TYPE'; -export const SET_CONNECTION_STATUS = 'SET_CONNECTION_STATUS'; -export const SET_DEVICE_INFO = 'SET_DEVICE_INFO'; -export const SET_AVAILABLE_DEVICES = 'SET_AVAILABLE_DEVICES'; -export const SET_RAW_OBSERVABLE = 'SET_RAW_OBSERVABLE'; -export const SET_SIGNAL_OBSERVABLE = 'SET_SIGNAL_OBSERVABLE'; -export const DEVICE_CLEANUP = 'DEVICE_CLEANUP'; - -// ------------------------------------------------------------------------- -// Action Creators - -const deviceFound = payload => ({ - payload, - type: DEVICE_FOUND -}); - -const setDeviceType = payload => ({ - payload, - type: SET_DEVICE_TYPE -}); - -const setRawObservable = payload => ({ - payload, - type: SET_RAW_OBSERVABLE -}); - -const setSignalQualityObservable = payload => ({ - payload, - type: SET_SIGNAL_OBSERVABLE -}); - -const setAvailableDevices = payload => ({ - payload, - type: SET_AVAILABLE_DEVICES -}); - -const setDeviceInfo = payload => ({ - payload, - type: SET_DEVICE_INFO -}); - -const cleanup = () => ({ type: DEVICE_CLEANUP }); - -// ------------------------------------------------------------------------- -// Epics - -// NOTE: Uses a Promise "then" inside b/c Observable.from leads to loss of user gesture propagation for web bluetooth -const searchMuseEpic = action$ => - action$.ofType(SET_DEVICE_AVAILABILITY).pipe( - pluck('payload'), - filter(status => status === DEVICE_AVAILABILITY.SEARCHING), - map(getMuse), - mergeMap(promise => - promise.then( - devices => devices, - error => { - // This error will fire a bit too promiscuously until we fix windows web bluetooth - // toast.error(`"Device Error: " ${error.toString()}`); - return []; - } - ) - ), - filter(devices => devices), // filter out nulls if running on win7 - filter(devices => devices.length >= 1), - map(deviceFound) - ); - -const searchEmotivEpic = action$ => - action$.ofType(SET_DEVICE_AVAILABILITY).pipe( - pluck('payload'), - filter(status => status === DEVICE_AVAILABILITY.SEARCHING), - filter(() => process.platform === 'darwin' || process.platform === 'win32'), - map(getEmotiv), - mergeMap(promise => - promise.then( - devices => devices, - error => { - if (error.message.includes('client.queryHeadsets')) { - toast.error( - 'Could not connect to Cortex Service. Please connect to the internet and install Cortex to use Emotiv EEG', - { autoclose: 7000 } - ); - } else { - toast.error(`"Device Error: " ${error.toString()}`); - } - console.error('searchEpic: ', error.toString()); - return []; - } - ) - ), - filter(devices => devices.length >= 1), - map(deviceFound) - ); - -const deviceFoundEpic = (action$, state$) => - action$.ofType(DEVICE_FOUND).pipe( - pluck('payload'), - map(foundDevices => - foundDevices.reduce((acc, curr) => { - if (acc.find(device => device.id === curr.id)) { - return acc; - } - return acc.concat(curr); - }, state$.value.device.availableDevices) - ), - mergeMap(devices => - of( - setAvailableDevices(devices), - setDeviceAvailability(DEVICE_AVAILABILITY.AVAILABLE) - ) - ) - ); - -const searchTimerEpic = (action$, state$) => - action$.ofType(SET_DEVICE_AVAILABILITY).pipe( - pluck('payload'), - filter(status => status === DEVICE_AVAILABILITY.SEARCHING), - mergeMap(() => timer(SEARCH_TIMER)), - filter( - () => - state$.value.device.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING - ), - map(() => setDeviceAvailability(DEVICE_AVAILABILITY.NONE)) - ); - -const connectEpic = action$ => - action$.ofType(CONNECT_TO_DEVICE).pipe( - pluck('payload'), - map(device => - isNil(device.name) ? connectToEmotiv(device) : connectToMuse(device) - ), - mergeMap(promise => promise.then(deviceInfo => deviceInfo)), - mergeMap(deviceInfo => { - if (!isNil(deviceInfo) && !isNil(deviceInfo.samplingRate)) { - return of( - setDeviceType( - deviceInfo.name.includes('Muse') ? DEVICES.MUSE : DEVICES.EMOTIV - ), - setDeviceInfo(deviceInfo), - setConnectionStatus(CONNECTION_STATUS.CONNECTED) - ); - } - return of(setConnectionStatus(CONNECTION_STATUS.DISCONNECTED)); - }) - ); - -const isConnectingEpic = action$ => - action$ - .ofType(CONNECT_TO_DEVICE) - .pipe(map(() => setConnectionStatus(CONNECTION_STATUS.CONNECTING))); - -const setRawObservableEpic = (action$, state$) => - action$.ofType(SET_DEVICE_INFO).pipe( - mergeMap(() => { - if (state$.value.device.deviceType === DEVICES.EMOTIV) { - return from(createRawEmotivObservable()); - } - return from(createRawMuseObservable()); - }), - map(setRawObservable) - ); - -const setSignalQualityObservableEpic = (action$, state$) => - action$.ofType(SET_RAW_OBSERVABLE).pipe( - pluck('payload'), - map(rawObservable => { - if (state$.value.device.deviceType === DEVICES.EMOTIV) { - return createEmotivSignalQualityObservable( - rawObservable, - state$.value.device.connectedDevice - ); - } - return createMuseSignalQualityObservable( - rawObservable, - state$.value.device.connectedDevice - ); - }), - map(setSignalQualityObservable) - ); - -const deviceCleanupEpic = (action$, state$) => - action$.ofType(EXPERIMENT_CLEANUP).pipe( - filter( - () => - state$.value.device.connectionStatus !== - CONNECTION_STATUS.NOT_YET_CONNECTED - ), - map(() => { - if (state$.value.device.deviceType === DEVICES.EMOTIV) { - disconnectFromEmotiv(); - } - disconnectFromMuse(); - }), - map(cleanup) - ); - -// TODO: Fix this error handling so epics can refire once they error out -const rootEpic = (action$, state$) => - combineEpics( - searchMuseEpic, - searchEmotivEpic, - deviceFoundEpic, - searchTimerEpic, - connectEpic, - isConnectingEpic, - setRawObservableEpic, - setSignalQualityObservableEpic, - deviceCleanupEpic - )(action$, state$).pipe( - catchError(error => - of(error).pipe( - tap(err => toast.error(`"Device Error: " ${err.toString()}`)), - map(cleanup) - ) - ) - ); - -export default rootEpic; diff --git a/app/epics/deviceEpics.ts b/app/epics/deviceEpics.ts new file mode 100644 index 00000000..9214166e --- /dev/null +++ b/app/epics/deviceEpics.ts @@ -0,0 +1,119 @@ +import { combineEpics } from "redux-observable"; +import { of, from, timer } from "rxjs"; +import { map, pluck, mergeMap, tap, filter, catchError } from "rxjs/operators"; +import { isNil } from "lodash"; +import { toast } from "react-toastify"; +import { CONNECT_TO_DEVICE, SET_DEVICE_AVAILABILITY, setDeviceAvailability, setConnectionStatus } from "../actions/deviceActions"; +import { getEmotiv, connectToEmotiv, createRawEmotivObservable, createEmotivSignalQualityObservable, disconnectFromEmotiv } from "../utils/eeg/emotiv"; +import { getMuse, connectToMuse, createRawMuseObservable, createMuseSignalQualityObservable, disconnectFromMuse } from "../utils/eeg/muse"; +import { CONNECTION_STATUS, DEVICES, DEVICE_AVAILABILITY, SEARCH_TIMER } from "../constants/constants"; +import { EXPERIMENT_CLEANUP } from "./experimentEpics"; + +export const DEVICE_FOUND = 'DEVICE_FOUND'; +export const SET_DEVICE_TYPE = 'DEVICE_TYPE'; +export const SET_CONNECTION_STATUS = 'SET_CONNECTION_STATUS'; +export const SET_DEVICE_INFO = 'SET_DEVICE_INFO'; +export const SET_AVAILABLE_DEVICES = 'SET_AVAILABLE_DEVICES'; +export const SET_RAW_OBSERVABLE = 'SET_RAW_OBSERVABLE'; +export const SET_SIGNAL_OBSERVABLE = 'SET_SIGNAL_OBSERVABLE'; +export const DEVICE_CLEANUP = 'DEVICE_CLEANUP'; + +// ------------------------------------------------------------------------- +// Action Creators + +const deviceFound = payload => ({ + payload, + type: DEVICE_FOUND +}); + +const setDeviceType = payload => ({ + payload, + type: SET_DEVICE_TYPE +}); + +const setRawObservable = payload => ({ + payload, + type: SET_RAW_OBSERVABLE +}); + +const setSignalQualityObservable = payload => ({ + payload, + type: SET_SIGNAL_OBSERVABLE +}); + +const setAvailableDevices = payload => ({ + payload, + type: SET_AVAILABLE_DEVICES +}); + +const setDeviceInfo = payload => ({ + payload, + type: SET_DEVICE_INFO +}); + +const cleanup = () => ({ type: DEVICE_CLEANUP }); + +// ------------------------------------------------------------------------- +// Epics + +// NOTE: Uses a Promise "then" inside b/c Observable.from leads to loss of user gesture propagation for web bluetooth +const searchMuseEpic = action$ => action$.ofType(SET_DEVICE_AVAILABILITY).pipe(pluck('payload'), filter(status => status === DEVICE_AVAILABILITY.SEARCHING), map(getMuse), mergeMap(promise => promise.then(devices => devices, error => { + // This error will fire a bit too promiscuously until we fix windows web bluetooth + // toast.error(`"Device Error: " ${error.toString()}`); + return []; +})), filter(devices => devices), // filter out nulls if running on win7 +filter(devices => devices.length >= 1), map(deviceFound)); + +const searchEmotivEpic = action$ => action$.ofType(SET_DEVICE_AVAILABILITY).pipe(pluck('payload'), filter(status => status === DEVICE_AVAILABILITY.SEARCHING), filter(() => process.platform === 'darwin' || process.platform === 'win32'), map(getEmotiv), mergeMap(promise => promise.then(devices => devices, error => { + if (error.message.includes('client.queryHeadsets')) { + toast.error('Could not connect to Cortex Service. Please connect to the internet and install Cortex to use Emotiv EEG', { autoclose: 7000 }); + } else { + toast.error(`"Device Error: " ${error.toString()}`); + } + console.error('searchEpic: ', error.toString()); + return []; +})), filter(devices => devices.length >= 1), map(deviceFound)); + +const deviceFoundEpic = (action$, state$) => action$.ofType(DEVICE_FOUND).pipe(pluck('payload'), map(foundDevices => foundDevices.reduce((acc, curr) => { + if (acc.find(device => device.id === curr.id)) { + return acc; + } + return acc.concat(curr); +}, state$.value.device.availableDevices)), mergeMap(devices => of(setAvailableDevices(devices), setDeviceAvailability(DEVICE_AVAILABILITY.AVAILABLE)))); + +const searchTimerEpic = (action$, state$) => action$.ofType(SET_DEVICE_AVAILABILITY).pipe(pluck('payload'), filter(status => status === DEVICE_AVAILABILITY.SEARCHING), mergeMap(() => timer(SEARCH_TIMER)), filter(() => state$.value.device.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING), map(() => setDeviceAvailability(DEVICE_AVAILABILITY.NONE))); + +const connectEpic = action$ => action$.ofType(CONNECT_TO_DEVICE).pipe(pluck('payload'), map(device => isNil(device.name) ? connectToEmotiv(device) : connectToMuse(device)), mergeMap(promise => promise.then(deviceInfo => deviceInfo)), mergeMap(deviceInfo => { + if (!isNil(deviceInfo) && !isNil(deviceInfo.samplingRate)) { + return of(setDeviceType(deviceInfo.name.includes('Muse') ? DEVICES.MUSE : DEVICES.EMOTIV), setDeviceInfo(deviceInfo), setConnectionStatus(CONNECTION_STATUS.CONNECTED)); + } + return of(setConnectionStatus(CONNECTION_STATUS.DISCONNECTED)); +})); + +const isConnectingEpic = action$ => action$.ofType(CONNECT_TO_DEVICE).pipe(map(() => setConnectionStatus(CONNECTION_STATUS.CONNECTING))); + +const setRawObservableEpic = (action$, state$) => action$.ofType(SET_DEVICE_INFO).pipe(mergeMap(() => { + if (state$.value.device.deviceType === DEVICES.EMOTIV) { + return from(createRawEmotivObservable()); + } + return from(createRawMuseObservable()); +}), map(setRawObservable)); + +const setSignalQualityObservableEpic = (action$, state$) => action$.ofType(SET_RAW_OBSERVABLE).pipe(pluck('payload'), map(rawObservable => { + if (state$.value.device.deviceType === DEVICES.EMOTIV) { + return createEmotivSignalQualityObservable(rawObservable, state$.value.device.connectedDevice); + } + return createMuseSignalQualityObservable(rawObservable, state$.value.device.connectedDevice); +}), map(setSignalQualityObservable)); + +const deviceCleanupEpic = (action$, state$) => action$.ofType(EXPERIMENT_CLEANUP).pipe(filter(() => state$.value.device.connectionStatus !== CONNECTION_STATUS.NOT_YET_CONNECTED), map(() => { + if (state$.value.device.deviceType === DEVICES.EMOTIV) { + disconnectFromEmotiv(); + } + disconnectFromMuse(); +}), map(cleanup)); + +// TODO: Fix this error handling so epics can refire once they error out +const rootEpic = (action$, state$) => combineEpics(searchMuseEpic, searchEmotivEpic, deviceFoundEpic, searchTimerEpic, connectEpic, isConnectingEpic, setRawObservableEpic, setSignalQualityObservableEpic, deviceCleanupEpic)(action$, state$).pipe(catchError(error => of(error).pipe(tap(err => toast.error(`"Device Error: " ${err.toString()}`)), map(cleanup)))); + +export default rootEpic; \ No newline at end of file diff --git a/app/epics/experimentEpics.js b/app/epics/experimentEpics.js deleted file mode 100644 index 6b9d6395..00000000 --- a/app/epics/experimentEpics.js +++ /dev/null @@ -1,221 +0,0 @@ -import { combineEpics } from 'redux-observable'; -import { from, of } from 'rxjs'; -import { - map, - mapTo, - mergeMap, - pluck, - filter, - takeUntil, - throttleTime, - ignoreElements, - tap -} from 'rxjs/operators'; -import { - setType, - setParadigm, - setTitle, - saveWorkspace, - loadDefaultTimeline, - LOAD_DEFAULT_TIMELINE, - START, - STOP, - SAVE_WORKSPACE, - CREATE_NEW_WORKSPACE, - SET_SUBJECT, - SET_GROUP -} from '../actions/experimentActions'; -import { - DEVICES, - MUSE_CHANNELS, - EMOTIV_CHANNELS, - CONNECTION_STATUS -} from '../constants/constants'; -import { loadProtocol, getBehaviouralData } from '../utils/labjs/functions'; -import { - createEEGWriteStream, - writeHeader, - writeEEGData -} from '../utils/filesystem/write'; -import { - getWorkspaceDir, - storeExperimentState, - restoreExperimentState, - createWorkspaceDir, - storeBehaviouralData, - readWorkspaceBehaviorData -} from '../utils/filesystem/storage'; - -import { createEmotivRecord, stopEmotivRecord } from '../utils/eeg/emotiv'; - -export const SET_TIMELINE = 'SET_TIMELINE'; -export const SET_IS_RUNNING = 'SET_IS_RUNNING'; -export const UPDATE_SESSION = 'UPDATE_SESSION'; -export const SET_SESSION = 'SET_SESSION'; -export const EXPERIMENT_CLEANUP = 'EXPERIMENT_CLEANUP'; - -// ------------------------------------------------------------------------- -// Action Creators - -const setTimeline = payload => ({ - payload, - type: SET_TIMELINE -}); - -const setIsRunning = payload => ({ - payload, - type: SET_IS_RUNNING -}); - -const updateSession = () => ({ type: UPDATE_SESSION }); - -const setSession = payload => ({ - payload, - type: SET_SESSION -}); - -const cleanup = () => ({ - type: EXPERIMENT_CLEANUP -}); - -// ------------------------------------------------------------------------- -// Epics - -const createNewWorkspaceEpic = action$ => - action$.ofType(CREATE_NEW_WORKSPACE).pipe( - pluck('payload'), - tap(workspaceInfo => createWorkspaceDir(workspaceInfo.title)), - mergeMap(workspaceInfo => - of( - setType(workspaceInfo.type), - setParadigm(workspaceInfo.paradigm), - setTitle(workspaceInfo.title), - loadDefaultTimeline() - ) - ) - ); - -const loadDefaultTimelineEpic = (action$, state$) => - action$.ofType(LOAD_DEFAULT_TIMELINE).pipe( - map(() => state$.value.experiment.paradigm), - map(loadProtocol), - map(setTimeline) - ); - -const startEpic = (action$, state$) => - action$.ofType(START).pipe( - filter(() => !state$.value.experiment.isRunning), - map(() => { - if ( - state$.value.device.connectionStatus === CONNECTION_STATUS.CONNECTED - ) { - const writeStream = createEEGWriteStream( - state$.value.experiment.title, - state$.value.experiment.subject, - state$.value.experiment.group, - state$.value.experiment.session - ); - - writeHeader( - writeStream, - state$.value.device.deviceType === DEVICES.EMOTIV - ? EMOTIV_CHANNELS - : MUSE_CHANNELS - ); - - if (state$.value.device.deviceType === DEVICES.EMOTIV) { - createEmotivRecord( - state$.value.experiment.subject, - state$.value.experiment.session - ); - } - - state$.value.device.rawObservable - .pipe(takeUntil(action$.ofType(STOP, EXPERIMENT_CLEANUP))) - .subscribe(eegData => writeEEGData(writeStream, eegData)); - } - }), - mapTo(true), - map(setIsRunning) - ); - -const experimentStopEpic = (action$, state$) => - action$.ofType(STOP).pipe( - filter(() => state$.value.experiment.isRunning), - map(({ payload }) => { - storeBehaviouralData( - payload.data, - state$.value.experiment.title, - state$.value.experiment.subject, - state$.value.experiment.group, - state$.value.experiment.session - ); - if ( - state$.value.experiment.isEEGEnabled && - state$.value.device.deviceType === DEVICES.EMOTIV - ) { - stopEmotivRecord(); - } - }), - mergeMap(() => of(setIsRunning(false))) - ); - -// const setSubjectEpic = action$ => -// action$.ofType(SET_SUBJECT).pipe(map(updateSession)); -// -// const setGroupEpic = action$ => -// action$.ofType(SET_GROUP).pipe(map(updateSession)); - -const updateSessionEpic = (action$, state$) => - action$.ofType(UPDATE_SESSION).pipe( - mergeMap(() => - from(readWorkspaceBehaviorData(state$.value.experiment.title)) - ), - map(behaviorFiles => { - if (behaviorFiles.length > 0) { - const subjectFiles = behaviorFiles.filter(filepath => - filepath.name.startsWith(state$.value.experiment.subject) - ); - return subjectFiles.length + 1; - } - return 1; - }), - map(setSession) - ); - -const autoSaveEpic = action$ => - action$.ofType('@@router/LOCATION_CHANGE').pipe( - pluck('payload', 'pathname'), - filter(pathname => pathname !== '/' && pathname !== '/home'), - map(saveWorkspace) - ); - -const saveWorkspaceEpic = (action$, state$) => - action$.ofType(SAVE_WORKSPACE).pipe( - throttleTime(1000), - filter(() => state$.value.experiment.title.length > 1), - map(() => getWorkspaceDir(state$.value.experiment.title)), - tap(() => storeExperimentState(state$.value.experiment)), - ignoreElements() - ); - -const navigationCleanupEpic = (action$, state$) => - action$.ofType('@@router/LOCATION_CHANGE').pipe( - pluck('payload', 'pathname'), - filter(pathname => pathname === '/' || pathname === '/home'), - tap(() => restoreExperimentState(state$.value.experiment)), - map(cleanup) - ); - -export default combineEpics( - loadDefaultTimelineEpic, - createNewWorkspaceEpic, - startEpic, - experimentStopEpic, - // setSubjectEpic, - // setGroupEpic, - updateSessionEpic, - autoSaveEpic, - saveWorkspaceEpic, - navigationCleanupEpic -); diff --git a/app/epics/experimentEpics.ts b/app/epics/experimentEpics.ts new file mode 100644 index 00000000..970d9174 --- /dev/null +++ b/app/epics/experimentEpics.ts @@ -0,0 +1,94 @@ +import { combineEpics } from "redux-observable"; +import { from, of } from "rxjs"; +import { map, mapTo, mergeMap, pluck, filter, takeUntil, throttleTime, ignoreElements, tap } from "rxjs/operators"; +import { setType, setParadigm, setTitle, saveWorkspace, loadDefaultTimeline, LOAD_DEFAULT_TIMELINE, START, STOP, SAVE_WORKSPACE, CREATE_NEW_WORKSPACE, SET_SUBJECT, SET_GROUP } from "../actions/experimentActions"; +import { DEVICES, MUSE_CHANNELS, EMOTIV_CHANNELS, CONNECTION_STATUS } from "../constants/constants"; +import { loadProtocol, getBehaviouralData } from "../utils/labjs/functions"; +import { createEEGWriteStream, writeHeader, writeEEGData } from "../utils/filesystem/write"; +import { getWorkspaceDir, storeExperimentState, restoreExperimentState, createWorkspaceDir, storeBehaviouralData, readWorkspaceBehaviorData } from "../utils/filesystem/storage"; + +import { createEmotivRecord, stopEmotivRecord } from "../utils/eeg/emotiv"; + +export const SET_TIMELINE = 'SET_TIMELINE'; +export const SET_IS_RUNNING = 'SET_IS_RUNNING'; +export const UPDATE_SESSION = 'UPDATE_SESSION'; +export const SET_SESSION = 'SET_SESSION'; +export const EXPERIMENT_CLEANUP = 'EXPERIMENT_CLEANUP'; + +// ------------------------------------------------------------------------- +// Action Creators + +const setTimeline = payload => ({ + payload, + type: SET_TIMELINE +}); + +const setIsRunning = payload => ({ + payload, + type: SET_IS_RUNNING +}); + +const updateSession = () => ({ type: UPDATE_SESSION }); + +const setSession = payload => ({ + payload, + type: SET_SESSION +}); + +const cleanup = () => ({ + type: EXPERIMENT_CLEANUP +}); + +// ------------------------------------------------------------------------- +// Epics + +const createNewWorkspaceEpic = action$ => action$.ofType(CREATE_NEW_WORKSPACE).pipe(pluck('payload'), tap(workspaceInfo => createWorkspaceDir(workspaceInfo.title)), mergeMap(workspaceInfo => of(setType(workspaceInfo.type), setParadigm(workspaceInfo.paradigm), setTitle(workspaceInfo.title), loadDefaultTimeline()))); + +const loadDefaultTimelineEpic = (action$, state$) => action$.ofType(LOAD_DEFAULT_TIMELINE).pipe(map(() => state$.value.experiment.paradigm), map(loadProtocol), map(setTimeline)); + +const startEpic = (action$, state$) => action$.ofType(START).pipe(filter(() => !state$.value.experiment.isRunning), map(() => { + if (state$.value.device.connectionStatus === CONNECTION_STATUS.CONNECTED) { + const writeStream = createEEGWriteStream(state$.value.experiment.title, state$.value.experiment.subject, state$.value.experiment.group, state$.value.experiment.session); + + writeHeader(writeStream, state$.value.device.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS : MUSE_CHANNELS); + + if (state$.value.device.deviceType === DEVICES.EMOTIV) { + createEmotivRecord(state$.value.experiment.subject, state$.value.experiment.session); + } + + state$.value.device.rawObservable.pipe(takeUntil(action$.ofType(STOP, EXPERIMENT_CLEANUP))).subscribe(eegData => writeEEGData(writeStream, eegData)); + } +}), mapTo(true), map(setIsRunning)); + +const experimentStopEpic = (action$, state$) => action$.ofType(STOP).pipe(filter(() => state$.value.experiment.isRunning), map(({ + payload +}) => { + storeBehaviouralData(payload.data, state$.value.experiment.title, state$.value.experiment.subject, state$.value.experiment.group, state$.value.experiment.session); + if (state$.value.experiment.isEEGEnabled && state$.value.device.deviceType === DEVICES.EMOTIV) { + stopEmotivRecord(); + } +}), mergeMap(() => of(setIsRunning(false)))); + +// const setSubjectEpic = action$ => +// action$.ofType(SET_SUBJECT).pipe(map(updateSession)); +// +// const setGroupEpic = action$ => +// action$.ofType(SET_GROUP).pipe(map(updateSession)); + +const updateSessionEpic = (action$, state$) => action$.ofType(UPDATE_SESSION).pipe(mergeMap(() => from(readWorkspaceBehaviorData(state$.value.experiment.title))), map(behaviorFiles => { + if (behaviorFiles.length > 0) { + const subjectFiles = behaviorFiles.filter(filepath => filepath.name.startsWith(state$.value.experiment.subject)); + return subjectFiles.length + 1; + } + return 1; +}), map(setSession)); + +const autoSaveEpic = action$ => action$.ofType('@@router/LOCATION_CHANGE').pipe(pluck('payload', 'pathname'), filter(pathname => pathname !== '/' && pathname !== '/home'), map(saveWorkspace)); + +const saveWorkspaceEpic = (action$, state$) => action$.ofType(SAVE_WORKSPACE).pipe(throttleTime(1000), filter(() => state$.value.experiment.title.length > 1), map(() => getWorkspaceDir(state$.value.experiment.title)), tap(() => storeExperimentState(state$.value.experiment)), ignoreElements()); + +const navigationCleanupEpic = (action$, state$) => action$.ofType('@@router/LOCATION_CHANGE').pipe(pluck('payload', 'pathname'), filter(pathname => pathname === '/' || pathname === '/home'), tap(() => restoreExperimentState(state$.value.experiment)), map(cleanup)); + +export default combineEpics(loadDefaultTimelineEpic, createNewWorkspaceEpic, startEpic, experimentStopEpic, // setSubjectEpic, +// setGroupEpic, +updateSessionEpic, autoSaveEpic, saveWorkspaceEpic, navigationCleanupEpic); \ No newline at end of file diff --git a/app/epics/index.js b/app/epics/index.js deleted file mode 100644 index 076d6cbe..00000000 --- a/app/epics/index.js +++ /dev/null @@ -1,6 +0,0 @@ -import { combineEpics } from 'redux-observable'; -import jupyter from './jupyterEpics'; -import device from './deviceEpics'; -import experiment from './experimentEpics'; - -export default combineEpics(device, jupyter, experiment); diff --git a/app/epics/index.ts b/app/epics/index.ts new file mode 100644 index 00000000..cbb31acc --- /dev/null +++ b/app/epics/index.ts @@ -0,0 +1,6 @@ +import { combineEpics } from "redux-observable"; +import jupyter from "./jupyterEpics"; +import device from "./deviceEpics"; +import experiment from "./experimentEpics"; + +export default combineEpics(device, jupyter, experiment); \ No newline at end of file diff --git a/app/epics/jupyterEpics.js b/app/epics/jupyterEpics.js deleted file mode 100644 index bc55bb8f..00000000 --- a/app/epics/jupyterEpics.js +++ /dev/null @@ -1,447 +0,0 @@ -import { combineEpics } from 'redux-observable'; -import { from, of } from 'rxjs'; -import { - map, - mergeMap, - tap, - pluck, - ignoreElements, - filter, - take -} from 'rxjs/operators'; -import { find } from 'kernelspecs'; -import { launchSpec } from 'spawnteract'; -import { createMainChannel } from 'enchannel-zmq-backend'; -import { isNil } from 'lodash'; -import { kernelInfoRequest, executeRequest } from '@nteract/messaging'; -import { toast } from 'react-toastify'; -import { execute, awaitOkMessage } from '../utils/jupyter/pipes'; -import { getWorkspaceDir } from '../utils/filesystem/storage'; -import { - LAUNCH_KERNEL, - REQUEST_KERNEL_INFO, - LOAD_EPOCHS, - LOAD_CLEANED_EPOCHS, - LOAD_PSD, - LOAD_ERP, - LOAD_TOPO, - CLEAN_EPOCHS, - CLOSE_KERNEL, - loadTopo, - loadERP -} from '../actions/jupyterActions'; -import { - imports, - utils, - loadCSV, - loadCleanedEpochs, - filterIIR, - epochEvents, - requestEpochsInfo, - requestChannelInfo, - cleanEpochsPlot, - plotPSD, - plotERP, - plotTopoMap, - saveEpochs -} from '../utils/jupyter/cells'; -import { - EMOTIV_CHANNELS, - EVENTS, - DEVICES, - MUSE_CHANNELS, - JUPYTER_VARIABLE_NAMES -} from '../constants/constants'; -import { - parseSingleQuoteJSON, - parseKernelStatus, - debugParseMessage -} from '../utils/jupyter/functions'; - -export const GET_EPOCHS_INFO = 'GET_EPOCHS_INFO'; -export const GET_CHANNEL_INFO = 'GET_CHANNEL_INFO'; -export const SET_KERNEL = 'SET_KERNEL'; -export const SET_KERNEL_STATUS = 'SET_KERNEL_STATUS'; -export const SET_KERNEL_INFO = 'SET_KERNEL_INFO'; -export const SET_MAIN_CHANNEL = 'SET_MAIN_CHANNEL'; -export const SET_EPOCH_INFO = 'SET_EPOCH_INFO'; -export const SET_CHANNEL_INFO = 'SET_CHANNEL_INFO'; -export const SET_PSD_PLOT = 'SET_PSD_PLOT'; -export const SET_ERP_PLOT = 'SET_ERP_PLOT'; -export const SET_TOPO_PLOT = 'SET_TOPO_PLOT'; -export const RECEIVE_EXECUTE_REPLY = 'RECEIVE_EXECUTE_REPLY'; -export const RECEIVE_EXECUTE_RESULT = 'RECEIVE_EXECUTE_RESULT'; -export const RECEIVE_STREAM = 'RECEIVE_STREAM'; -export const RECEIVE_DISPLAY_DATA = 'RECEIVE_DISPLAY_DATA'; - -// ------------------------------------------------------------------------- -// Action Creators - -const getEpochsInfo = payload => ({ payload, type: GET_EPOCHS_INFO }); - -const getChannelInfo = () => ({ type: GET_CHANNEL_INFO }); - -const setKernel = payload => ({ - payload, - type: SET_KERNEL -}); - -const setKernelStatus = payload => ({ - payload, - type: SET_KERNEL_STATUS -}); - -const setKernelInfo = payload => ({ - payload, - type: SET_KERNEL_INFO -}); - -const setMainChannel = payload => ({ - payload, - type: SET_MAIN_CHANNEL -}); - -const setEpochInfo = payload => ({ - payload, - type: SET_EPOCH_INFO -}); - -const setChannelInfo = payload => ({ - payload, - type: SET_CHANNEL_INFO -}); - -const setPSDPlot = payload => ({ - payload, - type: SET_PSD_PLOT -}); - -const setTopoPlot = payload => ({ - payload, - type: SET_TOPO_PLOT -}); - -const setERPPlot = payload => ({ - payload, - type: SET_ERP_PLOT -}); - -const receiveExecuteReply = payload => ({ - payload, - type: RECEIVE_EXECUTE_REPLY -}); - -const receiveExecuteResult = payload => ({ - payload, - type: RECEIVE_EXECUTE_RESULT -}); - -const receiveDisplayData = payload => ({ - payload, - type: RECEIVE_DISPLAY_DATA -}); - -const receiveStream = payload => ({ - payload, - type: RECEIVE_STREAM -}); - -// ------------------------------------------------------------------------- -// Epics - -const launchEpic = action$ => - action$.ofType(LAUNCH_KERNEL).pipe( - mergeMap(() => from(find('brainwaves'))), - tap(kernelInfo => { - if (isNil(kernelInfo)) { - toast.error( - "Could not find 'brainwaves' jupyter kernel. Have you installed Python?" - ); - } - }), - filter(kernelInfo => !isNil(kernelInfo)), - mergeMap(kernelInfo => - from( - launchSpec(kernelInfo.spec, { - // No STDIN, opt in to STDOUT and STDERR as node streams - stdio: ['ignore', 'pipe', 'pipe'] - }) - ) - ), - tap(kernel => { - // Route everything that we won't get in messages to our own stdout - kernel.spawn.stdout.on('data', data => { - const text = data.toString(); - console.log('KERNEL STDOUT: ', text); - }); - kernel.spawn.stderr.on('data', data => { - const text = data.toString(); - console.log('KERNEL STDERR: ', text); - toast.error('Jupyter: ', text); - }); - - kernel.spawn.on('close', () => { - console.log('Kernel closed'); - }); - }), - map(setKernel) - ); - -const setUpChannelEpic = action$ => - action$.ofType(SET_KERNEL).pipe( - pluck('payload'), - mergeMap(kernel => from(createMainChannel(kernel.config))), - tap(mainChannel => mainChannel.next(executeRequest(imports()))), - tap(mainChannel => mainChannel.next(executeRequest(utils()))), - map(setMainChannel) - ); - -const receiveChannelMessageEpic = (action$, state$) => - action$.ofType(SET_MAIN_CHANNEL).pipe( - mergeMap(() => - state$.value.jupyter.mainChannel.pipe( - map(msg => { - console.log(debugParseMessage(msg)); - switch (msg['header']['msg_type']) { - case 'kernel_info_reply': - return setKernelInfo(msg); - case 'status': - return setKernelStatus(parseKernelStatus(msg)); - case 'stream': - return receiveStream(msg); - case 'execute_reply': - return receiveExecuteReply(msg); - case 'execute_result': - return receiveExecuteResult(msg); - case 'display_data': - return receiveDisplayData(msg); - default: - } - }), - filter(action => !isNil(action)) - ) - ) - ); - -const requestKernelInfoEpic = (action$, state$) => - action$.ofType(REQUEST_KERNEL_INFO).pipe( - filter(() => state$.value.jupyter.mainChannel), - map(() => state$.value.jupyter.mainChannel.next(kernelInfoRequest())), - ignoreElements() - ); - -const loadEpochsEpic = (action$, state$) => - action$.ofType(LOAD_EPOCHS).pipe( - pluck('payload'), - filter(filePathsArray => filePathsArray.length >= 1), - map(filePathsArray => - state$.value.jupyter.mainChannel.next( - executeRequest(loadCSV(filePathsArray)) - ) - ), - awaitOkMessage(action$), - execute(filterIIR(1, 30), state$), - awaitOkMessage(action$), - map(() => - epochEvents( - { - [state$.value.experiment.params.stimulus1.title]: EVENTS.STIMULUS_1, - [state$.value.experiment.params.stimulus2.title]: EVENTS.STIMULUS_2, - [state$.value.experiment.params.stimulus3.title]: EVENTS.STIMULUS_3, - [state$.value.experiment.params.stimulus4.title]: EVENTS.STIMULUS_4 - }, - -0.1, - 0.8 - ) - ), - tap(e => { - console.log('e', e); - }), - map(epochEventsCommand => - state$.value.jupyter.mainChannel.next(executeRequest(epochEventsCommand)) - ), - awaitOkMessage(action$), - map(() => getEpochsInfo(JUPYTER_VARIABLE_NAMES.RAW_EPOCHS)) - ); - -const loadCleanedEpochsEpic = (action$, state$) => - action$.ofType(LOAD_CLEANED_EPOCHS).pipe( - pluck('payload'), - filter(filePathsArray => filePathsArray.length >= 1), - map(filePathsArray => - state$.value.jupyter.mainChannel.next( - executeRequest(loadCleanedEpochs(filePathsArray)) - ) - ), - awaitOkMessage(action$), - mergeMap(() => - of( - getEpochsInfo(JUPYTER_VARIABLE_NAMES.CLEAN_EPOCHS), - getChannelInfo(), - loadTopo() - ) - ) - ); - -const cleanEpochsEpic = (action$, state$) => - action$.ofType(CLEAN_EPOCHS).pipe( - execute(cleanEpochsPlot(), state$), - mergeMap(() => - action$.ofType(RECEIVE_STREAM).pipe( - pluck('payload'), - filter( - msg => - msg.channel === 'iopub' && - msg.content.text.includes('Channels marked as bad') - ), - take(1) - ) - ), - map(() => - state$.value.jupyter.mainChannel.next( - executeRequest( - saveEpochs( - getWorkspaceDir(state$.value.experiment.title), - state$.value.experiment.subject - ) - ) - ) - ), - awaitOkMessage(action$), - map(() => getEpochsInfo(JUPYTER_VARIABLE_NAMES.RAW_EPOCHS)) - ); - -const getEpochsInfoEpic = (action$, state$) => - action$.ofType(GET_EPOCHS_INFO).pipe( - pluck('payload'), - map(variableName => - state$.value.jupyter.mainChannel.next( - executeRequest(requestEpochsInfo(variableName)) - ) - ), - mergeMap(() => - action$.ofType(RECEIVE_EXECUTE_RESULT).pipe( - pluck('payload'), - filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), - pluck('content', 'data', 'text/plain'), - filter(msg => msg.includes('Drop Percentage')), - take(1) - ) - ), - map(epochInfoString => - parseSingleQuoteJSON(epochInfoString).map(infoObj => ({ - name: Object.keys(infoObj)[0], - value: infoObj[Object.keys(infoObj)[0]] - })) - ), - map(setEpochInfo) - ); - -const getChannelInfoEpic = (action$, state$) => - action$.ofType(GET_CHANNEL_INFO).pipe( - execute(requestChannelInfo(), state$), - mergeMap(() => - action$.ofType(RECEIVE_EXECUTE_RESULT).pipe( - pluck('payload'), - filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), - pluck('content', 'data', 'text/plain'), - // Filter to prevent this from reading requestEpochsInfo returns - filter(msg => !msg.includes('Drop Percentage')), - take(1) - ) - ), - map(channelInfoString => - setChannelInfo(parseSingleQuoteJSON(channelInfoString)) - ) - ); - -const loadPSDEpic = (action$, state$) => - action$.ofType(LOAD_PSD).pipe( - execute(plotPSD(), state$), - mergeMap(() => - action$.ofType(RECEIVE_DISPLAY_DATA).pipe( - pluck('payload'), - // PSD graphs should have two axes - filter(msg => msg.content.data['text/plain'].includes('2 Axes')), - pluck('content', 'data'), - take(1) - ) - ), - map(setPSDPlot) - ); - -const loadTopoEpic = (action$, state$) => - action$.ofType(LOAD_TOPO).pipe( - execute(plotTopoMap(), state$), - mergeMap(() => - action$ - .ofType(RECEIVE_DISPLAY_DATA) - .pipe(pluck('payload'), pluck('content', 'data'), take(1)) - ), - mergeMap(topoPlot => - of( - setTopoPlot(topoPlot), - loadERP( - state$.value.device.deviceType === DEVICES.EMOTIV - ? EMOTIV_CHANNELS[0] - : MUSE_CHANNELS[0] - ) - ) - ) - ); - -const loadERPEpic = (action$, state$) => - action$.ofType(LOAD_ERP).pipe( - pluck('payload'), - map(channelName => { - if (MUSE_CHANNELS.includes(channelName)) { - return MUSE_CHANNELS.indexOf(channelName); - } else if (EMOTIV_CHANNELS.includes(channelName)) { - return EMOTIV_CHANNELS.indexOf(channelName); - } - console.warn( - 'channel name supplied to loadERPEpic does not belong to either device' - ); - return EMOTIV_CHANNELS[0]; - }), - map(channelIndex => - state$.value.jupyter.mainChannel.next( - executeRequest(plotERP(channelIndex)) - ) - ), - mergeMap(() => - action$.ofType(RECEIVE_DISPLAY_DATA).pipe( - pluck('payload'), - // ERP graphs should have 1 axis according to MNE - filter(msg => msg.content.data['text/plain'].includes('1 Axes')), - pluck('content', 'data'), - take(1) - ) - ), - map(setERPPlot) - ); - -const closeKernelEpic = (action$, state$) => - action$.ofType(CLOSE_KERNEL).pipe( - map(() => { - state$.value.jupyter.kernel.spawn.kill(); - state$.value.jupyter.mainChannel.complete(); - }), - ignoreElements() - ); - -export default combineEpics( - launchEpic, - setUpChannelEpic, - requestKernelInfoEpic, - receiveChannelMessageEpic, - loadEpochsEpic, - loadCleanedEpochsEpic, - cleanEpochsEpic, - getEpochsInfoEpic, - getChannelInfoEpic, - loadPSDEpic, - loadTopoEpic, - loadERPEpic, - closeKernelEpic -); diff --git a/app/epics/jupyterEpics.ts b/app/epics/jupyterEpics.ts new file mode 100644 index 00000000..5b77e6de --- /dev/null +++ b/app/epics/jupyterEpics.ts @@ -0,0 +1,197 @@ +import { combineEpics } from "redux-observable"; +import { from, of } from "rxjs"; +import { map, mergeMap, tap, pluck, ignoreElements, filter, take } from "rxjs/operators"; +import { find } from "kernelspecs"; +import { launchSpec } from "spawnteract"; +import { createMainChannel } from "enchannel-zmq-backend"; +import { isNil } from "lodash"; +import { kernelInfoRequest, executeRequest } from "@nteract/messaging"; +import { toast } from "react-toastify"; +import { execute, awaitOkMessage } from "../utils/jupyter/pipes"; +import { getWorkspaceDir } from "../utils/filesystem/storage"; +import { LAUNCH_KERNEL, REQUEST_KERNEL_INFO, LOAD_EPOCHS, LOAD_CLEANED_EPOCHS, LOAD_PSD, LOAD_ERP, LOAD_TOPO, CLEAN_EPOCHS, CLOSE_KERNEL, loadTopo, loadERP } from "../actions/jupyterActions"; +import { imports, utils, loadCSV, loadCleanedEpochs, filterIIR, epochEvents, requestEpochsInfo, requestChannelInfo, cleanEpochsPlot, plotPSD, plotERP, plotTopoMap, saveEpochs } from "../utils/jupyter/cells"; +import { EMOTIV_CHANNELS, EVENTS, DEVICES, MUSE_CHANNELS, JUPYTER_VARIABLE_NAMES } from "../constants/constants"; +import { parseSingleQuoteJSON, parseKernelStatus, debugParseMessage } from "../utils/jupyter/functions"; + +export const GET_EPOCHS_INFO = 'GET_EPOCHS_INFO'; +export const GET_CHANNEL_INFO = 'GET_CHANNEL_INFO'; +export const SET_KERNEL = 'SET_KERNEL'; +export const SET_KERNEL_STATUS = 'SET_KERNEL_STATUS'; +export const SET_KERNEL_INFO = 'SET_KERNEL_INFO'; +export const SET_MAIN_CHANNEL = 'SET_MAIN_CHANNEL'; +export const SET_EPOCH_INFO = 'SET_EPOCH_INFO'; +export const SET_CHANNEL_INFO = 'SET_CHANNEL_INFO'; +export const SET_PSD_PLOT = 'SET_PSD_PLOT'; +export const SET_ERP_PLOT = 'SET_ERP_PLOT'; +export const SET_TOPO_PLOT = 'SET_TOPO_PLOT'; +export const RECEIVE_EXECUTE_REPLY = 'RECEIVE_EXECUTE_REPLY'; +export const RECEIVE_EXECUTE_RESULT = 'RECEIVE_EXECUTE_RESULT'; +export const RECEIVE_STREAM = 'RECEIVE_STREAM'; +export const RECEIVE_DISPLAY_DATA = 'RECEIVE_DISPLAY_DATA'; + +// ------------------------------------------------------------------------- +// Action Creators + +const getEpochsInfo = payload => ({ payload, type: GET_EPOCHS_INFO }); + +const getChannelInfo = () => ({ type: GET_CHANNEL_INFO }); + +const setKernel = payload => ({ + payload, + type: SET_KERNEL +}); + +const setKernelStatus = payload => ({ + payload, + type: SET_KERNEL_STATUS +}); + +const setKernelInfo = payload => ({ + payload, + type: SET_KERNEL_INFO +}); + +const setMainChannel = payload => ({ + payload, + type: SET_MAIN_CHANNEL +}); + +const setEpochInfo = payload => ({ + payload, + type: SET_EPOCH_INFO +}); + +const setChannelInfo = payload => ({ + payload, + type: SET_CHANNEL_INFO +}); + +const setPSDPlot = payload => ({ + payload, + type: SET_PSD_PLOT +}); + +const setTopoPlot = payload => ({ + payload, + type: SET_TOPO_PLOT +}); + +const setERPPlot = payload => ({ + payload, + type: SET_ERP_PLOT +}); + +const receiveExecuteReply = payload => ({ + payload, + type: RECEIVE_EXECUTE_REPLY +}); + +const receiveExecuteResult = payload => ({ + payload, + type: RECEIVE_EXECUTE_RESULT +}); + +const receiveDisplayData = payload => ({ + payload, + type: RECEIVE_DISPLAY_DATA +}); + +const receiveStream = payload => ({ + payload, + type: RECEIVE_STREAM +}); + +// ------------------------------------------------------------------------- +// Epics + +const launchEpic = action$ => action$.ofType(LAUNCH_KERNEL).pipe(mergeMap(() => from(find('brainwaves'))), tap(kernelInfo => { + if (isNil(kernelInfo)) { + toast.error("Could not find 'brainwaves' jupyter kernel. Have you installed Python?"); + } +}), filter(kernelInfo => !isNil(kernelInfo)), mergeMap(kernelInfo => from(launchSpec(kernelInfo.spec, { + // No STDIN, opt in to STDOUT and STDERR as node streams + stdio: ['ignore', 'pipe', 'pipe'] +}))), tap(kernel => { + // Route everything that we won't get in messages to our own stdout + kernel.spawn.stdout.on('data', data => { + const text = data.toString(); + console.log('KERNEL STDOUT: ', text); + }); + kernel.spawn.stderr.on('data', data => { + const text = data.toString(); + console.log('KERNEL STDERR: ', text); + toast.error('Jupyter: ', text); + }); + + kernel.spawn.on('close', () => { + console.log('Kernel closed'); + }); +}), map(setKernel)); + +const setUpChannelEpic = action$ => action$.ofType(SET_KERNEL).pipe(pluck('payload'), mergeMap(kernel => from(createMainChannel(kernel.config))), tap(mainChannel => mainChannel.next(executeRequest(imports()))), tap(mainChannel => mainChannel.next(executeRequest(utils()))), map(setMainChannel)); + +const receiveChannelMessageEpic = (action$, state$) => action$.ofType(SET_MAIN_CHANNEL).pipe(mergeMap(() => state$.value.jupyter.mainChannel.pipe(map(msg => { + console.log(debugParseMessage(msg)); + switch (msg['header']['msg_type']) { + case 'kernel_info_reply': + return setKernelInfo(msg); + case 'status': + return setKernelStatus(parseKernelStatus(msg)); + case 'stream': + return receiveStream(msg); + case 'execute_reply': + return receiveExecuteReply(msg); + case 'execute_result': + return receiveExecuteResult(msg); + case 'display_data': + return receiveDisplayData(msg); + default: + } +}), filter(action => !isNil(action))))); + +const requestKernelInfoEpic = (action$, state$) => action$.ofType(REQUEST_KERNEL_INFO).pipe(filter(() => state$.value.jupyter.mainChannel), map(() => state$.value.jupyter.mainChannel.next(kernelInfoRequest())), ignoreElements()); + +const loadEpochsEpic = (action$, state$) => action$.ofType(LOAD_EPOCHS).pipe(pluck('payload'), filter(filePathsArray => filePathsArray.length >= 1), map(filePathsArray => state$.value.jupyter.mainChannel.next(executeRequest(loadCSV(filePathsArray)))), awaitOkMessage(action$), execute(filterIIR(1, 30), state$), awaitOkMessage(action$), map(() => epochEvents({ + [state$.value.experiment.params.stimulus1.title]: EVENTS.STIMULUS_1, + [state$.value.experiment.params.stimulus2.title]: EVENTS.STIMULUS_2, + [state$.value.experiment.params.stimulus3.title]: EVENTS.STIMULUS_3, + [state$.value.experiment.params.stimulus4.title]: EVENTS.STIMULUS_4 +}, -0.1, 0.8)), tap(e => { + console.log('e', e); +}), map(epochEventsCommand => state$.value.jupyter.mainChannel.next(executeRequest(epochEventsCommand))), awaitOkMessage(action$), map(() => getEpochsInfo(JUPYTER_VARIABLE_NAMES.RAW_EPOCHS))); + +const loadCleanedEpochsEpic = (action$, state$) => action$.ofType(LOAD_CLEANED_EPOCHS).pipe(pluck('payload'), filter(filePathsArray => filePathsArray.length >= 1), map(filePathsArray => state$.value.jupyter.mainChannel.next(executeRequest(loadCleanedEpochs(filePathsArray)))), awaitOkMessage(action$), mergeMap(() => of(getEpochsInfo(JUPYTER_VARIABLE_NAMES.CLEAN_EPOCHS), getChannelInfo(), loadTopo()))); + +const cleanEpochsEpic = (action$, state$) => action$.ofType(CLEAN_EPOCHS).pipe(execute(cleanEpochsPlot(), state$), mergeMap(() => action$.ofType(RECEIVE_STREAM).pipe(pluck('payload'), filter(msg => msg.channel === 'iopub' && msg.content.text.includes('Channels marked as bad')), take(1))), map(() => state$.value.jupyter.mainChannel.next(executeRequest(saveEpochs(getWorkspaceDir(state$.value.experiment.title), state$.value.experiment.subject)))), awaitOkMessage(action$), map(() => getEpochsInfo(JUPYTER_VARIABLE_NAMES.RAW_EPOCHS))); + +const getEpochsInfoEpic = (action$, state$) => action$.ofType(GET_EPOCHS_INFO).pipe(pluck('payload'), map(variableName => state$.value.jupyter.mainChannel.next(executeRequest(requestEpochsInfo(variableName)))), mergeMap(() => action$.ofType(RECEIVE_EXECUTE_RESULT).pipe(pluck('payload'), filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), pluck('content', 'data', 'text/plain'), filter(msg => msg.includes('Drop Percentage')), take(1))), map(epochInfoString => parseSingleQuoteJSON(epochInfoString).map(infoObj => ({ + name: Object.keys(infoObj)[0], + value: infoObj[Object.keys(infoObj)[0]] +}))), map(setEpochInfo)); + +const getChannelInfoEpic = (action$, state$) => action$.ofType(GET_CHANNEL_INFO).pipe(execute(requestChannelInfo(), state$), mergeMap(() => action$.ofType(RECEIVE_EXECUTE_RESULT).pipe(pluck('payload'), filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), pluck('content', 'data', 'text/plain'), // Filter to prevent this from reading requestEpochsInfo returns +filter(msg => !msg.includes('Drop Percentage')), take(1))), map(channelInfoString => setChannelInfo(parseSingleQuoteJSON(channelInfoString)))); + +const loadPSDEpic = (action$, state$) => action$.ofType(LOAD_PSD).pipe(execute(plotPSD(), state$), mergeMap(() => action$.ofType(RECEIVE_DISPLAY_DATA).pipe(pluck('payload'), // PSD graphs should have two axes +filter(msg => msg.content.data['text/plain'].includes('2 Axes')), pluck('content', 'data'), take(1))), map(setPSDPlot)); + +const loadTopoEpic = (action$, state$) => action$.ofType(LOAD_TOPO).pipe(execute(plotTopoMap(), state$), mergeMap(() => action$.ofType(RECEIVE_DISPLAY_DATA).pipe(pluck('payload'), pluck('content', 'data'), take(1))), mergeMap(topoPlot => of(setTopoPlot(topoPlot), loadERP(state$.value.device.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS[0] : MUSE_CHANNELS[0])))); + +const loadERPEpic = (action$, state$) => action$.ofType(LOAD_ERP).pipe(pluck('payload'), map(channelName => { + if (MUSE_CHANNELS.includes(channelName)) { + return MUSE_CHANNELS.indexOf(channelName); + } else if (EMOTIV_CHANNELS.includes(channelName)) { + return EMOTIV_CHANNELS.indexOf(channelName); + } + console.warn('channel name supplied to loadERPEpic does not belong to either device'); + return EMOTIV_CHANNELS[0]; +}), map(channelIndex => state$.value.jupyter.mainChannel.next(executeRequest(plotERP(channelIndex)))), mergeMap(() => action$.ofType(RECEIVE_DISPLAY_DATA).pipe(pluck('payload'), // ERP graphs should have 1 axis according to MNE +filter(msg => msg.content.data['text/plain'].includes('1 Axes')), pluck('content', 'data'), take(1))), map(setERPPlot)); + +const closeKernelEpic = (action$, state$) => action$.ofType(CLOSE_KERNEL).pipe(map(() => { + state$.value.jupyter.kernel.spawn.kill(); + state$.value.jupyter.mainChannel.complete(); +}), ignoreElements()); + +export default combineEpics(launchEpic, setUpChannelEpic, requestKernelInfoEpic, receiveChannelMessageEpic, loadEpochsEpic, loadCleanedEpochsEpic, cleanEpochsEpic, getEpochsInfoEpic, getChannelInfoEpic, loadPSDEpic, loadTopoEpic, loadERPEpic, closeKernelEpic); \ No newline at end of file diff --git a/app/main.dev.js b/app/main.dev.ts similarity index 84% rename from app/main.dev.js rename to app/main.dev.ts index b72237b6..004b79d3 100644 --- a/app/main.dev.js +++ b/app/main.dev.ts @@ -10,8 +10,8 @@ * * @flow */ -import { app, BrowserWindow, ipcMain } from 'electron'; -import { loadDialog } from './utils/filesystem/dialog'; +import { app, BrowserWindow, ipcMain } from "electron"; +import { loadDialog } from "./utils/filesystem/dialog"; app.commandLine.appendSwitch('enable-experimental-web-platform-features', true); app.commandLine.appendSwitch('user-activation-v2', true); @@ -23,10 +23,7 @@ if (process.env.NODE_ENV === 'production') { sourceMapSupport.install(); } -if ( - process.env.NODE_ENV === 'development' || - process.env.DEBUG_PROD === 'true' -) { +if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') { require('electron-debug')(); const path = require('path'); const p = path.join(__dirname, '..', 'app', 'node_modules'); @@ -38,15 +35,12 @@ const installExtensions = async () => { const forceDownload = !!process.env.UPGRADE_EXTENSIONS; const extensions = ['REACT_DEVELOPER_TOOLS', 'REDUX_DEVTOOLS']; - return Promise.all( - extensions.map(name => installer.default(installer[name], forceDownload)) - ).catch(console.log); + return Promise.all(extensions.map(name => installer.default(installer[name], forceDownload))).catch(console.log); }; /** * Add event listeners... */ - app.on('window-all-closed', () => { // Respect the OSX convention of having the application in memory even // after all windows have been closed @@ -56,10 +50,7 @@ app.on('window-all-closed', () => { }); app.on('ready', async () => { - if ( - process.env.NODE_ENV === 'development' || - process.env.DEBUG_PROD === 'true' - ) { + if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') { await installExtensions(); } @@ -96,4 +87,4 @@ app.on('ready', async () => { } // const menuBuilder = new MenuBuilder(mainWindow); // menuBuilder.buildMenu(); -}); +}); \ No newline at end of file diff --git a/app/main.prod.ts b/app/main.prod.ts new file mode 100644 index 00000000..28639d92 --- /dev/null +++ b/app/main.prod.ts @@ -0,0 +1,1507 @@ +module.exports = function (e) {var t = {};function r(n) {if (t[n]) return t[n].exports;var o = t[n] = { i: n, l: !1, exports: {} };return e[n].call(o.exports, o, o.exports, r), o.l = !0, o.exports;}return r.m = e, r.c = t, r.d = function (e, t, n) {r.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: n });}, r.r = function (e) {"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e, "__esModule", { value: !0 });}, r.t = function (e, t) {if (1 & t && (e = r(e)), 8 & t) return e;if (4 & t && "object" == typeof e && e && e.__esModule) return e;var n = Object.create(null);if (r.r(n), Object.defineProperty(n, "default", { enumerable: !0, value: e }), 2 & t && "string" != typeof e) for (var o in e) r.d(n, o, function (t) {return e[t];}.bind(null, o));return n;}, r.n = function (e) {var t = e && e.__esModule ? function () {return e.default;} : function () {return e;};return r.d(t, "a", t), t;}, r.o = function (e, t) {return Object.prototype.hasOwnProperty.call(e, t);}, r.p = "", r(r.s = "./app/main.dev.js");}({ "./app/main.dev.js": function (e, t, r) {"use strict"; + r.r(t);var n = r("electron");const o = "STIMULUS_DIR", + s = "TIMELINE", + i = (e, t) => {switch (t) {case o: + return l(e); + case s:default: + return a(e); + }}, + a = e => {n.dialog.showOpenDialog({ title: "Select a jsPsych timeline file", properties: ["openFile", "promptToCreate"] }, t => {t && e.sender.send("loadDialogReply", t[0]);});}, + l = e => {n.dialog.showOpenDialog({ title: "Select a folder of images", properties: ["openDirectory"] }, t => {t ? e.sender.send("loadDialogReply", t[0]) : e.sender.send("loadDialogReply", "");});};n.app.commandLine.appendSwitch("enable-experimental-web-platform-features", !0), n.app.commandLine.appendSwitch("user-activation-v2", !0);let u = null;r("./app/node_modules/source-map-support/source-map-support.js").install();n.app.on("window-all-closed", () => {"darwin" !== process.platform && n.app.quit();}), n.app.on("ready", async () => {u = new n.BrowserWindow({ show: !1, width: 1280, height: 800 }), u.setMinimumSize(1075, 708), n.ipcMain.on("loadDialog", i), u.loadURL(`file://${__dirname}/app.html`), u.webContents.on("did-finish-load", () => {if (!u) throw new Error('"mainWindow" is not defined');u.show(), u.focus();}), u.on("closed", () => {u = null;}), u.setMenu(null);});}, "./app/node_modules/buffer-from/index.js": function (e, t) {var r = Object.prototype.toString, + n = "function" == typeof Buffer.alloc && "function" == typeof Buffer.allocUnsafe && "function" == typeof Buffer.from;e.exports = function (e, t, o) {if ("number" == typeof e) throw new TypeError('"value" argument must not be a number');return s = e, "ArrayBuffer" === r.call(s).slice(8, -1) ? function (e, t, r) {t >>>= 0;var o = e.byteLength - t;if (o < 0) throw new RangeError("'offset' is out of bounds");if (void 0 === r) r = o;else if ((r >>>= 0) > o) throw new RangeError("'length' is out of bounds");return n ? Buffer.from(e.slice(t, t + r)) : new Buffer(new Uint8Array(e.slice(t, t + r)));}(e, t, o) : "string" == typeof e ? function (e, t) {if ("string" == typeof t && "" !== t || (t = "utf8"), !Buffer.isEncoding(t)) throw new TypeError('"encoding" must be a valid string encoding');return n ? Buffer.from(e, t) : new Buffer(e, t);}(e, t) : n ? Buffer.from(e) : new Buffer(e);var s;};}, "./app/node_modules/source-map-support/source-map-support.js": function (e, t, r) {(function (e) {var n, + o = r("./app/node_modules/source-map/source-map.js").SourceMapConsumer, + s = r("path");try {(n = r("fs")).existsSync && n.readFileSync || (n = null);} catch (e) {}var i = r("./app/node_modules/buffer-from/index.js");function a(e, t) {return e.require(t);}var l = !1, + u = !1, + c = !1, + d = "auto", + h = {}, + f = {}, + p = /^data:application\/json[^,]+base64,/, + m = [], + g = [];function _() {return "browser" === d || "node" !== d && ("undefined" != typeof window && "function" == typeof XMLHttpRequest && !(window.require && window.module && window.process && "renderer" === window.process.type));}function v(e) {return function (t) {for (var r = 0; r < e.length; r++) {var n = e[r](t);if (n) return n;}return null;};}var b = v(m);function y(e, t) {if (!e) return t;var r = s.dirname(e), + n = /^\w+:\/\/[^\/]*/.exec(r), + o = n ? n[0] : "", + i = r.slice(o.length);return o && /^\/\w\:/.test(i) ? (o += "/") + s.resolve(r.slice(o.length), t).replace(/\\/g, "/") : o + s.resolve(r.slice(o.length), t);}m.push(function (e) {if (e = e.trim(), /^file:/.test(e) && (e = e.replace(/file:\/\/\/(\w:)?/, function (e, t) {return t ? "" : "/";})), e in h) return h[e];var t = "";try {if (n) n.existsSync(e) && (t = n.readFileSync(e, "utf8"));else {var r = new XMLHttpRequest();r.open("GET", e, !1), r.send(null), 4 === r.readyState && 200 === r.status && (t = r.responseText);}} catch (e) {}return h[e] = t;});var w = v(g);function j(e) {var t = f[e.source];if (!t) {var r = w(e.source);r ? (t = f[e.source] = { url: r.url, map: new o(r.map) }).map.sourcesContent && t.map.sources.forEach(function (e, r) {var n = t.map.sourcesContent[r];if (n) {var o = y(t.url, e);h[o] = n;}}) : t = f[e.source] = { url: null, map: null };}if (t && t.map && "function" == typeof t.map.originalPositionFor) {var n = t.map.originalPositionFor(e);if (null !== n.source) return n.source = y(t.url, n.source), n;}return e;}function E() {var e, + t = "";if (this.isNative()) t = "native";else {!(e = this.getScriptNameOrSourceURL()) && this.isEval() && (t = this.getEvalOrigin(), t += ", "), t += e || "";var r = this.getLineNumber();if (null != r) {t += ":" + r;var n = this.getColumnNumber();n && (t += ":" + n);}}var o = "", + s = this.getFunctionName(), + i = !0, + a = this.isConstructor();if (!(this.isToplevel() || a)) {var l = this.getTypeName();"[object Object]" === l && (l = "null");var u = this.getMethodName();s ? (l && 0 != s.indexOf(l) && (o += l + "."), o += s, u && s.indexOf("." + u) != s.length - u.length - 1 && (o += " [as " + u + "]")) : o += l + "." + (u || "");} else a ? o += "new " + (s || "") : s ? o += s : (o += t, i = !1);return i && (o += " (" + t + ")"), o;}function k(e) {var t = {};return Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(function (r) {t[r] = /^(?:is|get)/.test(r) ? function () {return e[r].call(e);} : e[r];}), t.toString = E, t;}function S(e, t) {if (void 0 === t && (t = { nextPosition: null, curPosition: null }), e.isNative()) return t.curPosition = null, e;var r = e.getFileName() || e.getScriptNameOrSourceURL();if (r) {var n = e.getLineNumber(), + o = e.getColumnNumber() - 1, + s = /^v(10\.1[6-9]|10\.[2-9][0-9]|10\.[0-9]{3,}|1[2-9]\d*|[2-9]\d|\d{3,}|11\.11)/.test(process.version) ? 0 : 62;1 === n && o > s && !_() && !e.isEval() && (o -= s);var i = j({ source: r, line: n, column: o });t.curPosition = i;var a = (e = k(e)).getFunctionName;return e.getFunctionName = function () {return null == t.nextPosition ? a() : t.nextPosition.name || a();}, e.getFileName = function () {return i.source;}, e.getLineNumber = function () {return i.line;}, e.getColumnNumber = function () {return i.column + 1;}, e.getScriptNameOrSourceURL = function () {return i.source;}, e;}var l = e.isEval() && e.getEvalOrigin();return l ? (l = function e(t) {var r = /^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(t);if (r) {var n = j({ source: r[2], line: +r[3], column: r[4] - 1 });return "eval at " + r[1] + " (" + n.source + ":" + n.line + ":" + (n.column + 1) + ")";}return (r = /^eval at ([^(]+) \((.+)\)$/.exec(t)) ? "eval at " + r[1] + " (" + e(r[2]) + ")" : t;}(l), (e = k(e)).getEvalOrigin = function () {return l;}, e) : e;}function C(e, t) {c && (h = {}, f = {});for (var r = (e.name || "Error") + ": " + (e.message || ""), n = { nextPosition: null, curPosition: null }, o = [], s = t.length - 1; s >= 0; s--) o.push("\n at " + S(t[s], n)), n.nextPosition = n.curPosition;return n.curPosition = n.nextPosition = null, r + o.reverse().join("");}function x(e) {var t = /\n at [^(]+ \((.*):(\d+):(\d+)\)/.exec(e.stack);if (t) {var r = t[1], + o = +t[2], + s = +t[3], + i = h[r];if (!i && n && n.existsSync(r)) try {i = n.readFileSync(r, "utf8");} catch (e) {i = "";}if (i) {var a = i.split(/(?:\r\n|\r|\n)/)[o - 1];if (a) return r + ":" + o + "\n" + a + "\n" + new Array(s).join(" ") + "^";}}return null;}function O(e) {var t = x(e);process.stderr._handle && process.stderr._handle.setBlocking && process.stderr._handle.setBlocking(!0), t && (console.error(), console.error(t)), console.error(e.stack), process.exit(1);}g.push(function (e) {var t, + r = function (e) {var t;if (_()) try {var r = new XMLHttpRequest();r.open("GET", e, !1), r.send(null), t = 4 === r.readyState ? r.responseText : null;var n = r.getResponseHeader("SourceMap") || r.getResponseHeader("X-SourceMap");if (n) return n;} catch (e) {}t = b(e);for (var o, s, i = /(?:\/\/[@#][\s]*sourceMappingURL=([^\s'"]+)[\s]*$)|(?:\/\*[@#][\s]*sourceMappingURL=([^\s*'"]+)[\s]*(?:\*\/)[\s]*$)/gm; s = i.exec(t);) o = s;return o ? o[1] : null;}(e);if (!r) return null;if (p.test(r)) {var n = r.slice(r.indexOf(",") + 1);t = i(n, "base64").toString(), r = e;} else r = y(e, r), t = b(r);return t ? { url: r, map: t } : null;});var A = m.slice(0), + R = g.slice(0);t.wrapCallSite = S, t.getErrorSource = x, t.mapSourcePosition = j, t.retrieveSourceMap = w, t.install = function (t) {if ((t = t || {}).environment && (d = t.environment, -1 === ["node", "browser", "auto"].indexOf(d))) throw new Error("environment " + d + " was unknown. Available options are {auto, browser, node}");if (t.retrieveFile && (t.overrideRetrieveFile && (m.length = 0), m.unshift(t.retrieveFile)), t.retrieveSourceMap && (t.overrideRetrieveSourceMap && (g.length = 0), g.unshift(t.retrieveSourceMap)), t.hookRequire && !_()) {var r = a(e, "module"), + n = r.prototype._compile;n.__sourceMapSupport || (r.prototype._compile = function (e, t) {return h[t] = e, f[t] = void 0, n.call(this, e, t);}, r.prototype._compile.__sourceMapSupport = !0);}if (c || (c = "emptyCacheBetweenOperations" in t && t.emptyCacheBetweenOperations), l || (l = !0, Error.prepareStackTrace = C), !u) {var o = !("handleUncaughtExceptions" in t) || t.handleUncaughtExceptions;try {!1 === a(e, "worker_threads").isMainThread && (o = !1);} catch (e) {}o && "object" == typeof process && null !== process && "function" == typeof process.on && (u = !0, s = process.emit, process.emit = function (e) {if ("uncaughtException" === e) {var t = arguments[1] && arguments[1].stack, + r = this.listeners(e).length > 0;if (t && !r) return O(arguments[1]);}return s.apply(this, arguments);});}var s;}, t.resetRetrieveHandlers = function () {m.length = 0, g.length = 0, m = A.slice(0), g = R.slice(0), w = v(g), b = v(m);};}).call(this, r("./node_modules/webpack/buildin/module.js")(e));}, "./app/node_modules/source-map/lib/array-set.js": function (e, t, r) {var n = r("./app/node_modules/source-map/lib/util.js"), + o = Object.prototype.hasOwnProperty, + s = "undefined" != typeof Map;function i() {this._array = [], this._set = s ? new Map() : Object.create(null);}i.fromArray = function (e, t) {for (var r = new i(), n = 0, o = e.length; n < o; n++) r.add(e[n], t);return r;}, i.prototype.size = function () {return s ? this._set.size : Object.getOwnPropertyNames(this._set).length;}, i.prototype.add = function (e, t) {var r = s ? e : n.toSetString(e), + i = s ? this.has(e) : o.call(this._set, r), + a = this._array.length;i && !t || this._array.push(e), i || (s ? this._set.set(e, a) : this._set[r] = a);}, i.prototype.has = function (e) {if (s) return this._set.has(e);var t = n.toSetString(e);return o.call(this._set, t);}, i.prototype.indexOf = function (e) {if (s) {var t = this._set.get(e);if (t >= 0) return t;} else {var r = n.toSetString(e);if (o.call(this._set, r)) return this._set[r];}throw new Error('"' + e + '" is not in the set.');}, i.prototype.at = function (e) {if (e >= 0 && e < this._array.length) return this._array[e];throw new Error("No element indexed by " + e);}, i.prototype.toArray = function () {return this._array.slice();}, t.ArraySet = i;}, "./app/node_modules/source-map/lib/base64-vlq.js": function (e, t, r) {var n = r("./app/node_modules/source-map/lib/base64.js");t.encode = function (e) {var t, + r = "", + o = function (e) {return e < 0 ? 1 + (-e << 1) : 0 + (e << 1);}(e);do {t = 31 & o, (o >>>= 5) > 0 && (t |= 32), r += n.encode(t);} while (o > 0);return r;}, t.decode = function (e, t, r) {var o, + s, + i, + a, + l = e.length, + u = 0, + c = 0;do {if (t >= l) throw new Error("Expected more digits in base 64 VLQ value.");if (-1 === (s = n.decode(e.charCodeAt(t++)))) throw new Error("Invalid base64 digit: " + e.charAt(t - 1));o = !!(32 & s), u += (s &= 31) << c, c += 5;} while (o);r.value = (a = (i = u) >> 1, 1 == (1 & i) ? -a : a), r.rest = t;};}, "./app/node_modules/source-map/lib/base64.js": function (e, t) {var r = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");t.encode = function (e) {if (0 <= e && e < r.length) return r[e];throw new TypeError("Must be between 0 and 63: " + e);}, t.decode = function (e) {return 65 <= e && e <= 90 ? e - 65 : 97 <= e && e <= 122 ? e - 97 + 26 : 48 <= e && e <= 57 ? e - 48 + 52 : 43 == e ? 62 : 47 == e ? 63 : -1;};}, "./app/node_modules/source-map/lib/binary-search.js": function (e, t) {t.GREATEST_LOWER_BOUND = 1, t.LEAST_UPPER_BOUND = 2, t.search = function (e, r, n, o) {if (0 === r.length) return -1;var s = function e(r, n, o, s, i, a) {var l = Math.floor((n - r) / 2) + r, + u = i(o, s[l], !0);return 0 === u ? l : u > 0 ? n - l > 1 ? e(l, n, o, s, i, a) : a == t.LEAST_UPPER_BOUND ? n < s.length ? n : -1 : l : l - r > 1 ? e(r, l, o, s, i, a) : a == t.LEAST_UPPER_BOUND ? l : r < 0 ? -1 : r;}(-1, r.length, e, r, n, o || t.GREATEST_LOWER_BOUND);if (s < 0) return -1;for (; s - 1 >= 0 && 0 === n(r[s], r[s - 1], !0);) --s;return s;};}, "./app/node_modules/source-map/lib/mapping-list.js": function (e, t, r) {var n = r("./app/node_modules/source-map/lib/util.js");function o() {this._array = [], this._sorted = !0, this._last = { generatedLine: -1, generatedColumn: 0 };}o.prototype.unsortedForEach = function (e, t) {this._array.forEach(e, t);}, o.prototype.add = function (e) {var t, r, o, s, i, a;t = this._last, r = e, o = t.generatedLine, s = r.generatedLine, i = t.generatedColumn, a = r.generatedColumn, s > o || s == o && a >= i || n.compareByGeneratedPositionsInflated(t, r) <= 0 ? (this._last = e, this._array.push(e)) : (this._sorted = !1, this._array.push(e));}, o.prototype.toArray = function () {return this._sorted || (this._array.sort(n.compareByGeneratedPositionsInflated), this._sorted = !0), this._array;}, t.MappingList = o;}, "./app/node_modules/source-map/lib/quick-sort.js": function (e, t) {function r(e, t, r) {var n = e[t];e[t] = e[r], e[r] = n;}function n(e, t, o, s) {if (o < s) {var i = o - 1;r(e, (c = o, d = s, Math.round(c + Math.random() * (d - c))), s);for (var a = e[s], l = o; l < s; l++) t(e[l], a) <= 0 && r(e, i += 1, l);r(e, i + 1, l);var u = i + 1;n(e, t, o, u - 1), n(e, t, u + 1, s);}var c, d;}t.quickSort = function (e, t) {n(e, t, 0, e.length - 1);};}, "./app/node_modules/source-map/lib/source-map-consumer.js": function (e, t, r) {var n = r("./app/node_modules/source-map/lib/util.js"), + o = r("./app/node_modules/source-map/lib/binary-search.js"), + s = r("./app/node_modules/source-map/lib/array-set.js").ArraySet, + i = r("./app/node_modules/source-map/lib/base64-vlq.js"), + a = r("./app/node_modules/source-map/lib/quick-sort.js").quickSort;function l(e, t) {var r = e;return "string" == typeof e && (r = n.parseSourceMapInput(e)), null != r.sections ? new d(r, t) : new u(r, t);}function u(e, t) {var r = e;"string" == typeof e && (r = n.parseSourceMapInput(e));var o = n.getArg(r, "version"), + i = n.getArg(r, "sources"), + a = n.getArg(r, "names", []), + l = n.getArg(r, "sourceRoot", null), + u = n.getArg(r, "sourcesContent", null), + c = n.getArg(r, "mappings"), + d = n.getArg(r, "file", null);if (o != this._version) throw new Error("Unsupported version: " + o);l && (l = n.normalize(l)), i = i.map(String).map(n.normalize).map(function (e) {return l && n.isAbsolute(l) && n.isAbsolute(e) ? n.relative(l, e) : e;}), this._names = s.fromArray(a.map(String), !0), this._sources = s.fromArray(i, !0), this._absoluteSources = this._sources.toArray().map(function (e) {return n.computeSourceURL(l, e, t);}), this.sourceRoot = l, this.sourcesContent = u, this._mappings = c, this._sourceMapURL = t, this.file = d;}function c() {this.generatedLine = 0, this.generatedColumn = 0, this.source = null, this.originalLine = null, this.originalColumn = null, this.name = null;}function d(e, t) {var r = e;"string" == typeof e && (r = n.parseSourceMapInput(e));var o = n.getArg(r, "version"), + i = n.getArg(r, "sections");if (o != this._version) throw new Error("Unsupported version: " + o);this._sources = new s(), this._names = new s();var a = { line: -1, column: 0 };this._sections = i.map(function (e) {if (e.url) throw new Error("Support for url field in sections not implemented.");var r = n.getArg(e, "offset"), + o = n.getArg(r, "line"), + s = n.getArg(r, "column");if (o < a.line || o === a.line && s < a.column) throw new Error("Section offsets must be ordered and non-overlapping.");return a = r, { generatedOffset: { generatedLine: o + 1, generatedColumn: s + 1 }, consumer: new l(n.getArg(e, "map"), t) };});}l.fromSourceMap = function (e, t) {return u.fromSourceMap(e, t);}, l.prototype._version = 3, l.prototype.__generatedMappings = null, Object.defineProperty(l.prototype, "_generatedMappings", { configurable: !0, enumerable: !0, get: function () {return this.__generatedMappings || this._parseMappings(this._mappings, this.sourceRoot), this.__generatedMappings;} }), l.prototype.__originalMappings = null, Object.defineProperty(l.prototype, "_originalMappings", { configurable: !0, enumerable: !0, get: function () {return this.__originalMappings || this._parseMappings(this._mappings, this.sourceRoot), this.__originalMappings;} }), l.prototype._charIsMappingSeparator = function (e, t) {var r = e.charAt(t);return ";" === r || "," === r;}, l.prototype._parseMappings = function (e, t) {throw new Error("Subclasses must implement _parseMappings");}, l.GENERATED_ORDER = 1, l.ORIGINAL_ORDER = 2, l.GREATEST_LOWER_BOUND = 1, l.LEAST_UPPER_BOUND = 2, l.prototype.eachMapping = function (e, t, r) {var o, + s = t || null;switch (r || l.GENERATED_ORDER) {case l.GENERATED_ORDER: + o = this._generatedMappings; + break; + case l.ORIGINAL_ORDER: + o = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + }var i = this.sourceRoot;o.map(function (e) {var t = null === e.source ? null : this._sources.at(e.source);return { source: t = n.computeSourceURL(i, t, this._sourceMapURL), generatedLine: e.generatedLine, generatedColumn: e.generatedColumn, originalLine: e.originalLine, originalColumn: e.originalColumn, name: null === e.name ? null : this._names.at(e.name) };}, this).forEach(e, s);}, l.prototype.allGeneratedPositionsFor = function (e) {var t = n.getArg(e, "line"), + r = { source: n.getArg(e, "source"), originalLine: t, originalColumn: n.getArg(e, "column", 0) };if (r.source = this._findSourceIndex(r.source), r.source < 0) return [];var s = [], + i = this._findMapping(r, this._originalMappings, "originalLine", "originalColumn", n.compareByOriginalPositions, o.LEAST_UPPER_BOUND);if (i >= 0) {var a = this._originalMappings[i];if (void 0 === e.column) for (var l = a.originalLine; a && a.originalLine === l;) s.push({ line: n.getArg(a, "generatedLine", null), column: n.getArg(a, "generatedColumn", null), lastColumn: n.getArg(a, "lastGeneratedColumn", null) }), a = this._originalMappings[++i];else for (var u = a.originalColumn; a && a.originalLine === t && a.originalColumn == u;) s.push({ line: n.getArg(a, "generatedLine", null), column: n.getArg(a, "generatedColumn", null), lastColumn: n.getArg(a, "lastGeneratedColumn", null) }), a = this._originalMappings[++i];}return s;}, t.SourceMapConsumer = l, u.prototype = Object.create(l.prototype), u.prototype.consumer = l, u.prototype._findSourceIndex = function (e) {var t, + r = e;if (null != this.sourceRoot && (r = n.relative(this.sourceRoot, r)), this._sources.has(r)) return this._sources.indexOf(r);for (t = 0; t < this._absoluteSources.length; ++t) if (this._absoluteSources[t] == e) return t;return -1;}, u.fromSourceMap = function (e, t) {var r = Object.create(u.prototype), + o = r._names = s.fromArray(e._names.toArray(), !0), + i = r._sources = s.fromArray(e._sources.toArray(), !0);r.sourceRoot = e._sourceRoot, r.sourcesContent = e._generateSourcesContent(r._sources.toArray(), r.sourceRoot), r.file = e._file, r._sourceMapURL = t, r._absoluteSources = r._sources.toArray().map(function (e) {return n.computeSourceURL(r.sourceRoot, e, t);});for (var l = e._mappings.toArray().slice(), d = r.__generatedMappings = [], h = r.__originalMappings = [], f = 0, p = l.length; f < p; f++) {var m = l[f], + g = new c();g.generatedLine = m.generatedLine, g.generatedColumn = m.generatedColumn, m.source && (g.source = i.indexOf(m.source), g.originalLine = m.originalLine, g.originalColumn = m.originalColumn, m.name && (g.name = o.indexOf(m.name)), h.push(g)), d.push(g);}return a(r.__originalMappings, n.compareByOriginalPositions), r;}, u.prototype._version = 3, Object.defineProperty(u.prototype, "sources", { get: function () {return this._absoluteSources.slice();} }), u.prototype._parseMappings = function (e, t) {for (var r, o, s, l, u, d = 1, h = 0, f = 0, p = 0, m = 0, g = 0, _ = e.length, v = 0, b = {}, y = {}, w = [], j = []; v < _;) if (";" === e.charAt(v)) d++, v++, h = 0;else if ("," === e.charAt(v)) v++;else {for ((r = new c()).generatedLine = d, l = v; l < _ && !this._charIsMappingSeparator(e, l); l++);if (s = b[o = e.slice(v, l)]) v += o.length;else {for (s = []; v < l;) i.decode(e, v, y), u = y.value, v = y.rest, s.push(u);if (2 === s.length) throw new Error("Found a source, but no line and column");if (3 === s.length) throw new Error("Found a source and line, but no column");b[o] = s;}r.generatedColumn = h + s[0], h = r.generatedColumn, s.length > 1 && (r.source = m + s[1], m += s[1], r.originalLine = f + s[2], f = r.originalLine, r.originalLine += 1, r.originalColumn = p + s[3], p = r.originalColumn, s.length > 4 && (r.name = g + s[4], g += s[4])), j.push(r), "number" == typeof r.originalLine && w.push(r);}a(j, n.compareByGeneratedPositionsDeflated), this.__generatedMappings = j, a(w, n.compareByOriginalPositions), this.__originalMappings = w;}, u.prototype._findMapping = function (e, t, r, n, s, i) {if (e[r] <= 0) throw new TypeError("Line must be greater than or equal to 1, got " + e[r]);if (e[n] < 0) throw new TypeError("Column must be greater than or equal to 0, got " + e[n]);return o.search(e, t, s, i);}, u.prototype.computeColumnSpans = function () {for (var e = 0; e < this._generatedMappings.length; ++e) {var t = this._generatedMappings[e];if (e + 1 < this._generatedMappings.length) {var r = this._generatedMappings[e + 1];if (t.generatedLine === r.generatedLine) {t.lastGeneratedColumn = r.generatedColumn - 1;continue;}}t.lastGeneratedColumn = 1 / 0;}}, u.prototype.originalPositionFor = function (e) {var t = { generatedLine: n.getArg(e, "line"), generatedColumn: n.getArg(e, "column") }, + r = this._findMapping(t, this._generatedMappings, "generatedLine", "generatedColumn", n.compareByGeneratedPositionsDeflated, n.getArg(e, "bias", l.GREATEST_LOWER_BOUND));if (r >= 0) {var o = this._generatedMappings[r];if (o.generatedLine === t.generatedLine) {var s = n.getArg(o, "source", null);null !== s && (s = this._sources.at(s), s = n.computeSourceURL(this.sourceRoot, s, this._sourceMapURL));var i = n.getArg(o, "name", null);return null !== i && (i = this._names.at(i)), { source: s, line: n.getArg(o, "originalLine", null), column: n.getArg(o, "originalColumn", null), name: i };}}return { source: null, line: null, column: null, name: null };}, u.prototype.hasContentsOfAllSources = function () {return !!this.sourcesContent && (this.sourcesContent.length >= this._sources.size() && !this.sourcesContent.some(function (e) {return null == e;}));}, u.prototype.sourceContentFor = function (e, t) {if (!this.sourcesContent) return null;var r = this._findSourceIndex(e);if (r >= 0) return this.sourcesContent[r];var o, + s = e;if (null != this.sourceRoot && (s = n.relative(this.sourceRoot, s)), null != this.sourceRoot && (o = n.urlParse(this.sourceRoot))) {var i = s.replace(/^file:\/\//, "");if ("file" == o.scheme && this._sources.has(i)) return this.sourcesContent[this._sources.indexOf(i)];if ((!o.path || "/" == o.path) && this._sources.has("/" + s)) return this.sourcesContent[this._sources.indexOf("/" + s)];}if (t) return null;throw new Error('"' + s + '" is not in the SourceMap.');}, u.prototype.generatedPositionFor = function (e) {var t = n.getArg(e, "source");if ((t = this._findSourceIndex(t)) < 0) return { line: null, column: null, lastColumn: null };var r = { source: t, originalLine: n.getArg(e, "line"), originalColumn: n.getArg(e, "column") }, + o = this._findMapping(r, this._originalMappings, "originalLine", "originalColumn", n.compareByOriginalPositions, n.getArg(e, "bias", l.GREATEST_LOWER_BOUND));if (o >= 0) {var s = this._originalMappings[o];if (s.source === r.source) return { line: n.getArg(s, "generatedLine", null), column: n.getArg(s, "generatedColumn", null), lastColumn: n.getArg(s, "lastGeneratedColumn", null) };}return { line: null, column: null, lastColumn: null };}, t.BasicSourceMapConsumer = u, d.prototype = Object.create(l.prototype), d.prototype.constructor = l, d.prototype._version = 3, Object.defineProperty(d.prototype, "sources", { get: function () {for (var e = [], t = 0; t < this._sections.length; t++) for (var r = 0; r < this._sections[t].consumer.sources.length; r++) e.push(this._sections[t].consumer.sources[r]);return e;} }), d.prototype.originalPositionFor = function (e) {var t = { generatedLine: n.getArg(e, "line"), generatedColumn: n.getArg(e, "column") }, + r = o.search(t, this._sections, function (e, t) {var r = e.generatedLine - t.generatedOffset.generatedLine;return r || e.generatedColumn - t.generatedOffset.generatedColumn;}), + s = this._sections[r];return s ? s.consumer.originalPositionFor({ line: t.generatedLine - (s.generatedOffset.generatedLine - 1), column: t.generatedColumn - (s.generatedOffset.generatedLine === t.generatedLine ? s.generatedOffset.generatedColumn - 1 : 0), bias: e.bias }) : { source: null, line: null, column: null, name: null };}, d.prototype.hasContentsOfAllSources = function () {return this._sections.every(function (e) {return e.consumer.hasContentsOfAllSources();});}, d.prototype.sourceContentFor = function (e, t) {for (var r = 0; r < this._sections.length; r++) {var n = this._sections[r].consumer.sourceContentFor(e, !0);if (n) return n;}if (t) return null;throw new Error('"' + e + '" is not in the SourceMap.');}, d.prototype.generatedPositionFor = function (e) {for (var t = 0; t < this._sections.length; t++) {var r = this._sections[t];if (-1 !== r.consumer._findSourceIndex(n.getArg(e, "source"))) {var o = r.consumer.generatedPositionFor(e);if (o) return { line: o.line + (r.generatedOffset.generatedLine - 1), column: o.column + (r.generatedOffset.generatedLine === o.line ? r.generatedOffset.generatedColumn - 1 : 0) };}}return { line: null, column: null };}, d.prototype._parseMappings = function (e, t) {this.__generatedMappings = [], this.__originalMappings = [];for (var r = 0; r < this._sections.length; r++) for (var o = this._sections[r], s = o.consumer._generatedMappings, i = 0; i < s.length; i++) {var l = s[i], + u = o.consumer._sources.at(l.source);u = n.computeSourceURL(o.consumer.sourceRoot, u, this._sourceMapURL), this._sources.add(u), u = this._sources.indexOf(u);var c = null;l.name && (c = o.consumer._names.at(l.name), this._names.add(c), c = this._names.indexOf(c));var d = { source: u, generatedLine: l.generatedLine + (o.generatedOffset.generatedLine - 1), generatedColumn: l.generatedColumn + (o.generatedOffset.generatedLine === l.generatedLine ? o.generatedOffset.generatedColumn - 1 : 0), originalLine: l.originalLine, originalColumn: l.originalColumn, name: c };this.__generatedMappings.push(d), "number" == typeof d.originalLine && this.__originalMappings.push(d);}a(this.__generatedMappings, n.compareByGeneratedPositionsDeflated), a(this.__originalMappings, n.compareByOriginalPositions);}, t.IndexedSourceMapConsumer = d;}, "./app/node_modules/source-map/lib/source-map-generator.js": function (e, t, r) {var n = r("./app/node_modules/source-map/lib/base64-vlq.js"), + o = r("./app/node_modules/source-map/lib/util.js"), + s = r("./app/node_modules/source-map/lib/array-set.js").ArraySet, + i = r("./app/node_modules/source-map/lib/mapping-list.js").MappingList;function a(e) {e || (e = {}), this._file = o.getArg(e, "file", null), this._sourceRoot = o.getArg(e, "sourceRoot", null), this._skipValidation = o.getArg(e, "skipValidation", !1), this._sources = new s(), this._names = new s(), this._mappings = new i(), this._sourcesContents = null;}a.prototype._version = 3, a.fromSourceMap = function (e) {var t = e.sourceRoot, + r = new a({ file: e.file, sourceRoot: t });return e.eachMapping(function (e) {var n = { generated: { line: e.generatedLine, column: e.generatedColumn } };null != e.source && (n.source = e.source, null != t && (n.source = o.relative(t, n.source)), n.original = { line: e.originalLine, column: e.originalColumn }, null != e.name && (n.name = e.name)), r.addMapping(n);}), e.sources.forEach(function (n) {var s = n;null !== t && (s = o.relative(t, n)), r._sources.has(s) || r._sources.add(s);var i = e.sourceContentFor(n);null != i && r.setSourceContent(n, i);}), r;}, a.prototype.addMapping = function (e) {var t = o.getArg(e, "generated"), + r = o.getArg(e, "original", null), + n = o.getArg(e, "source", null), + s = o.getArg(e, "name", null);this._skipValidation || this._validateMapping(t, r, n, s), null != n && (n = String(n), this._sources.has(n) || this._sources.add(n)), null != s && (s = String(s), this._names.has(s) || this._names.add(s)), this._mappings.add({ generatedLine: t.line, generatedColumn: t.column, originalLine: null != r && r.line, originalColumn: null != r && r.column, source: n, name: s });}, a.prototype.setSourceContent = function (e, t) {var r = e;null != this._sourceRoot && (r = o.relative(this._sourceRoot, r)), null != t ? (this._sourcesContents || (this._sourcesContents = Object.create(null)), this._sourcesContents[o.toSetString(r)] = t) : this._sourcesContents && (delete this._sourcesContents[o.toSetString(r)], 0 === Object.keys(this._sourcesContents).length && (this._sourcesContents = null));}, a.prototype.applySourceMap = function (e, t, r) {var n = t;if (null == t) {if (null == e.file) throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');n = e.file;}var i = this._sourceRoot;null != i && (n = o.relative(i, n));var a = new s(), + l = new s();this._mappings.unsortedForEach(function (t) {if (t.source === n && null != t.originalLine) {var s = e.originalPositionFor({ line: t.originalLine, column: t.originalColumn });null != s.source && (t.source = s.source, null != r && (t.source = o.join(r, t.source)), null != i && (t.source = o.relative(i, t.source)), t.originalLine = s.line, t.originalColumn = s.column, null != s.name && (t.name = s.name));}var u = t.source;null == u || a.has(u) || a.add(u);var c = t.name;null == c || l.has(c) || l.add(c);}, this), this._sources = a, this._names = l, e.sources.forEach(function (t) {var n = e.sourceContentFor(t);null != n && (null != r && (t = o.join(r, t)), null != i && (t = o.relative(i, t)), this.setSourceContent(t, n));}, this);}, a.prototype._validateMapping = function (e, t, r, n) {if (t && "number" != typeof t.line && "number" != typeof t.column) throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if ((!(e && "line" in e && "column" in e && e.line > 0 && e.column >= 0) || t || r || n) && !(e && "line" in e && "column" in e && t && "line" in t && "column" in t && e.line > 0 && e.column >= 0 && t.line > 0 && t.column >= 0 && r)) throw new Error("Invalid mapping: " + JSON.stringify({ generated: e, source: r, original: t, name: n }));}, a.prototype._serializeMappings = function () {for (var e, t, r, s, i = 0, a = 1, l = 0, u = 0, c = 0, d = 0, h = "", f = this._mappings.toArray(), p = 0, m = f.length; p < m; p++) {if (e = "", (t = f[p]).generatedLine !== a) for (i = 0; t.generatedLine !== a;) e += ";", a++;else if (p > 0) {if (!o.compareByGeneratedPositionsInflated(t, f[p - 1])) continue;e += ",";}e += n.encode(t.generatedColumn - i), i = t.generatedColumn, null != t.source && (s = this._sources.indexOf(t.source), e += n.encode(s - d), d = s, e += n.encode(t.originalLine - 1 - u), u = t.originalLine - 1, e += n.encode(t.originalColumn - l), l = t.originalColumn, null != t.name && (r = this._names.indexOf(t.name), e += n.encode(r - c), c = r)), h += e;}return h;}, a.prototype._generateSourcesContent = function (e, t) {return e.map(function (e) {if (!this._sourcesContents) return null;null != t && (e = o.relative(t, e));var r = o.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents, r) ? this._sourcesContents[r] : null;}, this);}, a.prototype.toJSON = function () {var e = { version: this._version, sources: this._sources.toArray(), names: this._names.toArray(), mappings: this._serializeMappings() };return null != this._file && (e.file = this._file), null != this._sourceRoot && (e.sourceRoot = this._sourceRoot), this._sourcesContents && (e.sourcesContent = this._generateSourcesContent(e.sources, e.sourceRoot)), e;}, a.prototype.toString = function () {return JSON.stringify(this.toJSON());}, t.SourceMapGenerator = a;}, "./app/node_modules/source-map/lib/source-node.js": function (e, t, r) {var n = r("./app/node_modules/source-map/lib/source-map-generator.js").SourceMapGenerator, + o = r("./app/node_modules/source-map/lib/util.js"), + s = /(\r?\n)/, + i = "$$$isSourceNode$$$";function a(e, t, r, n, o) {this.children = [], this.sourceContents = {}, this.line = null == e ? null : e, this.column = null == t ? null : t, this.source = null == r ? null : r, this.name = null == o ? null : o, this[i] = !0, null != n && this.add(n);}a.fromStringWithSourceMap = function (e, t, r) {var n = new a(), + i = e.split(s), + l = 0, + u = function () {return e() + (e() || "");function e() {return l < i.length ? i[l++] : void 0;}}, + c = 1, + d = 0, + h = null;return t.eachMapping(function (e) {if (null !== h) {if (!(c < e.generatedLine)) {var t = (r = i[l] || "").substr(0, e.generatedColumn - d);return i[l] = r.substr(e.generatedColumn - d), d = e.generatedColumn, f(h, t), void (h = e);}f(h, u()), c++, d = 0;}for (; c < e.generatedLine;) n.add(u()), c++;if (d < e.generatedColumn) {var r = i[l] || "";n.add(r.substr(0, e.generatedColumn)), i[l] = r.substr(e.generatedColumn), d = e.generatedColumn;}h = e;}, this), l < i.length && (h && f(h, u()), n.add(i.splice(l).join(""))), t.sources.forEach(function (e) {var s = t.sourceContentFor(e);null != s && (null != r && (e = o.join(r, e)), n.setSourceContent(e, s));}), n;function f(e, t) {if (null === e || void 0 === e.source) n.add(t);else {var s = r ? o.join(r, e.source) : e.source;n.add(new a(e.originalLine, e.originalColumn, s, t, e.name));}}}, a.prototype.add = function (e) {if (Array.isArray(e)) e.forEach(function (e) {this.add(e);}, this);else {if (!e[i] && "string" != typeof e) throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + e);e && this.children.push(e);}return this;}, a.prototype.prepend = function (e) {if (Array.isArray(e)) for (var t = e.length - 1; t >= 0; t--) this.prepend(e[t]);else {if (!e[i] && "string" != typeof e) throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + e);this.children.unshift(e);}return this;}, a.prototype.walk = function (e) {for (var t, r = 0, n = this.children.length; r < n; r++) (t = this.children[r])[i] ? t.walk(e) : "" !== t && e(t, { source: this.source, line: this.line, column: this.column, name: this.name });}, a.prototype.join = function (e) {var t, + r, + n = this.children.length;if (n > 0) {for (t = [], r = 0; r < n - 1; r++) t.push(this.children[r]), t.push(e);t.push(this.children[r]), this.children = t;}return this;}, a.prototype.replaceRight = function (e, t) {var r = this.children[this.children.length - 1];return r[i] ? r.replaceRight(e, t) : "string" == typeof r ? this.children[this.children.length - 1] = r.replace(e, t) : this.children.push("".replace(e, t)), this;}, a.prototype.setSourceContent = function (e, t) {this.sourceContents[o.toSetString(e)] = t;}, a.prototype.walkSourceContents = function (e) {for (var t = 0, r = this.children.length; t < r; t++) this.children[t][i] && this.children[t].walkSourceContents(e);var n = Object.keys(this.sourceContents);for (t = 0, r = n.length; t < r; t++) e(o.fromSetString(n[t]), this.sourceContents[n[t]]);}, a.prototype.toString = function () {var e = "";return this.walk(function (t) {e += t;}), e;}, a.prototype.toStringWithSourceMap = function (e) {var t = { code: "", line: 1, column: 0 }, + r = new n(e), + o = !1, + s = null, + i = null, + a = null, + l = null;return this.walk(function (e, n) {t.code += e, null !== n.source && null !== n.line && null !== n.column ? (s === n.source && i === n.line && a === n.column && l === n.name || r.addMapping({ source: n.source, original: { line: n.line, column: n.column }, generated: { line: t.line, column: t.column }, name: n.name }), s = n.source, i = n.line, a = n.column, l = n.name, o = !0) : o && (r.addMapping({ generated: { line: t.line, column: t.column } }), s = null, o = !1);for (var u = 0, c = e.length; u < c; u++) 10 === e.charCodeAt(u) ? (t.line++, t.column = 0, u + 1 === c ? (s = null, o = !1) : o && r.addMapping({ source: n.source, original: { line: n.line, column: n.column }, generated: { line: t.line, column: t.column }, name: n.name })) : t.column++;}), this.walkSourceContents(function (e, t) {r.setSourceContent(e, t);}), { code: t.code, map: r };}, t.SourceNode = a;}, "./app/node_modules/source-map/lib/util.js": function (e, t) {t.getArg = function (e, t, r) {if (t in e) return e[t];if (3 === arguments.length) return r;throw new Error('"' + t + '" is a required argument.');};var r = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/, + n = /^data:.+\,.+$/;function o(e) {var t = e.match(r);return t ? { scheme: t[1], auth: t[2], host: t[3], port: t[4], path: t[5] } : null;}function s(e) {var t = "";return e.scheme && (t += e.scheme + ":"), t += "//", e.auth && (t += e.auth + "@"), e.host && (t += e.host), e.port && (t += ":" + e.port), e.path && (t += e.path), t;}function i(e) {var r = e, + n = o(e);if (n) {if (!n.path) return e;r = n.path;}for (var i, a = t.isAbsolute(r), l = r.split(/\/+/), u = 0, c = l.length - 1; c >= 0; c--) "." === (i = l[c]) ? l.splice(c, 1) : ".." === i ? u++ : u > 0 && ("" === i ? (l.splice(c + 1, u), u = 0) : (l.splice(c, 2), u--));return "" === (r = l.join("/")) && (r = a ? "/" : "."), n ? (n.path = r, s(n)) : r;}function a(e, t) {"" === e && (e = "."), "" === t && (t = ".");var r = o(t), + a = o(e);if (a && (e = a.path || "/"), r && !r.scheme) return a && (r.scheme = a.scheme), s(r);if (r || t.match(n)) return t;if (a && !a.host && !a.path) return a.host = t, s(a);var l = "/" === t.charAt(0) ? t : i(e.replace(/\/+$/, "") + "/" + t);return a ? (a.path = l, s(a)) : l;}t.urlParse = o, t.urlGenerate = s, t.normalize = i, t.join = a, t.isAbsolute = function (e) {return "/" === e.charAt(0) || r.test(e);}, t.relative = function (e, t) {"" === e && (e = "."), e = e.replace(/\/$/, "");for (var r = 0; 0 !== t.indexOf(e + "/");) {var n = e.lastIndexOf("/");if (n < 0) return t;if ((e = e.slice(0, n)).match(/^([^\/]+:\/)?\/*$/)) return t;++r;}return Array(r + 1).join("../") + t.substr(e.length + 1);};var l = !("__proto__" in Object.create(null));function u(e) {return e;}function c(e) {if (!e) return !1;var t = e.length;if (t < 9) return !1;if (95 !== e.charCodeAt(t - 1) || 95 !== e.charCodeAt(t - 2) || 111 !== e.charCodeAt(t - 3) || 116 !== e.charCodeAt(t - 4) || 111 !== e.charCodeAt(t - 5) || 114 !== e.charCodeAt(t - 6) || 112 !== e.charCodeAt(t - 7) || 95 !== e.charCodeAt(t - 8) || 95 !== e.charCodeAt(t - 9)) return !1;for (var r = t - 10; r >= 0; r--) if (36 !== e.charCodeAt(r)) return !1;return !0;}function d(e, t) {return e === t ? 0 : null === e ? 1 : null === t ? -1 : e > t ? 1 : -1;}t.toSetString = l ? u : function (e) {return c(e) ? "$" + e : e;}, t.fromSetString = l ? u : function (e) {return c(e) ? e.slice(1) : e;}, t.compareByOriginalPositions = function (e, t, r) {var n = d(e.source, t.source);return 0 !== n || 0 !== (n = e.originalLine - t.originalLine) || 0 !== (n = e.originalColumn - t.originalColumn) || r || 0 !== (n = e.generatedColumn - t.generatedColumn) || 0 !== (n = e.generatedLine - t.generatedLine) ? n : d(e.name, t.name);}, t.compareByGeneratedPositionsDeflated = function (e, t, r) {var n = e.generatedLine - t.generatedLine;return 0 !== n || 0 !== (n = e.generatedColumn - t.generatedColumn) || r || 0 !== (n = d(e.source, t.source)) || 0 !== (n = e.originalLine - t.originalLine) || 0 !== (n = e.originalColumn - t.originalColumn) ? n : d(e.name, t.name);}, t.compareByGeneratedPositionsInflated = function (e, t) {var r = e.generatedLine - t.generatedLine;return 0 !== r || 0 !== (r = e.generatedColumn - t.generatedColumn) || 0 !== (r = d(e.source, t.source)) || 0 !== (r = e.originalLine - t.originalLine) || 0 !== (r = e.originalColumn - t.originalColumn) ? r : d(e.name, t.name);}, t.parseSourceMapInput = function (e) {return JSON.parse(e.replace(/^\)]}'[^\n]*\n/, ""));}, t.computeSourceURL = function (e, t, r) {if (t = t || "", e && ("/" !== e[e.length - 1] && "/" !== t[0] && (e += "/"), t = e + t), r) {var n = o(r);if (!n) throw new Error("sourceMapURL could not be parsed");if (n.path) {var l = n.path.lastIndexOf("/");l >= 0 && (n.path = n.path.substring(0, l + 1));}t = a(s(n), t);}return i(t);};}, "./app/node_modules/source-map/source-map.js": function (e, t, r) {t.SourceMapGenerator = r("./app/node_modules/source-map/lib/source-map-generator.js").SourceMapGenerator, t.SourceMapConsumer = r("./app/node_modules/source-map/lib/source-map-consumer.js").SourceMapConsumer, t.SourceNode = r("./app/node_modules/source-map/lib/source-node.js").SourceNode;}, "./node_modules/balanced-match/index.js": function (e, t, r) {"use strict"; + function n(e, t, r) {e instanceof RegExp && (e = o(e, r)), t instanceof RegExp && (t = o(t, r));var n = s(e, t, r);return n && { start: n[0], end: n[1], pre: r.slice(0, n[0]), body: r.slice(n[0] + e.length, n[1]), post: r.slice(n[1] + t.length) };}function o(e, t) {var r = t.match(e);return r ? r[0] : null;}function s(e, t, r) {var n, + o, + s, + i, + a, + l = r.indexOf(e), + u = r.indexOf(t, l + 1), + c = l;if (l >= 0 && u > 0) {for (n = [], s = r.length; c >= 0 && !a;) c == l ? (n.push(c), l = r.indexOf(e, c + 1)) : 1 == n.length ? a = [n.pop(), u] : ((o = n.pop()) < s && (s = o, i = u), u = r.indexOf(t, c + 1)), c = l < u && l >= 0 ? l : u;n.length && (a = [s, i]);}return a;}e.exports = n, n.range = s;}, "./node_modules/brace-expansion/index.js": function (e, t, r) {var n = r("./node_modules/concat-map/index.js"), + o = r("./node_modules/balanced-match/index.js");e.exports = function (e) {if (!e) return [];"{}" === e.substr(0, 2) && (e = "\\{\\}" + e.substr(2));return function e(t, r) {var s = [], + i = o("{", "}", t);if (!i || /\$$/.test(i.pre)) return [t];var l, + u = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(i.body), + d = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(i.body), + g = u || d, + _ = i.body.indexOf(",") >= 0;if (!g && !_) return i.post.match(/,.*\}/) ? (t = i.pre + "{" + i.body + a + i.post, e(t)) : [t];if (g) l = i.body.split(/\.\./);else {if (1 === (l = function e(t) {if (!t) return [""];var r = [], + n = o("{", "}", t);if (!n) return t.split(",");var s = n.pre, + i = n.body, + a = n.post, + l = s.split(",");l[l.length - 1] += "{" + i + "}";var u = e(a);a.length && (l[l.length - 1] += u.shift(), l.push.apply(l, u));return r.push.apply(r, l), r;}(i.body)).length) if (1 === (l = e(l[0], !1).map(h)).length) return (y = i.post.length ? e(i.post, !1) : [""]).map(function (e) {return i.pre + l[0] + e;});}var v, + b = i.pre, + y = i.post.length ? e(i.post, !1) : [""];if (g) {var w = c(l[0]), + j = c(l[1]), + E = Math.max(l[0].length, l[1].length), + k = 3 == l.length ? Math.abs(c(l[2])) : 1, + S = p;j < w && (k *= -1, S = m);var C = l.some(f);v = [];for (var x = w; S(x, j); x += k) {var O;if (d) "\\" === (O = String.fromCharCode(x)) && (O = "");else if (O = String(x), C) {var A = E - O.length;if (A > 0) {var R = new Array(A + 1).join("0");O = x < 0 ? "-" + R + O.slice(1) : R + O;}}v.push(O);}} else v = n(l, function (t) {return e(t, !1);});for (var I = 0; I < v.length; I++) for (var T = 0; T < y.length; T++) {var L = b + v[I] + y[T];(!r || g || L) && s.push(L);}return s;}(function (e) {return e.split("\\\\").join(s).split("\\{").join(i).split("\\}").join(a).split("\\,").join(l).split("\\.").join(u);}(e), !0).map(d);};var s = "\0SLASH" + Math.random() + "\0", + i = "\0OPEN" + Math.random() + "\0", + a = "\0CLOSE" + Math.random() + "\0", + l = "\0COMMA" + Math.random() + "\0", + u = "\0PERIOD" + Math.random() + "\0";function c(e) {return parseInt(e, 10) == e ? parseInt(e, 10) : e.charCodeAt(0);}function d(e) {return e.split(s).join("\\").split(i).join("{").split(a).join("}").split(l).join(",").split(u).join(".");}function h(e) {return "{" + e + "}";}function f(e) {return /^-?0\d/.test(e);}function p(e, t) {return e <= t;}function m(e, t) {return e >= t;}}, "./node_modules/concat-map/index.js": function (e, t) {e.exports = function (e, t) {for (var n = [], o = 0; o < e.length; o++) {var s = t(e[o], o);r(s) ? n.push.apply(n, s) : n.push(s);}return n;};var r = Array.isArray || function (e) {return "[object Array]" === Object.prototype.toString.call(e);};}, "./node_modules/core-util-is/lib/util.js": function (e, t) {function r(e) {return Object.prototype.toString.call(e);}t.isArray = function (e) {return Array.isArray ? Array.isArray(e) : "[object Array]" === r(e);}, t.isBoolean = function (e) {return "boolean" == typeof e;}, t.isNull = function (e) {return null === e;}, t.isNullOrUndefined = function (e) {return null == e;}, t.isNumber = function (e) {return "number" == typeof e;}, t.isString = function (e) {return "string" == typeof e;}, t.isSymbol = function (e) {return "symbol" == typeof e;}, t.isUndefined = function (e) {return void 0 === e;}, t.isRegExp = function (e) {return "[object RegExp]" === r(e);}, t.isObject = function (e) {return "object" == typeof e && null !== e;}, t.isDate = function (e) {return "[object Date]" === r(e);}, t.isError = function (e) {return "[object Error]" === r(e) || e instanceof Error;}, t.isFunction = function (e) {return "function" == typeof e;}, t.isPrimitive = function (e) {return null === e || "boolean" == typeof e || "number" == typeof e || "string" == typeof e || "symbol" == typeof e || void 0 === e;}, t.isBuffer = Buffer.isBuffer;}, "./node_modules/debug/src/browser.js": function (e, t, r) {t.log = function (...e) {return "object" == typeof console && console.log && console.log(...e);}, t.formatArgs = function (t) {if (t[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + t[0] + (this.useColors ? "%c " : " ") + "+" + e.exports.humanize(this.diff), !this.useColors) return;const r = "color: " + this.color;t.splice(1, 0, r, "color: inherit");let n = 0, + o = 0;t[0].replace(/%[a-zA-Z%]/g, e => {"%%" !== e && (n++, "%c" === e && (o = n));}), t.splice(o, 0, r);}, t.save = function (e) {try {e ? t.storage.setItem("debug", e) : t.storage.removeItem("debug");} catch (e) {}}, t.load = function () {let e;try {e = t.storage.getItem("debug");} catch (e) {}!e && "undefined" != typeof process && "env" in process && (e = process.env.DEBUG);return e;}, t.useColors = function () {if ("undefined" != typeof window && window.process && ("renderer" === window.process.type || window.process.__nwjs)) return !0;if ("undefined" != typeof navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) return !1;return "undefined" != typeof document && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || "undefined" != typeof window && window.console && (window.console.firebug || window.console.exception && window.console.table) || "undefined" != typeof navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || "undefined" != typeof navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);}, t.storage = function () {try {return localStorage;} catch (e) {}}(), t.colors = ["#0000CC", "#0000FF", "#0033CC", "#0033FF", "#0066CC", "#0066FF", "#0099CC", "#0099FF", "#00CC00", "#00CC33", "#00CC66", "#00CC99", "#00CCCC", "#00CCFF", "#3300CC", "#3300FF", "#3333CC", "#3333FF", "#3366CC", "#3366FF", "#3399CC", "#3399FF", "#33CC00", "#33CC33", "#33CC66", "#33CC99", "#33CCCC", "#33CCFF", "#6600CC", "#6600FF", "#6633CC", "#6633FF", "#66CC00", "#66CC33", "#9900CC", "#9900FF", "#9933CC", "#9933FF", "#99CC00", "#99CC33", "#CC0000", "#CC0033", "#CC0066", "#CC0099", "#CC00CC", "#CC00FF", "#CC3300", "#CC3333", "#CC3366", "#CC3399", "#CC33CC", "#CC33FF", "#CC6600", "#CC6633", "#CC9900", "#CC9933", "#CCCC00", "#CCCC33", "#FF0000", "#FF0033", "#FF0066", "#FF0099", "#FF00CC", "#FF00FF", "#FF3300", "#FF3333", "#FF3366", "#FF3399", "#FF33CC", "#FF33FF", "#FF6600", "#FF6633", "#FF9900", "#FF9933", "#FFCC00", "#FFCC33"], e.exports = r("./node_modules/debug/src/common.js")(t);const { + formatters: n + } = e.exports;n.j = function (e) {try {return JSON.stringify(e);} catch (e) {return "[UnexpectedJSONParseError]: " + e.message;}};}, "./node_modules/debug/src/common.js": function (e, t, r) {e.exports = function (e) {function t(e) {let t = 0;for (let r = 0; r < e.length; r++) t = (t << 5) - t + e.charCodeAt(r), t |= 0;return n.colors[Math.abs(t) % n.colors.length];}function n(e) {let r;function i(...e) {if (!i.enabled) return;const t = i, + o = Number(new Date()), + s = o - (r || o);t.diff = s, t.prev = r, t.curr = o, r = o, e[0] = n.coerce(e[0]), "string" != typeof e[0] && e.unshift("%O");let a = 0;e[0] = e[0].replace(/%([a-zA-Z%])/g, (r, o) => {if ("%%" === r) return r;a++;const s = n.formatters[o];if ("function" == typeof s) {const n = e[a];r = s.call(t, n), e.splice(a, 1), a--;}return r;}), n.formatArgs.call(t, e);(t.log || n.log).apply(t, e);}return i.namespace = e, i.enabled = n.enabled(e), i.useColors = n.useColors(), i.color = t(e), i.destroy = o, i.extend = s, "function" == typeof n.init && n.init(i), n.instances.push(i), i;}function o() {const e = n.instances.indexOf(this);return -1 !== e && (n.instances.splice(e, 1), !0);}function s(e, t) {const r = n(this.namespace + (void 0 === t ? ":" : t) + e);return r.log = this.log, r;}function i(e) {return e.toString().substring(2, e.toString().length - 2).replace(/\.\*\?$/, "*");}return n.debug = n, n.default = n, n.coerce = function (e) {if (e instanceof Error) return e.stack || e.message;return e;}, n.disable = function () {const e = [...n.names.map(i), ...n.skips.map(i).map(e => "-" + e)].join(",");return n.enable(""), e;}, n.enable = function (e) {let t;n.save(e), n.names = [], n.skips = [];const r = ("string" == typeof e ? e : "").split(/[\s,]+/), + o = r.length;for (t = 0; t < o; t++) r[t] && ("-" === (e = r[t].replace(/\*/g, ".*?"))[0] ? n.skips.push(new RegExp("^" + e.substr(1) + "$")) : n.names.push(new RegExp("^" + e + "$")));for (t = 0; t < n.instances.length; t++) {const e = n.instances[t];e.enabled = n.enabled(e.namespace);}}, n.enabled = function (e) {if ("*" === e[e.length - 1]) return !0;let t, r;for (t = 0, r = n.skips.length; t < r; t++) if (n.skips[t].test(e)) return !1;for (t = 0, r = n.names.length; t < r; t++) if (n.names[t].test(e)) return !0;return !1;}, n.humanize = r("./node_modules/ms/index.js"), Object.keys(e).forEach(t => {n[t] = e[t];}), n.instances = [], n.names = [], n.skips = [], n.formatters = {}, n.selectColor = t, n.enable(n.load()), n;};}, "./node_modules/debug/src/index.js": function (e, t, r) {"undefined" == typeof process || "renderer" === process.type || !0 === process.browser || process.__nwjs ? e.exports = r("./node_modules/debug/src/browser.js") : e.exports = r("./node_modules/debug/src/node.js");}, "./node_modules/debug/src/node.js": function (e, t, r) {const n = r("tty"), + o = r("util");t.init = function (e) {e.inspectOpts = {};const r = Object.keys(t.inspectOpts);for (let n = 0; n < r.length; n++) e.inspectOpts[r[n]] = t.inspectOpts[r[n]];}, t.log = function (...e) {return process.stderr.write(o.format(...e) + "\n");}, t.formatArgs = function (r) {const { + namespace: n, + useColors: o + } = this;if (o) {const t = this.color, + o = "[3" + (t < 8 ? t : "8;5;" + t), + s = ` ${o};1m${n} `;r[0] = s + r[0].split("\n").join("\n" + s), r.push(o + "m+" + e.exports.humanize(this.diff) + "");} else r[0] = function () {if (t.inspectOpts.hideDate) return "";return new Date().toISOString() + " ";}() + n + " " + r[0];}, t.save = function (e) {e ? process.env.DEBUG = e : delete process.env.DEBUG;}, t.load = function () {return process.env.DEBUG;}, t.useColors = function () {return "colors" in t.inspectOpts ? Boolean(t.inspectOpts.colors) : n.isatty(process.stderr.fd);}, t.colors = [6, 2, 3, 4, 5, 1];try {const e = r("./node_modules/supports-color/index.js");e && (e.stderr || e).level >= 2 && (t.colors = [20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, 69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, 135, 148, 149, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 178, 179, 184, 185, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 214, 215, 220, 221]);} catch (e) {}t.inspectOpts = Object.keys(process.env).filter(e => /^debug_/i.test(e)).reduce((e, t) => {const r = t.substring(6).toLowerCase().replace(/_([a-z])/g, (e, t) => t.toUpperCase());let n = process.env[t];return n = !!/^(yes|on|true|enabled)$/i.test(n) || !/^(no|off|false|disabled)$/i.test(n) && ("null" === n ? null : Number(n)), e[r] = n, e;}, {}), e.exports = r("./node_modules/debug/src/common.js")(t);const { + formatters: s + } = e.exports;s.o = function (e) {return this.inspectOpts.colors = this.useColors, o.inspect(e, this.inspectOpts).replace(/\s*\n\s*/g, " ");}, s.O = function (e) {return this.inspectOpts.colors = this.useColors, o.inspect(e, this.inspectOpts);};}, "./node_modules/electron-debug sync recursive": function (e, t) {function r(e) {var t = new Error("Cannot find module '" + e + "'");throw t.code = "MODULE_NOT_FOUND", t;}r.keys = function () {return [];}, r.resolve = r, e.exports = r, r.id = "./node_modules/electron-debug sync recursive";}, "./node_modules/electron-debug/index.js": function (e, t, r) {"use strict"; + const { + app: n, + BrowserWindow: o, + session: s + } = r("electron"), + i = r("./node_modules/electron-localshortcut/index.js"), + a = r("./node_modules/electron-is-dev/index.js"), + l = "darwin" === process.platform, + u = {};function c(e = o.getFocusedWindow()) {e && function (e = o.getFocusedWindow()) {if (e) {const { + webContents: t + } = e;t.isDevToolsOpened() ? t.closeDevTools() : t.openDevTools(u);}}(e);}function d(e = o.getFocusedWindow()) {e && e.webContents.openDevTools(u);}function h(e = o.getFocusedWindow()) {e && e.webContents.reloadIgnoringCache();}function f() {const e = o.getFocusedWindow(), + t = () => {e.devToolsWebContents.executeJavaScript("DevToolsAPI.enterInspectElementMode()");};e && (e.webContents.isDevToolsOpened() ? t() : (e.webContents.once("devtools-opened", t), e.openDevTools()));}const p = (e, t) => {try {(e => s.defaultSession.getAllExtensions ? {}.hasOwnProperty.call(s.defaultSession.getAllExtensions(), e) : o.getDevToolsExtensions && {}.hasOwnProperty.call(o.getDevToolsExtensions(), e))(e) || (s.defaultSession.loadExtension ? s.defaultSession.loadExtension(t(e)) : o.addDevToolsExtension(t(e)));} catch (e) {}};e.exports = e => {!1 === (e = { isEnabled: null, showDevTools: !0, devToolsMode: "previous", ...e }).isEnabled || null === e.isEnabled && !a || ("previous" !== e.devToolsMode && (u.mode = e.devToolsMode), n.on("browser-window-created", (t, r) => {e.showDevTools && r.webContents.once("dom-ready", () => {d(r, e.showDevTools);});}), (async () => {await n.whenReady(), p("devtron", e => r("./node_modules/electron-debug sync recursive")(e).path), p("electron-react-devtools", e => r("./node_modules/electron-debug sync recursive")(e).path), i.register("CommandOrControl+Shift+C", f), i.register(l ? "Command+Alt+I" : "Control+Shift+I", c), i.register("F12", c), i.register("CommandOrControl+R", h), i.register("F5", h);})());}, e.exports.refresh = h, e.exports.devTools = c, e.exports.openDevTools = d;}, "./node_modules/electron-devtools-installer/dist/downloadChromeExtension.js": function (e, t, r) {"use strict"; + Object.defineProperty(t, "__esModule", { value: !0 }), t.default = void 0;var n = l(r("fs")), + o = l(r("path")), + s = l(r("./node_modules/rimraf/rimraf.js")), + i = l(r("./node_modules/unzip-crx/dist/index.js")), + a = r("./node_modules/electron-devtools-installer/dist/utils.js");function l(e) {return e && e.__esModule ? e : { default: e };}var u = function e(t, r) {var l = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 5, + u = (0, a.getPath)();n.default.existsSync(u) || n.default.mkdirSync(u, { recursive: !0 });var c = o.default.resolve("".concat(u, "/").concat(t));return new Promise(function (u, d) {if (!n.default.existsSync(c) || r) {n.default.existsSync(c) && s.default.sync(c);var h = "https://clients2.google.com/service/update2/crx?response=redirect&x=id%3D".concat(t, "%26uc&prodversion=32"), + f = o.default.resolve("".concat(c, ".crx"));(0, a.downloadFile)(h, f).then(function () {(0, i.default)(f, c).then(function () {(0, a.changePermissions)(c, 755), u(c);}).catch(function (e) {if (!n.default.existsSync(o.default.resolve(c, "manifest.json"))) return d(e);});}).catch(function (n) {if (console.log("Failed to fetch extension, trying ".concat(l - 1, " more times")), l <= 1) return d(n);setTimeout(function () {e(t, r, l - 1).then(u).catch(d);}, 200);});} else u(c);});};t.default = u;}, "./node_modules/electron-devtools-installer/dist/index.js": function (e, t, r) {"use strict"; + Object.defineProperty(t, "__esModule", { value: !0 }), t.MOBX_DEVTOOLS = t.APOLLO_DEVELOPER_TOOLS = t.CYCLEJS_DEVTOOL = t.REACT_PERF = t.REDUX_DEVTOOLS = t.VUEJS_DEVTOOLS = t.ANGULARJS_BATARANG = t.JQUERY_DEBUGGER = t.BACKBONE_DEBUGGER = t.REACT_DEVELOPER_TOOLS = t.EMBER_INSPECTOR = t.default = void 0;var n = r("electron"), + o = u(r("fs")), + s = u(r("path")), + i = u(r("./node_modules/electron-devtools-installer/node_modules/semver/index.js")), + a = u(r("./node_modules/electron-devtools-installer/dist/downloadChromeExtension.js")), + l = r("./node_modules/electron-devtools-installer/dist/utils.js");function u(e) {return e && e.__esModule ? e : { default: e };}function c(e, t, r) {return t in e ? Object.defineProperty(e, t, { value: r, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = r, e;}function d(e) {return (d = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) {return typeof e;} : function (e) {return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e;})(e);}var h = {}, + f = function () {return s.default.resolve((0, l.getPath)(), "IDMap.json");};if (o.default.existsSync(f())) try {h = JSON.parse(o.default.readFileSync(f(), "utf8"));} catch (e) {console.error("electron-devtools-installer: Invalid JSON present in the IDMap file");}var p = function e(t) {var r, + s = arguments.length > 1 && void 0 !== arguments[1] && arguments[1];if ("browser" !== process.type) return Promise.reject(new Error("electron-devtools-installer can only be used from the main process"));if (Array.isArray(t)) return t.reduce(function (t, r) {return t.then(function () {return e(r, s);});}, Promise.resolve());if ("object" === d(t) && t.id) {r = t.id;var l = process.versions.electron.split("-")[0];if (!i.default.satisfies(l, t.electron)) return Promise.reject(new Error("Version of Electron: ".concat(l, " does not match required range ").concat(t.electron, " for extension ").concat(r)));} else {if ("string" != typeof t) return Promise.reject(new Error('Invalid extensionReference passed in: "'.concat(t, '"')));r = t;}var u = h[r], + p = u && n.BrowserWindow.getDevToolsExtensions && n.BrowserWindow.getDevToolsExtensions()[u];return !s && p ? Promise.resolve(h[r]) : (0, a.default)(r, s).then(function (e) {p && n.BrowserWindow.removeDevToolsExtension(u);var t = n.BrowserWindow.addDevToolsExtension(e);return o.default.writeFileSync(f(), JSON.stringify(Object.assign(h, c({}, r, t)))), Promise.resolve(t);});};t.default = p;t.EMBER_INSPECTOR = { id: "bmdblncegkenkacieihfhpjfppoconhi", electron: ">=1.2.1" };t.REACT_DEVELOPER_TOOLS = { id: "fmkadmapgofadopljbjfkapdkoienihi", electron: ">=1.2.1" };t.BACKBONE_DEBUGGER = { id: "bhljhndlimiafopmmhjlgfpnnchjjbhd", electron: ">=1.2.1" };t.JQUERY_DEBUGGER = { id: "dbhhnnnpaeobfddmlalhnehgclcmjimi", electron: ">=1.2.1" };t.ANGULARJS_BATARANG = { id: "ighdmehidhipcmcojjgiloacoafjmpfk", electron: ">=1.2.1" };t.VUEJS_DEVTOOLS = { id: "nhdogjmejiglipccpnnnanhbledajbpd", electron: ">=1.2.1" };t.REDUX_DEVTOOLS = { id: "lmhkpmbekcpmknklioeibfkpmmfibljd", electron: ">=1.2.1" };t.REACT_PERF = { id: "hacmcodfllhbnekmghgdlplbdnahmhmm", electron: ">=1.2.6" };t.CYCLEJS_DEVTOOL = { id: "dfgplfmhhmdekalbpejekgfegkonjpfp", electron: ">=1.2.1" };t.APOLLO_DEVELOPER_TOOLS = { id: "jdkknkkbebbapilgoeccciglkfbmbnfm", electron: ">=1.2.1" };t.MOBX_DEVTOOLS = { id: "pfgnfdagidkfgccljigdamigbcnndkod", electron: ">=1.2.1" };}, "./node_modules/electron-devtools-installer/dist/utils.js": function (e, t, r) {"use strict"; + Object.defineProperty(t, "__esModule", { value: !0 }), t.changePermissions = t.downloadFile = t.getPath = void 0;var n = r("electron"), + o = a(r("fs")), + s = a(r("path")), + i = a(r("https"));function a(e) {return e && e.__esModule ? e : { default: e };}t.getPath = function () {var e = n.app.getPath("userData");return s.default.resolve("".concat(e, "/extensions"));};var l = n.net ? n.net.request : i.default.get;t.downloadFile = function e(t, r) {return new Promise(function (n, s) {var i = l(t);i.on("response", function (t) {if (t.statusCode >= 300 && t.statusCode < 400 && t.headers.location) return e(t.headers.location, r).then(n).catch(s);t.pipe(o.default.createWriteStream(r)).on("close", n), t.on("error", s);}), i.on("error", s), i.end();});};t.changePermissions = function e(t, r) {o.default.readdirSync(t).forEach(function (n) {var i = s.default.join(t, n);o.default.chmodSync(i, parseInt(r, 8)), o.default.statSync(i).isDirectory() && e(i, r);});};}, "./node_modules/electron-devtools-installer/node_modules/semver/classes/comparator.js": function (e, t, r) {const n = Symbol("SemVer ANY");class o { + static get ANY() {return n;}constructor(e, t) {if (t && "object" == typeof t || (t = { loose: !!t, includePrerelease: !1 }), e instanceof o) {if (e.loose === !!t.loose) return e;e = e.value;}l("comparator", e, t), this.options = t, this.loose = !!t.loose, this.parse(e), this.semver === n ? this.value = "" : this.value = this.operator + this.semver.version, l("comp", this);}parse(e) {const t = this.options.loose ? s[i.COMPARATORLOOSE] : s[i.COMPARATOR], + r = e.match(t);if (!r) throw new TypeError("Invalid comparator: " + e);this.operator = void 0 !== r[1] ? r[1] : "", "=" === this.operator && (this.operator = ""), r[2] ? this.semver = new u(r[2], this.options.loose) : this.semver = n;}toString() {return this.value;}test(e) {if (l("Comparator.test", e, this.options.loose), this.semver === n || e === n) return !0;if ("string" == typeof e) try {e = new u(e, this.options);} catch (e) {return !1;}return a(e, this.operator, this.semver, this.options);}intersects(e, t) {if (!(e instanceof o)) throw new TypeError("a Comparator is required");if (t && "object" == typeof t || (t = { loose: !!t, includePrerelease: !1 }), "" === this.operator) return "" === this.value || new c(e.value, t).test(this.value);if ("" === e.operator) return "" === e.value || new c(this.value, t).test(e.semver);const r = !(">=" !== this.operator && ">" !== this.operator || ">=" !== e.operator && ">" !== e.operator), + n = !("<=" !== this.operator && "<" !== this.operator || "<=" !== e.operator && "<" !== e.operator), + s = this.semver.version === e.semver.version, + i = !(">=" !== this.operator && "<=" !== this.operator || ">=" !== e.operator && "<=" !== e.operator), + l = a(this.semver, "<", e.semver, t) && (">=" === this.operator || ">" === this.operator) && ("<=" === e.operator || "<" === e.operator), + u = a(this.semver, ">", e.semver, t) && ("<=" === this.operator || "<" === this.operator) && (">=" === e.operator || ">" === e.operator);return r || n || s && i || l || u;} + }e.exports = o;const { + re: s, + t: i + } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js"), + a = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/cmp.js"), + l = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/debug.js"), + u = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), + c = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");}, "./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js": function (e, t, r) {class n { + constructor(e, t) {if (t && "object" == typeof t || (t = { loose: !!t, includePrerelease: !1 }), e instanceof n) return e.loose === !!t.loose && e.includePrerelease === !!t.includePrerelease ? e : new n(e.raw, t);if (e instanceof o) return this.raw = e.value, this.set = [[e]], this.format(), this;if (this.options = t, this.loose = !!t.loose, this.includePrerelease = !!t.includePrerelease, this.raw = e, this.set = e.split(/\s*\|\|\s*/).map(e => this.parseRange(e.trim())).filter(e => e.length), !this.set.length) throw new TypeError("Invalid SemVer Range: " + e);this.format();}format() {return this.range = this.set.map(e => e.join(" ").trim()).join("||").trim(), this.range;}toString() {return this.range;}parseRange(e) {const t = this.options.loose;e = e.trim();const r = t ? a[l.HYPHENRANGELOOSE] : a[l.HYPHENRANGE];e = e.replace(r, E(this.options.includePrerelease)), s("hyphen replace", e), e = e.replace(a[l.COMPARATORTRIM], u), s("comparator trim", e, a[l.COMPARATORTRIM]), e = (e = (e = e.replace(a[l.TILDETRIM], c)).replace(a[l.CARETTRIM], d)).split(/\s+/).join(" ");const n = t ? a[l.COMPARATORLOOSE] : a[l.COMPARATOR];return e.split(" ").map(e => f(e, this.options)).join(" ").split(/\s+/).map(e => j(e, this.options)).filter(this.options.loose ? e => !!e.match(n) : () => !0).map(e => new o(e, this.options));}intersects(e, t) {if (!(e instanceof n)) throw new TypeError("a Range is required");return this.set.some(r => h(r, t) && e.set.some(e => h(e, t) && r.every(r => e.every(e => r.intersects(e, t)))));}test(e) {if (!e) return !1;if ("string" == typeof e) try {e = new i(e, this.options);} catch (e) {return !1;}for (let t = 0; t < this.set.length; t++) if (k(this.set[t], e, this.options)) return !0;return !1;} + }e.exports = n;const o = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/comparator.js"), + s = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/debug.js"), + i = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), + { + re: a, + t: l, + comparatorTrimReplace: u, + tildeTrimReplace: c, + caretTrimReplace: d + } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js"), + h = (e, t) => {let r = !0;const n = e.slice();let o = n.pop();for (; r && n.length;) r = n.every(e => o.intersects(e, t)), o = n.pop();return r;}, + f = (e, t) => (s("comp", e, t), e = _(e, t), s("caret", e), e = m(e, t), s("tildes", e), e = b(e, t), s("xrange", e), e = w(e, t), s("stars", e), e), + p = e => !e || "x" === e.toLowerCase() || "*" === e, + m = (e, t) => e.trim().split(/\s+/).map(e => g(e, t)).join(" "), + g = (e, t) => {const r = t.loose ? a[l.TILDELOOSE] : a[l.TILDE];return e.replace(r, (t, r, n, o, i) => {let a;return s("tilde", e, t, r, n, o, i), p(r) ? a = "" : p(n) ? a = `>=${r}.0.0 <${+r + 1}.0.0-0` : p(o) ? a = `>=${r}.${n}.0 <${r}.${+n + 1}.0-0` : i ? (s("replaceTilde pr", i), a = `>=${r}.${n}.${o}-${i} <${r}.${+n + 1}.0-0`) : a = `>=${r}.${n}.${o} <${r}.${+n + 1}.0-0`, s("tilde return", a), a;});}, + _ = (e, t) => e.trim().split(/\s+/).map(e => v(e, t)).join(" "), + v = (e, t) => {s("caret", e, t);const r = t.loose ? a[l.CARETLOOSE] : a[l.CARET], + n = t.includePrerelease ? "-0" : "";return e.replace(r, (t, r, o, i, a) => {let l;return s("caret", e, t, r, o, i, a), p(r) ? l = "" : p(o) ? l = `>=${r}.0.0${n} <${+r + 1}.0.0-0` : p(i) ? l = "0" === r ? `>=${r}.${o}.0${n} <${r}.${+o + 1}.0-0` : `>=${r}.${o}.0${n} <${+r + 1}.0.0-0` : a ? (s("replaceCaret pr", a), l = "0" === r ? "0" === o ? `>=${r}.${o}.${i}-${a} <${r}.${o}.${+i + 1}-0` : `>=${r}.${o}.${i}-${a} <${r}.${+o + 1}.0-0` : `>=${r}.${o}.${i}-${a} <${+r + 1}.0.0-0`) : (s("no pr"), l = "0" === r ? "0" === o ? `>=${r}.${o}.${i}${n} <${r}.${o}.${+i + 1}-0` : `>=${r}.${o}.${i}${n} <${r}.${+o + 1}.0-0` : `>=${r}.${o}.${i} <${+r + 1}.0.0-0`), s("caret return", l), l;});}, + b = (e, t) => (s("replaceXRanges", e, t), e.split(/\s+/).map(e => y(e, t)).join(" ")), + y = (e, t) => {e = e.trim();const r = t.loose ? a[l.XRANGELOOSE] : a[l.XRANGE];return e.replace(r, (r, n, o, i, a, l) => {s("xRange", e, r, n, o, i, a, l);const u = p(o), + c = u || p(i), + d = c || p(a), + h = d;return "=" === n && h && (n = ""), l = t.includePrerelease ? "-0" : "", u ? r = ">" === n || "<" === n ? "<0.0.0-0" : "*" : n && h ? (c && (i = 0), a = 0, ">" === n ? (n = ">=", c ? (o = +o + 1, i = 0, a = 0) : (i = +i + 1, a = 0)) : "<=" === n && (n = "<", c ? o = +o + 1 : i = +i + 1), "<" === n && (l = "-0"), r = `${n + o}.${i}.${a}${l}`) : c ? r = `>=${o}.0.0${l} <${+o + 1}.0.0-0` : d && (r = `>=${o}.${i}.0${l} <${o}.${+i + 1}.0-0`), s("xRange return", r), r;});}, + w = (e, t) => (s("replaceStars", e, t), e.trim().replace(a[l.STAR], "")), + j = (e, t) => (s("replaceGTE0", e, t), e.trim().replace(a[t.includePrerelease ? l.GTE0PRE : l.GTE0], "")), + E = e => (t, r, n, o, s, i, a, l, u, c, d, h, f) => `${r = p(n) ? "" : p(o) ? `>=${n}.0.0${e ? "-0" : ""}` : p(s) ? `>=${n}.${o}.0${e ? "-0" : ""}` : i ? ">=" + r : `>=${r}${e ? "-0" : ""}`} ${l = p(u) ? "" : p(c) ? `<${+u + 1}.0.0-0` : p(d) ? `<${u}.${+c + 1}.0-0` : h ? `<=${u}.${c}.${d}-${h}` : e ? `<${u}.${c}.${+d + 1}-0` : "<=" + l}`.trim(), + k = (e, t, r) => {for (let r = 0; r < e.length; r++) if (!e[r].test(t)) return !1;if (t.prerelease.length && !r.includePrerelease) {for (let r = 0; r < e.length; r++) if (s(e[r].semver), e[r].semver !== o.ANY && e[r].semver.prerelease.length > 0) {const n = e[r].semver;if (n.major === t.major && n.minor === t.minor && n.patch === t.patch) return !0;}return !1;}return !0;};}, "./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/debug.js"), + { + MAX_LENGTH: o, + MAX_SAFE_INTEGER: s + } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/constants.js"), + { + re: i, + t: a + } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js"), + { + compareIdentifiers: l + } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/identifiers.js");class u { + constructor(e, t) {if (t && "object" == typeof t || (t = { loose: !!t, includePrerelease: !1 }), e instanceof u) {if (e.loose === !!t.loose && e.includePrerelease === !!t.includePrerelease) return e;e = e.version;} else if ("string" != typeof e) throw new TypeError("Invalid Version: " + e);if (e.length > o) throw new TypeError(`version is longer than ${o} characters`);n("SemVer", e, t), this.options = t, this.loose = !!t.loose, this.includePrerelease = !!t.includePrerelease;const r = e.trim().match(t.loose ? i[a.LOOSE] : i[a.FULL]);if (!r) throw new TypeError("Invalid Version: " + e);if (this.raw = e, this.major = +r[1], this.minor = +r[2], this.patch = +r[3], this.major > s || this.major < 0) throw new TypeError("Invalid major version");if (this.minor > s || this.minor < 0) throw new TypeError("Invalid minor version");if (this.patch > s || this.patch < 0) throw new TypeError("Invalid patch version");r[4] ? this.prerelease = r[4].split(".").map(e => {if (/^[0-9]+$/.test(e)) {const t = +e;if (t >= 0 && t < s) return t;}return e;}) : this.prerelease = [], this.build = r[5] ? r[5].split(".") : [], this.format();}format() {return this.version = `${this.major}.${this.minor}.${this.patch}`, this.prerelease.length && (this.version += "-" + this.prerelease.join(".")), this.version;}toString() {return this.version;}compare(e) {if (n("SemVer.compare", this.version, this.options, e), !(e instanceof u)) {if ("string" == typeof e && e === this.version) return 0;e = new u(e, this.options);}return e.version === this.version ? 0 : this.compareMain(e) || this.comparePre(e);}compareMain(e) {return e instanceof u || (e = new u(e, this.options)), l(this.major, e.major) || l(this.minor, e.minor) || l(this.patch, e.patch);}comparePre(e) {if (e instanceof u || (e = new u(e, this.options)), this.prerelease.length && !e.prerelease.length) return -1;if (!this.prerelease.length && e.prerelease.length) return 1;if (!this.prerelease.length && !e.prerelease.length) return 0;let t = 0;do {const r = this.prerelease[t], + o = e.prerelease[t];if (n("prerelease compare", t, r, o), void 0 === r && void 0 === o) return 0;if (void 0 === o) return 1;if (void 0 === r) return -1;if (r !== o) return l(r, o);} while (++t);}compareBuild(e) {e instanceof u || (e = new u(e, this.options));let t = 0;do {const r = this.build[t], + o = e.build[t];if (n("prerelease compare", t, r, o), void 0 === r && void 0 === o) return 0;if (void 0 === o) return 1;if (void 0 === r) return -1;if (r !== o) return l(r, o);} while (++t);}inc(e, t) {switch (e) {case "premajor": + this.prerelease.length = 0, this.patch = 0, this.minor = 0, this.major++, this.inc("pre", t); + break; + case "preminor": + this.prerelease.length = 0, this.patch = 0, this.minor++, this.inc("pre", t); + break; + case "prepatch": + this.prerelease.length = 0, this.inc("patch", t), this.inc("pre", t); + break; + case "prerelease": + 0 === this.prerelease.length && this.inc("patch", t), this.inc("pre", t); + break; + case "major": + 0 === this.minor && 0 === this.patch && 0 !== this.prerelease.length || this.major++, this.minor = 0, this.patch = 0, this.prerelease = []; + break; + case "minor": + 0 === this.patch && 0 !== this.prerelease.length || this.minor++, this.patch = 0, this.prerelease = []; + break; + case "patch": + 0 === this.prerelease.length && this.patch++, this.prerelease = []; + break; + case "pre": + if (0 === this.prerelease.length) this.prerelease = [0];else {let e = this.prerelease.length;for (; --e >= 0;) "number" == typeof this.prerelease[e] && (this.prerelease[e]++, e = -2);-1 === e && this.prerelease.push(0);} + t && (this.prerelease[0] === t ? isNaN(this.prerelease[1]) && (this.prerelease = [t, 0]) : this.prerelease = [t, 0]); + break; + default: + throw new Error("invalid increment argument: " + e); + }return this.format(), this.raw = this.version, this;} + }e.exports = u;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/clean.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js");e.exports = (e, t) => {const r = n(e.trim().replace(/^[=v]+/, ""), t);return r ? r.version : null;};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/cmp.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/eq.js"), + o = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/neq.js"), + s = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gt.js"), + i = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gte.js"), + a = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/lt.js"), + l = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/lte.js");e.exports = (e, t, r, u) => {switch (t) {case "===": + return "object" == typeof e && (e = e.version), "object" == typeof r && (r = r.version), e === r; + case "!==": + return "object" == typeof e && (e = e.version), "object" == typeof r && (r = r.version), e !== r; + case "":case "=":case "==": + return n(e, r, u); + case "!=": + return o(e, r, u); + case ">": + return s(e, r, u); + case ">=": + return i(e, r, u); + case "<": + return a(e, r, u); + case "<=": + return l(e, r, u); + default: + throw new TypeError("Invalid operator: " + t); + }};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/coerce.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), + o = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js"), + { + re: s, + t: i + } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js");e.exports = (e, t) => {if (e instanceof n) return e;if ("number" == typeof e && (e = String(e)), "string" != typeof e) return null;let r = null;if ((t = t || {}).rtl) {let t;for (; (t = s[i.COERCERTL].exec(e)) && (!r || r.index + r[0].length !== e.length);) r && t.index + t[0].length === r.index + r[0].length || (r = t), s[i.COERCERTL].lastIndex = t.index + t[1].length + t[2].length;s[i.COERCERTL].lastIndex = -1;} else r = e.match(s[i.COERCE]);return null === r ? null : o(`${r[2]}.${r[3] || "0"}.${r[4] || "0"}`, t);};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/compare-build.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t, r) => {const o = new n(e, r), + s = new n(t, r);return o.compare(s) || o.compareBuild(s);};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/compare-loose.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t) => n(e, t, !0);}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t, r) => new n(e, r).compare(new n(t, r));}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/diff.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js"), + o = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/eq.js");e.exports = (e, t) => {if (o(e, t)) return null;{const r = n(e), + o = n(t), + s = r.prerelease.length || o.prerelease.length, + i = s ? "pre" : "", + a = s ? "prerelease" : "";for (const e in r) if (("major" === e || "minor" === e || "patch" === e) && r[e] !== o[e]) return i + e;return a;}};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/eq.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => 0 === n(e, t, r);}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/gt.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => n(e, t, r) > 0;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/gte.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => n(e, t, r) >= 0;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/inc.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t, r, o) => {"string" == typeof r && (o = r, r = void 0);try {return new n(e, r).inc(t, o).version;} catch (e) {return null;}};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/lt.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => n(e, t, r) < 0;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/lte.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => n(e, t, r) <= 0;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/major.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t) => new n(e, t).major;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/minor.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t) => new n(e, t).minor;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/neq.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => 0 !== n(e, t, r);}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js": function (e, t, r) {const { + MAX_LENGTH: n + } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/constants.js"), + { + re: o, + t: s + } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js"), + i = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t) => {if (t && "object" == typeof t || (t = { loose: !!t, includePrerelease: !1 }), e instanceof i) return e;if ("string" != typeof e) return null;if (e.length > n) return null;if (!(t.loose ? o[s.LOOSE] : o[s.FULL]).test(e)) return null;try {return new i(e, t);} catch (e) {return null;}};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/patch.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t) => new n(e, t).patch;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/prerelease.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js");e.exports = (e, t) => {const r = n(e, t);return r && r.prerelease.length ? r.prerelease : null;};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/rcompare.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => n(t, e, r);}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/rsort.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare-build.js");e.exports = (e, t) => e.sort((e, r) => n(r, e, t));}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/satisfies.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");e.exports = (e, t, r) => {try {t = new n(t, r);} catch (e) {return !1;}return t.test(e);};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/sort.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare-build.js");e.exports = (e, t) => e.sort((e, r) => n(e, r, t));}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/valid.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js");e.exports = (e, t) => {const r = n(e, t);return r ? r.version : null;};}, "./node_modules/electron-devtools-installer/node_modules/semver/index.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js");e.exports = { re: n.re, src: n.src, tokens: n.t, SEMVER_SPEC_VERSION: r("./node_modules/electron-devtools-installer/node_modules/semver/internal/constants.js").SEMVER_SPEC_VERSION, SemVer: r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), compareIdentifiers: r("./node_modules/electron-devtools-installer/node_modules/semver/internal/identifiers.js").compareIdentifiers, rcompareIdentifiers: r("./node_modules/electron-devtools-installer/node_modules/semver/internal/identifiers.js").rcompareIdentifiers, parse: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js"), valid: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/valid.js"), clean: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/clean.js"), inc: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/inc.js"), diff: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/diff.js"), major: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/major.js"), minor: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/minor.js"), patch: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/patch.js"), prerelease: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/prerelease.js"), compare: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js"), rcompare: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/rcompare.js"), compareLoose: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare-loose.js"), compareBuild: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare-build.js"), sort: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/sort.js"), rsort: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/rsort.js"), gt: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gt.js"), lt: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/lt.js"), eq: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/eq.js"), neq: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/neq.js"), gte: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gte.js"), lte: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/lte.js"), cmp: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/cmp.js"), coerce: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/coerce.js"), Comparator: r("./node_modules/electron-devtools-installer/node_modules/semver/classes/comparator.js"), Range: r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js"), satisfies: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/satisfies.js"), toComparators: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/to-comparators.js"), maxSatisfying: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/max-satisfying.js"), minSatisfying: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/min-satisfying.js"), minVersion: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/min-version.js"), validRange: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/valid.js"), outside: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/outside.js"), gtr: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/gtr.js"), ltr: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/ltr.js"), intersects: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/intersects.js"), simplifyRange: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/simplify.js"), subset: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/subset.js") };}, "./node_modules/electron-devtools-installer/node_modules/semver/internal/constants.js": function (e, t) {const r = Number.MAX_SAFE_INTEGER || 9007199254740991;e.exports = { SEMVER_SPEC_VERSION: "2.0.0", MAX_LENGTH: 256, MAX_SAFE_INTEGER: r, MAX_SAFE_COMPONENT_LENGTH: 16 };}, "./node_modules/electron-devtools-installer/node_modules/semver/internal/debug.js": function (e, t) {const r = "object" == typeof process && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...e) => console.error("SEMVER", ...e) : () => {};e.exports = r;}, "./node_modules/electron-devtools-installer/node_modules/semver/internal/identifiers.js": function (e, t) {const r = /^[0-9]+$/, + n = (e, t) => {const n = r.test(e), + o = r.test(t);return n && o && (e = +e, t = +t), e === t ? 0 : n && !o ? -1 : o && !n ? 1 : e < t ? -1 : 1;};e.exports = { compareIdentifiers: n, rcompareIdentifiers: (e, t) => n(t, e) };}, "./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js": function (e, t, r) {const { + MAX_SAFE_COMPONENT_LENGTH: n + } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/constants.js"), + o = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/debug.js"), + s = (t = e.exports = {}).re = [], + i = t.src = [], + a = t.t = {};let l = 0;const u = (e, t, r) => {const n = l++;o(n, t), a[e] = n, i[n] = t, s[n] = new RegExp(t, r ? "g" : void 0);};u("NUMERICIDENTIFIER", "0|[1-9]\\d*"), u("NUMERICIDENTIFIERLOOSE", "[0-9]+"), u("NONNUMERICIDENTIFIER", "\\d*[a-zA-Z-][a-zA-Z0-9-]*"), u("MAINVERSION", `(${i[a.NUMERICIDENTIFIER]})\\.(${i[a.NUMERICIDENTIFIER]})\\.(${i[a.NUMERICIDENTIFIER]})`), u("MAINVERSIONLOOSE", `(${i[a.NUMERICIDENTIFIERLOOSE]})\\.(${i[a.NUMERICIDENTIFIERLOOSE]})\\.(${i[a.NUMERICIDENTIFIERLOOSE]})`), u("PRERELEASEIDENTIFIER", `(?:${i[a.NUMERICIDENTIFIER]}|${i[a.NONNUMERICIDENTIFIER]})`), u("PRERELEASEIDENTIFIERLOOSE", `(?:${i[a.NUMERICIDENTIFIERLOOSE]}|${i[a.NONNUMERICIDENTIFIER]})`), u("PRERELEASE", `(?:-(${i[a.PRERELEASEIDENTIFIER]}(?:\\.${i[a.PRERELEASEIDENTIFIER]})*))`), u("PRERELEASELOOSE", `(?:-?(${i[a.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${i[a.PRERELEASEIDENTIFIERLOOSE]})*))`), u("BUILDIDENTIFIER", "[0-9A-Za-z-]+"), u("BUILD", `(?:\\+(${i[a.BUILDIDENTIFIER]}(?:\\.${i[a.BUILDIDENTIFIER]})*))`), u("FULLPLAIN", `v?${i[a.MAINVERSION]}${i[a.PRERELEASE]}?${i[a.BUILD]}?`), u("FULL", `^${i[a.FULLPLAIN]}$`), u("LOOSEPLAIN", `[v=\\s]*${i[a.MAINVERSIONLOOSE]}${i[a.PRERELEASELOOSE]}?${i[a.BUILD]}?`), u("LOOSE", `^${i[a.LOOSEPLAIN]}$`), u("GTLT", "((?:<|>)?=?)"), u("XRANGEIDENTIFIERLOOSE", i[a.NUMERICIDENTIFIERLOOSE] + "|x|X|\\*"), u("XRANGEIDENTIFIER", i[a.NUMERICIDENTIFIER] + "|x|X|\\*"), u("XRANGEPLAIN", `[v=\\s]*(${i[a.XRANGEIDENTIFIER]})(?:\\.(${i[a.XRANGEIDENTIFIER]})(?:\\.(${i[a.XRANGEIDENTIFIER]})(?:${i[a.PRERELEASE]})?${i[a.BUILD]}?)?)?`), u("XRANGEPLAINLOOSE", `[v=\\s]*(${i[a.XRANGEIDENTIFIERLOOSE]})(?:\\.(${i[a.XRANGEIDENTIFIERLOOSE]})(?:\\.(${i[a.XRANGEIDENTIFIERLOOSE]})(?:${i[a.PRERELEASELOOSE]})?${i[a.BUILD]}?)?)?`), u("XRANGE", `^${i[a.GTLT]}\\s*${i[a.XRANGEPLAIN]}$`), u("XRANGELOOSE", `^${i[a.GTLT]}\\s*${i[a.XRANGEPLAINLOOSE]}$`), u("COERCE", `(^|[^\\d])(\\d{1,${n}})(?:\\.(\\d{1,${n}}))?(?:\\.(\\d{1,${n}}))?(?:$|[^\\d])`), u("COERCERTL", i[a.COERCE], !0), u("LONETILDE", "(?:~>?)"), u("TILDETRIM", `(\\s*)${i[a.LONETILDE]}\\s+`, !0), t.tildeTrimReplace = "$1~", u("TILDE", `^${i[a.LONETILDE]}${i[a.XRANGEPLAIN]}$`), u("TILDELOOSE", `^${i[a.LONETILDE]}${i[a.XRANGEPLAINLOOSE]}$`), u("LONECARET", "(?:\\^)"), u("CARETTRIM", `(\\s*)${i[a.LONECARET]}\\s+`, !0), t.caretTrimReplace = "$1^", u("CARET", `^${i[a.LONECARET]}${i[a.XRANGEPLAIN]}$`), u("CARETLOOSE", `^${i[a.LONECARET]}${i[a.XRANGEPLAINLOOSE]}$`), u("COMPARATORLOOSE", `^${i[a.GTLT]}\\s*(${i[a.LOOSEPLAIN]})$|^$`), u("COMPARATOR", `^${i[a.GTLT]}\\s*(${i[a.FULLPLAIN]})$|^$`), u("COMPARATORTRIM", `(\\s*)${i[a.GTLT]}\\s*(${i[a.LOOSEPLAIN]}|${i[a.XRANGEPLAIN]})`, !0), t.comparatorTrimReplace = "$1$2$3", u("HYPHENRANGE", `^\\s*(${i[a.XRANGEPLAIN]})\\s+-\\s+(${i[a.XRANGEPLAIN]})\\s*$`), u("HYPHENRANGELOOSE", `^\\s*(${i[a.XRANGEPLAINLOOSE]})\\s+-\\s+(${i[a.XRANGEPLAINLOOSE]})\\s*$`), u("STAR", "(<|>)?=?\\s*\\*"), u("GTE0", "^\\s*>=\\s*0.0.0\\s*$"), u("GTE0PRE", "^\\s*>=\\s*0.0.0-0\\s*$");}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/gtr.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/outside.js");e.exports = (e, t, r) => n(e, t, ">", r);}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/intersects.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");e.exports = (e, t, r) => (e = new n(e, r), t = new n(t, r), e.intersects(t));}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/ltr.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/outside.js");e.exports = (e, t, r) => n(e, t, "<", r);}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/max-satisfying.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), + o = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");e.exports = (e, t, r) => {let s = null, + i = null, + a = null;try {a = new o(t, r);} catch (e) {return null;}return e.forEach(e => {a.test(e) && (s && -1 !== i.compare(e) || (s = e, i = new n(s, r)));}), s;};}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/min-satisfying.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), + o = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");e.exports = (e, t, r) => {let s = null, + i = null, + a = null;try {a = new o(t, r);} catch (e) {return null;}return e.forEach(e => {a.test(e) && (s && 1 !== i.compare(e) || (s = e, i = new n(s, r)));}), s;};}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/min-version.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), + o = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js"), + s = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gt.js");e.exports = (e, t) => {e = new o(e, t);let r = new n("0.0.0");if (e.test(r)) return r;if (r = new n("0.0.0-0"), e.test(r)) return r;r = null;for (let t = 0; t < e.set.length; ++t) {e.set[t].forEach(e => {const t = new n(e.semver.version);switch (e.operator) {case ">": + 0 === t.prerelease.length ? t.patch++ : t.prerelease.push(0), t.raw = t.format(); + case "":case ">=": + r && !s(r, t) || (r = t); + break; + case "<":case "<=": + break; + default: + throw new Error("Unexpected operation: " + e.operator); + }});}return r && e.test(r) ? r : null;};}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/outside.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), + o = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/comparator.js"), + { + ANY: s + } = o, + i = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js"), + a = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/satisfies.js"), + l = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gt.js"), + u = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/lt.js"), + c = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/lte.js"), + d = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gte.js");e.exports = (e, t, r, h) => {let f, p, m, g, _;switch (e = new n(e, h), t = new i(t, h), r) {case ">": + f = l, p = c, m = u, g = ">", _ = ">="; + break; + case "<": + f = u, p = d, m = l, g = "<", _ = "<="; + break; + default: + throw new TypeError('Must provide a hilo val of "<" or ">"'); + }if (a(e, t, h)) return !1;for (let r = 0; r < t.set.length; ++r) {const n = t.set[r];let i = null, + a = null;if (n.forEach(e => {e.semver === s && (e = new o(">=0.0.0")), i = i || e, a = a || e, f(e.semver, i.semver, h) ? i = e : m(e.semver, a.semver, h) && (a = e);}), i.operator === g || i.operator === _) return !1;if ((!a.operator || a.operator === g) && p(e, a.semver)) return !1;if (a.operator === _ && m(e, a.semver)) return !1;}return !0;};}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/simplify.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/satisfies.js"), + o = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => {const s = [];let i = null, + a = null;const l = e.sort((e, t) => o(e, t, r));for (const e of l) {n(e, t, r) ? (a = e, i || (i = e)) : (a && s.push([i, a]), a = null, i = null);}i && s.push([i, null]);const u = [];for (const [e, t] of s) e === t ? u.push(e) : t || e !== l[0] ? t ? e === l[0] ? u.push("<=" + t) : u.push(`${e} - ${t}`) : u.push(">=" + e) : u.push("*");const c = u.join(" || "), + d = "string" == typeof t.raw ? t.raw : String(t);return c.length < d.length ? c : t;};}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/subset.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js"), + { + ANY: o + } = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/comparator.js"), + s = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/satisfies.js"), + i = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js"), + a = (e, t, r) => {if (1 === e.length && e[0].semver === o) return 1 === t.length && t[0].semver === o;const n = new Set();let a, c, d, h, f, p, m;for (const t of e) ">" === t.operator || ">=" === t.operator ? a = l(a, t, r) : "<" === t.operator || "<=" === t.operator ? c = u(c, t, r) : n.add(t.semver);if (n.size > 1) return null;if (a && c) {if (d = i(a.semver, c.semver, r), d > 0) return null;if (0 === d && (">=" !== a.operator || "<=" !== c.operator)) return null;}for (const e of n) {if (a && !s(e, String(a), r)) return null;if (c && !s(e, String(c), r)) return null;for (const n of t) if (!s(e, String(n), r)) return !1;return !0;}for (const e of t) {if (m = m || ">" === e.operator || ">=" === e.operator, p = p || "<" === e.operator || "<=" === e.operator, a) if (">" === e.operator || ">=" === e.operator) {if (h = l(a, e, r), h === e) return !1;} else if (">=" === a.operator && !s(a.semver, String(e), r)) return !1;if (c) if ("<" === e.operator || "<=" === e.operator) {if (f = u(c, e, r), f === e) return !1;} else if ("<=" === c.operator && !s(c.semver, String(e), r)) return !1;if (!e.operator && (c || a) && 0 !== d) return !1;}return !(a && p && !c && 0 !== d) && !(c && m && !a && 0 !== d);}, + l = (e, t, r) => {if (!e) return t;const n = i(e.semver, t.semver, r);return n > 0 ? e : n < 0 || ">" === t.operator && ">=" === e.operator ? t : e;}, + u = (e, t, r) => {if (!e) return t;const n = i(e.semver, t.semver, r);return n < 0 ? e : n > 0 || "<" === t.operator && "<=" === e.operator ? t : e;};e.exports = (e, t, r) => {e = new n(e, r), t = new n(t, r);let o = !1;e: for (const n of e.set) {for (const e of t.set) {const t = a(n, e, r);if (o = o || null !== t, t) continue e;}if (o) return !1;}return !0;};}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/to-comparators.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");e.exports = (e, t) => new n(e, t).set.map(e => e.map(e => e.value).join(" ").trim().split(" "));}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/valid.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");e.exports = (e, t) => {try {return new n(e, t).range || "*";} catch (e) {return null;}};}, "./node_modules/electron-is-accelerator/index.js": function (e, t, r) {"use strict"; + const n = /^(Command|Cmd|Control|Ctrl|CommandOrControl|CmdOrCtrl|Alt|Option|AltGr|Shift|Super)$/, + o = /^([0-9A-Z)!@#$%^&*(:+<_>?~{|}";=,\-./`[\\\]']|F1*[1-9]|F10|F2[0-4]|Plus|Space|Tab|Backspace|Delete|Insert|Return|Enter|Up|Down|Left|Right|Home|End|PageUp|PageDown|Escape|Esc|VolumeUp|VolumeDown|VolumeMute|MediaNextTrack|MediaPreviousTrack|MediaStop|MediaPlayPause|PrintScreen)$/;e.exports = function (e) {let t = e.split("+"), + r = !1;return t.every((e, s) => {const i = o.test(e), + a = n.test(e);if (i) {if (r) return !1;r = !0;}return !(s === t.length - 1 && !r) && (i || a);});};}, "./node_modules/electron-is-dev/index.js": function (e, t, r) {"use strict"; + const n = r("electron");if ("string" == typeof n) throw new TypeError("Not running in an Electron environment!");const o = n.app || n.remote.app, + s = "ELECTRON_IS_DEV" in process.env, + i = 1 === parseInt(process.env.ELECTRON_IS_DEV, 10);e.exports = s ? i : !o.isPackaged;}, "./node_modules/electron-localshortcut/index.js": function (e, t, r) {"use strict"; + const { + app: n, + BrowserWindow: o + } = r("electron"), + s = r("./node_modules/electron-is-accelerator/index.js"), + i = r("./node_modules/keyboardevents-areequal/index.js"), + { + toKeyEvent: a + } = r("./node_modules/keyboardevent-from-electron-accelerator/index.js"), + l = r("./node_modules/debug/src/index.js")("electron-localshortcut"), + u = {}, + c = new WeakMap(), + d = e => {if (e) try {return e.getTitle();} catch (e) {return "A destroyed window";}return "An falsy value";};function h(e) {if (!s(e)) {const t = {};Error.captureStackTrace(t);const r = `\nWARNING: ${e} is not a valid accelerator.\n\n${t.stack ? t.stack.split("\n").slice(4).join("\n") : t.message}\n`;console.error(r);}}function f(e, t) {let r = 0;for (const n of t) {if (i(n.eventStamp, e)) return r;r++;}return -1;}const p = e => (t, r) => {if ("keyUp" === r.type) return;const n = function (e) {const t = { code: e.code, key: e.key };return ["alt", "shift", "meta"].forEach(r => {void 0 !== e[r] && (t[r + "Key"] = e[r]);}), void 0 !== e.control && (t.ctrlKey = e.control), t;}(r);l(`before-input-event: ${r} is translated to: ${n}`);for (const { + eventStamp: t, + callback: r + } of e) {if (i(t, n)) return l(`eventStamp: ${t} match`), void r();l(`eventStamp: ${t} no match`);}};e.exports = { register: function e(t, r, s) {let i, f;if (void 0 === s ? (i = u, s = r, r = t) : i = t.webContents, !0 === Array.isArray(r)) return void r.forEach(r => {"string" == typeof r && e(t, r, s);});if (l(`Registering callback for ${r} on window ${d(t)}`), h(r), l(r + " seems a valid shortcut sequence."), c.has(i)) l("Window has others shortcuts registered."), f = c.get(i);else if (l("This is the first shortcut of the window."), f = [], c.set(i, f), i === u) {const e = p(f), + t = (t, r) => {const n = r.webContents;n.on("before-input-event", e), n.once("closed", () => n.removeListener("before-input-event", e));};o.getAllWindows().forEach(e => t(null, e)), n.on("browser-window-created", t), f.removeListener = () => {o.getAllWindows().forEach(t => t.webContents.removeListener("before-input-event", e)), n.removeListener("browser-window-created", t);};} else {const e = p(f);i.on("before-input-event", e), f.removeListener = () => i.removeListener("before-input-event", e), i.once("closed", f.removeListener);}l("Adding shortcut to window set.");const m = a(r);f.push({ eventStamp: m, callback: s, enabled: !0 }), l("Shortcut registered.");}, unregister: function e(t, r) {let n;if (void 0 === r) n = u, r = t;else {if (t.isDestroyed()) return void l("Early return because window is destroyed.");n = t.webContents;}if (!0 === Array.isArray(r)) return void r.forEach(r => {"string" == typeof r && e(t, r);});if (l(`Unregistering callback for ${r} on window ${d(t)}`), h(r), l(r + " seems a valid shortcut sequence."), !c.has(n)) return void l("Early return because window has never had shortcuts registered.");const o = c.get(n), + s = f(a(r), o);-1 !== s && (o.splice(s, 1), 0 === o.length && (o.removeListener(), c.delete(n)));}, isRegistered: function (e, t) {h(t);const r = e.webContents, + n = c.get(r);return -1 !== f(a(t), n);}, unregisterAll: function (e) {l("Unregistering all shortcuts on window " + d(e));const t = e.webContents, + r = c.get(t);r && r.removeListener && (r.removeListener(), c.delete(t));}, enableAll: function (e) {l("Enabling all shortcuts on window " + d(e));const t = e.webContents, + r = c.get(t);for (const e of r) e.enabled = !0;}, disableAll: function (e) {l("Disabling all shortcuts on window " + d(e));const t = e.webContents, + r = c.get(t);for (const e of r) e.enabled = !1;} };}, "./node_modules/fs.realpath/index.js": function (e, t, r) {e.exports = c, c.realpath = c, c.sync = d, c.realpathSync = d, c.monkeypatch = function () {n.realpath = c, n.realpathSync = d;}, c.unmonkeypatch = function () {n.realpath = o, n.realpathSync = s;};var n = r("fs"), + o = n.realpath, + s = n.realpathSync, + i = process.version, + a = /^v[0-5]\./.test(i), + l = r("./node_modules/fs.realpath/old.js");function u(e) {return e && "realpath" === e.syscall && ("ELOOP" === e.code || "ENOMEM" === e.code || "ENAMETOOLONG" === e.code);}function c(e, t, r) {if (a) return o(e, t, r);"function" == typeof t && (r = t, t = null), o(e, t, function (n, o) {u(n) ? l.realpath(e, t, r) : r(n, o);});}function d(e, t) {if (a) return s(e, t);try {return s(e, t);} catch (r) {if (u(r)) return l.realpathSync(e, t);throw r;}}}, "./node_modules/fs.realpath/old.js": function (e, t, r) {var n = r("path"), + o = "win32" === process.platform, + s = r("fs"), + i = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);function a(e) {return "function" == typeof e ? e : function () {var e;if (i) {var t = new Error();e = function (e) {e && (t.message = e.message, r(e = t));};} else e = r;return e;function r(e) {if (e) {if (process.throwDeprecation) throw e;if (!process.noDeprecation) {var t = "fs: missing callback " + (e.stack || e.message);process.traceDeprecation ? console.trace(t) : console.error(t);}}}}();}n.normalize;if (o) var l = /(.*?)(?:[\/\\]+|$)/g;else l = /(.*?)(?:[\/]+|$)/g;if (o) var u = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/;else u = /^[\/]*/;t.realpathSync = function (e, t) {if (e = n.resolve(e), t && Object.prototype.hasOwnProperty.call(t, e)) return t[e];var r, + i, + a, + c, + d = e, + h = {}, + f = {};function p() {var t = u.exec(e);r = t[0].length, i = t[0], a = t[0], c = "", o && !f[a] && (s.lstatSync(a), f[a] = !0);}for (p(); r < e.length;) {l.lastIndex = r;var m = l.exec(e);if (c = i, i += m[0], a = c + m[1], r = l.lastIndex, !(f[a] || t && t[a] === a)) {var g;if (t && Object.prototype.hasOwnProperty.call(t, a)) g = t[a];else {var _ = s.lstatSync(a);if (!_.isSymbolicLink()) {f[a] = !0, t && (t[a] = a);continue;}var v = null;if (!o) {var b = _.dev.toString(32) + ":" + _.ino.toString(32);h.hasOwnProperty(b) && (v = h[b]);}null === v && (s.statSync(a), v = s.readlinkSync(a)), g = n.resolve(c, v), t && (t[a] = g), o || (h[b] = v);}e = n.resolve(g, e.slice(r)), p();}}return t && (t[d] = e), e;}, t.realpath = function (e, t, r) {if ("function" != typeof r && (r = a(t), t = null), e = n.resolve(e), t && Object.prototype.hasOwnProperty.call(t, e)) return process.nextTick(r.bind(null, null, t[e]));var i, + c, + d, + h, + f = e, + p = {}, + m = {};function g() {var t = u.exec(e);i = t[0].length, c = t[0], d = t[0], h = "", o && !m[d] ? s.lstat(d, function (e) {if (e) return r(e);m[d] = !0, _();}) : process.nextTick(_);}function _() {if (i >= e.length) return t && (t[f] = e), r(null, e);l.lastIndex = i;var n = l.exec(e);return h = c, c += n[0], d = h + n[1], i = l.lastIndex, m[d] || t && t[d] === d ? process.nextTick(_) : t && Object.prototype.hasOwnProperty.call(t, d) ? y(t[d]) : s.lstat(d, v);}function v(e, n) {if (e) return r(e);if (!n.isSymbolicLink()) return m[d] = !0, t && (t[d] = d), process.nextTick(_);if (!o) {var i = n.dev.toString(32) + ":" + n.ino.toString(32);if (p.hasOwnProperty(i)) return b(null, p[i], d);}s.stat(d, function (e) {if (e) return r(e);s.readlink(d, function (e, t) {o || (p[i] = t), b(e, t);});});}function b(e, o, s) {if (e) return r(e);var i = n.resolve(h, o);t && (t[s] = i), y(i);}function y(t) {e = n.resolve(t, e.slice(i)), g();}g();};}, "./node_modules/glob/common.js": function (e, t, r) {function n(e, t) {return Object.prototype.hasOwnProperty.call(e, t);}t.alphasort = u, t.alphasorti = l, t.setopts = function (e, t, r) {r || (r = {});if (r.matchBase && -1 === t.indexOf("/")) {if (r.noglobstar) throw new Error("base matching requires globstar");t = "**/" + t;}e.silent = !!r.silent, e.pattern = t, e.strict = !1 !== r.strict, e.realpath = !!r.realpath, e.realpathCache = r.realpathCache || Object.create(null), e.follow = !!r.follow, e.dot = !!r.dot, e.mark = !!r.mark, e.nodir = !!r.nodir, e.nodir && (e.mark = !0);e.sync = !!r.sync, e.nounique = !!r.nounique, e.nonull = !!r.nonull, e.nosort = !!r.nosort, e.nocase = !!r.nocase, e.stat = !!r.stat, e.noprocess = !!r.noprocess, e.absolute = !!r.absolute, e.maxLength = r.maxLength || 1 / 0, e.cache = r.cache || Object.create(null), e.statCache = r.statCache || Object.create(null), e.symlinks = r.symlinks || Object.create(null), function (e, t) {e.ignore = t.ignore || [], Array.isArray(e.ignore) || (e.ignore = [e.ignore]);e.ignore.length && (e.ignore = e.ignore.map(c));}(e, r), e.changedCwd = !1;var s = process.cwd();n(r, "cwd") ? (e.cwd = o.resolve(r.cwd), e.changedCwd = e.cwd !== s) : e.cwd = s;e.root = r.root || o.resolve(e.cwd, "/"), e.root = o.resolve(e.root), "win32" === process.platform && (e.root = e.root.replace(/\\/g, "/"));e.cwdAbs = i(e.cwd) ? e.cwd : d(e, e.cwd), "win32" === process.platform && (e.cwdAbs = e.cwdAbs.replace(/\\/g, "/"));e.nomount = !!r.nomount, r.nonegate = !0, r.nocomment = !0, e.minimatch = new a(t, r), e.options = e.minimatch.options;}, t.ownProp = n, t.makeAbs = d, t.finish = function (e) {for (var t = e.nounique, r = t ? [] : Object.create(null), n = 0, o = e.matches.length; n < o; n++) {var s = e.matches[n];if (s && 0 !== Object.keys(s).length) {var i = Object.keys(s);t ? r.push.apply(r, i) : i.forEach(function (e) {r[e] = !0;});} else if (e.nonull) {var a = e.minimatch.globSet[n];t ? r.push(a) : r[a] = !0;}}t || (r = Object.keys(r));e.nosort || (r = r.sort(e.nocase ? l : u));if (e.mark) {for (n = 0; n < r.length; n++) r[n] = e._mark(r[n]);e.nodir && (r = r.filter(function (t) {var r = !/\/$/.test(t), + n = e.cache[t] || e.cache[d(e, t)];return r && n && (r = "DIR" !== n && !Array.isArray(n)), r;}));}e.ignore.length && (r = r.filter(function (t) {return !h(e, t);}));e.found = r;}, t.mark = function (e, t) {var r = d(e, t), + n = e.cache[r], + o = t;if (n) {var s = "DIR" === n || Array.isArray(n), + i = "/" === t.slice(-1);if (s && !i ? o += "/" : !s && i && (o = o.slice(0, -1)), o !== t) {var a = d(e, o);e.statCache[a] = e.statCache[r], e.cache[a] = e.cache[r];}}return o;}, t.isIgnored = h, t.childrenIgnored = function (e, t) {return !!e.ignore.length && e.ignore.some(function (e) {return !(!e.gmatcher || !e.gmatcher.match(t));});};var o = r("path"), + s = r("./node_modules/minimatch/minimatch.js"), + i = r("./node_modules/path-is-absolute/index.js"), + a = s.Minimatch;function l(e, t) {return e.toLowerCase().localeCompare(t.toLowerCase());}function u(e, t) {return e.localeCompare(t);}function c(e) {var t = null;if ("/**" === e.slice(-3)) {var r = e.replace(/(\/\*\*)+$/, "");t = new a(r, { dot: !0 });}return { matcher: new a(e, { dot: !0 }), gmatcher: t };}function d(e, t) {var r = t;return r = "/" === t.charAt(0) ? o.join(e.root, t) : i(t) || "" === t ? t : e.changedCwd ? o.resolve(e.cwd, t) : o.resolve(t), "win32" === process.platform && (r = r.replace(/\\/g, "/")), r;}function h(e, t) {return !!e.ignore.length && e.ignore.some(function (e) {return e.matcher.match(t) || !(!e.gmatcher || !e.gmatcher.match(t));});}}, "./node_modules/glob/glob.js": function (e, t, r) {e.exports = b;var n = r("fs"), + o = r("./node_modules/fs.realpath/index.js"), + s = r("./node_modules/minimatch/minimatch.js"), + i = (s.Minimatch, r("./node_modules/inherits/inherits.js")), + a = r("events").EventEmitter, + l = r("path"), + u = r("assert"), + c = r("./node_modules/path-is-absolute/index.js"), + d = r("./node_modules/glob/sync.js"), + h = r("./node_modules/glob/common.js"), + f = (h.alphasort, h.alphasorti, h.setopts), + p = h.ownProp, + m = r("./node_modules/inflight/inflight.js"), + g = (r("util"), h.childrenIgnored), + _ = h.isIgnored, + v = r("./node_modules/once/once.js");function b(e, t, r) {if ("function" == typeof t && (r = t, t = {}), t || (t = {}), t.sync) {if (r) throw new TypeError("callback provided to sync glob");return d(e, t);}return new w(e, t, r);}b.sync = d;var y = b.GlobSync = d.GlobSync;function w(e, t, r) {if ("function" == typeof t && (r = t, t = null), t && t.sync) {if (r) throw new TypeError("callback provided to sync glob");return new y(e, t);}if (!(this instanceof w)) return new w(e, t, r);f(this, e, t), this._didRealPath = !1;var n = this.minimatch.set.length;this.matches = new Array(n), "function" == typeof r && (r = v(r), this.on("error", r), this.on("end", function (e) {r(null, e);}));var o = this;if (this._processing = 0, this._emitQueue = [], this._processQueue = [], this.paused = !1, this.noprocess) return this;if (0 === n) return i();for (var s = 0; s < n; s++) this._process(this.minimatch.set[s], s, !1, i);function i() {--o._processing, o._processing <= 0 && o._finish();}}b.glob = b, b.hasMagic = function (e, t) {var r = function (e, t) {if (null === t || "object" != typeof t) return e;for (var r = Object.keys(t), n = r.length; n--;) e[r[n]] = t[r[n]];return e;}({}, t);r.noprocess = !0;var n = new w(e, r).minimatch.set;if (!e) return !1;if (n.length > 1) return !0;for (var o = 0; o < n[0].length; o++) if ("string" != typeof n[0][o]) return !0;return !1;}, b.Glob = w, i(w, a), w.prototype._finish = function () {if (u(this instanceof w), !this.aborted) {if (this.realpath && !this._didRealpath) return this._realpath();h.finish(this), this.emit("end", this.found);}}, w.prototype._realpath = function () {if (!this._didRealpath) {this._didRealpath = !0;var e = this.matches.length;if (0 === e) return this._finish();for (var t = this, r = 0; r < this.matches.length; r++) this._realpathSet(r, n);}function n() {0 == --e && t._finish();}}, w.prototype._realpathSet = function (e, t) {var r = this.matches[e];if (!r) return t();var n = Object.keys(r), + s = this, + i = n.length;if (0 === i) return t();var a = this.matches[e] = Object.create(null);n.forEach(function (r, n) {r = s._makeAbs(r), o.realpath(r, s.realpathCache, function (n, o) {n ? "stat" === n.syscall ? a[r] = !0 : s.emit("error", n) : a[o] = !0, 0 == --i && (s.matches[e] = a, t());});});}, w.prototype._mark = function (e) {return h.mark(this, e);}, w.prototype._makeAbs = function (e) {return h.makeAbs(this, e);}, w.prototype.abort = function () {this.aborted = !0, this.emit("abort");}, w.prototype.pause = function () {this.paused || (this.paused = !0, this.emit("pause"));}, w.prototype.resume = function () {if (this.paused) {if (this.emit("resume"), this.paused = !1, this._emitQueue.length) {var e = this._emitQueue.slice(0);this._emitQueue.length = 0;for (var t = 0; t < e.length; t++) {var r = e[t];this._emitMatch(r[0], r[1]);}}if (this._processQueue.length) {var n = this._processQueue.slice(0);this._processQueue.length = 0;for (t = 0; t < n.length; t++) {var o = n[t];this._processing--, this._process(o[0], o[1], o[2], o[3]);}}}}, w.prototype._process = function (e, t, r, n) {if (u(this instanceof w), u("function" == typeof n), !this.aborted) if (this._processing++, this.paused) this._processQueue.push([e, t, r, n]);else {for (var o, i = 0; "string" == typeof e[i];) i++;switch (i) {case e.length: + return void this._processSimple(e.join("/"), t, n); + case 0: + o = null; + break; + default: + o = e.slice(0, i).join("/"); + }var a, + l = e.slice(i);null === o ? a = "." : c(o) || c(e.join("/")) ? (o && c(o) || (o = "/" + o), a = o) : a = o;var d = this._makeAbs(a);if (g(this, a)) return n();l[0] === s.GLOBSTAR ? this._processGlobStar(o, a, d, l, t, r, n) : this._processReaddir(o, a, d, l, t, r, n);}}, w.prototype._processReaddir = function (e, t, r, n, o, s, i) {var a = this;this._readdir(r, s, function (l, u) {return a._processReaddir2(e, t, r, n, o, s, u, i);});}, w.prototype._processReaddir2 = function (e, t, r, n, o, s, i, a) {if (!i) return a();for (var u = n[0], c = !!this.minimatch.negate, d = u._glob, h = this.dot || "." === d.charAt(0), f = [], p = 0; p < i.length; p++) {if ("." !== (g = i[p]).charAt(0) || h) (c && !e ? !g.match(u) : g.match(u)) && f.push(g);}var m = f.length;if (0 === m) return a();if (1 === n.length && !this.mark && !this.stat) {this.matches[o] || (this.matches[o] = Object.create(null));for (p = 0; p < m; p++) {var g = f[p];e && (g = "/" !== e ? e + "/" + g : e + g), "/" !== g.charAt(0) || this.nomount || (g = l.join(this.root, g)), this._emitMatch(o, g);}return a();}n.shift();for (p = 0; p < m; p++) {g = f[p];e && (g = "/" !== e ? e + "/" + g : e + g), this._process([g].concat(n), o, s, a);}a();}, w.prototype._emitMatch = function (e, t) {if (!this.aborted && !_(this, t)) if (this.paused) this._emitQueue.push([e, t]);else {var r = c(t) ? t : this._makeAbs(t);if (this.mark && (t = this._mark(t)), this.absolute && (t = r), !this.matches[e][t]) {if (this.nodir) {var n = this.cache[r];if ("DIR" === n || Array.isArray(n)) return;}this.matches[e][t] = !0;var o = this.statCache[r];o && this.emit("stat", t, o), this.emit("match", t);}}}, w.prototype._readdirInGlobStar = function (e, t) {if (!this.aborted) {if (this.follow) return this._readdir(e, !1, t);var r = this, + o = m("lstat\0" + e, function (n, o) {if (n && "ENOENT" === n.code) return t();var s = o && o.isSymbolicLink();r.symlinks[e] = s, s || !o || o.isDirectory() ? r._readdir(e, !1, t) : (r.cache[e] = "FILE", t());});o && n.lstat(e, o);}}, w.prototype._readdir = function (e, t, r) {if (!this.aborted && (r = m("readdir\0" + e + "\0" + t, r))) {if (t && !p(this.symlinks, e)) return this._readdirInGlobStar(e, r);if (p(this.cache, e)) {var o = this.cache[e];if (!o || "FILE" === o) return r();if (Array.isArray(o)) return r(null, o);}n.readdir(e, function (e, t, r) {return function (n, o) {n ? e._readdirError(t, n, r) : e._readdirEntries(t, o, r);};}(this, e, r));}}, w.prototype._readdirEntries = function (e, t, r) {if (!this.aborted) {if (!this.mark && !this.stat) for (var n = 0; n < t.length; n++) {var o = t[n];o = "/" === e ? e + o : e + "/" + o, this.cache[o] = !0;}return this.cache[e] = t, r(null, t);}}, w.prototype._readdirError = function (e, t, r) {if (!this.aborted) {switch (t.code) {case "ENOTSUP":case "ENOTDIR": + var n = this._makeAbs(e); + + if (this.cache[n] = "FILE", n === this.cwdAbs) {var o = new Error(t.code + " invalid cwd " + this.cwd);o.path = this.cwd, o.code = t.code, this.emit("error", o), this.abort();} + + break; + case "ENOENT":case "ELOOP":case "ENAMETOOLONG":case "UNKNOWN": + this.cache[this._makeAbs(e)] = !1; + break; + default: + this.cache[this._makeAbs(e)] = !1, this.strict && (this.emit("error", t), this.abort()), this.silent || console.error("glob error", t); + }return r();}}, w.prototype._processGlobStar = function (e, t, r, n, o, s, i) {var a = this;this._readdir(r, s, function (l, u) {a._processGlobStar2(e, t, r, n, o, s, u, i);});}, w.prototype._processGlobStar2 = function (e, t, r, n, o, s, i, a) {if (!i) return a();var l = n.slice(1), + u = e ? [e] : [], + c = u.concat(l);this._process(c, o, !1, a);var d = this.symlinks[r], + h = i.length;if (d && s) return a();for (var f = 0; f < h; f++) {if ("." !== i[f].charAt(0) || this.dot) {var p = u.concat(i[f], l);this._process(p, o, !0, a);var m = u.concat(i[f], n);this._process(m, o, !0, a);}}a();}, w.prototype._processSimple = function (e, t, r) {var n = this;this._stat(e, function (o, s) {n._processSimple2(e, t, o, s, r);});}, w.prototype._processSimple2 = function (e, t, r, n, o) {if (this.matches[t] || (this.matches[t] = Object.create(null)), !n) return o();if (e && c(e) && !this.nomount) {var s = /[\/\\]$/.test(e);"/" === e.charAt(0) ? e = l.join(this.root, e) : (e = l.resolve(this.root, e), s && (e += "/"));}"win32" === process.platform && (e = e.replace(/\\/g, "/")), this._emitMatch(t, e), o();}, w.prototype._stat = function (e, t) {var r = this._makeAbs(e), + o = "/" === e.slice(-1);if (e.length > this.maxLength) return t();if (!this.stat && p(this.cache, r)) {var s = this.cache[r];if (Array.isArray(s) && (s = "DIR"), !o || "DIR" === s) return t(null, s);if (o && "FILE" === s) return t();}var i = this.statCache[r];if (void 0 !== i) {if (!1 === i) return t(null, i);var a = i.isDirectory() ? "DIR" : "FILE";return o && "FILE" === a ? t() : t(null, a, i);}var l = this, + u = m("stat\0" + r, function (o, s) {if (s && s.isSymbolicLink()) return n.stat(r, function (n, o) {n ? l._stat2(e, r, null, s, t) : l._stat2(e, r, n, o, t);});l._stat2(e, r, o, s, t);});u && n.lstat(r, u);}, w.prototype._stat2 = function (e, t, r, n, o) {if (r && ("ENOENT" === r.code || "ENOTDIR" === r.code)) return this.statCache[t] = !1, o();var s = "/" === e.slice(-1);if (this.statCache[t] = n, "/" === t.slice(-1) && n && !n.isDirectory()) return o(null, !1, n);var i = !0;return n && (i = n.isDirectory() ? "DIR" : "FILE"), this.cache[t] = this.cache[t] || i, s && "FILE" === i ? o() : o(null, i, n);};}, "./node_modules/glob/sync.js": function (e, t, r) {e.exports = p, p.GlobSync = m;var n = r("fs"), + o = r("./node_modules/fs.realpath/index.js"), + s = r("./node_modules/minimatch/minimatch.js"), + i = (s.Minimatch, r("./node_modules/glob/glob.js").Glob, r("util"), r("path")), + a = r("assert"), + l = r("./node_modules/path-is-absolute/index.js"), + u = r("./node_modules/glob/common.js"), + c = (u.alphasort, u.alphasorti, u.setopts), + d = u.ownProp, + h = u.childrenIgnored, + f = u.isIgnored;function p(e, t) {if ("function" == typeof t || 3 === arguments.length) throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");return new m(e, t).found;}function m(e, t) {if (!e) throw new Error("must provide pattern");if ("function" == typeof t || 3 === arguments.length) throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");if (!(this instanceof m)) return new m(e, t);if (c(this, e, t), this.noprocess) return this;var r = this.minimatch.set.length;this.matches = new Array(r);for (var n = 0; n < r; n++) this._process(this.minimatch.set[n], n, !1);this._finish();}m.prototype._finish = function () {if (a(this instanceof m), this.realpath) {var e = this;this.matches.forEach(function (t, r) {var n = e.matches[r] = Object.create(null);for (var s in t) try {s = e._makeAbs(s), n[o.realpathSync(s, e.realpathCache)] = !0;} catch (t) {if ("stat" !== t.syscall) throw t;n[e._makeAbs(s)] = !0;}});}u.finish(this);}, m.prototype._process = function (e, t, r) {a(this instanceof m);for (var n, o = 0; "string" == typeof e[o];) o++;switch (o) {case e.length: + return void this._processSimple(e.join("/"), t); + case 0: + n = null; + break; + default: + n = e.slice(0, o).join("/"); + }var i, + u = e.slice(o);null === n ? i = "." : l(n) || l(e.join("/")) ? (n && l(n) || (n = "/" + n), i = n) : i = n;var c = this._makeAbs(i);h(this, i) || (u[0] === s.GLOBSTAR ? this._processGlobStar(n, i, c, u, t, r) : this._processReaddir(n, i, c, u, t, r));}, m.prototype._processReaddir = function (e, t, r, n, o, s) {var a = this._readdir(r, s);if (a) {for (var l = n[0], u = !!this.minimatch.negate, c = l._glob, d = this.dot || "." === c.charAt(0), h = [], f = 0; f < a.length; f++) {if ("." !== (g = a[f]).charAt(0) || d) (u && !e ? !g.match(l) : g.match(l)) && h.push(g);}var p = h.length;if (0 !== p) if (1 !== n.length || this.mark || this.stat) {n.shift();for (f = 0; f < p; f++) {var m;g = h[f];m = e ? [e, g] : [g], this._process(m.concat(n), o, s);}} else {this.matches[o] || (this.matches[o] = Object.create(null));for (var f = 0; f < p; f++) {var g = h[f];e && (g = "/" !== e.slice(-1) ? e + "/" + g : e + g), "/" !== g.charAt(0) || this.nomount || (g = i.join(this.root, g)), this._emitMatch(o, g);}}}}, m.prototype._emitMatch = function (e, t) {if (!f(this, t)) {var r = this._makeAbs(t);if (this.mark && (t = this._mark(t)), this.absolute && (t = r), !this.matches[e][t]) {if (this.nodir) {var n = this.cache[r];if ("DIR" === n || Array.isArray(n)) return;}this.matches[e][t] = !0, this.stat && this._stat(t);}}}, m.prototype._readdirInGlobStar = function (e) {if (this.follow) return this._readdir(e, !1);var t, r;try {r = n.lstatSync(e);} catch (e) {if ("ENOENT" === e.code) return null;}var o = r && r.isSymbolicLink();return this.symlinks[e] = o, o || !r || r.isDirectory() ? t = this._readdir(e, !1) : this.cache[e] = "FILE", t;}, m.prototype._readdir = function (e, t) {if (t && !d(this.symlinks, e)) return this._readdirInGlobStar(e);if (d(this.cache, e)) {var r = this.cache[e];if (!r || "FILE" === r) return null;if (Array.isArray(r)) return r;}try {return this._readdirEntries(e, n.readdirSync(e));} catch (t) {return this._readdirError(e, t), null;}}, m.prototype._readdirEntries = function (e, t) {if (!this.mark && !this.stat) for (var r = 0; r < t.length; r++) {var n = t[r];n = "/" === e ? e + n : e + "/" + n, this.cache[n] = !0;}return this.cache[e] = t, t;}, m.prototype._readdirError = function (e, t) {switch (t.code) {case "ENOTSUP":case "ENOTDIR": + var r = this._makeAbs(e); + + if (this.cache[r] = "FILE", r === this.cwdAbs) {var n = new Error(t.code + " invalid cwd " + this.cwd);throw n.path = this.cwd, n.code = t.code, n;} + + break; + case "ENOENT":case "ELOOP":case "ENAMETOOLONG":case "UNKNOWN": + this.cache[this._makeAbs(e)] = !1; + break; + default: + if (this.cache[this._makeAbs(e)] = !1, this.strict) throw t; + this.silent || console.error("glob error", t); + }}, m.prototype._processGlobStar = function (e, t, r, n, o, s) {var i = this._readdir(r, s);if (i) {var a = n.slice(1), + l = e ? [e] : [], + u = l.concat(a);this._process(u, o, !1);var c = i.length;if (!this.symlinks[r] || !s) for (var d = 0; d < c; d++) {if ("." !== i[d].charAt(0) || this.dot) {var h = l.concat(i[d], a);this._process(h, o, !0);var f = l.concat(i[d], n);this._process(f, o, !0);}}}}, m.prototype._processSimple = function (e, t) {var r = this._stat(e);if (this.matches[t] || (this.matches[t] = Object.create(null)), r) {if (e && l(e) && !this.nomount) {var n = /[\/\\]$/.test(e);"/" === e.charAt(0) ? e = i.join(this.root, e) : (e = i.resolve(this.root, e), n && (e += "/"));}"win32" === process.platform && (e = e.replace(/\\/g, "/")), this._emitMatch(t, e);}}, m.prototype._stat = function (e) {var t = this._makeAbs(e), + r = "/" === e.slice(-1);if (e.length > this.maxLength) return !1;if (!this.stat && d(this.cache, t)) {var o = this.cache[t];if (Array.isArray(o) && (o = "DIR"), !r || "DIR" === o) return o;if (r && "FILE" === o) return !1;}var s = this.statCache[t];if (!s) {var i;try {i = n.lstatSync(t);} catch (e) {if (e && ("ENOENT" === e.code || "ENOTDIR" === e.code)) return this.statCache[t] = !1, !1;}if (i && i.isSymbolicLink()) try {s = n.statSync(t);} catch (e) {s = i;} else s = i;}this.statCache[t] = s;o = !0;return s && (o = s.isDirectory() ? "DIR" : "FILE"), this.cache[t] = this.cache[t] || o, (!r || "FILE" !== o) && o;}, m.prototype._mark = function (e) {return u.mark(this, e);}, m.prototype._makeAbs = function (e) {return u.makeAbs(this, e);};}, "./node_modules/has-flag/index.js": function (e, t, r) {"use strict"; + e.exports = (e, t = process.argv) => {const r = e.startsWith("-") ? "" : 1 === e.length ? "-" : "--", + n = t.indexOf(r + e), + o = t.indexOf("--");return -1 !== n && (-1 === o || n < o);};}, "./node_modules/immediate/lib/index.js": function (e, t, r) {"use strict"; + var n, + o, + s = global.MutationObserver || global.WebKitMutationObserver;if (process.browser) { + if (s) {var i = 0, + a = new s(d), + l = global.document.createTextNode("");a.observe(l, { characterData: !0 }), n = function () {l.data = i = ++i % 2;};} else if (global.setImmediate || void 0 === global.MessageChannel) n = "document" in global && "onreadystatechange" in global.document.createElement("script") ? function () {var e = global.document.createElement("script");e.onreadystatechange = function () {d(), e.onreadystatechange = null, e.parentNode.removeChild(e), e = null;}, global.document.documentElement.appendChild(e);} : function () {setTimeout(d, 0);};else {var u = new global.MessageChannel();u.port1.onmessage = d, n = function () {u.port2.postMessage(0);};} + } else n = function () {process.nextTick(d);};var c = [];function d() {var e, t;o = !0;for (var r = c.length; r;) {for (t = c, c = [], e = -1; ++e < r;) t[e]();r = c.length;}o = !1;}e.exports = function (e) {1 !== c.push(e) || o || n();};}, "./node_modules/inflight/inflight.js": function (e, t, r) {var n = r("./node_modules/wrappy/wrappy.js"), + o = Object.create(null), + s = r("./node_modules/once/once.js");function i(e) {for (var t = e.length, r = [], n = 0; n < t; n++) r[n] = e[n];return r;}e.exports = n(function (e, t) {return o[e] ? (o[e].push(t), null) : (o[e] = [t], function (e) {return s(function t() {var r = o[e], + n = r.length, + s = i(arguments);try {for (var a = 0; a < n; a++) r[a].apply(null, s);} finally {r.length > n ? (r.splice(0, n), process.nextTick(function () {t.apply(null, s);})) : delete o[e];}});}(e));});}, "./node_modules/inherits/inherits.js": function (e, t, r) {try {var n = r("util");if ("function" != typeof n.inherits) throw "";e.exports = n.inherits;} catch (t) {e.exports = r("./node_modules/inherits/inherits_browser.js");}}, "./node_modules/inherits/inherits_browser.js": function (e, t) {"function" == typeof Object.create ? e.exports = function (e, t) {t && (e.super_ = t, e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }));} : e.exports = function (e, t) {if (t) {e.super_ = t;var r = function () {};r.prototype = t.prototype, e.prototype = new r(), e.prototype.constructor = e;}};}, "./node_modules/isarray/index.js": function (e, t) {var r = {}.toString;e.exports = Array.isArray || function (e) {return "[object Array]" == r.call(e);};}, "./node_modules/jszip/lib/base64.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/utils.js"), + o = r("./node_modules/jszip/lib/support.js"), + s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.encode = function (e) {for (var t, r, o, i, a, l, u, c = [], d = 0, h = e.length, f = h, p = "string" !== n.getTypeOf(e); d < e.length;) f = h - d, p ? (t = e[d++], r = d < h ? e[d++] : 0, o = d < h ? e[d++] : 0) : (t = e.charCodeAt(d++), r = d < h ? e.charCodeAt(d++) : 0, o = d < h ? e.charCodeAt(d++) : 0), i = t >> 2, a = (3 & t) << 4 | r >> 4, l = f > 1 ? (15 & r) << 2 | o >> 6 : 64, u = f > 2 ? 63 & o : 64, c.push(s.charAt(i) + s.charAt(a) + s.charAt(l) + s.charAt(u));return c.join("");}, t.decode = function (e) {var t, + r, + n, + i, + a, + l, + u = 0, + c = 0;if ("data:" === e.substr(0, "data:".length)) throw new Error("Invalid base64 input, it looks like a data url.");var d, + h = 3 * (e = e.replace(/[^A-Za-z0-9\+\/\=]/g, "")).length / 4;if (e.charAt(e.length - 1) === s.charAt(64) && h--, e.charAt(e.length - 2) === s.charAt(64) && h--, h % 1 != 0) throw new Error("Invalid base64 input, bad content length.");for (d = o.uint8array ? new Uint8Array(0 | h) : new Array(0 | h); u < e.length;) t = s.indexOf(e.charAt(u++)) << 2 | (i = s.indexOf(e.charAt(u++))) >> 4, r = (15 & i) << 4 | (a = s.indexOf(e.charAt(u++))) >> 2, n = (3 & a) << 6 | (l = s.indexOf(e.charAt(u++))), d[c++] = t, 64 !== a && (d[c++] = r), 64 !== l && (d[c++] = n);return d;};}, "./node_modules/jszip/lib/compressedObject.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/external.js"), + o = r("./node_modules/jszip/lib/stream/DataWorker.js"), + s = r("./node_modules/jszip/lib/stream/DataLengthProbe.js"), + i = r("./node_modules/jszip/lib/stream/Crc32Probe.js");s = r("./node_modules/jszip/lib/stream/DataLengthProbe.js");function a(e, t, r, n, o) {this.compressedSize = e, this.uncompressedSize = t, this.crc32 = r, this.compression = n, this.compressedContent = o;}a.prototype = { getContentWorker: function () {var e = new o(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new s("data_length")), + t = this;return e.on("end", function () {if (this.streamInfo.data_length !== t.uncompressedSize) throw new Error("Bug : uncompressed data size mismatch");}), e;}, getCompressedWorker: function () {return new o(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize", this.compressedSize).withStreamInfo("uncompressedSize", this.uncompressedSize).withStreamInfo("crc32", this.crc32).withStreamInfo("compression", this.compression);} }, a.createWorkerFrom = function (e, t, r) {return e.pipe(new i()).pipe(new s("uncompressedSize")).pipe(t.compressWorker(r)).pipe(new s("compressedSize")).withStreamInfo("compression", t);}, e.exports = a;}, "./node_modules/jszip/lib/compressions.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/stream/GenericWorker.js");t.STORE = { magic: "\0\0", compressWorker: function (e) {return new n("STORE compression");}, uncompressWorker: function () {return new n("STORE decompression");} }, t.DEFLATE = r("./node_modules/jszip/lib/flate.js");}, "./node_modules/jszip/lib/crc32.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/utils.js");var o = function () {for (var e, t = [], r = 0; r < 256; r++) {e = r;for (var n = 0; n < 8; n++) e = 1 & e ? 3988292384 ^ e >>> 1 : e >>> 1;t[r] = e;}return t;}();e.exports = function (e, t) {return void 0 !== e && e.length ? "string" !== n.getTypeOf(e) ? function (e, t, r, n) {var s = o, + i = n + r;e ^= -1;for (var a = n; a < i; a++) e = e >>> 8 ^ s[255 & (e ^ t[a])];return -1 ^ e;}(0 | t, e, e.length, 0) : function (e, t, r, n) {var s = o, + i = n + r;e ^= -1;for (var a = n; a < i; a++) e = e >>> 8 ^ s[255 & (e ^ t.charCodeAt(a))];return -1 ^ e;}(0 | t, e, e.length, 0) : 0;};}, "./node_modules/jszip/lib/defaults.js": function (e, t, r) {"use strict"; + t.base64 = !1, t.binary = !1, t.dir = !1, t.createFolders = !0, t.date = null, t.compression = null, t.compressionOptions = null, t.comment = null, t.unixPermissions = null, t.dosPermissions = null;}, "./node_modules/jszip/lib/external.js": function (e, t, r) {"use strict"; + var n = null;n = "undefined" != typeof Promise ? Promise : r("./node_modules/lie/lib/index.js"), e.exports = { Promise: n };}, "./node_modules/jszip/lib/flate.js": function (e, t, r) {"use strict"; + var n = "undefined" != typeof Uint8Array && "undefined" != typeof Uint16Array && "undefined" != typeof Uint32Array, + o = r("./node_modules/pako/index.js"), + s = r("./node_modules/jszip/lib/utils.js"), + i = r("./node_modules/jszip/lib/stream/GenericWorker.js"), + a = n ? "uint8array" : "array";function l(e, t) {i.call(this, "FlateWorker/" + e), this._pako = null, this._pakoAction = e, this._pakoOptions = t, this.meta = {};}t.magic = "\b\0", s.inherits(l, i), l.prototype.processChunk = function (e) {this.meta = e.meta, null === this._pako && this._createPako(), this._pako.push(s.transformTo(a, e.data), !1);}, l.prototype.flush = function () {i.prototype.flush.call(this), null === this._pako && this._createPako(), this._pako.push([], !0);}, l.prototype.cleanUp = function () {i.prototype.cleanUp.call(this), this._pako = null;}, l.prototype._createPako = function () {this._pako = new o[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });var e = this;this._pako.onData = function (t) {e.push({ data: t, meta: e.meta });};}, t.compressWorker = function (e) {return new l("Deflate", e);}, t.uncompressWorker = function () {return new l("Inflate", {});};}, "./node_modules/jszip/lib/generate/ZipFileWorker.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/utils.js"), + o = r("./node_modules/jszip/lib/stream/GenericWorker.js"), + s = r("./node_modules/jszip/lib/utf8.js"), + i = r("./node_modules/jszip/lib/crc32.js"), + a = r("./node_modules/jszip/lib/signature.js"), + l = function (e, t) {var r, + n = "";for (r = 0; r < t; r++) n += String.fromCharCode(255 & e), e >>>= 8;return n;}, + u = function (e, t, r, o, u, c) {var d, + h, + f = e.file, + p = e.compression, + m = c !== s.utf8encode, + g = n.transformTo("string", c(f.name)), + _ = n.transformTo("string", s.utf8encode(f.name)), + v = f.comment, + b = n.transformTo("string", c(v)), + y = n.transformTo("string", s.utf8encode(v)), + w = _.length !== f.name.length, + j = y.length !== v.length, + E = "", + k = "", + S = "", + C = f.dir, + x = f.date, + O = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };t && !r || (O.crc32 = e.crc32, O.compressedSize = e.compressedSize, O.uncompressedSize = e.uncompressedSize);var A = 0;t && (A |= 8), m || !w && !j || (A |= 2048);var R, + I, + T, + L = 0, + N = 0;C && (L |= 16), "UNIX" === u ? (N = 798, L |= (R = f.unixPermissions, I = C, T = R, R || (T = I ? 16893 : 33204), (65535 & T) << 16)) : (N = 20, L |= 63 & (f.dosPermissions || 0)), d = x.getUTCHours(), d <<= 6, d |= x.getUTCMinutes(), d <<= 5, d |= x.getUTCSeconds() / 2, h = x.getUTCFullYear() - 1980, h <<= 4, h |= x.getUTCMonth() + 1, h <<= 5, h |= x.getUTCDate(), w && (k = l(1, 1) + l(i(g), 4) + _, E += "up" + l(k.length, 2) + k), j && (S = l(1, 1) + l(i(b), 4) + y, E += "uc" + l(S.length, 2) + S);var z = "";return z += "\n\0", z += l(A, 2), z += p.magic, z += l(d, 2), z += l(h, 2), z += l(O.crc32, 4), z += l(O.compressedSize, 4), z += l(O.uncompressedSize, 4), z += l(g.length, 2), z += l(E.length, 2), { fileRecord: a.LOCAL_FILE_HEADER + z + g + E, dirRecord: a.CENTRAL_FILE_HEADER + l(N, 2) + z + l(b.length, 2) + "\0\0\0\0" + l(L, 4) + l(o, 4) + g + E + b };}, + c = function (e) {return a.DATA_DESCRIPTOR + l(e.crc32, 4) + l(e.compressedSize, 4) + l(e.uncompressedSize, 4);};function d(e, t, r, n) {o.call(this, "ZipFileWorker"), this.bytesWritten = 0, this.zipComment = t, this.zipPlatform = r, this.encodeFileName = n, this.streamFiles = e, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];}n.inherits(d, o), d.prototype.push = function (e) {var t = e.meta.percent || 0, + r = this.entriesCount, + n = this._sources.length;this.accumulate ? this.contentBuffer.push(e) : (this.bytesWritten += e.data.length, o.prototype.push.call(this, { data: e.data, meta: { currentFile: this.currentFile, percent: r ? (t + 100 * (r - n - 1)) / r : 100 } }));}, d.prototype.openedSource = function (e) {this.currentSourceOffset = this.bytesWritten, this.currentFile = e.file.name;var t = this.streamFiles && !e.file.dir;if (t) {var r = u(e, t, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);this.push({ data: r.fileRecord, meta: { percent: 0 } });} else this.accumulate = !0;}, d.prototype.closedSource = function (e) {this.accumulate = !1;var t = this.streamFiles && !e.file.dir, + r = u(e, t, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);if (this.dirRecords.push(r.dirRecord), t) this.push({ data: c(e), meta: { percent: 100 } });else for (this.push({ data: r.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length;) this.push(this.contentBuffer.shift());this.currentFile = null;}, d.prototype.flush = function () {for (var e = this.bytesWritten, t = 0; t < this.dirRecords.length; t++) this.push({ data: this.dirRecords[t], meta: { percent: 100 } });var r = this.bytesWritten - e, + o = function (e, t, r, o, s) {var i = n.transformTo("string", s(o));return a.CENTRAL_DIRECTORY_END + "\0\0\0\0" + l(e, 2) + l(e, 2) + l(t, 4) + l(r, 4) + l(i.length, 2) + i;}(this.dirRecords.length, r, e, this.zipComment, this.encodeFileName);this.push({ data: o, meta: { percent: 100 } });}, d.prototype.prepareNextSource = function () {this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();}, d.prototype.registerPrevious = function (e) {this._sources.push(e);var t = this;return e.on("data", function (e) {t.processChunk(e);}), e.on("end", function () {t.closedSource(t.previous.streamInfo), t._sources.length ? t.prepareNextSource() : t.end();}), e.on("error", function (e) {t.error(e);}), this;}, d.prototype.resume = function () {return !!o.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));}, d.prototype.error = function (e) {var t = this._sources;if (!o.prototype.error.call(this, e)) return !1;for (var r = 0; r < t.length; r++) try {t[r].error(e);} catch (e) {}return !0;}, d.prototype.lock = function () {o.prototype.lock.call(this);for (var e = this._sources, t = 0; t < e.length; t++) e[t].lock();}, e.exports = d;}, "./node_modules/jszip/lib/generate/index.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/compressions.js"), + o = r("./node_modules/jszip/lib/generate/ZipFileWorker.js");t.generateWorker = function (e, t, r) {var s = new o(t.streamFiles, r, t.platform, t.encodeFileName), + i = 0;try {e.forEach(function (e, r) {i++;var o = function (e, t) {var r = e || t, + o = n[r];if (!o) throw new Error(r + " is not a valid compression method !");return o;}(r.options.compression, t.compression), + a = r.options.compressionOptions || t.compressionOptions || {}, + l = r.dir, + u = r.date;r._compressWorker(o, a).withStreamInfo("file", { name: e, dir: l, date: u, comment: r.comment || "", unixPermissions: r.unixPermissions, dosPermissions: r.dosPermissions }).pipe(s);}), s.entriesCount = i;} catch (e) {s.error(e);}return s;};}, "./node_modules/jszip/lib/index.js": function (e, t, r) {"use strict"; + function n() {if (!(this instanceof n)) return new n();if (arguments.length) throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");this.files = {}, this.comment = null, this.root = "", this.clone = function () {var e = new n();for (var t in this) "function" != typeof this[t] && (e[t] = this[t]);return e;};}n.prototype = r("./node_modules/jszip/lib/object.js"), n.prototype.loadAsync = r("./node_modules/jszip/lib/load.js"), n.support = r("./node_modules/jszip/lib/support.js"), n.defaults = r("./node_modules/jszip/lib/defaults.js"), n.version = "3.5.0", n.loadAsync = function (e, t) {return new n().loadAsync(e, t);}, n.external = r("./node_modules/jszip/lib/external.js"), e.exports = n;}, "./node_modules/jszip/lib/load.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/utils.js"), + o = r("./node_modules/jszip/lib/external.js"), + s = r("./node_modules/jszip/lib/utf8.js"), + i = (n = r("./node_modules/jszip/lib/utils.js"), r("./node_modules/jszip/lib/zipEntries.js")), + a = r("./node_modules/jszip/lib/stream/Crc32Probe.js"), + l = r("./node_modules/jszip/lib/nodejsUtils.js");function u(e) {return new o.Promise(function (t, r) {var n = e.decompressed.getContentWorker().pipe(new a());n.on("error", function (e) {r(e);}).on("end", function () {n.streamInfo.crc32 !== e.decompressed.crc32 ? r(new Error("Corrupted zip : CRC32 mismatch")) : t();}).resume();});}e.exports = function (e, t) {var r = this;return t = n.extend(t || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: s.utf8decode }), l.isNode && l.isStream(e) ? o.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")) : n.prepareContent("the loaded zip file", e, !0, t.optimizedBinaryString, t.base64).then(function (e) {var r = new i(t);return r.load(e), r;}).then(function (e) {var r = [o.Promise.resolve(e)], + n = e.files;if (t.checkCRC32) for (var s = 0; s < n.length; s++) r.push(u(n[s]));return o.Promise.all(r);}).then(function (e) {for (var n = e.shift(), o = n.files, s = 0; s < o.length; s++) {var i = o[s];r.file(i.fileNameStr, i.decompressed, { binary: !0, optimizedBinaryString: !0, date: i.date, dir: i.dir, comment: i.fileCommentStr.length ? i.fileCommentStr : null, unixPermissions: i.unixPermissions, dosPermissions: i.dosPermissions, createFolders: t.createFolders });}return n.zipComment.length && (r.comment = n.zipComment), r;});};}, "./node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/utils.js"), + o = r("./node_modules/jszip/lib/stream/GenericWorker.js");function s(e, t) {o.call(this, "Nodejs stream input adapter for " + e), this._upstreamEnded = !1, this._bindStream(t);}n.inherits(s, o), s.prototype._bindStream = function (e) {var t = this;this._stream = e, e.pause(), e.on("data", function (e) {t.push({ data: e, meta: { percent: 0 } });}).on("error", function (e) {t.isPaused ? this.generatedError = e : t.error(e);}).on("end", function () {t.isPaused ? t._upstreamEnded = !0 : t.end();});}, s.prototype.pause = function () {return !!o.prototype.pause.call(this) && (this._stream.pause(), !0);}, s.prototype.resume = function () {return !!o.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);}, e.exports = s;}, "./node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/readable-stream/readable.js").Readable;function o(e, t, r) {n.call(this, t), this._helper = e;var o = this;e.on("data", function (e, t) {o.push(e) || o._helper.pause(), r && r(t);}).on("error", function (e) {o.emit("error", e);}).on("end", function () {o.push(null);});}r("./node_modules/jszip/lib/utils.js").inherits(o, n), o.prototype._read = function () {this._helper.resume();}, e.exports = o;}, "./node_modules/jszip/lib/nodejsUtils.js": function (e, t, r) {"use strict"; + e.exports = { isNode: "undefined" != typeof Buffer, newBufferFrom: function (e, t) {if (Buffer.from && Buffer.from !== Uint8Array.from) return Buffer.from(e, t);if ("number" == typeof e) throw new Error('The "data" argument must not be a number');return new Buffer(e, t);}, allocBuffer: function (e) {if (Buffer.alloc) return Buffer.alloc(e);var t = new Buffer(e);return t.fill(0), t;}, isBuffer: function (e) {return Buffer.isBuffer(e);}, isStream: function (e) {return e && "function" == typeof e.on && "function" == typeof e.pause && "function" == typeof e.resume;} };}, "./node_modules/jszip/lib/object.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/utf8.js"), + o = r("./node_modules/jszip/lib/utils.js"), + s = r("./node_modules/jszip/lib/stream/GenericWorker.js"), + i = r("./node_modules/jszip/lib/stream/StreamHelper.js"), + a = r("./node_modules/jszip/lib/defaults.js"), + l = r("./node_modules/jszip/lib/compressedObject.js"), + u = r("./node_modules/jszip/lib/zipObject.js"), + c = r("./node_modules/jszip/lib/generate/index.js"), + d = r("./node_modules/jszip/lib/nodejsUtils.js"), + h = r("./node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js"), + f = function (e, t, r) {var n, + i = o.getTypeOf(t), + c = o.extend(r || {}, a);c.date = c.date || new Date(), null !== c.compression && (c.compression = c.compression.toUpperCase()), "string" == typeof c.unixPermissions && (c.unixPermissions = parseInt(c.unixPermissions, 8)), c.unixPermissions && 16384 & c.unixPermissions && (c.dir = !0), c.dosPermissions && 16 & c.dosPermissions && (c.dir = !0), c.dir && (e = m(e)), c.createFolders && (n = p(e)) && g.call(this, n, !0);var f = "string" === i && !1 === c.binary && !1 === c.base64;r && void 0 !== r.binary || (c.binary = !f), (t instanceof l && 0 === t.uncompressedSize || c.dir || !t || 0 === t.length) && (c.base64 = !1, c.binary = !0, t = "", c.compression = "STORE", i = "string");var _ = null;_ = t instanceof l || t instanceof s ? t : d.isNode && d.isStream(t) ? new h(e, t) : o.prepareContent(e, t, c.binary, c.optimizedBinaryString, c.base64);var v = new u(e, _, c);this.files[e] = v;}, + p = function (e) {"/" === e.slice(-1) && (e = e.substring(0, e.length - 1));var t = e.lastIndexOf("/");return t > 0 ? e.substring(0, t) : "";}, + m = function (e) {return "/" !== e.slice(-1) && (e += "/"), e;}, + g = function (e, t) {return t = void 0 !== t ? t : a.createFolders, e = m(e), this.files[e] || f.call(this, e, null, { dir: !0, createFolders: t }), this.files[e];};function _(e) {return "[object RegExp]" === Object.prototype.toString.call(e);}var v = { load: function () {throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");}, forEach: function (e) {var t, r, n;for (t in this.files) this.files.hasOwnProperty(t) && (n = this.files[t], (r = t.slice(this.root.length, t.length)) && t.slice(0, this.root.length) === this.root && e(r, n));}, filter: function (e) {var t = [];return this.forEach(function (r, n) {e(r, n) && t.push(n);}), t;}, file: function (e, t, r) {if (1 === arguments.length) {if (_(e)) {var n = e;return this.filter(function (e, t) {return !t.dir && n.test(e);});}var o = this.files[this.root + e];return o && !o.dir ? o : null;}return e = this.root + e, f.call(this, e, t, r), this;}, folder: function (e) {if (!e) return this;if (_(e)) return this.filter(function (t, r) {return r.dir && e.test(t);});var t = this.root + e, + r = g.call(this, t), + n = this.clone();return n.root = r.name, n;}, remove: function (e) {e = this.root + e;var t = this.files[e];if (t || ("/" !== e.slice(-1) && (e += "/"), t = this.files[e]), t && !t.dir) delete this.files[e];else for (var r = this.filter(function (t, r) {return r.name.slice(0, e.length) === e;}), n = 0; n < r.length; n++) delete this.files[r[n].name];return this;}, generate: function (e) {throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");}, generateInternalStream: function (e) {var t, + r = {};try {if ((r = o.extend(e || {}, { streamFiles: !1, compression: "STORE", compressionOptions: null, type: "", platform: "DOS", comment: null, mimeType: "application/zip", encodeFileName: n.utf8encode })).type = r.type.toLowerCase(), r.compression = r.compression.toUpperCase(), "binarystring" === r.type && (r.type = "string"), !r.type) throw new Error("No output type specified.");o.checkSupport(r.type), "darwin" !== r.platform && "freebsd" !== r.platform && "linux" !== r.platform && "sunos" !== r.platform || (r.platform = "UNIX"), "win32" === r.platform && (r.platform = "DOS");var a = r.comment || this.comment || "";t = c.generateWorker(this, r, a);} catch (e) {(t = new s("error")).error(e);}return new i(t, r.type || "string", r.mimeType);}, generateAsync: function (e, t) {return this.generateInternalStream(e).accumulate(t);}, generateNodeStream: function (e, t) {return (e = e || {}).type || (e.type = "nodebuffer"), this.generateInternalStream(e).toNodejsStream(t);} };e.exports = v;}, "./node_modules/jszip/lib/reader/ArrayReader.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/reader/DataReader.js");function o(e) {n.call(this, e);for (var t = 0; t < this.data.length; t++) e[t] = 255 & e[t];}r("./node_modules/jszip/lib/utils.js").inherits(o, n), o.prototype.byteAt = function (e) {return this.data[this.zero + e];}, o.prototype.lastIndexOfSignature = function (e) {for (var t = e.charCodeAt(0), r = e.charCodeAt(1), n = e.charCodeAt(2), o = e.charCodeAt(3), s = this.length - 4; s >= 0; --s) if (this.data[s] === t && this.data[s + 1] === r && this.data[s + 2] === n && this.data[s + 3] === o) return s - this.zero;return -1;}, o.prototype.readAndCheckSignature = function (e) {var t = e.charCodeAt(0), + r = e.charCodeAt(1), + n = e.charCodeAt(2), + o = e.charCodeAt(3), + s = this.readData(4);return t === s[0] && r === s[1] && n === s[2] && o === s[3];}, o.prototype.readData = function (e) {if (this.checkOffset(e), 0 === e) return [];var t = this.data.slice(this.zero + this.index, this.zero + this.index + e);return this.index += e, t;}, e.exports = o;}, "./node_modules/jszip/lib/reader/DataReader.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/utils.js");function o(e) {this.data = e, this.length = e.length, this.index = 0, this.zero = 0;}o.prototype = { checkOffset: function (e) {this.checkIndex(this.index + e);}, checkIndex: function (e) {if (this.length < this.zero + e || e < 0) throw new Error("End of data reached (data length = " + this.length + ", asked index = " + e + "). Corrupted zip ?");}, setIndex: function (e) {this.checkIndex(e), this.index = e;}, skip: function (e) {this.setIndex(this.index + e);}, byteAt: function (e) {}, readInt: function (e) {var t, + r = 0;for (this.checkOffset(e), t = this.index + e - 1; t >= this.index; t--) r = (r << 8) + this.byteAt(t);return this.index += e, r;}, readString: function (e) {return n.transformTo("string", this.readData(e));}, readData: function (e) {}, lastIndexOfSignature: function (e) {}, readAndCheckSignature: function (e) {}, readDate: function () {var e = this.readInt(4);return new Date(Date.UTC(1980 + (e >> 25 & 127), (e >> 21 & 15) - 1, e >> 16 & 31, e >> 11 & 31, e >> 5 & 63, (31 & e) << 1));} }, e.exports = o;}, "./node_modules/jszip/lib/reader/NodeBufferReader.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/reader/Uint8ArrayReader.js");function o(e) {n.call(this, e);}r("./node_modules/jszip/lib/utils.js").inherits(o, n), o.prototype.readData = function (e) {this.checkOffset(e);var t = this.data.slice(this.zero + this.index, this.zero + this.index + e);return this.index += e, t;}, e.exports = o;}, "./node_modules/jszip/lib/reader/StringReader.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/reader/DataReader.js");function o(e) {n.call(this, e);}r("./node_modules/jszip/lib/utils.js").inherits(o, n), o.prototype.byteAt = function (e) {return this.data.charCodeAt(this.zero + e);}, o.prototype.lastIndexOfSignature = function (e) {return this.data.lastIndexOf(e) - this.zero;}, o.prototype.readAndCheckSignature = function (e) {return e === this.readData(4);}, o.prototype.readData = function (e) {this.checkOffset(e);var t = this.data.slice(this.zero + this.index, this.zero + this.index + e);return this.index += e, t;}, e.exports = o;}, "./node_modules/jszip/lib/reader/Uint8ArrayReader.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/reader/ArrayReader.js");function o(e) {n.call(this, e);}r("./node_modules/jszip/lib/utils.js").inherits(o, n), o.prototype.readData = function (e) {if (this.checkOffset(e), 0 === e) return new Uint8Array(0);var t = this.data.subarray(this.zero + this.index, this.zero + this.index + e);return this.index += e, t;}, e.exports = o;}, "./node_modules/jszip/lib/reader/readerFor.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/utils.js"), + o = r("./node_modules/jszip/lib/support.js"), + s = r("./node_modules/jszip/lib/reader/ArrayReader.js"), + i = r("./node_modules/jszip/lib/reader/StringReader.js"), + a = r("./node_modules/jszip/lib/reader/NodeBufferReader.js"), + l = r("./node_modules/jszip/lib/reader/Uint8ArrayReader.js");e.exports = function (e) {var t = n.getTypeOf(e);return n.checkSupport(t), "string" !== t || o.uint8array ? "nodebuffer" === t ? new a(e) : o.uint8array ? new l(n.transformTo("uint8array", e)) : new s(n.transformTo("array", e)) : new i(e);};}, "./node_modules/jszip/lib/signature.js": function (e, t, r) {"use strict"; + t.LOCAL_FILE_HEADER = "PK", t.CENTRAL_FILE_HEADER = "PK", t.CENTRAL_DIRECTORY_END = "PK", t.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK", t.ZIP64_CENTRAL_DIRECTORY_END = "PK", t.DATA_DESCRIPTOR = "PK\b";}, "./node_modules/jszip/lib/stream/ConvertWorker.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/stream/GenericWorker.js"), + o = r("./node_modules/jszip/lib/utils.js");function s(e) {n.call(this, "ConvertWorker to " + e), this.destType = e;}o.inherits(s, n), s.prototype.processChunk = function (e) {this.push({ data: o.transformTo(this.destType, e.data), meta: e.meta });}, e.exports = s;}, "./node_modules/jszip/lib/stream/Crc32Probe.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/stream/GenericWorker.js"), + o = r("./node_modules/jszip/lib/crc32.js");function s() {n.call(this, "Crc32Probe"), this.withStreamInfo("crc32", 0);}r("./node_modules/jszip/lib/utils.js").inherits(s, n), s.prototype.processChunk = function (e) {this.streamInfo.crc32 = o(e.data, this.streamInfo.crc32 || 0), this.push(e);}, e.exports = s;}, "./node_modules/jszip/lib/stream/DataLengthProbe.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/utils.js"), + o = r("./node_modules/jszip/lib/stream/GenericWorker.js");function s(e) {o.call(this, "DataLengthProbe for " + e), this.propName = e, this.withStreamInfo(e, 0);}n.inherits(s, o), s.prototype.processChunk = function (e) {if (e) {var t = this.streamInfo[this.propName] || 0;this.streamInfo[this.propName] = t + e.data.length;}o.prototype.processChunk.call(this, e);}, e.exports = s;}, "./node_modules/jszip/lib/stream/DataWorker.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/utils.js"), + o = r("./node_modules/jszip/lib/stream/GenericWorker.js");function s(e) {o.call(this, "DataWorker");var t = this;this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = "", this._tickScheduled = !1, e.then(function (e) {t.dataIsReady = !0, t.data = e, t.max = e && e.length || 0, t.type = n.getTypeOf(e), t.isPaused || t._tickAndRepeat();}, function (e) {t.error(e);});}n.inherits(s, o), s.prototype.cleanUp = function () {o.prototype.cleanUp.call(this), this.data = null;}, s.prototype.resume = function () {return !!o.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, n.delay(this._tickAndRepeat, [], this)), !0);}, s.prototype._tickAndRepeat = function () {this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (n.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));}, s.prototype._tick = function () {if (this.isPaused || this.isFinished) return !1;var e = null, + t = Math.min(this.max, this.index + 16384);if (this.index >= this.max) return this.end();switch (this.type) {case "string": + e = this.data.substring(this.index, t); + break; + case "uint8array": + e = this.data.subarray(this.index, t); + break; + case "array":case "nodebuffer": + e = this.data.slice(this.index, t); + }return this.index = t, this.push({ data: e, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });}, e.exports = s;}, "./node_modules/jszip/lib/stream/GenericWorker.js": function (e, t, r) {"use strict"; + function n(e) {this.name = e || "default", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;}n.prototype = { push: function (e) {this.emit("data", e);}, end: function () {if (this.isFinished) return !1;this.flush();try {this.emit("end"), this.cleanUp(), this.isFinished = !0;} catch (e) {this.emit("error", e);}return !0;}, error: function (e) {return !this.isFinished && (this.isPaused ? this.generatedError = e : (this.isFinished = !0, this.emit("error", e), this.previous && this.previous.error(e), this.cleanUp()), !0);}, on: function (e, t) {return this._listeners[e].push(t), this;}, cleanUp: function () {this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];}, emit: function (e, t) {if (this._listeners[e]) for (var r = 0; r < this._listeners[e].length; r++) this._listeners[e][r].call(this, t);}, pipe: function (e) {return e.registerPrevious(this);}, registerPrevious: function (e) {if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");this.streamInfo = e.streamInfo, this.mergeStreamInfo(), this.previous = e;var t = this;return e.on("data", function (e) {t.processChunk(e);}), e.on("end", function () {t.end();}), e.on("error", function (e) {t.error(e);}), this;}, pause: function () {return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);}, resume: function () {if (!this.isPaused || this.isFinished) return !1;this.isPaused = !1;var e = !1;return this.generatedError && (this.error(this.generatedError), e = !0), this.previous && this.previous.resume(), !e;}, flush: function () {}, processChunk: function (e) {this.push(e);}, withStreamInfo: function (e, t) {return this.extraStreamInfo[e] = t, this.mergeStreamInfo(), this;}, mergeStreamInfo: function () {for (var e in this.extraStreamInfo) this.extraStreamInfo.hasOwnProperty(e) && (this.streamInfo[e] = this.extraStreamInfo[e]);}, lock: function () {if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");this.isLocked = !0, this.previous && this.previous.lock();}, toString: function () {var e = "Worker " + this.name;return this.previous ? this.previous + " -> " + e : e;} }, e.exports = n;}, "./node_modules/jszip/lib/stream/StreamHelper.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/utils.js"), + o = r("./node_modules/jszip/lib/stream/ConvertWorker.js"), + s = r("./node_modules/jszip/lib/stream/GenericWorker.js"), + i = r("./node_modules/jszip/lib/base64.js"), + a = r("./node_modules/jszip/lib/support.js"), + l = r("./node_modules/jszip/lib/external.js"), + u = null;if (a.nodestream) try {u = r("./node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js");} catch (e) {}function c(e, t) {return new l.Promise(function (r, o) {var s = [], + a = e._internalType, + l = e._outputType, + u = e._mimeType;e.on("data", function (e, r) {s.push(e), t && t(r);}).on("error", function (e) {s = [], o(e);}).on("end", function () {try {var e = function (e, t, r) {switch (e) {case "blob": + return n.newBlob(n.transformTo("arraybuffer", t), r); + case "base64": + return i.encode(t); + default: + return n.transformTo(e, t); + }}(l, function (e, t) {var r, + n = 0, + o = null, + s = 0;for (r = 0; r < t.length; r++) s += t[r].length;switch (e) {case "string": + return t.join(""); + case "array": + return Array.prototype.concat.apply([], t); + case "uint8array": + for (o = new Uint8Array(s), r = 0; r < t.length; r++) o.set(t[r], n), n += t[r].length; + + return o; + case "nodebuffer": + return Buffer.concat(t); + default: + throw new Error("concat : unsupported type '" + e + "'"); + }}(a, s), u);r(e);} catch (e) {o(e);}s = [];}).resume();});}function d(e, t, r) {var i = t;switch (t) {case "blob":case "arraybuffer": + i = "uint8array"; + break; + case "base64": + i = "string"; + }try {this._internalType = i, this._outputType = t, this._mimeType = r, n.checkSupport(i), this._worker = e.pipe(new o(i)), e.lock();} catch (e) {this._worker = new s("error"), this._worker.error(e);}}d.prototype = { accumulate: function (e) {return c(this, e);}, on: function (e, t) {var r = this;return "data" === e ? this._worker.on(e, function (e) {t.call(r, e.data, e.meta);}) : this._worker.on(e, function () {n.delay(t, arguments, r);}), this;}, resume: function () {return n.delay(this._worker.resume, [], this._worker), this;}, pause: function () {return this._worker.pause(), this;}, toNodejsStream: function (e) {if (n.checkSupport("nodestream"), "nodebuffer" !== this._outputType) throw new Error(this._outputType + " is not supported by this method");return new u(this, { objectMode: "nodebuffer" !== this._outputType }, e);} }, e.exports = d;}, "./node_modules/jszip/lib/support.js": function (e, t, r) {"use strict"; + if (t.base64 = !0, t.array = !0, t.string = !0, t.arraybuffer = "undefined" != typeof ArrayBuffer && "undefined" != typeof Uint8Array, t.nodebuffer = "undefined" != typeof Buffer, t.uint8array = "undefined" != typeof Uint8Array, "undefined" == typeof ArrayBuffer) t.blob = !1;else {var n = new ArrayBuffer(0);try {t.blob = 0 === new Blob([n], { type: "application/zip" }).size;} catch (e) {try {var o = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();o.append(n), t.blob = 0 === o.getBlob("application/zip").size;} catch (e) {t.blob = !1;}}}try {t.nodestream = !!r("./node_modules/readable-stream/readable.js").Readable;} catch (e) {t.nodestream = !1;}}, "./node_modules/jszip/lib/utf8.js": function (e, t, r) {"use strict"; + for (var n = r("./node_modules/jszip/lib/utils.js"), o = r("./node_modules/jszip/lib/support.js"), s = r("./node_modules/jszip/lib/nodejsUtils.js"), i = r("./node_modules/jszip/lib/stream/GenericWorker.js"), a = new Array(256), l = 0; l < 256; l++) a[l] = l >= 252 ? 6 : l >= 248 ? 5 : l >= 240 ? 4 : l >= 224 ? 3 : l >= 192 ? 2 : 1;a[254] = a[254] = 1;function u() {i.call(this, "utf-8 decode"), this.leftOver = null;}function c() {i.call(this, "utf-8 encode");}t.utf8encode = function (e) {return o.nodebuffer ? s.newBufferFrom(e, "utf-8") : function (e) {var t, + r, + n, + s, + i, + a = e.length, + l = 0;for (s = 0; s < a; s++) 55296 == (64512 & (r = e.charCodeAt(s))) && s + 1 < a && 56320 == (64512 & (n = e.charCodeAt(s + 1))) && (r = 65536 + (r - 55296 << 10) + (n - 56320), s++), l += r < 128 ? 1 : r < 2048 ? 2 : r < 65536 ? 3 : 4;for (t = o.uint8array ? new Uint8Array(l) : new Array(l), i = 0, s = 0; i < l; s++) 55296 == (64512 & (r = e.charCodeAt(s))) && s + 1 < a && 56320 == (64512 & (n = e.charCodeAt(s + 1))) && (r = 65536 + (r - 55296 << 10) + (n - 56320), s++), r < 128 ? t[i++] = r : r < 2048 ? (t[i++] = 192 | r >>> 6, t[i++] = 128 | 63 & r) : r < 65536 ? (t[i++] = 224 | r >>> 12, t[i++] = 128 | r >>> 6 & 63, t[i++] = 128 | 63 & r) : (t[i++] = 240 | r >>> 18, t[i++] = 128 | r >>> 12 & 63, t[i++] = 128 | r >>> 6 & 63, t[i++] = 128 | 63 & r);return t;}(e);}, t.utf8decode = function (e) {return o.nodebuffer ? n.transformTo("nodebuffer", e).toString("utf-8") : function (e) {var t, + r, + o, + s, + i = e.length, + l = new Array(2 * i);for (r = 0, t = 0; t < i;) if ((o = e[t++]) < 128) l[r++] = o;else if ((s = a[o]) > 4) l[r++] = 65533, t += s - 1;else {for (o &= 2 === s ? 31 : 3 === s ? 15 : 7; s > 1 && t < i;) o = o << 6 | 63 & e[t++], s--;s > 1 ? l[r++] = 65533 : o < 65536 ? l[r++] = o : (o -= 65536, l[r++] = 55296 | o >> 10 & 1023, l[r++] = 56320 | 1023 & o);}return l.length !== r && (l.subarray ? l = l.subarray(0, r) : l.length = r), n.applyFromCharCode(l);}(e = n.transformTo(o.uint8array ? "uint8array" : "array", e));}, n.inherits(u, i), u.prototype.processChunk = function (e) {var r = n.transformTo(o.uint8array ? "uint8array" : "array", e.data);if (this.leftOver && this.leftOver.length) {if (o.uint8array) {var s = r;(r = new Uint8Array(s.length + this.leftOver.length)).set(this.leftOver, 0), r.set(s, this.leftOver.length);} else r = this.leftOver.concat(r);this.leftOver = null;}var i = function (e, t) {var r;for ((t = t || e.length) > e.length && (t = e.length), r = t - 1; r >= 0 && 128 == (192 & e[r]);) r--;return r < 0 || 0 === r ? t : r + a[e[r]] > t ? r : t;}(r), + l = r;i !== r.length && (o.uint8array ? (l = r.subarray(0, i), this.leftOver = r.subarray(i, r.length)) : (l = r.slice(0, i), this.leftOver = r.slice(i, r.length))), this.push({ data: t.utf8decode(l), meta: e.meta });}, u.prototype.flush = function () {this.leftOver && this.leftOver.length && (this.push({ data: t.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);}, t.Utf8DecodeWorker = u, n.inherits(c, i), c.prototype.processChunk = function (e) {this.push({ data: t.utf8encode(e.data), meta: e.meta });}, t.Utf8EncodeWorker = c;}, "./node_modules/jszip/lib/utils.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/support.js"), + o = r("./node_modules/jszip/lib/base64.js"), + s = r("./node_modules/jszip/lib/nodejsUtils.js"), + i = r("./node_modules/set-immediate-shim/index.js"), + a = r("./node_modules/jszip/lib/external.js");function l(e) {return e;}function u(e, t) {for (var r = 0; r < e.length; ++r) t[r] = 255 & e.charCodeAt(r);return t;}t.newBlob = function (e, r) {t.checkSupport("blob");try {return new Blob([e], { type: r });} catch (t) {try {var n = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();return n.append(e), n.getBlob(r);} catch (e) {throw new Error("Bug : can't construct the Blob.");}}};var c = { stringifyByChunk: function (e, t, r) {var n = [], + o = 0, + s = e.length;if (s <= r) return String.fromCharCode.apply(null, e);for (; o < s;) "array" === t || "nodebuffer" === t ? n.push(String.fromCharCode.apply(null, e.slice(o, Math.min(o + r, s)))) : n.push(String.fromCharCode.apply(null, e.subarray(o, Math.min(o + r, s)))), o += r;return n.join("");}, stringifyByChar: function (e) {for (var t = "", r = 0; r < e.length; r++) t += String.fromCharCode(e[r]);return t;}, applyCanBeUsed: { uint8array: function () {try {return n.uint8array && 1 === String.fromCharCode.apply(null, new Uint8Array(1)).length;} catch (e) {return !1;}}(), nodebuffer: function () {try {return n.nodebuffer && 1 === String.fromCharCode.apply(null, s.allocBuffer(1)).length;} catch (e) {return !1;}}() } };function d(e) {var r = 65536, + n = t.getTypeOf(e), + o = !0;if ("uint8array" === n ? o = c.applyCanBeUsed.uint8array : "nodebuffer" === n && (o = c.applyCanBeUsed.nodebuffer), o) for (; r > 1;) try {return c.stringifyByChunk(e, n, r);} catch (e) {r = Math.floor(r / 2);}return c.stringifyByChar(e);}function h(e, t) {for (var r = 0; r < e.length; r++) t[r] = e[r];return t;}t.applyFromCharCode = d;var f = {};f.string = { string: l, array: function (e) {return u(e, new Array(e.length));}, arraybuffer: function (e) {return f.string.uint8array(e).buffer;}, uint8array: function (e) {return u(e, new Uint8Array(e.length));}, nodebuffer: function (e) {return u(e, s.allocBuffer(e.length));} }, f.array = { string: d, array: l, arraybuffer: function (e) {return new Uint8Array(e).buffer;}, uint8array: function (e) {return new Uint8Array(e);}, nodebuffer: function (e) {return s.newBufferFrom(e);} }, f.arraybuffer = { string: function (e) {return d(new Uint8Array(e));}, array: function (e) {return h(new Uint8Array(e), new Array(e.byteLength));}, arraybuffer: l, uint8array: function (e) {return new Uint8Array(e);}, nodebuffer: function (e) {return s.newBufferFrom(new Uint8Array(e));} }, f.uint8array = { string: d, array: function (e) {return h(e, new Array(e.length));}, arraybuffer: function (e) {return e.buffer;}, uint8array: l, nodebuffer: function (e) {return s.newBufferFrom(e);} }, f.nodebuffer = { string: d, array: function (e) {return h(e, new Array(e.length));}, arraybuffer: function (e) {return f.nodebuffer.uint8array(e).buffer;}, uint8array: function (e) {return h(e, new Uint8Array(e.length));}, nodebuffer: l }, t.transformTo = function (e, r) {if (r || (r = ""), !e) return r;t.checkSupport(e);var n = t.getTypeOf(r);return f[n][e](r);}, t.getTypeOf = function (e) {return "string" == typeof e ? "string" : "[object Array]" === Object.prototype.toString.call(e) ? "array" : n.nodebuffer && s.isBuffer(e) ? "nodebuffer" : n.uint8array && e instanceof Uint8Array ? "uint8array" : n.arraybuffer && e instanceof ArrayBuffer ? "arraybuffer" : void 0;}, t.checkSupport = function (e) {if (!n[e.toLowerCase()]) throw new Error(e + " is not supported by this platform");}, t.MAX_VALUE_16BITS = 65535, t.MAX_VALUE_32BITS = -1, t.pretty = function (e) {var t, + r, + n = "";for (r = 0; r < (e || "").length; r++) n += "\\x" + ((t = e.charCodeAt(r)) < 16 ? "0" : "") + t.toString(16).toUpperCase();return n;}, t.delay = function (e, t, r) {i(function () {e.apply(r || null, t || []);});}, t.inherits = function (e, t) {var r = function () {};r.prototype = t.prototype, e.prototype = new r();}, t.extend = function () {var e, + t, + r = {};for (e = 0; e < arguments.length; e++) for (t in arguments[e]) arguments[e].hasOwnProperty(t) && void 0 === r[t] && (r[t] = arguments[e][t]);return r;}, t.prepareContent = function (e, r, s, i, l) {return a.Promise.resolve(r).then(function (e) {return n.blob && (e instanceof Blob || -1 !== ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(e))) && "undefined" != typeof FileReader ? new a.Promise(function (t, r) {var n = new FileReader();n.onload = function (e) {t(e.target.result);}, n.onerror = function (e) {r(e.target.error);}, n.readAsArrayBuffer(e);}) : e;}).then(function (r) {var c, + d = t.getTypeOf(r);return d ? ("arraybuffer" === d ? r = t.transformTo("uint8array", r) : "string" === d && (l ? r = o.decode(r) : s && !0 !== i && (r = u(c = r, n.uint8array ? new Uint8Array(c.length) : new Array(c.length)))), r) : a.Promise.reject(new Error("Can't read the data of '" + e + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"));});};}, "./node_modules/jszip/lib/zipEntries.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/reader/readerFor.js"), + o = r("./node_modules/jszip/lib/utils.js"), + s = r("./node_modules/jszip/lib/signature.js"), + i = r("./node_modules/jszip/lib/zipEntry.js"), + a = (r("./node_modules/jszip/lib/utf8.js"), r("./node_modules/jszip/lib/support.js"));function l(e) {this.files = [], this.loadOptions = e;}l.prototype = { checkSignature: function (e) {if (!this.reader.readAndCheckSignature(e)) {this.reader.index -= 4;var t = this.reader.readString(4);throw new Error("Corrupted zip or bug: unexpected signature (" + o.pretty(t) + ", expected " + o.pretty(e) + ")");}}, isSignature: function (e, t) {var r = this.reader.index;this.reader.setIndex(e);var n = this.reader.readString(4) === t;return this.reader.setIndex(r), n;}, readBlockEndOfCentral: function () {this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);var e = this.reader.readData(this.zipCommentLength), + t = a.uint8array ? "uint8array" : "array", + r = o.transformTo(t, e);this.zipComment = this.loadOptions.decodeFileName(r);}, readBlockZip64EndOfCentral: function () {this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};for (var e, t, r, n = this.zip64EndOfCentralSize - 44; 0 < n;) e = this.reader.readInt(2), t = this.reader.readInt(4), r = this.reader.readData(t), this.zip64ExtensibleData[e] = { id: e, length: t, value: r };}, readBlockZip64EndOfCentralLocator: function () {if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), this.disksCount > 1) throw new Error("Multi-volumes zip are not supported");}, readLocalFiles: function () {var e, t;for (e = 0; e < this.files.length; e++) t = this.files[e], this.reader.setIndex(t.localHeaderOffset), this.checkSignature(s.LOCAL_FILE_HEADER), t.readLocalPart(this.reader), t.handleUTF8(), t.processAttributes();}, readCentralDir: function () {var e;for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(s.CENTRAL_FILE_HEADER);) (e = new i({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(e);if (this.centralDirRecords !== this.files.length && 0 !== this.centralDirRecords && 0 === this.files.length) throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length);}, readEndOfCentral: function () {var e = this.reader.lastIndexOfSignature(s.CENTRAL_DIRECTORY_END);if (e < 0) throw !this.isSignature(0, s.LOCAL_FILE_HEADER) ? new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html") : new Error("Corrupted zip: can't find end of central directory");this.reader.setIndex(e);var t = e;if (this.checkSignature(s.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === o.MAX_VALUE_16BITS || this.diskWithCentralDirStart === o.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === o.MAX_VALUE_16BITS || this.centralDirRecords === o.MAX_VALUE_16BITS || this.centralDirSize === o.MAX_VALUE_32BITS || this.centralDirOffset === o.MAX_VALUE_32BITS) {if (this.zip64 = !0, (e = this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");if (this.reader.setIndex(e), this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, s.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();}var r = this.centralDirOffset + this.centralDirSize;this.zip64 && (r += 20, r += 12 + this.zip64EndOfCentralSize);var n = t - r;if (n > 0) this.isSignature(t, s.CENTRAL_FILE_HEADER) || (this.reader.zero = n);else if (n < 0) throw new Error("Corrupted zip: missing " + Math.abs(n) + " bytes.");}, prepareReader: function (e) {this.reader = n(e);}, load: function (e) {this.prepareReader(e), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();} }, e.exports = l;}, "./node_modules/jszip/lib/zipEntry.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/reader/readerFor.js"), + o = r("./node_modules/jszip/lib/utils.js"), + s = r("./node_modules/jszip/lib/compressedObject.js"), + i = r("./node_modules/jszip/lib/crc32.js"), + a = r("./node_modules/jszip/lib/utf8.js"), + l = r("./node_modules/jszip/lib/compressions.js"), + u = r("./node_modules/jszip/lib/support.js");function c(e, t) {this.options = e, this.loadOptions = t;}c.prototype = { isEncrypted: function () {return 1 == (1 & this.bitFlag);}, useUTF8: function () {return 2048 == (2048 & this.bitFlag);}, readLocalPart: function (e) {var t, r;if (e.skip(22), this.fileNameLength = e.readInt(2), r = e.readInt(2), this.fileName = e.readData(this.fileNameLength), e.skip(r), -1 === this.compressedSize || -1 === this.uncompressedSize) throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");if (null === (t = function (e) {for (var t in l) if (l.hasOwnProperty(t) && l[t].magic === e) return l[t];return null;}(this.compressionMethod))) throw new Error("Corrupted zip : compression " + o.pretty(this.compressionMethod) + " unknown (inner file : " + o.transformTo("string", this.fileName) + ")");this.decompressed = new s(this.compressedSize, this.uncompressedSize, this.crc32, t, e.readData(this.compressedSize));}, readCentralPart: function (e) {this.versionMadeBy = e.readInt(2), e.skip(2), this.bitFlag = e.readInt(2), this.compressionMethod = e.readString(2), this.date = e.readDate(), this.crc32 = e.readInt(4), this.compressedSize = e.readInt(4), this.uncompressedSize = e.readInt(4);var t = e.readInt(2);if (this.extraFieldsLength = e.readInt(2), this.fileCommentLength = e.readInt(2), this.diskNumberStart = e.readInt(2), this.internalFileAttributes = e.readInt(2), this.externalFileAttributes = e.readInt(4), this.localHeaderOffset = e.readInt(4), this.isEncrypted()) throw new Error("Encrypted zip are not supported");e.skip(t), this.readExtraFields(e), this.parseZIP64ExtraField(e), this.fileComment = e.readData(this.fileCommentLength);}, processAttributes: function () {this.unixPermissions = null, this.dosPermissions = null;var e = this.versionMadeBy >> 8;this.dir = !!(16 & this.externalFileAttributes), 0 === e && (this.dosPermissions = 63 & this.externalFileAttributes), 3 === e && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || "/" !== this.fileNameStr.slice(-1) || (this.dir = !0);}, parseZIP64ExtraField: function (e) {if (this.extraFields[1]) {var t = n(this.extraFields[1].value);this.uncompressedSize === o.MAX_VALUE_32BITS && (this.uncompressedSize = t.readInt(8)), this.compressedSize === o.MAX_VALUE_32BITS && (this.compressedSize = t.readInt(8)), this.localHeaderOffset === o.MAX_VALUE_32BITS && (this.localHeaderOffset = t.readInt(8)), this.diskNumberStart === o.MAX_VALUE_32BITS && (this.diskNumberStart = t.readInt(4));}}, readExtraFields: function (e) {var t, + r, + n, + o = e.index + this.extraFieldsLength;for (this.extraFields || (this.extraFields = {}); e.index + 4 < o;) t = e.readInt(2), r = e.readInt(2), n = e.readData(r), this.extraFields[t] = { id: t, length: r, value: n };e.setIndex(o);}, handleUTF8: function () {var e = u.uint8array ? "uint8array" : "array";if (this.useUTF8()) this.fileNameStr = a.utf8decode(this.fileName), this.fileCommentStr = a.utf8decode(this.fileComment);else {var t = this.findExtraFieldUnicodePath();if (null !== t) this.fileNameStr = t;else {var r = o.transformTo(e, this.fileName);this.fileNameStr = this.loadOptions.decodeFileName(r);}var n = this.findExtraFieldUnicodeComment();if (null !== n) this.fileCommentStr = n;else {var s = o.transformTo(e, this.fileComment);this.fileCommentStr = this.loadOptions.decodeFileName(s);}}}, findExtraFieldUnicodePath: function () {var e = this.extraFields[28789];if (e) {var t = n(e.value);return 1 !== t.readInt(1) || i(this.fileName) !== t.readInt(4) ? null : a.utf8decode(t.readData(e.length - 5));}return null;}, findExtraFieldUnicodeComment: function () {var e = this.extraFields[25461];if (e) {var t = n(e.value);return 1 !== t.readInt(1) || i(this.fileComment) !== t.readInt(4) ? null : a.utf8decode(t.readData(e.length - 5));}return null;} }, e.exports = c;}, "./node_modules/jszip/lib/zipObject.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/jszip/lib/stream/StreamHelper.js"), + o = r("./node_modules/jszip/lib/stream/DataWorker.js"), + s = r("./node_modules/jszip/lib/utf8.js"), + i = r("./node_modules/jszip/lib/compressedObject.js"), + a = r("./node_modules/jszip/lib/stream/GenericWorker.js"), + l = function (e, t, r) {this.name = e, this.dir = r.dir, this.date = r.date, this.comment = r.comment, this.unixPermissions = r.unixPermissions, this.dosPermissions = r.dosPermissions, this._data = t, this._dataBinary = r.binary, this.options = { compression: r.compression, compressionOptions: r.compressionOptions };};l.prototype = { internalStream: function (e) {var t = null, + r = "string";try {if (!e) throw new Error("No output type specified.");var o = "string" === (r = e.toLowerCase()) || "text" === r;"binarystring" !== r && "text" !== r || (r = "string"), t = this._decompressWorker();var i = !this._dataBinary;i && !o && (t = t.pipe(new s.Utf8EncodeWorker())), !i && o && (t = t.pipe(new s.Utf8DecodeWorker()));} catch (e) {(t = new a("error")).error(e);}return new n(t, r, "");}, async: function (e, t) {return this.internalStream(e).accumulate(t);}, nodeStream: function (e, t) {return this.internalStream(e || "nodebuffer").toNodejsStream(t);}, _compressWorker: function (e, t) {if (this._data instanceof i && this._data.compression.magic === e.magic) return this._data.getCompressedWorker();var r = this._decompressWorker();return this._dataBinary || (r = r.pipe(new s.Utf8EncodeWorker())), i.createWorkerFrom(r, e, t);}, _decompressWorker: function () {return this._data instanceof i ? this._data.getContentWorker() : this._data instanceof a ? this._data : new o(this._data);} };for (var u = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"], c = function () {throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");}, d = 0; d < u.length; d++) l.prototype[u[d]] = c;e.exports = l;}, "./node_modules/keyboardevent-from-electron-accelerator/index.js": function (e, t) {const r = /^(CommandOrControl|CmdOrCtrl|Command|Cmd|Control|Ctrl|AltGr|Option|Alt|Shift|Super)/i, + n = /^(Plus|Space|Tab|Backspace|Delete|Insert|Return|Enter|Up|Down|Left|Right|Home|End|PageUp|PageDown|Escape|Esc|VolumeUp|VolumeDown|VolumeMute|MediaNextTrack|MediaPreviousTrack|MediaStop|MediaPlayPause|PrintScreen|F24|F23|F22|F21|F20|F19|F18|F17|F16|F15|F14|F13|F12|F11|F10|F9|F8|F7|F6|F5|F4|F3|F2|F1|[0-9A-Z)!@#$%^&*(:+<_>?~{|}";=,\-./`[\\\]'])/i, + o = {};function s({ + accelerator: e, + event: t + }, r) {switch (r) {case "command":case "cmd": + return function (e, t, r) {if ("darwin" !== process.platform) return o;if (t.metaKey) throw new Error("Double `Command` modifier specified.");return { event: Object.assign({}, t, { metaKey: !0 }), accelerator: e.slice(r.length) };}(e, t, r); + case "super": + return function (e, t, r) {if (t.metaKey) throw new Error("Double `Super` modifier specified.");return { event: Object.assign({}, t, { metaKey: !0 }), accelerator: e.slice(r.length) };}(e, t, r); + case "control":case "ctrl": + return function (e, t, r) {if (t.ctrlKey) throw new Error("Double `Control` modifier specified.");return { event: Object.assign({}, t, { ctrlKey: !0 }), accelerator: e.slice(r.length) };}(e, t, r); + case "commandorcontrol":case "cmdorctrl": + return function (e, t, r) {if ("darwin" === process.platform) {if (t.metaKey) throw new Error("Double `Command` modifier specified.");return { event: Object.assign({}, t, { metaKey: !0 }), accelerator: e.slice(r.length) };}if (t.ctrlKey) throw new Error("Double `Control` modifier specified.");return { event: Object.assign({}, t, { ctrlKey: !0 }), accelerator: e.slice(r.length) };}(e, t, r); + case "option":case "altgr":case "alt": + return function (e, t, r) {if ("option" === r && "darwin" !== process.platform) return o;if (t.altKey) throw new Error("Double `Alt` modifier specified.");return { event: Object.assign({}, t, { altKey: !0 }), accelerator: e.slice(r.length) };}(e, t, r); + case "shift": + return function (e, t, r) {if (t.shiftKey) throw new Error("Double `Shift` modifier specified.");return { event: Object.assign({}, t, { shiftKey: !0 }), accelerator: e.slice(r.length) };}(e, t, r); + default: + console.error(r); + }}function i({ + accelerator: e, + event: t + }) {return { event: t, accelerator: e.trim().slice(1) };}const a = { 0: "Digit0", 1: "Digit1", 2: "Digit2", 3: "Digit3", 4: "Digit4", 5: "Digit5", 6: "Digit6", 7: "Digit7", 8: "Digit8", 9: "Digit9", "-": "Minus", "=": "Equal", Q: "KeyQ", W: "KeyW", E: "KeyE", R: "KeyR", T: "KeyT", Y: "KeyY", U: "KeyU", I: "KeyI", O: "KeyO", P: "KeyP", "[": "BracketLeft", "]": "BracketRight", A: "KeyA", S: "KeyS", D: "KeyD", F: "KeyF", G: "KeyG", H: "KeyH", J: "KeyJ", K: "KeyK", L: "KeyL", ";": "Semicolon", "'": "Quote", "`": "Backquote", "/": "Backslash", Z: "KeyZ", X: "KeyX", C: "KeyC", V: "KeyV", B: "KeyB", N: "KeyN", M: "KeyM", ",": "Comma", ".": "Period", "\\": "Slash", " ": "Space" };function l({ + accelerator: e, + event: t + }, r) {if (r.length > 1 || t.key) throw new Error(`Unvalid keycode \`${r}\`.`);const n = r.toUpperCase() in a ? a[r.toUpperCase()] : null;return { event: Object.assign({}, t, { key: r }, n ? { code: n } : null), accelerator: e.trim().slice(r.length) };}const u = Object.assign(Object.create(null), { plus: "Add", space: "Space", tab: "Tab", backspace: "Backspace", delete: "Delete", insert: "Insert", return: "Return", enter: "Return", up: "ArrowUp", down: "ArrowDown", left: "ArrowLeft", right: "ArrowRight", home: "Home", end: "End", pageup: "PageUp", pagedown: "PageDown", escape: "Escape", esc: "Escape", volumeup: "AudioVolumeUp", volumedown: "AudioVolumeDown", volumemute: "AudioVolumeMute", medianexttrack: "MediaTrackNext", mediaprevioustrack: "MediaTrackPrevious", mediastop: "MediaStop", mediaplaypause: "MediaPlayPause", printscreen: "PrintScreen" });for (let e = 1; e <= 24; e++) u["f" + e] = "F" + e;function c({ + accelerator: e, + event: t + }, { + code: r, + key: n + }) {if (t.code) throw new Error(`Duplicated keycode \`${n}\`.`);return { event: Object.assign({}, t, { key: n }, r ? { code: r } : null), accelerator: e.trim().slice(n && n.length || 0) };}e.exports = { UNSUPPORTED: o, reduceModifier: s, reducePlus: i, reduceKey: l, reduceCode: c, toKeyEvent: function (e) {let t = { accelerator: e, event: {} };for (; "" !== t.accelerator;) {const e = t.accelerator.match(r);if (e) {if (t = s(t, e[0].toLowerCase()), t === o) return { unsupportedKeyForPlatform: !0 };} else if ("+" === t.accelerator.trim()[0]) t = i(t);else {const e = t.accelerator.match(n);if (!e) throw new Error(`Unvalid accelerator: "${t.accelerator}"`);{const r = e[0].toLowerCase();t = r in u ? c(t, { code: u[r], key: r }) : l(t, r);}}}return t.event;} };}, "./node_modules/keyboardevents-areequal/index.js": function (e, t, r) {"use strict"; + function n(e) {return "string" != typeof e ? e : e.toLowerCase();}e.exports = function (e, t) {if (e === t) return !0;for (const r of ["altKey", "ctrlKey", "shiftKey", "metaKey"]) {const [n, o] = [e[r], t[r]];if (Boolean(n) !== Boolean(o)) return !1;}return n(e.key) === n(t.key) && void 0 !== e.key || e.code === t.code && void 0 !== e.code;};}, "./node_modules/lie/lib/index.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/immediate/lib/index.js");function o() {}var s = {}, + i = ["REJECTED"], + a = ["FULFILLED"], + l = ["PENDING"];if (!process.browser) var u = ["UNHANDLED"];function c(e) {if ("function" != typeof e) throw new TypeError("resolver must be a function");this.state = l, this.queue = [], this.outcome = void 0, process.browser || (this.handled = u), e !== o && p(this, e);}function d(e, t, r) {this.promise = e, "function" == typeof t && (this.onFulfilled = t, this.callFulfilled = this.otherCallFulfilled), "function" == typeof r && (this.onRejected = r, this.callRejected = this.otherCallRejected);}function h(e, t, r) {n(function () {var n;try {n = t(r);} catch (t) {return s.reject(e, t);}n === e ? s.reject(e, new TypeError("Cannot resolve promise with itself")) : s.resolve(e, n);});}function f(e) {var t = e && e.then;if (e && ("object" == typeof e || "function" == typeof e) && "function" == typeof t) return function () {t.apply(e, arguments);};}function p(e, t) {var r = !1;function n(t) {r || (r = !0, s.reject(e, t));}function o(t) {r || (r = !0, s.resolve(e, t));}var i = m(function () {t(o, n);});"error" === i.status && n(i.value);}function m(e, t) {var r = {};try {r.value = e(t), r.status = "success";} catch (e) {r.status = "error", r.value = e;}return r;}e.exports = c, c.prototype.finally = function (e) {if ("function" != typeof e) return this;var t = this.constructor;return this.then(function (r) {return t.resolve(e()).then(function () {return r;});}, function (r) {return t.resolve(e()).then(function () {throw r;});});}, c.prototype.catch = function (e) {return this.then(null, e);}, c.prototype.then = function (e, t) {if ("function" != typeof e && this.state === a || "function" != typeof t && this.state === i) return this;var r = new this.constructor(o);(process.browser || this.handled === u && (this.handled = null), this.state !== l) ? h(r, this.state === a ? e : t, this.outcome) : this.queue.push(new d(r, e, t));return r;}, d.prototype.callFulfilled = function (e) {s.resolve(this.promise, e);}, d.prototype.otherCallFulfilled = function (e) {h(this.promise, this.onFulfilled, e);}, d.prototype.callRejected = function (e) {s.reject(this.promise, e);}, d.prototype.otherCallRejected = function (e) {h(this.promise, this.onRejected, e);}, s.resolve = function (e, t) {var r = m(f, t);if ("error" === r.status) return s.reject(e, r.value);var n = r.value;if (n) p(e, n);else {e.state = a, e.outcome = t;for (var o = -1, i = e.queue.length; ++o < i;) e.queue[o].callFulfilled(t);}return e;}, s.reject = function (e, t) {e.state = i, e.outcome = t, process.browser || e.handled === u && n(function () {e.handled === u && process.emit("unhandledRejection", t, e);});for (var r = -1, o = e.queue.length; ++r < o;) e.queue[r].callRejected(t);return e;}, c.resolve = function (e) {if (e instanceof this) return e;return s.resolve(new this(o), e);}, c.reject = function (e) {var t = new this(o);return s.reject(t, e);}, c.all = function (e) {var t = this;if ("[object Array]" !== Object.prototype.toString.call(e)) return this.reject(new TypeError("must be an array"));var r = e.length, + n = !1;if (!r) return this.resolve([]);var i = new Array(r), + a = 0, + l = -1, + u = new this(o);for (; ++l < r;) c(e[l], l);return u;function c(e, o) {t.resolve(e).then(function (e) {i[o] = e, ++a !== r || n || (n = !0, s.resolve(u, i));}, function (e) {n || (n = !0, s.reject(u, e));});}}, c.race = function (e) {var t = this;if ("[object Array]" !== Object.prototype.toString.call(e)) return this.reject(new TypeError("must be an array"));var r = e.length, + n = !1;if (!r) return this.resolve([]);var i = -1, + a = new this(o);for (; ++i < r;) l = e[i], t.resolve(l).then(function (e) {n || (n = !0, s.resolve(a, e));}, function (e) {n || (n = !0, s.reject(a, e));});var l;return a;};}, "./node_modules/minimatch/minimatch.js": function (e, t, r) {e.exports = c, c.Minimatch = d;var n = { sep: "/" };try {n = r("path");} catch (e) {}var o = c.GLOBSTAR = d.GLOBSTAR = {}, + s = r("./node_modules/brace-expansion/index.js"), + i = { "!": { open: "(?:(?!(?:", close: "))[^/]*?)" }, "?": { open: "(?:", close: ")?" }, "+": { open: "(?:", close: ")+" }, "*": { open: "(?:", close: ")*" }, "@": { open: "(?:", close: ")" } }, + a = "().*{}+?[]^$\\!".split("").reduce(function (e, t) {return e[t] = !0, e;}, {});var l = /\/+/;function u(e, t) {e = e || {}, t = t || {};var r = {};return Object.keys(t).forEach(function (e) {r[e] = t[e];}), Object.keys(e).forEach(function (t) {r[t] = e[t];}), r;}function c(e, t, r) {if ("string" != typeof t) throw new TypeError("glob pattern string required");return r || (r = {}), !(!r.nocomment && "#" === t.charAt(0)) && ("" === t.trim() ? "" === e : new d(t, r).match(e));}function d(e, t) {if (!(this instanceof d)) return new d(e, t);if ("string" != typeof e) throw new TypeError("glob pattern string required");t || (t = {}), e = e.trim(), "/" !== n.sep && (e = e.split(n.sep).join("/")), this.options = t, this.set = [], this.pattern = e, this.regexp = null, this.negate = !1, this.comment = !1, this.empty = !1, this.make();}function h(e, t) {if (t || (t = this instanceof d ? this.options : {}), void 0 === (e = void 0 === e ? this.pattern : e)) throw new TypeError("undefined pattern");return t.nobrace || !e.match(/\{.*\}/) ? [e] : s(e);}c.filter = function (e, t) {return t = t || {}, function (r, n, o) {return c(r, e, t);};}, c.defaults = function (e) {if (!e || !Object.keys(e).length) return c;var t = c, + r = function (r, n, o) {return t.minimatch(r, n, u(e, o));};return r.Minimatch = function (r, n) {return new t.Minimatch(r, u(e, n));}, r;}, d.defaults = function (e) {return e && Object.keys(e).length ? c.defaults(e).Minimatch : d;}, d.prototype.debug = function () {}, d.prototype.make = function () {if (this._made) return;var e = this.pattern, + t = this.options;if (!t.nocomment && "#" === e.charAt(0)) return void (this.comment = !0);if (!e) return void (this.empty = !0);this.parseNegate();var r = this.globSet = this.braceExpand();t.debug && (this.debug = console.error);this.debug(this.pattern, r), r = this.globParts = r.map(function (e) {return e.split(l);}), this.debug(this.pattern, r), r = r.map(function (e, t, r) {return e.map(this.parse, this);}, this), this.debug(this.pattern, r), r = r.filter(function (e) {return -1 === e.indexOf(!1);}), this.debug(this.pattern, r), this.set = r;}, d.prototype.parseNegate = function () {var e = this.pattern, + t = !1, + r = this.options, + n = 0;if (r.nonegate) return;for (var o = 0, s = e.length; o < s && "!" === e.charAt(o); o++) t = !t, n++;n && (this.pattern = e.substr(n));this.negate = t;}, c.braceExpand = function (e, t) {return h(e, t);}, d.prototype.braceExpand = h, d.prototype.parse = function (e, t) {if (e.length > 65536) throw new TypeError("pattern is too long");var r = this.options;if (!r.noglobstar && "**" === e) return o;if ("" === e) return "";var n, + s = "", + l = !!r.nocase, + u = !1, + c = [], + d = [], + h = !1, + p = -1, + m = -1, + g = "." === e.charAt(0) ? "" : r.dot ? "(?!(?:^|\\/)\\.{1,2}(?:$|\\/))" : "(?!\\.)", + _ = this;function v() {if (n) {switch (n) {case "*": + s += "[^/]*?", l = !0; + break; + case "?": + s += "[^/]", l = !0; + break; + default: + s += "\\" + n; + }_.debug("clearStateChar %j %j", n, s), n = !1;}}for (var b, y = 0, w = e.length; y < w && (b = e.charAt(y)); y++) if (this.debug("%s\t%s %s %j", e, y, s, b), u && a[b]) s += "\\" + b, u = !1;else switch (b) {case "/": + return !1; + case "\\": + v(), u = !0; + continue; + case "?":case "*":case "+":case "@":case "!": + if (this.debug("%s\t%s %s %j <-- stateChar", e, y, s, b), h) {this.debug(" in class"), "!" === b && y === m + 1 && (b = "^"), s += b;continue;} + + _.debug("call clearStateChar %j", n), v(), n = b, r.noext && v(); + continue; + case "(": + if (h) {s += "(";continue;} + + if (!n) {s += "\\(";continue;} + + c.push({ type: n, start: y - 1, reStart: s.length, open: i[n].open, close: i[n].close }), s += "!" === n ? "(?:(?!(?:" : "(?:", this.debug("plType %j %j", n, s), n = !1; + continue; + case ")": + if (h || !c.length) {s += "\\)";continue;} + + v(), l = !0; + var j = c.pop(); + s += j.close, "!" === j.type && d.push(j), j.reEnd = s.length; + continue; + case "|": + if (h || !c.length || u) {s += "\\|", u = !1;continue;} + + v(), s += "|"; + continue; + case "[": + if (v(), h) {s += "\\" + b;continue;} + + h = !0, m = y, p = s.length, s += b; + continue; + case "]": + if (y === m + 1 || !h) {s += "\\" + b, u = !1;continue;} + + if (h) {var E = e.substring(m + 1, y);try {RegExp("[" + E + "]");} catch (e) {var k = this.parse(E, f);s = s.substr(0, p) + "\\[" + k[0] + "\\]", l = l || k[1], h = !1;continue;}} + + l = !0, h = !1, s += b; + continue; + default: + v(), u ? u = !1 : !a[b] || "^" === b && h || (s += "\\"), s += b; + }h && (E = e.substr(m + 1), k = this.parse(E, f), s = s.substr(0, p) + "\\[" + k[0], l = l || k[1]);for (j = c.pop(); j; j = c.pop()) {var S = s.slice(j.reStart + j.open.length);this.debug("setting tail", s, j), S = S.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (e, t, r) {return r || (r = "\\"), t + t + r + "|";}), this.debug("tail=%j\n %s", S, S, j, s);var C = "*" === j.type ? "[^/]*?" : "?" === j.type ? "[^/]" : "\\" + j.type;l = !0, s = s.slice(0, j.reStart) + C + "\\(" + S;}v(), u && (s += "\\\\");var x = !1;switch (s.charAt(0)) {case ".":case "[":case "(": + x = !0; + }for (var O = d.length - 1; O > -1; O--) {var A = d[O], + R = s.slice(0, A.reStart), + I = s.slice(A.reStart, A.reEnd - 8), + T = s.slice(A.reEnd - 8, A.reEnd), + L = s.slice(A.reEnd);T += L;var N = R.split("(").length - 1, + z = L;for (y = 0; y < N; y++) z = z.replace(/\)[+*?]?/, "");var M = "";"" === (L = z) && t !== f && (M = "$"), s = R + I + L + M + T;}"" !== s && l && (s = "(?=.)" + s);x && (s = g + s);if (t === f) return [s, l];if (!l) return function (e) {return e.replace(/\\(.)/g, "$1");}(e);var D = r.nocase ? "i" : "";try {var P = new RegExp("^" + s + "$", D);} catch (e) {return new RegExp("$.");}return P._glob = e, P._src = s, P;};var f = {};c.makeRe = function (e, t) {return new d(e, t || {}).makeRe();}, d.prototype.makeRe = function () {if (this.regexp || !1 === this.regexp) return this.regexp;var e = this.set;if (!e.length) return this.regexp = !1, this.regexp;var t = this.options, + r = t.noglobstar ? "[^/]*?" : t.dot ? "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?" : "(?:(?!(?:\\/|^)\\.).)*?", + n = t.nocase ? "i" : "", + s = e.map(function (e) {return e.map(function (e) {return e === o ? r : "string" == typeof e ? function (e) {return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");}(e) : e._src;}).join("\\/");}).join("|");s = "^(?:" + s + ")$", this.negate && (s = "^(?!" + s + ").*$");try {this.regexp = new RegExp(s, n);} catch (e) {this.regexp = !1;}return this.regexp;}, c.match = function (e, t, r) {var n = new d(t, r = r || {});return e = e.filter(function (e) {return n.match(e);}), n.options.nonull && !e.length && e.push(t), e;}, d.prototype.match = function (e, t) {if (this.debug("match", e, this.pattern), this.comment) return !1;if (this.empty) return "" === e;if ("/" === e && t) return !0;var r = this.options;"/" !== n.sep && (e = e.split(n.sep).join("/"));e = e.split(l), this.debug(this.pattern, "split", e);var o, + s, + i = this.set;for (this.debug(this.pattern, "set", i), s = e.length - 1; s >= 0 && !(o = e[s]); s--);for (s = 0; s < i.length; s++) {var a = i[s], + u = e;if (r.matchBase && 1 === a.length && (u = [o]), this.matchOne(u, a, t)) return !!r.flipNegate || !this.negate;}return !r.flipNegate && this.negate;}, d.prototype.matchOne = function (e, t, r) {var n = this.options;this.debug("matchOne", { this: this, file: e, pattern: t }), this.debug("matchOne", e.length, t.length);for (var s = 0, i = 0, a = e.length, l = t.length; s < a && i < l; s++, i++) {this.debug("matchOne loop");var u, + c = t[i], + d = e[s];if (this.debug(t, c, d), !1 === c) return !1;if (c === o) {this.debug("GLOBSTAR", [t, c, d]);var h = s, + f = i + 1;if (f === l) {for (this.debug("** at the end"); s < a; s++) if ("." === e[s] || ".." === e[s] || !n.dot && "." === e[s].charAt(0)) return !1;return !0;}for (; h < a;) {var p = e[h];if (this.debug("\nglobstar while", e, h, t, f, p), this.matchOne(e.slice(h), t.slice(f), r)) return this.debug("globstar found match!", h, a, p), !0;if ("." === p || ".." === p || !n.dot && "." === p.charAt(0)) {this.debug("dot detected!", e, h, t, f);break;}this.debug("globstar swallow a segment, and continue"), h++;}return !(!r || (this.debug("\n>>> no match, partial?", e, h, t, f), h !== a));}if ("string" == typeof c ? (u = n.nocase ? d.toLowerCase() === c.toLowerCase() : d === c, this.debug("string match", c, d, u)) : (u = d.match(c), this.debug("pattern match", c, d, u)), !u) return !1;}if (s === a && i === l) return !0;if (s === a) return r;if (i === l) return s === a - 1 && "" === e[s];throw new Error("wtf?");};}, "./node_modules/ms/index.js": function (e, t) {var r = 1e3, + n = 6e4, + o = 60 * n, + s = 24 * o;function i(e, t, r, n) {var o = t >= 1.5 * r;return Math.round(e / r) + " " + n + (o ? "s" : "");}e.exports = function (e, t) {t = t || {};var a = typeof e;if ("string" === a && e.length > 0) return function (e) {if ((e = String(e)).length > 100) return;var t = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if (!t) return;var i = parseFloat(t[1]);switch ((t[2] || "ms").toLowerCase()) {case "years":case "year":case "yrs":case "yr":case "y": + return 315576e5 * i; + case "weeks":case "week":case "w": + return 6048e5 * i; + case "days":case "day":case "d": + return i * s; + case "hours":case "hour":case "hrs":case "hr":case "h": + return i * o; + case "minutes":case "minute":case "mins":case "min":case "m": + return i * n; + case "seconds":case "second":case "secs":case "sec":case "s": + return i * r; + case "milliseconds":case "millisecond":case "msecs":case "msec":case "ms": + return i; + default: + return; + }}(e);if ("number" === a && isFinite(e)) return t.long ? function (e) {var t = Math.abs(e);if (t >= s) return i(e, t, s, "day");if (t >= o) return i(e, t, o, "hour");if (t >= n) return i(e, t, n, "minute");if (t >= r) return i(e, t, r, "second");return e + " ms";}(e) : function (e) {var t = Math.abs(e);if (t >= s) return Math.round(e / s) + "d";if (t >= o) return Math.round(e / o) + "h";if (t >= n) return Math.round(e / n) + "m";if (t >= r) return Math.round(e / r) + "s";return e + "ms";}(e);throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(e));};}, "./node_modules/once/once.js": function (e, t, r) {var n = r("./node_modules/wrappy/wrappy.js");function o(e) {var t = function () {return t.called ? t.value : (t.called = !0, t.value = e.apply(this, arguments));};return t.called = !1, t;}function s(e) {var t = function () {if (t.called) throw new Error(t.onceError);return t.called = !0, t.value = e.apply(this, arguments);}, + r = e.name || "Function wrapped with `once`";return t.onceError = r + " shouldn't be called more than once", t.called = !1, t;}e.exports = n(o), e.exports.strict = n(s), o.proto = o(function () {Object.defineProperty(Function.prototype, "once", { value: function () {return o(this);}, configurable: !0 }), Object.defineProperty(Function.prototype, "onceStrict", { value: function () {return s(this);}, configurable: !0 });});}, "./node_modules/pako/index.js": function (e, t, r) {"use strict"; + var n = {};(0, r("./node_modules/pako/lib/utils/common.js").assign)(n, r("./node_modules/pako/lib/deflate.js"), r("./node_modules/pako/lib/inflate.js"), r("./node_modules/pako/lib/zlib/constants.js")), e.exports = n;}, "./node_modules/pako/lib/deflate.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/pako/lib/zlib/deflate.js"), + o = r("./node_modules/pako/lib/utils/common.js"), + s = r("./node_modules/pako/lib/utils/strings.js"), + i = r("./node_modules/pako/lib/zlib/messages.js"), + a = r("./node_modules/pako/lib/zlib/zstream.js"), + l = Object.prototype.toString;function u(e) {if (!(this instanceof u)) return new u(e);this.options = o.assign({ level: -1, method: 8, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: 0, to: "" }, e || {});var t = this.options;t.raw && t.windowBits > 0 ? t.windowBits = -t.windowBits : t.gzip && t.windowBits > 0 && t.windowBits < 16 && (t.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new a(), this.strm.avail_out = 0;var r = n.deflateInit2(this.strm, t.level, t.method, t.windowBits, t.memLevel, t.strategy);if (0 !== r) throw new Error(i[r]);if (t.header && n.deflateSetHeader(this.strm, t.header), t.dictionary) {var c;if (c = "string" == typeof t.dictionary ? s.string2buf(t.dictionary) : "[object ArrayBuffer]" === l.call(t.dictionary) ? new Uint8Array(t.dictionary) : t.dictionary, 0 !== (r = n.deflateSetDictionary(this.strm, c))) throw new Error(i[r]);this._dict_set = !0;}}function c(e, t) {var r = new u(t);if (r.push(e, !0), r.err) throw r.msg || i[r.err];return r.result;}u.prototype.push = function (e, t) {var r, + i, + a = this.strm, + u = this.options.chunkSize;if (this.ended) return !1;i = t === ~~t ? t : !0 === t ? 4 : 0, "string" == typeof e ? a.input = s.string2buf(e) : "[object ArrayBuffer]" === l.call(e) ? a.input = new Uint8Array(e) : a.input = e, a.next_in = 0, a.avail_in = a.input.length;do {if (0 === a.avail_out && (a.output = new o.Buf8(u), a.next_out = 0, a.avail_out = u), 1 !== (r = n.deflate(a, i)) && 0 !== r) return this.onEnd(r), this.ended = !0, !1;0 !== a.avail_out && (0 !== a.avail_in || 4 !== i && 2 !== i) || ("string" === this.options.to ? this.onData(s.buf2binstring(o.shrinkBuf(a.output, a.next_out))) : this.onData(o.shrinkBuf(a.output, a.next_out)));} while ((a.avail_in > 0 || 0 === a.avail_out) && 1 !== r);return 4 === i ? (r = n.deflateEnd(this.strm), this.onEnd(r), this.ended = !0, 0 === r) : 2 !== i || (this.onEnd(0), a.avail_out = 0, !0);}, u.prototype.onData = function (e) {this.chunks.push(e);}, u.prototype.onEnd = function (e) {0 === e && ("string" === this.options.to ? this.result = this.chunks.join("") : this.result = o.flattenChunks(this.chunks)), this.chunks = [], this.err = e, this.msg = this.strm.msg;}, t.Deflate = u, t.deflate = c, t.deflateRaw = function (e, t) {return (t = t || {}).raw = !0, c(e, t);}, t.gzip = function (e, t) {return (t = t || {}).gzip = !0, c(e, t);};}, "./node_modules/pako/lib/inflate.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/pako/lib/zlib/inflate.js"), + o = r("./node_modules/pako/lib/utils/common.js"), + s = r("./node_modules/pako/lib/utils/strings.js"), + i = r("./node_modules/pako/lib/zlib/constants.js"), + a = r("./node_modules/pako/lib/zlib/messages.js"), + l = r("./node_modules/pako/lib/zlib/zstream.js"), + u = r("./node_modules/pako/lib/zlib/gzheader.js"), + c = Object.prototype.toString;function d(e) {if (!(this instanceof d)) return new d(e);this.options = o.assign({ chunkSize: 16384, windowBits: 0, to: "" }, e || {});var t = this.options;t.raw && t.windowBits >= 0 && t.windowBits < 16 && (t.windowBits = -t.windowBits, 0 === t.windowBits && (t.windowBits = -15)), !(t.windowBits >= 0 && t.windowBits < 16) || e && e.windowBits || (t.windowBits += 32), t.windowBits > 15 && t.windowBits < 48 && 0 == (15 & t.windowBits) && (t.windowBits |= 15), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new l(), this.strm.avail_out = 0;var r = n.inflateInit2(this.strm, t.windowBits);if (r !== i.Z_OK) throw new Error(a[r]);if (this.header = new u(), n.inflateGetHeader(this.strm, this.header), t.dictionary && ("string" == typeof t.dictionary ? t.dictionary = s.string2buf(t.dictionary) : "[object ArrayBuffer]" === c.call(t.dictionary) && (t.dictionary = new Uint8Array(t.dictionary)), t.raw && (r = n.inflateSetDictionary(this.strm, t.dictionary)) !== i.Z_OK)) throw new Error(a[r]);}function h(e, t) {var r = new d(t);if (r.push(e, !0), r.err) throw r.msg || a[r.err];return r.result;}d.prototype.push = function (e, t) {var r, + a, + l, + u, + d, + h = this.strm, + f = this.options.chunkSize, + p = this.options.dictionary, + m = !1;if (this.ended) return !1;a = t === ~~t ? t : !0 === t ? i.Z_FINISH : i.Z_NO_FLUSH, "string" == typeof e ? h.input = s.binstring2buf(e) : "[object ArrayBuffer]" === c.call(e) ? h.input = new Uint8Array(e) : h.input = e, h.next_in = 0, h.avail_in = h.input.length;do {if (0 === h.avail_out && (h.output = new o.Buf8(f), h.next_out = 0, h.avail_out = f), (r = n.inflate(h, i.Z_NO_FLUSH)) === i.Z_NEED_DICT && p && (r = n.inflateSetDictionary(this.strm, p)), r === i.Z_BUF_ERROR && !0 === m && (r = i.Z_OK, m = !1), r !== i.Z_STREAM_END && r !== i.Z_OK) return this.onEnd(r), this.ended = !0, !1;h.next_out && (0 !== h.avail_out && r !== i.Z_STREAM_END && (0 !== h.avail_in || a !== i.Z_FINISH && a !== i.Z_SYNC_FLUSH) || ("string" === this.options.to ? (l = s.utf8border(h.output, h.next_out), u = h.next_out - l, d = s.buf2string(h.output, l), h.next_out = u, h.avail_out = f - u, u && o.arraySet(h.output, h.output, l, u, 0), this.onData(d)) : this.onData(o.shrinkBuf(h.output, h.next_out)))), 0 === h.avail_in && 0 === h.avail_out && (m = !0);} while ((h.avail_in > 0 || 0 === h.avail_out) && r !== i.Z_STREAM_END);return r === i.Z_STREAM_END && (a = i.Z_FINISH), a === i.Z_FINISH ? (r = n.inflateEnd(this.strm), this.onEnd(r), this.ended = !0, r === i.Z_OK) : a !== i.Z_SYNC_FLUSH || (this.onEnd(i.Z_OK), h.avail_out = 0, !0);}, d.prototype.onData = function (e) {this.chunks.push(e);}, d.prototype.onEnd = function (e) {e === i.Z_OK && ("string" === this.options.to ? this.result = this.chunks.join("") : this.result = o.flattenChunks(this.chunks)), this.chunks = [], this.err = e, this.msg = this.strm.msg;}, t.Inflate = d, t.inflate = h, t.inflateRaw = function (e, t) {return (t = t || {}).raw = !0, h(e, t);}, t.ungzip = h;}, "./node_modules/pako/lib/utils/common.js": function (e, t, r) {"use strict"; + var n = "undefined" != typeof Uint8Array && "undefined" != typeof Uint16Array && "undefined" != typeof Int32Array;function o(e, t) {return Object.prototype.hasOwnProperty.call(e, t);}t.assign = function (e) {for (var t = Array.prototype.slice.call(arguments, 1); t.length;) {var r = t.shift();if (r) {if ("object" != typeof r) throw new TypeError(r + "must be non-object");for (var n in r) o(r, n) && (e[n] = r[n]);}}return e;}, t.shrinkBuf = function (e, t) {return e.length === t ? e : e.subarray ? e.subarray(0, t) : (e.length = t, e);};var s = { arraySet: function (e, t, r, n, o) {if (t.subarray && e.subarray) e.set(t.subarray(r, r + n), o);else for (var s = 0; s < n; s++) e[o + s] = t[r + s];}, flattenChunks: function (e) {var t, r, n, o, s, i;for (n = 0, t = 0, r = e.length; t < r; t++) n += e[t].length;for (i = new Uint8Array(n), o = 0, t = 0, r = e.length; t < r; t++) s = e[t], i.set(s, o), o += s.length;return i;} }, + i = { arraySet: function (e, t, r, n, o) {for (var s = 0; s < n; s++) e[o + s] = t[r + s];}, flattenChunks: function (e) {return [].concat.apply([], e);} };t.setTyped = function (e) {e ? (t.Buf8 = Uint8Array, t.Buf16 = Uint16Array, t.Buf32 = Int32Array, t.assign(t, s)) : (t.Buf8 = Array, t.Buf16 = Array, t.Buf32 = Array, t.assign(t, i));}, t.setTyped(n);}, "./node_modules/pako/lib/utils/strings.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/pako/lib/utils/common.js"), + o = !0, + s = !0;try {String.fromCharCode.apply(null, [0]);} catch (e) {o = !1;}try {String.fromCharCode.apply(null, new Uint8Array(1));} catch (e) {s = !1;}for (var i = new n.Buf8(256), a = 0; a < 256; a++) i[a] = a >= 252 ? 6 : a >= 248 ? 5 : a >= 240 ? 4 : a >= 224 ? 3 : a >= 192 ? 2 : 1;function l(e, t) {if (t < 65534 && (e.subarray && s || !e.subarray && o)) return String.fromCharCode.apply(null, n.shrinkBuf(e, t));for (var r = "", i = 0; i < t; i++) r += String.fromCharCode(e[i]);return r;}i[254] = i[254] = 1, t.string2buf = function (e) {var t, + r, + o, + s, + i, + a = e.length, + l = 0;for (s = 0; s < a; s++) 55296 == (64512 & (r = e.charCodeAt(s))) && s + 1 < a && 56320 == (64512 & (o = e.charCodeAt(s + 1))) && (r = 65536 + (r - 55296 << 10) + (o - 56320), s++), l += r < 128 ? 1 : r < 2048 ? 2 : r < 65536 ? 3 : 4;for (t = new n.Buf8(l), i = 0, s = 0; i < l; s++) 55296 == (64512 & (r = e.charCodeAt(s))) && s + 1 < a && 56320 == (64512 & (o = e.charCodeAt(s + 1))) && (r = 65536 + (r - 55296 << 10) + (o - 56320), s++), r < 128 ? t[i++] = r : r < 2048 ? (t[i++] = 192 | r >>> 6, t[i++] = 128 | 63 & r) : r < 65536 ? (t[i++] = 224 | r >>> 12, t[i++] = 128 | r >>> 6 & 63, t[i++] = 128 | 63 & r) : (t[i++] = 240 | r >>> 18, t[i++] = 128 | r >>> 12 & 63, t[i++] = 128 | r >>> 6 & 63, t[i++] = 128 | 63 & r);return t;}, t.buf2binstring = function (e) {return l(e, e.length);}, t.binstring2buf = function (e) {for (var t = new n.Buf8(e.length), r = 0, o = t.length; r < o; r++) t[r] = e.charCodeAt(r);return t;}, t.buf2string = function (e, t) {var r, + n, + o, + s, + a = t || e.length, + u = new Array(2 * a);for (n = 0, r = 0; r < a;) if ((o = e[r++]) < 128) u[n++] = o;else if ((s = i[o]) > 4) u[n++] = 65533, r += s - 1;else {for (o &= 2 === s ? 31 : 3 === s ? 15 : 7; s > 1 && r < a;) o = o << 6 | 63 & e[r++], s--;s > 1 ? u[n++] = 65533 : o < 65536 ? u[n++] = o : (o -= 65536, u[n++] = 55296 | o >> 10 & 1023, u[n++] = 56320 | 1023 & o);}return l(u, n);}, t.utf8border = function (e, t) {var r;for ((t = t || e.length) > e.length && (t = e.length), r = t - 1; r >= 0 && 128 == (192 & e[r]);) r--;return r < 0 || 0 === r ? t : r + i[e[r]] > t ? r : t;};}, "./node_modules/pako/lib/zlib/adler32.js": function (e, t, r) {"use strict"; + e.exports = function (e, t, r, n) {for (var o = 65535 & e | 0, s = e >>> 16 & 65535 | 0, i = 0; 0 !== r;) {r -= i = r > 2e3 ? 2e3 : r;do {s = s + (o = o + t[n++] | 0) | 0;} while (--i);o %= 65521, s %= 65521;}return o | s << 16 | 0;};}, "./node_modules/pako/lib/zlib/constants.js": function (e, t, r) {"use strict"; + e.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 };}, "./node_modules/pako/lib/zlib/crc32.js": function (e, t, r) {"use strict"; + var n = function () {for (var e, t = [], r = 0; r < 256; r++) {e = r;for (var n = 0; n < 8; n++) e = 1 & e ? 3988292384 ^ e >>> 1 : e >>> 1;t[r] = e;}return t;}();e.exports = function (e, t, r, o) {var s = n, + i = o + r;e ^= -1;for (var a = o; a < i; a++) e = e >>> 8 ^ s[255 & (e ^ t[a])];return -1 ^ e;};}, "./node_modules/pako/lib/zlib/deflate.js": function (e, t, r) {"use strict"; + var n, + o = r("./node_modules/pako/lib/utils/common.js"), + s = r("./node_modules/pako/lib/zlib/trees.js"), + i = r("./node_modules/pako/lib/zlib/adler32.js"), + a = r("./node_modules/pako/lib/zlib/crc32.js"), + l = r("./node_modules/pako/lib/zlib/messages.js");function u(e, t) {return e.msg = l[t], t;}function c(e) {return (e << 1) - (e > 4 ? 9 : 0);}function d(e) {for (var t = e.length; --t >= 0;) e[t] = 0;}function h(e) {var t = e.state, + r = t.pending;r > e.avail_out && (r = e.avail_out), 0 !== r && (o.arraySet(e.output, t.pending_buf, t.pending_out, r, e.next_out), e.next_out += r, t.pending_out += r, e.total_out += r, e.avail_out -= r, t.pending -= r, 0 === t.pending && (t.pending_out = 0));}function f(e, t) {s._tr_flush_block(e, e.block_start >= 0 ? e.block_start : -1, e.strstart - e.block_start, t), e.block_start = e.strstart, h(e.strm);}function p(e, t) {e.pending_buf[e.pending++] = t;}function m(e, t) {e.pending_buf[e.pending++] = t >>> 8 & 255, e.pending_buf[e.pending++] = 255 & t;}function g(e, t) {var r, + n, + o = e.max_chain_length, + s = e.strstart, + i = e.prev_length, + a = e.nice_match, + l = e.strstart > e.w_size - 262 ? e.strstart - (e.w_size - 262) : 0, + u = e.window, + c = e.w_mask, + d = e.prev, + h = e.strstart + 258, + f = u[s + i - 1], + p = u[s + i];e.prev_length >= e.good_match && (o >>= 2), a > e.lookahead && (a = e.lookahead);do {if (u[(r = t) + i] === p && u[r + i - 1] === f && u[r] === u[s] && u[++r] === u[s + 1]) {s += 2, r++;do {} while (u[++s] === u[++r] && u[++s] === u[++r] && u[++s] === u[++r] && u[++s] === u[++r] && u[++s] === u[++r] && u[++s] === u[++r] && u[++s] === u[++r] && u[++s] === u[++r] && s < h);if (n = 258 - (h - s), s = h - 258, n > i) {if (e.match_start = t, i = n, n >= a) break;f = u[s + i - 1], p = u[s + i];}}} while ((t = d[t & c]) > l && 0 != --o);return i <= e.lookahead ? i : e.lookahead;}function _(e) {var t, + r, + n, + s, + l, + u, + c, + d, + h, + f, + p = e.w_size;do {if (s = e.window_size - e.lookahead - e.strstart, e.strstart >= p + (p - 262)) {o.arraySet(e.window, e.window, p, p, 0), e.match_start -= p, e.strstart -= p, e.block_start -= p, t = r = e.hash_size;do {n = e.head[--t], e.head[t] = n >= p ? n - p : 0;} while (--r);t = r = p;do {n = e.prev[--t], e.prev[t] = n >= p ? n - p : 0;} while (--r);s += p;}if (0 === e.strm.avail_in) break;if (u = e.strm, c = e.window, d = e.strstart + e.lookahead, h = s, f = void 0, (f = u.avail_in) > h && (f = h), r = 0 === f ? 0 : (u.avail_in -= f, o.arraySet(c, u.input, u.next_in, f, d), 1 === u.state.wrap ? u.adler = i(u.adler, c, f, d) : 2 === u.state.wrap && (u.adler = a(u.adler, c, f, d)), u.next_in += f, u.total_in += f, f), e.lookahead += r, e.lookahead + e.insert >= 3) for (l = e.strstart - e.insert, e.ins_h = e.window[l], e.ins_h = (e.ins_h << e.hash_shift ^ e.window[l + 1]) & e.hash_mask; e.insert && (e.ins_h = (e.ins_h << e.hash_shift ^ e.window[l + 3 - 1]) & e.hash_mask, e.prev[l & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = l, l++, e.insert--, !(e.lookahead + e.insert < 3)););} while (e.lookahead < 262 && 0 !== e.strm.avail_in);}function v(e, t) {for (var r, n;;) {if (e.lookahead < 262) {if (_(e), e.lookahead < 262 && 0 === t) return 1;if (0 === e.lookahead) break;}if (r = 0, e.lookahead >= 3 && (e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 3 - 1]) & e.hash_mask, r = e.prev[e.strstart & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = e.strstart), 0 !== r && e.strstart - r <= e.w_size - 262 && (e.match_length = g(e, r)), e.match_length >= 3) { + if (n = s._tr_tally(e, e.strstart - e.match_start, e.match_length - 3), e.lookahead -= e.match_length, e.match_length <= e.max_lazy_match && e.lookahead >= 3) {e.match_length--;do {e.strstart++, e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 3 - 1]) & e.hash_mask, r = e.prev[e.strstart & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = e.strstart;} while (0 != --e.match_length);e.strstart++;} else e.strstart += e.match_length, e.match_length = 0, e.ins_h = e.window[e.strstart], e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 1]) & e.hash_mask; + } else n = s._tr_tally(e, 0, e.window[e.strstart]), e.lookahead--, e.strstart++;if (n && (f(e, !1), 0 === e.strm.avail_out)) return 1;}return e.insert = e.strstart < 2 ? e.strstart : 2, 4 === t ? (f(e, !0), 0 === e.strm.avail_out ? 3 : 4) : e.last_lit && (f(e, !1), 0 === e.strm.avail_out) ? 1 : 2;}function b(e, t) {for (var r, n, o;;) {if (e.lookahead < 262) {if (_(e), e.lookahead < 262 && 0 === t) return 1;if (0 === e.lookahead) break;}if (r = 0, e.lookahead >= 3 && (e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 3 - 1]) & e.hash_mask, r = e.prev[e.strstart & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = e.strstart), e.prev_length = e.match_length, e.prev_match = e.match_start, e.match_length = 2, 0 !== r && e.prev_length < e.max_lazy_match && e.strstart - r <= e.w_size - 262 && (e.match_length = g(e, r), e.match_length <= 5 && (1 === e.strategy || 3 === e.match_length && e.strstart - e.match_start > 4096) && (e.match_length = 2)), e.prev_length >= 3 && e.match_length <= e.prev_length) {o = e.strstart + e.lookahead - 3, n = s._tr_tally(e, e.strstart - 1 - e.prev_match, e.prev_length - 3), e.lookahead -= e.prev_length - 1, e.prev_length -= 2;do {++e.strstart <= o && (e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 3 - 1]) & e.hash_mask, r = e.prev[e.strstart & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = e.strstart);} while (0 != --e.prev_length);if (e.match_available = 0, e.match_length = 2, e.strstart++, n && (f(e, !1), 0 === e.strm.avail_out)) return 1;} else if (e.match_available) {if ((n = s._tr_tally(e, 0, e.window[e.strstart - 1])) && f(e, !1), e.strstart++, e.lookahead--, 0 === e.strm.avail_out) return 1;} else e.match_available = 1, e.strstart++, e.lookahead--;}return e.match_available && (n = s._tr_tally(e, 0, e.window[e.strstart - 1]), e.match_available = 0), e.insert = e.strstart < 2 ? e.strstart : 2, 4 === t ? (f(e, !0), 0 === e.strm.avail_out ? 3 : 4) : e.last_lit && (f(e, !1), 0 === e.strm.avail_out) ? 1 : 2;}function y(e, t, r, n, o) {this.good_length = e, this.max_lazy = t, this.nice_length = r, this.max_chain = n, this.func = o;}function w() {this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = 8, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new o.Buf16(1146), this.dyn_dtree = new o.Buf16(122), this.bl_tree = new o.Buf16(78), d(this.dyn_ltree), d(this.dyn_dtree), d(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new o.Buf16(16), this.heap = new o.Buf16(573), d(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new o.Buf16(573), d(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;}function j(e) {var t;return e && e.state ? (e.total_in = e.total_out = 0, e.data_type = 2, (t = e.state).pending = 0, t.pending_out = 0, t.wrap < 0 && (t.wrap = -t.wrap), t.status = t.wrap ? 42 : 113, e.adler = 2 === t.wrap ? 0 : 1, t.last_flush = 0, s._tr_init(t), 0) : u(e, -2);}function E(e) {var t, + r = j(e);return 0 === r && ((t = e.state).window_size = 2 * t.w_size, d(t.head), t.max_lazy_match = n[t.level].max_lazy, t.good_match = n[t.level].good_length, t.nice_match = n[t.level].nice_length, t.max_chain_length = n[t.level].max_chain, t.strstart = 0, t.block_start = 0, t.lookahead = 0, t.insert = 0, t.match_length = t.prev_length = 2, t.match_available = 0, t.ins_h = 0), r;}function k(e, t, r, n, s, i) {if (!e) return -2;var a = 1;if (-1 === t && (t = 6), n < 0 ? (a = 0, n = -n) : n > 15 && (a = 2, n -= 16), s < 1 || s > 9 || 8 !== r || n < 8 || n > 15 || t < 0 || t > 9 || i < 0 || i > 4) return u(e, -2);8 === n && (n = 9);var l = new w();return e.state = l, l.strm = e, l.wrap = a, l.gzhead = null, l.w_bits = n, l.w_size = 1 << l.w_bits, l.w_mask = l.w_size - 1, l.hash_bits = s + 7, l.hash_size = 1 << l.hash_bits, l.hash_mask = l.hash_size - 1, l.hash_shift = ~~((l.hash_bits + 3 - 1) / 3), l.window = new o.Buf8(2 * l.w_size), l.head = new o.Buf16(l.hash_size), l.prev = new o.Buf16(l.w_size), l.lit_bufsize = 1 << s + 6, l.pending_buf_size = 4 * l.lit_bufsize, l.pending_buf = new o.Buf8(l.pending_buf_size), l.d_buf = 1 * l.lit_bufsize, l.l_buf = 3 * l.lit_bufsize, l.level = t, l.strategy = i, l.method = r, E(e);}n = [new y(0, 0, 0, 0, function (e, t) {var r = 65535;for (r > e.pending_buf_size - 5 && (r = e.pending_buf_size - 5);;) {if (e.lookahead <= 1) {if (_(e), 0 === e.lookahead && 0 === t) return 1;if (0 === e.lookahead) break;}e.strstart += e.lookahead, e.lookahead = 0;var n = e.block_start + r;if ((0 === e.strstart || e.strstart >= n) && (e.lookahead = e.strstart - n, e.strstart = n, f(e, !1), 0 === e.strm.avail_out)) return 1;if (e.strstart - e.block_start >= e.w_size - 262 && (f(e, !1), 0 === e.strm.avail_out)) return 1;}return e.insert = 0, 4 === t ? (f(e, !0), 0 === e.strm.avail_out ? 3 : 4) : (e.strstart > e.block_start && (f(e, !1), e.strm.avail_out), 1);}), new y(4, 4, 8, 4, v), new y(4, 5, 16, 8, v), new y(4, 6, 32, 32, v), new y(4, 4, 16, 16, b), new y(8, 16, 32, 32, b), new y(8, 16, 128, 128, b), new y(8, 32, 128, 256, b), new y(32, 128, 258, 1024, b), new y(32, 258, 258, 4096, b)], t.deflateInit = function (e, t) {return k(e, t, 8, 15, 8, 0);}, t.deflateInit2 = k, t.deflateReset = E, t.deflateResetKeep = j, t.deflateSetHeader = function (e, t) {return e && e.state ? 2 !== e.state.wrap ? -2 : (e.state.gzhead = t, 0) : -2;}, t.deflate = function (e, t) {var r, o, i, l;if (!e || !e.state || t > 5 || t < 0) return e ? u(e, -2) : -2;if (o = e.state, !e.output || !e.input && 0 !== e.avail_in || 666 === o.status && 4 !== t) return u(e, 0 === e.avail_out ? -5 : -2);if (o.strm = e, r = o.last_flush, o.last_flush = t, 42 === o.status) if (2 === o.wrap) e.adler = 0, p(o, 31), p(o, 139), p(o, 8), o.gzhead ? (p(o, (o.gzhead.text ? 1 : 0) + (o.gzhead.hcrc ? 2 : 0) + (o.gzhead.extra ? 4 : 0) + (o.gzhead.name ? 8 : 0) + (o.gzhead.comment ? 16 : 0)), p(o, 255 & o.gzhead.time), p(o, o.gzhead.time >> 8 & 255), p(o, o.gzhead.time >> 16 & 255), p(o, o.gzhead.time >> 24 & 255), p(o, 9 === o.level ? 2 : o.strategy >= 2 || o.level < 2 ? 4 : 0), p(o, 255 & o.gzhead.os), o.gzhead.extra && o.gzhead.extra.length && (p(o, 255 & o.gzhead.extra.length), p(o, o.gzhead.extra.length >> 8 & 255)), o.gzhead.hcrc && (e.adler = a(e.adler, o.pending_buf, o.pending, 0)), o.gzindex = 0, o.status = 69) : (p(o, 0), p(o, 0), p(o, 0), p(o, 0), p(o, 0), p(o, 9 === o.level ? 2 : o.strategy >= 2 || o.level < 2 ? 4 : 0), p(o, 3), o.status = 113);else {var g = 8 + (o.w_bits - 8 << 4) << 8;g |= (o.strategy >= 2 || o.level < 2 ? 0 : o.level < 6 ? 1 : 6 === o.level ? 2 : 3) << 6, 0 !== o.strstart && (g |= 32), g += 31 - g % 31, o.status = 113, m(o, g), 0 !== o.strstart && (m(o, e.adler >>> 16), m(o, 65535 & e.adler)), e.adler = 1;}if (69 === o.status) if (o.gzhead.extra) {for (i = o.pending; o.gzindex < (65535 & o.gzhead.extra.length) && (o.pending !== o.pending_buf_size || (o.gzhead.hcrc && o.pending > i && (e.adler = a(e.adler, o.pending_buf, o.pending - i, i)), h(e), i = o.pending, o.pending !== o.pending_buf_size));) p(o, 255 & o.gzhead.extra[o.gzindex]), o.gzindex++;o.gzhead.hcrc && o.pending > i && (e.adler = a(e.adler, o.pending_buf, o.pending - i, i)), o.gzindex === o.gzhead.extra.length && (o.gzindex = 0, o.status = 73);} else o.status = 73;if (73 === o.status) if (o.gzhead.name) {i = o.pending;do {if (o.pending === o.pending_buf_size && (o.gzhead.hcrc && o.pending > i && (e.adler = a(e.adler, o.pending_buf, o.pending - i, i)), h(e), i = o.pending, o.pending === o.pending_buf_size)) {l = 1;break;}l = o.gzindex < o.gzhead.name.length ? 255 & o.gzhead.name.charCodeAt(o.gzindex++) : 0, p(o, l);} while (0 !== l);o.gzhead.hcrc && o.pending > i && (e.adler = a(e.adler, o.pending_buf, o.pending - i, i)), 0 === l && (o.gzindex = 0, o.status = 91);} else o.status = 91;if (91 === o.status) if (o.gzhead.comment) {i = o.pending;do {if (o.pending === o.pending_buf_size && (o.gzhead.hcrc && o.pending > i && (e.adler = a(e.adler, o.pending_buf, o.pending - i, i)), h(e), i = o.pending, o.pending === o.pending_buf_size)) {l = 1;break;}l = o.gzindex < o.gzhead.comment.length ? 255 & o.gzhead.comment.charCodeAt(o.gzindex++) : 0, p(o, l);} while (0 !== l);o.gzhead.hcrc && o.pending > i && (e.adler = a(e.adler, o.pending_buf, o.pending - i, i)), 0 === l && (o.status = 103);} else o.status = 103;if (103 === o.status && (o.gzhead.hcrc ? (o.pending + 2 > o.pending_buf_size && h(e), o.pending + 2 <= o.pending_buf_size && (p(o, 255 & e.adler), p(o, e.adler >> 8 & 255), e.adler = 0, o.status = 113)) : o.status = 113), 0 !== o.pending) {if (h(e), 0 === e.avail_out) return o.last_flush = -1, 0;} else if (0 === e.avail_in && c(t) <= c(r) && 4 !== t) return u(e, -5);if (666 === o.status && 0 !== e.avail_in) return u(e, -5);if (0 !== e.avail_in || 0 !== o.lookahead || 0 !== t && 666 !== o.status) {var v = 2 === o.strategy ? function (e, t) {for (var r;;) {if (0 === e.lookahead && (_(e), 0 === e.lookahead)) {if (0 === t) return 1;break;}if (e.match_length = 0, r = s._tr_tally(e, 0, e.window[e.strstart]), e.lookahead--, e.strstart++, r && (f(e, !1), 0 === e.strm.avail_out)) return 1;}return e.insert = 0, 4 === t ? (f(e, !0), 0 === e.strm.avail_out ? 3 : 4) : e.last_lit && (f(e, !1), 0 === e.strm.avail_out) ? 1 : 2;}(o, t) : 3 === o.strategy ? function (e, t) {for (var r, n, o, i, a = e.window;;) {if (e.lookahead <= 258) {if (_(e), e.lookahead <= 258 && 0 === t) return 1;if (0 === e.lookahead) break;}if (e.match_length = 0, e.lookahead >= 3 && e.strstart > 0 && (n = a[o = e.strstart - 1]) === a[++o] && n === a[++o] && n === a[++o]) {i = e.strstart + 258;do {} while (n === a[++o] && n === a[++o] && n === a[++o] && n === a[++o] && n === a[++o] && n === a[++o] && n === a[++o] && n === a[++o] && o < i);e.match_length = 258 - (i - o), e.match_length > e.lookahead && (e.match_length = e.lookahead);}if (e.match_length >= 3 ? (r = s._tr_tally(e, 1, e.match_length - 3), e.lookahead -= e.match_length, e.strstart += e.match_length, e.match_length = 0) : (r = s._tr_tally(e, 0, e.window[e.strstart]), e.lookahead--, e.strstart++), r && (f(e, !1), 0 === e.strm.avail_out)) return 1;}return e.insert = 0, 4 === t ? (f(e, !0), 0 === e.strm.avail_out ? 3 : 4) : e.last_lit && (f(e, !1), 0 === e.strm.avail_out) ? 1 : 2;}(o, t) : n[o.level].func(o, t);if (3 !== v && 4 !== v || (o.status = 666), 1 === v || 3 === v) return 0 === e.avail_out && (o.last_flush = -1), 0;if (2 === v && (1 === t ? s._tr_align(o) : 5 !== t && (s._tr_stored_block(o, 0, 0, !1), 3 === t && (d(o.head), 0 === o.lookahead && (o.strstart = 0, o.block_start = 0, o.insert = 0))), h(e), 0 === e.avail_out)) return o.last_flush = -1, 0;}return 4 !== t ? 0 : o.wrap <= 0 ? 1 : (2 === o.wrap ? (p(o, 255 & e.adler), p(o, e.adler >> 8 & 255), p(o, e.adler >> 16 & 255), p(o, e.adler >> 24 & 255), p(o, 255 & e.total_in), p(o, e.total_in >> 8 & 255), p(o, e.total_in >> 16 & 255), p(o, e.total_in >> 24 & 255)) : (m(o, e.adler >>> 16), m(o, 65535 & e.adler)), h(e), o.wrap > 0 && (o.wrap = -o.wrap), 0 !== o.pending ? 0 : 1);}, t.deflateEnd = function (e) {var t;return e && e.state ? 42 !== (t = e.state.status) && 69 !== t && 73 !== t && 91 !== t && 103 !== t && 113 !== t && 666 !== t ? u(e, -2) : (e.state = null, 113 === t ? u(e, -3) : 0) : -2;}, t.deflateSetDictionary = function (e, t) {var r, + n, + s, + a, + l, + u, + c, + h, + f = t.length;if (!e || !e.state) return -2;if (2 === (a = (r = e.state).wrap) || 1 === a && 42 !== r.status || r.lookahead) return -2;for (1 === a && (e.adler = i(e.adler, t, f, 0)), r.wrap = 0, f >= r.w_size && (0 === a && (d(r.head), r.strstart = 0, r.block_start = 0, r.insert = 0), h = new o.Buf8(r.w_size), o.arraySet(h, t, f - r.w_size, r.w_size, 0), t = h, f = r.w_size), l = e.avail_in, u = e.next_in, c = e.input, e.avail_in = f, e.next_in = 0, e.input = t, _(r); r.lookahead >= 3;) {n = r.strstart, s = r.lookahead - 2;do {r.ins_h = (r.ins_h << r.hash_shift ^ r.window[n + 3 - 1]) & r.hash_mask, r.prev[n & r.w_mask] = r.head[r.ins_h], r.head[r.ins_h] = n, n++;} while (--s);r.strstart = n, r.lookahead = 2, _(r);}return r.strstart += r.lookahead, r.block_start = r.strstart, r.insert = r.lookahead, r.lookahead = 0, r.match_length = r.prev_length = 2, r.match_available = 0, e.next_in = u, e.input = c, e.avail_in = l, r.wrap = a, 0;}, t.deflateInfo = "pako deflate (from Nodeca project)";}, "./node_modules/pako/lib/zlib/gzheader.js": function (e, t, r) {"use strict"; + e.exports = function () {this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = !1;};}, "./node_modules/pako/lib/zlib/inffast.js": function (e, t, r) {"use strict"; + e.exports = function (e, t) {var r, n, o, s, i, a, l, u, c, d, h, f, p, m, g, _, v, b, y, w, j, E, k, S, C;r = e.state, n = e.next_in, S = e.input, o = n + (e.avail_in - 5), s = e.next_out, C = e.output, i = s - (t - e.avail_out), a = s + (e.avail_out - 257), l = r.dmax, u = r.wsize, c = r.whave, d = r.wnext, h = r.window, f = r.hold, p = r.bits, m = r.lencode, g = r.distcode, _ = (1 << r.lenbits) - 1, v = (1 << r.distbits) - 1;e: do {p < 15 && (f += S[n++] << p, p += 8, f += S[n++] << p, p += 8), b = m[f & _];t: for (;;) {if (f >>>= y = b >>> 24, p -= y, 0 === (y = b >>> 16 & 255)) C[s++] = 65535 & b;else {if (!(16 & y)) {if (0 == (64 & y)) {b = m[(65535 & b) + (f & (1 << y) - 1)];continue t;}if (32 & y) {r.mode = 12;break e;}e.msg = "invalid literal/length code", r.mode = 30;break e;}w = 65535 & b, (y &= 15) && (p < y && (f += S[n++] << p, p += 8), w += f & (1 << y) - 1, f >>>= y, p -= y), p < 15 && (f += S[n++] << p, p += 8, f += S[n++] << p, p += 8), b = g[f & v];r: for (;;) {if (f >>>= y = b >>> 24, p -= y, !(16 & (y = b >>> 16 & 255))) {if (0 == (64 & y)) {b = g[(65535 & b) + (f & (1 << y) - 1)];continue r;}e.msg = "invalid distance code", r.mode = 30;break e;}if (j = 65535 & b, p < (y &= 15) && (f += S[n++] << p, (p += 8) < y && (f += S[n++] << p, p += 8)), (j += f & (1 << y) - 1) > l) {e.msg = "invalid distance too far back", r.mode = 30;break e;}if (f >>>= y, p -= y, j > (y = s - i)) {if ((y = j - y) > c && r.sane) {e.msg = "invalid distance too far back", r.mode = 30;break e;}if (E = 0, k = h, 0 === d) {if (E += u - y, y < w) {w -= y;do {C[s++] = h[E++];} while (--y);E = s - j, k = C;}} else if (d < y) {if (E += u + d - y, (y -= d) < w) {w -= y;do {C[s++] = h[E++];} while (--y);if (E = 0, d < w) {w -= y = d;do {C[s++] = h[E++];} while (--y);E = s - j, k = C;}}} else if (E += d - y, y < w) {w -= y;do {C[s++] = h[E++];} while (--y);E = s - j, k = C;}for (; w > 2;) C[s++] = k[E++], C[s++] = k[E++], C[s++] = k[E++], w -= 3;w && (C[s++] = k[E++], w > 1 && (C[s++] = k[E++]));} else {E = s - j;do {C[s++] = C[E++], C[s++] = C[E++], C[s++] = C[E++], w -= 3;} while (w > 2);w && (C[s++] = C[E++], w > 1 && (C[s++] = C[E++]));}break;}}break;}} while (n < o && s < a);n -= w = p >> 3, f &= (1 << (p -= w << 3)) - 1, e.next_in = n, e.next_out = s, e.avail_in = n < o ? o - n + 5 : 5 - (n - o), e.avail_out = s < a ? a - s + 257 : 257 - (s - a), r.hold = f, r.bits = p;};}, "./node_modules/pako/lib/zlib/inflate.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/pako/lib/utils/common.js"), + o = r("./node_modules/pako/lib/zlib/adler32.js"), + s = r("./node_modules/pako/lib/zlib/crc32.js"), + i = r("./node_modules/pako/lib/zlib/inffast.js"), + a = r("./node_modules/pako/lib/zlib/inftrees.js");function l(e) {return (e >>> 24 & 255) + (e >>> 8 & 65280) + ((65280 & e) << 8) + ((255 & e) << 24);}function u() {this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new n.Buf16(320), this.work = new n.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;}function c(e) {var t;return e && e.state ? (t = e.state, e.total_in = e.total_out = t.total = 0, e.msg = "", t.wrap && (e.adler = 1 & t.wrap), t.mode = 1, t.last = 0, t.havedict = 0, t.dmax = 32768, t.head = null, t.hold = 0, t.bits = 0, t.lencode = t.lendyn = new n.Buf32(852), t.distcode = t.distdyn = new n.Buf32(592), t.sane = 1, t.back = -1, 0) : -2;}function d(e) {var t;return e && e.state ? ((t = e.state).wsize = 0, t.whave = 0, t.wnext = 0, c(e)) : -2;}function h(e, t) {var r, n;return e && e.state ? (n = e.state, t < 0 ? (r = 0, t = -t) : (r = 1 + (t >> 4), t < 48 && (t &= 15)), t && (t < 8 || t > 15) ? -2 : (null !== n.window && n.wbits !== t && (n.window = null), n.wrap = r, n.wbits = t, d(e))) : -2;}function f(e, t) {var r, n;return e ? (n = new u(), e.state = n, n.window = null, 0 !== (r = h(e, t)) && (e.state = null), r) : -2;}var p, + m, + g = !0;function _(e) {if (g) {var t;for (p = new n.Buf32(512), m = new n.Buf32(32), t = 0; t < 144;) e.lens[t++] = 8;for (; t < 256;) e.lens[t++] = 9;for (; t < 280;) e.lens[t++] = 7;for (; t < 288;) e.lens[t++] = 8;for (a(1, e.lens, 0, 288, p, 0, e.work, { bits: 9 }), t = 0; t < 32;) e.lens[t++] = 5;a(2, e.lens, 0, 32, m, 0, e.work, { bits: 5 }), g = !1;}e.lencode = p, e.lenbits = 9, e.distcode = m, e.distbits = 5;}function v(e, t, r, o) {var s, + i = e.state;return null === i.window && (i.wsize = 1 << i.wbits, i.wnext = 0, i.whave = 0, i.window = new n.Buf8(i.wsize)), o >= i.wsize ? (n.arraySet(i.window, t, r - i.wsize, i.wsize, 0), i.wnext = 0, i.whave = i.wsize) : ((s = i.wsize - i.wnext) > o && (s = o), n.arraySet(i.window, t, r - o, s, i.wnext), (o -= s) ? (n.arraySet(i.window, t, r - o, o, 0), i.wnext = o, i.whave = i.wsize) : (i.wnext += s, i.wnext === i.wsize && (i.wnext = 0), i.whave < i.wsize && (i.whave += s))), 0;}t.inflateReset = d, t.inflateReset2 = h, t.inflateResetKeep = c, t.inflateInit = function (e) {return f(e, 15);}, t.inflateInit2 = f, t.inflate = function (e, t) {var r, + u, + c, + d, + h, + f, + p, + m, + g, + b, + y, + w, + j, + E, + k, + S, + C, + x, + O, + A, + R, + I, + T, + L, + N = 0, + z = new n.Buf8(4), + M = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];if (!e || !e.state || !e.output || !e.input && 0 !== e.avail_in) return -2;12 === (r = e.state).mode && (r.mode = 13), h = e.next_out, c = e.output, p = e.avail_out, d = e.next_in, u = e.input, f = e.avail_in, m = r.hold, g = r.bits, b = f, y = p, I = 0;e: for (;;) switch (r.mode) {case 1: + if (0 === r.wrap) {r.mode = 13;break;} + + for (; g < 16;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} + + if (2 & r.wrap && 35615 === m) {r.check = 0, z[0] = 255 & m, z[1] = m >>> 8 & 255, r.check = s(r.check, z, 2, 0), m = 0, g = 0, r.mode = 2;break;} + + if (r.flags = 0, r.head && (r.head.done = !1), !(1 & r.wrap) || (((255 & m) << 8) + (m >> 8)) % 31) {e.msg = "incorrect header check", r.mode = 30;break;} + + if (8 != (15 & m)) {e.msg = "unknown compression method", r.mode = 30;break;} + + if (g -= 4, R = 8 + (15 & (m >>>= 4)), 0 === r.wbits) r.wbits = R;else if (R > r.wbits) {e.msg = "invalid window size", r.mode = 30;break;} + r.dmax = 1 << R, e.adler = r.check = 1, r.mode = 512 & m ? 10 : 12, m = 0, g = 0; + break; + case 2: + for (; g < 16;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} + + if (r.flags = m, 8 != (255 & r.flags)) {e.msg = "unknown compression method", r.mode = 30;break;} + + if (57344 & r.flags) {e.msg = "unknown header flags set", r.mode = 30;break;} + + r.head && (r.head.text = m >> 8 & 1), 512 & r.flags && (z[0] = 255 & m, z[1] = m >>> 8 & 255, r.check = s(r.check, z, 2, 0)), m = 0, g = 0, r.mode = 3; + case 3: + for (; g < 32;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} + + r.head && (r.head.time = m), 512 & r.flags && (z[0] = 255 & m, z[1] = m >>> 8 & 255, z[2] = m >>> 16 & 255, z[3] = m >>> 24 & 255, r.check = s(r.check, z, 4, 0)), m = 0, g = 0, r.mode = 4; + case 4: + for (; g < 16;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} + + r.head && (r.head.xflags = 255 & m, r.head.os = m >> 8), 512 & r.flags && (z[0] = 255 & m, z[1] = m >>> 8 & 255, r.check = s(r.check, z, 2, 0)), m = 0, g = 0, r.mode = 5; + case 5: + if (1024 & r.flags) {for (; g < 16;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}r.length = m, r.head && (r.head.extra_len = m), 512 & r.flags && (z[0] = 255 & m, z[1] = m >>> 8 & 255, r.check = s(r.check, z, 2, 0)), m = 0, g = 0;} else r.head && (r.head.extra = null); + + r.mode = 6; + case 6: + if (1024 & r.flags && ((w = r.length) > f && (w = f), w && (r.head && (R = r.head.extra_len - r.length, r.head.extra || (r.head.extra = new Array(r.head.extra_len)), n.arraySet(r.head.extra, u, d, w, R)), 512 & r.flags && (r.check = s(r.check, u, w, d)), f -= w, d += w, r.length -= w), r.length)) break e; + r.length = 0, r.mode = 7; + case 7: + if (2048 & r.flags) {if (0 === f) break e;w = 0;do {R = u[d + w++], r.head && R && r.length < 65536 && (r.head.name += String.fromCharCode(R));} while (R && w < f);if (512 & r.flags && (r.check = s(r.check, u, w, d)), f -= w, d += w, R) break e;} else r.head && (r.head.name = null); + + r.length = 0, r.mode = 8; + case 8: + if (4096 & r.flags) {if (0 === f) break e;w = 0;do {R = u[d + w++], r.head && R && r.length < 65536 && (r.head.comment += String.fromCharCode(R));} while (R && w < f);if (512 & r.flags && (r.check = s(r.check, u, w, d)), f -= w, d += w, R) break e;} else r.head && (r.head.comment = null); + + r.mode = 9; + case 9: + if (512 & r.flags) {for (; g < 16;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}if (m !== (65535 & r.check)) {e.msg = "header crc mismatch", r.mode = 30;break;}m = 0, g = 0;} + + r.head && (r.head.hcrc = r.flags >> 9 & 1, r.head.done = !0), e.adler = r.check = 0, r.mode = 12; + break; + case 10: + for (; g < 32;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} + + e.adler = r.check = l(m), m = 0, g = 0, r.mode = 11; + case 11: + if (0 === r.havedict) return e.next_out = h, e.avail_out = p, e.next_in = d, e.avail_in = f, r.hold = m, r.bits = g, 2; + e.adler = r.check = 1, r.mode = 12; + case 12: + if (5 === t || 6 === t) break e; + case 13: + if (r.last) {m >>>= 7 & g, g -= 7 & g, r.mode = 27;break;} + + for (; g < 3;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} + + switch (r.last = 1 & m, g -= 1, 3 & (m >>>= 1)) {case 0: + r.mode = 14; + break; + case 1: + if (_(r), r.mode = 20, 6 === t) {m >>>= 2, g -= 2;break e;} + + break; + case 2: + r.mode = 17; + break; + case 3: + e.msg = "invalid block type", r.mode = 30; + } + + m >>>= 2, g -= 2; + break; + case 14: + for (m >>>= 7 & g, g -= 7 & g; g < 32;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} + + if ((65535 & m) != (m >>> 16 ^ 65535)) {e.msg = "invalid stored block lengths", r.mode = 30;break;} + + if (r.length = 65535 & m, m = 0, g = 0, r.mode = 15, 6 === t) break e; + case 15: + r.mode = 16; + case 16: + if (w = r.length) {if (w > f && (w = f), w > p && (w = p), 0 === w) break e;n.arraySet(c, u, d, w, h), f -= w, d += w, p -= w, h += w, r.length -= w;break;} + + r.mode = 12; + break; + case 17: + for (; g < 14;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} + + if (r.nlen = 257 + (31 & m), m >>>= 5, g -= 5, r.ndist = 1 + (31 & m), m >>>= 5, g -= 5, r.ncode = 4 + (15 & m), m >>>= 4, g -= 4, r.nlen > 286 || r.ndist > 30) {e.msg = "too many length or distance symbols", r.mode = 30;break;} + + r.have = 0, r.mode = 18; + case 18: + for (; r.have < r.ncode;) {for (; g < 3;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}r.lens[M[r.have++]] = 7 & m, m >>>= 3, g -= 3;} + + for (; r.have < 19;) r.lens[M[r.have++]] = 0; + + if (r.lencode = r.lendyn, r.lenbits = 7, T = { bits: r.lenbits }, I = a(0, r.lens, 0, 19, r.lencode, 0, r.work, T), r.lenbits = T.bits, I) {e.msg = "invalid code lengths set", r.mode = 30;break;} + + r.have = 0, r.mode = 19; + case 19: + for (; r.have < r.nlen + r.ndist;) {for (; S = (N = r.lencode[m & (1 << r.lenbits) - 1]) >>> 16 & 255, C = 65535 & N, !((k = N >>> 24) <= g);) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}if (C < 16) m >>>= k, g -= k, r.lens[r.have++] = C;else {if (16 === C) {for (L = k + 2; g < L;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}if (m >>>= k, g -= k, 0 === r.have) {e.msg = "invalid bit length repeat", r.mode = 30;break;}R = r.lens[r.have - 1], w = 3 + (3 & m), m >>>= 2, g -= 2;} else if (17 === C) {for (L = k + 3; g < L;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}g -= k, R = 0, w = 3 + (7 & (m >>>= k)), m >>>= 3, g -= 3;} else {for (L = k + 7; g < L;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}g -= k, R = 0, w = 11 + (127 & (m >>>= k)), m >>>= 7, g -= 7;}if (r.have + w > r.nlen + r.ndist) {e.msg = "invalid bit length repeat", r.mode = 30;break;}for (; w--;) r.lens[r.have++] = R;}} + + if (30 === r.mode) break; + + if (0 === r.lens[256]) {e.msg = "invalid code -- missing end-of-block", r.mode = 30;break;} + + if (r.lenbits = 9, T = { bits: r.lenbits }, I = a(1, r.lens, 0, r.nlen, r.lencode, 0, r.work, T), r.lenbits = T.bits, I) {e.msg = "invalid literal/lengths set", r.mode = 30;break;} + + if (r.distbits = 6, r.distcode = r.distdyn, T = { bits: r.distbits }, I = a(2, r.lens, r.nlen, r.ndist, r.distcode, 0, r.work, T), r.distbits = T.bits, I) {e.msg = "invalid distances set", r.mode = 30;break;} + + if (r.mode = 20, 6 === t) break e; + case 20: + r.mode = 21; + case 21: + if (f >= 6 && p >= 258) {e.next_out = h, e.avail_out = p, e.next_in = d, e.avail_in = f, r.hold = m, r.bits = g, i(e, y), h = e.next_out, c = e.output, p = e.avail_out, d = e.next_in, u = e.input, f = e.avail_in, m = r.hold, g = r.bits, 12 === r.mode && (r.back = -1);break;} + + for (r.back = 0; S = (N = r.lencode[m & (1 << r.lenbits) - 1]) >>> 16 & 255, C = 65535 & N, !((k = N >>> 24) <= g);) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} + + if (S && 0 == (240 & S)) {for (x = k, O = S, A = C; S = (N = r.lencode[A + ((m & (1 << x + O) - 1) >> x)]) >>> 16 & 255, C = 65535 & N, !(x + (k = N >>> 24) <= g);) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}m >>>= x, g -= x, r.back += x;} + + if (m >>>= k, g -= k, r.back += k, r.length = C, 0 === S) {r.mode = 26;break;} + + if (32 & S) {r.back = -1, r.mode = 12;break;} + + if (64 & S) {e.msg = "invalid literal/length code", r.mode = 30;break;} + + r.extra = 15 & S, r.mode = 22; + case 22: + if (r.extra) {for (L = r.extra; g < L;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}r.length += m & (1 << r.extra) - 1, m >>>= r.extra, g -= r.extra, r.back += r.extra;} + + r.was = r.length, r.mode = 23; + case 23: + for (; S = (N = r.distcode[m & (1 << r.distbits) - 1]) >>> 16 & 255, C = 65535 & N, !((k = N >>> 24) <= g);) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} + + if (0 == (240 & S)) {for (x = k, O = S, A = C; S = (N = r.distcode[A + ((m & (1 << x + O) - 1) >> x)]) >>> 16 & 255, C = 65535 & N, !(x + (k = N >>> 24) <= g);) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}m >>>= x, g -= x, r.back += x;} + + if (m >>>= k, g -= k, r.back += k, 64 & S) {e.msg = "invalid distance code", r.mode = 30;break;} + + r.offset = C, r.extra = 15 & S, r.mode = 24; + case 24: + if (r.extra) {for (L = r.extra; g < L;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}r.offset += m & (1 << r.extra) - 1, m >>>= r.extra, g -= r.extra, r.back += r.extra;} + + if (r.offset > r.dmax) {e.msg = "invalid distance too far back", r.mode = 30;break;} + + r.mode = 25; + case 25: + if (0 === p) break e; + + if (w = y - p, r.offset > w) {if ((w = r.offset - w) > r.whave && r.sane) {e.msg = "invalid distance too far back", r.mode = 30;break;}w > r.wnext ? (w -= r.wnext, j = r.wsize - w) : j = r.wnext - w, w > r.length && (w = r.length), E = r.window;} else E = c, j = h - r.offset, w = r.length; + + w > p && (w = p), p -= w, r.length -= w; + + do {c[h++] = E[j++];} while (--w); + + 0 === r.length && (r.mode = 21); + break; + case 26: + if (0 === p) break e; + c[h++] = r.length, p--, r.mode = 21; + break; + case 27: + if (r.wrap) {for (; g < 32;) {if (0 === f) break e;f--, m |= u[d++] << g, g += 8;}if (y -= p, e.total_out += y, r.total += y, y && (e.adler = r.check = r.flags ? s(r.check, c, y, h - y) : o(r.check, c, y, h - y)), y = p, (r.flags ? m : l(m)) !== r.check) {e.msg = "incorrect data check", r.mode = 30;break;}m = 0, g = 0;} + + r.mode = 28; + case 28: + if (r.wrap && r.flags) {for (; g < 32;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}if (m !== (4294967295 & r.total)) {e.msg = "incorrect length check", r.mode = 30;break;}m = 0, g = 0;} + + r.mode = 29; + case 29: + I = 1; + break e; + case 30: + I = -3; + break e; + case 31: + return -4; + case 32:default: + return -2; + }return e.next_out = h, e.avail_out = p, e.next_in = d, e.avail_in = f, r.hold = m, r.bits = g, (r.wsize || y !== e.avail_out && r.mode < 30 && (r.mode < 27 || 4 !== t)) && v(e, e.output, e.next_out, y - e.avail_out) ? (r.mode = 31, -4) : (b -= e.avail_in, y -= e.avail_out, e.total_in += b, e.total_out += y, r.total += y, r.wrap && y && (e.adler = r.check = r.flags ? s(r.check, c, y, e.next_out - y) : o(r.check, c, y, e.next_out - y)), e.data_type = r.bits + (r.last ? 64 : 0) + (12 === r.mode ? 128 : 0) + (20 === r.mode || 15 === r.mode ? 256 : 0), (0 === b && 0 === y || 4 === t) && 0 === I && (I = -5), I);}, t.inflateEnd = function (e) {if (!e || !e.state) return -2;var t = e.state;return t.window && (t.window = null), e.state = null, 0;}, t.inflateGetHeader = function (e, t) {var r;return e && e.state ? 0 == (2 & (r = e.state).wrap) ? -2 : (r.head = t, t.done = !1, 0) : -2;}, t.inflateSetDictionary = function (e, t) {var r, + n = t.length;return e && e.state ? 0 !== (r = e.state).wrap && 11 !== r.mode ? -2 : 11 === r.mode && o(1, t, n, 0) !== r.check ? -3 : v(e, t, n, n) ? (r.mode = 31, -4) : (r.havedict = 1, 0) : -2;}, t.inflateInfo = "pako inflate (from Nodeca project)";}, "./node_modules/pako/lib/zlib/inftrees.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/pako/lib/utils/common.js"), + o = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], + s = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], + i = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], + a = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];e.exports = function (e, t, r, l, u, c, d, h) {var f, + p, + m, + g, + _, + v, + b, + y, + w, + j = h.bits, + E = 0, + k = 0, + S = 0, + C = 0, + x = 0, + O = 0, + A = 0, + R = 0, + I = 0, + T = 0, + L = null, + N = 0, + z = new n.Buf16(16), + M = new n.Buf16(16), + D = null, + P = 0;for (E = 0; E <= 15; E++) z[E] = 0;for (k = 0; k < l; k++) z[t[r + k]]++;for (x = j, C = 15; C >= 1 && 0 === z[C]; C--);if (x > C && (x = C), 0 === C) return u[c++] = 20971520, u[c++] = 20971520, h.bits = 1, 0;for (S = 1; S < C && 0 === z[S]; S++);for (x < S && (x = S), R = 1, E = 1; E <= 15; E++) if (R <<= 1, (R -= z[E]) < 0) return -1;if (R > 0 && (0 === e || 1 !== C)) return -1;for (M[1] = 0, E = 1; E < 15; E++) M[E + 1] = M[E] + z[E];for (k = 0; k < l; k++) 0 !== t[r + k] && (d[M[t[r + k]]++] = k);if (0 === e ? (L = D = d, v = 19) : 1 === e ? (L = o, N -= 257, D = s, P -= 257, v = 256) : (L = i, D = a, v = -1), T = 0, k = 0, E = S, _ = c, O = x, A = 0, m = -1, g = (I = 1 << x) - 1, 1 === e && I > 852 || 2 === e && I > 592) return 1;for (;;) {b = E - A, d[k] < v ? (y = 0, w = d[k]) : d[k] > v ? (y = D[P + d[k]], w = L[N + d[k]]) : (y = 96, w = 0), f = 1 << E - A, S = p = 1 << O;do {u[_ + (T >> A) + (p -= f)] = b << 24 | y << 16 | w | 0;} while (0 !== p);for (f = 1 << E - 1; T & f;) f >>= 1;if (0 !== f ? (T &= f - 1, T += f) : T = 0, k++, 0 == --z[E]) {if (E === C) break;E = t[r + d[k]];}if (E > x && (T & g) !== m) {for (0 === A && (A = x), _ += S, R = 1 << (O = E - A); O + A < C && !((R -= z[O + A]) <= 0);) O++, R <<= 1;if (I += 1 << O, 1 === e && I > 852 || 2 === e && I > 592) return 1;u[m = T & g] = x << 24 | O << 16 | _ - c | 0;}}return 0 !== T && (u[_ + T] = E - A << 24 | 64 << 16 | 0), h.bits = x, 0;};}, "./node_modules/pako/lib/zlib/messages.js": function (e, t, r) {"use strict"; + e.exports = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" };}, "./node_modules/pako/lib/zlib/trees.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/pako/lib/utils/common.js");function o(e) {for (var t = e.length; --t >= 0;) e[t] = 0;}var s = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], + i = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], + a = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], + l = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], + u = new Array(576);o(u);var c = new Array(60);o(c);var d = new Array(512);o(d);var h = new Array(256);o(h);var f = new Array(29);o(f);var p, + m, + g, + _ = new Array(30);function v(e, t, r, n, o) {this.static_tree = e, this.extra_bits = t, this.extra_base = r, this.elems = n, this.max_length = o, this.has_stree = e && e.length;}function b(e, t) {this.dyn_tree = e, this.max_code = 0, this.stat_desc = t;}function y(e) {return e < 256 ? d[e] : d[256 + (e >>> 7)];}function w(e, t) {e.pending_buf[e.pending++] = 255 & t, e.pending_buf[e.pending++] = t >>> 8 & 255;}function j(e, t, r) {e.bi_valid > 16 - r ? (e.bi_buf |= t << e.bi_valid & 65535, w(e, e.bi_buf), e.bi_buf = t >> 16 - e.bi_valid, e.bi_valid += r - 16) : (e.bi_buf |= t << e.bi_valid & 65535, e.bi_valid += r);}function E(e, t, r) {j(e, r[2 * t], r[2 * t + 1]);}function k(e, t) {var r = 0;do {r |= 1 & e, e >>>= 1, r <<= 1;} while (--t > 0);return r >>> 1;}function S(e, t, r) {var n, + o, + s = new Array(16), + i = 0;for (n = 1; n <= 15; n++) s[n] = i = i + r[n - 1] << 1;for (o = 0; o <= t; o++) {var a = e[2 * o + 1];0 !== a && (e[2 * o] = k(s[a]++, a));}}function C(e) {var t;for (t = 0; t < 286; t++) e.dyn_ltree[2 * t] = 0;for (t = 0; t < 30; t++) e.dyn_dtree[2 * t] = 0;for (t = 0; t < 19; t++) e.bl_tree[2 * t] = 0;e.dyn_ltree[512] = 1, e.opt_len = e.static_len = 0, e.last_lit = e.matches = 0;}function x(e) {e.bi_valid > 8 ? w(e, e.bi_buf) : e.bi_valid > 0 && (e.pending_buf[e.pending++] = e.bi_buf), e.bi_buf = 0, e.bi_valid = 0;}function O(e, t, r, n) {var o = 2 * t, + s = 2 * r;return e[o] < e[s] || e[o] === e[s] && n[t] <= n[r];}function A(e, t, r) {for (var n = e.heap[r], o = r << 1; o <= e.heap_len && (o < e.heap_len && O(t, e.heap[o + 1], e.heap[o], e.depth) && o++, !O(t, n, e.heap[o], e.depth));) e.heap[r] = e.heap[o], r = o, o <<= 1;e.heap[r] = n;}function R(e, t, r) {var n, + o, + a, + l, + u = 0;if (0 !== e.last_lit) do {n = e.pending_buf[e.d_buf + 2 * u] << 8 | e.pending_buf[e.d_buf + 2 * u + 1], o = e.pending_buf[e.l_buf + u], u++, 0 === n ? E(e, o, t) : (E(e, (a = h[o]) + 256 + 1, t), 0 !== (l = s[a]) && j(e, o -= f[a], l), E(e, a = y(--n), r), 0 !== (l = i[a]) && j(e, n -= _[a], l));} while (u < e.last_lit);E(e, 256, t);}function I(e, t) {var r, + n, + o, + s = t.dyn_tree, + i = t.stat_desc.static_tree, + a = t.stat_desc.has_stree, + l = t.stat_desc.elems, + u = -1;for (e.heap_len = 0, e.heap_max = 573, r = 0; r < l; r++) 0 !== s[2 * r] ? (e.heap[++e.heap_len] = u = r, e.depth[r] = 0) : s[2 * r + 1] = 0;for (; e.heap_len < 2;) s[2 * (o = e.heap[++e.heap_len] = u < 2 ? ++u : 0)] = 1, e.depth[o] = 0, e.opt_len--, a && (e.static_len -= i[2 * o + 1]);for (t.max_code = u, r = e.heap_len >> 1; r >= 1; r--) A(e, s, r);o = l;do {r = e.heap[1], e.heap[1] = e.heap[e.heap_len--], A(e, s, 1), n = e.heap[1], e.heap[--e.heap_max] = r, e.heap[--e.heap_max] = n, s[2 * o] = s[2 * r] + s[2 * n], e.depth[o] = (e.depth[r] >= e.depth[n] ? e.depth[r] : e.depth[n]) + 1, s[2 * r + 1] = s[2 * n + 1] = o, e.heap[1] = o++, A(e, s, 1);} while (e.heap_len >= 2);e.heap[--e.heap_max] = e.heap[1], function (e, t) {var r, + n, + o, + s, + i, + a, + l = t.dyn_tree, + u = t.max_code, + c = t.stat_desc.static_tree, + d = t.stat_desc.has_stree, + h = t.stat_desc.extra_bits, + f = t.stat_desc.extra_base, + p = t.stat_desc.max_length, + m = 0;for (s = 0; s <= 15; s++) e.bl_count[s] = 0;for (l[2 * e.heap[e.heap_max] + 1] = 0, r = e.heap_max + 1; r < 573; r++) (s = l[2 * l[2 * (n = e.heap[r]) + 1] + 1] + 1) > p && (s = p, m++), l[2 * n + 1] = s, n > u || (e.bl_count[s]++, i = 0, n >= f && (i = h[n - f]), a = l[2 * n], e.opt_len += a * (s + i), d && (e.static_len += a * (c[2 * n + 1] + i)));if (0 !== m) {do {for (s = p - 1; 0 === e.bl_count[s];) s--;e.bl_count[s]--, e.bl_count[s + 1] += 2, e.bl_count[p]--, m -= 2;} while (m > 0);for (s = p; 0 !== s; s--) for (n = e.bl_count[s]; 0 !== n;) (o = e.heap[--r]) > u || (l[2 * o + 1] !== s && (e.opt_len += (s - l[2 * o + 1]) * l[2 * o], l[2 * o + 1] = s), n--);}}(e, t), S(s, u, e.bl_count);}function T(e, t, r) {var n, + o, + s = -1, + i = t[1], + a = 0, + l = 7, + u = 4;for (0 === i && (l = 138, u = 3), t[2 * (r + 1) + 1] = 65535, n = 0; n <= r; n++) o = i, i = t[2 * (n + 1) + 1], ++a < l && o === i || (a < u ? e.bl_tree[2 * o] += a : 0 !== o ? (o !== s && e.bl_tree[2 * o]++, e.bl_tree[32]++) : a <= 10 ? e.bl_tree[34]++ : e.bl_tree[36]++, a = 0, s = o, 0 === i ? (l = 138, u = 3) : o === i ? (l = 6, u = 3) : (l = 7, u = 4));}function L(e, t, r) {var n, + o, + s = -1, + i = t[1], + a = 0, + l = 7, + u = 4;for (0 === i && (l = 138, u = 3), n = 0; n <= r; n++) if (o = i, i = t[2 * (n + 1) + 1], !(++a < l && o === i)) {if (a < u) do {E(e, o, e.bl_tree);} while (0 != --a);else 0 !== o ? (o !== s && (E(e, o, e.bl_tree), a--), E(e, 16, e.bl_tree), j(e, a - 3, 2)) : a <= 10 ? (E(e, 17, e.bl_tree), j(e, a - 3, 3)) : (E(e, 18, e.bl_tree), j(e, a - 11, 7));a = 0, s = o, 0 === i ? (l = 138, u = 3) : o === i ? (l = 6, u = 3) : (l = 7, u = 4);}}o(_);var N = !1;function z(e, t, r, o) {j(e, 0 + (o ? 1 : 0), 3), function (e, t, r, o) {x(e), o && (w(e, r), w(e, ~r)), n.arraySet(e.pending_buf, e.window, t, r, e.pending), e.pending += r;}(e, t, r, !0);}t._tr_init = function (e) {N || (!function () {var e, + t, + r, + n, + o, + l = new Array(16);for (r = 0, n = 0; n < 28; n++) for (f[n] = r, e = 0; e < 1 << s[n]; e++) h[r++] = n;for (h[r - 1] = n, o = 0, n = 0; n < 16; n++) for (_[n] = o, e = 0; e < 1 << i[n]; e++) d[o++] = n;for (o >>= 7; n < 30; n++) for (_[n] = o << 7, e = 0; e < 1 << i[n] - 7; e++) d[256 + o++] = n;for (t = 0; t <= 15; t++) l[t] = 0;for (e = 0; e <= 143;) u[2 * e + 1] = 8, e++, l[8]++;for (; e <= 255;) u[2 * e + 1] = 9, e++, l[9]++;for (; e <= 279;) u[2 * e + 1] = 7, e++, l[7]++;for (; e <= 287;) u[2 * e + 1] = 8, e++, l[8]++;for (S(u, 287, l), e = 0; e < 30; e++) c[2 * e + 1] = 5, c[2 * e] = k(e, 5);p = new v(u, s, 257, 286, 15), m = new v(c, i, 0, 30, 15), g = new v(new Array(0), a, 0, 19, 7);}(), N = !0), e.l_desc = new b(e.dyn_ltree, p), e.d_desc = new b(e.dyn_dtree, m), e.bl_desc = new b(e.bl_tree, g), e.bi_buf = 0, e.bi_valid = 0, C(e);}, t._tr_stored_block = z, t._tr_flush_block = function (e, t, r, n) {var o, + s, + i = 0;e.level > 0 ? (2 === e.strm.data_type && (e.strm.data_type = function (e) {var t, + r = 4093624447;for (t = 0; t <= 31; t++, r >>>= 1) if (1 & r && 0 !== e.dyn_ltree[2 * t]) return 0;if (0 !== e.dyn_ltree[18] || 0 !== e.dyn_ltree[20] || 0 !== e.dyn_ltree[26]) return 1;for (t = 32; t < 256; t++) if (0 !== e.dyn_ltree[2 * t]) return 1;return 0;}(e)), I(e, e.l_desc), I(e, e.d_desc), i = function (e) {var t;for (T(e, e.dyn_ltree, e.l_desc.max_code), T(e, e.dyn_dtree, e.d_desc.max_code), I(e, e.bl_desc), t = 18; t >= 3 && 0 === e.bl_tree[2 * l[t] + 1]; t--);return e.opt_len += 3 * (t + 1) + 5 + 5 + 4, t;}(e), o = e.opt_len + 3 + 7 >>> 3, (s = e.static_len + 3 + 7 >>> 3) <= o && (o = s)) : o = s = r + 5, r + 4 <= o && -1 !== t ? z(e, t, r, n) : 4 === e.strategy || s === o ? (j(e, 2 + (n ? 1 : 0), 3), R(e, u, c)) : (j(e, 4 + (n ? 1 : 0), 3), function (e, t, r, n) {var o;for (j(e, t - 257, 5), j(e, r - 1, 5), j(e, n - 4, 4), o = 0; o < n; o++) j(e, e.bl_tree[2 * l[o] + 1], 3);L(e, e.dyn_ltree, t - 1), L(e, e.dyn_dtree, r - 1);}(e, e.l_desc.max_code + 1, e.d_desc.max_code + 1, i + 1), R(e, e.dyn_ltree, e.dyn_dtree)), C(e), n && x(e);}, t._tr_tally = function (e, t, r) {return e.pending_buf[e.d_buf + 2 * e.last_lit] = t >>> 8 & 255, e.pending_buf[e.d_buf + 2 * e.last_lit + 1] = 255 & t, e.pending_buf[e.l_buf + e.last_lit] = 255 & r, e.last_lit++, 0 === t ? e.dyn_ltree[2 * r]++ : (e.matches++, t--, e.dyn_ltree[2 * (h[r] + 256 + 1)]++, e.dyn_dtree[2 * y(t)]++), e.last_lit === e.lit_bufsize - 1;}, t._tr_align = function (e) {j(e, 2, 3), E(e, 256, u), function (e) {16 === e.bi_valid ? (w(e, e.bi_buf), e.bi_buf = 0, e.bi_valid = 0) : e.bi_valid >= 8 && (e.pending_buf[e.pending++] = 255 & e.bi_buf, e.bi_buf >>= 8, e.bi_valid -= 8);}(e);};}, "./node_modules/pako/lib/zlib/zstream.js": function (e, t, r) {"use strict"; + e.exports = function () {this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0;};}, "./node_modules/path-is-absolute/index.js": function (e, t, r) {"use strict"; + function n(e) {return "/" === e.charAt(0);}function o(e) {var t = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/.exec(e), + r = t[1] || "", + n = Boolean(r && ":" !== r.charAt(1));return Boolean(t[2] || n);}e.exports = "win32" === process.platform ? o : n, e.exports.posix = n, e.exports.win32 = o;}, "./node_modules/process-nextick-args/index.js": function (e, t, r) {"use strict"; + "undefined" == typeof process || !process.version || 0 === process.version.indexOf("v0.") || 0 === process.version.indexOf("v1.") && 0 !== process.version.indexOf("v1.8.") ? e.exports = { nextTick: function (e, t, r, n) {if ("function" != typeof e) throw new TypeError('"callback" argument must be a function');var o, + s, + i = arguments.length;switch (i) {case 0:case 1: + return process.nextTick(e); + case 2: + return process.nextTick(function () {e.call(null, t);}); + case 3: + return process.nextTick(function () {e.call(null, t, r);}); + case 4: + return process.nextTick(function () {e.call(null, t, r, n);}); + default: + for (o = new Array(i - 1), s = 0; s < o.length;) o[s++] = arguments[s]; + + return process.nextTick(function () {e.apply(null, o);}); + }} } : e.exports = process;}, "./node_modules/readable-stream/lib/_stream_duplex.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/process-nextick-args/index.js"), + o = Object.keys || function (e) {var t = [];for (var r in e) t.push(r);return t;};e.exports = d;var s = Object.create(r("./node_modules/core-util-is/lib/util.js"));s.inherits = r("./node_modules/inherits/inherits.js");var i = r("./node_modules/readable-stream/lib/_stream_readable.js"), + a = r("./node_modules/readable-stream/lib/_stream_writable.js");s.inherits(d, i);for (var l = o(a.prototype), u = 0; u < l.length; u++) {var c = l[u];d.prototype[c] || (d.prototype[c] = a.prototype[c]);}function d(e) {if (!(this instanceof d)) return new d(e);i.call(this, e), a.call(this, e), e && !1 === e.readable && (this.readable = !1), e && !1 === e.writable && (this.writable = !1), this.allowHalfOpen = !0, e && !1 === e.allowHalfOpen && (this.allowHalfOpen = !1), this.once("end", h);}function h() {this.allowHalfOpen || this._writableState.ended || n.nextTick(f, this);}function f(e) {e.end();}Object.defineProperty(d.prototype, "writableHighWaterMark", { enumerable: !1, get: function () {return this._writableState.highWaterMark;} }), Object.defineProperty(d.prototype, "destroyed", { get: function () {return void 0 !== this._readableState && void 0 !== this._writableState && (this._readableState.destroyed && this._writableState.destroyed);}, set: function (e) {void 0 !== this._readableState && void 0 !== this._writableState && (this._readableState.destroyed = e, this._writableState.destroyed = e);} }), d.prototype._destroy = function (e, t) {this.push(null), this.end(), n.nextTick(t, e);};}, "./node_modules/readable-stream/lib/_stream_passthrough.js": function (e, t, r) {"use strict"; + e.exports = s;var n = r("./node_modules/readable-stream/lib/_stream_transform.js"), + o = Object.create(r("./node_modules/core-util-is/lib/util.js"));function s(e) {if (!(this instanceof s)) return new s(e);n.call(this, e);}o.inherits = r("./node_modules/inherits/inherits.js"), o.inherits(s, n), s.prototype._transform = function (e, t, r) {r(null, e);};}, "./node_modules/readable-stream/lib/_stream_readable.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/process-nextick-args/index.js");e.exports = v;var o, + s = r("./node_modules/isarray/index.js");v.ReadableState = _;r("events").EventEmitter;var i = function (e, t) {return e.listeners(t).length;}, + a = r("./node_modules/readable-stream/lib/internal/streams/stream.js"), + l = r("./node_modules/safe-buffer/index.js").Buffer, + u = global.Uint8Array || function () {};var c = Object.create(r("./node_modules/core-util-is/lib/util.js"));c.inherits = r("./node_modules/inherits/inherits.js");var d = r("util"), + h = void 0;h = d && d.debuglog ? d.debuglog("stream") : function () {};var f, + p = r("./node_modules/readable-stream/lib/internal/streams/BufferList.js"), + m = r("./node_modules/readable-stream/lib/internal/streams/destroy.js");c.inherits(v, a);var g = ["error", "close", "destroy", "pause", "resume"];function _(e, t) {e = e || {};var n = t instanceof (o = o || r("./node_modules/readable-stream/lib/_stream_duplex.js"));this.objectMode = !!e.objectMode, n && (this.objectMode = this.objectMode || !!e.readableObjectMode);var s = e.highWaterMark, + i = e.readableHighWaterMark, + a = this.objectMode ? 16 : 16384;this.highWaterMark = s || 0 === s ? s : n && (i || 0 === i) ? i : a, this.highWaterMark = Math.floor(this.highWaterMark), this.buffer = new p(), this.length = 0, this.pipes = null, this.pipesCount = 0, this.flowing = null, this.ended = !1, this.endEmitted = !1, this.reading = !1, this.sync = !0, this.needReadable = !1, this.emittedReadable = !1, this.readableListening = !1, this.resumeScheduled = !1, this.destroyed = !1, this.defaultEncoding = e.defaultEncoding || "utf8", this.awaitDrain = 0, this.readingMore = !1, this.decoder = null, this.encoding = null, e.encoding && (f || (f = r("./node_modules/string_decoder/lib/string_decoder.js").StringDecoder), this.decoder = new f(e.encoding), this.encoding = e.encoding);}function v(e) {if (o = o || r("./node_modules/readable-stream/lib/_stream_duplex.js"), !(this instanceof v)) return new v(e);this._readableState = new _(e, this), this.readable = !0, e && ("function" == typeof e.read && (this._read = e.read), "function" == typeof e.destroy && (this._destroy = e.destroy)), a.call(this);}function b(e, t, r, n, o) {var s, + i = e._readableState;null === t ? (i.reading = !1, function (e, t) {if (t.ended) return;if (t.decoder) {var r = t.decoder.end();r && r.length && (t.buffer.push(r), t.length += t.objectMode ? 1 : r.length);}t.ended = !0, j(e);}(e, i)) : (o || (s = function (e, t) {var r;n = t, l.isBuffer(n) || n instanceof u || "string" == typeof t || void 0 === t || e.objectMode || (r = new TypeError("Invalid non-string/buffer chunk"));var n;return r;}(i, t)), s ? e.emit("error", s) : i.objectMode || t && t.length > 0 ? ("string" == typeof t || i.objectMode || Object.getPrototypeOf(t) === l.prototype || (t = function (e) {return l.from(e);}(t)), n ? i.endEmitted ? e.emit("error", new Error("stream.unshift() after end event")) : y(e, i, t, !0) : i.ended ? e.emit("error", new Error("stream.push() after EOF")) : (i.reading = !1, i.decoder && !r ? (t = i.decoder.write(t), i.objectMode || 0 !== t.length ? y(e, i, t, !1) : k(e, i)) : y(e, i, t, !1))) : n || (i.reading = !1));return function (e) {return !e.ended && (e.needReadable || e.length < e.highWaterMark || 0 === e.length);}(i);}function y(e, t, r, n) {t.flowing && 0 === t.length && !t.sync ? (e.emit("data", r), e.read(0)) : (t.length += t.objectMode ? 1 : r.length, n ? t.buffer.unshift(r) : t.buffer.push(r), t.needReadable && j(e)), k(e, t);}Object.defineProperty(v.prototype, "destroyed", { get: function () {return void 0 !== this._readableState && this._readableState.destroyed;}, set: function (e) {this._readableState && (this._readableState.destroyed = e);} }), v.prototype.destroy = m.destroy, v.prototype._undestroy = m.undestroy, v.prototype._destroy = function (e, t) {this.push(null), t(e);}, v.prototype.push = function (e, t) {var r, + n = this._readableState;return n.objectMode ? r = !0 : "string" == typeof e && ((t = t || n.defaultEncoding) !== n.encoding && (e = l.from(e, t), t = ""), r = !0), b(this, e, t, !1, r);}, v.prototype.unshift = function (e) {return b(this, e, null, !0, !1);}, v.prototype.isPaused = function () {return !1 === this._readableState.flowing;}, v.prototype.setEncoding = function (e) {return f || (f = r("./node_modules/string_decoder/lib/string_decoder.js").StringDecoder), this._readableState.decoder = new f(e), this._readableState.encoding = e, this;};function w(e, t) {return e <= 0 || 0 === t.length && t.ended ? 0 : t.objectMode ? 1 : e != e ? t.flowing && t.length ? t.buffer.head.data.length : t.length : (e > t.highWaterMark && (t.highWaterMark = function (e) {return e >= 8388608 ? e = 8388608 : (e--, e |= e >>> 1, e |= e >>> 2, e |= e >>> 4, e |= e >>> 8, e |= e >>> 16, e++), e;}(e)), e <= t.length ? e : t.ended ? t.length : (t.needReadable = !0, 0));}function j(e) {var t = e._readableState;t.needReadable = !1, t.emittedReadable || (h("emitReadable", t.flowing), t.emittedReadable = !0, t.sync ? n.nextTick(E, e) : E(e));}function E(e) {h("emit readable"), e.emit("readable"), O(e);}function k(e, t) {t.readingMore || (t.readingMore = !0, n.nextTick(S, e, t));}function S(e, t) {for (var r = t.length; !t.reading && !t.flowing && !t.ended && t.length < t.highWaterMark && (h("maybeReadMore read 0"), e.read(0), r !== t.length);) r = t.length;t.readingMore = !1;}function C(e) {h("readable nexttick read 0"), e.read(0);}function x(e, t) {t.reading || (h("resume read 0"), e.read(0)), t.resumeScheduled = !1, t.awaitDrain = 0, e.emit("resume"), O(e), t.flowing && !t.reading && e.read(0);}function O(e) {var t = e._readableState;for (h("flow", t.flowing); t.flowing && null !== e.read(););}function A(e, t) {return 0 === t.length ? null : (t.objectMode ? r = t.buffer.shift() : !e || e >= t.length ? (r = t.decoder ? t.buffer.join("") : 1 === t.buffer.length ? t.buffer.head.data : t.buffer.concat(t.length), t.buffer.clear()) : r = function (e, t, r) {var n;e < t.head.data.length ? (n = t.head.data.slice(0, e), t.head.data = t.head.data.slice(e)) : n = e === t.head.data.length ? t.shift() : r ? function (e, t) {var r = t.head, + n = 1, + o = r.data;e -= o.length;for (; r = r.next;) {var s = r.data, + i = e > s.length ? s.length : e;if (i === s.length ? o += s : o += s.slice(0, e), 0 === (e -= i)) {i === s.length ? (++n, r.next ? t.head = r.next : t.head = t.tail = null) : (t.head = r, r.data = s.slice(i));break;}++n;}return t.length -= n, o;}(e, t) : function (e, t) {var r = l.allocUnsafe(e), + n = t.head, + o = 1;n.data.copy(r), e -= n.data.length;for (; n = n.next;) {var s = n.data, + i = e > s.length ? s.length : e;if (s.copy(r, r.length - e, 0, i), 0 === (e -= i)) {i === s.length ? (++o, n.next ? t.head = n.next : t.head = t.tail = null) : (t.head = n, n.data = s.slice(i));break;}++o;}return t.length -= o, r;}(e, t);return n;}(e, t.buffer, t.decoder), r);var r;}function R(e) {var t = e._readableState;if (t.length > 0) throw new Error('"endReadable()" called on non-empty stream');t.endEmitted || (t.ended = !0, n.nextTick(I, t, e));}function I(e, t) {e.endEmitted || 0 !== e.length || (e.endEmitted = !0, t.readable = !1, t.emit("end"));}function T(e, t) {for (var r = 0, n = e.length; r < n; r++) if (e[r] === t) return r;return -1;}v.prototype.read = function (e) {h("read", e), e = parseInt(e, 10);var t = this._readableState, + r = e;if (0 !== e && (t.emittedReadable = !1), 0 === e && t.needReadable && (t.length >= t.highWaterMark || t.ended)) return h("read: emitReadable", t.length, t.ended), 0 === t.length && t.ended ? R(this) : j(this), null;if (0 === (e = w(e, t)) && t.ended) return 0 === t.length && R(this), null;var n, + o = t.needReadable;return h("need readable", o), (0 === t.length || t.length - e < t.highWaterMark) && h("length less than watermark", o = !0), t.ended || t.reading ? h("reading or ended", o = !1) : o && (h("do read"), t.reading = !0, t.sync = !0, 0 === t.length && (t.needReadable = !0), this._read(t.highWaterMark), t.sync = !1, t.reading || (e = w(r, t))), null === (n = e > 0 ? A(e, t) : null) ? (t.needReadable = !0, e = 0) : t.length -= e, 0 === t.length && (t.ended || (t.needReadable = !0), r !== e && t.ended && R(this)), null !== n && this.emit("data", n), n;}, v.prototype._read = function (e) {this.emit("error", new Error("_read() is not implemented"));}, v.prototype.pipe = function (e, t) {var r = this, + o = this._readableState;switch (o.pipesCount) {case 0: + o.pipes = e; + break; + case 1: + o.pipes = [o.pipes, e]; + break; + default: + o.pipes.push(e); + }o.pipesCount += 1, h("pipe count=%d opts=%j", o.pipesCount, t);var a = (!t || !1 !== t.end) && e !== process.stdout && e !== process.stderr ? u : v;function l(t, n) {h("onunpipe"), t === r && n && !1 === n.hasUnpiped && (n.hasUnpiped = !0, h("cleanup"), e.removeListener("close", g), e.removeListener("finish", _), e.removeListener("drain", c), e.removeListener("error", m), e.removeListener("unpipe", l), r.removeListener("end", u), r.removeListener("end", v), r.removeListener("data", p), d = !0, !o.awaitDrain || e._writableState && !e._writableState.needDrain || c());}function u() {h("onend"), e.end();}o.endEmitted ? n.nextTick(a) : r.once("end", a), e.on("unpipe", l);var c = function (e) {return function () {var t = e._readableState;h("pipeOnDrain", t.awaitDrain), t.awaitDrain && t.awaitDrain--, 0 === t.awaitDrain && i(e, "data") && (t.flowing = !0, O(e));};}(r);e.on("drain", c);var d = !1;var f = !1;function p(t) {h("ondata"), f = !1, !1 !== e.write(t) || f || ((1 === o.pipesCount && o.pipes === e || o.pipesCount > 1 && -1 !== T(o.pipes, e)) && !d && (h("false write response, pause", r._readableState.awaitDrain), r._readableState.awaitDrain++, f = !0), r.pause());}function m(t) {h("onerror", t), v(), e.removeListener("error", m), 0 === i(e, "error") && e.emit("error", t);}function g() {e.removeListener("finish", _), v();}function _() {h("onfinish"), e.removeListener("close", g), v();}function v() {h("unpipe"), r.unpipe(e);}return r.on("data", p), function (e, t, r) {if ("function" == typeof e.prependListener) return e.prependListener(t, r);e._events && e._events[t] ? s(e._events[t]) ? e._events[t].unshift(r) : e._events[t] = [r, e._events[t]] : e.on(t, r);}(e, "error", m), e.once("close", g), e.once("finish", _), e.emit("pipe", r), o.flowing || (h("pipe resume"), r.resume()), e;}, v.prototype.unpipe = function (e) {var t = this._readableState, + r = { hasUnpiped: !1 };if (0 === t.pipesCount) return this;if (1 === t.pipesCount) return e && e !== t.pipes || (e || (e = t.pipes), t.pipes = null, t.pipesCount = 0, t.flowing = !1, e && e.emit("unpipe", this, r)), this;if (!e) {var n = t.pipes, + o = t.pipesCount;t.pipes = null, t.pipesCount = 0, t.flowing = !1;for (var s = 0; s < o; s++) n[s].emit("unpipe", this, r);return this;}var i = T(t.pipes, e);return -1 === i || (t.pipes.splice(i, 1), t.pipesCount -= 1, 1 === t.pipesCount && (t.pipes = t.pipes[0]), e.emit("unpipe", this, r)), this;}, v.prototype.on = function (e, t) {var r = a.prototype.on.call(this, e, t);if ("data" === e) !1 !== this._readableState.flowing && this.resume();else if ("readable" === e) {var o = this._readableState;o.endEmitted || o.readableListening || (o.readableListening = o.needReadable = !0, o.emittedReadable = !1, o.reading ? o.length && j(this) : n.nextTick(C, this));}return r;}, v.prototype.addListener = v.prototype.on, v.prototype.resume = function () {var e = this._readableState;return e.flowing || (h("resume"), e.flowing = !0, function (e, t) {t.resumeScheduled || (t.resumeScheduled = !0, n.nextTick(x, e, t));}(this, e)), this;}, v.prototype.pause = function () {return h("call pause flowing=%j", this._readableState.flowing), !1 !== this._readableState.flowing && (h("pause"), this._readableState.flowing = !1, this.emit("pause")), this;}, v.prototype.wrap = function (e) {var t = this, + r = this._readableState, + n = !1;for (var o in e.on("end", function () {if (h("wrapped end"), r.decoder && !r.ended) {var e = r.decoder.end();e && e.length && t.push(e);}t.push(null);}), e.on("data", function (o) {(h("wrapped data"), r.decoder && (o = r.decoder.write(o)), r.objectMode && null == o) || (r.objectMode || o && o.length) && (t.push(o) || (n = !0, e.pause()));}), e) void 0 === this[o] && "function" == typeof e[o] && (this[o] = function (t) {return function () {return e[t].apply(e, arguments);};}(o));for (var s = 0; s < g.length; s++) e.on(g[s], this.emit.bind(this, g[s]));return this._read = function (t) {h("wrapped _read", t), n && (n = !1, e.resume());}, this;}, Object.defineProperty(v.prototype, "readableHighWaterMark", { enumerable: !1, get: function () {return this._readableState.highWaterMark;} }), v._fromList = A;}, "./node_modules/readable-stream/lib/_stream_transform.js": function (e, t, r) {"use strict"; + e.exports = i;var n = r("./node_modules/readable-stream/lib/_stream_duplex.js"), + o = Object.create(r("./node_modules/core-util-is/lib/util.js"));function s(e, t) {var r = this._transformState;r.transforming = !1;var n = r.writecb;if (!n) return this.emit("error", new Error("write callback called multiple times"));r.writechunk = null, r.writecb = null, null != t && this.push(t), n(e);var o = this._readableState;o.reading = !1, (o.needReadable || o.length < o.highWaterMark) && this._read(o.highWaterMark);}function i(e) {if (!(this instanceof i)) return new i(e);n.call(this, e), this._transformState = { afterTransform: s.bind(this), needTransform: !1, transforming: !1, writecb: null, writechunk: null, writeencoding: null }, this._readableState.needReadable = !0, this._readableState.sync = !1, e && ("function" == typeof e.transform && (this._transform = e.transform), "function" == typeof e.flush && (this._flush = e.flush)), this.on("prefinish", a);}function a() {var e = this;"function" == typeof this._flush ? this._flush(function (t, r) {l(e, t, r);}) : l(this, null, null);}function l(e, t, r) {if (t) return e.emit("error", t);if (null != r && e.push(r), e._writableState.length) throw new Error("Calling transform done when ws.length != 0");if (e._transformState.transforming) throw new Error("Calling transform done when still transforming");return e.push(null);}o.inherits = r("./node_modules/inherits/inherits.js"), o.inherits(i, n), i.prototype.push = function (e, t) {return this._transformState.needTransform = !1, n.prototype.push.call(this, e, t);}, i.prototype._transform = function (e, t, r) {throw new Error("_transform() is not implemented");}, i.prototype._write = function (e, t, r) {var n = this._transformState;if (n.writecb = r, n.writechunk = e, n.writeencoding = t, !n.transforming) {var o = this._readableState;(n.needTransform || o.needReadable || o.length < o.highWaterMark) && this._read(o.highWaterMark);}}, i.prototype._read = function (e) {var t = this._transformState;null !== t.writechunk && t.writecb && !t.transforming ? (t.transforming = !0, this._transform(t.writechunk, t.writeencoding, t.afterTransform)) : t.needTransform = !0;}, i.prototype._destroy = function (e, t) {var r = this;n.prototype._destroy.call(this, e, function (e) {t(e), r.emit("close");});};}, "./node_modules/readable-stream/lib/_stream_writable.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/process-nextick-args/index.js");function o(e) {var t = this;this.next = null, this.entry = null, this.finish = function () {!function (e, t, r) {var n = e.entry;e.entry = null;for (; n;) {var o = n.callback;t.pendingcb--, o(r), n = n.next;}t.corkedRequestsFree ? t.corkedRequestsFree.next = e : t.corkedRequestsFree = e;}(t, e);};}e.exports = g;var s, + i = !process.browser && ["v0.10", "v0.9."].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : n.nextTick;g.WritableState = m;var a = Object.create(r("./node_modules/core-util-is/lib/util.js"));a.inherits = r("./node_modules/inherits/inherits.js");var l = { deprecate: r("./node_modules/util-deprecate/node.js") }, + u = r("./node_modules/readable-stream/lib/internal/streams/stream.js"), + c = r("./node_modules/safe-buffer/index.js").Buffer, + d = global.Uint8Array || function () {};var h, + f = r("./node_modules/readable-stream/lib/internal/streams/destroy.js");function p() {}function m(e, t) {s = s || r("./node_modules/readable-stream/lib/_stream_duplex.js"), e = e || {};var a = t instanceof s;this.objectMode = !!e.objectMode, a && (this.objectMode = this.objectMode || !!e.writableObjectMode);var l = e.highWaterMark, + u = e.writableHighWaterMark, + c = this.objectMode ? 16 : 16384;this.highWaterMark = l || 0 === l ? l : a && (u || 0 === u) ? u : c, this.highWaterMark = Math.floor(this.highWaterMark), this.finalCalled = !1, this.needDrain = !1, this.ending = !1, this.ended = !1, this.finished = !1, this.destroyed = !1;var d = !1 === e.decodeStrings;this.decodeStrings = !d, this.defaultEncoding = e.defaultEncoding || "utf8", this.length = 0, this.writing = !1, this.corked = 0, this.sync = !0, this.bufferProcessing = !1, this.onwrite = function (e) {!function (e, t) {var r = e._writableState, + o = r.sync, + s = r.writecb;if (function (e) {e.writing = !1, e.writecb = null, e.length -= e.writelen, e.writelen = 0;}(r), t) !function (e, t, r, o, s) {--t.pendingcb, r ? (n.nextTick(s, o), n.nextTick(j, e, t), e._writableState.errorEmitted = !0, e.emit("error", o)) : (s(o), e._writableState.errorEmitted = !0, e.emit("error", o), j(e, t));}(e, r, o, t, s);else {var a = y(r);a || r.corked || r.bufferProcessing || !r.bufferedRequest || b(e, r), o ? i(v, e, r, a, s) : v(e, r, a, s);}}(t, e);}, this.writecb = null, this.writelen = 0, this.bufferedRequest = null, this.lastBufferedRequest = null, this.pendingcb = 0, this.prefinished = !1, this.errorEmitted = !1, this.bufferedRequestCount = 0, this.corkedRequestsFree = new o(this);}function g(e) {if (s = s || r("./node_modules/readable-stream/lib/_stream_duplex.js"), !(h.call(g, this) || this instanceof s)) return new g(e);this._writableState = new m(e, this), this.writable = !0, e && ("function" == typeof e.write && (this._write = e.write), "function" == typeof e.writev && (this._writev = e.writev), "function" == typeof e.destroy && (this._destroy = e.destroy), "function" == typeof e.final && (this._final = e.final)), u.call(this);}function _(e, t, r, n, o, s, i) {t.writelen = n, t.writecb = i, t.writing = !0, t.sync = !0, r ? e._writev(o, t.onwrite) : e._write(o, s, t.onwrite), t.sync = !1;}function v(e, t, r, n) {r || function (e, t) {0 === t.length && t.needDrain && (t.needDrain = !1, e.emit("drain"));}(e, t), t.pendingcb--, n(), j(e, t);}function b(e, t) {t.bufferProcessing = !0;var r = t.bufferedRequest;if (e._writev && r && r.next) {var n = t.bufferedRequestCount, + s = new Array(n), + i = t.corkedRequestsFree;i.entry = r;for (var a = 0, l = !0; r;) s[a] = r, r.isBuf || (l = !1), r = r.next, a += 1;s.allBuffers = l, _(e, t, !0, t.length, s, "", i.finish), t.pendingcb++, t.lastBufferedRequest = null, i.next ? (t.corkedRequestsFree = i.next, i.next = null) : t.corkedRequestsFree = new o(t), t.bufferedRequestCount = 0;} else {for (; r;) {var u = r.chunk, + c = r.encoding, + d = r.callback;if (_(e, t, !1, t.objectMode ? 1 : u.length, u, c, d), r = r.next, t.bufferedRequestCount--, t.writing) break;}null === r && (t.lastBufferedRequest = null);}t.bufferedRequest = r, t.bufferProcessing = !1;}function y(e) {return e.ending && 0 === e.length && null === e.bufferedRequest && !e.finished && !e.writing;}function w(e, t) {e._final(function (r) {t.pendingcb--, r && e.emit("error", r), t.prefinished = !0, e.emit("prefinish"), j(e, t);});}function j(e, t) {var r = y(t);return r && (!function (e, t) {t.prefinished || t.finalCalled || ("function" == typeof e._final ? (t.pendingcb++, t.finalCalled = !0, n.nextTick(w, e, t)) : (t.prefinished = !0, e.emit("prefinish")));}(e, t), 0 === t.pendingcb && (t.finished = !0, e.emit("finish"))), r;}a.inherits(g, u), m.prototype.getBuffer = function () {for (var e = this.bufferedRequest, t = []; e;) t.push(e), e = e.next;return t;}, function () {try {Object.defineProperty(m.prototype, "buffer", { get: l.deprecate(function () {return this.getBuffer();}, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003") });} catch (e) {}}(), "function" == typeof Symbol && Symbol.hasInstance && "function" == typeof Function.prototype[Symbol.hasInstance] ? (h = Function.prototype[Symbol.hasInstance], Object.defineProperty(g, Symbol.hasInstance, { value: function (e) {return !!h.call(this, e) || this === g && (e && e._writableState instanceof m);} })) : h = function (e) {return e instanceof this;}, g.prototype.pipe = function () {this.emit("error", new Error("Cannot pipe, not readable"));}, g.prototype.write = function (e, t, r) {var o, + s = this._writableState, + i = !1, + a = !s.objectMode && (o = e, c.isBuffer(o) || o instanceof d);return a && !c.isBuffer(e) && (e = function (e) {return c.from(e);}(e)), "function" == typeof t && (r = t, t = null), a ? t = "buffer" : t || (t = s.defaultEncoding), "function" != typeof r && (r = p), s.ended ? function (e, t) {var r = new Error("write after end");e.emit("error", r), n.nextTick(t, r);}(this, r) : (a || function (e, t, r, o) {var s = !0, + i = !1;return null === r ? i = new TypeError("May not write null values to stream") : "string" == typeof r || void 0 === r || t.objectMode || (i = new TypeError("Invalid non-string/buffer chunk")), i && (e.emit("error", i), n.nextTick(o, i), s = !1), s;}(this, s, e, r)) && (s.pendingcb++, i = function (e, t, r, n, o, s) {if (!r) {var i = function (e, t, r) {e.objectMode || !1 === e.decodeStrings || "string" != typeof t || (t = c.from(t, r));return t;}(t, n, o);n !== i && (r = !0, o = "buffer", n = i);}var a = t.objectMode ? 1 : n.length;t.length += a;var l = t.length < t.highWaterMark;l || (t.needDrain = !0);if (t.writing || t.corked) {var u = t.lastBufferedRequest;t.lastBufferedRequest = { chunk: n, encoding: o, isBuf: r, callback: s, next: null }, u ? u.next = t.lastBufferedRequest : t.bufferedRequest = t.lastBufferedRequest, t.bufferedRequestCount += 1;} else _(e, t, !1, a, n, o, s);return l;}(this, s, a, e, t, r)), i;}, g.prototype.cork = function () {this._writableState.corked++;}, g.prototype.uncork = function () {var e = this._writableState;e.corked && (e.corked--, e.writing || e.corked || e.finished || e.bufferProcessing || !e.bufferedRequest || b(this, e));}, g.prototype.setDefaultEncoding = function (e) {if ("string" == typeof e && (e = e.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((e + "").toLowerCase()) > -1)) throw new TypeError("Unknown encoding: " + e);return this._writableState.defaultEncoding = e, this;}, Object.defineProperty(g.prototype, "writableHighWaterMark", { enumerable: !1, get: function () {return this._writableState.highWaterMark;} }), g.prototype._write = function (e, t, r) {r(new Error("_write() is not implemented"));}, g.prototype._writev = null, g.prototype.end = function (e, t, r) {var o = this._writableState;"function" == typeof e ? (r = e, e = null, t = null) : "function" == typeof t && (r = t, t = null), null != e && this.write(e, t), o.corked && (o.corked = 1, this.uncork()), o.ending || o.finished || function (e, t, r) {t.ending = !0, j(e, t), r && (t.finished ? n.nextTick(r) : e.once("finish", r));t.ended = !0, e.writable = !1;}(this, o, r);}, Object.defineProperty(g.prototype, "destroyed", { get: function () {return void 0 !== this._writableState && this._writableState.destroyed;}, set: function (e) {this._writableState && (this._writableState.destroyed = e);} }), g.prototype.destroy = f.destroy, g.prototype._undestroy = f.undestroy, g.prototype._destroy = function (e, t) {this.end(), t(e);};}, "./node_modules/readable-stream/lib/internal/streams/BufferList.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/safe-buffer/index.js").Buffer, + o = r("util");e.exports = function () {function e() {!function (e, t) {if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function");}(this, e), this.head = null, this.tail = null, this.length = 0;}return e.prototype.push = function (e) {var t = { data: e, next: null };this.length > 0 ? this.tail.next = t : this.head = t, this.tail = t, ++this.length;}, e.prototype.unshift = function (e) {var t = { data: e, next: this.head };0 === this.length && (this.tail = t), this.head = t, ++this.length;}, e.prototype.shift = function () {if (0 !== this.length) {var e = this.head.data;return 1 === this.length ? this.head = this.tail = null : this.head = this.head.next, --this.length, e;}}, e.prototype.clear = function () {this.head = this.tail = null, this.length = 0;}, e.prototype.join = function (e) {if (0 === this.length) return "";for (var t = this.head, r = "" + t.data; t = t.next;) r += e + t.data;return r;}, e.prototype.concat = function (e) {if (0 === this.length) return n.alloc(0);if (1 === this.length) return this.head.data;for (var t, r, o, s = n.allocUnsafe(e >>> 0), i = this.head, a = 0; i;) t = i.data, r = s, o = a, t.copy(r, o), a += i.data.length, i = i.next;return s;}, e;}(), o && o.inspect && o.inspect.custom && (e.exports.prototype[o.inspect.custom] = function () {var e = o.inspect({ length: this.length });return this.constructor.name + " " + e;});}, "./node_modules/readable-stream/lib/internal/streams/destroy.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/process-nextick-args/index.js");function o(e, t) {e.emit("error", t);}e.exports = { destroy: function (e, t) {var r = this, + s = this._readableState && this._readableState.destroyed, + i = this._writableState && this._writableState.destroyed;return s || i ? (t ? t(e) : !e || this._writableState && this._writableState.errorEmitted || n.nextTick(o, this, e), this) : (this._readableState && (this._readableState.destroyed = !0), this._writableState && (this._writableState.destroyed = !0), this._destroy(e || null, function (e) {!t && e ? (n.nextTick(o, r, e), r._writableState && (r._writableState.errorEmitted = !0)) : t && t(e);}), this);}, undestroy: function () {this._readableState && (this._readableState.destroyed = !1, this._readableState.reading = !1, this._readableState.ended = !1, this._readableState.endEmitted = !1), this._writableState && (this._writableState.destroyed = !1, this._writableState.ended = !1, this._writableState.ending = !1, this._writableState.finished = !1, this._writableState.errorEmitted = !1);} };}, "./node_modules/readable-stream/lib/internal/streams/stream.js": function (e, t, r) {e.exports = r("stream");}, "./node_modules/readable-stream/readable.js": function (e, t, r) {var n = r("stream");"disable" === process.env.READABLE_STREAM && n ? (e.exports = n, (t = e.exports = n.Readable).Readable = n.Readable, t.Writable = n.Writable, t.Duplex = n.Duplex, t.Transform = n.Transform, t.PassThrough = n.PassThrough, t.Stream = n) : ((t = e.exports = r("./node_modules/readable-stream/lib/_stream_readable.js")).Stream = n || t, t.Readable = t, t.Writable = r("./node_modules/readable-stream/lib/_stream_writable.js"), t.Duplex = r("./node_modules/readable-stream/lib/_stream_duplex.js"), t.Transform = r("./node_modules/readable-stream/lib/_stream_transform.js"), t.PassThrough = r("./node_modules/readable-stream/lib/_stream_passthrough.js"));}, "./node_modules/rimraf/rimraf.js": function (e, t, r) {const n = r("assert"), + o = r("path"), + s = r("fs");let i = void 0;try {i = r("./node_modules/glob/glob.js");} catch (e) {}const a = { nosort: !0, silent: !0 };let l = 0;const u = "win32" === process.platform, + c = e => {if (["unlink", "chmod", "stat", "lstat", "rmdir", "readdir"].forEach(t => {e[t] = e[t] || s[t], e[t += "Sync"] = e[t] || s[t];}), e.maxBusyTries = e.maxBusyTries || 3, e.emfileWait = e.emfileWait || 1e3, !1 === e.glob && (e.disableGlob = !0), !0 !== e.disableGlob && void 0 === i) throw Error("glob dependency not found, set `options.disableGlob = true` if intentional");e.disableGlob = e.disableGlob || !1, e.glob = e.glob || a;}, + d = (e, t, r) => {"function" == typeof t && (r = t, t = {}), n(e, "rimraf: missing path"), n.equal(typeof e, "string", "rimraf: path should be a string"), n.equal(typeof r, "function", "rimraf: callback function required"), n(t, "rimraf: invalid options argument provided"), n.equal(typeof t, "object", "rimraf: options should be object"), c(t);let o = 0, + s = null, + a = 0;const u = (e, n) => e ? r(e) : (a = n.length, 0 === a ? r() : void n.forEach(e => {const n = i => {if (i) {if (("EBUSY" === i.code || "ENOTEMPTY" === i.code || "EPERM" === i.code) && o < t.maxBusyTries) return o++, setTimeout(() => h(e, t, n), 100 * o);if ("EMFILE" === i.code && l < t.emfileWait) return setTimeout(() => h(e, t, n), l++);"ENOENT" === i.code && (i = null);}l = 0, (e => {s = s || e, 0 == --a && r(s);})(i);};h(e, t, n);}));if (t.disableGlob || !i.hasMagic(e)) return u(null, [e]);t.lstat(e, (r, n) => {if (!r) return u(null, [e]);i(e, t.glob, u);});}, + h = (e, t, r) => {n(e), n(t), n("function" == typeof r), t.lstat(e, (n, o) => n && "ENOENT" === n.code ? r(null) : (n && "EPERM" === n.code && u && f(e, t, n, r), o && o.isDirectory() ? m(e, t, n, r) : void t.unlink(e, n => {if (n) {if ("ENOENT" === n.code) return r(null);if ("EPERM" === n.code) return u ? f(e, t, n, r) : m(e, t, n, r);if ("EISDIR" === n.code) return m(e, t, n, r);}return r(n);})));}, + f = (e, t, r, o) => {n(e), n(t), n("function" == typeof o), t.chmod(e, 438, n => {n ? o("ENOENT" === n.code ? null : r) : t.stat(e, (n, s) => {n ? o("ENOENT" === n.code ? null : r) : s.isDirectory() ? m(e, t, r, o) : t.unlink(e, o);});});}, + p = (e, t, r) => {n(e), n(t);try {t.chmodSync(e, 438);} catch (e) {if ("ENOENT" === e.code) return;throw r;}let o;try {o = t.statSync(e);} catch (e) {if ("ENOENT" === e.code) return;throw r;}o.isDirectory() ? v(e, t, r) : t.unlinkSync(e);}, + m = (e, t, r, o) => {n(e), n(t), n("function" == typeof o), t.rmdir(e, n => {!n || "ENOTEMPTY" !== n.code && "EEXIST" !== n.code && "EPERM" !== n.code ? n && "ENOTDIR" === n.code ? o(r) : o(n) : g(e, t, o);});}, + g = (e, t, r) => {n(e), n(t), n("function" == typeof r), t.readdir(e, (n, s) => {if (n) return r(n);let i, + a = s.length;if (0 === a) return t.rmdir(e, r);s.forEach(n => {d(o.join(e, n), t, n => {if (!i) return n ? r(i = n) : void (0 == --a && t.rmdir(e, r));});});});}, + _ = (e, t) => {let r;if (c(t = t || {}), n(e, "rimraf: missing path"), n.equal(typeof e, "string", "rimraf: path should be a string"), n(t, "rimraf: missing options"), n.equal(typeof t, "object", "rimraf: options should be object"), t.disableGlob || !i.hasMagic(e)) r = [e];else try {t.lstatSync(e), r = [e];} catch (n) {r = i.sync(e, t.glob);}if (r.length) for (let e = 0; e < r.length; e++) {const n = r[e];let o;try {o = t.lstatSync(n);} catch (e) {if ("ENOENT" === e.code) return;"EPERM" === e.code && u && p(n, t, e);}try {o && o.isDirectory() ? v(n, t, null) : t.unlinkSync(n);} catch (e) {if ("ENOENT" === e.code) return;if ("EPERM" === e.code) return u ? p(n, t, e) : v(n, t, e);if ("EISDIR" !== e.code) throw e;v(n, t, e);}}}, + v = (e, t, r) => {n(e), n(t);try {t.rmdirSync(e);} catch (n) {if ("ENOENT" === n.code) return;if ("ENOTDIR" === n.code) throw r;"ENOTEMPTY" !== n.code && "EEXIST" !== n.code && "EPERM" !== n.code || b(e, t);}}, + b = (e, t) => {n(e), n(t), t.readdirSync(e).forEach(r => _(o.join(e, r), t));const r = u ? 100 : 1;let s = 0;for (;;) {let n = !0;try {const o = t.rmdirSync(e, t);return n = !1, o;} finally {if (++s < r && n) continue;}}};e.exports = d, d.sync = _;}, "./node_modules/safe-buffer/index.js": function (e, t, r) {var n = r("buffer"), + o = n.Buffer;function s(e, t) {for (var r in e) t[r] = e[r];}function i(e, t, r) {return o(e, t, r);}o.from && o.alloc && o.allocUnsafe && o.allocUnsafeSlow ? e.exports = n : (s(n, t), t.Buffer = i), s(o, i), i.from = function (e, t, r) {if ("number" == typeof e) throw new TypeError("Argument must not be a number");return o(e, t, r);}, i.alloc = function (e, t, r) {if ("number" != typeof e) throw new TypeError("Argument must be a number");var n = o(e);return void 0 !== t ? "string" == typeof r ? n.fill(t, r) : n.fill(t) : n.fill(0), n;}, i.allocUnsafe = function (e) {if ("number" != typeof e) throw new TypeError("Argument must be a number");return o(e);}, i.allocUnsafeSlow = function (e) {if ("number" != typeof e) throw new TypeError("Argument must be a number");return n.SlowBuffer(e);};}, "./node_modules/set-immediate-shim/index.js": function (e, t, r) {"use strict"; + e.exports = "function" == typeof setImmediate ? setImmediate : function () {var e = [].slice.apply(arguments);e.splice(1, 0, 0), setTimeout.apply(null, e);};}, "./node_modules/string_decoder/lib/string_decoder.js": function (e, t, r) {"use strict"; + var n = r("./node_modules/safe-buffer/index.js").Buffer, + o = n.isEncoding || function (e) {switch ((e = "" + e) && e.toLowerCase()) {case "hex":case "utf8":case "utf-8":case "ascii":case "binary":case "base64":case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":case "raw": + return !0; + default: + return !1; + }};function s(e) {var t;switch (this.encoding = function (e) {var t = function (e) {if (!e) return "utf8";for (var t;;) switch (e) {case "utf8":case "utf-8": + return "utf8"; + case "ucs2":case "ucs-2":case "utf16le":case "utf-16le": + return "utf16le"; + case "latin1":case "binary": + return "latin1"; + case "base64":case "ascii":case "hex": + return e; + default: + if (t) return; + e = ("" + e).toLowerCase(), t = !0; + }}(e);if ("string" != typeof t && (n.isEncoding === o || !o(e))) throw new Error("Unknown encoding: " + e);return t || e;}(e), this.encoding) {case "utf16le": + this.text = l, this.end = u, t = 4; + break; + case "utf8": + this.fillLast = a, t = 4; + break; + case "base64": + this.text = c, this.end = d, t = 3; + break; + default: + return this.write = h, void (this.end = f); + }this.lastNeed = 0, this.lastTotal = 0, this.lastChar = n.allocUnsafe(t);}function i(e) {return e <= 127 ? 0 : e >> 5 == 6 ? 2 : e >> 4 == 14 ? 3 : e >> 3 == 30 ? 4 : e >> 6 == 2 ? -1 : -2;}function a(e) {var t = this.lastTotal - this.lastNeed, + r = function (e, t, r) {if (128 != (192 & t[0])) return e.lastNeed = 0, "�";if (e.lastNeed > 1 && t.length > 1) {if (128 != (192 & t[1])) return e.lastNeed = 1, "�";if (e.lastNeed > 2 && t.length > 2 && 128 != (192 & t[2])) return e.lastNeed = 2, "�";}}(this, e);return void 0 !== r ? r : this.lastNeed <= e.length ? (e.copy(this.lastChar, t, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal)) : (e.copy(this.lastChar, t, 0, e.length), void (this.lastNeed -= e.length));}function l(e, t) {if ((e.length - t) % 2 == 0) {var r = e.toString("utf16le", t);if (r) {var n = r.charCodeAt(r.length - 1);if (n >= 55296 && n <= 56319) return this.lastNeed = 2, this.lastTotal = 4, this.lastChar[0] = e[e.length - 2], this.lastChar[1] = e[e.length - 1], r.slice(0, -1);}return r;}return this.lastNeed = 1, this.lastTotal = 2, this.lastChar[0] = e[e.length - 1], e.toString("utf16le", t, e.length - 1);}function u(e) {var t = e && e.length ? this.write(e) : "";if (this.lastNeed) {var r = this.lastTotal - this.lastNeed;return t + this.lastChar.toString("utf16le", 0, r);}return t;}function c(e, t) {var r = (e.length - t) % 3;return 0 === r ? e.toString("base64", t) : (this.lastNeed = 3 - r, this.lastTotal = 3, 1 === r ? this.lastChar[0] = e[e.length - 1] : (this.lastChar[0] = e[e.length - 2], this.lastChar[1] = e[e.length - 1]), e.toString("base64", t, e.length - r));}function d(e) {var t = e && e.length ? this.write(e) : "";return this.lastNeed ? t + this.lastChar.toString("base64", 0, 3 - this.lastNeed) : t;}function h(e) {return e.toString(this.encoding);}function f(e) {return e && e.length ? this.write(e) : "";}t.StringDecoder = s, s.prototype.write = function (e) {if (0 === e.length) return "";var t, r;if (this.lastNeed) {if (void 0 === (t = this.fillLast(e))) return "";r = this.lastNeed, this.lastNeed = 0;} else r = 0;return r < e.length ? t ? t + this.text(e, r) : this.text(e, r) : t || "";}, s.prototype.end = function (e) {var t = e && e.length ? this.write(e) : "";return this.lastNeed ? t + "�" : t;}, s.prototype.text = function (e, t) {var r = function (e, t, r) {var n = t.length - 1;if (n < r) return 0;var o = i(t[n]);if (o >= 0) return o > 0 && (e.lastNeed = o - 1), o;if (--n < r || -2 === o) return 0;if ((o = i(t[n])) >= 0) return o > 0 && (e.lastNeed = o - 2), o;if (--n < r || -2 === o) return 0;if ((o = i(t[n])) >= 0) return o > 0 && (2 === o ? o = 0 : e.lastNeed = o - 3), o;return 0;}(this, e, t);if (!this.lastNeed) return e.toString("utf8", t);this.lastTotal = r;var n = e.length - (r - this.lastNeed);return e.copy(this.lastChar, 0, n), e.toString("utf8", t, n);}, s.prototype.fillLast = function (e) {if (this.lastNeed <= e.length) return e.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal);e.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, e.length), this.lastNeed -= e.length;};}, "./node_modules/supports-color/index.js": function (e, t, r) {"use strict"; + const n = r("os"), + o = r("tty"), + s = r("./node_modules/has-flag/index.js"), + { + env: i + } = process;let a;function l(e) {return 0 !== e && { level: e, hasBasic: !0, has256: e >= 2, has16m: e >= 3 };}function u(e, t) {if (0 === a) return 0;if (s("color=16m") || s("color=full") || s("color=truecolor")) return 3;if (s("color=256")) return 2;if (e && !t && void 0 === a) return 0;const r = a || 0;if ("dumb" === i.TERM) return r;if ("win32" === process.platform) {const e = n.release().split(".");return Number(e[0]) >= 10 && Number(e[2]) >= 10586 ? Number(e[2]) >= 14931 ? 3 : 2 : 1;}if ("CI" in i) return ["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI"].some(e => e in i) || "codeship" === i.CI_NAME ? 1 : r;if ("TEAMCITY_VERSION" in i) return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(i.TEAMCITY_VERSION) ? 1 : 0;if ("GITHUB_ACTIONS" in i) return 1;if ("truecolor" === i.COLORTERM) return 3;if ("TERM_PROGRAM" in i) {const e = parseInt((i.TERM_PROGRAM_VERSION || "").split(".")[0], 10);switch (i.TERM_PROGRAM) {case "iTerm.app": + return e >= 3 ? 3 : 2; + case "Apple_Terminal": + return 2; + }}return /-256(color)?$/i.test(i.TERM) ? 2 : /^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(i.TERM) || "COLORTERM" in i ? 1 : r;}s("no-color") || s("no-colors") || s("color=false") || s("color=never") ? a = 0 : (s("color") || s("colors") || s("color=true") || s("color=always")) && (a = 1), "FORCE_COLOR" in i && (a = "true" === i.FORCE_COLOR ? 1 : "false" === i.FORCE_COLOR ? 0 : 0 === i.FORCE_COLOR.length ? 1 : Math.min(parseInt(i.FORCE_COLOR, 10), 3)), e.exports = { supportsColor: function (e) {return l(u(e, e && e.isTTY));}, stdout: l(u(!0, o.isatty(1))), stderr: l(u(!0, o.isatty(2))) };}, "./node_modules/unzip-crx/dist/index.js": function (e, t, r) {"use strict"; + var n = r("fs"), + o = r("path"), + s = r("./node_modules/jszip/lib/index.js"), + i = r("./node_modules/unzip-crx/node_modules/mkdirp/index.js"), + a = r("./node_modules/yaku/lib/promisify.js"), + l = a(n.writeFile), + u = a(n.readFile), + c = a(i);e.exports = function (e, t) {var r = o.resolve(e), + n = o.extname(e), + i = o.basename(e, n), + a = o.dirname(e);return t = t || o.resolve(a, i), u(r).then(function (e) {return s.loadAsync(function (e) {function t(e, t, r, n) {var o = 0;return o += e, o += t << 8, o += r << 16, o += n << 24;}if (80 === e[0] && 75 === e[1] && 3 === e[2] && 4 === e[3]) return e;if (67 !== e[0] || 114 !== e[1] || 50 !== e[2] || 52 !== e[3]) throw new Error("Invalid header: Does not start with Cr24");if (2 !== e[4] || e[5] || e[6] || e[7]) throw new Error("Unexpected crx format version number.");var r = 16 + t(e[8], e[9], e[10], e[11]) + t(e[12], e[13], e[14], e[15]);return e.slice(r, e.length);}(e));}).then(function (e) {var r = Object.keys(e.files);return Promise.all(r.map(function (r) {var n = !e.files[r].dir, + s = o.join(t, r), + i = n && o.dirname(s) || s, + a = e.files[r].async("nodebuffer");return c(i).then(function () {return !!n && a;}).then(function (e) {return !e || l(s, e);});}));});};}, "./node_modules/unzip-crx/node_modules/mkdirp/index.js": function (e, t, r) {var n = r("path"), + o = r("fs"), + s = parseInt("0777", 8);function i(e, t, r, a) {"function" == typeof t ? (r = t, t = {}) : t && "object" == typeof t || (t = { mode: t });var l = t.mode, + u = t.fs || o;void 0 === l && (l = s), a || (a = null);var c = r || function () {};e = n.resolve(e), u.mkdir(e, l, function (r) {if (!r) return c(null, a = a || e);switch (r.code) {case "ENOENT": + if (n.dirname(e) === e) return c(r); + i(n.dirname(e), t, function (r, n) {r ? c(r, n) : i(e, t, c, n);}); + break; + default: + u.stat(e, function (e, t) {e || !t.isDirectory() ? c(r, a) : c(null, a);}); + }});}e.exports = i.mkdirp = i.mkdirP = i, i.sync = function e(t, r, i) {r && "object" == typeof r || (r = { mode: r });var a = r.mode, + l = r.fs || o;void 0 === a && (a = s), i || (i = null), t = n.resolve(t);try {l.mkdirSync(t, a), i = i || t;} catch (o) {switch (o.code) {case "ENOENT": + i = e(n.dirname(t), r, i), e(t, r, i); + break; + default: + var u; + + try {u = l.statSync(t);} catch (e) {throw o;} + + if (!u.isDirectory()) throw o; + }}return i;};}, "./node_modules/util-deprecate/node.js": function (e, t, r) {e.exports = r("util").deprecate;}, "./node_modules/webpack/buildin/module.js": function (e, t) {e.exports = function (e) {return e.webpackPolyfill || (e.deprecate = function () {}, e.paths = [], e.children || (e.children = []), Object.defineProperty(e, "loaded", { enumerable: !0, get: function () {return e.l;} }), Object.defineProperty(e, "id", { enumerable: !0, get: function () {return e.i;} }), e.webpackPolyfill = 1), e;};}, "./node_modules/wrappy/wrappy.js": function (e, t) {e.exports = function e(t, r) {if (t && r) return e(t)(r);if ("function" != typeof t) throw new TypeError("need wrapper function");return Object.keys(t).forEach(function (e) {n[e] = t[e];}), n;function n() {for (var e = new Array(arguments.length), r = 0; r < e.length; r++) e[r] = arguments[r];var n = t.apply(this, e), + o = e[e.length - 1];return "function" == typeof n && n !== o && Object.keys(o).forEach(function (e) {n[e] = o[e];}), n;}};}, "./node_modules/yaku/lib/_.js": function (e, t, r) {var n = r("./node_modules/yaku/lib/yaku.js");e.exports = { extendPrototype: function (e, t) {for (var r in t) e.prototype[r] = t[r];return e;}, isFunction: function (e) {return "function" == typeof e;}, isNumber: function (e) {return "number" == typeof e;}, Promise: n, slice: [].slice };}, "./node_modules/yaku/lib/promisify.js": function (e, t, r) {var n = r("./node_modules/yaku/lib/_.js"), + o = n.isFunction;e.exports = function (e, t) {return function (r, s, i, a, l) {var u, + c, + d, + h, + f = arguments.length;function p(e, t) {null == e ? d(t) : h(e);}switch (c = new n.Promise(function (e, t) {d = e, h = t;}), f) {case 0: + e.call(t, p); + break; + case 1: + o(r) ? e.call(t, r) : e.call(t, r, p); + break; + case 2: + o(s) ? e.call(t, r, s) : e.call(t, r, s, p); + break; + case 3: + o(i) ? e.call(t, r, s, i) : e.call(t, r, s, i, p); + break; + case 4: + o(a) ? e.call(t, r, s, i, a) : e.call(t, r, s, i, a, p); + break; + case 5: + o(l) ? e.call(t, r, s, i, a, l) : e.call(t, r, s, i, a, l, p); + break; + default: + u = new Array(f); + + for (var m = 0; m < f; m++) u[m] = arguments[m]; + + if (o(u[f - 1])) return e.apply(t, u); + u[m] = p, e.apply(t, u); + }return c;};};}, "./node_modules/yaku/lib/yaku.js": function (e, t) {!function () {"use strict"; + var t, + r, + n = "object" == typeof window ? window : global, + o = !1, + s = n.process, + i = Array, + a = Error, + l = { e: null }, + u = function () {}, + c = /^.+\/node_modules\/yaku\/.+\n?/gm, + d = e.exports = function (e) {var t;if (!f(this) || void 0 !== this._s) throw w("Invalid this");if (this._s = 2, o && (this._pt = j()), e !== u) {if (!p(e)) throw w("Invalid argument");(t = v(e)(O(this, 1), O(this, 0))) === l && I(this, 0, t.e);}};function h() {return d.Symbol.species || "Symbol(species)";}function f(e) {return e && "object" == typeof e;}function p(e) {return "function" == typeof e;}function m(e, t) {return e instanceof t;}function g(e, t, r) {if (!t(e)) throw w(r);}function _() {try {return t.apply(r, arguments);} catch (e) {return l.e = e, l;}}function v(e, n) {return t = e, r = n, _;}function b(e, t) {var r = i(e), + n = 0;function o() {for (var o = 0; o < n;) t(r[o], r[o + 1]), r[o++] = void 0, r[o++] = void 0;n = 0, r.length > e && (r.length = e);}return function (e, t) {r[n++] = e, r[n++] = t, 2 === n && d.nextTick(o);};}function y(e, t) {var r, + n, + o, + s, + a = 0;if (!e) throw w("Invalid argument");var u = e[d.Symbol.iterator];if (p(u)) n = u.call(e);else {if (!p(e.next)) {if (m(e, i)) {for (r = e.length; a < r;) t(e[a], a++);return a;}throw w("Invalid argument");}n = e;}for (; !(o = n.next()).done;) if ((s = v(t)(o.value, a++)) === l) throw p(n.return) && n.return(), s.e;return a;}function w(e) {return new TypeError(e);}function j(e) {return (e ? "" : "\nFrom previous ") + new a().stack;}d.default = d, function (e, t) {for (var r in t) e.prototype[r] = t[r];}(d, { then: function (e, t) {if (void 0 === this._s) throw w();return function (e, t, r, n) {p(r) && (t._onFulfilled = r);p(n) && (e._uh && S("rejectionHandled", e), t._onRejected = n);o && (t._pre = e);e[e._pCount++] = t, 2 !== e._s && E(e, t);return t;}(this, x(d.speciesConstructor(this, d)), e, t);}, catch: function (e) {return this.then(void 0, e);}, _pCount: 0, _pre: null, _Yaku: 1 }), d.resolve = function (e) {return C(e) ? e : T(x(this), e);}, d.reject = function (e) {return I(x(this), 0, e);}, d.race = function (e) {var t = this, + r = x(t), + n = function (e) {I(r, 1, e);}, + o = function (e) {I(r, 0, e);}, + s = v(y)(e, function (e) {t.resolve(e).then(n, o);});return s === l ? t.reject(s.e) : r;}, d.all = function (e) {var t, + r = this, + n = x(r), + o = [];function s(e) {I(n, 0, e);}return (t = v(y)(e, function (e, i) {r.resolve(e).then(function (e) {o[i] = e, --t || I(n, 1, o);}, s);})) === l ? r.reject(t.e) : (t || I(n, 1, []), n);}, d.Symbol = n.Symbol || {}, v(function () {Object.defineProperty(d, h(), { get: function () {return this;} });})(), d.speciesConstructor = function (e, t) {var r = e.constructor;return r && r[h()] || t;}, d.unhandledRejection = function (e, t) {try {n.console.error("Uncaught (in promise)", o ? t.longStack : A(e, t));} catch (e) {}}, d.rejectionHandled = u, d.enableLongStackTrace = function () {o = !0;}, d.nextTick = s ? s.nextTick : function (e) {setTimeout(e);}, d._Yaku = 1;var E = b(999, function (e, t) {var r, n;void 0 !== (n = e._s ? t._onFulfilled : t._onRejected) ? (r = v(R)(n, e._v)) !== l ? T(t, r) : I(t, 0, r.e) : I(t, e._s, e._v);}), + k = b(9, function (e) {(function e(t) {if (t._umark) return !0;t._umark = !0;var r, + n = 0, + o = t._pCount;for (; n < o;) if ((r = t[n++])._onRejected || e(r)) return !0;})(e) || (e._uh = 1, S("unhandledRejection", e));});function S(e, t) {var r = "on" + e.toLowerCase(), + o = n[r];s && s.listeners(e).length ? "unhandledRejection" === e ? s.emit(e, t._v, t) : s.emit(e, t) : o ? o({ reason: t._v, promise: t }) : d[e](t._v, t);}function C(e) {return e && e._Yaku;}function x(e) {return C(e) ? new e(u) : (t = new e(function (e, o) {if (t) throw w();r = e, n = o;}), g(r, p), g(n, p), t);var t, r, n;}function O(e, t) {return function (r) {o && (e._st = j(!0)), 1 === t ? T(e, r) : I(e, t, r);};}function A(e, t) {var r = [];function n(e) {return r.push(e.replace(/^\s+|\s+$/g, ""));}return o && (t._st && n(t._st), function e(t) {t && "_pt" in t && (e(t._next), n(t._pt + ""), e(t._pre));}(t)), (e && e.stack ? e.stack : e) + ("\n" + r.join("\n")).replace(c, "");}function R(e, t) {return e(t);}function I(e, t, r) {var n = 0, + s = e._pCount;if (2 === e._s) for (e._s = t, e._v = r, 0 === t && (o && m(r, a) && (r.longStack = A(r, e)), k(e)); n < s;) E(e, e[n++]);return e;}function T(e, t) {if (t === e && t) return I(e, 0, w("Chaining cycle detected for promise")), e;if (null !== t && (p(t) || f(t))) {var r = v(L)(t);if (r === l) return I(e, 0, r.e), e;p(r) ? (o && C(t) && (e._next = t), C(t) ? N(e, t, r) : d.nextTick(function () {N(e, t, r);})) : I(e, 1, t);} else I(e, 1, t);return e;}function L(e) {return e.then;}function N(e, t, r) {var n = v(r, t)(function (r) {t && (t = null, T(e, r));}, function (r) {t && (t = null, I(e, 0, r));});n === l && t && (I(e, 0, n.e), t = null);}}();}, assert: function (e, t) {e.exports = require("assert");}, buffer: function (e, t) {e.exports = require("buffer");}, electron: function (e, t) {e.exports = require("electron");}, events: function (e, t) {e.exports = require("events");}, fs: function (e, t) {e.exports = require("fs");}, https: function (e, t) {e.exports = require("https");}, module: function (e, t) {e.exports = require("module");}, os: function (e, t) {e.exports = require("os");}, path: function (e, t) {e.exports = require("path");}, stream: function (e, t) {e.exports = require("stream");}, tty: function (e, t) {e.exports = require("tty");}, util: function (e, t) {e.exports = require("util");} }); \ No newline at end of file diff --git a/app/menu.js b/app/menu.js deleted file mode 100644 index 51fc3346..00000000 --- a/app/menu.js +++ /dev/null @@ -1,245 +0,0 @@ -// @flow -import { app, Menu, shell, BrowserWindow } from 'electron'; - -export default class MenuBuilder { - mainWindow: BrowserWindow; - - constructor(mainWindow: BrowserWindow) { - this.mainWindow = mainWindow; - } - - buildMenu() { - if ( - process.env.NODE_ENV === 'development' || - process.env.DEBUG_PROD === 'true' - ) { - this.setupDevelopmentEnvironment(); - } - - const template = - process.platform === 'darwin' - ? this.buildDarwinTemplate() - : this.buildDefaultTemplate(); - - const menu = Menu.buildFromTemplate(template); - Menu.setApplicationMenu(menu); - - return menu; - } - - setupDevelopmentEnvironment() { - this.mainWindow.webContents.on('context-menu', (e, props) => { - const { x, y } = props; - - Menu.buildFromTemplate([ - { - label: 'Inspect element', - click: () => { - this.mainWindow.inspectElement(x, y); - } - } - ]).popup(this.mainWindow); - }); - } - - buildDarwinTemplate() { - const subMenuAbout = { - label: 'Electron', - submenu: [ - { - label: 'About BrainWaves', - selector: 'orderFrontStandardAboutPanel:' - }, - { type: 'separator' }, - { label: 'Services', submenu: [] }, - { type: 'separator' }, - { - label: 'Hide BrainWaves', - accelerator: 'Command+H', - selector: 'hide:' - }, - { - label: 'Hide Others', - accelerator: 'Command+Shift+H', - selector: 'hideOtherApplications:' - }, - { label: 'Show All', selector: 'unhideAllApplications:' }, - { type: 'separator' }, - { - label: 'Quit', - accelerator: 'Command+Q', - click: () => { - app.quit(); - } - } - ] - }; - const subMenuEdit = { - label: 'Edit', - submenu: [ - { label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' }, - { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' }, - { type: 'separator' }, - { label: 'Cut', accelerator: 'Command+X', selector: 'cut:' }, - { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' }, - { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' }, - { - label: 'Select All', - accelerator: 'Command+A', - selector: 'selectAll:' - } - ] - }; - const subMenuViewDev = { - label: 'View', - submenu: [ - { - label: 'Reload', - accelerator: 'Command+R', - click: () => { - this.mainWindow.webContents.reload(); - } - }, - { - label: 'Toggle Full Screen', - accelerator: 'Ctrl+Command+F', - click: () => { - this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - } - }, - { - label: 'Toggle Developer Tools', - accelerator: 'Alt+Command+I', - click: () => { - this.mainWindow.toggleDevTools(); - } - } - ] - }; - const subMenuViewProd = { - label: 'View', - submenu: [ - { - label: 'Toggle Full Screen', - accelerator: 'Ctrl+Command+F', - click: () => { - this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - } - } - ] - }; - const subMenuWindow = { - label: 'Window', - submenu: [ - { - label: 'Minimize', - accelerator: 'Command+M', - selector: 'performMiniaturize:' - }, - { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' }, - { type: 'separator' }, - { label: 'Bring All to Front', selector: 'arrangeInFront:' } - ] - }; - - const subMenuView = - process.env.NODE_ENV === 'development' ? subMenuViewDev : subMenuViewProd; - - return [subMenuAbout, subMenuEdit, subMenuView, subMenuWindow]; - } - - buildDefaultTemplate() { - const templateDefault = [ - { - label: '&File', - submenu: [ - { - label: '&Open', - accelerator: 'Ctrl+O' - }, - { - label: '&Close', - accelerator: 'Ctrl+W', - click: () => { - this.mainWindow.close(); - } - } - ] - }, - { - label: '&View', - submenu: - process.env.NODE_ENV === 'development' - ? [ - { - label: '&Reload', - accelerator: 'Ctrl+R', - click: () => { - this.mainWindow.webContents.reload(); - } - }, - { - label: 'Toggle &Full Screen', - accelerator: 'F11', - click: () => { - this.mainWindow.setFullScreen( - !this.mainWindow.isFullScreen() - ); - } - }, - { - label: 'Toggle &Developer Tools', - accelerator: 'Alt+Ctrl+I', - click: () => { - this.mainWindow.toggleDevTools(); - } - } - ] - : [ - { - label: 'Toggle &Full Screen', - accelerator: 'F11', - click: () => { - this.mainWindow.setFullScreen( - !this.mainWindow.isFullScreen() - ); - } - } - ] - }, - { - label: 'Help', - submenu: [ - { - label: 'Learn More', - click() { - shell.openExternal('http://electron.atom.io'); - } - }, - { - label: 'Documentation', - click() { - shell.openExternal( - 'https://github.com/atom/electron/tree/master/docs#readme' - ); - } - }, - { - label: 'Community Discussions', - click() { - shell.openExternal('https://discuss.atom.io/c/electron'); - } - }, - { - label: 'Search Issues', - click() { - shell.openExternal('https://github.com/atom/electron/issues'); - } - } - ] - } - ]; - - return templateDefault; - } -} diff --git a/app/menu.ts b/app/menu.ts new file mode 100644 index 00000000..36ff03e9 --- /dev/null +++ b/app/menu.ts @@ -0,0 +1,184 @@ + +import { app, Menu, shell, BrowserWindow } from "electron"; + +export default class MenuBuilder { + + mainWindow: BrowserWindow; + + constructor(mainWindow: BrowserWindow) { + this.mainWindow = mainWindow; + } + + buildMenu() { + if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') { + this.setupDevelopmentEnvironment(); + } + + const template = process.platform === 'darwin' ? this.buildDarwinTemplate() : this.buildDefaultTemplate(); + + const menu = Menu.buildFromTemplate(template); + Menu.setApplicationMenu(menu); + + return menu; + } + + setupDevelopmentEnvironment() { + this.mainWindow.webContents.on('context-menu', (e, props) => { + const { + x, + y + } = props; + + Menu.buildFromTemplate([{ + label: 'Inspect element', + click: () => { + this.mainWindow.inspectElement(x, y); + } + }]).popup(this.mainWindow); + }); + } + + buildDarwinTemplate() { + const subMenuAbout = { + label: 'Electron', + submenu: [{ + label: 'About BrainWaves', + selector: 'orderFrontStandardAboutPanel:' + }, { type: 'separator' }, { label: 'Services', submenu: [] }, { type: 'separator' }, { + label: 'Hide BrainWaves', + accelerator: 'Command+H', + selector: 'hide:' + }, { + label: 'Hide Others', + accelerator: 'Command+Shift+H', + selector: 'hideOtherApplications:' + }, { label: 'Show All', selector: 'unhideAllApplications:' }, { type: 'separator' }, { + label: 'Quit', + accelerator: 'Command+Q', + click: () => { + app.quit(); + } + }] + }; + const subMenuEdit = { + label: 'Edit', + submenu: [{ label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' }, { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' }, { type: 'separator' }, { label: 'Cut', accelerator: 'Command+X', selector: 'cut:' }, { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' }, { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' }, { + label: 'Select All', + accelerator: 'Command+A', + selector: 'selectAll:' + }] + }; + const subMenuViewDev = { + label: 'View', + submenu: [{ + label: 'Reload', + accelerator: 'Command+R', + click: () => { + this.mainWindow.webContents.reload(); + } + }, { + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + } + }, { + label: 'Toggle Developer Tools', + accelerator: 'Alt+Command+I', + click: () => { + this.mainWindow.toggleDevTools(); + } + }] + }; + const subMenuViewProd = { + label: 'View', + submenu: [{ + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + } + }] + }; + const subMenuWindow = { + label: 'Window', + submenu: [{ + label: 'Minimize', + accelerator: 'Command+M', + selector: 'performMiniaturize:' + }, { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' }, { type: 'separator' }, { label: 'Bring All to Front', selector: 'arrangeInFront:' }] + }; + + const subMenuView = process.env.NODE_ENV === 'development' ? subMenuViewDev : subMenuViewProd; + + return [subMenuAbout, subMenuEdit, subMenuView, subMenuWindow]; + } + + buildDefaultTemplate() { + const templateDefault = [{ + label: '&File', + submenu: [{ + label: '&Open', + accelerator: 'Ctrl+O' + }, { + label: '&Close', + accelerator: 'Ctrl+W', + click: () => { + this.mainWindow.close(); + } + }] + }, { + label: '&View', + submenu: process.env.NODE_ENV === 'development' ? [{ + label: '&Reload', + accelerator: 'Ctrl+R', + click: () => { + this.mainWindow.webContents.reload(); + } + }, { + label: 'Toggle &Full Screen', + accelerator: 'F11', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + } + }, { + label: 'Toggle &Developer Tools', + accelerator: 'Alt+Ctrl+I', + click: () => { + this.mainWindow.toggleDevTools(); + } + }] : [{ + label: 'Toggle &Full Screen', + accelerator: 'F11', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + } + }] + }, { + label: 'Help', + submenu: [{ + label: 'Learn More', + click() { + shell.openExternal('http://electron.atom.io'); + } + }, { + label: 'Documentation', + click() { + shell.openExternal('https://github.com/atom/electron/tree/master/docs#readme'); + } + }, { + label: 'Community Discussions', + click() { + shell.openExternal('https://discuss.atom.io/c/electron'); + } + }, { + label: 'Search Issues', + click() { + shell.openExternal('https://github.com/atom/electron/issues'); + } + }] + }]; + + return templateDefault; + } +} \ No newline at end of file diff --git a/app/reducers/deviceReducer.js b/app/reducers/deviceReducer.ts similarity index 58% rename from app/reducers/deviceReducer.js rename to app/reducers/deviceReducer.ts index c7dd2e46..ed8dc525 100644 --- a/app/reducers/deviceReducer.js +++ b/app/reducers/deviceReducer.ts @@ -1,30 +1,18 @@ -// @flow -import { Observable } from 'rxjs'; -import { - SET_DEVICE_INFO, - SET_DEVICE_TYPE, - SET_AVAILABLE_DEVICES, - SET_CONNECTION_STATUS, - SET_RAW_OBSERVABLE, - SET_SIGNAL_OBSERVABLE, - DEVICE_CLEANUP -} from '../epics/deviceEpics'; -import { - DEVICES, - CONNECTION_STATUS, - DEVICE_AVAILABILITY -} from '../constants/constants'; -import { ActionType, DeviceInfo } from '../constants/interfaces'; -import { SET_DEVICE_AVAILABILITY } from '../actions/deviceActions'; + +import { Observable } from "rxjs"; +import { SET_DEVICE_INFO, SET_DEVICE_TYPE, SET_AVAILABLE_DEVICES, SET_CONNECTION_STATUS, SET_RAW_OBSERVABLE, SET_SIGNAL_OBSERVABLE, DEVICE_CLEANUP } from "../epics/deviceEpics"; +import { DEVICES, CONNECTION_STATUS, DEVICE_AVAILABILITY } from "../constants/constants"; +import { ActionType, DeviceInfo } from "../constants/interfaces"; +import { SET_DEVICE_AVAILABILITY } from "../actions/deviceActions"; interface DeviceStateType { - +availableDevices: Array; - +connectedDevice: ?DeviceInfo; - +connectionStatus: CONNECTION_STATUS; - +deviceAvailability: DEVICE_AVAILABILITY; - +rawObservable: ?Observable; - +signalQualityObservable: ?Observable; - +deviceType: DEVICES; + readonly availableDevices: Array; + readonly connectedDevice: DeviceInfo | null | undefined; + readonly connectionStatus: CONNECTION_STATUS; + readonly deviceAvailability: DEVICE_AVAILABILITY; + readonly rawObservable: Observable | null | undefined; + readonly signalQualityObservable: Observable | null | undefined; + readonly deviceType: DEVICES; } const initialState = { @@ -37,10 +25,7 @@ const initialState = { deviceType: DEVICES.EMOTIV }; -export default function device( - state: DeviceStateType = initialState, - action: ActionType -) { +export default function device(state: DeviceStateType = initialState, action: ActionType) { switch (action.type) { case SET_DEVICE_TYPE: return { @@ -89,5 +74,6 @@ export default function device( default: return state; + } -} +} \ No newline at end of file diff --git a/app/reducers/experimentReducer.js b/app/reducers/experimentReducer.ts similarity index 60% rename from app/reducers/experimentReducer.js rename to app/reducers/experimentReducer.ts index f8367605..8917676f 100644 --- a/app/reducers/experimentReducer.js +++ b/app/reducers/experimentReducer.ts @@ -1,44 +1,25 @@ -// @flow -import { - SET_TIMELINE, - SET_IS_RUNNING, - SET_SESSION, - EXPERIMENT_CLEANUP -} from '../epics/experimentEpics'; -import { - SET_TYPE, - SET_PARADIGM, - SET_SUBJECT, - SET_GROUP, - SET_TITLE, - SET_EXPERIMENT_STATE, - SET_PARAMS, - SET_DESCRIPTION, - SET_EEG_ENABLED -} from '../actions/experimentActions'; -import { EXPERIMENTS } from '../constants/constants'; -import { - MainTimeline, - Trial, - ActionType, - ExperimentDescription, - ExperimentParameters -} from '../constants/interfaces'; + +import { SET_TIMELINE, SET_IS_RUNNING, SET_SESSION, EXPERIMENT_CLEANUP } from "../epics/experimentEpics"; +import { SET_TYPE, SET_PARADIGM, SET_SUBJECT, SET_GROUP, SET_TITLE, SET_EXPERIMENT_STATE, SET_PARAMS, SET_DESCRIPTION, SET_EEG_ENABLED } from "../actions/experimentActions"; +import { EXPERIMENTS } from "../constants/constants"; +import { MainTimeline, Trial, ActionType, ExperimentDescription, ExperimentParameters } from "../constants/interfaces"; export interface ExperimentStateType { - +type: ?EXPERIMENTS; - +title: ?string; - +params: ?ExperimentParameters; - +mainTimeline: MainTimeline; - +trials: { [string]: Trial }; - +timelines: {}; - +plugins: Object; - +subject: string; - +group: string; - +session: number; - +isRunning: boolean; - +isEEGEnabled: boolean; - +description: ExperimentDescription; + readonly type: EXPERIMENTS | null | undefined; + readonly title: string | null | undefined; + readonly params: ExperimentParameters | null | undefined; + readonly mainTimeline: MainTimeline; + readonly trials: { + [key: string]: Trial; + }; + readonly timelines: {}; + readonly plugins: Object; + readonly subject: string; + readonly group: string; + readonly session: number; + readonly isRunning: boolean; + readonly isEEGEnabled: boolean; + readonly description: ExperimentDescription; } const initialState = { @@ -57,10 +38,7 @@ const initialState = { description: { question: '', hypothesis: '', methods: '' } }; -export default function experiment( - state: ExperimentStateType = initialState, - action: ActionType -) { +export default function experiment(state: ExperimentStateType = initialState, action: ActionType) { switch (action.type) { case SET_TYPE: return { @@ -138,5 +116,6 @@ export default function experiment( default: return state; + } -} +} \ No newline at end of file diff --git a/app/reducers/index.js b/app/reducers/index.js deleted file mode 100644 index 0f1874ab..00000000 --- a/app/reducers/index.js +++ /dev/null @@ -1,15 +0,0 @@ -// @flow -import { combineReducers } from 'redux'; -import { routerReducer as router } from 'react-router-redux'; -import jupyter from './jupyterReducer'; -import device from './deviceReducer'; -import experiment from './experimentReducer'; - -const rootReducer = combineReducers({ - jupyter, - device, - experiment, - router -}); - -export default rootReducer; diff --git a/app/reducers/index.ts b/app/reducers/index.ts new file mode 100644 index 00000000..b55cfe11 --- /dev/null +++ b/app/reducers/index.ts @@ -0,0 +1,15 @@ + +import { combineReducers } from "redux"; +import { routerReducer as router } from "react-router-redux"; +import jupyter from "./jupyterReducer"; +import device from "./deviceReducer"; +import experiment from "./experimentReducer"; + +const rootReducer = combineReducers({ + jupyter, + device, + experiment, + router +}); + +export default rootReducer; \ No newline at end of file diff --git a/app/reducers/jupyterReducer.js b/app/reducers/jupyterReducer.ts similarity index 57% rename from app/reducers/jupyterReducer.js rename to app/reducers/jupyterReducer.ts index c2f700f2..db51901d 100644 --- a/app/reducers/jupyterReducer.js +++ b/app/reducers/jupyterReducer.ts @@ -1,29 +1,26 @@ -// @flow -import { - SET_KERNEL, - SET_KERNEL_STATUS, - SET_MAIN_CHANNEL, - SET_KERNEL_INFO, - SET_EPOCH_INFO, - SET_CHANNEL_INFO, - SET_PSD_PLOT, - SET_TOPO_PLOT, - SET_ERP_PLOT, - RECEIVE_EXECUTE_RETURN -} from '../epics/jupyterEpics'; -import { ActionType, Kernel } from '../constants/interfaces'; -import { KERNEL_STATUS } from '../constants/constants'; -import { EXPERIMENT_CLEANUP } from '../epics/experimentEpics'; + +import { SET_KERNEL, SET_KERNEL_STATUS, SET_MAIN_CHANNEL, SET_KERNEL_INFO, SET_EPOCH_INFO, SET_CHANNEL_INFO, SET_PSD_PLOT, SET_TOPO_PLOT, SET_ERP_PLOT, RECEIVE_EXECUTE_RETURN } from "../epics/jupyterEpics"; +import { ActionType, Kernel } from "../constants/interfaces"; +import { KERNEL_STATUS } from "../constants/constants"; +import { EXPERIMENT_CLEANUP } from "../epics/experimentEpics"; export interface JupyterStateType { - +kernel: ?Kernel; - +kernelStatus: KERNEL_STATUS; - +mainChannel: ?any; - +epochsInfo: ?Array<{ [string]: number | string }>; - +channelInfo: ?Array; - +psdPlot: ?{ [string]: string }; - +topoPlot: ?{ [string]: string }; - +erpPlot: ?{ [string]: string }; + readonly kernel: Kernel | null | undefined; + readonly kernelStatus: KERNEL_STATUS; + readonly mainChannel: any | null | undefined; + readonly epochsInfo: Array<{ + [key: string]: number | string; + }> | null | undefined; + readonly channelInfo: Array | null | undefined; + readonly psdPlot: { + [key: string]: string; + } | null | undefined; + readonly topoPlot: { + [key: string]: string; + } | null | undefined; + readonly erpPlot: { + [key: string]: string; + } | null | undefined; } const initialState = { @@ -37,10 +34,7 @@ const initialState = { erpPlot: null }; -export default function jupyter( - state: JupyterStateType = initialState, - action: ActionType -) { +export default function jupyter(state: JupyterStateType = initialState, action: ActionType) { switch (action.type) { case SET_KERNEL: return { @@ -106,5 +100,6 @@ export default function jupyter( default: return state; + } -} +} \ No newline at end of file diff --git a/app/routes.js b/app/routes.js deleted file mode 100644 index b67cd81e..00000000 --- a/app/routes.js +++ /dev/null @@ -1,46 +0,0 @@ -/* eslint flowtype-errors/show-errors: 0 */ -import React from 'react'; -import { Switch, Route } from 'react-router'; -import App from './containers/App'; -import HomeContainer from './containers/HomeContainer'; -import ExperimentDesignContainer from './containers/ExperimentDesignContainer'; -import CollectContainer from './containers/CollectContainer'; -import CleanContainer from './containers/CleanContainer'; -import AnalyzeContainer from './containers/AnalyzeContainer'; -import { SCREENS } from './constants/constants'; - -const renderMergedProps = (component, ...rest) => { - const finalProps = Object.assign({}, ...rest); - return React.createElement(component, finalProps); -}; - -const PropsRoute = ({ component, ...rest }) => ( - renderMergedProps(component, routeProps, rest)} - /> -); - -export default () => ( - - - - - - - - - - -); diff --git a/app/routes.tsx b/app/routes.tsx new file mode 100644 index 00000000..2e988bcf --- /dev/null +++ b/app/routes.tsx @@ -0,0 +1,31 @@ +/* eslint flowtype-errors/show-errors: 0 */ +import React from "react"; +import { Switch, Route } from "react-router"; +import App from "./containers/App"; +import HomeContainer from "./containers/HomeContainer"; +import ExperimentDesignContainer from "./containers/ExperimentDesignContainer"; +import CollectContainer from "./containers/CollectContainer"; +import CleanContainer from "./containers/CleanContainer"; +import AnalyzeContainer from "./containers/AnalyzeContainer"; +import { SCREENS } from "./constants/constants"; + +const renderMergedProps = (component, ...rest) => { + const finalProps = Object.assign({}, ...rest); + return React.createElement(component, finalProps); +}; + +const PropsRoute = ({ + component, + ...rest +}) => renderMergedProps(component, routeProps, rest)} />; + +export default (() => + + + + + + + + + ); \ No newline at end of file diff --git a/app/store/configureStore.dev.js b/app/store/configureStore.dev.ts similarity index 60% rename from app/store/configureStore.dev.js rename to app/store/configureStore.dev.ts index b910476a..54d8f116 100644 --- a/app/store/configureStore.dev.js +++ b/app/store/configureStore.dev.ts @@ -1,13 +1,13 @@ -import { createStore, applyMiddleware, compose } from 'redux'; -import thunk from 'redux-thunk'; -import { createEpicMiddleware } from 'redux-observable'; -import { createHashHistory } from 'history'; -import { routerMiddleware, routerActions } from 'react-router-redux'; -import { createLogger } from 'redux-logger'; -import rootReducer from '../reducers'; -import rootEpic from '../epics'; -import * as jupyterActions from '../actions/jupyterActions'; -import * as deviceActions from '../actions/deviceActions'; +import { createStore, applyMiddleware, compose } from "redux"; +import thunk from "redux-thunk"; +import { createEpicMiddleware } from "redux-observable"; +import { createHashHistory } from "history"; +import { routerMiddleware, routerActions } from "react-router-redux"; +import { createLogger } from "redux-logger"; +import rootReducer from "../reducers"; +import rootEpic from "../epics"; +import * as jupyterActions from "../actions/jupyterActions"; +import * as deviceActions from "../actions/deviceActions"; const history = createHashHistory(); @@ -45,13 +45,13 @@ const configureStore = (initialState?: AppState) => { ...routerActions }; // If Redux DevTools Extension is installed use it, otherwise use Redux compose + /* eslint-disable no-underscore-dangle */ - const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ - ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ - // Options: http://zalmoxisus.github.io/redux-devtools-extension/API/Arguments.html - actionCreators - }) - : compose; + const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ + // Options: http://zalmoxisus.github.io/redux-devtools-extension/API/Arguments.html + actionCreators + }) : compose; + /* eslint-enable no-underscore-dangle */ // Apply Middleware & Compose Enhancers @@ -62,9 +62,7 @@ const configureStore = (initialState?: AppState) => { const store = createStore(rootReducer, initialState, enhancer); if (module.hot) { - module.hot.accept( - '../reducers', - () => store.replaceReducer(require('../reducers')) // eslint-disable-line global-require + module.hot.accept('../reducers', () => store.replaceReducer(require('../reducers')) // eslint-disable-line global-require ); } @@ -74,4 +72,4 @@ const configureStore = (initialState?: AppState) => { return store; }; -export default { configureStore, history }; +export default { configureStore, history }; \ No newline at end of file diff --git a/app/store/configureStore.js b/app/store/configureStore.js deleted file mode 100644 index e0c7e576..00000000 --- a/app/store/configureStore.js +++ /dev/null @@ -1,11 +0,0 @@ -import configureStoreDev from './configureStore.dev'; -import configureStoreProd from './configureStore.prod'; - -const selectedConfigureStore = - process.env.NODE_ENV === 'production' - ? configureStoreProd - : configureStoreDev; - -export const { configureStore } = selectedConfigureStore; - -export const { history } = selectedConfigureStore; diff --git a/app/store/configureStore.prod.js b/app/store/configureStore.prod.js deleted file mode 100644 index f44731ed..00000000 --- a/app/store/configureStore.prod.js +++ /dev/null @@ -1,22 +0,0 @@ -// @flow -import { createStore, applyMiddleware } from 'redux'; -import thunk from 'redux-thunk'; -import { createHashHistory } from 'history'; -import { createEpicMiddleware } from 'redux-observable'; -import rootEpic from '../epics'; - -import { routerMiddleware } from 'react-router-redux'; -import rootReducer from '../reducers'; - -const history = createHashHistory(); -const epicMiddleware = createEpicMiddleware(); -const router = routerMiddleware(history); -const enhancer = applyMiddleware(thunk, router, epicMiddleware); - -function configureStore(initialState?: any) { - const store = createStore(rootReducer, initialState, enhancer); - epicMiddleware.run(rootEpic); - return store; -} - -export default { configureStore, history }; diff --git a/app/store/configureStore.prod.ts b/app/store/configureStore.prod.ts new file mode 100644 index 00000000..0a54869e --- /dev/null +++ b/app/store/configureStore.prod.ts @@ -0,0 +1,22 @@ + +import { createStore, applyMiddleware } from "redux"; +import thunk from "redux-thunk"; +import { createHashHistory } from "history"; +import { createEpicMiddleware } from "redux-observable"; +import rootEpic from "../epics"; + +import { routerMiddleware } from "react-router-redux"; +import rootReducer from "../reducers"; + +const history = createHashHistory(); +const epicMiddleware = createEpicMiddleware(); +const router = routerMiddleware(history); +const enhancer = applyMiddleware(thunk, router, epicMiddleware); + +function configureStore(initialState?: any) { + const store = createStore(rootReducer, initialState, enhancer); + epicMiddleware.run(rootEpic); + return store; +} + +export default { configureStore, history }; \ No newline at end of file diff --git a/app/store/configureStore.ts b/app/store/configureStore.ts new file mode 100644 index 00000000..4c9eee39 --- /dev/null +++ b/app/store/configureStore.ts @@ -0,0 +1,12 @@ +import configureStoreDev from "./configureStore.dev"; +import configureStoreProd from "./configureStore.prod"; + +const selectedConfigureStore = process.env.NODE_ENV === 'production' ? configureStoreProd : configureStoreDev; + +export const { + configureStore +} = selectedConfigureStore; + +export const { + history +} = selectedConfigureStore; \ No newline at end of file diff --git a/app/utils/behavior/compute.js b/app/utils/behavior/compute.js deleted file mode 100644 index 1efc46b3..00000000 --- a/app/utils/behavior/compute.js +++ /dev/null @@ -1,553 +0,0 @@ -import * as ss from 'simple-statistics'; -import * as path from 'path'; - -export const aggregateBehaviorDataToSave = (data, removeOutliers) => { - const processedData = data.map(result => { - if (path.basename(result.meta.datafile).includes('aggregated')) { - return transformAggregated(result); - } - return filterData(result, removeOutliers); - }); - const aggregatedData = processedData.map(e => { - const conditionsArray = e.map(row => row.condition); - const unsortedConditions = [...new Set(conditionsArray)].sort(); - const conditions = unsortedConditions.sort( - (a, b) => parseInt(a) - parseInt(b) - ); - let rtMean = {}, - accuracyPercent = {}; - for (const condition of conditions) { - const rt = e - .filter(row => row.response_given === 'yes') - .filter(row => row.correct_response === 'true') - .filter(row => row.condition === condition) - .map(row => row.reaction_time) - .map(value => parseFloat(value)); - rtMean[condition] = Math.round(ss.mean(rt)); - const accuracy = e.filter( - row => - row.condition === condition && - row.correct_response === 'true' && - row.response_given === 'yes' - ); - accuracyPercent[condition] = accuracy.length - ? Math.round( - 100 * - (accuracy.length / - e.filter(r => r.condition === condition).length) - ) - : ss.mean( - e.filter(r => r.condition === condition).map(r => r.accuracy) - ); - } - const row = { - subject: e.map(r => r.subject)[0], - group: e.map(r => r.group)[0], - session: e.map(r => r.session)[0] - }; - for (const condition of conditions) { - row[`RT_${condition}`] = rtMean[condition]; - row[`Accuracy_${condition}`] = accuracyPercent[condition]; - } - return row; - }); - return aggregatedData; -}; - -export const aggregateDataForPlot = ( - data, - dependentVariable, - removeOutliers, - showDataPoints, - displayMode -) => { - if (data && data.length > 0) { - const processedData = data.map(result => { - if (path.basename(result.meta.datafile).includes('aggregated')) { - return transformAggregated(result); - } - return filterData(result, removeOutliers); - }); - const colors = ['#28619E', '#3DBBDB']; - const unsortedConditions = [ - ...new Set(processedData[0].map(row => row.condition)) - ].sort(); - const conditions = unsortedConditions.sort( - (a, b) => parseInt(a) - parseInt(b) - ); - switch (dependentVariable) { - case 'RT': - default: - return computeRT( - processedData, - dependentVariable, - conditions, - showDataPoints, - colors, - displayMode - ); - case 'Accuracy': - return computeAccuracy( - processedData, - dependentVariable, - conditions, - showDataPoints, - colors, - displayMode - ); - } - } -}; - -const transformAggregated = result => { - const unsortedConditions = result.meta.fields - .filter(field => field.startsWith('RT_')) - .map(c => c.split('RT_')[1]) - .sort(); - const conditions = unsortedConditions.sort( - (a, b) => parseInt(a) - parseInt(b) - ); - const transformed = conditions.map(condition => - result.data.map(e => ({ - reaction_time: parseFloat(e[`RT_${condition}`]), - subject: path.parse(result.meta.datafile).name, - condition, - group: e.group, - session: e.session, - accuracy: parseFloat(e[`Accuracy_${condition}`]), - response_given: 'yes', - correct_response: 'true' - })) - ); - const data = transformed.reduce((acc, item) => acc.concat(item), []); - return data; -}; - -const filterData = (data, removeOutliers) => { - let filteredData = data.data - .filter(row => row.trial_number && row.phase !== 'practice') - .map(row => ({ - condition: row.condition, - subject: path.parse(data.meta.datafile).name.split('-')[0], - group: path.parse(data.meta.datafile).name.split('-')[1], - session: path.parse(data.meta.datafile).name.split('-')[2], - reaction_time: Math.round(parseFloat(row.reaction_time)), - correct_response: row.correct_response, - trial_number: row.trial_number, - response_given: row.response_given - })); - if (removeOutliers) { - try { - const mean = ss.mean( - filteredData - .filter( - r => r.response_given === 'yes' && r.correct_response === 'true' - ) - .map(r => r.reaction_time) - ); - const standardDeviation = ss.sampleStandardDeviation( - filteredData - .filter( - r => r.response_given === 'yes' && r.correct_response === 'true' - ) - .map(r => r.reaction_time) - ); - const upperBoarder = mean + 2 * standardDeviation; - const lowerBoarder = mean - 2 * standardDeviation; - filteredData = filteredData.filter( - r => - (r.reaction_time > lowerBoarder && r.reaction_time < upperBoarder) || - isNaN(r.reaction_time) - ); - } catch (err) { - alert( - 'Calculation of the mean and the standard deviation requires at least two completed trials in each condition.' - ); - return filteredData; - } - } - return filteredData; -}; - -const computeRT = ( - data, - dependentVariable, - conditions, - showDataPoints, - colors, - displayMode -) => { - let dataToPlot = 0; - let maxValue = 0; - switch (displayMode) { - case 'datapoints': - default: - let tickValuesX, tickTextX; - dataToPlot = conditions.reduce((obj, condition, i) => { - const xRaw = data - .reduce((a, b) => a.concat(b), []) - .filter( - r => r.response_given === 'yes' && r.correct_response === 'true' - ) - .filter(e => e.condition === condition) - .map(r => r.subject); - const y = data - .reduce((a, b) => a.concat(b), []) - .filter( - r => r.response_given === 'yes' && r.correct_response === 'true' - ) - .filter(e => e.condition === condition) - .map(r => r.reaction_time); - maxValue = Math.max(...y) > maxValue ? Math.max(...y) : maxValue; - const subjects = Array.from(new Set(xRaw)); - const x = xRaw.map( - x => subjects.indexOf(x) + 1 + i / 4 + (Math.random() - 0.5) / 5 - ); - tickValuesX = subjects.map(x => subjects.indexOf(x) + 1 + 1 / 8); - tickTextX = subjects; - obj[condition] = { x, y }; - return obj; - }, {}); - dataToPlot['tickvals'] = tickValuesX; - dataToPlot['ticktext'] = tickTextX; - dataToPlot['lowerLimit'] = 0; - dataToPlot['upperLimit'] = maxValue > 1000 ? maxValue + 100 : 1000; - return makeDataPointsGraph( - dataToPlot, - conditions, - colors, - dependentVariable - ); - - case 'errorbars': - let maxValueSE = 0; - dataToPlot = conditions.reduce((obj, condition) => { - const xRaw = data - .reduce((a, b) => a.concat(b), []) - .filter( - r => r.response_given === 'yes' && r.correct_response === 'true' - ) - .filter(e => e.condition === condition) - .map(r => r.subject); - const x = Array.from(new Set(xRaw)); - const data_condition = data.map(d => - d - .filter( - r => r.response_given === 'yes' && r.correct_response === 'true' - ) - .filter(e => e.condition == condition) - ); - const y_bars_prep = x.map(a => - data_condition - .map(d => d.filter(e => e.subject === a)) - .filter(d => d.length > 0) - ); - const y = y_bars_prep - .map(y => - ss.mean( - y.reduce((a, b) => a.concat(b), []).map(r => r.reaction_time) - ) - ) - .map(v => Math.round(v)); - maxValue = Math.max(...y) > maxValue ? Math.max(...y) : maxValue; - const stErrorFunction = array => - ss.sampleStandardDeviation(array) / Math.sqrt(array.length); - const stErrors = data_condition - .map(a => - a.length > 1 ? stErrorFunction(a.map(r => r.reaction_time)) : 0 - ) - .map(v => Math.round(v)); - maxValueSE = - Math.max(...stErrors) > maxValueSE - ? Math.max(...stErrors) - : maxValueSE; - obj[condition] = { x, y, stErrors }; - return obj; - }, {}); - dataToPlot['lowerLimit'] = 0; - dataToPlot['upperLimit'] = - maxValue + maxValueSE > 1000 ? maxValue + maxValueSE + 100 : 1000; - return makeBarGraph(dataToPlot, conditions, colors, dependentVariable); - - case 'whiskers': - dataToPlot = conditions.reduce((obj, condition, i) => { - const x = data - .reduce((a, b) => a.concat(b), []) - .filter( - r => r.response_given === 'yes' && r.correct_response === 'true' - ) - .filter(e => e.condition === condition) - .map(r => r.subject); - const y = data - .reduce((a, b) => a.concat(b), []) - .filter( - r => r.response_given === 'yes' && r.correct_response === 'true' - ) - .filter(e => e.condition === condition) - .map(r => r.reaction_time); - maxValue = Math.max(...y) > maxValue ? Math.max(...y) : maxValue; - obj[condition] = { x, y }; - return obj; - }, {}); - dataToPlot['lowerLimit'] = 0; - dataToPlot['upperLimit'] = maxValue > 1000 ? maxValue + 100 : 1000; - return makeBoxPlot(dataToPlot, conditions, colors, dependentVariable); - } -}; - -const computeAccuracy = ( - data, - dependentVariable, - conditions, - showDataPoints, - colors, - displayMode -) => { - let dataToPlot; - - switch (displayMode) { - case 'datapoints': - default: - let tickValuesX, tickTextX; - dataToPlot = conditions.reduce((obj, condition, i) => { - const correctDataForCondition = data.map(d => - d.filter(e => e.condition == condition) - ); - - const y = correctDataForCondition - .map(d => { - if (d.filter(l => l.accuracy).length > 0) { - return d.map(l => l.accuracy); - } - const c = d.filter( - e => e.response_given === 'yes' && e.correct_response === 'true' - ); - return Math.round((c.length / d.length) * 100); - }) - .reduce((acc, item) => acc.concat(item), []); - - const xRaw = correctDataForCondition - .map(d => { - if (d.filter(l => l.accuracy).length > 0) { - return d.map(l => l.subject); - } - return d.map(r => r.subject)[0]; - }) - .reduce((acc, item) => acc.concat(item), []); - const subjects = Array.from(new Set(xRaw)); - const x = xRaw.map( - x => subjects.indexOf(x) + 1 + i / 4 + (Math.random() - 0.5) / 5 - ); - tickValuesX = subjects.map(x => subjects.indexOf(x) + 1 + 1 / 8); - tickTextX = subjects; - obj[condition] = { x, y }; - return obj; - }, {}); - dataToPlot['tickvals'] = tickValuesX; - dataToPlot['ticktext'] = tickTextX; - dataToPlot['lowerLimit'] = 0; - dataToPlot['upperLimit'] = 105; - return makeDataPointsGraph( - dataToPlot, - conditions, - colors, - dependentVariable - ); - - case 'errorbars': - dataToPlot = conditions.reduce((obj, condition, i) => { - const correctDataForCondition = data.map(d => - d.filter(e => e.condition == condition) - ); - const transformedData = correctDataForCondition - .map(d => { - if (d.filter(l => l.accuracy).length > 0) { - return d.map(l => ({ - accuracy: l.accuracy, - subject: l.subject - })); - } - const c = d.filter( - e => e.response_given === 'yes' && e.correct_response === 'true' - ); - return { - accuracy: Math.round((c.length / d.length) * 100), - subject: d.map(r => r.subject)[0] - }; - }) - .reduce((acc, item) => acc.concat(item), []); - const subjects = Array.from( - new Set(transformedData.map(e => e.subject)) - ); - const y = subjects.map(subject => - ss.mean( - transformedData - .filter(e => e.subject === subject) - .map(d => d.accuracy) - ) - ); - const stErrorFunction = array => - ss.sampleStandardDeviation(array) / Math.sqrt(array.length); - const stErrors = subjects.map(subject => { - const array = transformedData - .filter(e => e.subject === subject) - .map(d => d.accuracy); - if (array.length > 1) { - return stErrorFunction(array); - } - return 0; - }); - obj[condition] = { x: subjects, y, stErrors }; - return obj; - }, {}); - dataToPlot['lowerLimit'] = 0; - dataToPlot['upperLimit'] = 105; - return makeBarGraph(dataToPlot, conditions, colors, dependentVariable); - - case 'whiskers': - dataToPlot = conditions.reduce((obj, condition, i) => { - const correctDataForCondition = data.map(d => - d.filter(e => e.condition == condition) - ); - const y = correctDataForCondition - .map(d => { - if (d.filter(l => l.accuracy).length > 0) { - return d.map(l => l.accuracy); - } - const c = d.filter( - e => e.response_given === 'yes' && e.correct_response === 'true' - ); - return Math.round((c.length / d.length) * 100); - }) - .reduce((acc, item) => acc.concat(item), []); - const xRaw = correctDataForCondition - .map(d => { - if (d.filter(l => l.accuracy).length > 0) { - return d.map(l => l.subject); - } - return d.map(r => r.subject)[0]; - }) - .reduce((acc, item) => acc.concat(item), []); - obj[condition] = { x: xRaw, y }; - return obj; - }, {}); - dataToPlot['lowerLimit'] = 0; - dataToPlot['upperLimit'] = 105; - return makeBoxPlot(dataToPlot, conditions, colors, dependentVariable); - } -}; - -// Rendering functions -const makeDataPointsGraph = (data, conditions, colors, dependentVariable) => { - let dataForCondition; - const symbols = ['circle', 'cross', 'diamond', 'square']; - const dataToPlot = conditions.map((condition, i) => { - dataForCondition = data[condition]; - return { - x: dataForCondition.x, - y: dataForCondition.y, - name: condition, - type: 'scatter', - marker: { - color: colors[i], - size: 7, - symbol: symbols[i] - }, - mode: 'markers' - }; - }); - const layout = { - xaxis: { - tickvals: data.tickvals, - ticktext: data.ticktext - }, - yaxis: { - title: `${ - dependentVariable == 'Response Time' - ? 'Response Time (milliseconds)' - : '% correct' - }`, - range: [data.lowerLimit, data.upperLimit] - }, - title: `${dependentVariable}` - }; - return { - dataToPlot, - layout - }; -}; - -const makeBarGraph = (data, conditions, colors, dependentVariable) => { - const dataToPlot = conditions.map((condition, i) => { - const dataForCondition = data[condition]; - return { - x: dataForCondition.x, - y: dataForCondition.y, - name: condition, - type: 'bar', - marker: { - color: colors[i], - size: 7 - }, - error_y: { - type: 'data', - array: dataForCondition.stErrors, - visible: true - } - }; - }); - const layout = { - yaxis: { - title: `${ - dependentVariable == 'Response Time' - ? 'Response Time (milliseconds)' - : '% correct' - }`, - zeroline: false, - range: [data.lowerLimit, data.upperLimit] - }, - barmode: 'group', - title: `${dependentVariable}` - }; - return { - dataToPlot, - layout - }; -}; - -const makeBoxPlot = (data, conditions, colors, dependentVariable) => { - const symbols = ['circle', 'cross', 'diamond', 'square']; - const dataToPlot = conditions.map((condition, i) => { - const dataForCondition = data[condition]; - return { - x: dataForCondition.x, - y: dataForCondition.y, - name: condition, - type: 'box', - marker: { - color: colors[i], - size: 7, - symbol: symbols[i] - }, - boxpoints: 'false', - pointpos: 0 - }; - }); - const layout = { - yaxis: { - title: `${ - dependentVariable == 'Response Time' - ? 'Response Time (milliseconds)' - : '% correct' - }`, - zeroline: false, - range: [data.lowerLimit, data.upperLimit] - }, - boxmode: 'group', - title: `${dependentVariable}` - }; - return { - dataToPlot, - layout - }; -}; diff --git a/app/utils/behavior/compute.ts b/app/utils/behavior/compute.ts new file mode 100644 index 00000000..966b4344 --- /dev/null +++ b/app/utils/behavior/compute.ts @@ -0,0 +1,354 @@ +import * as ss from "simple-statistics"; +import * as path from "path"; + +export const aggregateBehaviorDataToSave = (data, removeOutliers) => { + const processedData = data.map(result => { + if (path.basename(result.meta.datafile).includes('aggregated')) { + return transformAggregated(result); + } + return filterData(result, removeOutliers); + }); + const aggregatedData = processedData.map(e => { + const conditionsArray = e.map(row => row.condition); + const unsortedConditions = [...new Set(conditionsArray)].sort(); + const conditions = unsortedConditions.sort((a, b) => parseInt(a) - parseInt(b)); + let rtMean = {}, + accuracyPercent = {}; + for (const condition of conditions) { + const rt = e.filter(row => row.response_given === 'yes').filter(row => row.correct_response === 'true').filter(row => row.condition === condition).map(row => row.reaction_time).map(value => parseFloat(value)); + rtMean[condition] = Math.round(ss.mean(rt)); + const accuracy = e.filter(row => row.condition === condition && row.correct_response === 'true' && row.response_given === 'yes'); + accuracyPercent[condition] = accuracy.length ? Math.round(100 * (accuracy.length / e.filter(r => r.condition === condition).length)) : ss.mean(e.filter(r => r.condition === condition).map(r => r.accuracy)); + } + const row = { + subject: e.map(r => r.subject)[0], + group: e.map(r => r.group)[0], + session: e.map(r => r.session)[0] + }; + for (const condition of conditions) { + row[`RT_${condition}`] = rtMean[condition]; + row[`Accuracy_${condition}`] = accuracyPercent[condition]; + } + return row; + }); + return aggregatedData; +}; + +export const aggregateDataForPlot = (data, dependentVariable, removeOutliers, showDataPoints, displayMode) => { + if (data && data.length > 0) { + const processedData = data.map(result => { + if (path.basename(result.meta.datafile).includes('aggregated')) { + return transformAggregated(result); + } + return filterData(result, removeOutliers); + }); + const colors = ['#28619E', '#3DBBDB']; + const unsortedConditions = [...new Set(processedData[0].map(row => row.condition))].sort(); + const conditions = unsortedConditions.sort((a, b) => parseInt(a) - parseInt(b)); + switch (dependentVariable) { + case 'RT':default: + return computeRT(processedData, dependentVariable, conditions, showDataPoints, colors, displayMode); + case 'Accuracy': + return computeAccuracy(processedData, dependentVariable, conditions, showDataPoints, colors, displayMode); + + } + } +}; + +const transformAggregated = result => { + const unsortedConditions = result.meta.fields.filter(field => field.startsWith('RT_')).map(c => c.split('RT_')[1]).sort(); + const conditions = unsortedConditions.sort((a, b) => parseInt(a) - parseInt(b)); + const transformed = conditions.map(condition => result.data.map(e => ({ + reaction_time: parseFloat(e[`RT_${condition}`]), + subject: path.parse(result.meta.datafile).name, + condition, + group: e.group, + session: e.session, + accuracy: parseFloat(e[`Accuracy_${condition}`]), + response_given: 'yes', + correct_response: 'true' + }))); + const data = transformed.reduce((acc, item) => acc.concat(item), []); + return data; +}; + +const filterData = (data, removeOutliers) => { + let filteredData = data.data.filter(row => row.trial_number && row.phase !== 'practice').map(row => ({ + condition: row.condition, + subject: path.parse(data.meta.datafile).name.split('-')[0], + group: path.parse(data.meta.datafile).name.split('-')[1], + session: path.parse(data.meta.datafile).name.split('-')[2], + reaction_time: Math.round(parseFloat(row.reaction_time)), + correct_response: row.correct_response, + trial_number: row.trial_number, + response_given: row.response_given + })); + if (removeOutliers) { + try { + const mean = ss.mean(filteredData.filter(r => r.response_given === 'yes' && r.correct_response === 'true').map(r => r.reaction_time)); + const standardDeviation = ss.sampleStandardDeviation(filteredData.filter(r => r.response_given === 'yes' && r.correct_response === 'true').map(r => r.reaction_time)); + const upperBoarder = mean + 2 * standardDeviation; + const lowerBoarder = mean - 2 * standardDeviation; + filteredData = filteredData.filter(r => (r.reaction_time > lowerBoarder && r.reaction_time < upperBoarder) || isNaN(r.reaction_time)); + } catch (err) { + alert('Calculation of the mean and the standard deviation requires at least two completed trials in each condition.'); + return filteredData; + } + } + return filteredData; +}; + +const computeRT = (data, dependentVariable, conditions, showDataPoints, colors, displayMode) => { + let dataToPlot = 0; + let maxValue = 0; + switch (displayMode) { + case 'datapoints':default: + let tickValuesX, tickTextX; + dataToPlot = conditions.reduce((obj, condition, i) => { + const xRaw = data.reduce((a, b) => a.concat(b), []).filter(r => r.response_given === 'yes' && r.correct_response === 'true').filter(e => e.condition === condition).map(r => r.subject); + const y = data.reduce((a, b) => a.concat(b), []).filter(r => r.response_given === 'yes' && r.correct_response === 'true').filter(e => e.condition === condition).map(r => r.reaction_time); + maxValue = Math.max(...y) > maxValue ? Math.max(...y) : maxValue; + const subjects = Array.from(new Set(xRaw)); + const x = xRaw.map(x => subjects.indexOf(x) + 1 + i / 4 + (Math.random() - 0.5) / 5); + tickValuesX = subjects.map(x => subjects.indexOf(x) + 1 + 1 / 8); + tickTextX = subjects; + obj[condition] = { x, y }; + return obj; + }, {}); + dataToPlot['tickvals'] = tickValuesX; + dataToPlot['ticktext'] = tickTextX; + dataToPlot['lowerLimit'] = 0; + dataToPlot['upperLimit'] = maxValue > 1000 ? maxValue + 100 : 1000; + return makeDataPointsGraph(dataToPlot, conditions, colors, dependentVariable); + + case 'errorbars': + let maxValueSE = 0; + dataToPlot = conditions.reduce((obj, condition) => { + const xRaw = data.reduce((a, b) => a.concat(b), []).filter(r => r.response_given === 'yes' && r.correct_response === 'true').filter(e => e.condition === condition).map(r => r.subject); + const x = Array.from(new Set(xRaw)); + const data_condition = data.map(d => d.filter(r => r.response_given === 'yes' && r.correct_response === 'true').filter(e => e.condition == condition)); + const y_bars_prep = x.map(a => data_condition.map(d => d.filter(e => e.subject === a)).filter(d => d.length > 0)); + const y = y_bars_prep.map(y => ss.mean(y.reduce((a, b) => a.concat(b), []).map(r => r.reaction_time))).map(v => Math.round(v)); + maxValue = Math.max(...y) > maxValue ? Math.max(...y) : maxValue; + const stErrorFunction = array => ss.sampleStandardDeviation(array) / Math.sqrt(array.length); + const stErrors = data_condition.map(a => a.length > 1 ? stErrorFunction(a.map(r => r.reaction_time)) : 0).map(v => Math.round(v)); + maxValueSE = Math.max(...stErrors) > maxValueSE ? Math.max(...stErrors) : maxValueSE; + obj[condition] = { x, y, stErrors }; + return obj; + }, {}); + dataToPlot['lowerLimit'] = 0; + dataToPlot['upperLimit'] = maxValue + maxValueSE > 1000 ? maxValue + maxValueSE + 100 : 1000; + return makeBarGraph(dataToPlot, conditions, colors, dependentVariable); + + case 'whiskers': + dataToPlot = conditions.reduce((obj, condition, i) => { + const x = data.reduce((a, b) => a.concat(b), []).filter(r => r.response_given === 'yes' && r.correct_response === 'true').filter(e => e.condition === condition).map(r => r.subject); + const y = data.reduce((a, b) => a.concat(b), []).filter(r => r.response_given === 'yes' && r.correct_response === 'true').filter(e => e.condition === condition).map(r => r.reaction_time); + maxValue = Math.max(...y) > maxValue ? Math.max(...y) : maxValue; + obj[condition] = { x, y }; + return obj; + }, {}); + dataToPlot['lowerLimit'] = 0; + dataToPlot['upperLimit'] = maxValue > 1000 ? maxValue + 100 : 1000; + return makeBoxPlot(dataToPlot, conditions, colors, dependentVariable); + + } +}; + +const computeAccuracy = (data, dependentVariable, conditions, showDataPoints, colors, displayMode) => { + let dataToPlot; + + switch (displayMode) { + case 'datapoints':default: + let tickValuesX, tickTextX; + dataToPlot = conditions.reduce((obj, condition, i) => { + const correctDataForCondition = data.map(d => d.filter(e => e.condition == condition)); + + const y = correctDataForCondition.map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => l.accuracy); + } + const c = d.filter(e => e.response_given === 'yes' && e.correct_response === 'true'); + return Math.round(c.length / d.length * 100); + }).reduce((acc, item) => acc.concat(item), []); + + const xRaw = correctDataForCondition.map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => l.subject); + } + return d.map(r => r.subject)[0]; + }).reduce((acc, item) => acc.concat(item), []); + const subjects = Array.from(new Set(xRaw)); + const x = xRaw.map(x => subjects.indexOf(x) + 1 + i / 4 + (Math.random() - 0.5) / 5); + tickValuesX = subjects.map(x => subjects.indexOf(x) + 1 + 1 / 8); + tickTextX = subjects; + obj[condition] = { x, y }; + return obj; + }, {}); + dataToPlot['tickvals'] = tickValuesX; + dataToPlot['ticktext'] = tickTextX; + dataToPlot['lowerLimit'] = 0; + dataToPlot['upperLimit'] = 105; + return makeDataPointsGraph(dataToPlot, conditions, colors, dependentVariable); + + case 'errorbars': + dataToPlot = conditions.reduce((obj, condition, i) => { + const correctDataForCondition = data.map(d => d.filter(e => e.condition == condition)); + const transformedData = correctDataForCondition.map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => ({ + accuracy: l.accuracy, + subject: l.subject + })); + } + const c = d.filter(e => e.response_given === 'yes' && e.correct_response === 'true'); + return { + accuracy: Math.round(c.length / d.length * 100), + subject: d.map(r => r.subject)[0] + }; + }).reduce((acc, item) => acc.concat(item), []); + const subjects = Array.from(new Set(transformedData.map(e => e.subject))); + const y = subjects.map(subject => ss.mean(transformedData.filter(e => e.subject === subject).map(d => d.accuracy))); + const stErrorFunction = array => ss.sampleStandardDeviation(array) / Math.sqrt(array.length); + const stErrors = subjects.map(subject => { + const array = transformedData.filter(e => e.subject === subject).map(d => d.accuracy); + if (array.length > 1) { + return stErrorFunction(array); + } + return 0; + }); + obj[condition] = { x: subjects, y, stErrors }; + return obj; + }, {}); + dataToPlot['lowerLimit'] = 0; + dataToPlot['upperLimit'] = 105; + return makeBarGraph(dataToPlot, conditions, colors, dependentVariable); + + case 'whiskers': + dataToPlot = conditions.reduce((obj, condition, i) => { + const correctDataForCondition = data.map(d => d.filter(e => e.condition == condition)); + const y = correctDataForCondition.map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => l.accuracy); + } + const c = d.filter(e => e.response_given === 'yes' && e.correct_response === 'true'); + return Math.round(c.length / d.length * 100); + }).reduce((acc, item) => acc.concat(item), []); + const xRaw = correctDataForCondition.map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => l.subject); + } + return d.map(r => r.subject)[0]; + }).reduce((acc, item) => acc.concat(item), []); + obj[condition] = { x: xRaw, y }; + return obj; + }, {}); + dataToPlot['lowerLimit'] = 0; + dataToPlot['upperLimit'] = 105; + return makeBoxPlot(dataToPlot, conditions, colors, dependentVariable); + + } +}; + +// Rendering functions +const makeDataPointsGraph = (data, conditions, colors, dependentVariable) => { + let dataForCondition; + const symbols = ['circle', 'cross', 'diamond', 'square']; + const dataToPlot = conditions.map((condition, i) => { + dataForCondition = data[condition]; + return { + x: dataForCondition.x, + y: dataForCondition.y, + name: condition, + type: 'scatter', + marker: { + color: colors[i], + size: 7, + symbol: symbols[i] + }, + mode: 'markers' + }; + }); + const layout = { + xaxis: { + tickvals: data.tickvals, + ticktext: data.ticktext + }, + yaxis: { + title: `${dependentVariable == 'Response Time' ? 'Response Time (milliseconds)' : '% correct'}`, + range: [data.lowerLimit, data.upperLimit] + }, + title: `${dependentVariable}` + }; + return { + dataToPlot, + layout + }; +}; + +const makeBarGraph = (data, conditions, colors, dependentVariable) => { + const dataToPlot = conditions.map((condition, i) => { + const dataForCondition = data[condition]; + return { + x: dataForCondition.x, + y: dataForCondition.y, + name: condition, + type: 'bar', + marker: { + color: colors[i], + size: 7 + }, + error_y: { + type: 'data', + array: dataForCondition.stErrors, + visible: true + } + }; + }); + const layout = { + yaxis: { + title: `${dependentVariable == 'Response Time' ? 'Response Time (milliseconds)' : '% correct'}`, + zeroline: false, + range: [data.lowerLimit, data.upperLimit] + }, + barmode: 'group', + title: `${dependentVariable}` + }; + return { + dataToPlot, + layout + }; +}; + +const makeBoxPlot = (data, conditions, colors, dependentVariable) => { + const symbols = ['circle', 'cross', 'diamond', 'square']; + const dataToPlot = conditions.map((condition, i) => { + const dataForCondition = data[condition]; + return { + x: dataForCondition.x, + y: dataForCondition.y, + name: condition, + type: 'box', + marker: { + color: colors[i], + size: 7, + symbol: symbols[i] + }, + boxpoints: 'false', + pointpos: 0 + }; + }); + const layout = { + yaxis: { + title: `${dependentVariable == 'Response Time' ? 'Response Time (milliseconds)' : '% correct'}`, + zeroline: false, + range: [data.lowerLimit, data.upperLimit] + }, + boxmode: 'group', + title: `${dependentVariable}` + }; + return { + dataToPlot, + layout + }; +}; \ No newline at end of file diff --git a/app/utils/eeg/cortex.js b/app/utils/eeg/cortex.ts similarity index 68% rename from app/utils/eeg/cortex.js rename to app/utils/eeg/cortex.ts index 7534efdc..3e45ef36 100644 --- a/app/utils/eeg/cortex.js +++ b/app/utils/eeg/cortex.ts @@ -1,4 +1,5 @@ /* eslint-disable no-underscore-dangle, camelcase */ + /* * JS Cortex Wrapper * ***************** @@ -17,7 +18,6 @@ * just pass information back and forth without doing much with it, with the * exception of the login/auth flow, which we expose as the init() method. */ - const WebSocket = require('ws'); const EventEmitter = require('events'); @@ -36,6 +36,7 @@ if (global.process) { } class JSONRPCError extends Error { + constructor(err) { super(err.message); this.name = this.constructor.name; @@ -48,6 +49,7 @@ class JSONRPCError extends Error { } class Cortex extends EventEmitter { + constructor(options = {}) { super(); this.options = options; @@ -64,19 +66,13 @@ class Cortex extends EventEmitter { throw new JSONRPCError(error); }; - this.ready = new Promise( - resolve => this.ws.addEventListener('open', resolve), - this.handleError - ) - .then(() => this._log('ws: Socket opened')) - .then(() => this.call('inspectApi')) - .then(methods => { - methods.forEach(m => { - this.defineMethod(m.methodName, m.params); - }); - this._log(`rpc: Added ${methods.length} methods from inspectApi`); - return methods; + this.ready = new Promise(resolve => this.ws.addEventListener('open', resolve), this.handleError).then(() => this._log('ws: Socket opened')).then(() => this.call('inspectApi')).then(methods => { + methods.forEach(m => { + this.defineMethod(m.methodName, m.params); }); + this._log(`rpc: Added ${methods.length} methods from inspectApi`); + return methods; + }); } _onmsg(msg) { const data = safeParse(msg.data); @@ -86,23 +82,15 @@ class Cortex extends EventEmitter { if ('id' in data) { const id = data.id; - this._log( - `[${id}] <-`, - data.result ? 'success' : `error (${data.error.message})` - ); + this._log(`[${id}] <-`, data.result ? 'success' : `error (${data.error.message})`); if (this.requests[id]) { this.requests[id](data.error, data.result); } else { this._warn('rpc: Got response for unknown id', id); } } else if ('sid' in data) { - const dataKeys = Object.keys(data).filter( - k => k !== 'sid' && k !== 'time' && Array.isArray(data[k]) - ); - dataKeys.forEach( - k => - this.emit(k, data) || this._warn('no listeners for stream event', k) - ); + const dataKeys = Object.keys(data).filter(k => k !== 'sid' && k !== 'time' && Array.isArray(data[k])); + dataKeys.forEach(k => this.emit(k, data) || this._warn('no listeners for stream event', k)); } else { this._log('rpc: Unrecognised data', data); } @@ -116,32 +104,37 @@ class Cortex extends EventEmitter { _debug(...msg) { if (this.verbose > 2) console.debug('[Cortex DEBUG]', ...msg); } - init({ clientId, clientSecret, license, debit } = {}) { - const token = this.getUserLogin() - .then(users => { - if (users.length === 0) { - return Promise.reject(new Error('No logged in user')); - } - return this.requestAccess({ clientId, clientSecret }); - }) - .then(({ accessGranted }) => { - if (!accessGranted) { - return Promise.reject( - new Error('Please approve this application in the EMOTIV app') - ); - } - return this.authorize({ - clientId, - clientSecret, - license, - debit - }).then(({ cortexToken }) => { - this._log('init: Got auth token'); - this._debug('init: Auth token', cortexToken); - this.cortexToken = cortexToken; - return cortexToken; - }); + init({ + clientId, + clientSecret, + license, + debit + } = {}) { + const token = this.getUserLogin().then(users => { + if (users.length === 0) { + return Promise.reject(new Error('No logged in user')); + } + return this.requestAccess({ clientId, clientSecret }); + }).then(({ + accessGranted + }) => { + if (!accessGranted) { + return Promise.reject(new Error('Please approve this application in the EMOTIV app')); + } + return this.authorize({ + clientId, + clientSecret, + license, + debit + }).then(({ + cortexToken + }) => { + this._log('init: Got auth token'); + this._debug('init: Auth token', cortexToken); + this.cortexToken = cortexToken; + return cortexToken; }); + }); return token; } @@ -179,13 +172,7 @@ class Cortex extends EventEmitter { } const missingParams = requiredParams.filter(p => params[p] == null); if (missingParams.length > 0) { - return this.handleError( - new Error( - `Missing required params for ${methodName}: ${missingParams.join( - ', ' - )}` - ) - ); + return this.handleError(new Error(`Missing required params for ${methodName}: ${missingParams.join(', ')}`)); } return this.call(methodName, params); }; @@ -194,4 +181,4 @@ class Cortex extends EventEmitter { Cortex.JSONRPCError = JSONRPCError; -module.exports = Cortex; +module.exports = Cortex; \ No newline at end of file diff --git a/app/utils/eeg/emotiv.js b/app/utils/eeg/emotiv.ts similarity index 76% rename from app/utils/eeg/emotiv.js rename to app/utils/eeg/emotiv.ts index 77a276cf..59f27abe 100644 --- a/app/utils/eeg/emotiv.js +++ b/app/utils/eeg/emotiv.ts @@ -3,14 +3,14 @@ * an RxJS Observable of raw EEG data * */ -import { fromEvent } from 'rxjs'; -import { map, withLatestFrom, share } from 'rxjs/operators'; -import { addInfo, epoch, bandpassFilter } from '@neurosity/pipes'; -import { toast } from 'react-toastify'; -import { parseEmotivSignalQuality } from './pipes'; -import { CLIENT_ID, CLIENT_SECRET, LICENSE_ID } from '../../../keys'; -import { EMOTIV_CHANNELS, PLOTTING_INTERVAL } from '../../constants/constants'; -import Cortex from './cortex'; +import { fromEvent } from "rxjs"; +import { map, withLatestFrom, share } from "rxjs/operators"; +import { addInfo, epoch, bandpassFilter } from "@neurosity/pipes"; +import { toast } from "react-toastify"; +import { parseEmotivSignalQuality } from "./pipes"; +import { CLIENT_ID, CLIENT_SECRET, LICENSE_ID } from "../../../keys"; +import { EMOTIV_CHANNELS, PLOTTING_INTERVAL } from "../../constants/constants"; +import Cortex from "./cortex"; // Creates the Cortex object from SDK const verbose = process.env.LOG_LEVEL || 1; @@ -101,25 +101,18 @@ export const createEmotivSignalQualityObservable = rawObservable => { const signalQualityObservable = fromEvent(client, 'dev'); const samplingRate = 128; const channels = EMOTIV_CHANNELS; - const intervalSamples = (PLOTTING_INTERVAL * samplingRate) / 1000; - return rawObservable.pipe( - addInfo({ - samplingRate, - channels - }), - epoch({ - duration: intervalSamples, - interval: intervalSamples - }), - bandpassFilter({ - nbChannels: channels.length, - lowCutoff: 1, - highCutoff: 50 - }), - withLatestFrom(signalQualityObservable, integrateSignalQuality), - parseEmotivSignalQuality(), - share() - ); + const intervalSamples = PLOTTING_INTERVAL * samplingRate / 1000; + return rawObservable.pipe(addInfo({ + samplingRate, + channels + }), epoch({ + duration: intervalSamples, + interval: intervalSamples + }), bandpassFilter({ + nbChannels: channels.length, + lowCutoff: 1, + highCutoff: 50 + }), withLatestFrom(signalQualityObservable, integrateSignalQuality), parseEmotivSignalQuality(), share()); }; export const injectEmotivMarker = (value, time) => { @@ -150,10 +143,7 @@ const createEEGSample = eegEvent => { prunedArray[i] = eegEvent.eeg[i + 2]; } if (eegEvent.eeg[eegEvent.eeg.length - 1].length >= 1) { - const marker = - (eegEvent.eeg[eegEvent.eeg.length - 1][0] && - eegEvent.eeg[eegEvent.eeg.length - 1][0].value) || - 0; + const marker = (eegEvent.eeg[eegEvent.eeg.length - 1][0] && eegEvent.eeg[eegEvent.eeg.length - 1][0].value) || 0; return { data: prunedArray, timestamp: eegEvent.time * 1000, marker }; } return { data: prunedArray, timestamp: eegEvent.time * 1000 }; @@ -161,9 +151,7 @@ const createEEGSample = eegEvent => { const integrateSignalQuality = (newEpoch, devSample) => ({ ...newEpoch, - signalQuality: Object.assign( - ...devSample.dev[2].map((signalQuality, index) => ({ - [EMOTIV_CHANNELS[index]]: signalQuality - })) - ) -}); + signalQuality: Object.assign(...devSample.dev[2].map((signalQuality, index) => ({ + [EMOTIV_CHANNELS[index]]: signalQuality + }))) +}); \ No newline at end of file diff --git a/app/utils/eeg/muse.js b/app/utils/eeg/muse.ts similarity index 60% rename from app/utils/eeg/muse.js rename to app/utils/eeg/muse.ts index ae2b076d..f3918ade 100644 --- a/app/utils/eeg/muse.js +++ b/app/utils/eeg/muse.ts @@ -1,20 +1,11 @@ -import 'hazardous'; -import { withLatestFrom, share, startWith, filter } from 'rxjs/operators'; -import { - addInfo, - epoch, - bandpassFilter, - addSignalQuality -} from '@neurosity/pipes'; -import { release } from 'os'; -import { MUSE_SERVICE, MuseClient, zipSamples } from 'muse-js'; -import { from } from 'rxjs'; -import { parseMuseSignalQuality } from './pipes'; -import { - MUSE_SAMPLING_RATE, - MUSE_CHANNELS, - PLOTTING_INTERVAL -} from '../../constants/constants'; +import "hazardous"; +import { withLatestFrom, share, startWith, filter } from "rxjs/operators"; +import { addInfo, epoch, bandpassFilter, addSignalQuality } from "@neurosity/pipes"; +import { release } from "os"; +import { MUSE_SERVICE, MuseClient, zipSamples } from "muse-js"; +import { from } from "rxjs"; +import { parseMuseSignalQuality } from "./pipes"; +import { MUSE_SAMPLING_RATE, MUSE_CHANNELS, PLOTTING_INTERVAL } from "../../constants/constants"; const INTER_SAMPLE_INTERVAL = -(1 / 256) * 1000; @@ -68,37 +59,27 @@ export const createRawMuseObservable = async () => { await client.start(); const eegStream = await client.eegReadings; const markers = await client.eventMarkers.pipe(startWith({ timestamp: 0 })); - return from(zipSamples(eegStream)).pipe( - filter(sample => !sample.data.includes(NaN)), - withLatestFrom(markers, synchronizeTimestamp), - share() - ); + return from(zipSamples(eegStream)).pipe(filter(sample => !sample.data.includes(NaN)), withLatestFrom(markers, synchronizeTimestamp), share()); }; // Creates an observable that will epoch, filter, and add signal quality to EEG stream -export const createMuseSignalQualityObservable = ( - rawObservable, - deviceInfo -) => { - const { samplingRate, channels: channelNames } = deviceInfo; - const intervalSamples = (PLOTTING_INTERVAL * samplingRate) / 1000; - return rawObservable.pipe( - addInfo({ - samplingRate, - channelNames - }), - epoch({ - duration: intervalSamples, - interval: intervalSamples - }), - bandpassFilter({ - nbChannels: channelNames.length, - lowCutoff: 1, - highCutoff: 50 - }), - addSignalQuality(), - parseMuseSignalQuality() - ); +export const createMuseSignalQualityObservable = (rawObservable, deviceInfo) => { + const { + samplingRate, + channels: channelNames + } = deviceInfo; + const intervalSamples = PLOTTING_INTERVAL * samplingRate / 1000; + return rawObservable.pipe(addInfo({ + samplingRate, + channelNames + }), epoch({ + duration: intervalSamples, + interval: intervalSamples + }), bandpassFilter({ + nbChannels: channelNames.length, + lowCutoff: 1, + highCutoff: 50 + }), addSignalQuality(), parseMuseSignalQuality()); }; // Injects an event marker that will be included in muse-js's data stream through @@ -110,11 +91,8 @@ export const injectMuseMarker = (value, time) => { // Helpers const synchronizeTimestamp = (eegSample, marker) => { - if ( - eegSample['timestamp'] - marker['timestamp'] < 0 && - eegSample['timestamp'] - marker['timestamp'] >= INTER_SAMPLE_INTERVAL - ) { + if (eegSample['timestamp'] - marker['timestamp'] < 0 && eegSample['timestamp'] - marker['timestamp'] >= INTER_SAMPLE_INTERVAL) { return { ...eegSample, marker: marker['value'] }; } return eegSample; -}; +}; \ No newline at end of file diff --git a/app/utils/eeg/pipes.js b/app/utils/eeg/pipes.js deleted file mode 100644 index 256019e0..00000000 --- a/app/utils/eeg/pipes.js +++ /dev/null @@ -1,54 +0,0 @@ -import { pipe } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { - SIGNAL_QUALITY, - SIGNAL_QUALITY_THRESHOLDS -} from '../../constants/constants'; - -export const parseMuseSignalQuality = () => - pipe( - map(epoch => ({ - ...epoch, - signalQuality: Object.assign( - {}, - ...Object.entries(epoch.signalQuality).map( - ([channelName, signalQuality]) => { - if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.BAD) { - return { [channelName]: SIGNAL_QUALITY.BAD }; - } - if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.OK) { - return { [channelName]: SIGNAL_QUALITY.OK }; - } - if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.GREAT) { - return { [channelName]: SIGNAL_QUALITY.GREAT }; - } - return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; - } - ) - ) - })) - ); - -export const parseEmotivSignalQuality = () => - pipe( - map(epoch => ({ - ...epoch, - signalQuality: Object.assign( - {}, - ...Object.entries(epoch.signalQuality).map( - ([channelName, signalQuality]) => { - if (signalQuality === 0) { - return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; - } - if (signalQuality === 3) { - return { [channelName]: SIGNAL_QUALITY.OK }; - } - if (signalQuality === 4) { - return { [channelName]: SIGNAL_QUALITY.GREAT }; - } - return { [channelName]: SIGNAL_QUALITY.BAD }; - } - ) - ) - })) - ); diff --git a/app/utils/eeg/pipes.ts b/app/utils/eeg/pipes.ts new file mode 100644 index 00000000..05f9fbcf --- /dev/null +++ b/app/utils/eeg/pipes.ts @@ -0,0 +1,35 @@ +import { pipe } from "rxjs"; +import { map } from "rxjs/operators"; +import { SIGNAL_QUALITY, SIGNAL_QUALITY_THRESHOLDS } from "../../constants/constants"; + +export const parseMuseSignalQuality = () => pipe(map(epoch => ({ + ...epoch, + signalQuality: Object.assign({}, ...Object.entries(epoch.signalQuality).map(([channelName, signalQuality]) => { + if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.BAD) { + return { [channelName]: SIGNAL_QUALITY.BAD }; + } + if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.OK) { + return { [channelName]: SIGNAL_QUALITY.OK }; + } + if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.GREAT) { + return { [channelName]: SIGNAL_QUALITY.GREAT }; + } + return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; + })) +}))); + +export const parseEmotivSignalQuality = () => pipe(map(epoch => ({ + ...epoch, + signalQuality: Object.assign({}, ...Object.entries(epoch.signalQuality).map(([channelName, signalQuality]) => { + if (signalQuality === 0) { + return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; + } + if (signalQuality === 3) { + return { [channelName]: SIGNAL_QUALITY.OK }; + } + if (signalQuality === 4) { + return { [channelName]: SIGNAL_QUALITY.GREAT }; + } + return { [channelName]: SIGNAL_QUALITY.BAD }; + })) +}))); \ No newline at end of file diff --git a/app/utils/filesystem/dialog.js b/app/utils/filesystem/dialog.js deleted file mode 100644 index 76889ae6..00000000 --- a/app/utils/filesystem/dialog.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Functions involved handling system dialogs - * These functions are all executed in the main process - */ - -import { dialog } from 'electron'; -import { FILE_TYPES } from '../../constants/constants'; - -export const loadDialog = (event, arg) => { - switch (arg) { - case FILE_TYPES.STIMULUS_DIR: - return selectStimulusFolder(event); - - case FILE_TYPES.TIMELINE: - default: - return selectTimeline(event); - } -}; - -const selectTimeline = event => { - dialog.showOpenDialog( - { - title: 'Select a jsPsych timeline file', - properties: ['openFile', 'promptToCreate'] - }, - filePaths => { - if (filePaths) { - event.sender.send('loadDialogReply', filePaths[0]); - } - } - ); -}; - -const selectStimulusFolder = event => { - dialog.showOpenDialog( - { - title: 'Select a folder of images', - properties: ['openDirectory'] - }, - dir => { - if (dir) { - event.sender.send('loadDialogReply', dir[0]); - } else { - event.sender.send('loadDialogReply', ''); - } - } - ); -}; diff --git a/app/utils/filesystem/dialog.ts b/app/utils/filesystem/dialog.ts new file mode 100644 index 00000000..f1470452 --- /dev/null +++ b/app/utils/filesystem/dialog.ts @@ -0,0 +1,42 @@ +/** + * Functions involved handling system dialogs + * These functions are all executed in the main process + */ + +import { dialog } from "electron"; +import { FILE_TYPES } from "../../constants/constants"; + +export const loadDialog = (event, arg) => { + switch (arg) { + case FILE_TYPES.STIMULUS_DIR: + return selectStimulusFolder(event); + + case FILE_TYPES.TIMELINE:default: + return selectTimeline(event); + + } +}; + +const selectTimeline = event => { + dialog.showOpenDialog({ + title: 'Select a jsPsych timeline file', + properties: ['openFile', 'promptToCreate'] + }, filePaths => { + if (filePaths) { + event.sender.send('loadDialogReply', filePaths[0]); + } + }); +}; + +const selectStimulusFolder = event => { + dialog.showOpenDialog({ + title: 'Select a folder of images', + properties: ['openDirectory'] + }, dir => { + if (dir) { + event.sender.send('loadDialogReply', dir[0]); + } else { + event.sender.send('loadDialogReply', ''); + } + }); +}; \ No newline at end of file diff --git a/app/utils/filesystem/select.js b/app/utils/filesystem/select.js deleted file mode 100644 index 4c8c7012..00000000 --- a/app/utils/filesystem/select.js +++ /dev/null @@ -1,16 +0,0 @@ -// @flow - -/** - * Functions for selecting files and directories from disk - */ - -import { ipcRenderer } from 'electron'; -import { FILE_TYPES } from '../../constants/constants'; - -export const loadFromSystemDialog = (fileType: FILE_TYPES) => - new Promise(resolve => { - ipcRenderer.send('loadDialog', fileType); - ipcRenderer.on('loadDialogReply', (event, result) => { - resolve(result); - }); - }); diff --git a/app/utils/filesystem/select.ts b/app/utils/filesystem/select.ts new file mode 100644 index 00000000..22c23035 --- /dev/null +++ b/app/utils/filesystem/select.ts @@ -0,0 +1,15 @@ + + +/** + * Functions for selecting files and directories from disk + */ + +import { ipcRenderer } from "electron"; +import { FILE_TYPES } from "../../constants/constants"; + +export const loadFromSystemDialog = (fileType: FILE_TYPES) => new Promise(resolve => { + ipcRenderer.send('loadDialog', fileType); + ipcRenderer.on('loadDialogReply', (event, result) => { + resolve(result); + }); +}); \ No newline at end of file diff --git a/app/utils/filesystem/storage.js b/app/utils/filesystem/storage.ts old mode 100755 new mode 100644 similarity index 58% rename from app/utils/filesystem/storage.js rename to app/utils/filesystem/storage.ts index 582e7e2c..41fca40e --- a/app/utils/filesystem/storage.js +++ b/app/utils/filesystem/storage.ts @@ -1,33 +1,33 @@ -// @flow + /** * Functions for managing user data stored on disk */ -import * as fs from 'fs'; -import * as os from 'os'; -import * as path from 'path'; -import recursive from 'recursive-readdir'; -import { shell, remote } from 'electron'; -import Papa from 'papaparse'; -import { ExperimentStateType } from '../../reducers/experimentReducer'; -import { mkdirPathSync } from './write'; +import * as fs from "fs"; +import * as os from "os"; +import * as path from "path"; +import recursive from "recursive-readdir"; +import { shell, remote } from "electron"; +import Papa from "papaparse"; +import { ExperimentStateType } from "../../reducers/experimentReducer"; +import { mkdirPathSync } from "./write"; const workspaces = path.join(os.homedir(), 'BrainWaves_Workspaces'); -const { dialog } = remote; +const { + dialog +} = remote; // ----------------------------------------------------------------------------------------------- // Creating and Getting // Creates a new directory for a given workspace with the passed title if it doesn't already exist -export const createWorkspaceDir = (title: string) => - mkdirPathSync(getWorkspaceDir(title)); +export const createWorkspaceDir = (title: string) => mkdirPathSync(getWorkspaceDir(title)); // Gets the absolute path for a workspace from a given title export const getWorkspaceDir = (title: string) => path.join(workspaces, title); // Opens a workspace folder in explorer (or other native OS filesystem browser) -export const openWorkspaceDir = (title: string) => - shell.openItem(path.join(workspaces, title)); +export const openWorkspaceDir = (title: string) => shell.openItem(path.join(workspaces, title)); // ----------------------------------------------------------------------------------------------- // Storing @@ -35,12 +35,8 @@ export const openWorkspaceDir = (title: string) => // Writes 'experiment' store state to file as a JSON object export const storeExperimentState = (state: ExperimentStateType) => { const timestampedState = state; - if (timestampedState && timestampedState.params) - timestampedState.params.dateModified = Date.now(); // saves the timestamp - fs.writeFileSync( - path.join(getWorkspaceDir(timestampedState.title), 'appState.json'), - JSON.stringify(timestampedState) - ); + if (timestampedState && timestampedState.params) timestampedState.params.dateModified = Date.now(); // saves the timestamp + fs.writeFileSync(path.join(getWorkspaceDir(timestampedState.title), 'appState.json'), JSON.stringify(timestampedState)); }; export const restoreExperimentState = (state: ExperimentStateType) => { @@ -51,20 +47,11 @@ export const restoreExperimentState = (state: ExperimentStateType) => { group: '', session: 1 }; - fs.writeFileSync( - path.join(getWorkspaceDir(timestampedState.title), 'appState.json'), - JSON.stringify(timestampedState) - ); + fs.writeFileSync(path.join(getWorkspaceDir(timestampedState.title), 'appState.json'), JSON.stringify(timestampedState)); } }; -export const storeBehaviouralData = ( - csv: string, - title: string, - subject: string, - group: string, - session: number -) => { +export const storeBehaviouralData = (csv: string, title: string, subject: string, group: string, session: number) => { const dir = path.join(getWorkspaceDir(title), 'Data', subject, 'Behavior'); const filename = `${subject}-${group}-${session}-behavior.csv`; mkdirPathSync(dir); @@ -76,11 +63,7 @@ export const storeBehaviouralData = ( }; // Stores an image to workspace dir -export const storeJupyterImage = ( - title: string, - imageTitle: string, - rawData: Buffer -) => { +export const storeJupyterImage = (title: string, imageTitle: string, rawData: Buffer) => { const dir = path.join(getWorkspaceDir(title), 'Results', 'Images'); const filename = `${imageTitle}.png`; mkdirPathSync(dir); @@ -97,9 +80,7 @@ export const storeJupyterImage = ( // Returns a list of workspaces in the workspaces directory. Will make the workspaces dir if it doesn't exist yet export const readWorkspaces = () => { try { - return fs - .readdirSync(workspaces) - .filter(workspace => workspace !== '.DS_Store'); + return fs.readdirSync(workspaces).filter(workspace => workspace !== '.DS_Store'); } catch (e) { if (e.code === 'ENOENT') { mkdirPathSync(workspaces); @@ -113,12 +94,10 @@ export const readWorkspaces = () => { export const readWorkspaceRawEEGData = async (title: string) => { try { const files = await recursive(getWorkspaceDir(title)); - const rawFiles = files - .filter(filepath => filepath.slice(-7).includes('raw.csv')) - .map(filepath => ({ - name: path.basename(filepath), - path: filepath - })); + const rawFiles = files.filter(filepath => filepath.slice(-7).includes('raw.csv')).map(filepath => ({ + name: path.basename(filepath), + path: filepath + })); return rawFiles; } catch (e) { if (e.code === 'ENOENT') { @@ -132,12 +111,10 @@ export const readWorkspaceRawEEGData = async (title: string) => { export const readWorkspaceCleanedEEGData = async (title: string) => { try { const files = await recursive(getWorkspaceDir(title)); - return files - .filter(filepath => filepath.slice(-7).includes('epo.fif')) - .map(filepath => ({ - name: path.basename(filepath), - path: filepath - })); + return files.filter(filepath => filepath.slice(-7).includes('epo.fif')).map(filepath => ({ + name: path.basename(filepath), + path: filepath + })); } catch (e) { console.log(e); return []; @@ -148,12 +125,10 @@ export const readWorkspaceCleanedEEGData = async (title: string) => { export const readWorkspaceBehaviorData = async (title: string) => { try { const files = await recursive(getWorkspaceDir(title)); - const behaviorFiles = files - .filter(filepath => filepath.slice(-12).includes('behavior.csv')) - .map(filepath => ({ - name: path.basename(filepath), - path: filepath - })); + const behaviorFiles = files.filter(filepath => filepath.slice(-12).includes('behavior.csv')).map(filepath => ({ + name: path.basename(filepath), + path: filepath + })); return behaviorFiles; } catch (e) { if (e.code === 'ENOENT') { @@ -166,9 +141,7 @@ export const readWorkspaceBehaviorData = async (title: string) => { // Reads an experiment state tree from disk and parses it from JSON export const readAndParseState = (dir: string) => { try { - return JSON.parse( - fs.readFileSync(path.join(workspaces, dir, 'appState.json')) - ); + return JSON.parse(fs.readFileSync(path.join(workspaces, dir, 'appState.json'))); } catch (e) { if (e.code === 'ENOENT') { console.log('appState does not exist for recent workspace'); @@ -178,37 +151,22 @@ export const readAndParseState = (dir: string) => { }; // Reads a list of images that are in a directory -export const readImages = (dir: string) => - fs.readdirSync(dir).filter(filename => { - const extension = filename.slice(-3).toLowerCase(); - return ( - extension === 'png' || - extension === 'jpg' || - extension === 'gif' || - extension === 'peg' // support .jpeg? - ); - }); +export const readImages = (dir: string) => fs.readdirSync(dir).filter(filename => { + const extension = filename.slice(-3).toLowerCase(); + return (extension === 'png' || extension === 'jpg' || extension === 'gif' || extension === 'peg' // support .jpeg? + ); +}); // Returns an array of images that are used in a timeline for use in preloading -export const getImages = (params: ExperimentParameters) => - readdirSync(params.stimulus1.dir) - .map(filename => path.join(params.stimulus1.dir, filename)) - .concat( - readdirSync(params.stimulus2.dir).map(filename => - path.join(params.stimulus2.dir, filename) - ) - ); +export const getImages = (params: ExperimentParameters) => readdirSync(params.stimulus1.dir).map(filename => path.join(params.stimulus1.dir, filename)).concat(readdirSync(params.stimulus2.dir).map(filename => path.join(params.stimulus2.dir, filename))); // ----------------------------------------------------------------------------------------------- // Util -export const getSubjectNamesFromFiles = (filePaths: Array) => - filePaths - .map(filePath => path.basename(filePath)) - .map(fileName => fileName.substring(0, fileName.indexOf('-'))); +export const getSubjectNamesFromFiles = (filePaths: Array) => filePaths.map(filePath => path.basename(filePath)).map(fileName => fileName.substring(0, fileName.indexOf('-'))); // Read CSV files with behavioral data and return an object -export const readBehaviorData = (files: Array) => { +export const readBehaviorData = (files: Array) => { try { return files.map(file => { const csv = fs.readFileSync(file, 'utf-8'); @@ -228,19 +186,16 @@ export const storeAggregatedBehaviorData = (data, title) => { }; const saveFileOnDisk = (data, title) => { - dialog.showSaveDialog( - { - title: 'Select a folder to save the data', - defaultPath: path.join(getWorkspaceDir(title), 'Data', `aggregated.csv`) - }, - filename => { - if (filename && typeof filename !== 'undefined') { - fs.writeFile(filename, data, err => { - if (err) console.error(err); - }); - } + dialog.showSaveDialog({ + title: 'Select a folder to save the data', + defaultPath: path.join(getWorkspaceDir(title), 'Data', `aggregated.csv`) + }, filename => { + if (filename && typeof filename !== 'undefined') { + fs.writeFile(filename, data, err => { + if (err) console.error(err); + }); } - ); + }); }; // convert a csv file to an object with Papaparse @@ -264,13 +219,7 @@ export const deleteWorkspaceDir = (title: string) => { // Check whether the file with the given name already exists in the filesystem export const checkFileExists = (title, subject, filename) => { - const file = path.join( - getWorkspaceDir(title), - 'Data', - subject, - 'Behavior', - filename - ); + const file = path.join(getWorkspaceDir(title), 'Data', subject, 'Behavior', filename); const fileExists = fs.existsSync(file); return fileExists; -}; +}; \ No newline at end of file diff --git a/app/utils/filesystem/write.js b/app/utils/filesystem/write.ts similarity index 76% rename from app/utils/filesystem/write.js rename to app/utils/filesystem/write.ts index baeceb41..d309e72e 100644 --- a/app/utils/filesystem/write.js +++ b/app/utils/filesystem/write.ts @@ -1,23 +1,18 @@ -// @flow + /** * Functions for writing EEG data to disk */ -import * as fs from 'fs'; -import * as path from 'path'; -import mkdirp from 'mkdirp'; -import { has } from 'lodash'; -import { getWorkspaceDir } from './storage'; -import { EEGData } from '../../constants/interfaces'; +import * as fs from "fs"; +import * as path from "path"; +import mkdirp from "mkdirp"; +import { has } from "lodash"; +import { getWorkspaceDir } from "./storage"; +import { EEGData } from "../../constants/interfaces"; // Creates an appropriate filename and returns a writestream that will write to that file -export const createEEGWriteStream = ( - title: string, - subject: string, - group: string, - session: number -) => { +export const createEEGWriteStream = (title: string, subject: string, group: string, session: number) => { try { const dir = path.join(getWorkspaceDir(title), 'Data', subject, 'EEG'); const filename = `${subject}-${group}-${session}-raw.csv`; @@ -30,10 +25,7 @@ export const createEEGWriteStream = ( // Writes the header for a simple CSV EEG file format. // timestamp followed by channels, followed by markers -export const writeHeader = ( - writeStream: fs.WriteStream, - channels: Array -) => { +export const writeHeader = (writeStream: fs.WriteStream, channels: Array) => { try { const headerLabels = `Timestamp,${channels.join(',')},Marker\n`; writeStream.write(headerLabels); @@ -62,4 +54,4 @@ export const writeEEGData = (writeStream: fs.WriteStream, eegData: EEGData) => { // Creates a directory path if it doesn't exist export const mkdirPathSync = dirPath => { mkdirp.sync(dirPath); -}; +}; \ No newline at end of file diff --git a/app/utils/jupyter/cells.js b/app/utils/jupyter/cells.js deleted file mode 100644 index f745fdae..00000000 --- a/app/utils/jupyter/cells.js +++ /dev/null @@ -1,108 +0,0 @@ -import * as path from 'path'; -import { readFileSync } from 'fs'; - -export const imports = () => - [ - 'from mne import Epochs, find_events, set_eeg_reference, read_epochs, concatenate_epochs', - 'from time import time, strftime, gmtime', - 'import os', - 'from collections import OrderedDict', - 'from glob import glob', - 'from mne import create_info, concatenate_raws', - 'from mne.io import RawArray', - 'from mne.io import RawArray', - 'from mne.channels import read_montage', - 'import pandas as pd', - 'import numpy as np', - 'import seaborn as sns', - 'from matplotlib import pyplot as plt', - "plt.style.use('fivethirtyeight')" - ].join('\n'); - -export const utils = () => - readFileSync(path.join(__dirname, '/utils/jupyter/utils.py'), 'utf8'); - -export const loadCSV = (filePathArray: Array) => - [ - `files = [${filePathArray.map(filePath => formatFilePath(filePath))}]`, - `replace_ch_names = None`, - `raw = load_data(files, replace_ch_names)` - ].join('\n'); - -export const loadCleanedEpochs = (filePathArray: Array) => - [ - `files = [${filePathArray.map(filePath => formatFilePath(filePath))}]`, - `clean_epochs = concatenate_epochs([read_epochs(file) for file in files])`, - `conditions = OrderedDict({key: [value] for (key, value) in clean_epochs.event_id.items()})` - ].join('\n'); - -// NOTE: this command includes a ';' to prevent returning data -export const filterIIR = (lowCutoff: number, highCutoff: number) => - `raw.filter(${lowCutoff}, ${highCutoff}, method='iir');`; - -export const plotPSD = () => - [`%matplotlib inline`, `raw.plot_psd(fmin=1, fmax=30)`].join('\n'); - -export const epochEvents = ( - eventIDs: { [string]: number }, - tmin: number, - tmax: number, - reject?: Array | string = 'None' -) => { - const IDs = Object.keys(eventIDs) - .filter(k => k !== '') - .reduce((res, key) => ((res[key] = eventIDs[key]), res), {}); - const command = [ - `event_id = ${JSON.stringify(IDs)}`, - `tmin=${tmin}`, - `tmax=${tmax}`, - `baseline= (tmin, tmax)`, - `picks = None`, - `reject = ${reject}`, - 'events = find_events(raw)', - `raw_epochs = Epochs(raw, events=events, event_id=event_id, - tmin=tmin, tmax=tmax, baseline=baseline, reject=reject, preload=True, - verbose=False, picks=picks)`, - `conditions = OrderedDict({key: [value] for (key, value) in raw_epochs.event_id.items()})` - ].join('\n'); - return command; -}; - -export const requestEpochsInfo = (variableName: string) => - `get_epochs_info(${variableName})`; - -export const requestChannelInfo = () => - `[ch for ch in clean_epochs.ch_names if ch != 'Marker']`; - -export const cleanEpochsPlot = () => - [ - `%matplotlib`, - `raw_epochs.plot(scalings='auto', n_epochs=6, title="Clean Data", events=None)` - ].join('\n'); - -export const plotTopoMap = () => - [`%matplotlib inline`, `plot_topo(clean_epochs, conditions)`].join('\n'); - -export const plotERP = (channelIndex: number) => - [ - `%matplotlib inline`, - `X, y = plot_conditions(clean_epochs, ch_ind=${channelIndex}, conditions=conditions, - ci=97.5, n_boot=1000, title='', diff_waveform=None)` - ].join('\n'); - -export const saveEpochs = (workspaceDir: string, subject: string) => - `raw_epochs.save(${formatFilePath( - path.join( - workspaceDir, - 'Data', - subject, - 'EEG', - `${subject}-cleaned-epo.fif` - ) - )})`; - -// ------------------------------------------- -// Helper methods - -const formatFilePath = (filePath: string) => - `"${filePath.replace(/\\/g, '/')}"`; diff --git a/app/utils/jupyter/cells.ts b/app/utils/jupyter/cells.ts new file mode 100644 index 00000000..308d7d29 --- /dev/null +++ b/app/utils/jupyter/cells.ts @@ -0,0 +1,43 @@ +import * as path from "path"; +import { readFileSync } from "fs"; + +export const imports = () => ['from mne import Epochs, find_events, set_eeg_reference, read_epochs, concatenate_epochs', 'from time import time, strftime, gmtime', 'import os', 'from collections import OrderedDict', 'from glob import glob', 'from mne import create_info, concatenate_raws', 'from mne.io import RawArray', 'from mne.io import RawArray', 'from mne.channels import read_montage', 'import pandas as pd', 'import numpy as np', 'import seaborn as sns', 'from matplotlib import pyplot as plt', "plt.style.use('fivethirtyeight')"].join('\n'); + +export const utils = () => readFileSync(path.join(__dirname, '/utils/jupyter/utils.py'), 'utf8'); + +export const loadCSV = (filePathArray: Array) => [`files = [${filePathArray.map(filePath => formatFilePath(filePath))}]`, `replace_ch_names = None`, `raw = load_data(files, replace_ch_names)`].join('\n'); + +export const loadCleanedEpochs = (filePathArray: Array) => [`files = [${filePathArray.map(filePath => formatFilePath(filePath))}]`, `clean_epochs = concatenate_epochs([read_epochs(file) for file in files])`, `conditions = OrderedDict({key: [value] for (key, value) in clean_epochs.event_id.items()})`].join('\n'); + +// NOTE: this command includes a ';' to prevent returning data +export const filterIIR = (lowCutoff: number, highCutoff: number) => `raw.filter(${lowCutoff}, ${highCutoff}, method='iir');`; + +export const plotPSD = () => [`%matplotlib inline`, `raw.plot_psd(fmin=1, fmax=30)`].join('\n'); + +export const epochEvents = (eventIDs: { + [key: string]: number; +}, tmin: number, tmax: number, reject?: Array | string = 'None') => { + const IDs = Object.keys(eventIDs).filter(k => k !== '').reduce((res, key) => (res[key] = eventIDs[key], res), {}); + const command = [`event_id = ${JSON.stringify(IDs)}`, `tmin=${tmin}`, `tmax=${tmax}`, `baseline= (tmin, tmax)`, `picks = None`, `reject = ${reject}`, 'events = find_events(raw)', `raw_epochs = Epochs(raw, events=events, event_id=event_id, + tmin=tmin, tmax=tmax, baseline=baseline, reject=reject, preload=True, + verbose=False, picks=picks)`, `conditions = OrderedDict({key: [value] for (key, value) in raw_epochs.event_id.items()})`].join('\n'); + return command; +}; + +export const requestEpochsInfo = (variableName: string) => `get_epochs_info(${variableName})`; + +export const requestChannelInfo = () => `[ch for ch in clean_epochs.ch_names if ch != 'Marker']`; + +export const cleanEpochsPlot = () => [`%matplotlib`, `raw_epochs.plot(scalings='auto', n_epochs=6, title="Clean Data", events=None)`].join('\n'); + +export const plotTopoMap = () => [`%matplotlib inline`, `plot_topo(clean_epochs, conditions)`].join('\n'); + +export const plotERP = (channelIndex: number) => [`%matplotlib inline`, `X, y = plot_conditions(clean_epochs, ch_ind=${channelIndex}, conditions=conditions, + ci=97.5, n_boot=1000, title='', diff_waveform=None)`].join('\n'); + +export const saveEpochs = (workspaceDir: string, subject: string) => `raw_epochs.save(${formatFilePath(path.join(workspaceDir, 'Data', subject, 'EEG', `${subject}-cleaned-epo.fif`))})`; + +// ------------------------------------------- +// Helper methods + +const formatFilePath = (filePath: string) => `"${filePath.replace(/\\/g, '/')}"`; \ No newline at end of file diff --git a/app/utils/jupyter/functions.js b/app/utils/jupyter/functions.ts similarity index 82% rename from app/utils/jupyter/functions.js rename to app/utils/jupyter/functions.ts index 81c49315..d25783f9 100644 --- a/app/utils/jupyter/functions.js +++ b/app/utils/jupyter/functions.ts @@ -1,7 +1,6 @@ -import { KERNEL_STATUS } from '../../constants/constants'; +import { KERNEL_STATUS } from "../../constants/constants"; -export const parseSingleQuoteJSON = (string: string) => - JSON.parse(string.replace(/'/g, '"')); +export const parseSingleQuoteJSON = (string: string) => JSON.parse(string.replace(/'/g, '"')); export const parseKernelStatus = (msg: Object) => { switch (msg['content']['execution_state']) { @@ -9,9 +8,9 @@ export const parseKernelStatus = (msg: Object) => { return KERNEL_STATUS.BUSY; case 'idle': return KERNEL_STATUS.IDLE; - case 'starting': - default: + case 'starting':default: return KERNEL_STATUS.STARTING; + } }; @@ -22,15 +21,19 @@ export const debugParseMessage = (msg: Object) => { if (msg.content.execution_state) { content = JSON.stringify(msg.content); } + if (msg.content.code) { content = msg.content.code.slice(0, 300).concat('...'); } + if (msg.content.text) { content = msg.content.text; } + if (msg.content.data) { content = Object.keys(msg.content.data); } + break; case 'shell': content = JSON.stringify(msg.content); @@ -38,6 +41,7 @@ export const debugParseMessage = (msg: Object) => { default: content = JSON.stringify(msg); + } return `${msg.channel} ${content}`; -}; +}; \ No newline at end of file diff --git a/app/utils/jupyter/pipes.js b/app/utils/jupyter/pipes.js deleted file mode 100644 index 07d8252a..00000000 --- a/app/utils/jupyter/pipes.js +++ /dev/null @@ -1,21 +0,0 @@ -import { pipe } from 'rxjs'; -import { map, pluck, filter, take, mergeMap } from 'rxjs/operators'; -import { executeRequest } from '@nteract/messaging'; -import { RECEIVE_EXECUTE_REPLY } from '../../epics/jupyterEpics'; - -// Refactor this so command can be calculated either up stream or inside pipe -export const execute = (command, state$) => - pipe( - map(() => state$.value.jupyter.mainChannel.next(executeRequest(command))) - ); - -export const awaitOkMessage = action$ => - pipe( - mergeMap(() => - action$.ofType(RECEIVE_EXECUTE_REPLY).pipe( - pluck('payload'), - filter(msg => msg.channel === 'shell' && msg.content.status === 'ok'), - take(1) - ) - ) - ); diff --git a/app/utils/jupyter/pipes.ts b/app/utils/jupyter/pipes.ts new file mode 100644 index 00000000..51754ea5 --- /dev/null +++ b/app/utils/jupyter/pipes.ts @@ -0,0 +1,9 @@ +import { pipe } from "rxjs"; +import { map, pluck, filter, take, mergeMap } from "rxjs/operators"; +import { executeRequest } from "@nteract/messaging"; +import { RECEIVE_EXECUTE_REPLY } from "../../epics/jupyterEpics"; + +// Refactor this so command can be calculated either up stream or inside pipe +export const execute = (command, state$) => pipe(map(() => state$.value.jupyter.mainChannel.next(executeRequest(command)))); + +export const awaitOkMessage = action$ => pipe(mergeMap(() => action$.ofType(RECEIVE_EXECUTE_REPLY).pipe(pluck('payload'), filter(msg => msg.channel === 'shell' && msg.content.status === 'ok'), take(1)))); \ No newline at end of file diff --git a/app/utils/labjs/functions.js b/app/utils/labjs/functions.js deleted file mode 100644 index 966f2ec8..00000000 --- a/app/utils/labjs/functions.js +++ /dev/null @@ -1,44 +0,0 @@ -import { isNil } from 'lodash'; -import * as path from 'path'; -import { readdirSync } from 'fs'; -import { EXPERIMENTS } from '../../constants/constants'; - -import { buildN170Timeline } from './protocols/faceshouses'; -import { buildStroopTimeline } from './protocols/stroop'; -import { buildMultiTimeline } from './protocols/multi'; -import { buildSearchTimeline } from './protocols/search'; -import { buildCustomTimeline } from './protocols/custom'; - -import { - MainTimeline, - Trial, - ExperimentParameters -} from '../../constants/interfaces'; - -// loads a protocol of the experiment -export const loadProtocol = (paradigm: EXPERIMENTS) => { - let protocol; - switch (paradigm) { - case EXPERIMENTS.STROOP: - protocol = buildStroopTimeline(); - break; - - case EXPERIMENTS.MULTI: - protocol = buildMultiTimeline(); - break; - - case EXPERIMENTS.SEARCH: - protocol = buildSearchTimeline(); - break; - - case EXPERIMENTS.N170: - protocol = buildN170Timeline(); - break; - - case EXPERIMENTS.CUSTOM: - default: - protocol = buildCustomTimeline(); - break; - } - return protocol; -}; diff --git a/app/utils/labjs/functions.ts b/app/utils/labjs/functions.ts new file mode 100644 index 00000000..2ae7b26e --- /dev/null +++ b/app/utils/labjs/functions.ts @@ -0,0 +1,40 @@ +import { isNil } from "lodash"; +import * as path from "path"; +import { readdirSync } from "fs"; +import { EXPERIMENTS } from "../../constants/constants"; + +import { buildN170Timeline } from "./protocols/faceshouses"; +import { buildStroopTimeline } from "./protocols/stroop"; +import { buildMultiTimeline } from "./protocols/multi"; +import { buildSearchTimeline } from "./protocols/search"; +import { buildCustomTimeline } from "./protocols/custom"; + +import { MainTimeline, Trial, ExperimentParameters } from "../../constants/interfaces"; + +// loads a protocol of the experiment +export const loadProtocol = (paradigm: EXPERIMENTS) => { + let protocol; + switch (paradigm) { + case EXPERIMENTS.STROOP: + protocol = buildStroopTimeline(); + break; + + case EXPERIMENTS.MULTI: + protocol = buildMultiTimeline(); + break; + + case EXPERIMENTS.SEARCH: + protocol = buildSearchTimeline(); + break; + + case EXPERIMENTS.N170: + protocol = buildN170Timeline(); + break; + + case EXPERIMENTS.CUSTOM:default: + protocol = buildCustomTimeline(); + break; + + } + return protocol; +}; \ No newline at end of file diff --git a/app/utils/labjs/index.js b/app/utils/labjs/index.tsx similarity index 61% rename from app/utils/labjs/index.js rename to app/utils/labjs/index.tsx index 54e5ead8..884cfd77 100644 --- a/app/utils/labjs/index.js +++ b/app/utils/labjs/index.tsx @@ -1,21 +1,24 @@ -import React, { Component } from 'react'; -import clonedeep from 'lodash.clonedeep'; -import * as lab from 'lab.js/dist/lab.dev'; +import React, { Component } from "react"; +import clonedeep from "lodash.clonedeep"; +import * as lab from "lab.js/dist/lab.dev"; -import path from 'path'; -import visualsearch from './scripts/visualsearch'; -import stroop from './scripts/stroop'; -import multitasking from './scripts/multitasking'; -import faceshouses from './scripts/faceshouses'; -import custom from './scripts/custom'; +import path from "path"; +import visualsearch from "./scripts/visualsearch"; +import stroop from "./scripts/stroop"; +import multitasking from "./scripts/multitasking"; +import faceshouses from "./scripts/faceshouses"; +import custom from "./scripts/custom"; class ExperimentWindow extends Component { + constructor(props) { super(props); } componentDidMount() { - const { props } = this; + const { + props + } = this; switch (props.settings.script) { case 'Multi-tasking': multitasking.parameters = props.settings.params; @@ -32,36 +35,26 @@ class ExperimentWindow extends Component { case 'Faces and Houses': faceshouses.parameters = props.settings.params; faceshouses.parameters.title = props.settings.title; - faceshouses.files = props.settings.params.stimuli - .map(image => ({ - [path.join(image.dir, image.filename)]: path.join( - image.dir, - image.filename - ) - })) - .reduce((obj, item) => { - obj[Object.keys(item)[0]] = Object.values(item)[0]; - return obj; - }, {}); + faceshouses.files = props.settings.params.stimuli.map(image => ({ + [path.join(image.dir, image.filename)]: path.join(image.dir, image.filename) + })).reduce((obj, item) => { + obj[Object.keys(item)[0]] = Object.values(item)[0]; + return obj; + }, {}); this.study = lab.util.fromObject(clonedeep(faceshouses), lab); break; - case 'Custom': - default: + case 'Custom':default: custom.parameters = props.settings.params; custom.parameters.title = props.settings.title; - custom.files = props.settings.params.stimuli - .map(image => ({ - [path.join(image.dir, image.filename)]: path.join( - image.dir, - image.filename - ) - })) - .reduce((obj, item) => { - obj[Object.keys(item)[0]] = Object.values(item)[0]; - return obj; - }, {}); + custom.files = props.settings.params.stimuli.map(image => ({ + [path.join(image.dir, image.filename)]: path.join(image.dir, image.filename) + })).reduce((obj, item) => { + obj[Object.keys(item)[0]] = Object.values(item)[0]; + return obj; + }, {}); this.study = lab.util.fromObject(clonedeep(custom), lab); break; + } this.study.run(); this.study.on('end', () => { @@ -94,17 +87,15 @@ class ExperimentWindow extends Component { } render() { - return ( -
+ return

Loading Experiment

The experiment is loading and should start in a few seconds

-
- ); +
; } } -export { ExperimentWindow }; +export { ExperimentWindow }; \ No newline at end of file diff --git a/app/utils/labjs/protocols/custom.js b/app/utils/labjs/protocols/custom.ts similarity index 87% rename from app/utils/labjs/protocols/custom.js rename to app/utils/labjs/protocols/custom.ts index 38ee3677..99655852 100644 --- a/app/utils/labjs/protocols/custom.js +++ b/app/utils/labjs/protocols/custom.ts @@ -1,5 +1,5 @@ -import * as path from 'path'; -import { EVENTS } from '../../../constants/constants'; +import * as path from "path"; +import { EVENTS } from "../../../constants/constants"; // Default directories containing stimuli const rootFolder = __dirname; // Note: there's a weird issue where the fs readdir function reads from BrainWaves dir @@ -32,13 +32,10 @@ export const buildCustomTimeline = () => ({ protocol_condition_second_title: `Houses`, protocol_condition_second: `If you see a house, press “9”.`, overview_links: [], - background_links: [ - { - name: 'Link 1', - address: - 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn' - } - ], + background_links: [{ + name: 'Link 1', + address: 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn' + }], protocal_links: [], params: { imageHeight: '500px', @@ -99,18 +96,15 @@ export const buildCustomTimeline = () => ({ timelines: { faceHouseTimeline: { id: 'faceHouseTimeline', - timeline: [ - { - id: 'interTrial', - type: 'callback-image-display', - stimulus: fixation, - response_ends_trial: false - }, - { - id: 'trial', - response_ends_trial: false - } - ] + timeline: [{ + id: 'interTrial', + type: 'callback-image-display', + stimulus: fixation, + response_ends_trial: false + }, { + id: 'trial', + response_ends_trial: false + }] } } -}); +}); \ No newline at end of file diff --git a/app/utils/labjs/protocols/faceshouses.js b/app/utils/labjs/protocols/faceshouses.ts similarity index 77% rename from app/utils/labjs/protocols/faceshouses.js rename to app/utils/labjs/protocols/faceshouses.ts index 66f610e3..11c13fd2 100644 --- a/app/utils/labjs/protocols/faceshouses.js +++ b/app/utils/labjs/protocols/faceshouses.ts @@ -1,5 +1,5 @@ -import * as path from 'path'; -import { EVENTS } from '../../../constants/constants'; +import * as path from "path"; +import { EVENTS } from "../../../constants/constants"; // Default directories containing stimuli const rootFolder = __dirname; // Note: there's a weird issue where the fs readdir function reads from BrainWaves dir @@ -8,68 +8,7 @@ const facesDir = path.join(rootFolder, 'assets', 'face_house', 'faces'); const housesDir = path.join(rootFolder, 'assets', 'face_house', 'houses'); const fixation = path.join(rootFolder, 'assets', 'common', 'fixationcross.png'); -const stimuli = [ - 'Face1', - 'Face2', - 'Face3', - 'Face4', - 'Face5', - 'Face6', - 'Face7', - 'Face8', - 'Face9', - 'Face10', - 'Face11', - 'Face12', - 'Face13', - 'Face14', - 'Face15', - 'Face16', - 'Face17', - 'Face18', - 'Face19', - 'Face20', - 'Face21', - 'Face22', - 'Face23', - 'Face24', - 'Face25', - 'Face26', - 'Face27', - 'Face28', - 'Face29', - 'Face30', - 'House1', - 'House2', - 'House3', - 'House4', - 'House5', - 'House6', - 'House7', - 'House8', - 'House9', - 'House10', - 'House11', - 'House12', - 'House13', - 'House14', - 'House15', - 'House16', - 'House17', - 'House18', - 'House19', - 'House20', - 'House21', - 'House22', - 'House23', - 'House24', - 'House25', - 'House26', - 'House27', - 'House28', - 'House29', - 'House30' -].map(s => ({ +const stimuli = ['Face1', 'Face2', 'Face3', 'Face4', 'Face5', 'Face6', 'Face7', 'Face8', 'Face9', 'Face10', 'Face11', 'Face12', 'Face13', 'Face14', 'Face15', 'Face16', 'Face17', 'Face18', 'Face19', 'Face20', 'Face21', 'Face22', 'Face23', 'Face24', 'Face25', 'Face26', 'Face27', 'Face28', 'Face29', 'Face30', 'House1', 'House2', 'House3', 'House4', 'House5', 'House6', 'House7', 'House8', 'House9', 'House10', 'House11', 'House12', 'House13', 'House14', 'House15', 'House16', 'House17', 'House18', 'House19', 'House20', 'House21', 'House22', 'House23', 'House24', 'House25', 'House26', 'House27', 'House28', 'House29', 'House30'].map(s => ({ condition: s.startsWith('Face') ? 'Face' : 'House', dir: s.startsWith('Face') ? facesDir : housesDir, filename: `${s}.jpg`, @@ -105,13 +44,10 @@ export const buildN170Timeline = () => ({ protocol_condition_second_title: `Houses`, protocol_condition_second: `If participants see a house, they should press “9”.`, overview_links: [], - background_links: [ - { - name: 'Link 1', - address: - 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn' - } - ], + background_links: [{ + name: 'Link 1', + address: 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn' + }], protocal_links: [], params: { imageHeight: '500px', @@ -172,18 +108,15 @@ export const buildN170Timeline = () => ({ timelines: { faceHouseTimeline: { id: 'faceHouseTimeline', - timeline: [ - { - id: 'interTrial', - type: 'callback-image-display', - stimulus: fixation, - response_ends_trial: false - }, - { - id: 'trial', - response_ends_trial: false - } - ] + timeline: [{ + id: 'interTrial', + type: 'callback-image-display', + stimulus: fixation, + response_ends_trial: false + }, { + id: 'trial', + response_ends_trial: false + }] } } -}); +}); \ No newline at end of file diff --git a/app/utils/labjs/protocols/multi.js b/app/utils/labjs/protocols/multi.ts similarity index 84% rename from app/utils/labjs/protocols/multi.js rename to app/utils/labjs/protocols/multi.ts index 47b323da..6eb6e61c 100644 --- a/app/utils/labjs/protocols/multi.js +++ b/app/utils/labjs/protocols/multi.ts @@ -1,5 +1,5 @@ -import * as path from 'path'; -import { EVENTS } from '../../../constants/constants'; +import * as path from "path"; +import { EVENTS } from "../../../constants/constants"; // Default directories containing stimuli const rootFolder = __dirname; // Note: there's a weird issue where the fs readdir function reads from BrainWaves dir @@ -31,18 +31,13 @@ export const buildMultiTimeline = () => ({ protocol_condition_second_title: `Rule 2`, protocol_condition_second: `If the object is shown on the bottom, they need to respond to the number of dots inside (pressing ‘n’ for 3 dots and ‘b’ for 2 dots). `, overview_links: [], - background_links: [ - { - name: 'Link 1', - address: - 'https://www.scientificamerican.com/podcast/episode/the-myth-of-multitasking-09-07-15/' - }, - { - name: 'Link 2', - address: - 'https://www.scientificamerican.com/article/multitasking-two-tasks/' - } - ], + background_links: [{ + name: 'Link 1', + address: 'https://www.scientificamerican.com/podcast/episode/the-myth-of-multitasking-09-07-15/' + }, { + name: 'Link 2', + address: 'https://www.scientificamerican.com/article/multitasking-two-tasks/' + }], protocal_links: [], params: { trialDuration: 1000, @@ -83,18 +78,15 @@ export const buildMultiTimeline = () => ({ timelines: { faceHouseTimeline: { id: 'multiTaskingTimeline', - timeline: [ - { - id: 'interTrial', - type: 'callback-image-display', - stimulus: fixation, - response_ends_trial: false - }, - { - id: 'trial', - response_ends_trial: false - } - ] + timeline: [{ + id: 'interTrial', + type: 'callback-image-display', + stimulus: fixation, + response_ends_trial: false + }, { + id: 'trial', + response_ends_trial: false + }] } } -}); +}); \ No newline at end of file diff --git a/app/utils/labjs/protocols/search.js b/app/utils/labjs/protocols/search.ts similarity index 91% rename from app/utils/labjs/protocols/search.js rename to app/utils/labjs/protocols/search.ts index eb3af316..5e576788 100644 --- a/app/utils/labjs/protocols/search.js +++ b/app/utils/labjs/protocols/search.ts @@ -1,5 +1,5 @@ -import * as path from 'path'; -import { EVENTS } from '../../../constants/constants'; +import * as path from "path"; +import { EVENTS } from "../../../constants/constants"; // Default directories containing stimuli const rootFolder = __dirname; // Note: there's a weird issue where the fs readdir function reads from BrainWaves dir @@ -75,18 +75,15 @@ export const buildSearchTimeline = () => ({ timelines: { faceHouseTimeline: { id: 'visualSearchTimeline', - timeline: [ - { - id: 'interTrial', - type: 'callback-image-display', - stimulus: fixation, - response_ends_trial: false - }, - { - id: 'trial', - response_ends_trial: false - } - ] + timeline: [{ + id: 'interTrial', + type: 'callback-image-display', + stimulus: fixation, + response_ends_trial: false + }, { + id: 'trial', + response_ends_trial: false + }] } } -}); +}); \ No newline at end of file diff --git a/app/utils/labjs/protocols/stroop.js b/app/utils/labjs/protocols/stroop.ts similarity index 87% rename from app/utils/labjs/protocols/stroop.js rename to app/utils/labjs/protocols/stroop.ts index 36117c90..c8180bdc 100644 --- a/app/utils/labjs/protocols/stroop.js +++ b/app/utils/labjs/protocols/stroop.ts @@ -1,5 +1,5 @@ -import * as path from 'path'; -import { EVENTS } from '../../../constants/constants'; +import * as path from "path"; +import { EVENTS } from "../../../constants/constants"; // Default directories containing stimuli const rootFolder = __dirname; // Note: there's a weird issue where the fs readdir function reads from BrainWaves dir @@ -34,13 +34,10 @@ export const buildStroopTimeline = () => ({ protocol_condition_second_title: `"Green" written in red`, protocol_condition_second: `The color is red, so the correct response is ‘r’.`, overview_links: [], - background_links: [ - { - name: 'Link 1', - address: - 'https://www.psychologytoday.com/us/blog/play-in-mind/201204/when-red-looks-blue-and-yes-means-no' - } - ], + background_links: [{ + name: 'Link 1', + address: 'https://www.psychologytoday.com/us/blog/play-in-mind/201204/when-red-looks-blue-and-yes-means-no' + }], protocal_links: [], params: { trialDuration: 1000, @@ -81,18 +78,15 @@ export const buildStroopTimeline = () => ({ timelines: { faceHouseTimeline: { id: 'stroopTimeline', - timeline: [ - { - id: 'interTrial', - type: 'callback-image-display', - stimulus: fixation, - response_ends_trial: false - }, - { - id: 'trial', - response_ends_trial: false - } - ] + timeline: [{ + id: 'interTrial', + type: 'callback-image-display', + stimulus: fixation, + response_ends_trial: false + }, { + id: 'trial', + response_ends_trial: false + }] } } -}); +}); \ No newline at end of file diff --git a/app/utils/labjs/scripts/custom.js b/app/utils/labjs/scripts/custom.js deleted file mode 100644 index db233e45..00000000 --- a/app/utils/labjs/scripts/custom.js +++ /dev/null @@ -1,522 +0,0 @@ -// Define study -const studyObject = { - title: 'root', - type: 'lab.flow.Sequence', - parameters: {}, - plugins: [], - metadata: {}, - files: {}, - responses: {}, - content: [ - { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'The face-house task', - content: [ - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue', - 'keypress(q)': 'skipPractice' - }, - messageHandlers: {}, - title: 'Instruction', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003E${this.parameters.title || "The face-house task"}\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' - }, - { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw-shuffle', - n: '' - }, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - let initParameters = [...this.parameters.stimuli] || []; - initParameters = - initParameters.filter(t => t.phase === 'practice') || []; - let numberTrials = this.parameters.nbPracticeTrials; - if (initParameters.length === 0) { - numberTrials = 0; - } - const randomize = this.parameters.randomize; - const trialsLength = initParameters.length; - if (numberTrials > trialsLength) { - const append = [...initParameters]; - const multiply = Math.ceil(numberTrials / trialsLength); - for (let i = 0; i < multiply; i++) { - initParameters = initParameters.concat(append); - } - } - - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - if (randomize === 'random') { - shuffle(initParameters); - } - - const trialConstructor = file => ({ - condition: file.condition, - image: `${file.dir}/${file.filename}`, - correctResponse: file.response, - phase: 'practice', - name: file.name, - type: file.type - }); - - // balance design across conditions - const conditions = Array.from( - new Set(initParameters.map(p => p.condition)) - ); - const conditionsParameters = {}; - for (const c of conditions) { - conditionsParameters[c] = initParameters.filter( - p => p.condition == c - ); - } - const numberConditionsTrials = Math.ceil( - numberTrials / conditions.length - ); - let balancedParameters = []; - for (let i = 0; i < numberConditionsTrials; i++) { - for (const c of conditions) { - balancedParameters = balancedParameters.concat( - conditionsParameters[c][i % conditionsParameters[c].length] - ); - } - } - initParameters = [...balancedParameters.slice(0, numberTrials)]; - - let practiceParameters = []; - for (let i = 0; i < numberTrials; i++) { - practiceParameters = practiceParameters.concat( - trialConstructor(initParameters[i]) - ); - } - - // assign options values to parameters of this task - this.options.templateParameters = practiceParameters; - if (randomize === 'random') { - this.options.shuffle = true; - } else { - this.options.shuffle = false; - } - } - }, - title: 'Practice loop', - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial', - content: [ - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'rect', - left: 0, - top: 0, - angle: 0, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - }, - { - type: 'rect', - left: 0, - top: 0, - angle: 90, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${parameters.iti}' - }, - { - type: 'lab.html.Screen', - files: {}, - responses: {}, - parameters: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - // This code registers an event listener for this screen. - // We have a timeout for this screen, but we also want to record responses. - // On a keydown event, we record the key and the time of response. - // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). - // "this" in the code means the lab.js experiment. - const responses = [ - ...new Set(this.parameters.stimuli.map(e => e.response)) - ]; - this.data.trial_number = - 1 + - parseInt( - this.options.id.split('_')[ - this.options.id.split('_').length - 2 - ] - ); - this.data.response_given = 'no'; - - this.options.events = { - keydown: event => { - if (responses.includes(event.key)) { - this.data.reaction_time = this.timer; - if (this.parameters.phase === 'task') - this.data.response_given = 'yes'; - this.data.response = event.key; - if ( - this.data.response == - this.parameters.correctResponse - ) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - this.end(); - } - } - }; - }, - run: function anonymous() { - this.parameters.callbackForEEG(this.parameters.type); - } - }, - title: 'Stimulus', - timeout: - "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - content: - '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - left: 0, - top: 0, - angle: 0, - width: 895.3, - height: 36.16, - stroke: null, - strokeWidth: 1, - fill: "${ state.correct_response ? 'green' : 'red' }", - text: - "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", - fontStyle: 'normal', - fontWeight: 'bold', - fontSize: '52', - fontFamily: 'sans-serif', - lineHeight: 1.16, - textAlign: 'center' - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - end: function anonymous() { - this.data.correct_response = false; - } - }, - viewport: [800, 600], - title: 'Feedback', - tardy: true, - timeout: '1000', - skip: "${ parameters.phase === 'task' }" - } - ] - } - }, - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: {}, - title: 'Main task', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' - }, - { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw-shuffle', - n: '' - }, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - let initialParameters = [...this.parameters.stimuli] || []; - initialParameters = - initialParameters.filter(t => t.phase === 'main') || []; - let numberTrials = this.parameters.nbTrials; - if (initialParameters.length === 0) { - numberTrials = 0; - } - const randomize = this.parameters.randomize; - const trialsLength = initialParameters.length; - if (numberTrials > trialsLength) { - const append = [...initialParameters]; - const multiply = Math.ceil(numberTrials / trialsLength); - for (let i = 0; i < multiply; i++) { - initialParameters = initialParameters.concat(append); - } - } - - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - if (randomize === 'random') { - shuffle(initialParameters); - } - - const trialConstructor = file => ({ - condition: file.condition, - image: `${file.dir}/${file.filename}`, - correctResponse: file.response, - phase: 'task', - name: file.name, - type: file.type - }); - // balance design across conditions - const conditions = Array.from( - new Set(initialParameters.map(p => p.condition)) - ); - const conditionsParameters = {}; - for (const c of conditions) { - conditionsParameters[c] = initialParameters.filter( - p => p.condition == c - ); - } - const numberConditionsTrials = Math.ceil( - numberTrials / conditions.length - ); - let balancedParameters = []; - for (let i = 0; i < numberConditionsTrials; i++) { - for (const c of conditions) { - balancedParameters = balancedParameters.concat( - conditionsParameters[c][i % conditionsParameters[c].length] - ); - } - } - initialParameters = [ - ...balancedParameters.slice(0, numberTrials) - ]; - - let trialParameters = []; - for (let i = 0; i < numberTrials; i++) { - trialParameters = [ - ...trialParameters.concat( - trialConstructor(initialParameters[i]) - ) - ]; - } - // assign options values to parameters of this task - this.options.templateParameters = trialParameters; - if (randomize === 'random') { - this.options.shuffle = true; - } else { - this.options.shuffle = false; - } - } - }, - title: 'Experiment loop', - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial', - content: [ - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'rect', - left: 0, - top: 0, - angle: 0, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - }, - { - type: 'rect', - left: 0, - top: 0, - angle: 90, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${parameters.iti}' - }, - { - type: 'lab.html.Screen', - files: {}, - responses: {}, - parameters: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - // This code registers an event listener for this screen. - // We have a timeout for this screen, but we also want to record responses. - // On a keydown event, we record the key and the time of response. - // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). - // "this" in the code means the lab.js experiment. - const responses = [ - ...new Set(this.parameters.stimuli.map(e => e.response)) - ]; - this.data.trial_number = - 1 + - parseInt( - this.options.id.split('_')[ - this.options.id.split('_').length - 2 - ] - ); - this.data.response_given = 'no'; - - this.options.events = { - keydown: event => { - if (responses.includes(event.key)) { - this.data.reaction_time = this.timer; - if (this.parameters.phase === 'task') - this.data.response_given = 'yes'; - this.data.response = event.key; - if ( - this.data.response == - this.parameters.correctResponse - ) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - this.end(); - } - } - }; - }, - run: function anonymous() { - this.parameters.callbackForEEG(this.parameters.type); - } - }, - title: 'Stimulus', - timeout: - "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - timeout: - "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - content: - '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - left: 0, - top: 0, - angle: 0, - width: 895.3, - height: 36.16, - stroke: null, - strokeWidth: 1, - fill: "${ state.correct_response ? 'green' : 'red' }", - text: - "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", - fontStyle: 'normal', - fontWeight: 'bold', - fontSize: '52', - fontFamily: 'sans-serif', - lineHeight: 1.16, - textAlign: 'center' - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: 'Feedback', - tardy: true, - timeout: '1000', - skip: "${ parameters.phase === 'task' }" - } - ] - } - }, - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'end' - }, - messageHandlers: {}, - title: 'End', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' - } - ] - } - ] -}; - -// export -export default studyObject; diff --git a/app/utils/labjs/scripts/custom.ts b/app/utils/labjs/scripts/custom.ts new file mode 100644 index 00000000..bfbe5ed0 --- /dev/null +++ b/app/utils/labjs/scripts/custom.ts @@ -0,0 +1,436 @@ +// Define study +const studyObject = { + title: 'root', + type: 'lab.flow.Sequence', + parameters: {}, + plugins: [], + metadata: {}, + files: {}, + responses: {}, + content: [{ + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'The face-house task', + content: [{ + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue', + 'keypress(q)': 'skipPractice' + }, + messageHandlers: {}, + title: 'Instruction', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003E${this.parameters.title || "The face-house task"}\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' + }, { + type: 'lab.flow.Loop', + files: {}, + parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle', + n: '' + }, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + let initParameters = [...this.parameters.stimuli] || []; + initParameters = initParameters.filter(t => t.phase === 'practice') || []; + let numberTrials = this.parameters.nbPracticeTrials; + if (initParameters.length === 0) { + numberTrials = 0; + } + const randomize = this.parameters.randomize; + const trialsLength = initParameters.length; + if (numberTrials > trialsLength) { + const append = [...initParameters]; + const multiply = Math.ceil(numberTrials / trialsLength); + for (let i = 0; i < multiply; i++) { + initParameters = initParameters.concat(append); + } + } + + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; + } + + if (randomize === 'random') { + shuffle(initParameters); + } + + const trialConstructor = file => ({ + condition: file.condition, + image: `${file.dir}/${file.filename}`, + correctResponse: file.response, + phase: 'practice', + name: file.name, + type: file.type + }); + + // balance design across conditions + const conditions = Array.from(new Set(initParameters.map(p => p.condition))); + const conditionsParameters = {}; + for (const c of conditions) { + conditionsParameters[c] = initParameters.filter(p => p.condition == c); + } + const numberConditionsTrials = Math.ceil(numberTrials / conditions.length); + let balancedParameters = []; + for (let i = 0; i < numberConditionsTrials; i++) { + for (const c of conditions) { + balancedParameters = balancedParameters.concat(conditionsParameters[c][i % conditionsParameters[c].length]); + } + } + initParameters = [...balancedParameters.slice(0, numberTrials)]; + + let practiceParameters = []; + for (let i = 0; i < numberTrials; i++) { + practiceParameters = practiceParameters.concat(trialConstructor(initParameters[i])); + } + + // assign options values to parameters of this task + this.options.templateParameters = practiceParameters; + if (randomize === 'random') { + this.options.shuffle = true; + } else { + this.options.shuffle = false; + } + } + }, + title: 'Practice loop', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [{ + type: 'lab.canvas.Screen', + content: [{ + type: 'rect', + left: 0, + top: 0, + angle: 0, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + }, { + type: 'rect', + left: 0, + top: 0, + angle: 90, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${parameters.iti}' + }, { + type: 'lab.html.Screen', + files: {}, + responses: {}, + parameters: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + // This code registers an event listener for this screen. + // We have a timeout for this screen, but we also want to record responses. + // On a keydown event, we record the key and the time of response. + // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). + // "this" in the code means the lab.js experiment. + const responses = [...new Set(this.parameters.stimuli.map(e => e.response))]; + this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + this.data.response_given = 'no'; + + this.options.events = { + keydown: event => { + if (responses.includes(event.key)) { + this.data.reaction_time = this.timer; + if (this.parameters.phase === 'task') this.data.response_given = 'yes'; + this.data.response = event.key; + if (this.data.response == this.parameters.correctResponse) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + this.end(); + } + } + }; + }, + run: function anonymous() { + this.parameters.callbackForEEG(this.parameters.type); + } + }, + title: 'Stimulus', + timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + content: '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + left: 0, + top: 0, + angle: 0, + width: 895.3, + height: 36.16, + stroke: null, + strokeWidth: 1, + fill: "${ state.correct_response ? 'green' : 'red' }", + text: "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", + fontStyle: 'normal', + fontWeight: 'bold', + fontSize: '52', + fontFamily: 'sans-serif', + lineHeight: 1.16, + textAlign: 'center' + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + end: function anonymous() { + this.data.correct_response = false; + } + }, + viewport: [800, 600], + title: 'Feedback', + tardy: true, + timeout: '1000', + skip: "${ parameters.phase === 'task' }" + }] + } + }, { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue' + }, + messageHandlers: {}, + title: 'Main task', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' + }, { + type: 'lab.flow.Loop', + files: {}, + parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle', + n: '' + }, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + let initialParameters = [...this.parameters.stimuli] || []; + initialParameters = initialParameters.filter(t => t.phase === 'main') || []; + let numberTrials = this.parameters.nbTrials; + if (initialParameters.length === 0) { + numberTrials = 0; + } + const randomize = this.parameters.randomize; + const trialsLength = initialParameters.length; + if (numberTrials > trialsLength) { + const append = [...initialParameters]; + const multiply = Math.ceil(numberTrials / trialsLength); + for (let i = 0; i < multiply; i++) { + initialParameters = initialParameters.concat(append); + } + } + + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; + } + + if (randomize === 'random') { + shuffle(initialParameters); + } + + const trialConstructor = file => ({ + condition: file.condition, + image: `${file.dir}/${file.filename}`, + correctResponse: file.response, + phase: 'task', + name: file.name, + type: file.type + }); + // balance design across conditions + const conditions = Array.from(new Set(initialParameters.map(p => p.condition))); + const conditionsParameters = {}; + for (const c of conditions) { + conditionsParameters[c] = initialParameters.filter(p => p.condition == c); + } + const numberConditionsTrials = Math.ceil(numberTrials / conditions.length); + let balancedParameters = []; + for (let i = 0; i < numberConditionsTrials; i++) { + for (const c of conditions) { + balancedParameters = balancedParameters.concat(conditionsParameters[c][i % conditionsParameters[c].length]); + } + } + initialParameters = [...balancedParameters.slice(0, numberTrials)]; + + let trialParameters = []; + for (let i = 0; i < numberTrials; i++) { + trialParameters = [...trialParameters.concat(trialConstructor(initialParameters[i]))]; + } + // assign options values to parameters of this task + this.options.templateParameters = trialParameters; + if (randomize === 'random') { + this.options.shuffle = true; + } else { + this.options.shuffle = false; + } + } + }, + title: 'Experiment loop', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [{ + type: 'lab.canvas.Screen', + content: [{ + type: 'rect', + left: 0, + top: 0, + angle: 0, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + }, { + type: 'rect', + left: 0, + top: 0, + angle: 90, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${parameters.iti}' + }, { + type: 'lab.html.Screen', + files: {}, + responses: {}, + parameters: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + // This code registers an event listener for this screen. + // We have a timeout for this screen, but we also want to record responses. + // On a keydown event, we record the key and the time of response. + // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). + // "this" in the code means the lab.js experiment. + const responses = [...new Set(this.parameters.stimuli.map(e => e.response))]; + this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + this.data.response_given = 'no'; + + this.options.events = { + keydown: event => { + if (responses.includes(event.key)) { + this.data.reaction_time = this.timer; + if (this.parameters.phase === 'task') this.data.response_given = 'yes'; + this.data.response = event.key; + if (this.data.response == this.parameters.correctResponse) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + this.end(); + } + } + }; + }, + run: function anonymous() { + this.parameters.callbackForEEG(this.parameters.type); + } + }, + title: 'Stimulus', + timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + content: '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + left: 0, + top: 0, + angle: 0, + width: 895.3, + height: 36.16, + stroke: null, + strokeWidth: 1, + fill: "${ state.correct_response ? 'green' : 'red' }", + text: "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", + fontStyle: 'normal', + fontWeight: 'bold', + fontSize: '52', + fontFamily: 'sans-serif', + lineHeight: 1.16, + textAlign: 'center' + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Feedback', + tardy: true, + timeout: '1000', + skip: "${ parameters.phase === 'task' }" + }] + } + }, { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'end' + }, + messageHandlers: {}, + title: 'End', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' + }] + }] +}; + +// export +export default studyObject; \ No newline at end of file diff --git a/app/utils/labjs/scripts/faceshouses.js b/app/utils/labjs/scripts/faceshouses.js deleted file mode 100644 index 3a3338f8..00000000 --- a/app/utils/labjs/scripts/faceshouses.js +++ /dev/null @@ -1,521 +0,0 @@ -// Define study -const studyObject = { - title: 'root', - type: 'lab.flow.Sequence', - parameters: {}, - plugins: [], - metadata: {}, - files: {}, - responses: {}, - content: [ - { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'The face-house task', - content: [ - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue', - 'keypress(q)': 'skipPractice' - }, - messageHandlers: {}, - title: 'Instruction', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EThe face-house task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' - }, - { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw-shuffle', - n: '' - }, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - let initParameters = [...this.parameters.stimuli] || []; - // initParameters = initParameters.filter(t => t.phase === 'practice') || []; - let numberTrials = this.parameters.nbPracticeTrials; - if (initParameters.length === 0) { - numberTrials = 0; - } - const randomize = this.parameters.randomize; - const trialsLength = initParameters.length; - if (numberTrials > trialsLength) { - const append = [...initParameters]; - const multiply = Math.ceil(numberTrials / trialsLength); - for (let i = 0; i < multiply; i++) { - initParameters = initParameters.concat(append); - } - } - - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - if (randomize === 'random') { - shuffle(initParameters); - } - - const trialConstructor = file => ({ - condition: file.condition, - image: `${file.dir}/${file.filename}`, - correctResponse: file.response, - phase: 'practice', - name: file.name, - type: file.type - }); - - // balance design across conditions - const conditions = Array.from( - new Set(initParameters.map(p => p.condition)) - ); - const conditionsParameters = {}; - for (const c of conditions) { - conditionsParameters[c] = initParameters.filter( - p => p.condition == c - ); - } - const numberConditionsTrials = Math.ceil( - numberTrials / conditions.length - ); - let balancedParameters = []; - for (let i = 0; i < numberConditionsTrials; i++) { - for (const c of conditions) { - balancedParameters = balancedParameters.concat( - conditionsParameters[c][i % conditionsParameters[c].length] - ); - } - } - initParameters = [...balancedParameters.slice(0, numberTrials)]; - - let practiceParameters = []; - for (let i = 0; i < numberTrials; i++) { - practiceParameters = practiceParameters.concat( - trialConstructor(initParameters[i]) - ); - } - - // assign options values to parameters of this task - this.options.templateParameters = practiceParameters; - if (randomize === 'random') { - this.options.shuffle = true; - } else { - this.options.shuffle = false; - } - } - }, - title: 'Practice loop', - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial', - content: [ - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'rect', - left: 0, - top: 0, - angle: 0, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - }, - { - type: 'rect', - left: 0, - top: 0, - angle: 90, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${parameters.iti}' - }, - { - type: 'lab.html.Screen', - files: {}, - responses: {}, - parameters: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - // This code registers an event listener for this screen. - // We have a timeout for this screen, but we also want to record responses. - // On a keydown event, we record the key and the time of response. - // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). - // "this" in the code means the lab.js experiment. - const responses = [ - ...new Set(this.parameters.stimuli.map(e => e.response)) - ]; - this.data.trial_number = - 1 + - parseInt( - this.options.id.split('_')[ - this.options.id.split('_').length - 2 - ] - ); - this.data.response_given = 'no'; - - this.options.events = { - keydown: event => { - if (responses.includes(event.key)) { - this.data.reaction_time = this.timer; - if (this.parameters.phase === 'task') - this.data.response_given = 'yes'; - this.data.response = event.key; - if ( - this.data.response == - this.parameters.correctResponse - ) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - this.end(); - } - } - }; - }, - run: function anonymous() { - this.parameters.callbackForEEG(this.parameters.type); - } - }, - title: 'Stimulus', - timeout: - "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - content: - '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - left: 0, - top: 0, - angle: 0, - width: 895.3, - height: 36.16, - stroke: null, - strokeWidth: 1, - fill: "${ state.correct_response ? 'green' : 'red' }", - text: - "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", - fontStyle: 'normal', - fontWeight: 'bold', - fontSize: '52', - fontFamily: 'sans-serif', - lineHeight: 1.16, - textAlign: 'center' - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - end: function anonymous() { - this.data.correct_response = false; - } - }, - viewport: [800, 600], - title: 'Feedback', - tardy: true, - timeout: '1000', - skip: "${ parameters.phase === 'task' }" - } - ] - } - }, - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: {}, - title: 'Main task', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' - }, - { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw-shuffle', - n: '' - }, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - let initialParameters = [...this.parameters.stimuli] || []; - initialParameters = - initialParameters.filter(t => t.phase === 'main') || []; - let numberTrials = this.parameters.nbTrials; - if (initialParameters.length === 0) { - numberTrials = 0; - } - const randomize = this.parameters.randomize; - const trialsLength = initialParameters.length; - if (numberTrials > trialsLength) { - const append = [...initialParameters]; - const multiply = Math.ceil(numberTrials / trialsLength); - for (let i = 0; i < multiply; i++) { - initialParameters = initialParameters.concat(append); - } - } - - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - if (randomize === 'random') { - shuffle(initialParameters); - } - - const trialConstructor = file => ({ - condition: file.condition, - image: `${file.dir}/${file.filename}`, - correctResponse: file.response, - phase: 'task', - name: file.name, - type: file.type - }); - // balance design across conditions - const conditions = Array.from( - new Set(initialParameters.map(p => p.condition)) - ); - const conditionsParameters = {}; - for (const c of conditions) { - conditionsParameters[c] = initialParameters.filter( - p => p.condition == c - ); - } - const numberConditionsTrials = Math.ceil( - numberTrials / conditions.length - ); - let balancedParameters = []; - for (let i = 0; i < numberConditionsTrials; i++) { - for (const c of conditions) { - balancedParameters = balancedParameters.concat( - conditionsParameters[c][i % conditionsParameters[c].length] - ); - } - } - initialParameters = [ - ...balancedParameters.slice(0, numberTrials) - ]; - - let trialParameters = []; - for (let i = 0; i < numberTrials; i++) { - trialParameters = [ - ...trialParameters.concat( - trialConstructor(initialParameters[i]) - ) - ]; - } - // assign options values to parameters of this task - this.options.templateParameters = trialParameters; - if (randomize === 'random') { - this.options.shuffle = true; - } else { - this.options.shuffle = false; - } - } - }, - title: 'Experiment loop', - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial', - content: [ - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'rect', - left: 0, - top: 0, - angle: 0, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - }, - { - type: 'rect', - left: 0, - top: 0, - angle: 90, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${parameters.iti}' - }, - { - type: 'lab.html.Screen', - files: {}, - responses: {}, - parameters: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - // This code registers an event listener for this screen. - // We have a timeout for this screen, but we also want to record responses. - // On a keydown event, we record the key and the time of response. - // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). - // "this" in the code means the lab.js experiment. - const responses = [ - ...new Set(this.parameters.stimuli.map(e => e.response)) - ]; - this.data.trial_number = - 1 + - parseInt( - this.options.id.split('_')[ - this.options.id.split('_').length - 2 - ] - ); - this.data.response_given = 'no'; - - this.options.events = { - keydown: event => { - if (responses.includes(event.key)) { - this.data.reaction_time = this.timer; - if (this.parameters.phase === 'task') - this.data.response_given = 'yes'; - this.data.response = event.key; - if ( - this.data.response == - this.parameters.correctResponse - ) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - this.end(); - } - } - }; - }, - run: function anonymous() { - this.parameters.callbackForEEG(this.parameters.type); - } - }, - title: 'Stimulus', - timeout: - "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - timeout: - "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - content: - '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - left: 0, - top: 0, - angle: 0, - width: 895.3, - height: 36.16, - stroke: null, - strokeWidth: 1, - fill: "${ state.correct_response ? 'green' : 'red' }", - text: - "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", - fontStyle: 'normal', - fontWeight: 'bold', - fontSize: '52', - fontFamily: 'sans-serif', - lineHeight: 1.16, - textAlign: 'center' - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: 'Feedback', - tardy: true, - timeout: '1000', - skip: "${ parameters.phase === 'task' }" - } - ] - } - }, - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'end' - }, - messageHandlers: {}, - title: 'End', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' - } - ] - } - ] -}; - -// export -export default studyObject; diff --git a/app/utils/labjs/scripts/faceshouses.ts b/app/utils/labjs/scripts/faceshouses.ts new file mode 100644 index 00000000..247bb66e --- /dev/null +++ b/app/utils/labjs/scripts/faceshouses.ts @@ -0,0 +1,436 @@ +// Define study +const studyObject = { + title: 'root', + type: 'lab.flow.Sequence', + parameters: {}, + plugins: [], + metadata: {}, + files: {}, + responses: {}, + content: [{ + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'The face-house task', + content: [{ + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue', + 'keypress(q)': 'skipPractice' + }, + messageHandlers: {}, + title: 'Instruction', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EThe face-house task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' + }, { + type: 'lab.flow.Loop', + files: {}, + parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle', + n: '' + }, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + let initParameters = [...this.parameters.stimuli] || []; + // initParameters = initParameters.filter(t => t.phase === 'practice') || []; + let numberTrials = this.parameters.nbPracticeTrials; + if (initParameters.length === 0) { + numberTrials = 0; + } + const randomize = this.parameters.randomize; + const trialsLength = initParameters.length; + if (numberTrials > trialsLength) { + const append = [...initParameters]; + const multiply = Math.ceil(numberTrials / trialsLength); + for (let i = 0; i < multiply; i++) { + initParameters = initParameters.concat(append); + } + } + + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; + } + + if (randomize === 'random') { + shuffle(initParameters); + } + + const trialConstructor = file => ({ + condition: file.condition, + image: `${file.dir}/${file.filename}`, + correctResponse: file.response, + phase: 'practice', + name: file.name, + type: file.type + }); + + // balance design across conditions + const conditions = Array.from(new Set(initParameters.map(p => p.condition))); + const conditionsParameters = {}; + for (const c of conditions) { + conditionsParameters[c] = initParameters.filter(p => p.condition == c); + } + const numberConditionsTrials = Math.ceil(numberTrials / conditions.length); + let balancedParameters = []; + for (let i = 0; i < numberConditionsTrials; i++) { + for (const c of conditions) { + balancedParameters = balancedParameters.concat(conditionsParameters[c][i % conditionsParameters[c].length]); + } + } + initParameters = [...balancedParameters.slice(0, numberTrials)]; + + let practiceParameters = []; + for (let i = 0; i < numberTrials; i++) { + practiceParameters = practiceParameters.concat(trialConstructor(initParameters[i])); + } + + // assign options values to parameters of this task + this.options.templateParameters = practiceParameters; + if (randomize === 'random') { + this.options.shuffle = true; + } else { + this.options.shuffle = false; + } + } + }, + title: 'Practice loop', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [{ + type: 'lab.canvas.Screen', + content: [{ + type: 'rect', + left: 0, + top: 0, + angle: 0, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + }, { + type: 'rect', + left: 0, + top: 0, + angle: 90, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${parameters.iti}' + }, { + type: 'lab.html.Screen', + files: {}, + responses: {}, + parameters: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + // This code registers an event listener for this screen. + // We have a timeout for this screen, but we also want to record responses. + // On a keydown event, we record the key and the time of response. + // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). + // "this" in the code means the lab.js experiment. + const responses = [...new Set(this.parameters.stimuli.map(e => e.response))]; + this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + this.data.response_given = 'no'; + + this.options.events = { + keydown: event => { + if (responses.includes(event.key)) { + this.data.reaction_time = this.timer; + if (this.parameters.phase === 'task') this.data.response_given = 'yes'; + this.data.response = event.key; + if (this.data.response == this.parameters.correctResponse) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + this.end(); + } + } + }; + }, + run: function anonymous() { + this.parameters.callbackForEEG(this.parameters.type); + } + }, + title: 'Stimulus', + timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + content: '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + left: 0, + top: 0, + angle: 0, + width: 895.3, + height: 36.16, + stroke: null, + strokeWidth: 1, + fill: "${ state.correct_response ? 'green' : 'red' }", + text: "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", + fontStyle: 'normal', + fontWeight: 'bold', + fontSize: '52', + fontFamily: 'sans-serif', + lineHeight: 1.16, + textAlign: 'center' + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + end: function anonymous() { + this.data.correct_response = false; + } + }, + viewport: [800, 600], + title: 'Feedback', + tardy: true, + timeout: '1000', + skip: "${ parameters.phase === 'task' }" + }] + } + }, { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue' + }, + messageHandlers: {}, + title: 'Main task', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' + }, { + type: 'lab.flow.Loop', + files: {}, + parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle', + n: '' + }, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + let initialParameters = [...this.parameters.stimuli] || []; + initialParameters = initialParameters.filter(t => t.phase === 'main') || []; + let numberTrials = this.parameters.nbTrials; + if (initialParameters.length === 0) { + numberTrials = 0; + } + const randomize = this.parameters.randomize; + const trialsLength = initialParameters.length; + if (numberTrials > trialsLength) { + const append = [...initialParameters]; + const multiply = Math.ceil(numberTrials / trialsLength); + for (let i = 0; i < multiply; i++) { + initialParameters = initialParameters.concat(append); + } + } + + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; + } + + if (randomize === 'random') { + shuffle(initialParameters); + } + + const trialConstructor = file => ({ + condition: file.condition, + image: `${file.dir}/${file.filename}`, + correctResponse: file.response, + phase: 'task', + name: file.name, + type: file.type + }); + // balance design across conditions + const conditions = Array.from(new Set(initialParameters.map(p => p.condition))); + const conditionsParameters = {}; + for (const c of conditions) { + conditionsParameters[c] = initialParameters.filter(p => p.condition == c); + } + const numberConditionsTrials = Math.ceil(numberTrials / conditions.length); + let balancedParameters = []; + for (let i = 0; i < numberConditionsTrials; i++) { + for (const c of conditions) { + balancedParameters = balancedParameters.concat(conditionsParameters[c][i % conditionsParameters[c].length]); + } + } + initialParameters = [...balancedParameters.slice(0, numberTrials)]; + + let trialParameters = []; + for (let i = 0; i < numberTrials; i++) { + trialParameters = [...trialParameters.concat(trialConstructor(initialParameters[i]))]; + } + // assign options values to parameters of this task + this.options.templateParameters = trialParameters; + if (randomize === 'random') { + this.options.shuffle = true; + } else { + this.options.shuffle = false; + } + } + }, + title: 'Experiment loop', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [{ + type: 'lab.canvas.Screen', + content: [{ + type: 'rect', + left: 0, + top: 0, + angle: 0, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + }, { + type: 'rect', + left: 0, + top: 0, + angle: 90, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${parameters.iti}' + }, { + type: 'lab.html.Screen', + files: {}, + responses: {}, + parameters: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + // This code registers an event listener for this screen. + // We have a timeout for this screen, but we also want to record responses. + // On a keydown event, we record the key and the time of response. + // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). + // "this" in the code means the lab.js experiment. + const responses = [...new Set(this.parameters.stimuli.map(e => e.response))]; + this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + this.data.response_given = 'no'; + + this.options.events = { + keydown: event => { + if (responses.includes(event.key)) { + this.data.reaction_time = this.timer; + if (this.parameters.phase === 'task') this.data.response_given = 'yes'; + this.data.response = event.key; + if (this.data.response == this.parameters.correctResponse) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + this.end(); + } + } + }; + }, + run: function anonymous() { + this.parameters.callbackForEEG(this.parameters.type); + } + }, + title: 'Stimulus', + timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + content: '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + left: 0, + top: 0, + angle: 0, + width: 895.3, + height: 36.16, + stroke: null, + strokeWidth: 1, + fill: "${ state.correct_response ? 'green' : 'red' }", + text: "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", + fontStyle: 'normal', + fontWeight: 'bold', + fontSize: '52', + fontFamily: 'sans-serif', + lineHeight: 1.16, + textAlign: 'center' + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Feedback', + tardy: true, + timeout: '1000', + skip: "${ parameters.phase === 'task' }" + }] + } + }, { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'end' + }, + messageHandlers: {}, + title: 'End', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' + }] + }] +}; + +// export +export default studyObject; \ No newline at end of file diff --git a/app/utils/labjs/scripts/multitasking.js b/app/utils/labjs/scripts/multitasking.js deleted file mode 100644 index 7253e4bf..00000000 --- a/app/utils/labjs/scripts/multitasking.js +++ /dev/null @@ -1,2661 +0,0 @@ -import * as path from 'path'; - -const rootFolder = __dirname; -const assetsDirectory = path.join( - rootFolder, - 'assets', - 'labjs', - 'multitasking' -); - -// Define study -const studyObject = { - title: 'root', - type: 'lab.flow.Sequence', - parameters: {}, - plugins: [], - metadata: {}, - files: {}, - responses: {}, - content: [ - { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Multi-tasking', - content: [ - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: {}, - title: 'Intro', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EThe multi-tasking test\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' - }, - { - type: 'lab.html.Screen', - files: { - 'diamond_2.png': `${assetsDirectory}/diamond_2.png`, - 'diamond_3.png': `${assetsDirectory}/diamond_3.png`, - 'rectangle_2.png': `${assetsDirectory}/rectangle_2.png`, - 'rectangle_3.png': `${assetsDirectory}/rectangle_3.png`, - 'filling.png': `${assetsDirectory}/filling.png`, - 'shape.png': `${assetsDirectory}/shape.png`, - 'example_1.png': `${assetsDirectory}/example_1.png`, - 'example_2.png': `${assetsDirectory}/example_2.png`, - 'example_3.png': `${assetsDirectory}/example_3.png`, - 'example_4.png': `${assetsDirectory}/example_4.png`, - 'all_conditions.png': `${assetsDirectory}/all_conditions.png` - }, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: { - 'before:prepare': function anonymous() { - this.options.events['keydown'] = e => { - if (e.code === 'KeyQ') { - this.data.skipTraining = true; - this.end(); - } - - if (e.code === 'ArrowLeft' || e.code === 'ArrowRight') { - const instructions = document.querySelectorAll( - 'div.instruction' - ); - let notFound = true; - instructions.forEach(i => { - if (i.style.display === 'block' && notFound) { - const cur_id = parseInt(i.id.split('screen_')[1]); - let next_id; - if (e.code === 'ArrowLeft') { - next_id = cur_id - 1; - } - if (e.code === 'ArrowRight') { - next_id = cur_id + 1; - } - if (next_id > 0 && next_id <= 10) { - i.style.display = 'none'; - next_id = `screen_${next_id}`; - document.querySelector(`#${next_id}`).style.display = - 'block'; - notFound = false; - } - } - }); - } - }; - } - }, - title: 'Instructions', - content: - '\u003Cmain\u003E\n\n\u003Cdiv class="instruction" id=\'screen_1\' style="display:block"\u003E\n \u003Cp\u003E\n In the following, you will respond to various figures. These are the figures that you will see: diamonds and rectangles with a filling of 2 or 3 dots:\n \u003C\u002Fp\u003E\n \u003Ctable\u003E\n \u003Cthead\u003E\n \u003Ctr\u003E\n \u003Cth\u003EDiamond with filling of 3 dots\u003C\u002Fth\u003E\n \u003Cth\u003EDiamond with filling of 2 dots\u003C\u002Fth\u003E\n \u003Cth\u003ERectangle with filling of 3 dots\u003C\u002Fth\u003E\n \u003Cth\u003ERectangle with filling of 2 dots\u003C\u002Fth\u003E\n \u003C\u002Ftr\u003E\n \u003C\u002Fthead\u003E\n \u003Ctbody\u003E\n \u003Ctr\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'diamond_3.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'diamond_2.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'rectangle_3.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'rectangle_2.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003C\u002Ftr\u003E\n \u003C\u002Ftbody\u003E\n \u003C\u002Ftable\u003E\n \u003Cp\u003E\n Use the right arrow key to move to the next instruction.\n \u003C\u002Fp\u003E\n\n \u003Cp\u003E\n If you want to skip the instruction with practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_2\' style="display:none"\u003E\n\n \u003Cp\u003E\n You will be shown these figures in sequences of trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Each time you will need to respond with a button press.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n How exactly will be explained in the next screens.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_3\' style="display:none"\u003E\n \u003Cp\u003E\n In the shape task, a diamond requires a b button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, a rectangle requires a n button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In this task, ignore the filling (dots) of the shape!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'shape.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_4\' style="display:none"\u003E\n \u003Cp\u003E\n In the filling task, a filling of two dots requires a b button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, a filling with three dots requires a n button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, ignore the outer shape!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'filling.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_5\' style="display:none"\u003E\n \u003Cp\u003E\n Example 1. If you see a figure in the upper part of the frame, you know you need to do the shape task, that is easy, because the word shape is at the top. Here you see a diamond, which requires a button press of the keyboard key \u003Cstrong\u003E\u003Cem\u003Eb\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, entirely ignore the filling dots!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_1.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_6\' style="display:none" style="width:400px"\u003E\n \u003Cp\u003E\n Example 2. If you see a figure in the lower part of the frame, you know you need to do the filling task, that is easy, because the word filling is at the bottom. This diamond is filled with 3 dots, and thus press the keyboard key \u003Cstrong\u003E\u003Cem\u003En\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, entirely ignore the outer shape (here a diamond)!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_2.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_7\' style="display:none"\u003E\n \u003Cimg src=${this.files[\'example_3.png\']} style="width:400px"\u003E\n \u003Cp\u003E\n Example 3. If you see a figure in the upper part of the frame, you know you need to do the shape task, that is easy, because the word shape is at the top. Here you see a rectangle, which requires the \u003Cstrong\u003E\u003Cem\u003En\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E key.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, entirely ignore the filling (here 2 dots)!!!\n \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_8\' style="display:none"\u003E\n \u003Cp\u003E\n Example 4. If you see a figure in the lower part of the frame, you know you need to do the filling task, that is easy, because the word filling is at the bottom. This diamond is filled with 2 dots, and thus press \u003Cstrong\u003E\u003Cem\u003Eb\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E key.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, entirely ignore the outer shape (here a diamond)!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_4.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\n\u003Cdiv class="instruction" id=\'screen_9\' style="display:none"\u003E\n \u003Cp\u003E\n Here, you can see how to respond in all conditions...\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Just look at shape in the shape task, and at the dots in the filling task...\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'all_conditions.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_10\' style="display:none"\u003E\n \u003Cp\u003E\n Are you ready? Press the space bar on your keyboard to quit the instructions and start doing the practice trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Or you can browse back to the previous screens until you understand what you need to do in the two tasks (use the arrow keys).\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n If you want to skip practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter\u003E\n \u003Cp\u003E\n Use left\u002Fright arrow keys to go further or back.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' - }, - { - type: 'lab.canvas.Frame', - context: - '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Please press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E or \n \u003Ckbd\u003En\u003C\u002Fkbd\u003E according to the current condition.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n', - contextSelector: 'canvas', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Frame', - content: { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [ - { - block: 'shape', - task: 'training', - num_trials: '10', - cond: 'No switching' - }, - { - block: 'filling', - task: 'training', - num_trials: '10', - cond: 'No switching' - }, - { - block: 'mixed', - task: 'training', - num_trials: '20', - cond: 'Switching' - }, - { - block: 'shape', - task: 'main', - num_trials: '20', - cond: 'No switching' - }, - { - block: 'filling', - task: 'main', - num_trials: '20', - cond: 'No switching' - }, - { - block: 'mixed', - task: 'main', - num_trials: '40', - cond: 'Switching' - } - ], - sample: { - mode: 'sequential', - n: '6' - }, - responses: {}, - messageHandlers: {}, - title: 'Block loop', - tardy: true, - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Block sequence', - skip: - "${this.parameters.task === 'training' && this.state.skipTraining === true}", - content: [ - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: -112, - width: 103.95, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Ready? ', - fontSize: '50', - fontWeight: 'bold', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '277', - styles: {} - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: -25, - width: 1090.61, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: - "${parameters.task === 'training' ? 'for some training?' : 'for the real data collection?'}", - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '278', - styles: {} - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 50, - width: 416.41, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'When ready, press the space bar.', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '279', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: {}, - viewport: [800, 600], - title: 'Ready' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - version: '2.7.0', - originX: 'left', - originY: 'center', - left: - "${this.parameters.block === 'mixed' ? 1000 : -120}", - top: -64, - width: 372.81, - height: 78.11, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'A block of just \nthe ${parameters.block} task', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'left', - textBackgroundColor: '', - charSpacing: 0, - id: '298', - styles: { - '1': { - '4': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '5': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '6': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '7': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '8': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '9': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '10': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '11': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '12': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '13': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '14': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '15': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '16': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '17': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '18': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '19': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '20': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '21': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '22': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '23': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '24': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '25': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '26': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '27': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - } - } - } - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'left', - originY: 'center', - left: -125, - top: 75, - width: 293.18, - height: 126.56, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: - 'Try to be as fast as you\ncan without making errors!\nPress space bar when\nyou are ready!', - fontSize: '25', - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'left', - textBackgroundColor: '', - charSpacing: 0, - id: '300', - styles: {} - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'left', - originY: 'center', - left: - "${this.parameters.block === 'mixed' ? -120 : 1000}", - top: -75, - width: 247.08, - height: 120.05, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: - 'A block with a mix\nof the shape & \nthe filling task', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'left', - textBackgroundColor: '', - charSpacing: 0, - id: '397', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: {}, - viewport: [800, 600], - title: 'Block description' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 154.59, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Concentrate', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '276', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: 'Concentrate', - timeout: '1000' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: '100', - height: 55, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 5, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 27.5, - startAngle: 0, - endAngle: 6.283185307179586, - id: '273' - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 25, - height: 56.5, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '3', - fontSize: '50', - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '274', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: '3', - timeout: '1000' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: '100', - height: 55, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 5, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 27.5, - startAngle: 0, - endAngle: 6.283185307179586, - id: '273' - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 27.81, - height: 56.5, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '2', - fontSize: '50', - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '274', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: '2', - timeout: '1000' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: '100', - height: 55, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 5, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 27.5, - startAngle: 0, - endAngle: 6.283185307179586, - id: '273' - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 27.81, - height: 56.5, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '1', - fontSize: '50', - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '274', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: '1', - timeout: '1000' - }, - { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw', - n: '' - }, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - let tasksParameters = []; - const blocks = - this.parameters.block === 'mixed' - ? ['shape', 'filling'] - : [this.parameters.block, this.parameters.block]; - - function trialConstructor( - block, - dots, - form, - cor_response - ) { - return { - type: block, - dots, - form, - cor_response - }; - } - - const numberBlocks = Math.ceil( - this.parameters.num_trials / 4 - ); - - for (let i = 1; i <= numberBlocks; i++) { - for (const block of blocks) { - if (block === 'shape') { - tasksParameters = tasksParameters.concat( - trialConstructor(block, 2, 'diamond', 'b') - ); - tasksParameters = tasksParameters.concat( - trialConstructor(block, 2, 'square', 'n') - ); - tasksParameters = tasksParameters.concat( - trialConstructor(block, 3, 'diamond', 'b') - ); - tasksParameters = tasksParameters.concat( - trialConstructor(block, 3, 'square', 'n') - ); - } else if (block === 'filling') { - tasksParameters = tasksParameters.concat( - trialConstructor(block, 2, 'diamond', 'b') - ); - tasksParameters = tasksParameters.concat( - trialConstructor(block, 2, 'square', 'b') - ); - tasksParameters = tasksParameters.concat( - trialConstructor(block, 3, 'diamond', 'n') - ); - tasksParameters = tasksParameters.concat( - trialConstructor(block, 3, 'square', 'n') - ); - } - } - } - - const tasksParametersShuffled = shuffle(tasksParameters); - // assign options values to parameters of this task - this.options.templateParameters = tasksParametersShuffled.slice( - 0, - this.parameters.num_trials - ); - } - }, - title: 'Trial loop', - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial sequence', - content: [ - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 400, - height: 300, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '17' - }, - { - type: 'line', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 400, - height: 0, - fill: 'rgb(0,0,0)', - stroke: 'black', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - id: '90', - x1: -200, - x2: 200, - y1: 0, - y2: 0 - }, - { - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: - "${this.parameters.form === 'square' ? 0 : 1000}", - top: - "${this.parameters.type === 'shape' ? -75 : 75}", - width: '100', - height: '100', - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '91' - }, - { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '0', - top: - "${this.parameters.type === 'shape' ? -50 : 50}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '105' - }, - { - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: - "${this.parameters.form === 'diamond' ? 0 : 1000}", - top: - "${this.parameters.type === 'shape' ? -75 : 75}", - width: 80, - height: 80, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 315, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '98' - }, - { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '${this.parameters.dots === 3 ? 0 : 1000}', - top: - "${this.parameters.type === 'shape' ? -75 : 75}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '103' - }, - { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '0', - top: - "${this.parameters.type === 'shape' ? -100 : 100}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '104' - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: '-195', - width: 78.2, - height: 36.16, - fill: '#000000', - stroke: '#000000', - strokeWidth: 0, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Shape', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '112', - styles: {} - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: '195', - width: 85.36, - height: 36.16, - fill: '#000000', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Filling', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '113', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: { - 'keypress(b)': 'b', - 'keypress(n)': 'n' - }, - messageHandlers: { - run: function anonymous() { - this.parameters.callbackForEEG( - this.parameters.cond === 'Switching' ? 1 : 2 - ); - this.data.correct = 'empty'; - } - }, - viewport: [800, 600], - title: 'Stimulus', - correctResponse: '${parameters.cor_response}', - timeout: '5000' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 655.95, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: - "${this.state.correct ? '' : 'That was the wrong key.'} ", - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '37', - styles: {} - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 688.19, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: - "${this.state.correct === 'empty' ? 'The time is up' : ''} ", - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '310', - styles: {} - }, - { - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 400, - height: 300, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '36' - }, - { - type: 'line', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: '${this.state.correct === true ? 0 : 1000} ', - width: 400, - height: 0, - fill: 'rgb(0,0,0)', - stroke: 'black', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - id: '125', - x1: -200, - x2: 200, - y1: 0, - y2: 0 - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: '-195', - width: 78.2, - height: 36.16, - fill: '#000000', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Shape', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '126', - styles: {} - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: '195', - width: 85.36, - height: 36.16, - fill: '#000000', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Filling', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '127', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - this.data.trial_number = - 1 + - parseInt( - this.options.id.split('_')[ - this.options.id.split('_').length - 2 - ] - ); - this.data.condition = this.parameters.cond; - this.data.reaction_time = this.state.duration; - - if ( - this.state.response === - this.parameters.cor_response - ) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - - if (this.parameters.task === 'main') { - this.data.response_given = - this.state.correct === 'empty' ? 'no' : 'yes'; - } else { - this.data.phase = 'practice'; - } - } - }, - viewport: [800, 600], - title: 'Feedback', - timeout: '${this.parameters.iti}', - tardy: true - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 400, - height: 300, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '123' - }, - { - type: 'line', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: '400', - height: 0, - fill: 'rgb(0,0,0)', - stroke: 'black', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - id: '124', - x1: -50, - x2: 50, - y1: 0, - y2: 0 - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: -195, - width: 78.2, - height: 36.16, - fill: - "${this.parameters.type === 'shape' ? 'black' : 'lightgrey'}", - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Shape', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '128', - styles: {} - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: '195', - width: 85.36, - height: 36.16, - fill: - "${this.parameters.type === 'filling' ? 'black' : 'lightgrey'}", - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Filling', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '129', - styles: {} - }, - { - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '120', - top: - "${this.parameters.type === 'shape' ? -90 : 1000}", - width: 80, - height: 80, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '130' - }, - { - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '-120', - top: - "${this.parameters.type === 'shape' ? -90 : 1000}", - width: 60, - height: 60, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 315, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '131' - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '-120', - top: - "${this.parameters.type === 'shape' ? -25 : 1000}", - width: 16, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'b', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'Times New Roman', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '132', - styles: {} - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '120', - top: - "${this.parameters.type === 'shape' ? -25 : 1000}", - width: 16, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'n', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'Times New Roman', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '133', - styles: {} - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '-120', - top: - "${this.parameters.type === 'filling' ? 125 : 1000}", - width: 16, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'b', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'Times New Roman', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '134', - styles: {} - }, - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '120', - top: - "${this.parameters.type === 'filling' ? 125 : 1000}", - width: 16, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'n', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'Times New Roman', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '135', - styles: {} - }, - { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '-120', - top: - "${this.parameters.type === 'filling' ? 30 : 1000}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '136' - }, - { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '-120', - top: - "${this.parameters.type === 'filling' ? 90 : 1000}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '137' - }, - { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '120', - top: - "${this.parameters.type === 'filling' ? 90 : 1000}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '138' - }, - { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '120', - top: - "${this.parameters.type === 'filling' ? 60 : 1000}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '139' - }, - { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '120', - top: - "${this.parameters.type === 'filling' ? 30 : 1000}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '140' - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: 'Pause', - skip: '${this.state.correct === true}', - timeout: '3000', - tardy: true - } - ] - } - } - ] - } - } - }, - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'end' - }, - messageHandlers: {}, - title: 'End', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' - } - ] - } - ] -}; - -// export -export default studyObject; diff --git a/app/utils/labjs/scripts/multitasking.ts b/app/utils/labjs/scripts/multitasking.ts new file mode 100644 index 00000000..00e2dc23 --- /dev/null +++ b/app/utils/labjs/scripts/multitasking.ts @@ -0,0 +1,2502 @@ +import * as path from "path"; + +const rootFolder = __dirname; +const assetsDirectory = path.join(rootFolder, 'assets', 'labjs', 'multitasking'); + +// Define study +const studyObject = { + title: 'root', + type: 'lab.flow.Sequence', + parameters: {}, + plugins: [], + metadata: {}, + files: {}, + responses: {}, + content: [{ + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Multi-tasking', + content: [{ + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue' + }, + messageHandlers: {}, + title: 'Intro', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EThe multi-tasking test\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' + }, { + type: 'lab.html.Screen', + files: { + 'diamond_2.png': `${assetsDirectory}/diamond_2.png`, + 'diamond_3.png': `${assetsDirectory}/diamond_3.png`, + 'rectangle_2.png': `${assetsDirectory}/rectangle_2.png`, + 'rectangle_3.png': `${assetsDirectory}/rectangle_3.png`, + 'filling.png': `${assetsDirectory}/filling.png`, + 'shape.png': `${assetsDirectory}/shape.png`, + 'example_1.png': `${assetsDirectory}/example_1.png`, + 'example_2.png': `${assetsDirectory}/example_2.png`, + 'example_3.png': `${assetsDirectory}/example_3.png`, + 'example_4.png': `${assetsDirectory}/example_4.png`, + 'all_conditions.png': `${assetsDirectory}/all_conditions.png` + }, + parameters: {}, + responses: { + 'keypress(Space)': 'continue' + }, + messageHandlers: { + 'before:prepare': function anonymous() { + this.options.events['keydown'] = e => { + if (e.code === 'KeyQ') { + this.data.skipTraining = true; + this.end(); + } + + if (e.code === 'ArrowLeft' || e.code === 'ArrowRight') { + const instructions = document.querySelectorAll('div.instruction'); + let notFound = true; + instructions.forEach(i => { + if (i.style.display === 'block' && notFound) { + const cur_id = parseInt(i.id.split('screen_')[1]); + let next_id; + if (e.code === 'ArrowLeft') { + next_id = cur_id - 1; + } + if (e.code === 'ArrowRight') { + next_id = cur_id + 1; + } + if (next_id > 0 && next_id <= 10) { + i.style.display = 'none'; + next_id = `screen_${next_id}`; + document.querySelector(`#${next_id}`).style.display = 'block'; + notFound = false; + } + } + }); + } + }; + } + }, + title: 'Instructions', + content: '\u003Cmain\u003E\n\n\u003Cdiv class="instruction" id=\'screen_1\' style="display:block"\u003E\n \u003Cp\u003E\n In the following, you will respond to various figures. These are the figures that you will see: diamonds and rectangles with a filling of 2 or 3 dots:\n \u003C\u002Fp\u003E\n \u003Ctable\u003E\n \u003Cthead\u003E\n \u003Ctr\u003E\n \u003Cth\u003EDiamond with filling of 3 dots\u003C\u002Fth\u003E\n \u003Cth\u003EDiamond with filling of 2 dots\u003C\u002Fth\u003E\n \u003Cth\u003ERectangle with filling of 3 dots\u003C\u002Fth\u003E\n \u003Cth\u003ERectangle with filling of 2 dots\u003C\u002Fth\u003E\n \u003C\u002Ftr\u003E\n \u003C\u002Fthead\u003E\n \u003Ctbody\u003E\n \u003Ctr\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'diamond_3.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'diamond_2.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'rectangle_3.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'rectangle_2.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003C\u002Ftr\u003E\n \u003C\u002Ftbody\u003E\n \u003C\u002Ftable\u003E\n \u003Cp\u003E\n Use the right arrow key to move to the next instruction.\n \u003C\u002Fp\u003E\n\n \u003Cp\u003E\n If you want to skip the instruction with practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_2\' style="display:none"\u003E\n\n \u003Cp\u003E\n You will be shown these figures in sequences of trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Each time you will need to respond with a button press.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n How exactly will be explained in the next screens.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_3\' style="display:none"\u003E\n \u003Cp\u003E\n In the shape task, a diamond requires a b button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, a rectangle requires a n button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In this task, ignore the filling (dots) of the shape!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'shape.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_4\' style="display:none"\u003E\n \u003Cp\u003E\n In the filling task, a filling of two dots requires a b button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, a filling with three dots requires a n button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, ignore the outer shape!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'filling.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_5\' style="display:none"\u003E\n \u003Cp\u003E\n Example 1. If you see a figure in the upper part of the frame, you know you need to do the shape task, that is easy, because the word shape is at the top. Here you see a diamond, which requires a button press of the keyboard key \u003Cstrong\u003E\u003Cem\u003Eb\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, entirely ignore the filling dots!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_1.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_6\' style="display:none" style="width:400px"\u003E\n \u003Cp\u003E\n Example 2. If you see a figure in the lower part of the frame, you know you need to do the filling task, that is easy, because the word filling is at the bottom. This diamond is filled with 3 dots, and thus press the keyboard key \u003Cstrong\u003E\u003Cem\u003En\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, entirely ignore the outer shape (here a diamond)!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_2.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_7\' style="display:none"\u003E\n \u003Cimg src=${this.files[\'example_3.png\']} style="width:400px"\u003E\n \u003Cp\u003E\n Example 3. If you see a figure in the upper part of the frame, you know you need to do the shape task, that is easy, because the word shape is at the top. Here you see a rectangle, which requires the \u003Cstrong\u003E\u003Cem\u003En\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E key.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, entirely ignore the filling (here 2 dots)!!!\n \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_8\' style="display:none"\u003E\n \u003Cp\u003E\n Example 4. If you see a figure in the lower part of the frame, you know you need to do the filling task, that is easy, because the word filling is at the bottom. This diamond is filled with 2 dots, and thus press \u003Cstrong\u003E\u003Cem\u003Eb\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E key.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, entirely ignore the outer shape (here a diamond)!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_4.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\n\u003Cdiv class="instruction" id=\'screen_9\' style="display:none"\u003E\n \u003Cp\u003E\n Here, you can see how to respond in all conditions...\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Just look at shape in the shape task, and at the dots in the filling task...\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'all_conditions.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_10\' style="display:none"\u003E\n \u003Cp\u003E\n Are you ready? Press the space bar on your keyboard to quit the instructions and start doing the practice trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Or you can browse back to the previous screens until you understand what you need to do in the two tasks (use the arrow keys).\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n If you want to skip practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter\u003E\n \u003Cp\u003E\n Use left\u002Fright arrow keys to go further or back.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' + }, { + type: 'lab.canvas.Frame', + context: '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Please press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E or \n \u003Ckbd\u003En\u003C\u002Fkbd\u003E according to the current condition.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n', + contextSelector: 'canvas', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Frame', + content: { + type: 'lab.flow.Loop', + files: {}, + parameters: {}, + templateParameters: [{ + block: 'shape', + task: 'training', + num_trials: '10', + cond: 'No switching' + }, { + block: 'filling', + task: 'training', + num_trials: '10', + cond: 'No switching' + }, { + block: 'mixed', + task: 'training', + num_trials: '20', + cond: 'Switching' + }, { + block: 'shape', + task: 'main', + num_trials: '20', + cond: 'No switching' + }, { + block: 'filling', + task: 'main', + num_trials: '20', + cond: 'No switching' + }, { + block: 'mixed', + task: 'main', + num_trials: '40', + cond: 'Switching' + }], + sample: { + mode: 'sequential', + n: '6' + }, + responses: {}, + messageHandlers: {}, + title: 'Block loop', + tardy: true, + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Block sequence', + skip: "${this.parameters.task === 'training' && this.state.skipTraining === true}", + content: [{ + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: -112, + width: 103.95, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Ready? ', + fontSize: '50', + fontWeight: 'bold', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '277', + styles: {} + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: -25, + width: 1090.61, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: "${parameters.task === 'training' ? 'for some training?' : 'for the real data collection?'}", + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '278', + styles: {} + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 50, + width: 416.41, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'When ready, press the space bar.', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '279', + styles: {} + }], + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue' + }, + messageHandlers: {}, + viewport: [800, 600], + title: 'Ready' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + version: '2.7.0', + originX: 'left', + originY: 'center', + left: "${this.parameters.block === 'mixed' ? 1000 : -120}", + top: -64, + width: 372.81, + height: 78.11, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'A block of just \nthe ${parameters.block} task', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + textBackgroundColor: '', + charSpacing: 0, + id: '298', + styles: { + '1': { + '4': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '5': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '6': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '7': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '8': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '9': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '10': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '11': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '12': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '13': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '14': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '15': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '16': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '17': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '18': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '19': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '20': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '21': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '22': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '23': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '24': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '25': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '26': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '27': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + } + } + } + }, { + type: 'i-text', + version: '2.7.0', + originX: 'left', + originY: 'center', + left: -125, + top: 75, + width: 293.18, + height: 126.56, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Try to be as fast as you\ncan without making errors!\nPress space bar when\nyou are ready!', + fontSize: '25', + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + textBackgroundColor: '', + charSpacing: 0, + id: '300', + styles: {} + }, { + type: 'i-text', + version: '2.7.0', + originX: 'left', + originY: 'center', + left: "${this.parameters.block === 'mixed' ? -120 : 1000}", + top: -75, + width: 247.08, + height: 120.05, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'A block with a mix\nof the shape & \nthe filling task', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + textBackgroundColor: '', + charSpacing: 0, + id: '397', + styles: {} + }], + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue' + }, + messageHandlers: {}, + viewport: [800, 600], + title: 'Block description' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 154.59, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Concentrate', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '276', + styles: {} + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Concentrate', + timeout: '1000' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: '100', + height: 55, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 5, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 27.5, + startAngle: 0, + endAngle: 6.283185307179586, + id: '273' + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 25, + height: 56.5, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '3', + fontSize: '50', + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '274', + styles: {} + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: '3', + timeout: '1000' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: '100', + height: 55, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 5, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 27.5, + startAngle: 0, + endAngle: 6.283185307179586, + id: '273' + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 27.81, + height: 56.5, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '2', + fontSize: '50', + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '274', + styles: {} + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: '2', + timeout: '1000' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: '100', + height: 55, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 5, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 27.5, + startAngle: 0, + endAngle: 6.283185307179586, + id: '273' + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 27.81, + height: 56.5, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '1', + fontSize: '50', + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '274', + styles: {} + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: '1', + timeout: '1000' + }, { + type: 'lab.flow.Loop', + files: {}, + parameters: {}, + templateParameters: [], + sample: { + mode: 'draw', + n: '' + }, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; + } + + let tasksParameters = []; + const blocks = this.parameters.block === 'mixed' ? ['shape', 'filling'] : [this.parameters.block, this.parameters.block]; + + function trialConstructor(block, dots, form, cor_response) { + return { + type: block, + dots, + form, + cor_response + }; + } + + const numberBlocks = Math.ceil(this.parameters.num_trials / 4); + + for (let i = 1; i <= numberBlocks; i++) { + for (const block of blocks) { + if (block === 'shape') { + tasksParameters = tasksParameters.concat(trialConstructor(block, 2, 'diamond', 'b')); + tasksParameters = tasksParameters.concat(trialConstructor(block, 2, 'square', 'n')); + tasksParameters = tasksParameters.concat(trialConstructor(block, 3, 'diamond', 'b')); + tasksParameters = tasksParameters.concat(trialConstructor(block, 3, 'square', 'n')); + } else if (block === 'filling') { + tasksParameters = tasksParameters.concat(trialConstructor(block, 2, 'diamond', 'b')); + tasksParameters = tasksParameters.concat(trialConstructor(block, 2, 'square', 'b')); + tasksParameters = tasksParameters.concat(trialConstructor(block, 3, 'diamond', 'n')); + tasksParameters = tasksParameters.concat(trialConstructor(block, 3, 'square', 'n')); + } + } + } + + const tasksParametersShuffled = shuffle(tasksParameters); + // assign options values to parameters of this task + this.options.templateParameters = tasksParametersShuffled.slice(0, this.parameters.num_trials); + } + }, + title: 'Trial loop', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial sequence', + content: [{ + type: 'lab.canvas.Screen', + content: [{ + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 400, + height: 300, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '17' + }, { + type: 'line', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 400, + height: 0, + fill: 'rgb(0,0,0)', + stroke: 'black', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + id: '90', + x1: -200, + x2: 200, + y1: 0, + y2: 0 + }, { + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: "${this.parameters.form === 'square' ? 0 : 1000}", + top: "${this.parameters.type === 'shape' ? -75 : 75}", + width: '100', + height: '100', + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '91' + }, { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '0', + top: "${this.parameters.type === 'shape' ? -50 : 50}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '105' + }, { + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: "${this.parameters.form === 'diamond' ? 0 : 1000}", + top: "${this.parameters.type === 'shape' ? -75 : 75}", + width: 80, + height: 80, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 315, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '98' + }, { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '${this.parameters.dots === 3 ? 0 : 1000}', + top: "${this.parameters.type === 'shape' ? -75 : 75}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '103' + }, { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '0', + top: "${this.parameters.type === 'shape' ? -100 : 100}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '104' + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: '-195', + width: 78.2, + height: 36.16, + fill: '#000000', + stroke: '#000000', + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Shape', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '112', + styles: {} + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: '195', + width: 85.36, + height: 36.16, + fill: '#000000', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Filling', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '113', + styles: {} + }], + files: {}, + parameters: {}, + responses: { + 'keypress(b)': 'b', + 'keypress(n)': 'n' + }, + messageHandlers: { + run: function anonymous() { + this.parameters.callbackForEEG(this.parameters.cond === 'Switching' ? 1 : 2); + this.data.correct = 'empty'; + } + }, + viewport: [800, 600], + title: 'Stimulus', + correctResponse: '${parameters.cor_response}', + timeout: '5000' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 655.95, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: "${this.state.correct ? '' : 'That was the wrong key.'} ", + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '37', + styles: {} + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 688.19, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: "${this.state.correct === 'empty' ? 'The time is up' : ''} ", + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '310', + styles: {} + }, { + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 400, + height: 300, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '36' + }, { + type: 'line', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: '${this.state.correct === true ? 0 : 1000} ', + width: 400, + height: 0, + fill: 'rgb(0,0,0)', + stroke: 'black', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + id: '125', + x1: -200, + x2: 200, + y1: 0, + y2: 0 + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: '-195', + width: 78.2, + height: 36.16, + fill: '#000000', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Shape', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '126', + styles: {} + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: '195', + width: 85.36, + height: 36.16, + fill: '#000000', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Filling', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '127', + styles: {} + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + this.data.condition = this.parameters.cond; + this.data.reaction_time = this.state.duration; + + if (this.state.response === this.parameters.cor_response) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + + if (this.parameters.task === 'main') { + this.data.response_given = this.state.correct === 'empty' ? 'no' : 'yes'; + } else { + this.data.phase = 'practice'; + } + } + }, + viewport: [800, 600], + title: 'Feedback', + timeout: '${this.parameters.iti}', + tardy: true + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 400, + height: 300, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '123' + }, { + type: 'line', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: '400', + height: 0, + fill: 'rgb(0,0,0)', + stroke: 'black', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + id: '124', + x1: -50, + x2: 50, + y1: 0, + y2: 0 + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: -195, + width: 78.2, + height: 36.16, + fill: "${this.parameters.type === 'shape' ? 'black' : 'lightgrey'}", + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Shape', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '128', + styles: {} + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: '195', + width: 85.36, + height: 36.16, + fill: "${this.parameters.type === 'filling' ? 'black' : 'lightgrey'}", + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Filling', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '129', + styles: {} + }, { + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '120', + top: "${this.parameters.type === 'shape' ? -90 : 1000}", + width: 80, + height: 80, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '130' + }, { + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '-120', + top: "${this.parameters.type === 'shape' ? -90 : 1000}", + width: 60, + height: 60, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 315, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '131' + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '-120', + top: "${this.parameters.type === 'shape' ? -25 : 1000}", + width: 16, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'b', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'Times New Roman', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '132', + styles: {} + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '120', + top: "${this.parameters.type === 'shape' ? -25 : 1000}", + width: 16, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'n', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'Times New Roman', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '133', + styles: {} + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '-120', + top: "${this.parameters.type === 'filling' ? 125 : 1000}", + width: 16, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'b', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'Times New Roman', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '134', + styles: {} + }, { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '120', + top: "${this.parameters.type === 'filling' ? 125 : 1000}", + width: 16, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'n', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'Times New Roman', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '135', + styles: {} + }, { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '-120', + top: "${this.parameters.type === 'filling' ? 30 : 1000}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '136' + }, { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '-120', + top: "${this.parameters.type === 'filling' ? 90 : 1000}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '137' + }, { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '120', + top: "${this.parameters.type === 'filling' ? 90 : 1000}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '138' + }, { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '120', + top: "${this.parameters.type === 'filling' ? 60 : 1000}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '139' + }, { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '120', + top: "${this.parameters.type === 'filling' ? 30 : 1000}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '140' + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Pause', + skip: '${this.state.correct === true}', + timeout: '3000', + tardy: true + }] + } + }] + } + } + }, { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'end' + }, + messageHandlers: {}, + title: 'End', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' + }] + }] +}; + +// export +export default studyObject; \ No newline at end of file diff --git a/app/utils/labjs/scripts/stroop.js b/app/utils/labjs/scripts/stroop.js deleted file mode 100644 index a5d59f41..00000000 --- a/app/utils/labjs/scripts/stroop.js +++ /dev/null @@ -1,760 +0,0 @@ -// Define study -const studyObject = { - messageHandlers: {}, - title: 'root', - type: 'lab.flow.Sequence', - plugins: [], - metadata: {}, - parameters: {}, - files: {}, - responses: {}, - content: [ - { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Stroop task', - content: [ - { - messageHandlers: {}, - type: 'lab.html.Screen', - responses: { - 'keypress(Space)': 'continue', - 'keypress(q)': 'skipPractice' - }, - title: 'Instruction', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EStroop Task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Cp\u003E\n Welcome to the \u003Cstrong\u003EStroop experiment\u003C\u002Fstrong\u003E!\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n To indicate the color of the word, please use the keys \u003Cstrong\u003Er\u003C\u002Fstrong\u003E, \u003Cstrong\u003Eg\u003C\u002Fstrong\u003E, \u003Cstrong\u003Eb\u003C\u002Fstrong\u003E and \u003Cstrong\u003Ey\u003C\u002Fstrong\u003E for \u003Cspan style="color: red;"\u003Ered\u003C\u002Fspan\u003E, \u003Cspan style="color: green;"\u003Egreen\u003C\u002Fspan\u003E, \u003Cspan style="color: blue;"\u003Eblue\u003C\u002Fspan\u003E and \u003Cspan style="color: #c5ad0b;"\u003Eyellow\u003C\u002Fspan\u003E, respectively.\n \u003Cbr\u003E\n Please answer quickly, and as accurately as you can.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Press the the space bar on your keyboard to start doing the practice trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n If you want to skip the practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n\n\n', - parameters: {}, - files: {} - }, - { - type: 'lab.canvas.Frame', - context: - '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n What\'s the \u003Cem\u003Ecolor\u003C\u002Fem\u003E of \n the word shown above? \u003Cbr\u003E\n Please press \u003Ckbd\u003Er\u003C\u002Fkbd\u003E for red,\n \u003Ckbd\u003Eg\u003C\u002Fkbd\u003E for green,\n \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E for blue and \u003Ckbd\u003Ey\u003C\u002Fkbd\u003E for yellow.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n', - contextSelector: 'canvas', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Practice frame', - tardy: true, - skip: "${ state.response === 'skipPractice' }", - content: { - messageHandlers: {}, - type: 'lab.flow.Loop', - responses: {}, - templateParameters: [ - { - color: 'red', - word: 'red', - phase: 'practice' - }, - { - color: 'green', - word: 'green', - phase: 'practice' - }, - { - color: 'blue', - word: 'blue', - phase: 'practice' - }, - { - color: '#ffe32a', - word: 'yellow', - phase: 'practice' - }, - { - color: 'red', - word: 'green', - phase: 'practice' - }, - { - color: 'green', - word: 'blue', - phase: 'practice' - }, - { - color: 'blue', - word: 'yellow', - phase: 'practice' - }, - { - color: '#ffe32a', - word: 'red', - phase: 'practice' - } - ], - title: 'Practice task', - parameters: {}, - files: {}, - sample: { - mode: 'draw-shuffle' - }, - shuffleGroups: [], - template: { - messageHandlers: {}, - type: 'lab.flow.Sequence', - responses: {}, - title: 'Trial', - parameters: {}, - files: {}, - content: [ - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - version: '2.4.4', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 18.69, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '+', - fontSize: '72', - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '5', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - run: function anonymous() { - this.data.correct = 'empty'; - } - }, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${this.parameters.iti}' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - version: '2.4.4', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 331.08, - height: 36.16, - fill: '${ this.parameters.color }', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '${ this.parameters.word }', - fontSize: '72', - fontWeight: 'bold', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '6', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: { - 'keydown(r)': 'red', - 'keydown(g)': 'green', - 'keydown(b)': 'blue', - 'keydown(y)': '#ffe32a' - }, - messageHandlers: {}, - viewport: [800, 600], - title: 'Stroop screen', - correctResponse: '${ this.parameters.color }' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: "${ parameters.phase == 'practice' ? 0 : 1000 }", - width: 1246.91, - height: 58.76, - fill: "${ state.correct ? 'green' : 'red' }", - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: - "${ state.correct ? 'Well done!' : 'Please respond accurately' }", - fontSize: '52', - fontWeight: 'bold', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '24', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - this.data.trial_number = - 1 + - parseInt( - this.options.id.split('_')[ - this.options.id.split('_').length - 2 - ] - ); - - this.data.condition = - this.parameters.congruent === 'yes' - ? 'Match' - : 'Mismatch'; - - this.data.reaction_time = this.state.duration; - - if (this.state.response === this.parameters.color) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - - this.data.response_given = - this.state.correct === 'empty' ? 'no' : 'yes'; - } - }, - viewport: [800, 600], - title: 'Inter-trial interval', - timeout: "${ parameters.phase == 'practice' ? 1000 : 500 }", - tardy: true - } - ] - } - } - }, - { - messageHandlers: {}, - type: 'lab.html.Screen', - responses: { - 'keypress(Space)': 'continue' - }, - title: 'Main task', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n\n\n', - parameters: {}, - files: {} - }, - { - type: 'lab.canvas.Frame', - context: - '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n What\'s the \u003Cem\u003Ecolor\u003C\u002Fem\u003E of \n the word shown above? \u003Cbr\u003E\n Please press \u003Ckbd\u003Er\u003C\u002Fkbd\u003E for red,\n \u003Ckbd\u003Eg\u003C\u002Fkbd\u003E for green,\n \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E for blue and \u003Ckbd\u003Ey\u003C\u002Fkbd\u003E for yellow.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n', - contextSelector: 'canvas', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Task frame', - content: { - messageHandlers: {}, - type: 'lab.flow.Loop', - responses: {}, - templateParameters: [ - { - color: 'red', - word: 'red', - phase: 'task', - congruent: 'yes' - }, - { - color: 'red', - word: 'red', - phase: 'task', - congruent: 'yes' - }, - { - color: 'red', - word: 'red', - phase: 'task', - congruent: 'yes' - }, - { - color: 'red', - word: 'green', - phase: 'task', - congruent: 'no' - }, - { - color: 'red', - word: 'blue', - phase: 'task', - congruent: 'no' - }, - { - color: 'red', - word: 'yellow', - phase: 'task', - congruent: 'no' - }, - { - color: 'green', - word: 'red', - phase: 'task', - congruent: 'no' - }, - { - color: 'green', - word: 'green', - phase: 'task', - congruent: 'yes' - }, - { - color: 'green', - word: 'green', - phase: 'task', - congruent: 'yes' - }, - { - color: 'green', - word: 'green', - phase: 'task', - congruent: 'yes' - }, - { - color: 'green', - word: 'blue', - phase: 'task', - congruent: 'no' - }, - { - color: 'green', - word: 'yellow', - phase: 'task', - congruent: 'no' - }, - { - color: 'blue', - word: 'red', - phase: 'task', - congruent: 'no' - }, - { - color: 'blue', - word: 'green', - phase: 'task', - congruent: 'no' - }, - { - color: 'blue', - word: 'blue', - phase: 'task', - congruent: 'yes' - }, - { - color: 'blue', - word: 'blue', - phase: 'task', - congruent: 'yes' - }, - { - color: 'blue', - word: 'blue', - phase: 'task', - congruent: 'yes' - }, - { - color: 'blue', - word: 'yellow', - phase: 'task', - congruent: 'no' - }, - { - color: '#ffe32a', - word: 'red', - phase: 'task', - congruent: 'no' - }, - { - color: '#ffe32a', - word: 'green', - phase: 'task', - congruent: 'no' - }, - { - color: '#ffe32a', - word: 'blue', - phase: 'task', - congruent: 'no' - }, - { - color: '#ffe32a', - word: 'yellow', - phase: 'task', - congruent: 'yes' - }, - { - color: '#ffe32a', - word: 'yellow', - phase: 'task', - congruent: 'yes' - }, - { - color: '#ffe32a', - word: 'yellow', - phase: 'task', - congruent: 'yes' - } - ], - title: 'Stroop task', - parameters: {}, - files: {}, - sample: { - mode: 'draw-shuffle', - n: '96' - }, - shuffleGroups: [], - template: { - messageHandlers: {}, - type: 'lab.flow.Sequence', - responses: {}, - title: 'Trial', - parameters: {}, - files: {}, - content: [ - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - version: '2.4.4', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 18.69, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '+', - fontSize: '72', - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '5', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - run: function anonymous() { - this.data.correct = 'empty'; - } - }, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${this.parameters.iti}' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - version: '2.4.4', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 331.08, - height: 36.16, - fill: '${ this.parameters.color }', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '${ this.parameters.word }', - fontSize: '72', - fontWeight: 'bold', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '6', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: { - 'keydown(r)': 'red', - 'keydown(g)': 'green', - 'keydown(b)': 'blue', - 'keydown(y)': '#ffe32a' - }, - messageHandlers: { - run: function anonymous() { - this.parameters.callbackForEEG( - this.parameters.congruent === 'yes' ? 1 : 2 - ); - } - }, - viewport: [800, 600], - title: 'Stroop screen', - correctResponse: '${ this.parameters.color }' - }, - { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: "${ parameters.phase == 'practice' ? 0 : 1000 }", - width: 1246.91, - height: 58.76, - fill: "${ state.correct ? 'green' : 'red' }", - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: - "${ state.correct ? 'Well done!' : 'Please respond accurately' }", - fontSize: '52', - fontWeight: 'bold', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '24', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - this.data.trial_number = - 1 + - parseInt( - this.options.id.split('_')[ - this.options.id.split('_').length - 2 - ] - ); - - this.data.condition = - this.parameters.congruent === 'yes' - ? 'Match' - : 'Mismatch'; - - this.data.reaction_time = this.state.duration; - - if (this.state.response === this.parameters.color) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - - this.data.response_given = - this.state.correct === 'empty' ? 'no' : 'yes'; - } - }, - viewport: [800, 600], - title: 'Inter-trial interval', - timeout: "${ parameters.phase == 'practice' ? 1000 : 500 }", - tardy: true - } - ] - } - } - }, - { - messageHandlers: {}, - type: 'lab.html.Screen', - responses: { - 'keypress(Space)': 'end' - }, - title: 'Thanks', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n', - parameters: {}, - files: {} - } - ] - } - ] -}; - -// export -export default studyObject; diff --git a/app/utils/labjs/scripts/stroop.ts b/app/utils/labjs/scripts/stroop.ts new file mode 100644 index 00000000..b627d95b --- /dev/null +++ b/app/utils/labjs/scripts/stroop.ts @@ -0,0 +1,669 @@ +// Define study +const studyObject = { + messageHandlers: {}, + title: 'root', + type: 'lab.flow.Sequence', + plugins: [], + metadata: {}, + parameters: {}, + files: {}, + responses: {}, + content: [{ + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Stroop task', + content: [{ + messageHandlers: {}, + type: 'lab.html.Screen', + responses: { + 'keypress(Space)': 'continue', + 'keypress(q)': 'skipPractice' + }, + title: 'Instruction', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EStroop Task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Cp\u003E\n Welcome to the \u003Cstrong\u003EStroop experiment\u003C\u002Fstrong\u003E!\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n To indicate the color of the word, please use the keys \u003Cstrong\u003Er\u003C\u002Fstrong\u003E, \u003Cstrong\u003Eg\u003C\u002Fstrong\u003E, \u003Cstrong\u003Eb\u003C\u002Fstrong\u003E and \u003Cstrong\u003Ey\u003C\u002Fstrong\u003E for \u003Cspan style="color: red;"\u003Ered\u003C\u002Fspan\u003E, \u003Cspan style="color: green;"\u003Egreen\u003C\u002Fspan\u003E, \u003Cspan style="color: blue;"\u003Eblue\u003C\u002Fspan\u003E and \u003Cspan style="color: #c5ad0b;"\u003Eyellow\u003C\u002Fspan\u003E, respectively.\n \u003Cbr\u003E\n Please answer quickly, and as accurately as you can.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Press the the space bar on your keyboard to start doing the practice trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n If you want to skip the practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n\n\n', + parameters: {}, + files: {} + }, { + type: 'lab.canvas.Frame', + context: '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n What\'s the \u003Cem\u003Ecolor\u003C\u002Fem\u003E of \n the word shown above? \u003Cbr\u003E\n Please press \u003Ckbd\u003Er\u003C\u002Fkbd\u003E for red,\n \u003Ckbd\u003Eg\u003C\u002Fkbd\u003E for green,\n \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E for blue and \u003Ckbd\u003Ey\u003C\u002Fkbd\u003E for yellow.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n', + contextSelector: 'canvas', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Practice frame', + tardy: true, + skip: "${ state.response === 'skipPractice' }", + content: { + messageHandlers: {}, + type: 'lab.flow.Loop', + responses: {}, + templateParameters: [{ + color: 'red', + word: 'red', + phase: 'practice' + }, { + color: 'green', + word: 'green', + phase: 'practice' + }, { + color: 'blue', + word: 'blue', + phase: 'practice' + }, { + color: '#ffe32a', + word: 'yellow', + phase: 'practice' + }, { + color: 'red', + word: 'green', + phase: 'practice' + }, { + color: 'green', + word: 'blue', + phase: 'practice' + }, { + color: 'blue', + word: 'yellow', + phase: 'practice' + }, { + color: '#ffe32a', + word: 'red', + phase: 'practice' + }], + title: 'Practice task', + parameters: {}, + files: {}, + sample: { + mode: 'draw-shuffle' + }, + shuffleGroups: [], + template: { + messageHandlers: {}, + type: 'lab.flow.Sequence', + responses: {}, + title: 'Trial', + parameters: {}, + files: {}, + content: [{ + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + version: '2.4.4', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 18.69, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '+', + fontSize: '72', + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '5', + styles: {} + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + run: function anonymous() { + this.data.correct = 'empty'; + } + }, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${this.parameters.iti}' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + version: '2.4.4', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 331.08, + height: 36.16, + fill: '${ this.parameters.color }', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '${ this.parameters.word }', + fontSize: '72', + fontWeight: 'bold', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '6', + styles: {} + }], + files: {}, + parameters: {}, + responses: { + 'keydown(r)': 'red', + 'keydown(g)': 'green', + 'keydown(b)': 'blue', + 'keydown(y)': '#ffe32a' + }, + messageHandlers: {}, + viewport: [800, 600], + title: 'Stroop screen', + correctResponse: '${ this.parameters.color }' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: "${ parameters.phase == 'practice' ? 0 : 1000 }", + width: 1246.91, + height: 58.76, + fill: "${ state.correct ? 'green' : 'red' }", + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: "${ state.correct ? 'Well done!' : 'Please respond accurately' }", + fontSize: '52', + fontWeight: 'bold', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '24', + styles: {} + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + + this.data.condition = this.parameters.congruent === 'yes' ? 'Match' : 'Mismatch'; + + this.data.reaction_time = this.state.duration; + + if (this.state.response === this.parameters.color) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + + this.data.response_given = this.state.correct === 'empty' ? 'no' : 'yes'; + } + }, + viewport: [800, 600], + title: 'Inter-trial interval', + timeout: "${ parameters.phase == 'practice' ? 1000 : 500 }", + tardy: true + }] + } + } + }, { + messageHandlers: {}, + type: 'lab.html.Screen', + responses: { + 'keypress(Space)': 'continue' + }, + title: 'Main task', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n\n\n', + parameters: {}, + files: {} + }, { + type: 'lab.canvas.Frame', + context: '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n What\'s the \u003Cem\u003Ecolor\u003C\u002Fem\u003E of \n the word shown above? \u003Cbr\u003E\n Please press \u003Ckbd\u003Er\u003C\u002Fkbd\u003E for red,\n \u003Ckbd\u003Eg\u003C\u002Fkbd\u003E for green,\n \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E for blue and \u003Ckbd\u003Ey\u003C\u002Fkbd\u003E for yellow.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n', + contextSelector: 'canvas', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Task frame', + content: { + messageHandlers: {}, + type: 'lab.flow.Loop', + responses: {}, + templateParameters: [{ + color: 'red', + word: 'red', + phase: 'task', + congruent: 'yes' + }, { + color: 'red', + word: 'red', + phase: 'task', + congruent: 'yes' + }, { + color: 'red', + word: 'red', + phase: 'task', + congruent: 'yes' + }, { + color: 'red', + word: 'green', + phase: 'task', + congruent: 'no' + }, { + color: 'red', + word: 'blue', + phase: 'task', + congruent: 'no' + }, { + color: 'red', + word: 'yellow', + phase: 'task', + congruent: 'no' + }, { + color: 'green', + word: 'red', + phase: 'task', + congruent: 'no' + }, { + color: 'green', + word: 'green', + phase: 'task', + congruent: 'yes' + }, { + color: 'green', + word: 'green', + phase: 'task', + congruent: 'yes' + }, { + color: 'green', + word: 'green', + phase: 'task', + congruent: 'yes' + }, { + color: 'green', + word: 'blue', + phase: 'task', + congruent: 'no' + }, { + color: 'green', + word: 'yellow', + phase: 'task', + congruent: 'no' + }, { + color: 'blue', + word: 'red', + phase: 'task', + congruent: 'no' + }, { + color: 'blue', + word: 'green', + phase: 'task', + congruent: 'no' + }, { + color: 'blue', + word: 'blue', + phase: 'task', + congruent: 'yes' + }, { + color: 'blue', + word: 'blue', + phase: 'task', + congruent: 'yes' + }, { + color: 'blue', + word: 'blue', + phase: 'task', + congruent: 'yes' + }, { + color: 'blue', + word: 'yellow', + phase: 'task', + congruent: 'no' + }, { + color: '#ffe32a', + word: 'red', + phase: 'task', + congruent: 'no' + }, { + color: '#ffe32a', + word: 'green', + phase: 'task', + congruent: 'no' + }, { + color: '#ffe32a', + word: 'blue', + phase: 'task', + congruent: 'no' + }, { + color: '#ffe32a', + word: 'yellow', + phase: 'task', + congruent: 'yes' + }, { + color: '#ffe32a', + word: 'yellow', + phase: 'task', + congruent: 'yes' + }, { + color: '#ffe32a', + word: 'yellow', + phase: 'task', + congruent: 'yes' + }], + title: 'Stroop task', + parameters: {}, + files: {}, + sample: { + mode: 'draw-shuffle', + n: '96' + }, + shuffleGroups: [], + template: { + messageHandlers: {}, + type: 'lab.flow.Sequence', + responses: {}, + title: 'Trial', + parameters: {}, + files: {}, + content: [{ + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + version: '2.4.4', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 18.69, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '+', + fontSize: '72', + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '5', + styles: {} + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + run: function anonymous() { + this.data.correct = 'empty'; + } + }, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${this.parameters.iti}' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + version: '2.4.4', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 331.08, + height: 36.16, + fill: '${ this.parameters.color }', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '${ this.parameters.word }', + fontSize: '72', + fontWeight: 'bold', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '6', + styles: {} + }], + files: {}, + parameters: {}, + responses: { + 'keydown(r)': 'red', + 'keydown(g)': 'green', + 'keydown(b)': 'blue', + 'keydown(y)': '#ffe32a' + }, + messageHandlers: { + run: function anonymous() { + this.parameters.callbackForEEG(this.parameters.congruent === 'yes' ? 1 : 2); + } + }, + viewport: [800, 600], + title: 'Stroop screen', + correctResponse: '${ this.parameters.color }' + }, { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: "${ parameters.phase == 'practice' ? 0 : 1000 }", + width: 1246.91, + height: 58.76, + fill: "${ state.correct ? 'green' : 'red' }", + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: "${ state.correct ? 'Well done!' : 'Please respond accurately' }", + fontSize: '52', + fontWeight: 'bold', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '24', + styles: {} + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + + this.data.condition = this.parameters.congruent === 'yes' ? 'Match' : 'Mismatch'; + + this.data.reaction_time = this.state.duration; + + if (this.state.response === this.parameters.color) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + + this.data.response_given = this.state.correct === 'empty' ? 'no' : 'yes'; + } + }, + viewport: [800, 600], + title: 'Inter-trial interval', + timeout: "${ parameters.phase == 'practice' ? 1000 : 500 }", + tardy: true + }] + } + } + }, { + messageHandlers: {}, + type: 'lab.html.Screen', + responses: { + 'keypress(Space)': 'end' + }, + title: 'Thanks', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n', + parameters: {}, + files: {} + }] + }] +}; + +// export +export default studyObject; \ No newline at end of file diff --git a/app/utils/labjs/scripts/visualsearch.js b/app/utils/labjs/scripts/visualsearch.js deleted file mode 100644 index c06d69c0..00000000 --- a/app/utils/labjs/scripts/visualsearch.js +++ /dev/null @@ -1,690 +0,0 @@ -// Define study -const studyObject = { - title: 'root', - type: 'lab.flow.Sequence', - parameters: {}, - plugins: [], - metadata: {}, - files: {}, - responses: {}, - content: [ - { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Visual search', - content: [ - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'next', - 'keypress(q)': 'skipPractice' - }, - messageHandlers: {}, - title: 'Instruction', - content: - '\u003Cstyle\u003E\n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cheader\u003E\n \u003Ch1\u003EVisual search task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n \u003Cp\u003E\n Again, all you need to do is to find an \u003Cb\u003Eorange T\u003C\u002Fb\u003E. If you see the \u003Cb\u003Eorange T\u003C\u002Fb\u003E, press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E. Ignore the upside-down orange T, as well as blue Ts! IF THERE IS NO ORANGE T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E.\n It is very important to respond \u003Cb\u003EAS FAST AS YOU CAN\u003C\u002Fb\u003E.\n \u003C\u002Fp\u003E\n\n \u003Cdiv style="display:grid; grid-template-columns:1fr 1fr;"\u003E\n \u003Cdiv\u003E\n \u003Cp\u003E\n Find \n \u003C\u002Fp\u003E\n \u003Cbr\u003E\n \u003Cdiv class="letter" style="color:orange; height: 100px;"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003Cdiv\u003E\n \u003Cp\u003E\n But do not respond to any of these distractors:\n \u003C\u002Fp\u003E\n \u003Cbr\u003E\n \u003Cdiv style="display:grid; grid-template-columns: 100px 50px; justify-content: center; "\u003E\n \u003Cdiv class="letter" style="color:lightblue;"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003Cdiv class="letter" style="color:orange; transform: rotate(-180deg);"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n\n \u003Cp\u003E\n Press the space bar on your keyboard to start doing the practice trials.\n If you want to skip the practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fmain\u003E' - }, - { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw-shuffle' - }, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - let practiceTrialParameters = []; - - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - const randomBetween = (min, max) => - Math.floor(Math.random() * (max - min + 1)) + min; - - const makeStimuliArray = (arrLen, stLen, isTarget) => { - const arr = Array(arrLen).fill(0); - const shuffled = shuffle([...Array(arrLen).keys()]).slice( - 0, - stLen - ); - for (const p of shuffled) { - if (randomBetween(0, 1) === 0) { - arr[p] = 1; - } else { - arr[p] = 2; - } - } - if (isTarget === 'yes') { - arr[shuffled[0]] = 3; - } - return arr; - }; - - const arrLength = 25; - function trialConstructor(i, stimLength, isTarget) { - return { - trialId: i, - stimuli: makeStimuliArray(arrLength, stimLength, isTarget), - target: isTarget, - size: stimLength, - phase: 'practice' - }; - } - - const numberTrials = 1; - for (let i = 1; i <= numberTrials; i++) { - practiceTrialParameters = practiceTrialParameters.concat( - trialConstructor(i, 5, 'yes') - ); - practiceTrialParameters = practiceTrialParameters.concat( - trialConstructor(i, 5, 'no') - ); - practiceTrialParameters = practiceTrialParameters.concat( - trialConstructor(i, 10, 'yes') - ); - practiceTrialParameters = practiceTrialParameters.concat( - trialConstructor(i, 10, 'no') - ); - practiceTrialParameters = practiceTrialParameters.concat( - trialConstructor(i, 15, 'yes') - ); - practiceTrialParameters = practiceTrialParameters.concat( - trialConstructor(i, 15, 'no') - ); - practiceTrialParameters = practiceTrialParameters.concat( - trialConstructor(i, 20, 'yes') - ); - practiceTrialParameters = practiceTrialParameters.concat( - trialConstructor(i, 20, 'no') - ); - } - - // assign options values to parameters of this task - this.options.templateParameters = practiceTrialParameters; - this.options.shuffle = true; // already shuffled before - } - }, - title: 'Practice task', - tardy: true, - skip: "${ state.response === 'skipPractice' }", - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial', - content: [ - { - type: 'lab.canvas.Frame', - context: - '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', - contextSelector: 'canvas', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Frame', - content: { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 18.05, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '+', - fontSize: '50', - fontWeight: 'bold', - fontFamily: 'Times New Roman', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '15', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - run: function anonymous() { - this.data.response = 'noresponse'; - this.data.correct = false; - } - }, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${this.parameters.iti}' - } - }, - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(b)': 'yes', - 'keypress(n)': 'no' - }, - messageHandlers: { - run: function anonymous() { - const taskgrid = document.querySelector('#taskgrid'); - const stimuli = this.parameters.stimuli; - - for (const s of stimuli) { - const d = document.createElement('div'); - d.classList.add('box'); - const el = document.createElement('span'); - el.classList.add('letter'); - - if (s > 0) { - if (s === 1) { - el.innerHTML = 'T'; - el.style.color = 'lightblue'; - } - if (s === 2) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - el.style.transform = 'rotate(-180deg)'; - } - if (s === 3) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - } - } - d.appendChild(el); - taskgrid.appendChild(d); - } - } - }, - title: 'Stimuli', - content: - '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', - correctResponse: '${this.parameters.target}' - }, - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - run: function anonymous() { - const taskgrid = document.querySelector('#taskgrid'); - const stimuli = this.parameters.stimuli; - - for (const s of stimuli) { - const d = document.createElement('div'); - d.classList.add('box'); - const el = document.createElement('span'); - el.classList.add('letter'); - - if (s > 0) { - if (s === 1) { - el.innerHTML = 'T'; - el.style.color = 'lightblue'; - } - if (s === 2) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - el.style.transform = 'rotate(-180deg)'; - } - if (s === 3) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - d.id = 'target'; - } - } - d.appendChild(el); - taskgrid.appendChild(d); - } - - if (this.state.response === 'noresponse') { - document.querySelector('#feedback').innerHTML = - 'Please respond.'; - return; - } - - if (this.state.correct) { - document.querySelector('#feedback').innerHTML = - 'Well done!'; - document.querySelector('#feedback').style.color = 'green'; - } else if (this.parameters.target === 'yes') { - document.querySelector('#feedback').innerHTML = - 'Error! There was one!'; - document.querySelector('#target').style.border = 'solid'; - } else { - document.querySelector('#feedback').innerHTML = - 'Error! There was none!'; - } - }, - 'before:prepare': function anonymous() { - this.data.trial_number = - 1 + - parseInt( - this.options.id.split('_')[ - this.options.id.split('_').length - 2 - ] - ); - - this.data.condition = `${this.parameters.size} letters`; - - this.data.reaction_time = this.state.duration; - // this.data.target = this.parameters.target; - - if (this.state.response === this.parameters.target) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - - this.data.response_given = - this.parameters.phase === 'practice' || - this.state.response === 'noresponse' - ? 'no' - : 'yes'; - } - }, - title: 'Feedback', - content: - '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n .feedback{\n position: absolute;\n top: 50px;\n font-size: 2rem;\n font-weight: bold;\n color: #da5b1c;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n \u003Cdiv id="feedback" class="feedback"\u003E\n Feedback\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n\n', - timeout: '2000', - tardy: true, - skip: "${ parameters.phase === 'main' }" - } - ] - } - }, - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: {}, - title: 'Main task instruction', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n' - }, - { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw-shuffle' - }, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - let trialParameters = []; - - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - const randomBetween = (min, max) => - Math.floor(Math.random() * (max - min + 1)) + min; - - const makeStimuliArray = (arrLen, stLen, isTarget) => { - const arr = Array(arrLen).fill(0); - const shuffled = shuffle([...Array(arrLen).keys()]).slice( - 0, - stLen - ); - for (const p of shuffled) { - if (randomBetween(0, 1) === 0) { - arr[p] = 1; - } else { - arr[p] = 2; - } - } - if (isTarget === 'yes') { - arr[shuffled[0]] = 3; - } - return arr; - }; - - const arrLength = 25; - function trialConstructor(i, stimLength, isTarget) { - return { - trialId: i, - stimuli: makeStimuliArray(arrLength, stimLength, isTarget), - target: isTarget, - size: stimLength, - phase: 'main' - }; - } - - const numberTrials = 10; - for (let i = 1; i <= numberTrials; i++) { - trialParameters = trialParameters.concat( - trialConstructor(i, 5, 'yes') - ); - trialParameters = trialParameters.concat( - trialConstructor(i, 5, 'no') - ); - trialParameters = trialParameters.concat( - trialConstructor(i, 10, 'yes') - ); - trialParameters = trialParameters.concat( - trialConstructor(i, 10, 'no') - ); - trialParameters = trialParameters.concat( - trialConstructor(i, 15, 'yes') - ); - trialParameters = trialParameters.concat( - trialConstructor(i, 15, 'no') - ); - trialParameters = trialParameters.concat( - trialConstructor(i, 20, 'yes') - ); - trialParameters = trialParameters.concat( - trialConstructor(i, 20, 'no') - ); - } - - // assign options values to parameters of this task - this.options.templateParameters = trialParameters; - this.options.shuffle = true; // already shuffled before - } - }, - title: 'Main task', - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial', - content: [ - { - type: 'lab.canvas.Frame', - context: - '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', - contextSelector: 'canvas', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Frame', - content: { - type: 'lab.canvas.Screen', - content: [ - { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 18.05, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '+', - fontSize: '50', - fontWeight: 'bold', - fontFamily: 'Times New Roman', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '15', - styles: {} - } - ], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - run: function anonymous() { - this.data.response = 'noresponse'; - this.data.correct = false; - } - }, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${this.parameters.iti}' - } - }, - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(b)': 'yes', - 'keypress(n)': 'no' - }, - messageHandlers: { - run: function anonymous() { - this.parameters.callbackForEEG( - parseInt(this.parameters.size) < 13 ? 2 : 1 - ); - const taskgrid = document.querySelector('#taskgrid'); - const stimuli = this.parameters.stimuli; - - for (const s of stimuli) { - const d = document.createElement('div'); - d.classList.add('box'); - const el = document.createElement('span'); - el.classList.add('letter'); - - if (s > 0) { - if (s === 1) { - el.innerHTML = 'T'; - el.style.color = 'lightblue'; - } - if (s === 2) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - el.style.transform = 'rotate(-180deg)'; - } - if (s === 3) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - } - } - d.appendChild(el); - taskgrid.appendChild(d); - } - } - }, - title: 'Stimuli', - content: - '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', - correctResponse: '${this.parameters.target}' - }, - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - run: function anonymous() { - const taskgrid = document.querySelector('#taskgrid'); - const stimuli = this.parameters.stimuli; - - for (const s of stimuli) { - const d = document.createElement('div'); - d.classList.add('box'); - const el = document.createElement('span'); - el.classList.add('letter'); - - if (s > 0) { - if (s === 1) { - el.innerHTML = 'T'; - el.style.color = 'lightblue'; - } - if (s === 2) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - el.style.transform = 'rotate(-180deg)'; - } - if (s === 3) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - d.id = 'target'; - } - } - d.appendChild(el); - taskgrid.appendChild(d); - } - - if (this.state.response === 'noresponse') { - document.querySelector('#feedback').innerHTML = - 'Please respond!'; - return; - } - - if (this.state.correct) { - document.querySelector('#feedback').innerHTML = - 'Well done!'; - document.querySelector('#feedback').style.color = 'green'; - } else if (this.parameters.target === 'yes') { - document.querySelector('#feedback').innerHTML = - 'Error! There was one!'; - document.querySelector('#target').style.border = 'solid'; - } else { - document.querySelector('#feedback').innerHTML = - 'Error! There was none!'; - } - }, - 'before:prepare': function anonymous() { - this.data.trial_number = - 1 + - parseInt( - this.options.id.split('_')[ - this.options.id.split('_').length - 2 - ] - ); - - this.data.condition = `${this.parameters.size} letters`; - - this.data.reaction_time = this.state.duration; - // this.data.target = this.parameters.target; - - if (this.state.response === this.parameters.target) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - - this.data.response_given = - this.parameters.phase === 'practice' || - this.state.response === 'noresponse' - ? 'no' - : 'yes'; - } - }, - title: 'Feedback', - content: - '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n .feedback{\n position: absolute;\n top: 50px;\n font-size: 2rem;\n font-weight: bold;\n color: #da5b1c;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n \u003Cdiv id="feedback" class="feedback"\u003E\n Feedback\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n\n', - timeout: '2000', - tardy: true, - skip: "${ parameters.phase === 'main' }" - } - ] - } - }, - { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'end' - }, - messageHandlers: {}, - title: 'End', - content: - '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' - } - ] - } - ] -}; -// export -export default studyObject; diff --git a/app/utils/labjs/scripts/visualsearch.ts b/app/utils/labjs/scripts/visualsearch.ts new file mode 100644 index 00000000..fa2bb202 --- /dev/null +++ b/app/utils/labjs/scripts/visualsearch.ts @@ -0,0 +1,591 @@ +// Define study +const studyObject = { + title: 'root', + type: 'lab.flow.Sequence', + parameters: {}, + plugins: [], + metadata: {}, + files: {}, + responses: {}, + content: [{ + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Visual search', + content: [{ + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'next', + 'keypress(q)': 'skipPractice' + }, + messageHandlers: {}, + title: 'Instruction', + content: '\u003Cstyle\u003E\n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cheader\u003E\n \u003Ch1\u003EVisual search task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n \u003Cp\u003E\n Again, all you need to do is to find an \u003Cb\u003Eorange T\u003C\u002Fb\u003E. If you see the \u003Cb\u003Eorange T\u003C\u002Fb\u003E, press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E. Ignore the upside-down orange T, as well as blue Ts! IF THERE IS NO ORANGE T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E.\n It is very important to respond \u003Cb\u003EAS FAST AS YOU CAN\u003C\u002Fb\u003E.\n \u003C\u002Fp\u003E\n\n \u003Cdiv style="display:grid; grid-template-columns:1fr 1fr;"\u003E\n \u003Cdiv\u003E\n \u003Cp\u003E\n Find \n \u003C\u002Fp\u003E\n \u003Cbr\u003E\n \u003Cdiv class="letter" style="color:orange; height: 100px;"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003Cdiv\u003E\n \u003Cp\u003E\n But do not respond to any of these distractors:\n \u003C\u002Fp\u003E\n \u003Cbr\u003E\n \u003Cdiv style="display:grid; grid-template-columns: 100px 50px; justify-content: center; "\u003E\n \u003Cdiv class="letter" style="color:lightblue;"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003Cdiv class="letter" style="color:orange; transform: rotate(-180deg);"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n\n \u003Cp\u003E\n Press the space bar on your keyboard to start doing the practice trials.\n If you want to skip the practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fmain\u003E' + }, { + type: 'lab.flow.Loop', + files: {}, + parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle' + }, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + let practiceTrialParameters = []; + + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; + } + + const randomBetween = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; + + const makeStimuliArray = (arrLen, stLen, isTarget) => { + const arr = Array(arrLen).fill(0); + const shuffled = shuffle([...Array(arrLen).keys()]).slice(0, stLen); + for (const p of shuffled) { + if (randomBetween(0, 1) === 0) { + arr[p] = 1; + } else { + arr[p] = 2; + } + } + if (isTarget === 'yes') { + arr[shuffled[0]] = 3; + } + return arr; + }; + + const arrLength = 25; + function trialConstructor(i, stimLength, isTarget) { + return { + trialId: i, + stimuli: makeStimuliArray(arrLength, stimLength, isTarget), + target: isTarget, + size: stimLength, + phase: 'practice' + }; + } + + const numberTrials = 1; + for (let i = 1; i <= numberTrials; i++) { + practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 5, 'yes')); + practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 5, 'no')); + practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 10, 'yes')); + practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 10, 'no')); + practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 15, 'yes')); + practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 15, 'no')); + practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 20, 'yes')); + practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 20, 'no')); + } + + // assign options values to parameters of this task + this.options.templateParameters = practiceTrialParameters; + this.options.shuffle = true; // already shuffled before + } + }, + title: 'Practice task', + tardy: true, + skip: "${ state.response === 'skipPractice' }", + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [{ + type: 'lab.canvas.Frame', + context: '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', + contextSelector: 'canvas', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Frame', + content: { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 18.05, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '+', + fontSize: '50', + fontWeight: 'bold', + fontFamily: 'Times New Roman', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '15', + styles: {} + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + run: function anonymous() { + this.data.response = 'noresponse'; + this.data.correct = false; + } + }, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${this.parameters.iti}' + } + }, { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(b)': 'yes', + 'keypress(n)': 'no' + }, + messageHandlers: { + run: function anonymous() { + const taskgrid = document.querySelector('#taskgrid'); + const stimuli = this.parameters.stimuli; + + for (const s of stimuli) { + const d = document.createElement('div'); + d.classList.add('box'); + const el = document.createElement('span'); + el.classList.add('letter'); + + if (s > 0) { + if (s === 1) { + el.innerHTML = 'T'; + el.style.color = 'lightblue'; + } + if (s === 2) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + el.style.transform = 'rotate(-180deg)'; + } + if (s === 3) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + } + } + d.appendChild(el); + taskgrid.appendChild(d); + } + } + }, + title: 'Stimuli', + content: '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', + correctResponse: '${this.parameters.target}' + }, { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + run: function anonymous() { + const taskgrid = document.querySelector('#taskgrid'); + const stimuli = this.parameters.stimuli; + + for (const s of stimuli) { + const d = document.createElement('div'); + d.classList.add('box'); + const el = document.createElement('span'); + el.classList.add('letter'); + + if (s > 0) { + if (s === 1) { + el.innerHTML = 'T'; + el.style.color = 'lightblue'; + } + if (s === 2) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + el.style.transform = 'rotate(-180deg)'; + } + if (s === 3) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + d.id = 'target'; + } + } + d.appendChild(el); + taskgrid.appendChild(d); + } + + if (this.state.response === 'noresponse') { + document.querySelector('#feedback').innerHTML = 'Please respond.'; + return; + } + + if (this.state.correct) { + document.querySelector('#feedback').innerHTML = 'Well done!'; + document.querySelector('#feedback').style.color = 'green'; + } else if (this.parameters.target === 'yes') { + document.querySelector('#feedback').innerHTML = 'Error! There was one!'; + document.querySelector('#target').style.border = 'solid'; + } else { + document.querySelector('#feedback').innerHTML = 'Error! There was none!'; + } + }, + 'before:prepare': function anonymous() { + this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + + this.data.condition = `${this.parameters.size} letters`; + + this.data.reaction_time = this.state.duration; + // this.data.target = this.parameters.target; + + if (this.state.response === this.parameters.target) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + + this.data.response_given = this.parameters.phase === 'practice' || this.state.response === 'noresponse' ? 'no' : 'yes'; + } + }, + title: 'Feedback', + content: '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n .feedback{\n position: absolute;\n top: 50px;\n font-size: 2rem;\n font-weight: bold;\n color: #da5b1c;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n \u003Cdiv id="feedback" class="feedback"\u003E\n Feedback\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n\n', + timeout: '2000', + tardy: true, + skip: "${ parameters.phase === 'main' }" + }] + } + }, { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue' + }, + messageHandlers: {}, + title: 'Main task instruction', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n' + }, { + type: 'lab.flow.Loop', + files: {}, + parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle' + }, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + let trialParameters = []; + + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; + } + + const randomBetween = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; + + const makeStimuliArray = (arrLen, stLen, isTarget) => { + const arr = Array(arrLen).fill(0); + const shuffled = shuffle([...Array(arrLen).keys()]).slice(0, stLen); + for (const p of shuffled) { + if (randomBetween(0, 1) === 0) { + arr[p] = 1; + } else { + arr[p] = 2; + } + } + if (isTarget === 'yes') { + arr[shuffled[0]] = 3; + } + return arr; + }; + + const arrLength = 25; + function trialConstructor(i, stimLength, isTarget) { + return { + trialId: i, + stimuli: makeStimuliArray(arrLength, stimLength, isTarget), + target: isTarget, + size: stimLength, + phase: 'main' + }; + } + + const numberTrials = 10; + for (let i = 1; i <= numberTrials; i++) { + trialParameters = trialParameters.concat(trialConstructor(i, 5, 'yes')); + trialParameters = trialParameters.concat(trialConstructor(i, 5, 'no')); + trialParameters = trialParameters.concat(trialConstructor(i, 10, 'yes')); + trialParameters = trialParameters.concat(trialConstructor(i, 10, 'no')); + trialParameters = trialParameters.concat(trialConstructor(i, 15, 'yes')); + trialParameters = trialParameters.concat(trialConstructor(i, 15, 'no')); + trialParameters = trialParameters.concat(trialConstructor(i, 20, 'yes')); + trialParameters = trialParameters.concat(trialConstructor(i, 20, 'no')); + } + + // assign options values to parameters of this task + this.options.templateParameters = trialParameters; + this.options.shuffle = true; // already shuffled before + } + }, + title: 'Main task', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [{ + type: 'lab.canvas.Frame', + context: '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', + contextSelector: 'canvas', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Frame', + content: { + type: 'lab.canvas.Screen', + content: [{ + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 18.05, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '+', + fontSize: '50', + fontWeight: 'bold', + fontFamily: 'Times New Roman', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '15', + styles: {} + }], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + run: function anonymous() { + this.data.response = 'noresponse'; + this.data.correct = false; + } + }, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${this.parameters.iti}' + } + }, { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(b)': 'yes', + 'keypress(n)': 'no' + }, + messageHandlers: { + run: function anonymous() { + this.parameters.callbackForEEG(parseInt(this.parameters.size) < 13 ? 2 : 1); + const taskgrid = document.querySelector('#taskgrid'); + const stimuli = this.parameters.stimuli; + + for (const s of stimuli) { + const d = document.createElement('div'); + d.classList.add('box'); + const el = document.createElement('span'); + el.classList.add('letter'); + + if (s > 0) { + if (s === 1) { + el.innerHTML = 'T'; + el.style.color = 'lightblue'; + } + if (s === 2) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + el.style.transform = 'rotate(-180deg)'; + } + if (s === 3) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + } + } + d.appendChild(el); + taskgrid.appendChild(d); + } + } + }, + title: 'Stimuli', + content: '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', + correctResponse: '${this.parameters.target}' + }, { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + run: function anonymous() { + const taskgrid = document.querySelector('#taskgrid'); + const stimuli = this.parameters.stimuli; + + for (const s of stimuli) { + const d = document.createElement('div'); + d.classList.add('box'); + const el = document.createElement('span'); + el.classList.add('letter'); + + if (s > 0) { + if (s === 1) { + el.innerHTML = 'T'; + el.style.color = 'lightblue'; + } + if (s === 2) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + el.style.transform = 'rotate(-180deg)'; + } + if (s === 3) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + d.id = 'target'; + } + } + d.appendChild(el); + taskgrid.appendChild(d); + } + + if (this.state.response === 'noresponse') { + document.querySelector('#feedback').innerHTML = 'Please respond!'; + return; + } + + if (this.state.correct) { + document.querySelector('#feedback').innerHTML = 'Well done!'; + document.querySelector('#feedback').style.color = 'green'; + } else if (this.parameters.target === 'yes') { + document.querySelector('#feedback').innerHTML = 'Error! There was one!'; + document.querySelector('#target').style.border = 'solid'; + } else { + document.querySelector('#feedback').innerHTML = 'Error! There was none!'; + } + }, + 'before:prepare': function anonymous() { + this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + + this.data.condition = `${this.parameters.size} letters`; + + this.data.reaction_time = this.state.duration; + // this.data.target = this.parameters.target; + + if (this.state.response === this.parameters.target) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + + this.data.response_given = this.parameters.phase === 'practice' || this.state.response === 'noresponse' ? 'no' : 'yes'; + } + }, + title: 'Feedback', + content: '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n .feedback{\n position: absolute;\n top: 50px;\n font-size: 2rem;\n font-weight: bold;\n color: #da5b1c;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n \u003Cdiv id="feedback" class="feedback"\u003E\n Feedback\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n\n', + timeout: '2000', + tardy: true, + skip: "${ parameters.phase === 'main' }" + }] + } + }, { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'end' + }, + messageHandlers: {}, + title: 'End', + content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' + }] + }] +}; +// export +export default studyObject; \ No newline at end of file diff --git a/app/viewer.js b/app/viewer.ts similarity index 99% rename from app/viewer.js rename to app/viewer.ts index 0cb2ea02..fa29b204 100644 --- a/app/viewer.js +++ b/app/viewer.ts @@ -26,4 +26,4 @@ ipcChannel.on('updateDownsampling', (event, message) => { }); ipcChannel.on('autoScale', () => { graph.autoScale(); -}); +}); \ No newline at end of file From dc51ea3d0d94b8ca3b73f92b84108d8f768657df Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Mon, 22 Jun 2020 22:08:17 -0700 Subject: [PATCH 12/66] Updated app root files --- app/app.html | 41 +- app/index.tsx | 31 +- app/main.dev.ts | 112 ++- app/main.prod.ts | 1507 ----------------------------------------- app/menu.ts | 381 +++++++---- app/package.json | 2 +- app/reducers/index.ts | 13 +- app/reducers/types.ts | 7 + app/routes.tsx | 54 +- app/viewer.ts | 3 +- 10 files changed, 406 insertions(+), 1745 deletions(-) delete mode 100644 app/main.prod.ts create mode 100644 app/reducers/types.ts diff --git a/app/app.html b/app/app.html index c014b00e..95ce3e47 100644 --- a/app/app.html +++ b/app/app.html @@ -4,8 +4,11 @@ BrainWaves -
diff --git a/app/index.tsx b/app/index.tsx index b1abd173..60b2ae7d 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -1,30 +1,19 @@ -import React from 'react'; +import React, { Fragment } from 'react'; import { render } from 'react-dom'; -import { AppContainer } from 'react-hot-loader'; +import { AppContainer as ReactHotAppContainer } from 'react-hot-loader'; import Root from './containers/Root'; import { configureStore, history } from './store/configureStore'; import './app.global.css'; const store = configureStore(); -// Register for debugging -// window.store = store; +const AppContainer = process.env.PLAIN_HMR ? Fragment : ReactHotAppContainer; -render( - - - , - document.getElementById('root') +document.addEventListener('DOMContentLoaded', () => + render( + + + , + document.getElementById('root') + ) ); - -if (module.hot) { - module.hot.accept('./containers/Root', () => { - const NextRoot = require('./containers/Root'); // eslint-disable-line global-require - render( - - - , - document.getElementById('root') - ); - }); -} diff --git a/app/main.dev.ts b/app/main.dev.ts index 004b79d3..55f49601 100644 --- a/app/main.dev.ts +++ b/app/main.dev.ts @@ -1,31 +1,47 @@ -/* eslint global-require: 0, flowtype-errors/show-errors: 0 */ +/* eslint global-require: off, no-console: off */ /** * This module executes inside of electron's main process. You can start * electron renderer process from here and communicate with the other processes * through IPC. * - * When running `npm run build` or `npm run build-main`, this file is compiled to + * When running `yarn build` or `yarn build-main`, this file is compiled to * `./app/main.prod.js` using webpack. This gives us some performance wins. - * - * @flow */ -import { app, BrowserWindow, ipcMain } from "electron"; -import { loadDialog } from "./utils/filesystem/dialog"; - -app.commandLine.appendSwitch('enable-experimental-web-platform-features', true); -app.commandLine.appendSwitch('user-activation-v2', true); +import { app, BrowserWindow, ipcMain } from 'electron'; +import path from 'path'; +import { autoUpdater } from 'electron-updater'; +import log from 'electron-log'; +import { loadDialog } from './utils/filesystem/dialog'; +import MenuBuilder from './menu'; + +app.commandLine.appendSwitch( + 'enable-experimental-web-platform-features', + 'true' +); +app.commandLine.appendSwitch('user-activation-v2', 'true'); + +export default class AppUpdater { + constructor() { + log.transports.file.level = 'info'; + autoUpdater.logger = log; + autoUpdater.checkForUpdatesAndNotify(); + } +} -let mainWindow = null; +let mainWindow: BrowserWindow | null = null; if (process.env.NODE_ENV === 'production') { const sourceMapSupport = require('source-map-support'); sourceMapSupport.install(); } -if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') { +if ( + process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' +) { require('electron-debug')(); - const path = require('path'); + // TODO: test whether we need this. Was this added to solve native dep issues? const p = path.join(__dirname, '..', 'app', 'node_modules'); require('module').globalPaths.push(p); } @@ -35,29 +51,31 @@ const installExtensions = async () => { const forceDownload = !!process.env.UPGRADE_EXTENSIONS; const extensions = ['REACT_DEVELOPER_TOOLS', 'REDUX_DEVTOOLS']; - return Promise.all(extensions.map(name => installer.default(installer[name], forceDownload))).catch(console.log); + return Promise.all( + extensions.map(name => installer.default(installer[name], forceDownload)) + ).catch(console.log); }; -/** - * Add event listeners... - */ -app.on('window-all-closed', () => { - // Respect the OSX convention of having the application in memory even - // after all windows have been closed - if (process.platform !== 'darwin') { - app.quit(); - } -}); - -app.on('ready', async () => { - if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') { +const createWindow = async () => { + if ( + process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' + ) { await installExtensions(); } mainWindow = new BrowserWindow({ show: false, width: 1280, - height: 800 + height: 800, + webPreferences: + process.env.NODE_ENV === 'development' || process.env.E2E_BUILD === 'true' + ? { + nodeIntegration: true + } + : { + preload: path.join(__dirname, 'dist/renderer.prod.js') + } }); mainWindow.setMinimumSize(1075, 708); @@ -73,18 +91,46 @@ app.on('ready', async () => { if (!mainWindow) { throw new Error('"mainWindow" is not defined'); } - mainWindow.show(); - mainWindow.focus(); + if (process.env.START_MINIMIZED) { + mainWindow.minimize(); + } else { + mainWindow.show(); + mainWindow.focus(); + } }); mainWindow.on('closed', () => { mainWindow = null; }); + const menuBuilder = new MenuBuilder(mainWindow); + menuBuilder.buildMenu(); + // Remove this if your app does not use auto updates + // eslint-disable-next-line + new AppUpdater(); + mainWindow.setMenu(null); if (process.env.NODE_ENV === 'development') { - mainWindow.toggleDevTools(); + // Devtools don't exist? + mainWindow.webContents.openDevTools(); + } +}; + +/** + * Add event listeners... + */ +app.on('window-all-closed', () => { + // Respect the OSX convention of having the application in memory even + // after all windows have been closed + if (process.platform !== 'darwin') { + app.quit(); } - // const menuBuilder = new MenuBuilder(mainWindow); - // menuBuilder.buildMenu(); -}); \ No newline at end of file +}); + +app.on('ready', createWindow); + +app.on('activate', () => { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (mainWindow === null) createWindow(); +}); diff --git a/app/main.prod.ts b/app/main.prod.ts deleted file mode 100644 index 28639d92..00000000 --- a/app/main.prod.ts +++ /dev/null @@ -1,1507 +0,0 @@ -module.exports = function (e) {var t = {};function r(n) {if (t[n]) return t[n].exports;var o = t[n] = { i: n, l: !1, exports: {} };return e[n].call(o.exports, o, o.exports, r), o.l = !0, o.exports;}return r.m = e, r.c = t, r.d = function (e, t, n) {r.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: n });}, r.r = function (e) {"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e, "__esModule", { value: !0 });}, r.t = function (e, t) {if (1 & t && (e = r(e)), 8 & t) return e;if (4 & t && "object" == typeof e && e && e.__esModule) return e;var n = Object.create(null);if (r.r(n), Object.defineProperty(n, "default", { enumerable: !0, value: e }), 2 & t && "string" != typeof e) for (var o in e) r.d(n, o, function (t) {return e[t];}.bind(null, o));return n;}, r.n = function (e) {var t = e && e.__esModule ? function () {return e.default;} : function () {return e;};return r.d(t, "a", t), t;}, r.o = function (e, t) {return Object.prototype.hasOwnProperty.call(e, t);}, r.p = "", r(r.s = "./app/main.dev.js");}({ "./app/main.dev.js": function (e, t, r) {"use strict"; - r.r(t);var n = r("electron");const o = "STIMULUS_DIR", - s = "TIMELINE", - i = (e, t) => {switch (t) {case o: - return l(e); - case s:default: - return a(e); - }}, - a = e => {n.dialog.showOpenDialog({ title: "Select a jsPsych timeline file", properties: ["openFile", "promptToCreate"] }, t => {t && e.sender.send("loadDialogReply", t[0]);});}, - l = e => {n.dialog.showOpenDialog({ title: "Select a folder of images", properties: ["openDirectory"] }, t => {t ? e.sender.send("loadDialogReply", t[0]) : e.sender.send("loadDialogReply", "");});};n.app.commandLine.appendSwitch("enable-experimental-web-platform-features", !0), n.app.commandLine.appendSwitch("user-activation-v2", !0);let u = null;r("./app/node_modules/source-map-support/source-map-support.js").install();n.app.on("window-all-closed", () => {"darwin" !== process.platform && n.app.quit();}), n.app.on("ready", async () => {u = new n.BrowserWindow({ show: !1, width: 1280, height: 800 }), u.setMinimumSize(1075, 708), n.ipcMain.on("loadDialog", i), u.loadURL(`file://${__dirname}/app.html`), u.webContents.on("did-finish-load", () => {if (!u) throw new Error('"mainWindow" is not defined');u.show(), u.focus();}), u.on("closed", () => {u = null;}), u.setMenu(null);});}, "./app/node_modules/buffer-from/index.js": function (e, t) {var r = Object.prototype.toString, - n = "function" == typeof Buffer.alloc && "function" == typeof Buffer.allocUnsafe && "function" == typeof Buffer.from;e.exports = function (e, t, o) {if ("number" == typeof e) throw new TypeError('"value" argument must not be a number');return s = e, "ArrayBuffer" === r.call(s).slice(8, -1) ? function (e, t, r) {t >>>= 0;var o = e.byteLength - t;if (o < 0) throw new RangeError("'offset' is out of bounds");if (void 0 === r) r = o;else if ((r >>>= 0) > o) throw new RangeError("'length' is out of bounds");return n ? Buffer.from(e.slice(t, t + r)) : new Buffer(new Uint8Array(e.slice(t, t + r)));}(e, t, o) : "string" == typeof e ? function (e, t) {if ("string" == typeof t && "" !== t || (t = "utf8"), !Buffer.isEncoding(t)) throw new TypeError('"encoding" must be a valid string encoding');return n ? Buffer.from(e, t) : new Buffer(e, t);}(e, t) : n ? Buffer.from(e) : new Buffer(e);var s;};}, "./app/node_modules/source-map-support/source-map-support.js": function (e, t, r) {(function (e) {var n, - o = r("./app/node_modules/source-map/source-map.js").SourceMapConsumer, - s = r("path");try {(n = r("fs")).existsSync && n.readFileSync || (n = null);} catch (e) {}var i = r("./app/node_modules/buffer-from/index.js");function a(e, t) {return e.require(t);}var l = !1, - u = !1, - c = !1, - d = "auto", - h = {}, - f = {}, - p = /^data:application\/json[^,]+base64,/, - m = [], - g = [];function _() {return "browser" === d || "node" !== d && ("undefined" != typeof window && "function" == typeof XMLHttpRequest && !(window.require && window.module && window.process && "renderer" === window.process.type));}function v(e) {return function (t) {for (var r = 0; r < e.length; r++) {var n = e[r](t);if (n) return n;}return null;};}var b = v(m);function y(e, t) {if (!e) return t;var r = s.dirname(e), - n = /^\w+:\/\/[^\/]*/.exec(r), - o = n ? n[0] : "", - i = r.slice(o.length);return o && /^\/\w\:/.test(i) ? (o += "/") + s.resolve(r.slice(o.length), t).replace(/\\/g, "/") : o + s.resolve(r.slice(o.length), t);}m.push(function (e) {if (e = e.trim(), /^file:/.test(e) && (e = e.replace(/file:\/\/\/(\w:)?/, function (e, t) {return t ? "" : "/";})), e in h) return h[e];var t = "";try {if (n) n.existsSync(e) && (t = n.readFileSync(e, "utf8"));else {var r = new XMLHttpRequest();r.open("GET", e, !1), r.send(null), 4 === r.readyState && 200 === r.status && (t = r.responseText);}} catch (e) {}return h[e] = t;});var w = v(g);function j(e) {var t = f[e.source];if (!t) {var r = w(e.source);r ? (t = f[e.source] = { url: r.url, map: new o(r.map) }).map.sourcesContent && t.map.sources.forEach(function (e, r) {var n = t.map.sourcesContent[r];if (n) {var o = y(t.url, e);h[o] = n;}}) : t = f[e.source] = { url: null, map: null };}if (t && t.map && "function" == typeof t.map.originalPositionFor) {var n = t.map.originalPositionFor(e);if (null !== n.source) return n.source = y(t.url, n.source), n;}return e;}function E() {var e, - t = "";if (this.isNative()) t = "native";else {!(e = this.getScriptNameOrSourceURL()) && this.isEval() && (t = this.getEvalOrigin(), t += ", "), t += e || "";var r = this.getLineNumber();if (null != r) {t += ":" + r;var n = this.getColumnNumber();n && (t += ":" + n);}}var o = "", - s = this.getFunctionName(), - i = !0, - a = this.isConstructor();if (!(this.isToplevel() || a)) {var l = this.getTypeName();"[object Object]" === l && (l = "null");var u = this.getMethodName();s ? (l && 0 != s.indexOf(l) && (o += l + "."), o += s, u && s.indexOf("." + u) != s.length - u.length - 1 && (o += " [as " + u + "]")) : o += l + "." + (u || "");} else a ? o += "new " + (s || "") : s ? o += s : (o += t, i = !1);return i && (o += " (" + t + ")"), o;}function k(e) {var t = {};return Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(function (r) {t[r] = /^(?:is|get)/.test(r) ? function () {return e[r].call(e);} : e[r];}), t.toString = E, t;}function S(e, t) {if (void 0 === t && (t = { nextPosition: null, curPosition: null }), e.isNative()) return t.curPosition = null, e;var r = e.getFileName() || e.getScriptNameOrSourceURL();if (r) {var n = e.getLineNumber(), - o = e.getColumnNumber() - 1, - s = /^v(10\.1[6-9]|10\.[2-9][0-9]|10\.[0-9]{3,}|1[2-9]\d*|[2-9]\d|\d{3,}|11\.11)/.test(process.version) ? 0 : 62;1 === n && o > s && !_() && !e.isEval() && (o -= s);var i = j({ source: r, line: n, column: o });t.curPosition = i;var a = (e = k(e)).getFunctionName;return e.getFunctionName = function () {return null == t.nextPosition ? a() : t.nextPosition.name || a();}, e.getFileName = function () {return i.source;}, e.getLineNumber = function () {return i.line;}, e.getColumnNumber = function () {return i.column + 1;}, e.getScriptNameOrSourceURL = function () {return i.source;}, e;}var l = e.isEval() && e.getEvalOrigin();return l ? (l = function e(t) {var r = /^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(t);if (r) {var n = j({ source: r[2], line: +r[3], column: r[4] - 1 });return "eval at " + r[1] + " (" + n.source + ":" + n.line + ":" + (n.column + 1) + ")";}return (r = /^eval at ([^(]+) \((.+)\)$/.exec(t)) ? "eval at " + r[1] + " (" + e(r[2]) + ")" : t;}(l), (e = k(e)).getEvalOrigin = function () {return l;}, e) : e;}function C(e, t) {c && (h = {}, f = {});for (var r = (e.name || "Error") + ": " + (e.message || ""), n = { nextPosition: null, curPosition: null }, o = [], s = t.length - 1; s >= 0; s--) o.push("\n at " + S(t[s], n)), n.nextPosition = n.curPosition;return n.curPosition = n.nextPosition = null, r + o.reverse().join("");}function x(e) {var t = /\n at [^(]+ \((.*):(\d+):(\d+)\)/.exec(e.stack);if (t) {var r = t[1], - o = +t[2], - s = +t[3], - i = h[r];if (!i && n && n.existsSync(r)) try {i = n.readFileSync(r, "utf8");} catch (e) {i = "";}if (i) {var a = i.split(/(?:\r\n|\r|\n)/)[o - 1];if (a) return r + ":" + o + "\n" + a + "\n" + new Array(s).join(" ") + "^";}}return null;}function O(e) {var t = x(e);process.stderr._handle && process.stderr._handle.setBlocking && process.stderr._handle.setBlocking(!0), t && (console.error(), console.error(t)), console.error(e.stack), process.exit(1);}g.push(function (e) {var t, - r = function (e) {var t;if (_()) try {var r = new XMLHttpRequest();r.open("GET", e, !1), r.send(null), t = 4 === r.readyState ? r.responseText : null;var n = r.getResponseHeader("SourceMap") || r.getResponseHeader("X-SourceMap");if (n) return n;} catch (e) {}t = b(e);for (var o, s, i = /(?:\/\/[@#][\s]*sourceMappingURL=([^\s'"]+)[\s]*$)|(?:\/\*[@#][\s]*sourceMappingURL=([^\s*'"]+)[\s]*(?:\*\/)[\s]*$)/gm; s = i.exec(t);) o = s;return o ? o[1] : null;}(e);if (!r) return null;if (p.test(r)) {var n = r.slice(r.indexOf(",") + 1);t = i(n, "base64").toString(), r = e;} else r = y(e, r), t = b(r);return t ? { url: r, map: t } : null;});var A = m.slice(0), - R = g.slice(0);t.wrapCallSite = S, t.getErrorSource = x, t.mapSourcePosition = j, t.retrieveSourceMap = w, t.install = function (t) {if ((t = t || {}).environment && (d = t.environment, -1 === ["node", "browser", "auto"].indexOf(d))) throw new Error("environment " + d + " was unknown. Available options are {auto, browser, node}");if (t.retrieveFile && (t.overrideRetrieveFile && (m.length = 0), m.unshift(t.retrieveFile)), t.retrieveSourceMap && (t.overrideRetrieveSourceMap && (g.length = 0), g.unshift(t.retrieveSourceMap)), t.hookRequire && !_()) {var r = a(e, "module"), - n = r.prototype._compile;n.__sourceMapSupport || (r.prototype._compile = function (e, t) {return h[t] = e, f[t] = void 0, n.call(this, e, t);}, r.prototype._compile.__sourceMapSupport = !0);}if (c || (c = "emptyCacheBetweenOperations" in t && t.emptyCacheBetweenOperations), l || (l = !0, Error.prepareStackTrace = C), !u) {var o = !("handleUncaughtExceptions" in t) || t.handleUncaughtExceptions;try {!1 === a(e, "worker_threads").isMainThread && (o = !1);} catch (e) {}o && "object" == typeof process && null !== process && "function" == typeof process.on && (u = !0, s = process.emit, process.emit = function (e) {if ("uncaughtException" === e) {var t = arguments[1] && arguments[1].stack, - r = this.listeners(e).length > 0;if (t && !r) return O(arguments[1]);}return s.apply(this, arguments);});}var s;}, t.resetRetrieveHandlers = function () {m.length = 0, g.length = 0, m = A.slice(0), g = R.slice(0), w = v(g), b = v(m);};}).call(this, r("./node_modules/webpack/buildin/module.js")(e));}, "./app/node_modules/source-map/lib/array-set.js": function (e, t, r) {var n = r("./app/node_modules/source-map/lib/util.js"), - o = Object.prototype.hasOwnProperty, - s = "undefined" != typeof Map;function i() {this._array = [], this._set = s ? new Map() : Object.create(null);}i.fromArray = function (e, t) {for (var r = new i(), n = 0, o = e.length; n < o; n++) r.add(e[n], t);return r;}, i.prototype.size = function () {return s ? this._set.size : Object.getOwnPropertyNames(this._set).length;}, i.prototype.add = function (e, t) {var r = s ? e : n.toSetString(e), - i = s ? this.has(e) : o.call(this._set, r), - a = this._array.length;i && !t || this._array.push(e), i || (s ? this._set.set(e, a) : this._set[r] = a);}, i.prototype.has = function (e) {if (s) return this._set.has(e);var t = n.toSetString(e);return o.call(this._set, t);}, i.prototype.indexOf = function (e) {if (s) {var t = this._set.get(e);if (t >= 0) return t;} else {var r = n.toSetString(e);if (o.call(this._set, r)) return this._set[r];}throw new Error('"' + e + '" is not in the set.');}, i.prototype.at = function (e) {if (e >= 0 && e < this._array.length) return this._array[e];throw new Error("No element indexed by " + e);}, i.prototype.toArray = function () {return this._array.slice();}, t.ArraySet = i;}, "./app/node_modules/source-map/lib/base64-vlq.js": function (e, t, r) {var n = r("./app/node_modules/source-map/lib/base64.js");t.encode = function (e) {var t, - r = "", - o = function (e) {return e < 0 ? 1 + (-e << 1) : 0 + (e << 1);}(e);do {t = 31 & o, (o >>>= 5) > 0 && (t |= 32), r += n.encode(t);} while (o > 0);return r;}, t.decode = function (e, t, r) {var o, - s, - i, - a, - l = e.length, - u = 0, - c = 0;do {if (t >= l) throw new Error("Expected more digits in base 64 VLQ value.");if (-1 === (s = n.decode(e.charCodeAt(t++)))) throw new Error("Invalid base64 digit: " + e.charAt(t - 1));o = !!(32 & s), u += (s &= 31) << c, c += 5;} while (o);r.value = (a = (i = u) >> 1, 1 == (1 & i) ? -a : a), r.rest = t;};}, "./app/node_modules/source-map/lib/base64.js": function (e, t) {var r = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");t.encode = function (e) {if (0 <= e && e < r.length) return r[e];throw new TypeError("Must be between 0 and 63: " + e);}, t.decode = function (e) {return 65 <= e && e <= 90 ? e - 65 : 97 <= e && e <= 122 ? e - 97 + 26 : 48 <= e && e <= 57 ? e - 48 + 52 : 43 == e ? 62 : 47 == e ? 63 : -1;};}, "./app/node_modules/source-map/lib/binary-search.js": function (e, t) {t.GREATEST_LOWER_BOUND = 1, t.LEAST_UPPER_BOUND = 2, t.search = function (e, r, n, o) {if (0 === r.length) return -1;var s = function e(r, n, o, s, i, a) {var l = Math.floor((n - r) / 2) + r, - u = i(o, s[l], !0);return 0 === u ? l : u > 0 ? n - l > 1 ? e(l, n, o, s, i, a) : a == t.LEAST_UPPER_BOUND ? n < s.length ? n : -1 : l : l - r > 1 ? e(r, l, o, s, i, a) : a == t.LEAST_UPPER_BOUND ? l : r < 0 ? -1 : r;}(-1, r.length, e, r, n, o || t.GREATEST_LOWER_BOUND);if (s < 0) return -1;for (; s - 1 >= 0 && 0 === n(r[s], r[s - 1], !0);) --s;return s;};}, "./app/node_modules/source-map/lib/mapping-list.js": function (e, t, r) {var n = r("./app/node_modules/source-map/lib/util.js");function o() {this._array = [], this._sorted = !0, this._last = { generatedLine: -1, generatedColumn: 0 };}o.prototype.unsortedForEach = function (e, t) {this._array.forEach(e, t);}, o.prototype.add = function (e) {var t, r, o, s, i, a;t = this._last, r = e, o = t.generatedLine, s = r.generatedLine, i = t.generatedColumn, a = r.generatedColumn, s > o || s == o && a >= i || n.compareByGeneratedPositionsInflated(t, r) <= 0 ? (this._last = e, this._array.push(e)) : (this._sorted = !1, this._array.push(e));}, o.prototype.toArray = function () {return this._sorted || (this._array.sort(n.compareByGeneratedPositionsInflated), this._sorted = !0), this._array;}, t.MappingList = o;}, "./app/node_modules/source-map/lib/quick-sort.js": function (e, t) {function r(e, t, r) {var n = e[t];e[t] = e[r], e[r] = n;}function n(e, t, o, s) {if (o < s) {var i = o - 1;r(e, (c = o, d = s, Math.round(c + Math.random() * (d - c))), s);for (var a = e[s], l = o; l < s; l++) t(e[l], a) <= 0 && r(e, i += 1, l);r(e, i + 1, l);var u = i + 1;n(e, t, o, u - 1), n(e, t, u + 1, s);}var c, d;}t.quickSort = function (e, t) {n(e, t, 0, e.length - 1);};}, "./app/node_modules/source-map/lib/source-map-consumer.js": function (e, t, r) {var n = r("./app/node_modules/source-map/lib/util.js"), - o = r("./app/node_modules/source-map/lib/binary-search.js"), - s = r("./app/node_modules/source-map/lib/array-set.js").ArraySet, - i = r("./app/node_modules/source-map/lib/base64-vlq.js"), - a = r("./app/node_modules/source-map/lib/quick-sort.js").quickSort;function l(e, t) {var r = e;return "string" == typeof e && (r = n.parseSourceMapInput(e)), null != r.sections ? new d(r, t) : new u(r, t);}function u(e, t) {var r = e;"string" == typeof e && (r = n.parseSourceMapInput(e));var o = n.getArg(r, "version"), - i = n.getArg(r, "sources"), - a = n.getArg(r, "names", []), - l = n.getArg(r, "sourceRoot", null), - u = n.getArg(r, "sourcesContent", null), - c = n.getArg(r, "mappings"), - d = n.getArg(r, "file", null);if (o != this._version) throw new Error("Unsupported version: " + o);l && (l = n.normalize(l)), i = i.map(String).map(n.normalize).map(function (e) {return l && n.isAbsolute(l) && n.isAbsolute(e) ? n.relative(l, e) : e;}), this._names = s.fromArray(a.map(String), !0), this._sources = s.fromArray(i, !0), this._absoluteSources = this._sources.toArray().map(function (e) {return n.computeSourceURL(l, e, t);}), this.sourceRoot = l, this.sourcesContent = u, this._mappings = c, this._sourceMapURL = t, this.file = d;}function c() {this.generatedLine = 0, this.generatedColumn = 0, this.source = null, this.originalLine = null, this.originalColumn = null, this.name = null;}function d(e, t) {var r = e;"string" == typeof e && (r = n.parseSourceMapInput(e));var o = n.getArg(r, "version"), - i = n.getArg(r, "sections");if (o != this._version) throw new Error("Unsupported version: " + o);this._sources = new s(), this._names = new s();var a = { line: -1, column: 0 };this._sections = i.map(function (e) {if (e.url) throw new Error("Support for url field in sections not implemented.");var r = n.getArg(e, "offset"), - o = n.getArg(r, "line"), - s = n.getArg(r, "column");if (o < a.line || o === a.line && s < a.column) throw new Error("Section offsets must be ordered and non-overlapping.");return a = r, { generatedOffset: { generatedLine: o + 1, generatedColumn: s + 1 }, consumer: new l(n.getArg(e, "map"), t) };});}l.fromSourceMap = function (e, t) {return u.fromSourceMap(e, t);}, l.prototype._version = 3, l.prototype.__generatedMappings = null, Object.defineProperty(l.prototype, "_generatedMappings", { configurable: !0, enumerable: !0, get: function () {return this.__generatedMappings || this._parseMappings(this._mappings, this.sourceRoot), this.__generatedMappings;} }), l.prototype.__originalMappings = null, Object.defineProperty(l.prototype, "_originalMappings", { configurable: !0, enumerable: !0, get: function () {return this.__originalMappings || this._parseMappings(this._mappings, this.sourceRoot), this.__originalMappings;} }), l.prototype._charIsMappingSeparator = function (e, t) {var r = e.charAt(t);return ";" === r || "," === r;}, l.prototype._parseMappings = function (e, t) {throw new Error("Subclasses must implement _parseMappings");}, l.GENERATED_ORDER = 1, l.ORIGINAL_ORDER = 2, l.GREATEST_LOWER_BOUND = 1, l.LEAST_UPPER_BOUND = 2, l.prototype.eachMapping = function (e, t, r) {var o, - s = t || null;switch (r || l.GENERATED_ORDER) {case l.GENERATED_ORDER: - o = this._generatedMappings; - break; - case l.ORIGINAL_ORDER: - o = this._originalMappings; - break; - default: - throw new Error("Unknown order of iteration."); - }var i = this.sourceRoot;o.map(function (e) {var t = null === e.source ? null : this._sources.at(e.source);return { source: t = n.computeSourceURL(i, t, this._sourceMapURL), generatedLine: e.generatedLine, generatedColumn: e.generatedColumn, originalLine: e.originalLine, originalColumn: e.originalColumn, name: null === e.name ? null : this._names.at(e.name) };}, this).forEach(e, s);}, l.prototype.allGeneratedPositionsFor = function (e) {var t = n.getArg(e, "line"), - r = { source: n.getArg(e, "source"), originalLine: t, originalColumn: n.getArg(e, "column", 0) };if (r.source = this._findSourceIndex(r.source), r.source < 0) return [];var s = [], - i = this._findMapping(r, this._originalMappings, "originalLine", "originalColumn", n.compareByOriginalPositions, o.LEAST_UPPER_BOUND);if (i >= 0) {var a = this._originalMappings[i];if (void 0 === e.column) for (var l = a.originalLine; a && a.originalLine === l;) s.push({ line: n.getArg(a, "generatedLine", null), column: n.getArg(a, "generatedColumn", null), lastColumn: n.getArg(a, "lastGeneratedColumn", null) }), a = this._originalMappings[++i];else for (var u = a.originalColumn; a && a.originalLine === t && a.originalColumn == u;) s.push({ line: n.getArg(a, "generatedLine", null), column: n.getArg(a, "generatedColumn", null), lastColumn: n.getArg(a, "lastGeneratedColumn", null) }), a = this._originalMappings[++i];}return s;}, t.SourceMapConsumer = l, u.prototype = Object.create(l.prototype), u.prototype.consumer = l, u.prototype._findSourceIndex = function (e) {var t, - r = e;if (null != this.sourceRoot && (r = n.relative(this.sourceRoot, r)), this._sources.has(r)) return this._sources.indexOf(r);for (t = 0; t < this._absoluteSources.length; ++t) if (this._absoluteSources[t] == e) return t;return -1;}, u.fromSourceMap = function (e, t) {var r = Object.create(u.prototype), - o = r._names = s.fromArray(e._names.toArray(), !0), - i = r._sources = s.fromArray(e._sources.toArray(), !0);r.sourceRoot = e._sourceRoot, r.sourcesContent = e._generateSourcesContent(r._sources.toArray(), r.sourceRoot), r.file = e._file, r._sourceMapURL = t, r._absoluteSources = r._sources.toArray().map(function (e) {return n.computeSourceURL(r.sourceRoot, e, t);});for (var l = e._mappings.toArray().slice(), d = r.__generatedMappings = [], h = r.__originalMappings = [], f = 0, p = l.length; f < p; f++) {var m = l[f], - g = new c();g.generatedLine = m.generatedLine, g.generatedColumn = m.generatedColumn, m.source && (g.source = i.indexOf(m.source), g.originalLine = m.originalLine, g.originalColumn = m.originalColumn, m.name && (g.name = o.indexOf(m.name)), h.push(g)), d.push(g);}return a(r.__originalMappings, n.compareByOriginalPositions), r;}, u.prototype._version = 3, Object.defineProperty(u.prototype, "sources", { get: function () {return this._absoluteSources.slice();} }), u.prototype._parseMappings = function (e, t) {for (var r, o, s, l, u, d = 1, h = 0, f = 0, p = 0, m = 0, g = 0, _ = e.length, v = 0, b = {}, y = {}, w = [], j = []; v < _;) if (";" === e.charAt(v)) d++, v++, h = 0;else if ("," === e.charAt(v)) v++;else {for ((r = new c()).generatedLine = d, l = v; l < _ && !this._charIsMappingSeparator(e, l); l++);if (s = b[o = e.slice(v, l)]) v += o.length;else {for (s = []; v < l;) i.decode(e, v, y), u = y.value, v = y.rest, s.push(u);if (2 === s.length) throw new Error("Found a source, but no line and column");if (3 === s.length) throw new Error("Found a source and line, but no column");b[o] = s;}r.generatedColumn = h + s[0], h = r.generatedColumn, s.length > 1 && (r.source = m + s[1], m += s[1], r.originalLine = f + s[2], f = r.originalLine, r.originalLine += 1, r.originalColumn = p + s[3], p = r.originalColumn, s.length > 4 && (r.name = g + s[4], g += s[4])), j.push(r), "number" == typeof r.originalLine && w.push(r);}a(j, n.compareByGeneratedPositionsDeflated), this.__generatedMappings = j, a(w, n.compareByOriginalPositions), this.__originalMappings = w;}, u.prototype._findMapping = function (e, t, r, n, s, i) {if (e[r] <= 0) throw new TypeError("Line must be greater than or equal to 1, got " + e[r]);if (e[n] < 0) throw new TypeError("Column must be greater than or equal to 0, got " + e[n]);return o.search(e, t, s, i);}, u.prototype.computeColumnSpans = function () {for (var e = 0; e < this._generatedMappings.length; ++e) {var t = this._generatedMappings[e];if (e + 1 < this._generatedMappings.length) {var r = this._generatedMappings[e + 1];if (t.generatedLine === r.generatedLine) {t.lastGeneratedColumn = r.generatedColumn - 1;continue;}}t.lastGeneratedColumn = 1 / 0;}}, u.prototype.originalPositionFor = function (e) {var t = { generatedLine: n.getArg(e, "line"), generatedColumn: n.getArg(e, "column") }, - r = this._findMapping(t, this._generatedMappings, "generatedLine", "generatedColumn", n.compareByGeneratedPositionsDeflated, n.getArg(e, "bias", l.GREATEST_LOWER_BOUND));if (r >= 0) {var o = this._generatedMappings[r];if (o.generatedLine === t.generatedLine) {var s = n.getArg(o, "source", null);null !== s && (s = this._sources.at(s), s = n.computeSourceURL(this.sourceRoot, s, this._sourceMapURL));var i = n.getArg(o, "name", null);return null !== i && (i = this._names.at(i)), { source: s, line: n.getArg(o, "originalLine", null), column: n.getArg(o, "originalColumn", null), name: i };}}return { source: null, line: null, column: null, name: null };}, u.prototype.hasContentsOfAllSources = function () {return !!this.sourcesContent && (this.sourcesContent.length >= this._sources.size() && !this.sourcesContent.some(function (e) {return null == e;}));}, u.prototype.sourceContentFor = function (e, t) {if (!this.sourcesContent) return null;var r = this._findSourceIndex(e);if (r >= 0) return this.sourcesContent[r];var o, - s = e;if (null != this.sourceRoot && (s = n.relative(this.sourceRoot, s)), null != this.sourceRoot && (o = n.urlParse(this.sourceRoot))) {var i = s.replace(/^file:\/\//, "");if ("file" == o.scheme && this._sources.has(i)) return this.sourcesContent[this._sources.indexOf(i)];if ((!o.path || "/" == o.path) && this._sources.has("/" + s)) return this.sourcesContent[this._sources.indexOf("/" + s)];}if (t) return null;throw new Error('"' + s + '" is not in the SourceMap.');}, u.prototype.generatedPositionFor = function (e) {var t = n.getArg(e, "source");if ((t = this._findSourceIndex(t)) < 0) return { line: null, column: null, lastColumn: null };var r = { source: t, originalLine: n.getArg(e, "line"), originalColumn: n.getArg(e, "column") }, - o = this._findMapping(r, this._originalMappings, "originalLine", "originalColumn", n.compareByOriginalPositions, n.getArg(e, "bias", l.GREATEST_LOWER_BOUND));if (o >= 0) {var s = this._originalMappings[o];if (s.source === r.source) return { line: n.getArg(s, "generatedLine", null), column: n.getArg(s, "generatedColumn", null), lastColumn: n.getArg(s, "lastGeneratedColumn", null) };}return { line: null, column: null, lastColumn: null };}, t.BasicSourceMapConsumer = u, d.prototype = Object.create(l.prototype), d.prototype.constructor = l, d.prototype._version = 3, Object.defineProperty(d.prototype, "sources", { get: function () {for (var e = [], t = 0; t < this._sections.length; t++) for (var r = 0; r < this._sections[t].consumer.sources.length; r++) e.push(this._sections[t].consumer.sources[r]);return e;} }), d.prototype.originalPositionFor = function (e) {var t = { generatedLine: n.getArg(e, "line"), generatedColumn: n.getArg(e, "column") }, - r = o.search(t, this._sections, function (e, t) {var r = e.generatedLine - t.generatedOffset.generatedLine;return r || e.generatedColumn - t.generatedOffset.generatedColumn;}), - s = this._sections[r];return s ? s.consumer.originalPositionFor({ line: t.generatedLine - (s.generatedOffset.generatedLine - 1), column: t.generatedColumn - (s.generatedOffset.generatedLine === t.generatedLine ? s.generatedOffset.generatedColumn - 1 : 0), bias: e.bias }) : { source: null, line: null, column: null, name: null };}, d.prototype.hasContentsOfAllSources = function () {return this._sections.every(function (e) {return e.consumer.hasContentsOfAllSources();});}, d.prototype.sourceContentFor = function (e, t) {for (var r = 0; r < this._sections.length; r++) {var n = this._sections[r].consumer.sourceContentFor(e, !0);if (n) return n;}if (t) return null;throw new Error('"' + e + '" is not in the SourceMap.');}, d.prototype.generatedPositionFor = function (e) {for (var t = 0; t < this._sections.length; t++) {var r = this._sections[t];if (-1 !== r.consumer._findSourceIndex(n.getArg(e, "source"))) {var o = r.consumer.generatedPositionFor(e);if (o) return { line: o.line + (r.generatedOffset.generatedLine - 1), column: o.column + (r.generatedOffset.generatedLine === o.line ? r.generatedOffset.generatedColumn - 1 : 0) };}}return { line: null, column: null };}, d.prototype._parseMappings = function (e, t) {this.__generatedMappings = [], this.__originalMappings = [];for (var r = 0; r < this._sections.length; r++) for (var o = this._sections[r], s = o.consumer._generatedMappings, i = 0; i < s.length; i++) {var l = s[i], - u = o.consumer._sources.at(l.source);u = n.computeSourceURL(o.consumer.sourceRoot, u, this._sourceMapURL), this._sources.add(u), u = this._sources.indexOf(u);var c = null;l.name && (c = o.consumer._names.at(l.name), this._names.add(c), c = this._names.indexOf(c));var d = { source: u, generatedLine: l.generatedLine + (o.generatedOffset.generatedLine - 1), generatedColumn: l.generatedColumn + (o.generatedOffset.generatedLine === l.generatedLine ? o.generatedOffset.generatedColumn - 1 : 0), originalLine: l.originalLine, originalColumn: l.originalColumn, name: c };this.__generatedMappings.push(d), "number" == typeof d.originalLine && this.__originalMappings.push(d);}a(this.__generatedMappings, n.compareByGeneratedPositionsDeflated), a(this.__originalMappings, n.compareByOriginalPositions);}, t.IndexedSourceMapConsumer = d;}, "./app/node_modules/source-map/lib/source-map-generator.js": function (e, t, r) {var n = r("./app/node_modules/source-map/lib/base64-vlq.js"), - o = r("./app/node_modules/source-map/lib/util.js"), - s = r("./app/node_modules/source-map/lib/array-set.js").ArraySet, - i = r("./app/node_modules/source-map/lib/mapping-list.js").MappingList;function a(e) {e || (e = {}), this._file = o.getArg(e, "file", null), this._sourceRoot = o.getArg(e, "sourceRoot", null), this._skipValidation = o.getArg(e, "skipValidation", !1), this._sources = new s(), this._names = new s(), this._mappings = new i(), this._sourcesContents = null;}a.prototype._version = 3, a.fromSourceMap = function (e) {var t = e.sourceRoot, - r = new a({ file: e.file, sourceRoot: t });return e.eachMapping(function (e) {var n = { generated: { line: e.generatedLine, column: e.generatedColumn } };null != e.source && (n.source = e.source, null != t && (n.source = o.relative(t, n.source)), n.original = { line: e.originalLine, column: e.originalColumn }, null != e.name && (n.name = e.name)), r.addMapping(n);}), e.sources.forEach(function (n) {var s = n;null !== t && (s = o.relative(t, n)), r._sources.has(s) || r._sources.add(s);var i = e.sourceContentFor(n);null != i && r.setSourceContent(n, i);}), r;}, a.prototype.addMapping = function (e) {var t = o.getArg(e, "generated"), - r = o.getArg(e, "original", null), - n = o.getArg(e, "source", null), - s = o.getArg(e, "name", null);this._skipValidation || this._validateMapping(t, r, n, s), null != n && (n = String(n), this._sources.has(n) || this._sources.add(n)), null != s && (s = String(s), this._names.has(s) || this._names.add(s)), this._mappings.add({ generatedLine: t.line, generatedColumn: t.column, originalLine: null != r && r.line, originalColumn: null != r && r.column, source: n, name: s });}, a.prototype.setSourceContent = function (e, t) {var r = e;null != this._sourceRoot && (r = o.relative(this._sourceRoot, r)), null != t ? (this._sourcesContents || (this._sourcesContents = Object.create(null)), this._sourcesContents[o.toSetString(r)] = t) : this._sourcesContents && (delete this._sourcesContents[o.toSetString(r)], 0 === Object.keys(this._sourcesContents).length && (this._sourcesContents = null));}, a.prototype.applySourceMap = function (e, t, r) {var n = t;if (null == t) {if (null == e.file) throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');n = e.file;}var i = this._sourceRoot;null != i && (n = o.relative(i, n));var a = new s(), - l = new s();this._mappings.unsortedForEach(function (t) {if (t.source === n && null != t.originalLine) {var s = e.originalPositionFor({ line: t.originalLine, column: t.originalColumn });null != s.source && (t.source = s.source, null != r && (t.source = o.join(r, t.source)), null != i && (t.source = o.relative(i, t.source)), t.originalLine = s.line, t.originalColumn = s.column, null != s.name && (t.name = s.name));}var u = t.source;null == u || a.has(u) || a.add(u);var c = t.name;null == c || l.has(c) || l.add(c);}, this), this._sources = a, this._names = l, e.sources.forEach(function (t) {var n = e.sourceContentFor(t);null != n && (null != r && (t = o.join(r, t)), null != i && (t = o.relative(i, t)), this.setSourceContent(t, n));}, this);}, a.prototype._validateMapping = function (e, t, r, n) {if (t && "number" != typeof t.line && "number" != typeof t.column) throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if ((!(e && "line" in e && "column" in e && e.line > 0 && e.column >= 0) || t || r || n) && !(e && "line" in e && "column" in e && t && "line" in t && "column" in t && e.line > 0 && e.column >= 0 && t.line > 0 && t.column >= 0 && r)) throw new Error("Invalid mapping: " + JSON.stringify({ generated: e, source: r, original: t, name: n }));}, a.prototype._serializeMappings = function () {for (var e, t, r, s, i = 0, a = 1, l = 0, u = 0, c = 0, d = 0, h = "", f = this._mappings.toArray(), p = 0, m = f.length; p < m; p++) {if (e = "", (t = f[p]).generatedLine !== a) for (i = 0; t.generatedLine !== a;) e += ";", a++;else if (p > 0) {if (!o.compareByGeneratedPositionsInflated(t, f[p - 1])) continue;e += ",";}e += n.encode(t.generatedColumn - i), i = t.generatedColumn, null != t.source && (s = this._sources.indexOf(t.source), e += n.encode(s - d), d = s, e += n.encode(t.originalLine - 1 - u), u = t.originalLine - 1, e += n.encode(t.originalColumn - l), l = t.originalColumn, null != t.name && (r = this._names.indexOf(t.name), e += n.encode(r - c), c = r)), h += e;}return h;}, a.prototype._generateSourcesContent = function (e, t) {return e.map(function (e) {if (!this._sourcesContents) return null;null != t && (e = o.relative(t, e));var r = o.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents, r) ? this._sourcesContents[r] : null;}, this);}, a.prototype.toJSON = function () {var e = { version: this._version, sources: this._sources.toArray(), names: this._names.toArray(), mappings: this._serializeMappings() };return null != this._file && (e.file = this._file), null != this._sourceRoot && (e.sourceRoot = this._sourceRoot), this._sourcesContents && (e.sourcesContent = this._generateSourcesContent(e.sources, e.sourceRoot)), e;}, a.prototype.toString = function () {return JSON.stringify(this.toJSON());}, t.SourceMapGenerator = a;}, "./app/node_modules/source-map/lib/source-node.js": function (e, t, r) {var n = r("./app/node_modules/source-map/lib/source-map-generator.js").SourceMapGenerator, - o = r("./app/node_modules/source-map/lib/util.js"), - s = /(\r?\n)/, - i = "$$$isSourceNode$$$";function a(e, t, r, n, o) {this.children = [], this.sourceContents = {}, this.line = null == e ? null : e, this.column = null == t ? null : t, this.source = null == r ? null : r, this.name = null == o ? null : o, this[i] = !0, null != n && this.add(n);}a.fromStringWithSourceMap = function (e, t, r) {var n = new a(), - i = e.split(s), - l = 0, - u = function () {return e() + (e() || "");function e() {return l < i.length ? i[l++] : void 0;}}, - c = 1, - d = 0, - h = null;return t.eachMapping(function (e) {if (null !== h) {if (!(c < e.generatedLine)) {var t = (r = i[l] || "").substr(0, e.generatedColumn - d);return i[l] = r.substr(e.generatedColumn - d), d = e.generatedColumn, f(h, t), void (h = e);}f(h, u()), c++, d = 0;}for (; c < e.generatedLine;) n.add(u()), c++;if (d < e.generatedColumn) {var r = i[l] || "";n.add(r.substr(0, e.generatedColumn)), i[l] = r.substr(e.generatedColumn), d = e.generatedColumn;}h = e;}, this), l < i.length && (h && f(h, u()), n.add(i.splice(l).join(""))), t.sources.forEach(function (e) {var s = t.sourceContentFor(e);null != s && (null != r && (e = o.join(r, e)), n.setSourceContent(e, s));}), n;function f(e, t) {if (null === e || void 0 === e.source) n.add(t);else {var s = r ? o.join(r, e.source) : e.source;n.add(new a(e.originalLine, e.originalColumn, s, t, e.name));}}}, a.prototype.add = function (e) {if (Array.isArray(e)) e.forEach(function (e) {this.add(e);}, this);else {if (!e[i] && "string" != typeof e) throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + e);e && this.children.push(e);}return this;}, a.prototype.prepend = function (e) {if (Array.isArray(e)) for (var t = e.length - 1; t >= 0; t--) this.prepend(e[t]);else {if (!e[i] && "string" != typeof e) throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + e);this.children.unshift(e);}return this;}, a.prototype.walk = function (e) {for (var t, r = 0, n = this.children.length; r < n; r++) (t = this.children[r])[i] ? t.walk(e) : "" !== t && e(t, { source: this.source, line: this.line, column: this.column, name: this.name });}, a.prototype.join = function (e) {var t, - r, - n = this.children.length;if (n > 0) {for (t = [], r = 0; r < n - 1; r++) t.push(this.children[r]), t.push(e);t.push(this.children[r]), this.children = t;}return this;}, a.prototype.replaceRight = function (e, t) {var r = this.children[this.children.length - 1];return r[i] ? r.replaceRight(e, t) : "string" == typeof r ? this.children[this.children.length - 1] = r.replace(e, t) : this.children.push("".replace(e, t)), this;}, a.prototype.setSourceContent = function (e, t) {this.sourceContents[o.toSetString(e)] = t;}, a.prototype.walkSourceContents = function (e) {for (var t = 0, r = this.children.length; t < r; t++) this.children[t][i] && this.children[t].walkSourceContents(e);var n = Object.keys(this.sourceContents);for (t = 0, r = n.length; t < r; t++) e(o.fromSetString(n[t]), this.sourceContents[n[t]]);}, a.prototype.toString = function () {var e = "";return this.walk(function (t) {e += t;}), e;}, a.prototype.toStringWithSourceMap = function (e) {var t = { code: "", line: 1, column: 0 }, - r = new n(e), - o = !1, - s = null, - i = null, - a = null, - l = null;return this.walk(function (e, n) {t.code += e, null !== n.source && null !== n.line && null !== n.column ? (s === n.source && i === n.line && a === n.column && l === n.name || r.addMapping({ source: n.source, original: { line: n.line, column: n.column }, generated: { line: t.line, column: t.column }, name: n.name }), s = n.source, i = n.line, a = n.column, l = n.name, o = !0) : o && (r.addMapping({ generated: { line: t.line, column: t.column } }), s = null, o = !1);for (var u = 0, c = e.length; u < c; u++) 10 === e.charCodeAt(u) ? (t.line++, t.column = 0, u + 1 === c ? (s = null, o = !1) : o && r.addMapping({ source: n.source, original: { line: n.line, column: n.column }, generated: { line: t.line, column: t.column }, name: n.name })) : t.column++;}), this.walkSourceContents(function (e, t) {r.setSourceContent(e, t);}), { code: t.code, map: r };}, t.SourceNode = a;}, "./app/node_modules/source-map/lib/util.js": function (e, t) {t.getArg = function (e, t, r) {if (t in e) return e[t];if (3 === arguments.length) return r;throw new Error('"' + t + '" is a required argument.');};var r = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/, - n = /^data:.+\,.+$/;function o(e) {var t = e.match(r);return t ? { scheme: t[1], auth: t[2], host: t[3], port: t[4], path: t[5] } : null;}function s(e) {var t = "";return e.scheme && (t += e.scheme + ":"), t += "//", e.auth && (t += e.auth + "@"), e.host && (t += e.host), e.port && (t += ":" + e.port), e.path && (t += e.path), t;}function i(e) {var r = e, - n = o(e);if (n) {if (!n.path) return e;r = n.path;}for (var i, a = t.isAbsolute(r), l = r.split(/\/+/), u = 0, c = l.length - 1; c >= 0; c--) "." === (i = l[c]) ? l.splice(c, 1) : ".." === i ? u++ : u > 0 && ("" === i ? (l.splice(c + 1, u), u = 0) : (l.splice(c, 2), u--));return "" === (r = l.join("/")) && (r = a ? "/" : "."), n ? (n.path = r, s(n)) : r;}function a(e, t) {"" === e && (e = "."), "" === t && (t = ".");var r = o(t), - a = o(e);if (a && (e = a.path || "/"), r && !r.scheme) return a && (r.scheme = a.scheme), s(r);if (r || t.match(n)) return t;if (a && !a.host && !a.path) return a.host = t, s(a);var l = "/" === t.charAt(0) ? t : i(e.replace(/\/+$/, "") + "/" + t);return a ? (a.path = l, s(a)) : l;}t.urlParse = o, t.urlGenerate = s, t.normalize = i, t.join = a, t.isAbsolute = function (e) {return "/" === e.charAt(0) || r.test(e);}, t.relative = function (e, t) {"" === e && (e = "."), e = e.replace(/\/$/, "");for (var r = 0; 0 !== t.indexOf(e + "/");) {var n = e.lastIndexOf("/");if (n < 0) return t;if ((e = e.slice(0, n)).match(/^([^\/]+:\/)?\/*$/)) return t;++r;}return Array(r + 1).join("../") + t.substr(e.length + 1);};var l = !("__proto__" in Object.create(null));function u(e) {return e;}function c(e) {if (!e) return !1;var t = e.length;if (t < 9) return !1;if (95 !== e.charCodeAt(t - 1) || 95 !== e.charCodeAt(t - 2) || 111 !== e.charCodeAt(t - 3) || 116 !== e.charCodeAt(t - 4) || 111 !== e.charCodeAt(t - 5) || 114 !== e.charCodeAt(t - 6) || 112 !== e.charCodeAt(t - 7) || 95 !== e.charCodeAt(t - 8) || 95 !== e.charCodeAt(t - 9)) return !1;for (var r = t - 10; r >= 0; r--) if (36 !== e.charCodeAt(r)) return !1;return !0;}function d(e, t) {return e === t ? 0 : null === e ? 1 : null === t ? -1 : e > t ? 1 : -1;}t.toSetString = l ? u : function (e) {return c(e) ? "$" + e : e;}, t.fromSetString = l ? u : function (e) {return c(e) ? e.slice(1) : e;}, t.compareByOriginalPositions = function (e, t, r) {var n = d(e.source, t.source);return 0 !== n || 0 !== (n = e.originalLine - t.originalLine) || 0 !== (n = e.originalColumn - t.originalColumn) || r || 0 !== (n = e.generatedColumn - t.generatedColumn) || 0 !== (n = e.generatedLine - t.generatedLine) ? n : d(e.name, t.name);}, t.compareByGeneratedPositionsDeflated = function (e, t, r) {var n = e.generatedLine - t.generatedLine;return 0 !== n || 0 !== (n = e.generatedColumn - t.generatedColumn) || r || 0 !== (n = d(e.source, t.source)) || 0 !== (n = e.originalLine - t.originalLine) || 0 !== (n = e.originalColumn - t.originalColumn) ? n : d(e.name, t.name);}, t.compareByGeneratedPositionsInflated = function (e, t) {var r = e.generatedLine - t.generatedLine;return 0 !== r || 0 !== (r = e.generatedColumn - t.generatedColumn) || 0 !== (r = d(e.source, t.source)) || 0 !== (r = e.originalLine - t.originalLine) || 0 !== (r = e.originalColumn - t.originalColumn) ? r : d(e.name, t.name);}, t.parseSourceMapInput = function (e) {return JSON.parse(e.replace(/^\)]}'[^\n]*\n/, ""));}, t.computeSourceURL = function (e, t, r) {if (t = t || "", e && ("/" !== e[e.length - 1] && "/" !== t[0] && (e += "/"), t = e + t), r) {var n = o(r);if (!n) throw new Error("sourceMapURL could not be parsed");if (n.path) {var l = n.path.lastIndexOf("/");l >= 0 && (n.path = n.path.substring(0, l + 1));}t = a(s(n), t);}return i(t);};}, "./app/node_modules/source-map/source-map.js": function (e, t, r) {t.SourceMapGenerator = r("./app/node_modules/source-map/lib/source-map-generator.js").SourceMapGenerator, t.SourceMapConsumer = r("./app/node_modules/source-map/lib/source-map-consumer.js").SourceMapConsumer, t.SourceNode = r("./app/node_modules/source-map/lib/source-node.js").SourceNode;}, "./node_modules/balanced-match/index.js": function (e, t, r) {"use strict"; - function n(e, t, r) {e instanceof RegExp && (e = o(e, r)), t instanceof RegExp && (t = o(t, r));var n = s(e, t, r);return n && { start: n[0], end: n[1], pre: r.slice(0, n[0]), body: r.slice(n[0] + e.length, n[1]), post: r.slice(n[1] + t.length) };}function o(e, t) {var r = t.match(e);return r ? r[0] : null;}function s(e, t, r) {var n, - o, - s, - i, - a, - l = r.indexOf(e), - u = r.indexOf(t, l + 1), - c = l;if (l >= 0 && u > 0) {for (n = [], s = r.length; c >= 0 && !a;) c == l ? (n.push(c), l = r.indexOf(e, c + 1)) : 1 == n.length ? a = [n.pop(), u] : ((o = n.pop()) < s && (s = o, i = u), u = r.indexOf(t, c + 1)), c = l < u && l >= 0 ? l : u;n.length && (a = [s, i]);}return a;}e.exports = n, n.range = s;}, "./node_modules/brace-expansion/index.js": function (e, t, r) {var n = r("./node_modules/concat-map/index.js"), - o = r("./node_modules/balanced-match/index.js");e.exports = function (e) {if (!e) return [];"{}" === e.substr(0, 2) && (e = "\\{\\}" + e.substr(2));return function e(t, r) {var s = [], - i = o("{", "}", t);if (!i || /\$$/.test(i.pre)) return [t];var l, - u = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(i.body), - d = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(i.body), - g = u || d, - _ = i.body.indexOf(",") >= 0;if (!g && !_) return i.post.match(/,.*\}/) ? (t = i.pre + "{" + i.body + a + i.post, e(t)) : [t];if (g) l = i.body.split(/\.\./);else {if (1 === (l = function e(t) {if (!t) return [""];var r = [], - n = o("{", "}", t);if (!n) return t.split(",");var s = n.pre, - i = n.body, - a = n.post, - l = s.split(",");l[l.length - 1] += "{" + i + "}";var u = e(a);a.length && (l[l.length - 1] += u.shift(), l.push.apply(l, u));return r.push.apply(r, l), r;}(i.body)).length) if (1 === (l = e(l[0], !1).map(h)).length) return (y = i.post.length ? e(i.post, !1) : [""]).map(function (e) {return i.pre + l[0] + e;});}var v, - b = i.pre, - y = i.post.length ? e(i.post, !1) : [""];if (g) {var w = c(l[0]), - j = c(l[1]), - E = Math.max(l[0].length, l[1].length), - k = 3 == l.length ? Math.abs(c(l[2])) : 1, - S = p;j < w && (k *= -1, S = m);var C = l.some(f);v = [];for (var x = w; S(x, j); x += k) {var O;if (d) "\\" === (O = String.fromCharCode(x)) && (O = "");else if (O = String(x), C) {var A = E - O.length;if (A > 0) {var R = new Array(A + 1).join("0");O = x < 0 ? "-" + R + O.slice(1) : R + O;}}v.push(O);}} else v = n(l, function (t) {return e(t, !1);});for (var I = 0; I < v.length; I++) for (var T = 0; T < y.length; T++) {var L = b + v[I] + y[T];(!r || g || L) && s.push(L);}return s;}(function (e) {return e.split("\\\\").join(s).split("\\{").join(i).split("\\}").join(a).split("\\,").join(l).split("\\.").join(u);}(e), !0).map(d);};var s = "\0SLASH" + Math.random() + "\0", - i = "\0OPEN" + Math.random() + "\0", - a = "\0CLOSE" + Math.random() + "\0", - l = "\0COMMA" + Math.random() + "\0", - u = "\0PERIOD" + Math.random() + "\0";function c(e) {return parseInt(e, 10) == e ? parseInt(e, 10) : e.charCodeAt(0);}function d(e) {return e.split(s).join("\\").split(i).join("{").split(a).join("}").split(l).join(",").split(u).join(".");}function h(e) {return "{" + e + "}";}function f(e) {return /^-?0\d/.test(e);}function p(e, t) {return e <= t;}function m(e, t) {return e >= t;}}, "./node_modules/concat-map/index.js": function (e, t) {e.exports = function (e, t) {for (var n = [], o = 0; o < e.length; o++) {var s = t(e[o], o);r(s) ? n.push.apply(n, s) : n.push(s);}return n;};var r = Array.isArray || function (e) {return "[object Array]" === Object.prototype.toString.call(e);};}, "./node_modules/core-util-is/lib/util.js": function (e, t) {function r(e) {return Object.prototype.toString.call(e);}t.isArray = function (e) {return Array.isArray ? Array.isArray(e) : "[object Array]" === r(e);}, t.isBoolean = function (e) {return "boolean" == typeof e;}, t.isNull = function (e) {return null === e;}, t.isNullOrUndefined = function (e) {return null == e;}, t.isNumber = function (e) {return "number" == typeof e;}, t.isString = function (e) {return "string" == typeof e;}, t.isSymbol = function (e) {return "symbol" == typeof e;}, t.isUndefined = function (e) {return void 0 === e;}, t.isRegExp = function (e) {return "[object RegExp]" === r(e);}, t.isObject = function (e) {return "object" == typeof e && null !== e;}, t.isDate = function (e) {return "[object Date]" === r(e);}, t.isError = function (e) {return "[object Error]" === r(e) || e instanceof Error;}, t.isFunction = function (e) {return "function" == typeof e;}, t.isPrimitive = function (e) {return null === e || "boolean" == typeof e || "number" == typeof e || "string" == typeof e || "symbol" == typeof e || void 0 === e;}, t.isBuffer = Buffer.isBuffer;}, "./node_modules/debug/src/browser.js": function (e, t, r) {t.log = function (...e) {return "object" == typeof console && console.log && console.log(...e);}, t.formatArgs = function (t) {if (t[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + t[0] + (this.useColors ? "%c " : " ") + "+" + e.exports.humanize(this.diff), !this.useColors) return;const r = "color: " + this.color;t.splice(1, 0, r, "color: inherit");let n = 0, - o = 0;t[0].replace(/%[a-zA-Z%]/g, e => {"%%" !== e && (n++, "%c" === e && (o = n));}), t.splice(o, 0, r);}, t.save = function (e) {try {e ? t.storage.setItem("debug", e) : t.storage.removeItem("debug");} catch (e) {}}, t.load = function () {let e;try {e = t.storage.getItem("debug");} catch (e) {}!e && "undefined" != typeof process && "env" in process && (e = process.env.DEBUG);return e;}, t.useColors = function () {if ("undefined" != typeof window && window.process && ("renderer" === window.process.type || window.process.__nwjs)) return !0;if ("undefined" != typeof navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) return !1;return "undefined" != typeof document && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || "undefined" != typeof window && window.console && (window.console.firebug || window.console.exception && window.console.table) || "undefined" != typeof navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || "undefined" != typeof navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);}, t.storage = function () {try {return localStorage;} catch (e) {}}(), t.colors = ["#0000CC", "#0000FF", "#0033CC", "#0033FF", "#0066CC", "#0066FF", "#0099CC", "#0099FF", "#00CC00", "#00CC33", "#00CC66", "#00CC99", "#00CCCC", "#00CCFF", "#3300CC", "#3300FF", "#3333CC", "#3333FF", "#3366CC", "#3366FF", "#3399CC", "#3399FF", "#33CC00", "#33CC33", "#33CC66", "#33CC99", "#33CCCC", "#33CCFF", "#6600CC", "#6600FF", "#6633CC", "#6633FF", "#66CC00", "#66CC33", "#9900CC", "#9900FF", "#9933CC", "#9933FF", "#99CC00", "#99CC33", "#CC0000", "#CC0033", "#CC0066", "#CC0099", "#CC00CC", "#CC00FF", "#CC3300", "#CC3333", "#CC3366", "#CC3399", "#CC33CC", "#CC33FF", "#CC6600", "#CC6633", "#CC9900", "#CC9933", "#CCCC00", "#CCCC33", "#FF0000", "#FF0033", "#FF0066", "#FF0099", "#FF00CC", "#FF00FF", "#FF3300", "#FF3333", "#FF3366", "#FF3399", "#FF33CC", "#FF33FF", "#FF6600", "#FF6633", "#FF9900", "#FF9933", "#FFCC00", "#FFCC33"], e.exports = r("./node_modules/debug/src/common.js")(t);const { - formatters: n - } = e.exports;n.j = function (e) {try {return JSON.stringify(e);} catch (e) {return "[UnexpectedJSONParseError]: " + e.message;}};}, "./node_modules/debug/src/common.js": function (e, t, r) {e.exports = function (e) {function t(e) {let t = 0;for (let r = 0; r < e.length; r++) t = (t << 5) - t + e.charCodeAt(r), t |= 0;return n.colors[Math.abs(t) % n.colors.length];}function n(e) {let r;function i(...e) {if (!i.enabled) return;const t = i, - o = Number(new Date()), - s = o - (r || o);t.diff = s, t.prev = r, t.curr = o, r = o, e[0] = n.coerce(e[0]), "string" != typeof e[0] && e.unshift("%O");let a = 0;e[0] = e[0].replace(/%([a-zA-Z%])/g, (r, o) => {if ("%%" === r) return r;a++;const s = n.formatters[o];if ("function" == typeof s) {const n = e[a];r = s.call(t, n), e.splice(a, 1), a--;}return r;}), n.formatArgs.call(t, e);(t.log || n.log).apply(t, e);}return i.namespace = e, i.enabled = n.enabled(e), i.useColors = n.useColors(), i.color = t(e), i.destroy = o, i.extend = s, "function" == typeof n.init && n.init(i), n.instances.push(i), i;}function o() {const e = n.instances.indexOf(this);return -1 !== e && (n.instances.splice(e, 1), !0);}function s(e, t) {const r = n(this.namespace + (void 0 === t ? ":" : t) + e);return r.log = this.log, r;}function i(e) {return e.toString().substring(2, e.toString().length - 2).replace(/\.\*\?$/, "*");}return n.debug = n, n.default = n, n.coerce = function (e) {if (e instanceof Error) return e.stack || e.message;return e;}, n.disable = function () {const e = [...n.names.map(i), ...n.skips.map(i).map(e => "-" + e)].join(",");return n.enable(""), e;}, n.enable = function (e) {let t;n.save(e), n.names = [], n.skips = [];const r = ("string" == typeof e ? e : "").split(/[\s,]+/), - o = r.length;for (t = 0; t < o; t++) r[t] && ("-" === (e = r[t].replace(/\*/g, ".*?"))[0] ? n.skips.push(new RegExp("^" + e.substr(1) + "$")) : n.names.push(new RegExp("^" + e + "$")));for (t = 0; t < n.instances.length; t++) {const e = n.instances[t];e.enabled = n.enabled(e.namespace);}}, n.enabled = function (e) {if ("*" === e[e.length - 1]) return !0;let t, r;for (t = 0, r = n.skips.length; t < r; t++) if (n.skips[t].test(e)) return !1;for (t = 0, r = n.names.length; t < r; t++) if (n.names[t].test(e)) return !0;return !1;}, n.humanize = r("./node_modules/ms/index.js"), Object.keys(e).forEach(t => {n[t] = e[t];}), n.instances = [], n.names = [], n.skips = [], n.formatters = {}, n.selectColor = t, n.enable(n.load()), n;};}, "./node_modules/debug/src/index.js": function (e, t, r) {"undefined" == typeof process || "renderer" === process.type || !0 === process.browser || process.__nwjs ? e.exports = r("./node_modules/debug/src/browser.js") : e.exports = r("./node_modules/debug/src/node.js");}, "./node_modules/debug/src/node.js": function (e, t, r) {const n = r("tty"), - o = r("util");t.init = function (e) {e.inspectOpts = {};const r = Object.keys(t.inspectOpts);for (let n = 0; n < r.length; n++) e.inspectOpts[r[n]] = t.inspectOpts[r[n]];}, t.log = function (...e) {return process.stderr.write(o.format(...e) + "\n");}, t.formatArgs = function (r) {const { - namespace: n, - useColors: o - } = this;if (o) {const t = this.color, - o = "[3" + (t < 8 ? t : "8;5;" + t), - s = ` ${o};1m${n} `;r[0] = s + r[0].split("\n").join("\n" + s), r.push(o + "m+" + e.exports.humanize(this.diff) + "");} else r[0] = function () {if (t.inspectOpts.hideDate) return "";return new Date().toISOString() + " ";}() + n + " " + r[0];}, t.save = function (e) {e ? process.env.DEBUG = e : delete process.env.DEBUG;}, t.load = function () {return process.env.DEBUG;}, t.useColors = function () {return "colors" in t.inspectOpts ? Boolean(t.inspectOpts.colors) : n.isatty(process.stderr.fd);}, t.colors = [6, 2, 3, 4, 5, 1];try {const e = r("./node_modules/supports-color/index.js");e && (e.stderr || e).level >= 2 && (t.colors = [20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, 69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, 135, 148, 149, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 178, 179, 184, 185, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 214, 215, 220, 221]);} catch (e) {}t.inspectOpts = Object.keys(process.env).filter(e => /^debug_/i.test(e)).reduce((e, t) => {const r = t.substring(6).toLowerCase().replace(/_([a-z])/g, (e, t) => t.toUpperCase());let n = process.env[t];return n = !!/^(yes|on|true|enabled)$/i.test(n) || !/^(no|off|false|disabled)$/i.test(n) && ("null" === n ? null : Number(n)), e[r] = n, e;}, {}), e.exports = r("./node_modules/debug/src/common.js")(t);const { - formatters: s - } = e.exports;s.o = function (e) {return this.inspectOpts.colors = this.useColors, o.inspect(e, this.inspectOpts).replace(/\s*\n\s*/g, " ");}, s.O = function (e) {return this.inspectOpts.colors = this.useColors, o.inspect(e, this.inspectOpts);};}, "./node_modules/electron-debug sync recursive": function (e, t) {function r(e) {var t = new Error("Cannot find module '" + e + "'");throw t.code = "MODULE_NOT_FOUND", t;}r.keys = function () {return [];}, r.resolve = r, e.exports = r, r.id = "./node_modules/electron-debug sync recursive";}, "./node_modules/electron-debug/index.js": function (e, t, r) {"use strict"; - const { - app: n, - BrowserWindow: o, - session: s - } = r("electron"), - i = r("./node_modules/electron-localshortcut/index.js"), - a = r("./node_modules/electron-is-dev/index.js"), - l = "darwin" === process.platform, - u = {};function c(e = o.getFocusedWindow()) {e && function (e = o.getFocusedWindow()) {if (e) {const { - webContents: t - } = e;t.isDevToolsOpened() ? t.closeDevTools() : t.openDevTools(u);}}(e);}function d(e = o.getFocusedWindow()) {e && e.webContents.openDevTools(u);}function h(e = o.getFocusedWindow()) {e && e.webContents.reloadIgnoringCache();}function f() {const e = o.getFocusedWindow(), - t = () => {e.devToolsWebContents.executeJavaScript("DevToolsAPI.enterInspectElementMode()");};e && (e.webContents.isDevToolsOpened() ? t() : (e.webContents.once("devtools-opened", t), e.openDevTools()));}const p = (e, t) => {try {(e => s.defaultSession.getAllExtensions ? {}.hasOwnProperty.call(s.defaultSession.getAllExtensions(), e) : o.getDevToolsExtensions && {}.hasOwnProperty.call(o.getDevToolsExtensions(), e))(e) || (s.defaultSession.loadExtension ? s.defaultSession.loadExtension(t(e)) : o.addDevToolsExtension(t(e)));} catch (e) {}};e.exports = e => {!1 === (e = { isEnabled: null, showDevTools: !0, devToolsMode: "previous", ...e }).isEnabled || null === e.isEnabled && !a || ("previous" !== e.devToolsMode && (u.mode = e.devToolsMode), n.on("browser-window-created", (t, r) => {e.showDevTools && r.webContents.once("dom-ready", () => {d(r, e.showDevTools);});}), (async () => {await n.whenReady(), p("devtron", e => r("./node_modules/electron-debug sync recursive")(e).path), p("electron-react-devtools", e => r("./node_modules/electron-debug sync recursive")(e).path), i.register("CommandOrControl+Shift+C", f), i.register(l ? "Command+Alt+I" : "Control+Shift+I", c), i.register("F12", c), i.register("CommandOrControl+R", h), i.register("F5", h);})());}, e.exports.refresh = h, e.exports.devTools = c, e.exports.openDevTools = d;}, "./node_modules/electron-devtools-installer/dist/downloadChromeExtension.js": function (e, t, r) {"use strict"; - Object.defineProperty(t, "__esModule", { value: !0 }), t.default = void 0;var n = l(r("fs")), - o = l(r("path")), - s = l(r("./node_modules/rimraf/rimraf.js")), - i = l(r("./node_modules/unzip-crx/dist/index.js")), - a = r("./node_modules/electron-devtools-installer/dist/utils.js");function l(e) {return e && e.__esModule ? e : { default: e };}var u = function e(t, r) {var l = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 5, - u = (0, a.getPath)();n.default.existsSync(u) || n.default.mkdirSync(u, { recursive: !0 });var c = o.default.resolve("".concat(u, "/").concat(t));return new Promise(function (u, d) {if (!n.default.existsSync(c) || r) {n.default.existsSync(c) && s.default.sync(c);var h = "https://clients2.google.com/service/update2/crx?response=redirect&x=id%3D".concat(t, "%26uc&prodversion=32"), - f = o.default.resolve("".concat(c, ".crx"));(0, a.downloadFile)(h, f).then(function () {(0, i.default)(f, c).then(function () {(0, a.changePermissions)(c, 755), u(c);}).catch(function (e) {if (!n.default.existsSync(o.default.resolve(c, "manifest.json"))) return d(e);});}).catch(function (n) {if (console.log("Failed to fetch extension, trying ".concat(l - 1, " more times")), l <= 1) return d(n);setTimeout(function () {e(t, r, l - 1).then(u).catch(d);}, 200);});} else u(c);});};t.default = u;}, "./node_modules/electron-devtools-installer/dist/index.js": function (e, t, r) {"use strict"; - Object.defineProperty(t, "__esModule", { value: !0 }), t.MOBX_DEVTOOLS = t.APOLLO_DEVELOPER_TOOLS = t.CYCLEJS_DEVTOOL = t.REACT_PERF = t.REDUX_DEVTOOLS = t.VUEJS_DEVTOOLS = t.ANGULARJS_BATARANG = t.JQUERY_DEBUGGER = t.BACKBONE_DEBUGGER = t.REACT_DEVELOPER_TOOLS = t.EMBER_INSPECTOR = t.default = void 0;var n = r("electron"), - o = u(r("fs")), - s = u(r("path")), - i = u(r("./node_modules/electron-devtools-installer/node_modules/semver/index.js")), - a = u(r("./node_modules/electron-devtools-installer/dist/downloadChromeExtension.js")), - l = r("./node_modules/electron-devtools-installer/dist/utils.js");function u(e) {return e && e.__esModule ? e : { default: e };}function c(e, t, r) {return t in e ? Object.defineProperty(e, t, { value: r, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = r, e;}function d(e) {return (d = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) {return typeof e;} : function (e) {return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e;})(e);}var h = {}, - f = function () {return s.default.resolve((0, l.getPath)(), "IDMap.json");};if (o.default.existsSync(f())) try {h = JSON.parse(o.default.readFileSync(f(), "utf8"));} catch (e) {console.error("electron-devtools-installer: Invalid JSON present in the IDMap file");}var p = function e(t) {var r, - s = arguments.length > 1 && void 0 !== arguments[1] && arguments[1];if ("browser" !== process.type) return Promise.reject(new Error("electron-devtools-installer can only be used from the main process"));if (Array.isArray(t)) return t.reduce(function (t, r) {return t.then(function () {return e(r, s);});}, Promise.resolve());if ("object" === d(t) && t.id) {r = t.id;var l = process.versions.electron.split("-")[0];if (!i.default.satisfies(l, t.electron)) return Promise.reject(new Error("Version of Electron: ".concat(l, " does not match required range ").concat(t.electron, " for extension ").concat(r)));} else {if ("string" != typeof t) return Promise.reject(new Error('Invalid extensionReference passed in: "'.concat(t, '"')));r = t;}var u = h[r], - p = u && n.BrowserWindow.getDevToolsExtensions && n.BrowserWindow.getDevToolsExtensions()[u];return !s && p ? Promise.resolve(h[r]) : (0, a.default)(r, s).then(function (e) {p && n.BrowserWindow.removeDevToolsExtension(u);var t = n.BrowserWindow.addDevToolsExtension(e);return o.default.writeFileSync(f(), JSON.stringify(Object.assign(h, c({}, r, t)))), Promise.resolve(t);});};t.default = p;t.EMBER_INSPECTOR = { id: "bmdblncegkenkacieihfhpjfppoconhi", electron: ">=1.2.1" };t.REACT_DEVELOPER_TOOLS = { id: "fmkadmapgofadopljbjfkapdkoienihi", electron: ">=1.2.1" };t.BACKBONE_DEBUGGER = { id: "bhljhndlimiafopmmhjlgfpnnchjjbhd", electron: ">=1.2.1" };t.JQUERY_DEBUGGER = { id: "dbhhnnnpaeobfddmlalhnehgclcmjimi", electron: ">=1.2.1" };t.ANGULARJS_BATARANG = { id: "ighdmehidhipcmcojjgiloacoafjmpfk", electron: ">=1.2.1" };t.VUEJS_DEVTOOLS = { id: "nhdogjmejiglipccpnnnanhbledajbpd", electron: ">=1.2.1" };t.REDUX_DEVTOOLS = { id: "lmhkpmbekcpmknklioeibfkpmmfibljd", electron: ">=1.2.1" };t.REACT_PERF = { id: "hacmcodfllhbnekmghgdlplbdnahmhmm", electron: ">=1.2.6" };t.CYCLEJS_DEVTOOL = { id: "dfgplfmhhmdekalbpejekgfegkonjpfp", electron: ">=1.2.1" };t.APOLLO_DEVELOPER_TOOLS = { id: "jdkknkkbebbapilgoeccciglkfbmbnfm", electron: ">=1.2.1" };t.MOBX_DEVTOOLS = { id: "pfgnfdagidkfgccljigdamigbcnndkod", electron: ">=1.2.1" };}, "./node_modules/electron-devtools-installer/dist/utils.js": function (e, t, r) {"use strict"; - Object.defineProperty(t, "__esModule", { value: !0 }), t.changePermissions = t.downloadFile = t.getPath = void 0;var n = r("electron"), - o = a(r("fs")), - s = a(r("path")), - i = a(r("https"));function a(e) {return e && e.__esModule ? e : { default: e };}t.getPath = function () {var e = n.app.getPath("userData");return s.default.resolve("".concat(e, "/extensions"));};var l = n.net ? n.net.request : i.default.get;t.downloadFile = function e(t, r) {return new Promise(function (n, s) {var i = l(t);i.on("response", function (t) {if (t.statusCode >= 300 && t.statusCode < 400 && t.headers.location) return e(t.headers.location, r).then(n).catch(s);t.pipe(o.default.createWriteStream(r)).on("close", n), t.on("error", s);}), i.on("error", s), i.end();});};t.changePermissions = function e(t, r) {o.default.readdirSync(t).forEach(function (n) {var i = s.default.join(t, n);o.default.chmodSync(i, parseInt(r, 8)), o.default.statSync(i).isDirectory() && e(i, r);});};}, "./node_modules/electron-devtools-installer/node_modules/semver/classes/comparator.js": function (e, t, r) {const n = Symbol("SemVer ANY");class o { - static get ANY() {return n;}constructor(e, t) {if (t && "object" == typeof t || (t = { loose: !!t, includePrerelease: !1 }), e instanceof o) {if (e.loose === !!t.loose) return e;e = e.value;}l("comparator", e, t), this.options = t, this.loose = !!t.loose, this.parse(e), this.semver === n ? this.value = "" : this.value = this.operator + this.semver.version, l("comp", this);}parse(e) {const t = this.options.loose ? s[i.COMPARATORLOOSE] : s[i.COMPARATOR], - r = e.match(t);if (!r) throw new TypeError("Invalid comparator: " + e);this.operator = void 0 !== r[1] ? r[1] : "", "=" === this.operator && (this.operator = ""), r[2] ? this.semver = new u(r[2], this.options.loose) : this.semver = n;}toString() {return this.value;}test(e) {if (l("Comparator.test", e, this.options.loose), this.semver === n || e === n) return !0;if ("string" == typeof e) try {e = new u(e, this.options);} catch (e) {return !1;}return a(e, this.operator, this.semver, this.options);}intersects(e, t) {if (!(e instanceof o)) throw new TypeError("a Comparator is required");if (t && "object" == typeof t || (t = { loose: !!t, includePrerelease: !1 }), "" === this.operator) return "" === this.value || new c(e.value, t).test(this.value);if ("" === e.operator) return "" === e.value || new c(this.value, t).test(e.semver);const r = !(">=" !== this.operator && ">" !== this.operator || ">=" !== e.operator && ">" !== e.operator), - n = !("<=" !== this.operator && "<" !== this.operator || "<=" !== e.operator && "<" !== e.operator), - s = this.semver.version === e.semver.version, - i = !(">=" !== this.operator && "<=" !== this.operator || ">=" !== e.operator && "<=" !== e.operator), - l = a(this.semver, "<", e.semver, t) && (">=" === this.operator || ">" === this.operator) && ("<=" === e.operator || "<" === e.operator), - u = a(this.semver, ">", e.semver, t) && ("<=" === this.operator || "<" === this.operator) && (">=" === e.operator || ">" === e.operator);return r || n || s && i || l || u;} - }e.exports = o;const { - re: s, - t: i - } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js"), - a = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/cmp.js"), - l = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/debug.js"), - u = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), - c = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");}, "./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js": function (e, t, r) {class n { - constructor(e, t) {if (t && "object" == typeof t || (t = { loose: !!t, includePrerelease: !1 }), e instanceof n) return e.loose === !!t.loose && e.includePrerelease === !!t.includePrerelease ? e : new n(e.raw, t);if (e instanceof o) return this.raw = e.value, this.set = [[e]], this.format(), this;if (this.options = t, this.loose = !!t.loose, this.includePrerelease = !!t.includePrerelease, this.raw = e, this.set = e.split(/\s*\|\|\s*/).map(e => this.parseRange(e.trim())).filter(e => e.length), !this.set.length) throw new TypeError("Invalid SemVer Range: " + e);this.format();}format() {return this.range = this.set.map(e => e.join(" ").trim()).join("||").trim(), this.range;}toString() {return this.range;}parseRange(e) {const t = this.options.loose;e = e.trim();const r = t ? a[l.HYPHENRANGELOOSE] : a[l.HYPHENRANGE];e = e.replace(r, E(this.options.includePrerelease)), s("hyphen replace", e), e = e.replace(a[l.COMPARATORTRIM], u), s("comparator trim", e, a[l.COMPARATORTRIM]), e = (e = (e = e.replace(a[l.TILDETRIM], c)).replace(a[l.CARETTRIM], d)).split(/\s+/).join(" ");const n = t ? a[l.COMPARATORLOOSE] : a[l.COMPARATOR];return e.split(" ").map(e => f(e, this.options)).join(" ").split(/\s+/).map(e => j(e, this.options)).filter(this.options.loose ? e => !!e.match(n) : () => !0).map(e => new o(e, this.options));}intersects(e, t) {if (!(e instanceof n)) throw new TypeError("a Range is required");return this.set.some(r => h(r, t) && e.set.some(e => h(e, t) && r.every(r => e.every(e => r.intersects(e, t)))));}test(e) {if (!e) return !1;if ("string" == typeof e) try {e = new i(e, this.options);} catch (e) {return !1;}for (let t = 0; t < this.set.length; t++) if (k(this.set[t], e, this.options)) return !0;return !1;} - }e.exports = n;const o = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/comparator.js"), - s = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/debug.js"), - i = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), - { - re: a, - t: l, - comparatorTrimReplace: u, - tildeTrimReplace: c, - caretTrimReplace: d - } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js"), - h = (e, t) => {let r = !0;const n = e.slice();let o = n.pop();for (; r && n.length;) r = n.every(e => o.intersects(e, t)), o = n.pop();return r;}, - f = (e, t) => (s("comp", e, t), e = _(e, t), s("caret", e), e = m(e, t), s("tildes", e), e = b(e, t), s("xrange", e), e = w(e, t), s("stars", e), e), - p = e => !e || "x" === e.toLowerCase() || "*" === e, - m = (e, t) => e.trim().split(/\s+/).map(e => g(e, t)).join(" "), - g = (e, t) => {const r = t.loose ? a[l.TILDELOOSE] : a[l.TILDE];return e.replace(r, (t, r, n, o, i) => {let a;return s("tilde", e, t, r, n, o, i), p(r) ? a = "" : p(n) ? a = `>=${r}.0.0 <${+r + 1}.0.0-0` : p(o) ? a = `>=${r}.${n}.0 <${r}.${+n + 1}.0-0` : i ? (s("replaceTilde pr", i), a = `>=${r}.${n}.${o}-${i} <${r}.${+n + 1}.0-0`) : a = `>=${r}.${n}.${o} <${r}.${+n + 1}.0-0`, s("tilde return", a), a;});}, - _ = (e, t) => e.trim().split(/\s+/).map(e => v(e, t)).join(" "), - v = (e, t) => {s("caret", e, t);const r = t.loose ? a[l.CARETLOOSE] : a[l.CARET], - n = t.includePrerelease ? "-0" : "";return e.replace(r, (t, r, o, i, a) => {let l;return s("caret", e, t, r, o, i, a), p(r) ? l = "" : p(o) ? l = `>=${r}.0.0${n} <${+r + 1}.0.0-0` : p(i) ? l = "0" === r ? `>=${r}.${o}.0${n} <${r}.${+o + 1}.0-0` : `>=${r}.${o}.0${n} <${+r + 1}.0.0-0` : a ? (s("replaceCaret pr", a), l = "0" === r ? "0" === o ? `>=${r}.${o}.${i}-${a} <${r}.${o}.${+i + 1}-0` : `>=${r}.${o}.${i}-${a} <${r}.${+o + 1}.0-0` : `>=${r}.${o}.${i}-${a} <${+r + 1}.0.0-0`) : (s("no pr"), l = "0" === r ? "0" === o ? `>=${r}.${o}.${i}${n} <${r}.${o}.${+i + 1}-0` : `>=${r}.${o}.${i}${n} <${r}.${+o + 1}.0-0` : `>=${r}.${o}.${i} <${+r + 1}.0.0-0`), s("caret return", l), l;});}, - b = (e, t) => (s("replaceXRanges", e, t), e.split(/\s+/).map(e => y(e, t)).join(" ")), - y = (e, t) => {e = e.trim();const r = t.loose ? a[l.XRANGELOOSE] : a[l.XRANGE];return e.replace(r, (r, n, o, i, a, l) => {s("xRange", e, r, n, o, i, a, l);const u = p(o), - c = u || p(i), - d = c || p(a), - h = d;return "=" === n && h && (n = ""), l = t.includePrerelease ? "-0" : "", u ? r = ">" === n || "<" === n ? "<0.0.0-0" : "*" : n && h ? (c && (i = 0), a = 0, ">" === n ? (n = ">=", c ? (o = +o + 1, i = 0, a = 0) : (i = +i + 1, a = 0)) : "<=" === n && (n = "<", c ? o = +o + 1 : i = +i + 1), "<" === n && (l = "-0"), r = `${n + o}.${i}.${a}${l}`) : c ? r = `>=${o}.0.0${l} <${+o + 1}.0.0-0` : d && (r = `>=${o}.${i}.0${l} <${o}.${+i + 1}.0-0`), s("xRange return", r), r;});}, - w = (e, t) => (s("replaceStars", e, t), e.trim().replace(a[l.STAR], "")), - j = (e, t) => (s("replaceGTE0", e, t), e.trim().replace(a[t.includePrerelease ? l.GTE0PRE : l.GTE0], "")), - E = e => (t, r, n, o, s, i, a, l, u, c, d, h, f) => `${r = p(n) ? "" : p(o) ? `>=${n}.0.0${e ? "-0" : ""}` : p(s) ? `>=${n}.${o}.0${e ? "-0" : ""}` : i ? ">=" + r : `>=${r}${e ? "-0" : ""}`} ${l = p(u) ? "" : p(c) ? `<${+u + 1}.0.0-0` : p(d) ? `<${u}.${+c + 1}.0-0` : h ? `<=${u}.${c}.${d}-${h}` : e ? `<${u}.${c}.${+d + 1}-0` : "<=" + l}`.trim(), - k = (e, t, r) => {for (let r = 0; r < e.length; r++) if (!e[r].test(t)) return !1;if (t.prerelease.length && !r.includePrerelease) {for (let r = 0; r < e.length; r++) if (s(e[r].semver), e[r].semver !== o.ANY && e[r].semver.prerelease.length > 0) {const n = e[r].semver;if (n.major === t.major && n.minor === t.minor && n.patch === t.patch) return !0;}return !1;}return !0;};}, "./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/debug.js"), - { - MAX_LENGTH: o, - MAX_SAFE_INTEGER: s - } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/constants.js"), - { - re: i, - t: a - } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js"), - { - compareIdentifiers: l - } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/identifiers.js");class u { - constructor(e, t) {if (t && "object" == typeof t || (t = { loose: !!t, includePrerelease: !1 }), e instanceof u) {if (e.loose === !!t.loose && e.includePrerelease === !!t.includePrerelease) return e;e = e.version;} else if ("string" != typeof e) throw new TypeError("Invalid Version: " + e);if (e.length > o) throw new TypeError(`version is longer than ${o} characters`);n("SemVer", e, t), this.options = t, this.loose = !!t.loose, this.includePrerelease = !!t.includePrerelease;const r = e.trim().match(t.loose ? i[a.LOOSE] : i[a.FULL]);if (!r) throw new TypeError("Invalid Version: " + e);if (this.raw = e, this.major = +r[1], this.minor = +r[2], this.patch = +r[3], this.major > s || this.major < 0) throw new TypeError("Invalid major version");if (this.minor > s || this.minor < 0) throw new TypeError("Invalid minor version");if (this.patch > s || this.patch < 0) throw new TypeError("Invalid patch version");r[4] ? this.prerelease = r[4].split(".").map(e => {if (/^[0-9]+$/.test(e)) {const t = +e;if (t >= 0 && t < s) return t;}return e;}) : this.prerelease = [], this.build = r[5] ? r[5].split(".") : [], this.format();}format() {return this.version = `${this.major}.${this.minor}.${this.patch}`, this.prerelease.length && (this.version += "-" + this.prerelease.join(".")), this.version;}toString() {return this.version;}compare(e) {if (n("SemVer.compare", this.version, this.options, e), !(e instanceof u)) {if ("string" == typeof e && e === this.version) return 0;e = new u(e, this.options);}return e.version === this.version ? 0 : this.compareMain(e) || this.comparePre(e);}compareMain(e) {return e instanceof u || (e = new u(e, this.options)), l(this.major, e.major) || l(this.minor, e.minor) || l(this.patch, e.patch);}comparePre(e) {if (e instanceof u || (e = new u(e, this.options)), this.prerelease.length && !e.prerelease.length) return -1;if (!this.prerelease.length && e.prerelease.length) return 1;if (!this.prerelease.length && !e.prerelease.length) return 0;let t = 0;do {const r = this.prerelease[t], - o = e.prerelease[t];if (n("prerelease compare", t, r, o), void 0 === r && void 0 === o) return 0;if (void 0 === o) return 1;if (void 0 === r) return -1;if (r !== o) return l(r, o);} while (++t);}compareBuild(e) {e instanceof u || (e = new u(e, this.options));let t = 0;do {const r = this.build[t], - o = e.build[t];if (n("prerelease compare", t, r, o), void 0 === r && void 0 === o) return 0;if (void 0 === o) return 1;if (void 0 === r) return -1;if (r !== o) return l(r, o);} while (++t);}inc(e, t) {switch (e) {case "premajor": - this.prerelease.length = 0, this.patch = 0, this.minor = 0, this.major++, this.inc("pre", t); - break; - case "preminor": - this.prerelease.length = 0, this.patch = 0, this.minor++, this.inc("pre", t); - break; - case "prepatch": - this.prerelease.length = 0, this.inc("patch", t), this.inc("pre", t); - break; - case "prerelease": - 0 === this.prerelease.length && this.inc("patch", t), this.inc("pre", t); - break; - case "major": - 0 === this.minor && 0 === this.patch && 0 !== this.prerelease.length || this.major++, this.minor = 0, this.patch = 0, this.prerelease = []; - break; - case "minor": - 0 === this.patch && 0 !== this.prerelease.length || this.minor++, this.patch = 0, this.prerelease = []; - break; - case "patch": - 0 === this.prerelease.length && this.patch++, this.prerelease = []; - break; - case "pre": - if (0 === this.prerelease.length) this.prerelease = [0];else {let e = this.prerelease.length;for (; --e >= 0;) "number" == typeof this.prerelease[e] && (this.prerelease[e]++, e = -2);-1 === e && this.prerelease.push(0);} - t && (this.prerelease[0] === t ? isNaN(this.prerelease[1]) && (this.prerelease = [t, 0]) : this.prerelease = [t, 0]); - break; - default: - throw new Error("invalid increment argument: " + e); - }return this.format(), this.raw = this.version, this;} - }e.exports = u;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/clean.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js");e.exports = (e, t) => {const r = n(e.trim().replace(/^[=v]+/, ""), t);return r ? r.version : null;};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/cmp.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/eq.js"), - o = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/neq.js"), - s = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gt.js"), - i = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gte.js"), - a = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/lt.js"), - l = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/lte.js");e.exports = (e, t, r, u) => {switch (t) {case "===": - return "object" == typeof e && (e = e.version), "object" == typeof r && (r = r.version), e === r; - case "!==": - return "object" == typeof e && (e = e.version), "object" == typeof r && (r = r.version), e !== r; - case "":case "=":case "==": - return n(e, r, u); - case "!=": - return o(e, r, u); - case ">": - return s(e, r, u); - case ">=": - return i(e, r, u); - case "<": - return a(e, r, u); - case "<=": - return l(e, r, u); - default: - throw new TypeError("Invalid operator: " + t); - }};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/coerce.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), - o = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js"), - { - re: s, - t: i - } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js");e.exports = (e, t) => {if (e instanceof n) return e;if ("number" == typeof e && (e = String(e)), "string" != typeof e) return null;let r = null;if ((t = t || {}).rtl) {let t;for (; (t = s[i.COERCERTL].exec(e)) && (!r || r.index + r[0].length !== e.length);) r && t.index + t[0].length === r.index + r[0].length || (r = t), s[i.COERCERTL].lastIndex = t.index + t[1].length + t[2].length;s[i.COERCERTL].lastIndex = -1;} else r = e.match(s[i.COERCE]);return null === r ? null : o(`${r[2]}.${r[3] || "0"}.${r[4] || "0"}`, t);};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/compare-build.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t, r) => {const o = new n(e, r), - s = new n(t, r);return o.compare(s) || o.compareBuild(s);};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/compare-loose.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t) => n(e, t, !0);}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t, r) => new n(e, r).compare(new n(t, r));}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/diff.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js"), - o = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/eq.js");e.exports = (e, t) => {if (o(e, t)) return null;{const r = n(e), - o = n(t), - s = r.prerelease.length || o.prerelease.length, - i = s ? "pre" : "", - a = s ? "prerelease" : "";for (const e in r) if (("major" === e || "minor" === e || "patch" === e) && r[e] !== o[e]) return i + e;return a;}};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/eq.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => 0 === n(e, t, r);}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/gt.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => n(e, t, r) > 0;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/gte.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => n(e, t, r) >= 0;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/inc.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t, r, o) => {"string" == typeof r && (o = r, r = void 0);try {return new n(e, r).inc(t, o).version;} catch (e) {return null;}};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/lt.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => n(e, t, r) < 0;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/lte.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => n(e, t, r) <= 0;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/major.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t) => new n(e, t).major;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/minor.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t) => new n(e, t).minor;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/neq.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => 0 !== n(e, t, r);}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js": function (e, t, r) {const { - MAX_LENGTH: n - } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/constants.js"), - { - re: o, - t: s - } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js"), - i = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t) => {if (t && "object" == typeof t || (t = { loose: !!t, includePrerelease: !1 }), e instanceof i) return e;if ("string" != typeof e) return null;if (e.length > n) return null;if (!(t.loose ? o[s.LOOSE] : o[s.FULL]).test(e)) return null;try {return new i(e, t);} catch (e) {return null;}};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/patch.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js");e.exports = (e, t) => new n(e, t).patch;}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/prerelease.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js");e.exports = (e, t) => {const r = n(e, t);return r && r.prerelease.length ? r.prerelease : null;};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/rcompare.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => n(t, e, r);}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/rsort.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare-build.js");e.exports = (e, t) => e.sort((e, r) => n(r, e, t));}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/satisfies.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");e.exports = (e, t, r) => {try {t = new n(t, r);} catch (e) {return !1;}return t.test(e);};}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/sort.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare-build.js");e.exports = (e, t) => e.sort((e, r) => n(e, r, t));}, "./node_modules/electron-devtools-installer/node_modules/semver/functions/valid.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js");e.exports = (e, t) => {const r = n(e, t);return r ? r.version : null;};}, "./node_modules/electron-devtools-installer/node_modules/semver/index.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js");e.exports = { re: n.re, src: n.src, tokens: n.t, SEMVER_SPEC_VERSION: r("./node_modules/electron-devtools-installer/node_modules/semver/internal/constants.js").SEMVER_SPEC_VERSION, SemVer: r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), compareIdentifiers: r("./node_modules/electron-devtools-installer/node_modules/semver/internal/identifiers.js").compareIdentifiers, rcompareIdentifiers: r("./node_modules/electron-devtools-installer/node_modules/semver/internal/identifiers.js").rcompareIdentifiers, parse: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/parse.js"), valid: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/valid.js"), clean: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/clean.js"), inc: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/inc.js"), diff: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/diff.js"), major: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/major.js"), minor: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/minor.js"), patch: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/patch.js"), prerelease: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/prerelease.js"), compare: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js"), rcompare: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/rcompare.js"), compareLoose: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare-loose.js"), compareBuild: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare-build.js"), sort: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/sort.js"), rsort: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/rsort.js"), gt: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gt.js"), lt: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/lt.js"), eq: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/eq.js"), neq: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/neq.js"), gte: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gte.js"), lte: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/lte.js"), cmp: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/cmp.js"), coerce: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/coerce.js"), Comparator: r("./node_modules/electron-devtools-installer/node_modules/semver/classes/comparator.js"), Range: r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js"), satisfies: r("./node_modules/electron-devtools-installer/node_modules/semver/functions/satisfies.js"), toComparators: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/to-comparators.js"), maxSatisfying: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/max-satisfying.js"), minSatisfying: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/min-satisfying.js"), minVersion: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/min-version.js"), validRange: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/valid.js"), outside: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/outside.js"), gtr: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/gtr.js"), ltr: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/ltr.js"), intersects: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/intersects.js"), simplifyRange: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/simplify.js"), subset: r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/subset.js") };}, "./node_modules/electron-devtools-installer/node_modules/semver/internal/constants.js": function (e, t) {const r = Number.MAX_SAFE_INTEGER || 9007199254740991;e.exports = { SEMVER_SPEC_VERSION: "2.0.0", MAX_LENGTH: 256, MAX_SAFE_INTEGER: r, MAX_SAFE_COMPONENT_LENGTH: 16 };}, "./node_modules/electron-devtools-installer/node_modules/semver/internal/debug.js": function (e, t) {const r = "object" == typeof process && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...e) => console.error("SEMVER", ...e) : () => {};e.exports = r;}, "./node_modules/electron-devtools-installer/node_modules/semver/internal/identifiers.js": function (e, t) {const r = /^[0-9]+$/, - n = (e, t) => {const n = r.test(e), - o = r.test(t);return n && o && (e = +e, t = +t), e === t ? 0 : n && !o ? -1 : o && !n ? 1 : e < t ? -1 : 1;};e.exports = { compareIdentifiers: n, rcompareIdentifiers: (e, t) => n(t, e) };}, "./node_modules/electron-devtools-installer/node_modules/semver/internal/re.js": function (e, t, r) {const { - MAX_SAFE_COMPONENT_LENGTH: n - } = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/constants.js"), - o = r("./node_modules/electron-devtools-installer/node_modules/semver/internal/debug.js"), - s = (t = e.exports = {}).re = [], - i = t.src = [], - a = t.t = {};let l = 0;const u = (e, t, r) => {const n = l++;o(n, t), a[e] = n, i[n] = t, s[n] = new RegExp(t, r ? "g" : void 0);};u("NUMERICIDENTIFIER", "0|[1-9]\\d*"), u("NUMERICIDENTIFIERLOOSE", "[0-9]+"), u("NONNUMERICIDENTIFIER", "\\d*[a-zA-Z-][a-zA-Z0-9-]*"), u("MAINVERSION", `(${i[a.NUMERICIDENTIFIER]})\\.(${i[a.NUMERICIDENTIFIER]})\\.(${i[a.NUMERICIDENTIFIER]})`), u("MAINVERSIONLOOSE", `(${i[a.NUMERICIDENTIFIERLOOSE]})\\.(${i[a.NUMERICIDENTIFIERLOOSE]})\\.(${i[a.NUMERICIDENTIFIERLOOSE]})`), u("PRERELEASEIDENTIFIER", `(?:${i[a.NUMERICIDENTIFIER]}|${i[a.NONNUMERICIDENTIFIER]})`), u("PRERELEASEIDENTIFIERLOOSE", `(?:${i[a.NUMERICIDENTIFIERLOOSE]}|${i[a.NONNUMERICIDENTIFIER]})`), u("PRERELEASE", `(?:-(${i[a.PRERELEASEIDENTIFIER]}(?:\\.${i[a.PRERELEASEIDENTIFIER]})*))`), u("PRERELEASELOOSE", `(?:-?(${i[a.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${i[a.PRERELEASEIDENTIFIERLOOSE]})*))`), u("BUILDIDENTIFIER", "[0-9A-Za-z-]+"), u("BUILD", `(?:\\+(${i[a.BUILDIDENTIFIER]}(?:\\.${i[a.BUILDIDENTIFIER]})*))`), u("FULLPLAIN", `v?${i[a.MAINVERSION]}${i[a.PRERELEASE]}?${i[a.BUILD]}?`), u("FULL", `^${i[a.FULLPLAIN]}$`), u("LOOSEPLAIN", `[v=\\s]*${i[a.MAINVERSIONLOOSE]}${i[a.PRERELEASELOOSE]}?${i[a.BUILD]}?`), u("LOOSE", `^${i[a.LOOSEPLAIN]}$`), u("GTLT", "((?:<|>)?=?)"), u("XRANGEIDENTIFIERLOOSE", i[a.NUMERICIDENTIFIERLOOSE] + "|x|X|\\*"), u("XRANGEIDENTIFIER", i[a.NUMERICIDENTIFIER] + "|x|X|\\*"), u("XRANGEPLAIN", `[v=\\s]*(${i[a.XRANGEIDENTIFIER]})(?:\\.(${i[a.XRANGEIDENTIFIER]})(?:\\.(${i[a.XRANGEIDENTIFIER]})(?:${i[a.PRERELEASE]})?${i[a.BUILD]}?)?)?`), u("XRANGEPLAINLOOSE", `[v=\\s]*(${i[a.XRANGEIDENTIFIERLOOSE]})(?:\\.(${i[a.XRANGEIDENTIFIERLOOSE]})(?:\\.(${i[a.XRANGEIDENTIFIERLOOSE]})(?:${i[a.PRERELEASELOOSE]})?${i[a.BUILD]}?)?)?`), u("XRANGE", `^${i[a.GTLT]}\\s*${i[a.XRANGEPLAIN]}$`), u("XRANGELOOSE", `^${i[a.GTLT]}\\s*${i[a.XRANGEPLAINLOOSE]}$`), u("COERCE", `(^|[^\\d])(\\d{1,${n}})(?:\\.(\\d{1,${n}}))?(?:\\.(\\d{1,${n}}))?(?:$|[^\\d])`), u("COERCERTL", i[a.COERCE], !0), u("LONETILDE", "(?:~>?)"), u("TILDETRIM", `(\\s*)${i[a.LONETILDE]}\\s+`, !0), t.tildeTrimReplace = "$1~", u("TILDE", `^${i[a.LONETILDE]}${i[a.XRANGEPLAIN]}$`), u("TILDELOOSE", `^${i[a.LONETILDE]}${i[a.XRANGEPLAINLOOSE]}$`), u("LONECARET", "(?:\\^)"), u("CARETTRIM", `(\\s*)${i[a.LONECARET]}\\s+`, !0), t.caretTrimReplace = "$1^", u("CARET", `^${i[a.LONECARET]}${i[a.XRANGEPLAIN]}$`), u("CARETLOOSE", `^${i[a.LONECARET]}${i[a.XRANGEPLAINLOOSE]}$`), u("COMPARATORLOOSE", `^${i[a.GTLT]}\\s*(${i[a.LOOSEPLAIN]})$|^$`), u("COMPARATOR", `^${i[a.GTLT]}\\s*(${i[a.FULLPLAIN]})$|^$`), u("COMPARATORTRIM", `(\\s*)${i[a.GTLT]}\\s*(${i[a.LOOSEPLAIN]}|${i[a.XRANGEPLAIN]})`, !0), t.comparatorTrimReplace = "$1$2$3", u("HYPHENRANGE", `^\\s*(${i[a.XRANGEPLAIN]})\\s+-\\s+(${i[a.XRANGEPLAIN]})\\s*$`), u("HYPHENRANGELOOSE", `^\\s*(${i[a.XRANGEPLAINLOOSE]})\\s+-\\s+(${i[a.XRANGEPLAINLOOSE]})\\s*$`), u("STAR", "(<|>)?=?\\s*\\*"), u("GTE0", "^\\s*>=\\s*0.0.0\\s*$"), u("GTE0PRE", "^\\s*>=\\s*0.0.0-0\\s*$");}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/gtr.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/outside.js");e.exports = (e, t, r) => n(e, t, ">", r);}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/intersects.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");e.exports = (e, t, r) => (e = new n(e, r), t = new n(t, r), e.intersects(t));}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/ltr.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/ranges/outside.js");e.exports = (e, t, r) => n(e, t, "<", r);}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/max-satisfying.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), - o = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");e.exports = (e, t, r) => {let s = null, - i = null, - a = null;try {a = new o(t, r);} catch (e) {return null;}return e.forEach(e => {a.test(e) && (s && -1 !== i.compare(e) || (s = e, i = new n(s, r)));}), s;};}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/min-satisfying.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), - o = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");e.exports = (e, t, r) => {let s = null, - i = null, - a = null;try {a = new o(t, r);} catch (e) {return null;}return e.forEach(e => {a.test(e) && (s && 1 !== i.compare(e) || (s = e, i = new n(s, r)));}), s;};}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/min-version.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), - o = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js"), - s = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gt.js");e.exports = (e, t) => {e = new o(e, t);let r = new n("0.0.0");if (e.test(r)) return r;if (r = new n("0.0.0-0"), e.test(r)) return r;r = null;for (let t = 0; t < e.set.length; ++t) {e.set[t].forEach(e => {const t = new n(e.semver.version);switch (e.operator) {case ">": - 0 === t.prerelease.length ? t.patch++ : t.prerelease.push(0), t.raw = t.format(); - case "":case ">=": - r && !s(r, t) || (r = t); - break; - case "<":case "<=": - break; - default: - throw new Error("Unexpected operation: " + e.operator); - }});}return r && e.test(r) ? r : null;};}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/outside.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/semver.js"), - o = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/comparator.js"), - { - ANY: s - } = o, - i = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js"), - a = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/satisfies.js"), - l = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gt.js"), - u = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/lt.js"), - c = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/lte.js"), - d = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/gte.js");e.exports = (e, t, r, h) => {let f, p, m, g, _;switch (e = new n(e, h), t = new i(t, h), r) {case ">": - f = l, p = c, m = u, g = ">", _ = ">="; - break; - case "<": - f = u, p = d, m = l, g = "<", _ = "<="; - break; - default: - throw new TypeError('Must provide a hilo val of "<" or ">"'); - }if (a(e, t, h)) return !1;for (let r = 0; r < t.set.length; ++r) {const n = t.set[r];let i = null, - a = null;if (n.forEach(e => {e.semver === s && (e = new o(">=0.0.0")), i = i || e, a = a || e, f(e.semver, i.semver, h) ? i = e : m(e.semver, a.semver, h) && (a = e);}), i.operator === g || i.operator === _) return !1;if ((!a.operator || a.operator === g) && p(e, a.semver)) return !1;if (a.operator === _ && m(e, a.semver)) return !1;}return !0;};}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/simplify.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/satisfies.js"), - o = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js");e.exports = (e, t, r) => {const s = [];let i = null, - a = null;const l = e.sort((e, t) => o(e, t, r));for (const e of l) {n(e, t, r) ? (a = e, i || (i = e)) : (a && s.push([i, a]), a = null, i = null);}i && s.push([i, null]);const u = [];for (const [e, t] of s) e === t ? u.push(e) : t || e !== l[0] ? t ? e === l[0] ? u.push("<=" + t) : u.push(`${e} - ${t}`) : u.push(">=" + e) : u.push("*");const c = u.join(" || "), - d = "string" == typeof t.raw ? t.raw : String(t);return c.length < d.length ? c : t;};}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/subset.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js"), - { - ANY: o - } = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/comparator.js"), - s = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/satisfies.js"), - i = r("./node_modules/electron-devtools-installer/node_modules/semver/functions/compare.js"), - a = (e, t, r) => {if (1 === e.length && e[0].semver === o) return 1 === t.length && t[0].semver === o;const n = new Set();let a, c, d, h, f, p, m;for (const t of e) ">" === t.operator || ">=" === t.operator ? a = l(a, t, r) : "<" === t.operator || "<=" === t.operator ? c = u(c, t, r) : n.add(t.semver);if (n.size > 1) return null;if (a && c) {if (d = i(a.semver, c.semver, r), d > 0) return null;if (0 === d && (">=" !== a.operator || "<=" !== c.operator)) return null;}for (const e of n) {if (a && !s(e, String(a), r)) return null;if (c && !s(e, String(c), r)) return null;for (const n of t) if (!s(e, String(n), r)) return !1;return !0;}for (const e of t) {if (m = m || ">" === e.operator || ">=" === e.operator, p = p || "<" === e.operator || "<=" === e.operator, a) if (">" === e.operator || ">=" === e.operator) {if (h = l(a, e, r), h === e) return !1;} else if (">=" === a.operator && !s(a.semver, String(e), r)) return !1;if (c) if ("<" === e.operator || "<=" === e.operator) {if (f = u(c, e, r), f === e) return !1;} else if ("<=" === c.operator && !s(c.semver, String(e), r)) return !1;if (!e.operator && (c || a) && 0 !== d) return !1;}return !(a && p && !c && 0 !== d) && !(c && m && !a && 0 !== d);}, - l = (e, t, r) => {if (!e) return t;const n = i(e.semver, t.semver, r);return n > 0 ? e : n < 0 || ">" === t.operator && ">=" === e.operator ? t : e;}, - u = (e, t, r) => {if (!e) return t;const n = i(e.semver, t.semver, r);return n < 0 ? e : n > 0 || "<" === t.operator && "<=" === e.operator ? t : e;};e.exports = (e, t, r) => {e = new n(e, r), t = new n(t, r);let o = !1;e: for (const n of e.set) {for (const e of t.set) {const t = a(n, e, r);if (o = o || null !== t, t) continue e;}if (o) return !1;}return !0;};}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/to-comparators.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");e.exports = (e, t) => new n(e, t).set.map(e => e.map(e => e.value).join(" ").trim().split(" "));}, "./node_modules/electron-devtools-installer/node_modules/semver/ranges/valid.js": function (e, t, r) {const n = r("./node_modules/electron-devtools-installer/node_modules/semver/classes/range.js");e.exports = (e, t) => {try {return new n(e, t).range || "*";} catch (e) {return null;}};}, "./node_modules/electron-is-accelerator/index.js": function (e, t, r) {"use strict"; - const n = /^(Command|Cmd|Control|Ctrl|CommandOrControl|CmdOrCtrl|Alt|Option|AltGr|Shift|Super)$/, - o = /^([0-9A-Z)!@#$%^&*(:+<_>?~{|}";=,\-./`[\\\]']|F1*[1-9]|F10|F2[0-4]|Plus|Space|Tab|Backspace|Delete|Insert|Return|Enter|Up|Down|Left|Right|Home|End|PageUp|PageDown|Escape|Esc|VolumeUp|VolumeDown|VolumeMute|MediaNextTrack|MediaPreviousTrack|MediaStop|MediaPlayPause|PrintScreen)$/;e.exports = function (e) {let t = e.split("+"), - r = !1;return t.every((e, s) => {const i = o.test(e), - a = n.test(e);if (i) {if (r) return !1;r = !0;}return !(s === t.length - 1 && !r) && (i || a);});};}, "./node_modules/electron-is-dev/index.js": function (e, t, r) {"use strict"; - const n = r("electron");if ("string" == typeof n) throw new TypeError("Not running in an Electron environment!");const o = n.app || n.remote.app, - s = "ELECTRON_IS_DEV" in process.env, - i = 1 === parseInt(process.env.ELECTRON_IS_DEV, 10);e.exports = s ? i : !o.isPackaged;}, "./node_modules/electron-localshortcut/index.js": function (e, t, r) {"use strict"; - const { - app: n, - BrowserWindow: o - } = r("electron"), - s = r("./node_modules/electron-is-accelerator/index.js"), - i = r("./node_modules/keyboardevents-areequal/index.js"), - { - toKeyEvent: a - } = r("./node_modules/keyboardevent-from-electron-accelerator/index.js"), - l = r("./node_modules/debug/src/index.js")("electron-localshortcut"), - u = {}, - c = new WeakMap(), - d = e => {if (e) try {return e.getTitle();} catch (e) {return "A destroyed window";}return "An falsy value";};function h(e) {if (!s(e)) {const t = {};Error.captureStackTrace(t);const r = `\nWARNING: ${e} is not a valid accelerator.\n\n${t.stack ? t.stack.split("\n").slice(4).join("\n") : t.message}\n`;console.error(r);}}function f(e, t) {let r = 0;for (const n of t) {if (i(n.eventStamp, e)) return r;r++;}return -1;}const p = e => (t, r) => {if ("keyUp" === r.type) return;const n = function (e) {const t = { code: e.code, key: e.key };return ["alt", "shift", "meta"].forEach(r => {void 0 !== e[r] && (t[r + "Key"] = e[r]);}), void 0 !== e.control && (t.ctrlKey = e.control), t;}(r);l(`before-input-event: ${r} is translated to: ${n}`);for (const { - eventStamp: t, - callback: r - } of e) {if (i(t, n)) return l(`eventStamp: ${t} match`), void r();l(`eventStamp: ${t} no match`);}};e.exports = { register: function e(t, r, s) {let i, f;if (void 0 === s ? (i = u, s = r, r = t) : i = t.webContents, !0 === Array.isArray(r)) return void r.forEach(r => {"string" == typeof r && e(t, r, s);});if (l(`Registering callback for ${r} on window ${d(t)}`), h(r), l(r + " seems a valid shortcut sequence."), c.has(i)) l("Window has others shortcuts registered."), f = c.get(i);else if (l("This is the first shortcut of the window."), f = [], c.set(i, f), i === u) {const e = p(f), - t = (t, r) => {const n = r.webContents;n.on("before-input-event", e), n.once("closed", () => n.removeListener("before-input-event", e));};o.getAllWindows().forEach(e => t(null, e)), n.on("browser-window-created", t), f.removeListener = () => {o.getAllWindows().forEach(t => t.webContents.removeListener("before-input-event", e)), n.removeListener("browser-window-created", t);};} else {const e = p(f);i.on("before-input-event", e), f.removeListener = () => i.removeListener("before-input-event", e), i.once("closed", f.removeListener);}l("Adding shortcut to window set.");const m = a(r);f.push({ eventStamp: m, callback: s, enabled: !0 }), l("Shortcut registered.");}, unregister: function e(t, r) {let n;if (void 0 === r) n = u, r = t;else {if (t.isDestroyed()) return void l("Early return because window is destroyed.");n = t.webContents;}if (!0 === Array.isArray(r)) return void r.forEach(r => {"string" == typeof r && e(t, r);});if (l(`Unregistering callback for ${r} on window ${d(t)}`), h(r), l(r + " seems a valid shortcut sequence."), !c.has(n)) return void l("Early return because window has never had shortcuts registered.");const o = c.get(n), - s = f(a(r), o);-1 !== s && (o.splice(s, 1), 0 === o.length && (o.removeListener(), c.delete(n)));}, isRegistered: function (e, t) {h(t);const r = e.webContents, - n = c.get(r);return -1 !== f(a(t), n);}, unregisterAll: function (e) {l("Unregistering all shortcuts on window " + d(e));const t = e.webContents, - r = c.get(t);r && r.removeListener && (r.removeListener(), c.delete(t));}, enableAll: function (e) {l("Enabling all shortcuts on window " + d(e));const t = e.webContents, - r = c.get(t);for (const e of r) e.enabled = !0;}, disableAll: function (e) {l("Disabling all shortcuts on window " + d(e));const t = e.webContents, - r = c.get(t);for (const e of r) e.enabled = !1;} };}, "./node_modules/fs.realpath/index.js": function (e, t, r) {e.exports = c, c.realpath = c, c.sync = d, c.realpathSync = d, c.monkeypatch = function () {n.realpath = c, n.realpathSync = d;}, c.unmonkeypatch = function () {n.realpath = o, n.realpathSync = s;};var n = r("fs"), - o = n.realpath, - s = n.realpathSync, - i = process.version, - a = /^v[0-5]\./.test(i), - l = r("./node_modules/fs.realpath/old.js");function u(e) {return e && "realpath" === e.syscall && ("ELOOP" === e.code || "ENOMEM" === e.code || "ENAMETOOLONG" === e.code);}function c(e, t, r) {if (a) return o(e, t, r);"function" == typeof t && (r = t, t = null), o(e, t, function (n, o) {u(n) ? l.realpath(e, t, r) : r(n, o);});}function d(e, t) {if (a) return s(e, t);try {return s(e, t);} catch (r) {if (u(r)) return l.realpathSync(e, t);throw r;}}}, "./node_modules/fs.realpath/old.js": function (e, t, r) {var n = r("path"), - o = "win32" === process.platform, - s = r("fs"), - i = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);function a(e) {return "function" == typeof e ? e : function () {var e;if (i) {var t = new Error();e = function (e) {e && (t.message = e.message, r(e = t));};} else e = r;return e;function r(e) {if (e) {if (process.throwDeprecation) throw e;if (!process.noDeprecation) {var t = "fs: missing callback " + (e.stack || e.message);process.traceDeprecation ? console.trace(t) : console.error(t);}}}}();}n.normalize;if (o) var l = /(.*?)(?:[\/\\]+|$)/g;else l = /(.*?)(?:[\/]+|$)/g;if (o) var u = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/;else u = /^[\/]*/;t.realpathSync = function (e, t) {if (e = n.resolve(e), t && Object.prototype.hasOwnProperty.call(t, e)) return t[e];var r, - i, - a, - c, - d = e, - h = {}, - f = {};function p() {var t = u.exec(e);r = t[0].length, i = t[0], a = t[0], c = "", o && !f[a] && (s.lstatSync(a), f[a] = !0);}for (p(); r < e.length;) {l.lastIndex = r;var m = l.exec(e);if (c = i, i += m[0], a = c + m[1], r = l.lastIndex, !(f[a] || t && t[a] === a)) {var g;if (t && Object.prototype.hasOwnProperty.call(t, a)) g = t[a];else {var _ = s.lstatSync(a);if (!_.isSymbolicLink()) {f[a] = !0, t && (t[a] = a);continue;}var v = null;if (!o) {var b = _.dev.toString(32) + ":" + _.ino.toString(32);h.hasOwnProperty(b) && (v = h[b]);}null === v && (s.statSync(a), v = s.readlinkSync(a)), g = n.resolve(c, v), t && (t[a] = g), o || (h[b] = v);}e = n.resolve(g, e.slice(r)), p();}}return t && (t[d] = e), e;}, t.realpath = function (e, t, r) {if ("function" != typeof r && (r = a(t), t = null), e = n.resolve(e), t && Object.prototype.hasOwnProperty.call(t, e)) return process.nextTick(r.bind(null, null, t[e]));var i, - c, - d, - h, - f = e, - p = {}, - m = {};function g() {var t = u.exec(e);i = t[0].length, c = t[0], d = t[0], h = "", o && !m[d] ? s.lstat(d, function (e) {if (e) return r(e);m[d] = !0, _();}) : process.nextTick(_);}function _() {if (i >= e.length) return t && (t[f] = e), r(null, e);l.lastIndex = i;var n = l.exec(e);return h = c, c += n[0], d = h + n[1], i = l.lastIndex, m[d] || t && t[d] === d ? process.nextTick(_) : t && Object.prototype.hasOwnProperty.call(t, d) ? y(t[d]) : s.lstat(d, v);}function v(e, n) {if (e) return r(e);if (!n.isSymbolicLink()) return m[d] = !0, t && (t[d] = d), process.nextTick(_);if (!o) {var i = n.dev.toString(32) + ":" + n.ino.toString(32);if (p.hasOwnProperty(i)) return b(null, p[i], d);}s.stat(d, function (e) {if (e) return r(e);s.readlink(d, function (e, t) {o || (p[i] = t), b(e, t);});});}function b(e, o, s) {if (e) return r(e);var i = n.resolve(h, o);t && (t[s] = i), y(i);}function y(t) {e = n.resolve(t, e.slice(i)), g();}g();};}, "./node_modules/glob/common.js": function (e, t, r) {function n(e, t) {return Object.prototype.hasOwnProperty.call(e, t);}t.alphasort = u, t.alphasorti = l, t.setopts = function (e, t, r) {r || (r = {});if (r.matchBase && -1 === t.indexOf("/")) {if (r.noglobstar) throw new Error("base matching requires globstar");t = "**/" + t;}e.silent = !!r.silent, e.pattern = t, e.strict = !1 !== r.strict, e.realpath = !!r.realpath, e.realpathCache = r.realpathCache || Object.create(null), e.follow = !!r.follow, e.dot = !!r.dot, e.mark = !!r.mark, e.nodir = !!r.nodir, e.nodir && (e.mark = !0);e.sync = !!r.sync, e.nounique = !!r.nounique, e.nonull = !!r.nonull, e.nosort = !!r.nosort, e.nocase = !!r.nocase, e.stat = !!r.stat, e.noprocess = !!r.noprocess, e.absolute = !!r.absolute, e.maxLength = r.maxLength || 1 / 0, e.cache = r.cache || Object.create(null), e.statCache = r.statCache || Object.create(null), e.symlinks = r.symlinks || Object.create(null), function (e, t) {e.ignore = t.ignore || [], Array.isArray(e.ignore) || (e.ignore = [e.ignore]);e.ignore.length && (e.ignore = e.ignore.map(c));}(e, r), e.changedCwd = !1;var s = process.cwd();n(r, "cwd") ? (e.cwd = o.resolve(r.cwd), e.changedCwd = e.cwd !== s) : e.cwd = s;e.root = r.root || o.resolve(e.cwd, "/"), e.root = o.resolve(e.root), "win32" === process.platform && (e.root = e.root.replace(/\\/g, "/"));e.cwdAbs = i(e.cwd) ? e.cwd : d(e, e.cwd), "win32" === process.platform && (e.cwdAbs = e.cwdAbs.replace(/\\/g, "/"));e.nomount = !!r.nomount, r.nonegate = !0, r.nocomment = !0, e.minimatch = new a(t, r), e.options = e.minimatch.options;}, t.ownProp = n, t.makeAbs = d, t.finish = function (e) {for (var t = e.nounique, r = t ? [] : Object.create(null), n = 0, o = e.matches.length; n < o; n++) {var s = e.matches[n];if (s && 0 !== Object.keys(s).length) {var i = Object.keys(s);t ? r.push.apply(r, i) : i.forEach(function (e) {r[e] = !0;});} else if (e.nonull) {var a = e.minimatch.globSet[n];t ? r.push(a) : r[a] = !0;}}t || (r = Object.keys(r));e.nosort || (r = r.sort(e.nocase ? l : u));if (e.mark) {for (n = 0; n < r.length; n++) r[n] = e._mark(r[n]);e.nodir && (r = r.filter(function (t) {var r = !/\/$/.test(t), - n = e.cache[t] || e.cache[d(e, t)];return r && n && (r = "DIR" !== n && !Array.isArray(n)), r;}));}e.ignore.length && (r = r.filter(function (t) {return !h(e, t);}));e.found = r;}, t.mark = function (e, t) {var r = d(e, t), - n = e.cache[r], - o = t;if (n) {var s = "DIR" === n || Array.isArray(n), - i = "/" === t.slice(-1);if (s && !i ? o += "/" : !s && i && (o = o.slice(0, -1)), o !== t) {var a = d(e, o);e.statCache[a] = e.statCache[r], e.cache[a] = e.cache[r];}}return o;}, t.isIgnored = h, t.childrenIgnored = function (e, t) {return !!e.ignore.length && e.ignore.some(function (e) {return !(!e.gmatcher || !e.gmatcher.match(t));});};var o = r("path"), - s = r("./node_modules/minimatch/minimatch.js"), - i = r("./node_modules/path-is-absolute/index.js"), - a = s.Minimatch;function l(e, t) {return e.toLowerCase().localeCompare(t.toLowerCase());}function u(e, t) {return e.localeCompare(t);}function c(e) {var t = null;if ("/**" === e.slice(-3)) {var r = e.replace(/(\/\*\*)+$/, "");t = new a(r, { dot: !0 });}return { matcher: new a(e, { dot: !0 }), gmatcher: t };}function d(e, t) {var r = t;return r = "/" === t.charAt(0) ? o.join(e.root, t) : i(t) || "" === t ? t : e.changedCwd ? o.resolve(e.cwd, t) : o.resolve(t), "win32" === process.platform && (r = r.replace(/\\/g, "/")), r;}function h(e, t) {return !!e.ignore.length && e.ignore.some(function (e) {return e.matcher.match(t) || !(!e.gmatcher || !e.gmatcher.match(t));});}}, "./node_modules/glob/glob.js": function (e, t, r) {e.exports = b;var n = r("fs"), - o = r("./node_modules/fs.realpath/index.js"), - s = r("./node_modules/minimatch/minimatch.js"), - i = (s.Minimatch, r("./node_modules/inherits/inherits.js")), - a = r("events").EventEmitter, - l = r("path"), - u = r("assert"), - c = r("./node_modules/path-is-absolute/index.js"), - d = r("./node_modules/glob/sync.js"), - h = r("./node_modules/glob/common.js"), - f = (h.alphasort, h.alphasorti, h.setopts), - p = h.ownProp, - m = r("./node_modules/inflight/inflight.js"), - g = (r("util"), h.childrenIgnored), - _ = h.isIgnored, - v = r("./node_modules/once/once.js");function b(e, t, r) {if ("function" == typeof t && (r = t, t = {}), t || (t = {}), t.sync) {if (r) throw new TypeError("callback provided to sync glob");return d(e, t);}return new w(e, t, r);}b.sync = d;var y = b.GlobSync = d.GlobSync;function w(e, t, r) {if ("function" == typeof t && (r = t, t = null), t && t.sync) {if (r) throw new TypeError("callback provided to sync glob");return new y(e, t);}if (!(this instanceof w)) return new w(e, t, r);f(this, e, t), this._didRealPath = !1;var n = this.minimatch.set.length;this.matches = new Array(n), "function" == typeof r && (r = v(r), this.on("error", r), this.on("end", function (e) {r(null, e);}));var o = this;if (this._processing = 0, this._emitQueue = [], this._processQueue = [], this.paused = !1, this.noprocess) return this;if (0 === n) return i();for (var s = 0; s < n; s++) this._process(this.minimatch.set[s], s, !1, i);function i() {--o._processing, o._processing <= 0 && o._finish();}}b.glob = b, b.hasMagic = function (e, t) {var r = function (e, t) {if (null === t || "object" != typeof t) return e;for (var r = Object.keys(t), n = r.length; n--;) e[r[n]] = t[r[n]];return e;}({}, t);r.noprocess = !0;var n = new w(e, r).minimatch.set;if (!e) return !1;if (n.length > 1) return !0;for (var o = 0; o < n[0].length; o++) if ("string" != typeof n[0][o]) return !0;return !1;}, b.Glob = w, i(w, a), w.prototype._finish = function () {if (u(this instanceof w), !this.aborted) {if (this.realpath && !this._didRealpath) return this._realpath();h.finish(this), this.emit("end", this.found);}}, w.prototype._realpath = function () {if (!this._didRealpath) {this._didRealpath = !0;var e = this.matches.length;if (0 === e) return this._finish();for (var t = this, r = 0; r < this.matches.length; r++) this._realpathSet(r, n);}function n() {0 == --e && t._finish();}}, w.prototype._realpathSet = function (e, t) {var r = this.matches[e];if (!r) return t();var n = Object.keys(r), - s = this, - i = n.length;if (0 === i) return t();var a = this.matches[e] = Object.create(null);n.forEach(function (r, n) {r = s._makeAbs(r), o.realpath(r, s.realpathCache, function (n, o) {n ? "stat" === n.syscall ? a[r] = !0 : s.emit("error", n) : a[o] = !0, 0 == --i && (s.matches[e] = a, t());});});}, w.prototype._mark = function (e) {return h.mark(this, e);}, w.prototype._makeAbs = function (e) {return h.makeAbs(this, e);}, w.prototype.abort = function () {this.aborted = !0, this.emit("abort");}, w.prototype.pause = function () {this.paused || (this.paused = !0, this.emit("pause"));}, w.prototype.resume = function () {if (this.paused) {if (this.emit("resume"), this.paused = !1, this._emitQueue.length) {var e = this._emitQueue.slice(0);this._emitQueue.length = 0;for (var t = 0; t < e.length; t++) {var r = e[t];this._emitMatch(r[0], r[1]);}}if (this._processQueue.length) {var n = this._processQueue.slice(0);this._processQueue.length = 0;for (t = 0; t < n.length; t++) {var o = n[t];this._processing--, this._process(o[0], o[1], o[2], o[3]);}}}}, w.prototype._process = function (e, t, r, n) {if (u(this instanceof w), u("function" == typeof n), !this.aborted) if (this._processing++, this.paused) this._processQueue.push([e, t, r, n]);else {for (var o, i = 0; "string" == typeof e[i];) i++;switch (i) {case e.length: - return void this._processSimple(e.join("/"), t, n); - case 0: - o = null; - break; - default: - o = e.slice(0, i).join("/"); - }var a, - l = e.slice(i);null === o ? a = "." : c(o) || c(e.join("/")) ? (o && c(o) || (o = "/" + o), a = o) : a = o;var d = this._makeAbs(a);if (g(this, a)) return n();l[0] === s.GLOBSTAR ? this._processGlobStar(o, a, d, l, t, r, n) : this._processReaddir(o, a, d, l, t, r, n);}}, w.prototype._processReaddir = function (e, t, r, n, o, s, i) {var a = this;this._readdir(r, s, function (l, u) {return a._processReaddir2(e, t, r, n, o, s, u, i);});}, w.prototype._processReaddir2 = function (e, t, r, n, o, s, i, a) {if (!i) return a();for (var u = n[0], c = !!this.minimatch.negate, d = u._glob, h = this.dot || "." === d.charAt(0), f = [], p = 0; p < i.length; p++) {if ("." !== (g = i[p]).charAt(0) || h) (c && !e ? !g.match(u) : g.match(u)) && f.push(g);}var m = f.length;if (0 === m) return a();if (1 === n.length && !this.mark && !this.stat) {this.matches[o] || (this.matches[o] = Object.create(null));for (p = 0; p < m; p++) {var g = f[p];e && (g = "/" !== e ? e + "/" + g : e + g), "/" !== g.charAt(0) || this.nomount || (g = l.join(this.root, g)), this._emitMatch(o, g);}return a();}n.shift();for (p = 0; p < m; p++) {g = f[p];e && (g = "/" !== e ? e + "/" + g : e + g), this._process([g].concat(n), o, s, a);}a();}, w.prototype._emitMatch = function (e, t) {if (!this.aborted && !_(this, t)) if (this.paused) this._emitQueue.push([e, t]);else {var r = c(t) ? t : this._makeAbs(t);if (this.mark && (t = this._mark(t)), this.absolute && (t = r), !this.matches[e][t]) {if (this.nodir) {var n = this.cache[r];if ("DIR" === n || Array.isArray(n)) return;}this.matches[e][t] = !0;var o = this.statCache[r];o && this.emit("stat", t, o), this.emit("match", t);}}}, w.prototype._readdirInGlobStar = function (e, t) {if (!this.aborted) {if (this.follow) return this._readdir(e, !1, t);var r = this, - o = m("lstat\0" + e, function (n, o) {if (n && "ENOENT" === n.code) return t();var s = o && o.isSymbolicLink();r.symlinks[e] = s, s || !o || o.isDirectory() ? r._readdir(e, !1, t) : (r.cache[e] = "FILE", t());});o && n.lstat(e, o);}}, w.prototype._readdir = function (e, t, r) {if (!this.aborted && (r = m("readdir\0" + e + "\0" + t, r))) {if (t && !p(this.symlinks, e)) return this._readdirInGlobStar(e, r);if (p(this.cache, e)) {var o = this.cache[e];if (!o || "FILE" === o) return r();if (Array.isArray(o)) return r(null, o);}n.readdir(e, function (e, t, r) {return function (n, o) {n ? e._readdirError(t, n, r) : e._readdirEntries(t, o, r);};}(this, e, r));}}, w.prototype._readdirEntries = function (e, t, r) {if (!this.aborted) {if (!this.mark && !this.stat) for (var n = 0; n < t.length; n++) {var o = t[n];o = "/" === e ? e + o : e + "/" + o, this.cache[o] = !0;}return this.cache[e] = t, r(null, t);}}, w.prototype._readdirError = function (e, t, r) {if (!this.aborted) {switch (t.code) {case "ENOTSUP":case "ENOTDIR": - var n = this._makeAbs(e); - - if (this.cache[n] = "FILE", n === this.cwdAbs) {var o = new Error(t.code + " invalid cwd " + this.cwd);o.path = this.cwd, o.code = t.code, this.emit("error", o), this.abort();} - - break; - case "ENOENT":case "ELOOP":case "ENAMETOOLONG":case "UNKNOWN": - this.cache[this._makeAbs(e)] = !1; - break; - default: - this.cache[this._makeAbs(e)] = !1, this.strict && (this.emit("error", t), this.abort()), this.silent || console.error("glob error", t); - }return r();}}, w.prototype._processGlobStar = function (e, t, r, n, o, s, i) {var a = this;this._readdir(r, s, function (l, u) {a._processGlobStar2(e, t, r, n, o, s, u, i);});}, w.prototype._processGlobStar2 = function (e, t, r, n, o, s, i, a) {if (!i) return a();var l = n.slice(1), - u = e ? [e] : [], - c = u.concat(l);this._process(c, o, !1, a);var d = this.symlinks[r], - h = i.length;if (d && s) return a();for (var f = 0; f < h; f++) {if ("." !== i[f].charAt(0) || this.dot) {var p = u.concat(i[f], l);this._process(p, o, !0, a);var m = u.concat(i[f], n);this._process(m, o, !0, a);}}a();}, w.prototype._processSimple = function (e, t, r) {var n = this;this._stat(e, function (o, s) {n._processSimple2(e, t, o, s, r);});}, w.prototype._processSimple2 = function (e, t, r, n, o) {if (this.matches[t] || (this.matches[t] = Object.create(null)), !n) return o();if (e && c(e) && !this.nomount) {var s = /[\/\\]$/.test(e);"/" === e.charAt(0) ? e = l.join(this.root, e) : (e = l.resolve(this.root, e), s && (e += "/"));}"win32" === process.platform && (e = e.replace(/\\/g, "/")), this._emitMatch(t, e), o();}, w.prototype._stat = function (e, t) {var r = this._makeAbs(e), - o = "/" === e.slice(-1);if (e.length > this.maxLength) return t();if (!this.stat && p(this.cache, r)) {var s = this.cache[r];if (Array.isArray(s) && (s = "DIR"), !o || "DIR" === s) return t(null, s);if (o && "FILE" === s) return t();}var i = this.statCache[r];if (void 0 !== i) {if (!1 === i) return t(null, i);var a = i.isDirectory() ? "DIR" : "FILE";return o && "FILE" === a ? t() : t(null, a, i);}var l = this, - u = m("stat\0" + r, function (o, s) {if (s && s.isSymbolicLink()) return n.stat(r, function (n, o) {n ? l._stat2(e, r, null, s, t) : l._stat2(e, r, n, o, t);});l._stat2(e, r, o, s, t);});u && n.lstat(r, u);}, w.prototype._stat2 = function (e, t, r, n, o) {if (r && ("ENOENT" === r.code || "ENOTDIR" === r.code)) return this.statCache[t] = !1, o();var s = "/" === e.slice(-1);if (this.statCache[t] = n, "/" === t.slice(-1) && n && !n.isDirectory()) return o(null, !1, n);var i = !0;return n && (i = n.isDirectory() ? "DIR" : "FILE"), this.cache[t] = this.cache[t] || i, s && "FILE" === i ? o() : o(null, i, n);};}, "./node_modules/glob/sync.js": function (e, t, r) {e.exports = p, p.GlobSync = m;var n = r("fs"), - o = r("./node_modules/fs.realpath/index.js"), - s = r("./node_modules/minimatch/minimatch.js"), - i = (s.Minimatch, r("./node_modules/glob/glob.js").Glob, r("util"), r("path")), - a = r("assert"), - l = r("./node_modules/path-is-absolute/index.js"), - u = r("./node_modules/glob/common.js"), - c = (u.alphasort, u.alphasorti, u.setopts), - d = u.ownProp, - h = u.childrenIgnored, - f = u.isIgnored;function p(e, t) {if ("function" == typeof t || 3 === arguments.length) throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");return new m(e, t).found;}function m(e, t) {if (!e) throw new Error("must provide pattern");if ("function" == typeof t || 3 === arguments.length) throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");if (!(this instanceof m)) return new m(e, t);if (c(this, e, t), this.noprocess) return this;var r = this.minimatch.set.length;this.matches = new Array(r);for (var n = 0; n < r; n++) this._process(this.minimatch.set[n], n, !1);this._finish();}m.prototype._finish = function () {if (a(this instanceof m), this.realpath) {var e = this;this.matches.forEach(function (t, r) {var n = e.matches[r] = Object.create(null);for (var s in t) try {s = e._makeAbs(s), n[o.realpathSync(s, e.realpathCache)] = !0;} catch (t) {if ("stat" !== t.syscall) throw t;n[e._makeAbs(s)] = !0;}});}u.finish(this);}, m.prototype._process = function (e, t, r) {a(this instanceof m);for (var n, o = 0; "string" == typeof e[o];) o++;switch (o) {case e.length: - return void this._processSimple(e.join("/"), t); - case 0: - n = null; - break; - default: - n = e.slice(0, o).join("/"); - }var i, - u = e.slice(o);null === n ? i = "." : l(n) || l(e.join("/")) ? (n && l(n) || (n = "/" + n), i = n) : i = n;var c = this._makeAbs(i);h(this, i) || (u[0] === s.GLOBSTAR ? this._processGlobStar(n, i, c, u, t, r) : this._processReaddir(n, i, c, u, t, r));}, m.prototype._processReaddir = function (e, t, r, n, o, s) {var a = this._readdir(r, s);if (a) {for (var l = n[0], u = !!this.minimatch.negate, c = l._glob, d = this.dot || "." === c.charAt(0), h = [], f = 0; f < a.length; f++) {if ("." !== (g = a[f]).charAt(0) || d) (u && !e ? !g.match(l) : g.match(l)) && h.push(g);}var p = h.length;if (0 !== p) if (1 !== n.length || this.mark || this.stat) {n.shift();for (f = 0; f < p; f++) {var m;g = h[f];m = e ? [e, g] : [g], this._process(m.concat(n), o, s);}} else {this.matches[o] || (this.matches[o] = Object.create(null));for (var f = 0; f < p; f++) {var g = h[f];e && (g = "/" !== e.slice(-1) ? e + "/" + g : e + g), "/" !== g.charAt(0) || this.nomount || (g = i.join(this.root, g)), this._emitMatch(o, g);}}}}, m.prototype._emitMatch = function (e, t) {if (!f(this, t)) {var r = this._makeAbs(t);if (this.mark && (t = this._mark(t)), this.absolute && (t = r), !this.matches[e][t]) {if (this.nodir) {var n = this.cache[r];if ("DIR" === n || Array.isArray(n)) return;}this.matches[e][t] = !0, this.stat && this._stat(t);}}}, m.prototype._readdirInGlobStar = function (e) {if (this.follow) return this._readdir(e, !1);var t, r;try {r = n.lstatSync(e);} catch (e) {if ("ENOENT" === e.code) return null;}var o = r && r.isSymbolicLink();return this.symlinks[e] = o, o || !r || r.isDirectory() ? t = this._readdir(e, !1) : this.cache[e] = "FILE", t;}, m.prototype._readdir = function (e, t) {if (t && !d(this.symlinks, e)) return this._readdirInGlobStar(e);if (d(this.cache, e)) {var r = this.cache[e];if (!r || "FILE" === r) return null;if (Array.isArray(r)) return r;}try {return this._readdirEntries(e, n.readdirSync(e));} catch (t) {return this._readdirError(e, t), null;}}, m.prototype._readdirEntries = function (e, t) {if (!this.mark && !this.stat) for (var r = 0; r < t.length; r++) {var n = t[r];n = "/" === e ? e + n : e + "/" + n, this.cache[n] = !0;}return this.cache[e] = t, t;}, m.prototype._readdirError = function (e, t) {switch (t.code) {case "ENOTSUP":case "ENOTDIR": - var r = this._makeAbs(e); - - if (this.cache[r] = "FILE", r === this.cwdAbs) {var n = new Error(t.code + " invalid cwd " + this.cwd);throw n.path = this.cwd, n.code = t.code, n;} - - break; - case "ENOENT":case "ELOOP":case "ENAMETOOLONG":case "UNKNOWN": - this.cache[this._makeAbs(e)] = !1; - break; - default: - if (this.cache[this._makeAbs(e)] = !1, this.strict) throw t; - this.silent || console.error("glob error", t); - }}, m.prototype._processGlobStar = function (e, t, r, n, o, s) {var i = this._readdir(r, s);if (i) {var a = n.slice(1), - l = e ? [e] : [], - u = l.concat(a);this._process(u, o, !1);var c = i.length;if (!this.symlinks[r] || !s) for (var d = 0; d < c; d++) {if ("." !== i[d].charAt(0) || this.dot) {var h = l.concat(i[d], a);this._process(h, o, !0);var f = l.concat(i[d], n);this._process(f, o, !0);}}}}, m.prototype._processSimple = function (e, t) {var r = this._stat(e);if (this.matches[t] || (this.matches[t] = Object.create(null)), r) {if (e && l(e) && !this.nomount) {var n = /[\/\\]$/.test(e);"/" === e.charAt(0) ? e = i.join(this.root, e) : (e = i.resolve(this.root, e), n && (e += "/"));}"win32" === process.platform && (e = e.replace(/\\/g, "/")), this._emitMatch(t, e);}}, m.prototype._stat = function (e) {var t = this._makeAbs(e), - r = "/" === e.slice(-1);if (e.length > this.maxLength) return !1;if (!this.stat && d(this.cache, t)) {var o = this.cache[t];if (Array.isArray(o) && (o = "DIR"), !r || "DIR" === o) return o;if (r && "FILE" === o) return !1;}var s = this.statCache[t];if (!s) {var i;try {i = n.lstatSync(t);} catch (e) {if (e && ("ENOENT" === e.code || "ENOTDIR" === e.code)) return this.statCache[t] = !1, !1;}if (i && i.isSymbolicLink()) try {s = n.statSync(t);} catch (e) {s = i;} else s = i;}this.statCache[t] = s;o = !0;return s && (o = s.isDirectory() ? "DIR" : "FILE"), this.cache[t] = this.cache[t] || o, (!r || "FILE" !== o) && o;}, m.prototype._mark = function (e) {return u.mark(this, e);}, m.prototype._makeAbs = function (e) {return u.makeAbs(this, e);};}, "./node_modules/has-flag/index.js": function (e, t, r) {"use strict"; - e.exports = (e, t = process.argv) => {const r = e.startsWith("-") ? "" : 1 === e.length ? "-" : "--", - n = t.indexOf(r + e), - o = t.indexOf("--");return -1 !== n && (-1 === o || n < o);};}, "./node_modules/immediate/lib/index.js": function (e, t, r) {"use strict"; - var n, - o, - s = global.MutationObserver || global.WebKitMutationObserver;if (process.browser) { - if (s) {var i = 0, - a = new s(d), - l = global.document.createTextNode("");a.observe(l, { characterData: !0 }), n = function () {l.data = i = ++i % 2;};} else if (global.setImmediate || void 0 === global.MessageChannel) n = "document" in global && "onreadystatechange" in global.document.createElement("script") ? function () {var e = global.document.createElement("script");e.onreadystatechange = function () {d(), e.onreadystatechange = null, e.parentNode.removeChild(e), e = null;}, global.document.documentElement.appendChild(e);} : function () {setTimeout(d, 0);};else {var u = new global.MessageChannel();u.port1.onmessage = d, n = function () {u.port2.postMessage(0);};} - } else n = function () {process.nextTick(d);};var c = [];function d() {var e, t;o = !0;for (var r = c.length; r;) {for (t = c, c = [], e = -1; ++e < r;) t[e]();r = c.length;}o = !1;}e.exports = function (e) {1 !== c.push(e) || o || n();};}, "./node_modules/inflight/inflight.js": function (e, t, r) {var n = r("./node_modules/wrappy/wrappy.js"), - o = Object.create(null), - s = r("./node_modules/once/once.js");function i(e) {for (var t = e.length, r = [], n = 0; n < t; n++) r[n] = e[n];return r;}e.exports = n(function (e, t) {return o[e] ? (o[e].push(t), null) : (o[e] = [t], function (e) {return s(function t() {var r = o[e], - n = r.length, - s = i(arguments);try {for (var a = 0; a < n; a++) r[a].apply(null, s);} finally {r.length > n ? (r.splice(0, n), process.nextTick(function () {t.apply(null, s);})) : delete o[e];}});}(e));});}, "./node_modules/inherits/inherits.js": function (e, t, r) {try {var n = r("util");if ("function" != typeof n.inherits) throw "";e.exports = n.inherits;} catch (t) {e.exports = r("./node_modules/inherits/inherits_browser.js");}}, "./node_modules/inherits/inherits_browser.js": function (e, t) {"function" == typeof Object.create ? e.exports = function (e, t) {t && (e.super_ = t, e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }));} : e.exports = function (e, t) {if (t) {e.super_ = t;var r = function () {};r.prototype = t.prototype, e.prototype = new r(), e.prototype.constructor = e;}};}, "./node_modules/isarray/index.js": function (e, t) {var r = {}.toString;e.exports = Array.isArray || function (e) {return "[object Array]" == r.call(e);};}, "./node_modules/jszip/lib/base64.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/utils.js"), - o = r("./node_modules/jszip/lib/support.js"), - s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.encode = function (e) {for (var t, r, o, i, a, l, u, c = [], d = 0, h = e.length, f = h, p = "string" !== n.getTypeOf(e); d < e.length;) f = h - d, p ? (t = e[d++], r = d < h ? e[d++] : 0, o = d < h ? e[d++] : 0) : (t = e.charCodeAt(d++), r = d < h ? e.charCodeAt(d++) : 0, o = d < h ? e.charCodeAt(d++) : 0), i = t >> 2, a = (3 & t) << 4 | r >> 4, l = f > 1 ? (15 & r) << 2 | o >> 6 : 64, u = f > 2 ? 63 & o : 64, c.push(s.charAt(i) + s.charAt(a) + s.charAt(l) + s.charAt(u));return c.join("");}, t.decode = function (e) {var t, - r, - n, - i, - a, - l, - u = 0, - c = 0;if ("data:" === e.substr(0, "data:".length)) throw new Error("Invalid base64 input, it looks like a data url.");var d, - h = 3 * (e = e.replace(/[^A-Za-z0-9\+\/\=]/g, "")).length / 4;if (e.charAt(e.length - 1) === s.charAt(64) && h--, e.charAt(e.length - 2) === s.charAt(64) && h--, h % 1 != 0) throw new Error("Invalid base64 input, bad content length.");for (d = o.uint8array ? new Uint8Array(0 | h) : new Array(0 | h); u < e.length;) t = s.indexOf(e.charAt(u++)) << 2 | (i = s.indexOf(e.charAt(u++))) >> 4, r = (15 & i) << 4 | (a = s.indexOf(e.charAt(u++))) >> 2, n = (3 & a) << 6 | (l = s.indexOf(e.charAt(u++))), d[c++] = t, 64 !== a && (d[c++] = r), 64 !== l && (d[c++] = n);return d;};}, "./node_modules/jszip/lib/compressedObject.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/external.js"), - o = r("./node_modules/jszip/lib/stream/DataWorker.js"), - s = r("./node_modules/jszip/lib/stream/DataLengthProbe.js"), - i = r("./node_modules/jszip/lib/stream/Crc32Probe.js");s = r("./node_modules/jszip/lib/stream/DataLengthProbe.js");function a(e, t, r, n, o) {this.compressedSize = e, this.uncompressedSize = t, this.crc32 = r, this.compression = n, this.compressedContent = o;}a.prototype = { getContentWorker: function () {var e = new o(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new s("data_length")), - t = this;return e.on("end", function () {if (this.streamInfo.data_length !== t.uncompressedSize) throw new Error("Bug : uncompressed data size mismatch");}), e;}, getCompressedWorker: function () {return new o(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize", this.compressedSize).withStreamInfo("uncompressedSize", this.uncompressedSize).withStreamInfo("crc32", this.crc32).withStreamInfo("compression", this.compression);} }, a.createWorkerFrom = function (e, t, r) {return e.pipe(new i()).pipe(new s("uncompressedSize")).pipe(t.compressWorker(r)).pipe(new s("compressedSize")).withStreamInfo("compression", t);}, e.exports = a;}, "./node_modules/jszip/lib/compressions.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/stream/GenericWorker.js");t.STORE = { magic: "\0\0", compressWorker: function (e) {return new n("STORE compression");}, uncompressWorker: function () {return new n("STORE decompression");} }, t.DEFLATE = r("./node_modules/jszip/lib/flate.js");}, "./node_modules/jszip/lib/crc32.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/utils.js");var o = function () {for (var e, t = [], r = 0; r < 256; r++) {e = r;for (var n = 0; n < 8; n++) e = 1 & e ? 3988292384 ^ e >>> 1 : e >>> 1;t[r] = e;}return t;}();e.exports = function (e, t) {return void 0 !== e && e.length ? "string" !== n.getTypeOf(e) ? function (e, t, r, n) {var s = o, - i = n + r;e ^= -1;for (var a = n; a < i; a++) e = e >>> 8 ^ s[255 & (e ^ t[a])];return -1 ^ e;}(0 | t, e, e.length, 0) : function (e, t, r, n) {var s = o, - i = n + r;e ^= -1;for (var a = n; a < i; a++) e = e >>> 8 ^ s[255 & (e ^ t.charCodeAt(a))];return -1 ^ e;}(0 | t, e, e.length, 0) : 0;};}, "./node_modules/jszip/lib/defaults.js": function (e, t, r) {"use strict"; - t.base64 = !1, t.binary = !1, t.dir = !1, t.createFolders = !0, t.date = null, t.compression = null, t.compressionOptions = null, t.comment = null, t.unixPermissions = null, t.dosPermissions = null;}, "./node_modules/jszip/lib/external.js": function (e, t, r) {"use strict"; - var n = null;n = "undefined" != typeof Promise ? Promise : r("./node_modules/lie/lib/index.js"), e.exports = { Promise: n };}, "./node_modules/jszip/lib/flate.js": function (e, t, r) {"use strict"; - var n = "undefined" != typeof Uint8Array && "undefined" != typeof Uint16Array && "undefined" != typeof Uint32Array, - o = r("./node_modules/pako/index.js"), - s = r("./node_modules/jszip/lib/utils.js"), - i = r("./node_modules/jszip/lib/stream/GenericWorker.js"), - a = n ? "uint8array" : "array";function l(e, t) {i.call(this, "FlateWorker/" + e), this._pako = null, this._pakoAction = e, this._pakoOptions = t, this.meta = {};}t.magic = "\b\0", s.inherits(l, i), l.prototype.processChunk = function (e) {this.meta = e.meta, null === this._pako && this._createPako(), this._pako.push(s.transformTo(a, e.data), !1);}, l.prototype.flush = function () {i.prototype.flush.call(this), null === this._pako && this._createPako(), this._pako.push([], !0);}, l.prototype.cleanUp = function () {i.prototype.cleanUp.call(this), this._pako = null;}, l.prototype._createPako = function () {this._pako = new o[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });var e = this;this._pako.onData = function (t) {e.push({ data: t, meta: e.meta });};}, t.compressWorker = function (e) {return new l("Deflate", e);}, t.uncompressWorker = function () {return new l("Inflate", {});};}, "./node_modules/jszip/lib/generate/ZipFileWorker.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/utils.js"), - o = r("./node_modules/jszip/lib/stream/GenericWorker.js"), - s = r("./node_modules/jszip/lib/utf8.js"), - i = r("./node_modules/jszip/lib/crc32.js"), - a = r("./node_modules/jszip/lib/signature.js"), - l = function (e, t) {var r, - n = "";for (r = 0; r < t; r++) n += String.fromCharCode(255 & e), e >>>= 8;return n;}, - u = function (e, t, r, o, u, c) {var d, - h, - f = e.file, - p = e.compression, - m = c !== s.utf8encode, - g = n.transformTo("string", c(f.name)), - _ = n.transformTo("string", s.utf8encode(f.name)), - v = f.comment, - b = n.transformTo("string", c(v)), - y = n.transformTo("string", s.utf8encode(v)), - w = _.length !== f.name.length, - j = y.length !== v.length, - E = "", - k = "", - S = "", - C = f.dir, - x = f.date, - O = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };t && !r || (O.crc32 = e.crc32, O.compressedSize = e.compressedSize, O.uncompressedSize = e.uncompressedSize);var A = 0;t && (A |= 8), m || !w && !j || (A |= 2048);var R, - I, - T, - L = 0, - N = 0;C && (L |= 16), "UNIX" === u ? (N = 798, L |= (R = f.unixPermissions, I = C, T = R, R || (T = I ? 16893 : 33204), (65535 & T) << 16)) : (N = 20, L |= 63 & (f.dosPermissions || 0)), d = x.getUTCHours(), d <<= 6, d |= x.getUTCMinutes(), d <<= 5, d |= x.getUTCSeconds() / 2, h = x.getUTCFullYear() - 1980, h <<= 4, h |= x.getUTCMonth() + 1, h <<= 5, h |= x.getUTCDate(), w && (k = l(1, 1) + l(i(g), 4) + _, E += "up" + l(k.length, 2) + k), j && (S = l(1, 1) + l(i(b), 4) + y, E += "uc" + l(S.length, 2) + S);var z = "";return z += "\n\0", z += l(A, 2), z += p.magic, z += l(d, 2), z += l(h, 2), z += l(O.crc32, 4), z += l(O.compressedSize, 4), z += l(O.uncompressedSize, 4), z += l(g.length, 2), z += l(E.length, 2), { fileRecord: a.LOCAL_FILE_HEADER + z + g + E, dirRecord: a.CENTRAL_FILE_HEADER + l(N, 2) + z + l(b.length, 2) + "\0\0\0\0" + l(L, 4) + l(o, 4) + g + E + b };}, - c = function (e) {return a.DATA_DESCRIPTOR + l(e.crc32, 4) + l(e.compressedSize, 4) + l(e.uncompressedSize, 4);};function d(e, t, r, n) {o.call(this, "ZipFileWorker"), this.bytesWritten = 0, this.zipComment = t, this.zipPlatform = r, this.encodeFileName = n, this.streamFiles = e, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];}n.inherits(d, o), d.prototype.push = function (e) {var t = e.meta.percent || 0, - r = this.entriesCount, - n = this._sources.length;this.accumulate ? this.contentBuffer.push(e) : (this.bytesWritten += e.data.length, o.prototype.push.call(this, { data: e.data, meta: { currentFile: this.currentFile, percent: r ? (t + 100 * (r - n - 1)) / r : 100 } }));}, d.prototype.openedSource = function (e) {this.currentSourceOffset = this.bytesWritten, this.currentFile = e.file.name;var t = this.streamFiles && !e.file.dir;if (t) {var r = u(e, t, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);this.push({ data: r.fileRecord, meta: { percent: 0 } });} else this.accumulate = !0;}, d.prototype.closedSource = function (e) {this.accumulate = !1;var t = this.streamFiles && !e.file.dir, - r = u(e, t, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);if (this.dirRecords.push(r.dirRecord), t) this.push({ data: c(e), meta: { percent: 100 } });else for (this.push({ data: r.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length;) this.push(this.contentBuffer.shift());this.currentFile = null;}, d.prototype.flush = function () {for (var e = this.bytesWritten, t = 0; t < this.dirRecords.length; t++) this.push({ data: this.dirRecords[t], meta: { percent: 100 } });var r = this.bytesWritten - e, - o = function (e, t, r, o, s) {var i = n.transformTo("string", s(o));return a.CENTRAL_DIRECTORY_END + "\0\0\0\0" + l(e, 2) + l(e, 2) + l(t, 4) + l(r, 4) + l(i.length, 2) + i;}(this.dirRecords.length, r, e, this.zipComment, this.encodeFileName);this.push({ data: o, meta: { percent: 100 } });}, d.prototype.prepareNextSource = function () {this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();}, d.prototype.registerPrevious = function (e) {this._sources.push(e);var t = this;return e.on("data", function (e) {t.processChunk(e);}), e.on("end", function () {t.closedSource(t.previous.streamInfo), t._sources.length ? t.prepareNextSource() : t.end();}), e.on("error", function (e) {t.error(e);}), this;}, d.prototype.resume = function () {return !!o.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));}, d.prototype.error = function (e) {var t = this._sources;if (!o.prototype.error.call(this, e)) return !1;for (var r = 0; r < t.length; r++) try {t[r].error(e);} catch (e) {}return !0;}, d.prototype.lock = function () {o.prototype.lock.call(this);for (var e = this._sources, t = 0; t < e.length; t++) e[t].lock();}, e.exports = d;}, "./node_modules/jszip/lib/generate/index.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/compressions.js"), - o = r("./node_modules/jszip/lib/generate/ZipFileWorker.js");t.generateWorker = function (e, t, r) {var s = new o(t.streamFiles, r, t.platform, t.encodeFileName), - i = 0;try {e.forEach(function (e, r) {i++;var o = function (e, t) {var r = e || t, - o = n[r];if (!o) throw new Error(r + " is not a valid compression method !");return o;}(r.options.compression, t.compression), - a = r.options.compressionOptions || t.compressionOptions || {}, - l = r.dir, - u = r.date;r._compressWorker(o, a).withStreamInfo("file", { name: e, dir: l, date: u, comment: r.comment || "", unixPermissions: r.unixPermissions, dosPermissions: r.dosPermissions }).pipe(s);}), s.entriesCount = i;} catch (e) {s.error(e);}return s;};}, "./node_modules/jszip/lib/index.js": function (e, t, r) {"use strict"; - function n() {if (!(this instanceof n)) return new n();if (arguments.length) throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");this.files = {}, this.comment = null, this.root = "", this.clone = function () {var e = new n();for (var t in this) "function" != typeof this[t] && (e[t] = this[t]);return e;};}n.prototype = r("./node_modules/jszip/lib/object.js"), n.prototype.loadAsync = r("./node_modules/jszip/lib/load.js"), n.support = r("./node_modules/jszip/lib/support.js"), n.defaults = r("./node_modules/jszip/lib/defaults.js"), n.version = "3.5.0", n.loadAsync = function (e, t) {return new n().loadAsync(e, t);}, n.external = r("./node_modules/jszip/lib/external.js"), e.exports = n;}, "./node_modules/jszip/lib/load.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/utils.js"), - o = r("./node_modules/jszip/lib/external.js"), - s = r("./node_modules/jszip/lib/utf8.js"), - i = (n = r("./node_modules/jszip/lib/utils.js"), r("./node_modules/jszip/lib/zipEntries.js")), - a = r("./node_modules/jszip/lib/stream/Crc32Probe.js"), - l = r("./node_modules/jszip/lib/nodejsUtils.js");function u(e) {return new o.Promise(function (t, r) {var n = e.decompressed.getContentWorker().pipe(new a());n.on("error", function (e) {r(e);}).on("end", function () {n.streamInfo.crc32 !== e.decompressed.crc32 ? r(new Error("Corrupted zip : CRC32 mismatch")) : t();}).resume();});}e.exports = function (e, t) {var r = this;return t = n.extend(t || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: s.utf8decode }), l.isNode && l.isStream(e) ? o.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")) : n.prepareContent("the loaded zip file", e, !0, t.optimizedBinaryString, t.base64).then(function (e) {var r = new i(t);return r.load(e), r;}).then(function (e) {var r = [o.Promise.resolve(e)], - n = e.files;if (t.checkCRC32) for (var s = 0; s < n.length; s++) r.push(u(n[s]));return o.Promise.all(r);}).then(function (e) {for (var n = e.shift(), o = n.files, s = 0; s < o.length; s++) {var i = o[s];r.file(i.fileNameStr, i.decompressed, { binary: !0, optimizedBinaryString: !0, date: i.date, dir: i.dir, comment: i.fileCommentStr.length ? i.fileCommentStr : null, unixPermissions: i.unixPermissions, dosPermissions: i.dosPermissions, createFolders: t.createFolders });}return n.zipComment.length && (r.comment = n.zipComment), r;});};}, "./node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/utils.js"), - o = r("./node_modules/jszip/lib/stream/GenericWorker.js");function s(e, t) {o.call(this, "Nodejs stream input adapter for " + e), this._upstreamEnded = !1, this._bindStream(t);}n.inherits(s, o), s.prototype._bindStream = function (e) {var t = this;this._stream = e, e.pause(), e.on("data", function (e) {t.push({ data: e, meta: { percent: 0 } });}).on("error", function (e) {t.isPaused ? this.generatedError = e : t.error(e);}).on("end", function () {t.isPaused ? t._upstreamEnded = !0 : t.end();});}, s.prototype.pause = function () {return !!o.prototype.pause.call(this) && (this._stream.pause(), !0);}, s.prototype.resume = function () {return !!o.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);}, e.exports = s;}, "./node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/readable-stream/readable.js").Readable;function o(e, t, r) {n.call(this, t), this._helper = e;var o = this;e.on("data", function (e, t) {o.push(e) || o._helper.pause(), r && r(t);}).on("error", function (e) {o.emit("error", e);}).on("end", function () {o.push(null);});}r("./node_modules/jszip/lib/utils.js").inherits(o, n), o.prototype._read = function () {this._helper.resume();}, e.exports = o;}, "./node_modules/jszip/lib/nodejsUtils.js": function (e, t, r) {"use strict"; - e.exports = { isNode: "undefined" != typeof Buffer, newBufferFrom: function (e, t) {if (Buffer.from && Buffer.from !== Uint8Array.from) return Buffer.from(e, t);if ("number" == typeof e) throw new Error('The "data" argument must not be a number');return new Buffer(e, t);}, allocBuffer: function (e) {if (Buffer.alloc) return Buffer.alloc(e);var t = new Buffer(e);return t.fill(0), t;}, isBuffer: function (e) {return Buffer.isBuffer(e);}, isStream: function (e) {return e && "function" == typeof e.on && "function" == typeof e.pause && "function" == typeof e.resume;} };}, "./node_modules/jszip/lib/object.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/utf8.js"), - o = r("./node_modules/jszip/lib/utils.js"), - s = r("./node_modules/jszip/lib/stream/GenericWorker.js"), - i = r("./node_modules/jszip/lib/stream/StreamHelper.js"), - a = r("./node_modules/jszip/lib/defaults.js"), - l = r("./node_modules/jszip/lib/compressedObject.js"), - u = r("./node_modules/jszip/lib/zipObject.js"), - c = r("./node_modules/jszip/lib/generate/index.js"), - d = r("./node_modules/jszip/lib/nodejsUtils.js"), - h = r("./node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js"), - f = function (e, t, r) {var n, - i = o.getTypeOf(t), - c = o.extend(r || {}, a);c.date = c.date || new Date(), null !== c.compression && (c.compression = c.compression.toUpperCase()), "string" == typeof c.unixPermissions && (c.unixPermissions = parseInt(c.unixPermissions, 8)), c.unixPermissions && 16384 & c.unixPermissions && (c.dir = !0), c.dosPermissions && 16 & c.dosPermissions && (c.dir = !0), c.dir && (e = m(e)), c.createFolders && (n = p(e)) && g.call(this, n, !0);var f = "string" === i && !1 === c.binary && !1 === c.base64;r && void 0 !== r.binary || (c.binary = !f), (t instanceof l && 0 === t.uncompressedSize || c.dir || !t || 0 === t.length) && (c.base64 = !1, c.binary = !0, t = "", c.compression = "STORE", i = "string");var _ = null;_ = t instanceof l || t instanceof s ? t : d.isNode && d.isStream(t) ? new h(e, t) : o.prepareContent(e, t, c.binary, c.optimizedBinaryString, c.base64);var v = new u(e, _, c);this.files[e] = v;}, - p = function (e) {"/" === e.slice(-1) && (e = e.substring(0, e.length - 1));var t = e.lastIndexOf("/");return t > 0 ? e.substring(0, t) : "";}, - m = function (e) {return "/" !== e.slice(-1) && (e += "/"), e;}, - g = function (e, t) {return t = void 0 !== t ? t : a.createFolders, e = m(e), this.files[e] || f.call(this, e, null, { dir: !0, createFolders: t }), this.files[e];};function _(e) {return "[object RegExp]" === Object.prototype.toString.call(e);}var v = { load: function () {throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");}, forEach: function (e) {var t, r, n;for (t in this.files) this.files.hasOwnProperty(t) && (n = this.files[t], (r = t.slice(this.root.length, t.length)) && t.slice(0, this.root.length) === this.root && e(r, n));}, filter: function (e) {var t = [];return this.forEach(function (r, n) {e(r, n) && t.push(n);}), t;}, file: function (e, t, r) {if (1 === arguments.length) {if (_(e)) {var n = e;return this.filter(function (e, t) {return !t.dir && n.test(e);});}var o = this.files[this.root + e];return o && !o.dir ? o : null;}return e = this.root + e, f.call(this, e, t, r), this;}, folder: function (e) {if (!e) return this;if (_(e)) return this.filter(function (t, r) {return r.dir && e.test(t);});var t = this.root + e, - r = g.call(this, t), - n = this.clone();return n.root = r.name, n;}, remove: function (e) {e = this.root + e;var t = this.files[e];if (t || ("/" !== e.slice(-1) && (e += "/"), t = this.files[e]), t && !t.dir) delete this.files[e];else for (var r = this.filter(function (t, r) {return r.name.slice(0, e.length) === e;}), n = 0; n < r.length; n++) delete this.files[r[n].name];return this;}, generate: function (e) {throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");}, generateInternalStream: function (e) {var t, - r = {};try {if ((r = o.extend(e || {}, { streamFiles: !1, compression: "STORE", compressionOptions: null, type: "", platform: "DOS", comment: null, mimeType: "application/zip", encodeFileName: n.utf8encode })).type = r.type.toLowerCase(), r.compression = r.compression.toUpperCase(), "binarystring" === r.type && (r.type = "string"), !r.type) throw new Error("No output type specified.");o.checkSupport(r.type), "darwin" !== r.platform && "freebsd" !== r.platform && "linux" !== r.platform && "sunos" !== r.platform || (r.platform = "UNIX"), "win32" === r.platform && (r.platform = "DOS");var a = r.comment || this.comment || "";t = c.generateWorker(this, r, a);} catch (e) {(t = new s("error")).error(e);}return new i(t, r.type || "string", r.mimeType);}, generateAsync: function (e, t) {return this.generateInternalStream(e).accumulate(t);}, generateNodeStream: function (e, t) {return (e = e || {}).type || (e.type = "nodebuffer"), this.generateInternalStream(e).toNodejsStream(t);} };e.exports = v;}, "./node_modules/jszip/lib/reader/ArrayReader.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/reader/DataReader.js");function o(e) {n.call(this, e);for (var t = 0; t < this.data.length; t++) e[t] = 255 & e[t];}r("./node_modules/jszip/lib/utils.js").inherits(o, n), o.prototype.byteAt = function (e) {return this.data[this.zero + e];}, o.prototype.lastIndexOfSignature = function (e) {for (var t = e.charCodeAt(0), r = e.charCodeAt(1), n = e.charCodeAt(2), o = e.charCodeAt(3), s = this.length - 4; s >= 0; --s) if (this.data[s] === t && this.data[s + 1] === r && this.data[s + 2] === n && this.data[s + 3] === o) return s - this.zero;return -1;}, o.prototype.readAndCheckSignature = function (e) {var t = e.charCodeAt(0), - r = e.charCodeAt(1), - n = e.charCodeAt(2), - o = e.charCodeAt(3), - s = this.readData(4);return t === s[0] && r === s[1] && n === s[2] && o === s[3];}, o.prototype.readData = function (e) {if (this.checkOffset(e), 0 === e) return [];var t = this.data.slice(this.zero + this.index, this.zero + this.index + e);return this.index += e, t;}, e.exports = o;}, "./node_modules/jszip/lib/reader/DataReader.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/utils.js");function o(e) {this.data = e, this.length = e.length, this.index = 0, this.zero = 0;}o.prototype = { checkOffset: function (e) {this.checkIndex(this.index + e);}, checkIndex: function (e) {if (this.length < this.zero + e || e < 0) throw new Error("End of data reached (data length = " + this.length + ", asked index = " + e + "). Corrupted zip ?");}, setIndex: function (e) {this.checkIndex(e), this.index = e;}, skip: function (e) {this.setIndex(this.index + e);}, byteAt: function (e) {}, readInt: function (e) {var t, - r = 0;for (this.checkOffset(e), t = this.index + e - 1; t >= this.index; t--) r = (r << 8) + this.byteAt(t);return this.index += e, r;}, readString: function (e) {return n.transformTo("string", this.readData(e));}, readData: function (e) {}, lastIndexOfSignature: function (e) {}, readAndCheckSignature: function (e) {}, readDate: function () {var e = this.readInt(4);return new Date(Date.UTC(1980 + (e >> 25 & 127), (e >> 21 & 15) - 1, e >> 16 & 31, e >> 11 & 31, e >> 5 & 63, (31 & e) << 1));} }, e.exports = o;}, "./node_modules/jszip/lib/reader/NodeBufferReader.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/reader/Uint8ArrayReader.js");function o(e) {n.call(this, e);}r("./node_modules/jszip/lib/utils.js").inherits(o, n), o.prototype.readData = function (e) {this.checkOffset(e);var t = this.data.slice(this.zero + this.index, this.zero + this.index + e);return this.index += e, t;}, e.exports = o;}, "./node_modules/jszip/lib/reader/StringReader.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/reader/DataReader.js");function o(e) {n.call(this, e);}r("./node_modules/jszip/lib/utils.js").inherits(o, n), o.prototype.byteAt = function (e) {return this.data.charCodeAt(this.zero + e);}, o.prototype.lastIndexOfSignature = function (e) {return this.data.lastIndexOf(e) - this.zero;}, o.prototype.readAndCheckSignature = function (e) {return e === this.readData(4);}, o.prototype.readData = function (e) {this.checkOffset(e);var t = this.data.slice(this.zero + this.index, this.zero + this.index + e);return this.index += e, t;}, e.exports = o;}, "./node_modules/jszip/lib/reader/Uint8ArrayReader.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/reader/ArrayReader.js");function o(e) {n.call(this, e);}r("./node_modules/jszip/lib/utils.js").inherits(o, n), o.prototype.readData = function (e) {if (this.checkOffset(e), 0 === e) return new Uint8Array(0);var t = this.data.subarray(this.zero + this.index, this.zero + this.index + e);return this.index += e, t;}, e.exports = o;}, "./node_modules/jszip/lib/reader/readerFor.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/utils.js"), - o = r("./node_modules/jszip/lib/support.js"), - s = r("./node_modules/jszip/lib/reader/ArrayReader.js"), - i = r("./node_modules/jszip/lib/reader/StringReader.js"), - a = r("./node_modules/jszip/lib/reader/NodeBufferReader.js"), - l = r("./node_modules/jszip/lib/reader/Uint8ArrayReader.js");e.exports = function (e) {var t = n.getTypeOf(e);return n.checkSupport(t), "string" !== t || o.uint8array ? "nodebuffer" === t ? new a(e) : o.uint8array ? new l(n.transformTo("uint8array", e)) : new s(n.transformTo("array", e)) : new i(e);};}, "./node_modules/jszip/lib/signature.js": function (e, t, r) {"use strict"; - t.LOCAL_FILE_HEADER = "PK", t.CENTRAL_FILE_HEADER = "PK", t.CENTRAL_DIRECTORY_END = "PK", t.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK", t.ZIP64_CENTRAL_DIRECTORY_END = "PK", t.DATA_DESCRIPTOR = "PK\b";}, "./node_modules/jszip/lib/stream/ConvertWorker.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/stream/GenericWorker.js"), - o = r("./node_modules/jszip/lib/utils.js");function s(e) {n.call(this, "ConvertWorker to " + e), this.destType = e;}o.inherits(s, n), s.prototype.processChunk = function (e) {this.push({ data: o.transformTo(this.destType, e.data), meta: e.meta });}, e.exports = s;}, "./node_modules/jszip/lib/stream/Crc32Probe.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/stream/GenericWorker.js"), - o = r("./node_modules/jszip/lib/crc32.js");function s() {n.call(this, "Crc32Probe"), this.withStreamInfo("crc32", 0);}r("./node_modules/jszip/lib/utils.js").inherits(s, n), s.prototype.processChunk = function (e) {this.streamInfo.crc32 = o(e.data, this.streamInfo.crc32 || 0), this.push(e);}, e.exports = s;}, "./node_modules/jszip/lib/stream/DataLengthProbe.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/utils.js"), - o = r("./node_modules/jszip/lib/stream/GenericWorker.js");function s(e) {o.call(this, "DataLengthProbe for " + e), this.propName = e, this.withStreamInfo(e, 0);}n.inherits(s, o), s.prototype.processChunk = function (e) {if (e) {var t = this.streamInfo[this.propName] || 0;this.streamInfo[this.propName] = t + e.data.length;}o.prototype.processChunk.call(this, e);}, e.exports = s;}, "./node_modules/jszip/lib/stream/DataWorker.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/utils.js"), - o = r("./node_modules/jszip/lib/stream/GenericWorker.js");function s(e) {o.call(this, "DataWorker");var t = this;this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = "", this._tickScheduled = !1, e.then(function (e) {t.dataIsReady = !0, t.data = e, t.max = e && e.length || 0, t.type = n.getTypeOf(e), t.isPaused || t._tickAndRepeat();}, function (e) {t.error(e);});}n.inherits(s, o), s.prototype.cleanUp = function () {o.prototype.cleanUp.call(this), this.data = null;}, s.prototype.resume = function () {return !!o.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, n.delay(this._tickAndRepeat, [], this)), !0);}, s.prototype._tickAndRepeat = function () {this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (n.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));}, s.prototype._tick = function () {if (this.isPaused || this.isFinished) return !1;var e = null, - t = Math.min(this.max, this.index + 16384);if (this.index >= this.max) return this.end();switch (this.type) {case "string": - e = this.data.substring(this.index, t); - break; - case "uint8array": - e = this.data.subarray(this.index, t); - break; - case "array":case "nodebuffer": - e = this.data.slice(this.index, t); - }return this.index = t, this.push({ data: e, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });}, e.exports = s;}, "./node_modules/jszip/lib/stream/GenericWorker.js": function (e, t, r) {"use strict"; - function n(e) {this.name = e || "default", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;}n.prototype = { push: function (e) {this.emit("data", e);}, end: function () {if (this.isFinished) return !1;this.flush();try {this.emit("end"), this.cleanUp(), this.isFinished = !0;} catch (e) {this.emit("error", e);}return !0;}, error: function (e) {return !this.isFinished && (this.isPaused ? this.generatedError = e : (this.isFinished = !0, this.emit("error", e), this.previous && this.previous.error(e), this.cleanUp()), !0);}, on: function (e, t) {return this._listeners[e].push(t), this;}, cleanUp: function () {this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];}, emit: function (e, t) {if (this._listeners[e]) for (var r = 0; r < this._listeners[e].length; r++) this._listeners[e][r].call(this, t);}, pipe: function (e) {return e.registerPrevious(this);}, registerPrevious: function (e) {if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");this.streamInfo = e.streamInfo, this.mergeStreamInfo(), this.previous = e;var t = this;return e.on("data", function (e) {t.processChunk(e);}), e.on("end", function () {t.end();}), e.on("error", function (e) {t.error(e);}), this;}, pause: function () {return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);}, resume: function () {if (!this.isPaused || this.isFinished) return !1;this.isPaused = !1;var e = !1;return this.generatedError && (this.error(this.generatedError), e = !0), this.previous && this.previous.resume(), !e;}, flush: function () {}, processChunk: function (e) {this.push(e);}, withStreamInfo: function (e, t) {return this.extraStreamInfo[e] = t, this.mergeStreamInfo(), this;}, mergeStreamInfo: function () {for (var e in this.extraStreamInfo) this.extraStreamInfo.hasOwnProperty(e) && (this.streamInfo[e] = this.extraStreamInfo[e]);}, lock: function () {if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");this.isLocked = !0, this.previous && this.previous.lock();}, toString: function () {var e = "Worker " + this.name;return this.previous ? this.previous + " -> " + e : e;} }, e.exports = n;}, "./node_modules/jszip/lib/stream/StreamHelper.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/utils.js"), - o = r("./node_modules/jszip/lib/stream/ConvertWorker.js"), - s = r("./node_modules/jszip/lib/stream/GenericWorker.js"), - i = r("./node_modules/jszip/lib/base64.js"), - a = r("./node_modules/jszip/lib/support.js"), - l = r("./node_modules/jszip/lib/external.js"), - u = null;if (a.nodestream) try {u = r("./node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js");} catch (e) {}function c(e, t) {return new l.Promise(function (r, o) {var s = [], - a = e._internalType, - l = e._outputType, - u = e._mimeType;e.on("data", function (e, r) {s.push(e), t && t(r);}).on("error", function (e) {s = [], o(e);}).on("end", function () {try {var e = function (e, t, r) {switch (e) {case "blob": - return n.newBlob(n.transformTo("arraybuffer", t), r); - case "base64": - return i.encode(t); - default: - return n.transformTo(e, t); - }}(l, function (e, t) {var r, - n = 0, - o = null, - s = 0;for (r = 0; r < t.length; r++) s += t[r].length;switch (e) {case "string": - return t.join(""); - case "array": - return Array.prototype.concat.apply([], t); - case "uint8array": - for (o = new Uint8Array(s), r = 0; r < t.length; r++) o.set(t[r], n), n += t[r].length; - - return o; - case "nodebuffer": - return Buffer.concat(t); - default: - throw new Error("concat : unsupported type '" + e + "'"); - }}(a, s), u);r(e);} catch (e) {o(e);}s = [];}).resume();});}function d(e, t, r) {var i = t;switch (t) {case "blob":case "arraybuffer": - i = "uint8array"; - break; - case "base64": - i = "string"; - }try {this._internalType = i, this._outputType = t, this._mimeType = r, n.checkSupport(i), this._worker = e.pipe(new o(i)), e.lock();} catch (e) {this._worker = new s("error"), this._worker.error(e);}}d.prototype = { accumulate: function (e) {return c(this, e);}, on: function (e, t) {var r = this;return "data" === e ? this._worker.on(e, function (e) {t.call(r, e.data, e.meta);}) : this._worker.on(e, function () {n.delay(t, arguments, r);}), this;}, resume: function () {return n.delay(this._worker.resume, [], this._worker), this;}, pause: function () {return this._worker.pause(), this;}, toNodejsStream: function (e) {if (n.checkSupport("nodestream"), "nodebuffer" !== this._outputType) throw new Error(this._outputType + " is not supported by this method");return new u(this, { objectMode: "nodebuffer" !== this._outputType }, e);} }, e.exports = d;}, "./node_modules/jszip/lib/support.js": function (e, t, r) {"use strict"; - if (t.base64 = !0, t.array = !0, t.string = !0, t.arraybuffer = "undefined" != typeof ArrayBuffer && "undefined" != typeof Uint8Array, t.nodebuffer = "undefined" != typeof Buffer, t.uint8array = "undefined" != typeof Uint8Array, "undefined" == typeof ArrayBuffer) t.blob = !1;else {var n = new ArrayBuffer(0);try {t.blob = 0 === new Blob([n], { type: "application/zip" }).size;} catch (e) {try {var o = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();o.append(n), t.blob = 0 === o.getBlob("application/zip").size;} catch (e) {t.blob = !1;}}}try {t.nodestream = !!r("./node_modules/readable-stream/readable.js").Readable;} catch (e) {t.nodestream = !1;}}, "./node_modules/jszip/lib/utf8.js": function (e, t, r) {"use strict"; - for (var n = r("./node_modules/jszip/lib/utils.js"), o = r("./node_modules/jszip/lib/support.js"), s = r("./node_modules/jszip/lib/nodejsUtils.js"), i = r("./node_modules/jszip/lib/stream/GenericWorker.js"), a = new Array(256), l = 0; l < 256; l++) a[l] = l >= 252 ? 6 : l >= 248 ? 5 : l >= 240 ? 4 : l >= 224 ? 3 : l >= 192 ? 2 : 1;a[254] = a[254] = 1;function u() {i.call(this, "utf-8 decode"), this.leftOver = null;}function c() {i.call(this, "utf-8 encode");}t.utf8encode = function (e) {return o.nodebuffer ? s.newBufferFrom(e, "utf-8") : function (e) {var t, - r, - n, - s, - i, - a = e.length, - l = 0;for (s = 0; s < a; s++) 55296 == (64512 & (r = e.charCodeAt(s))) && s + 1 < a && 56320 == (64512 & (n = e.charCodeAt(s + 1))) && (r = 65536 + (r - 55296 << 10) + (n - 56320), s++), l += r < 128 ? 1 : r < 2048 ? 2 : r < 65536 ? 3 : 4;for (t = o.uint8array ? new Uint8Array(l) : new Array(l), i = 0, s = 0; i < l; s++) 55296 == (64512 & (r = e.charCodeAt(s))) && s + 1 < a && 56320 == (64512 & (n = e.charCodeAt(s + 1))) && (r = 65536 + (r - 55296 << 10) + (n - 56320), s++), r < 128 ? t[i++] = r : r < 2048 ? (t[i++] = 192 | r >>> 6, t[i++] = 128 | 63 & r) : r < 65536 ? (t[i++] = 224 | r >>> 12, t[i++] = 128 | r >>> 6 & 63, t[i++] = 128 | 63 & r) : (t[i++] = 240 | r >>> 18, t[i++] = 128 | r >>> 12 & 63, t[i++] = 128 | r >>> 6 & 63, t[i++] = 128 | 63 & r);return t;}(e);}, t.utf8decode = function (e) {return o.nodebuffer ? n.transformTo("nodebuffer", e).toString("utf-8") : function (e) {var t, - r, - o, - s, - i = e.length, - l = new Array(2 * i);for (r = 0, t = 0; t < i;) if ((o = e[t++]) < 128) l[r++] = o;else if ((s = a[o]) > 4) l[r++] = 65533, t += s - 1;else {for (o &= 2 === s ? 31 : 3 === s ? 15 : 7; s > 1 && t < i;) o = o << 6 | 63 & e[t++], s--;s > 1 ? l[r++] = 65533 : o < 65536 ? l[r++] = o : (o -= 65536, l[r++] = 55296 | o >> 10 & 1023, l[r++] = 56320 | 1023 & o);}return l.length !== r && (l.subarray ? l = l.subarray(0, r) : l.length = r), n.applyFromCharCode(l);}(e = n.transformTo(o.uint8array ? "uint8array" : "array", e));}, n.inherits(u, i), u.prototype.processChunk = function (e) {var r = n.transformTo(o.uint8array ? "uint8array" : "array", e.data);if (this.leftOver && this.leftOver.length) {if (o.uint8array) {var s = r;(r = new Uint8Array(s.length + this.leftOver.length)).set(this.leftOver, 0), r.set(s, this.leftOver.length);} else r = this.leftOver.concat(r);this.leftOver = null;}var i = function (e, t) {var r;for ((t = t || e.length) > e.length && (t = e.length), r = t - 1; r >= 0 && 128 == (192 & e[r]);) r--;return r < 0 || 0 === r ? t : r + a[e[r]] > t ? r : t;}(r), - l = r;i !== r.length && (o.uint8array ? (l = r.subarray(0, i), this.leftOver = r.subarray(i, r.length)) : (l = r.slice(0, i), this.leftOver = r.slice(i, r.length))), this.push({ data: t.utf8decode(l), meta: e.meta });}, u.prototype.flush = function () {this.leftOver && this.leftOver.length && (this.push({ data: t.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);}, t.Utf8DecodeWorker = u, n.inherits(c, i), c.prototype.processChunk = function (e) {this.push({ data: t.utf8encode(e.data), meta: e.meta });}, t.Utf8EncodeWorker = c;}, "./node_modules/jszip/lib/utils.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/support.js"), - o = r("./node_modules/jszip/lib/base64.js"), - s = r("./node_modules/jszip/lib/nodejsUtils.js"), - i = r("./node_modules/set-immediate-shim/index.js"), - a = r("./node_modules/jszip/lib/external.js");function l(e) {return e;}function u(e, t) {for (var r = 0; r < e.length; ++r) t[r] = 255 & e.charCodeAt(r);return t;}t.newBlob = function (e, r) {t.checkSupport("blob");try {return new Blob([e], { type: r });} catch (t) {try {var n = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();return n.append(e), n.getBlob(r);} catch (e) {throw new Error("Bug : can't construct the Blob.");}}};var c = { stringifyByChunk: function (e, t, r) {var n = [], - o = 0, - s = e.length;if (s <= r) return String.fromCharCode.apply(null, e);for (; o < s;) "array" === t || "nodebuffer" === t ? n.push(String.fromCharCode.apply(null, e.slice(o, Math.min(o + r, s)))) : n.push(String.fromCharCode.apply(null, e.subarray(o, Math.min(o + r, s)))), o += r;return n.join("");}, stringifyByChar: function (e) {for (var t = "", r = 0; r < e.length; r++) t += String.fromCharCode(e[r]);return t;}, applyCanBeUsed: { uint8array: function () {try {return n.uint8array && 1 === String.fromCharCode.apply(null, new Uint8Array(1)).length;} catch (e) {return !1;}}(), nodebuffer: function () {try {return n.nodebuffer && 1 === String.fromCharCode.apply(null, s.allocBuffer(1)).length;} catch (e) {return !1;}}() } };function d(e) {var r = 65536, - n = t.getTypeOf(e), - o = !0;if ("uint8array" === n ? o = c.applyCanBeUsed.uint8array : "nodebuffer" === n && (o = c.applyCanBeUsed.nodebuffer), o) for (; r > 1;) try {return c.stringifyByChunk(e, n, r);} catch (e) {r = Math.floor(r / 2);}return c.stringifyByChar(e);}function h(e, t) {for (var r = 0; r < e.length; r++) t[r] = e[r];return t;}t.applyFromCharCode = d;var f = {};f.string = { string: l, array: function (e) {return u(e, new Array(e.length));}, arraybuffer: function (e) {return f.string.uint8array(e).buffer;}, uint8array: function (e) {return u(e, new Uint8Array(e.length));}, nodebuffer: function (e) {return u(e, s.allocBuffer(e.length));} }, f.array = { string: d, array: l, arraybuffer: function (e) {return new Uint8Array(e).buffer;}, uint8array: function (e) {return new Uint8Array(e);}, nodebuffer: function (e) {return s.newBufferFrom(e);} }, f.arraybuffer = { string: function (e) {return d(new Uint8Array(e));}, array: function (e) {return h(new Uint8Array(e), new Array(e.byteLength));}, arraybuffer: l, uint8array: function (e) {return new Uint8Array(e);}, nodebuffer: function (e) {return s.newBufferFrom(new Uint8Array(e));} }, f.uint8array = { string: d, array: function (e) {return h(e, new Array(e.length));}, arraybuffer: function (e) {return e.buffer;}, uint8array: l, nodebuffer: function (e) {return s.newBufferFrom(e);} }, f.nodebuffer = { string: d, array: function (e) {return h(e, new Array(e.length));}, arraybuffer: function (e) {return f.nodebuffer.uint8array(e).buffer;}, uint8array: function (e) {return h(e, new Uint8Array(e.length));}, nodebuffer: l }, t.transformTo = function (e, r) {if (r || (r = ""), !e) return r;t.checkSupport(e);var n = t.getTypeOf(r);return f[n][e](r);}, t.getTypeOf = function (e) {return "string" == typeof e ? "string" : "[object Array]" === Object.prototype.toString.call(e) ? "array" : n.nodebuffer && s.isBuffer(e) ? "nodebuffer" : n.uint8array && e instanceof Uint8Array ? "uint8array" : n.arraybuffer && e instanceof ArrayBuffer ? "arraybuffer" : void 0;}, t.checkSupport = function (e) {if (!n[e.toLowerCase()]) throw new Error(e + " is not supported by this platform");}, t.MAX_VALUE_16BITS = 65535, t.MAX_VALUE_32BITS = -1, t.pretty = function (e) {var t, - r, - n = "";for (r = 0; r < (e || "").length; r++) n += "\\x" + ((t = e.charCodeAt(r)) < 16 ? "0" : "") + t.toString(16).toUpperCase();return n;}, t.delay = function (e, t, r) {i(function () {e.apply(r || null, t || []);});}, t.inherits = function (e, t) {var r = function () {};r.prototype = t.prototype, e.prototype = new r();}, t.extend = function () {var e, - t, - r = {};for (e = 0; e < arguments.length; e++) for (t in arguments[e]) arguments[e].hasOwnProperty(t) && void 0 === r[t] && (r[t] = arguments[e][t]);return r;}, t.prepareContent = function (e, r, s, i, l) {return a.Promise.resolve(r).then(function (e) {return n.blob && (e instanceof Blob || -1 !== ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(e))) && "undefined" != typeof FileReader ? new a.Promise(function (t, r) {var n = new FileReader();n.onload = function (e) {t(e.target.result);}, n.onerror = function (e) {r(e.target.error);}, n.readAsArrayBuffer(e);}) : e;}).then(function (r) {var c, - d = t.getTypeOf(r);return d ? ("arraybuffer" === d ? r = t.transformTo("uint8array", r) : "string" === d && (l ? r = o.decode(r) : s && !0 !== i && (r = u(c = r, n.uint8array ? new Uint8Array(c.length) : new Array(c.length)))), r) : a.Promise.reject(new Error("Can't read the data of '" + e + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"));});};}, "./node_modules/jszip/lib/zipEntries.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/reader/readerFor.js"), - o = r("./node_modules/jszip/lib/utils.js"), - s = r("./node_modules/jszip/lib/signature.js"), - i = r("./node_modules/jszip/lib/zipEntry.js"), - a = (r("./node_modules/jszip/lib/utf8.js"), r("./node_modules/jszip/lib/support.js"));function l(e) {this.files = [], this.loadOptions = e;}l.prototype = { checkSignature: function (e) {if (!this.reader.readAndCheckSignature(e)) {this.reader.index -= 4;var t = this.reader.readString(4);throw new Error("Corrupted zip or bug: unexpected signature (" + o.pretty(t) + ", expected " + o.pretty(e) + ")");}}, isSignature: function (e, t) {var r = this.reader.index;this.reader.setIndex(e);var n = this.reader.readString(4) === t;return this.reader.setIndex(r), n;}, readBlockEndOfCentral: function () {this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);var e = this.reader.readData(this.zipCommentLength), - t = a.uint8array ? "uint8array" : "array", - r = o.transformTo(t, e);this.zipComment = this.loadOptions.decodeFileName(r);}, readBlockZip64EndOfCentral: function () {this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};for (var e, t, r, n = this.zip64EndOfCentralSize - 44; 0 < n;) e = this.reader.readInt(2), t = this.reader.readInt(4), r = this.reader.readData(t), this.zip64ExtensibleData[e] = { id: e, length: t, value: r };}, readBlockZip64EndOfCentralLocator: function () {if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), this.disksCount > 1) throw new Error("Multi-volumes zip are not supported");}, readLocalFiles: function () {var e, t;for (e = 0; e < this.files.length; e++) t = this.files[e], this.reader.setIndex(t.localHeaderOffset), this.checkSignature(s.LOCAL_FILE_HEADER), t.readLocalPart(this.reader), t.handleUTF8(), t.processAttributes();}, readCentralDir: function () {var e;for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(s.CENTRAL_FILE_HEADER);) (e = new i({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(e);if (this.centralDirRecords !== this.files.length && 0 !== this.centralDirRecords && 0 === this.files.length) throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length);}, readEndOfCentral: function () {var e = this.reader.lastIndexOfSignature(s.CENTRAL_DIRECTORY_END);if (e < 0) throw !this.isSignature(0, s.LOCAL_FILE_HEADER) ? new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html") : new Error("Corrupted zip: can't find end of central directory");this.reader.setIndex(e);var t = e;if (this.checkSignature(s.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === o.MAX_VALUE_16BITS || this.diskWithCentralDirStart === o.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === o.MAX_VALUE_16BITS || this.centralDirRecords === o.MAX_VALUE_16BITS || this.centralDirSize === o.MAX_VALUE_32BITS || this.centralDirOffset === o.MAX_VALUE_32BITS) {if (this.zip64 = !0, (e = this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");if (this.reader.setIndex(e), this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, s.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();}var r = this.centralDirOffset + this.centralDirSize;this.zip64 && (r += 20, r += 12 + this.zip64EndOfCentralSize);var n = t - r;if (n > 0) this.isSignature(t, s.CENTRAL_FILE_HEADER) || (this.reader.zero = n);else if (n < 0) throw new Error("Corrupted zip: missing " + Math.abs(n) + " bytes.");}, prepareReader: function (e) {this.reader = n(e);}, load: function (e) {this.prepareReader(e), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();} }, e.exports = l;}, "./node_modules/jszip/lib/zipEntry.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/reader/readerFor.js"), - o = r("./node_modules/jszip/lib/utils.js"), - s = r("./node_modules/jszip/lib/compressedObject.js"), - i = r("./node_modules/jszip/lib/crc32.js"), - a = r("./node_modules/jszip/lib/utf8.js"), - l = r("./node_modules/jszip/lib/compressions.js"), - u = r("./node_modules/jszip/lib/support.js");function c(e, t) {this.options = e, this.loadOptions = t;}c.prototype = { isEncrypted: function () {return 1 == (1 & this.bitFlag);}, useUTF8: function () {return 2048 == (2048 & this.bitFlag);}, readLocalPart: function (e) {var t, r;if (e.skip(22), this.fileNameLength = e.readInt(2), r = e.readInt(2), this.fileName = e.readData(this.fileNameLength), e.skip(r), -1 === this.compressedSize || -1 === this.uncompressedSize) throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");if (null === (t = function (e) {for (var t in l) if (l.hasOwnProperty(t) && l[t].magic === e) return l[t];return null;}(this.compressionMethod))) throw new Error("Corrupted zip : compression " + o.pretty(this.compressionMethod) + " unknown (inner file : " + o.transformTo("string", this.fileName) + ")");this.decompressed = new s(this.compressedSize, this.uncompressedSize, this.crc32, t, e.readData(this.compressedSize));}, readCentralPart: function (e) {this.versionMadeBy = e.readInt(2), e.skip(2), this.bitFlag = e.readInt(2), this.compressionMethod = e.readString(2), this.date = e.readDate(), this.crc32 = e.readInt(4), this.compressedSize = e.readInt(4), this.uncompressedSize = e.readInt(4);var t = e.readInt(2);if (this.extraFieldsLength = e.readInt(2), this.fileCommentLength = e.readInt(2), this.diskNumberStart = e.readInt(2), this.internalFileAttributes = e.readInt(2), this.externalFileAttributes = e.readInt(4), this.localHeaderOffset = e.readInt(4), this.isEncrypted()) throw new Error("Encrypted zip are not supported");e.skip(t), this.readExtraFields(e), this.parseZIP64ExtraField(e), this.fileComment = e.readData(this.fileCommentLength);}, processAttributes: function () {this.unixPermissions = null, this.dosPermissions = null;var e = this.versionMadeBy >> 8;this.dir = !!(16 & this.externalFileAttributes), 0 === e && (this.dosPermissions = 63 & this.externalFileAttributes), 3 === e && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || "/" !== this.fileNameStr.slice(-1) || (this.dir = !0);}, parseZIP64ExtraField: function (e) {if (this.extraFields[1]) {var t = n(this.extraFields[1].value);this.uncompressedSize === o.MAX_VALUE_32BITS && (this.uncompressedSize = t.readInt(8)), this.compressedSize === o.MAX_VALUE_32BITS && (this.compressedSize = t.readInt(8)), this.localHeaderOffset === o.MAX_VALUE_32BITS && (this.localHeaderOffset = t.readInt(8)), this.diskNumberStart === o.MAX_VALUE_32BITS && (this.diskNumberStart = t.readInt(4));}}, readExtraFields: function (e) {var t, - r, - n, - o = e.index + this.extraFieldsLength;for (this.extraFields || (this.extraFields = {}); e.index + 4 < o;) t = e.readInt(2), r = e.readInt(2), n = e.readData(r), this.extraFields[t] = { id: t, length: r, value: n };e.setIndex(o);}, handleUTF8: function () {var e = u.uint8array ? "uint8array" : "array";if (this.useUTF8()) this.fileNameStr = a.utf8decode(this.fileName), this.fileCommentStr = a.utf8decode(this.fileComment);else {var t = this.findExtraFieldUnicodePath();if (null !== t) this.fileNameStr = t;else {var r = o.transformTo(e, this.fileName);this.fileNameStr = this.loadOptions.decodeFileName(r);}var n = this.findExtraFieldUnicodeComment();if (null !== n) this.fileCommentStr = n;else {var s = o.transformTo(e, this.fileComment);this.fileCommentStr = this.loadOptions.decodeFileName(s);}}}, findExtraFieldUnicodePath: function () {var e = this.extraFields[28789];if (e) {var t = n(e.value);return 1 !== t.readInt(1) || i(this.fileName) !== t.readInt(4) ? null : a.utf8decode(t.readData(e.length - 5));}return null;}, findExtraFieldUnicodeComment: function () {var e = this.extraFields[25461];if (e) {var t = n(e.value);return 1 !== t.readInt(1) || i(this.fileComment) !== t.readInt(4) ? null : a.utf8decode(t.readData(e.length - 5));}return null;} }, e.exports = c;}, "./node_modules/jszip/lib/zipObject.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/jszip/lib/stream/StreamHelper.js"), - o = r("./node_modules/jszip/lib/stream/DataWorker.js"), - s = r("./node_modules/jszip/lib/utf8.js"), - i = r("./node_modules/jszip/lib/compressedObject.js"), - a = r("./node_modules/jszip/lib/stream/GenericWorker.js"), - l = function (e, t, r) {this.name = e, this.dir = r.dir, this.date = r.date, this.comment = r.comment, this.unixPermissions = r.unixPermissions, this.dosPermissions = r.dosPermissions, this._data = t, this._dataBinary = r.binary, this.options = { compression: r.compression, compressionOptions: r.compressionOptions };};l.prototype = { internalStream: function (e) {var t = null, - r = "string";try {if (!e) throw new Error("No output type specified.");var o = "string" === (r = e.toLowerCase()) || "text" === r;"binarystring" !== r && "text" !== r || (r = "string"), t = this._decompressWorker();var i = !this._dataBinary;i && !o && (t = t.pipe(new s.Utf8EncodeWorker())), !i && o && (t = t.pipe(new s.Utf8DecodeWorker()));} catch (e) {(t = new a("error")).error(e);}return new n(t, r, "");}, async: function (e, t) {return this.internalStream(e).accumulate(t);}, nodeStream: function (e, t) {return this.internalStream(e || "nodebuffer").toNodejsStream(t);}, _compressWorker: function (e, t) {if (this._data instanceof i && this._data.compression.magic === e.magic) return this._data.getCompressedWorker();var r = this._decompressWorker();return this._dataBinary || (r = r.pipe(new s.Utf8EncodeWorker())), i.createWorkerFrom(r, e, t);}, _decompressWorker: function () {return this._data instanceof i ? this._data.getContentWorker() : this._data instanceof a ? this._data : new o(this._data);} };for (var u = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"], c = function () {throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");}, d = 0; d < u.length; d++) l.prototype[u[d]] = c;e.exports = l;}, "./node_modules/keyboardevent-from-electron-accelerator/index.js": function (e, t) {const r = /^(CommandOrControl|CmdOrCtrl|Command|Cmd|Control|Ctrl|AltGr|Option|Alt|Shift|Super)/i, - n = /^(Plus|Space|Tab|Backspace|Delete|Insert|Return|Enter|Up|Down|Left|Right|Home|End|PageUp|PageDown|Escape|Esc|VolumeUp|VolumeDown|VolumeMute|MediaNextTrack|MediaPreviousTrack|MediaStop|MediaPlayPause|PrintScreen|F24|F23|F22|F21|F20|F19|F18|F17|F16|F15|F14|F13|F12|F11|F10|F9|F8|F7|F6|F5|F4|F3|F2|F1|[0-9A-Z)!@#$%^&*(:+<_>?~{|}";=,\-./`[\\\]'])/i, - o = {};function s({ - accelerator: e, - event: t - }, r) {switch (r) {case "command":case "cmd": - return function (e, t, r) {if ("darwin" !== process.platform) return o;if (t.metaKey) throw new Error("Double `Command` modifier specified.");return { event: Object.assign({}, t, { metaKey: !0 }), accelerator: e.slice(r.length) };}(e, t, r); - case "super": - return function (e, t, r) {if (t.metaKey) throw new Error("Double `Super` modifier specified.");return { event: Object.assign({}, t, { metaKey: !0 }), accelerator: e.slice(r.length) };}(e, t, r); - case "control":case "ctrl": - return function (e, t, r) {if (t.ctrlKey) throw new Error("Double `Control` modifier specified.");return { event: Object.assign({}, t, { ctrlKey: !0 }), accelerator: e.slice(r.length) };}(e, t, r); - case "commandorcontrol":case "cmdorctrl": - return function (e, t, r) {if ("darwin" === process.platform) {if (t.metaKey) throw new Error("Double `Command` modifier specified.");return { event: Object.assign({}, t, { metaKey: !0 }), accelerator: e.slice(r.length) };}if (t.ctrlKey) throw new Error("Double `Control` modifier specified.");return { event: Object.assign({}, t, { ctrlKey: !0 }), accelerator: e.slice(r.length) };}(e, t, r); - case "option":case "altgr":case "alt": - return function (e, t, r) {if ("option" === r && "darwin" !== process.platform) return o;if (t.altKey) throw new Error("Double `Alt` modifier specified.");return { event: Object.assign({}, t, { altKey: !0 }), accelerator: e.slice(r.length) };}(e, t, r); - case "shift": - return function (e, t, r) {if (t.shiftKey) throw new Error("Double `Shift` modifier specified.");return { event: Object.assign({}, t, { shiftKey: !0 }), accelerator: e.slice(r.length) };}(e, t, r); - default: - console.error(r); - }}function i({ - accelerator: e, - event: t - }) {return { event: t, accelerator: e.trim().slice(1) };}const a = { 0: "Digit0", 1: "Digit1", 2: "Digit2", 3: "Digit3", 4: "Digit4", 5: "Digit5", 6: "Digit6", 7: "Digit7", 8: "Digit8", 9: "Digit9", "-": "Minus", "=": "Equal", Q: "KeyQ", W: "KeyW", E: "KeyE", R: "KeyR", T: "KeyT", Y: "KeyY", U: "KeyU", I: "KeyI", O: "KeyO", P: "KeyP", "[": "BracketLeft", "]": "BracketRight", A: "KeyA", S: "KeyS", D: "KeyD", F: "KeyF", G: "KeyG", H: "KeyH", J: "KeyJ", K: "KeyK", L: "KeyL", ";": "Semicolon", "'": "Quote", "`": "Backquote", "/": "Backslash", Z: "KeyZ", X: "KeyX", C: "KeyC", V: "KeyV", B: "KeyB", N: "KeyN", M: "KeyM", ",": "Comma", ".": "Period", "\\": "Slash", " ": "Space" };function l({ - accelerator: e, - event: t - }, r) {if (r.length > 1 || t.key) throw new Error(`Unvalid keycode \`${r}\`.`);const n = r.toUpperCase() in a ? a[r.toUpperCase()] : null;return { event: Object.assign({}, t, { key: r }, n ? { code: n } : null), accelerator: e.trim().slice(r.length) };}const u = Object.assign(Object.create(null), { plus: "Add", space: "Space", tab: "Tab", backspace: "Backspace", delete: "Delete", insert: "Insert", return: "Return", enter: "Return", up: "ArrowUp", down: "ArrowDown", left: "ArrowLeft", right: "ArrowRight", home: "Home", end: "End", pageup: "PageUp", pagedown: "PageDown", escape: "Escape", esc: "Escape", volumeup: "AudioVolumeUp", volumedown: "AudioVolumeDown", volumemute: "AudioVolumeMute", medianexttrack: "MediaTrackNext", mediaprevioustrack: "MediaTrackPrevious", mediastop: "MediaStop", mediaplaypause: "MediaPlayPause", printscreen: "PrintScreen" });for (let e = 1; e <= 24; e++) u["f" + e] = "F" + e;function c({ - accelerator: e, - event: t - }, { - code: r, - key: n - }) {if (t.code) throw new Error(`Duplicated keycode \`${n}\`.`);return { event: Object.assign({}, t, { key: n }, r ? { code: r } : null), accelerator: e.trim().slice(n && n.length || 0) };}e.exports = { UNSUPPORTED: o, reduceModifier: s, reducePlus: i, reduceKey: l, reduceCode: c, toKeyEvent: function (e) {let t = { accelerator: e, event: {} };for (; "" !== t.accelerator;) {const e = t.accelerator.match(r);if (e) {if (t = s(t, e[0].toLowerCase()), t === o) return { unsupportedKeyForPlatform: !0 };} else if ("+" === t.accelerator.trim()[0]) t = i(t);else {const e = t.accelerator.match(n);if (!e) throw new Error(`Unvalid accelerator: "${t.accelerator}"`);{const r = e[0].toLowerCase();t = r in u ? c(t, { code: u[r], key: r }) : l(t, r);}}}return t.event;} };}, "./node_modules/keyboardevents-areequal/index.js": function (e, t, r) {"use strict"; - function n(e) {return "string" != typeof e ? e : e.toLowerCase();}e.exports = function (e, t) {if (e === t) return !0;for (const r of ["altKey", "ctrlKey", "shiftKey", "metaKey"]) {const [n, o] = [e[r], t[r]];if (Boolean(n) !== Boolean(o)) return !1;}return n(e.key) === n(t.key) && void 0 !== e.key || e.code === t.code && void 0 !== e.code;};}, "./node_modules/lie/lib/index.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/immediate/lib/index.js");function o() {}var s = {}, - i = ["REJECTED"], - a = ["FULFILLED"], - l = ["PENDING"];if (!process.browser) var u = ["UNHANDLED"];function c(e) {if ("function" != typeof e) throw new TypeError("resolver must be a function");this.state = l, this.queue = [], this.outcome = void 0, process.browser || (this.handled = u), e !== o && p(this, e);}function d(e, t, r) {this.promise = e, "function" == typeof t && (this.onFulfilled = t, this.callFulfilled = this.otherCallFulfilled), "function" == typeof r && (this.onRejected = r, this.callRejected = this.otherCallRejected);}function h(e, t, r) {n(function () {var n;try {n = t(r);} catch (t) {return s.reject(e, t);}n === e ? s.reject(e, new TypeError("Cannot resolve promise with itself")) : s.resolve(e, n);});}function f(e) {var t = e && e.then;if (e && ("object" == typeof e || "function" == typeof e) && "function" == typeof t) return function () {t.apply(e, arguments);};}function p(e, t) {var r = !1;function n(t) {r || (r = !0, s.reject(e, t));}function o(t) {r || (r = !0, s.resolve(e, t));}var i = m(function () {t(o, n);});"error" === i.status && n(i.value);}function m(e, t) {var r = {};try {r.value = e(t), r.status = "success";} catch (e) {r.status = "error", r.value = e;}return r;}e.exports = c, c.prototype.finally = function (e) {if ("function" != typeof e) return this;var t = this.constructor;return this.then(function (r) {return t.resolve(e()).then(function () {return r;});}, function (r) {return t.resolve(e()).then(function () {throw r;});});}, c.prototype.catch = function (e) {return this.then(null, e);}, c.prototype.then = function (e, t) {if ("function" != typeof e && this.state === a || "function" != typeof t && this.state === i) return this;var r = new this.constructor(o);(process.browser || this.handled === u && (this.handled = null), this.state !== l) ? h(r, this.state === a ? e : t, this.outcome) : this.queue.push(new d(r, e, t));return r;}, d.prototype.callFulfilled = function (e) {s.resolve(this.promise, e);}, d.prototype.otherCallFulfilled = function (e) {h(this.promise, this.onFulfilled, e);}, d.prototype.callRejected = function (e) {s.reject(this.promise, e);}, d.prototype.otherCallRejected = function (e) {h(this.promise, this.onRejected, e);}, s.resolve = function (e, t) {var r = m(f, t);if ("error" === r.status) return s.reject(e, r.value);var n = r.value;if (n) p(e, n);else {e.state = a, e.outcome = t;for (var o = -1, i = e.queue.length; ++o < i;) e.queue[o].callFulfilled(t);}return e;}, s.reject = function (e, t) {e.state = i, e.outcome = t, process.browser || e.handled === u && n(function () {e.handled === u && process.emit("unhandledRejection", t, e);});for (var r = -1, o = e.queue.length; ++r < o;) e.queue[r].callRejected(t);return e;}, c.resolve = function (e) {if (e instanceof this) return e;return s.resolve(new this(o), e);}, c.reject = function (e) {var t = new this(o);return s.reject(t, e);}, c.all = function (e) {var t = this;if ("[object Array]" !== Object.prototype.toString.call(e)) return this.reject(new TypeError("must be an array"));var r = e.length, - n = !1;if (!r) return this.resolve([]);var i = new Array(r), - a = 0, - l = -1, - u = new this(o);for (; ++l < r;) c(e[l], l);return u;function c(e, o) {t.resolve(e).then(function (e) {i[o] = e, ++a !== r || n || (n = !0, s.resolve(u, i));}, function (e) {n || (n = !0, s.reject(u, e));});}}, c.race = function (e) {var t = this;if ("[object Array]" !== Object.prototype.toString.call(e)) return this.reject(new TypeError("must be an array"));var r = e.length, - n = !1;if (!r) return this.resolve([]);var i = -1, - a = new this(o);for (; ++i < r;) l = e[i], t.resolve(l).then(function (e) {n || (n = !0, s.resolve(a, e));}, function (e) {n || (n = !0, s.reject(a, e));});var l;return a;};}, "./node_modules/minimatch/minimatch.js": function (e, t, r) {e.exports = c, c.Minimatch = d;var n = { sep: "/" };try {n = r("path");} catch (e) {}var o = c.GLOBSTAR = d.GLOBSTAR = {}, - s = r("./node_modules/brace-expansion/index.js"), - i = { "!": { open: "(?:(?!(?:", close: "))[^/]*?)" }, "?": { open: "(?:", close: ")?" }, "+": { open: "(?:", close: ")+" }, "*": { open: "(?:", close: ")*" }, "@": { open: "(?:", close: ")" } }, - a = "().*{}+?[]^$\\!".split("").reduce(function (e, t) {return e[t] = !0, e;}, {});var l = /\/+/;function u(e, t) {e = e || {}, t = t || {};var r = {};return Object.keys(t).forEach(function (e) {r[e] = t[e];}), Object.keys(e).forEach(function (t) {r[t] = e[t];}), r;}function c(e, t, r) {if ("string" != typeof t) throw new TypeError("glob pattern string required");return r || (r = {}), !(!r.nocomment && "#" === t.charAt(0)) && ("" === t.trim() ? "" === e : new d(t, r).match(e));}function d(e, t) {if (!(this instanceof d)) return new d(e, t);if ("string" != typeof e) throw new TypeError("glob pattern string required");t || (t = {}), e = e.trim(), "/" !== n.sep && (e = e.split(n.sep).join("/")), this.options = t, this.set = [], this.pattern = e, this.regexp = null, this.negate = !1, this.comment = !1, this.empty = !1, this.make();}function h(e, t) {if (t || (t = this instanceof d ? this.options : {}), void 0 === (e = void 0 === e ? this.pattern : e)) throw new TypeError("undefined pattern");return t.nobrace || !e.match(/\{.*\}/) ? [e] : s(e);}c.filter = function (e, t) {return t = t || {}, function (r, n, o) {return c(r, e, t);};}, c.defaults = function (e) {if (!e || !Object.keys(e).length) return c;var t = c, - r = function (r, n, o) {return t.minimatch(r, n, u(e, o));};return r.Minimatch = function (r, n) {return new t.Minimatch(r, u(e, n));}, r;}, d.defaults = function (e) {return e && Object.keys(e).length ? c.defaults(e).Minimatch : d;}, d.prototype.debug = function () {}, d.prototype.make = function () {if (this._made) return;var e = this.pattern, - t = this.options;if (!t.nocomment && "#" === e.charAt(0)) return void (this.comment = !0);if (!e) return void (this.empty = !0);this.parseNegate();var r = this.globSet = this.braceExpand();t.debug && (this.debug = console.error);this.debug(this.pattern, r), r = this.globParts = r.map(function (e) {return e.split(l);}), this.debug(this.pattern, r), r = r.map(function (e, t, r) {return e.map(this.parse, this);}, this), this.debug(this.pattern, r), r = r.filter(function (e) {return -1 === e.indexOf(!1);}), this.debug(this.pattern, r), this.set = r;}, d.prototype.parseNegate = function () {var e = this.pattern, - t = !1, - r = this.options, - n = 0;if (r.nonegate) return;for (var o = 0, s = e.length; o < s && "!" === e.charAt(o); o++) t = !t, n++;n && (this.pattern = e.substr(n));this.negate = t;}, c.braceExpand = function (e, t) {return h(e, t);}, d.prototype.braceExpand = h, d.prototype.parse = function (e, t) {if (e.length > 65536) throw new TypeError("pattern is too long");var r = this.options;if (!r.noglobstar && "**" === e) return o;if ("" === e) return "";var n, - s = "", - l = !!r.nocase, - u = !1, - c = [], - d = [], - h = !1, - p = -1, - m = -1, - g = "." === e.charAt(0) ? "" : r.dot ? "(?!(?:^|\\/)\\.{1,2}(?:$|\\/))" : "(?!\\.)", - _ = this;function v() {if (n) {switch (n) {case "*": - s += "[^/]*?", l = !0; - break; - case "?": - s += "[^/]", l = !0; - break; - default: - s += "\\" + n; - }_.debug("clearStateChar %j %j", n, s), n = !1;}}for (var b, y = 0, w = e.length; y < w && (b = e.charAt(y)); y++) if (this.debug("%s\t%s %s %j", e, y, s, b), u && a[b]) s += "\\" + b, u = !1;else switch (b) {case "/": - return !1; - case "\\": - v(), u = !0; - continue; - case "?":case "*":case "+":case "@":case "!": - if (this.debug("%s\t%s %s %j <-- stateChar", e, y, s, b), h) {this.debug(" in class"), "!" === b && y === m + 1 && (b = "^"), s += b;continue;} - - _.debug("call clearStateChar %j", n), v(), n = b, r.noext && v(); - continue; - case "(": - if (h) {s += "(";continue;} - - if (!n) {s += "\\(";continue;} - - c.push({ type: n, start: y - 1, reStart: s.length, open: i[n].open, close: i[n].close }), s += "!" === n ? "(?:(?!(?:" : "(?:", this.debug("plType %j %j", n, s), n = !1; - continue; - case ")": - if (h || !c.length) {s += "\\)";continue;} - - v(), l = !0; - var j = c.pop(); - s += j.close, "!" === j.type && d.push(j), j.reEnd = s.length; - continue; - case "|": - if (h || !c.length || u) {s += "\\|", u = !1;continue;} - - v(), s += "|"; - continue; - case "[": - if (v(), h) {s += "\\" + b;continue;} - - h = !0, m = y, p = s.length, s += b; - continue; - case "]": - if (y === m + 1 || !h) {s += "\\" + b, u = !1;continue;} - - if (h) {var E = e.substring(m + 1, y);try {RegExp("[" + E + "]");} catch (e) {var k = this.parse(E, f);s = s.substr(0, p) + "\\[" + k[0] + "\\]", l = l || k[1], h = !1;continue;}} - - l = !0, h = !1, s += b; - continue; - default: - v(), u ? u = !1 : !a[b] || "^" === b && h || (s += "\\"), s += b; - }h && (E = e.substr(m + 1), k = this.parse(E, f), s = s.substr(0, p) + "\\[" + k[0], l = l || k[1]);for (j = c.pop(); j; j = c.pop()) {var S = s.slice(j.reStart + j.open.length);this.debug("setting tail", s, j), S = S.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (e, t, r) {return r || (r = "\\"), t + t + r + "|";}), this.debug("tail=%j\n %s", S, S, j, s);var C = "*" === j.type ? "[^/]*?" : "?" === j.type ? "[^/]" : "\\" + j.type;l = !0, s = s.slice(0, j.reStart) + C + "\\(" + S;}v(), u && (s += "\\\\");var x = !1;switch (s.charAt(0)) {case ".":case "[":case "(": - x = !0; - }for (var O = d.length - 1; O > -1; O--) {var A = d[O], - R = s.slice(0, A.reStart), - I = s.slice(A.reStart, A.reEnd - 8), - T = s.slice(A.reEnd - 8, A.reEnd), - L = s.slice(A.reEnd);T += L;var N = R.split("(").length - 1, - z = L;for (y = 0; y < N; y++) z = z.replace(/\)[+*?]?/, "");var M = "";"" === (L = z) && t !== f && (M = "$"), s = R + I + L + M + T;}"" !== s && l && (s = "(?=.)" + s);x && (s = g + s);if (t === f) return [s, l];if (!l) return function (e) {return e.replace(/\\(.)/g, "$1");}(e);var D = r.nocase ? "i" : "";try {var P = new RegExp("^" + s + "$", D);} catch (e) {return new RegExp("$.");}return P._glob = e, P._src = s, P;};var f = {};c.makeRe = function (e, t) {return new d(e, t || {}).makeRe();}, d.prototype.makeRe = function () {if (this.regexp || !1 === this.regexp) return this.regexp;var e = this.set;if (!e.length) return this.regexp = !1, this.regexp;var t = this.options, - r = t.noglobstar ? "[^/]*?" : t.dot ? "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?" : "(?:(?!(?:\\/|^)\\.).)*?", - n = t.nocase ? "i" : "", - s = e.map(function (e) {return e.map(function (e) {return e === o ? r : "string" == typeof e ? function (e) {return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");}(e) : e._src;}).join("\\/");}).join("|");s = "^(?:" + s + ")$", this.negate && (s = "^(?!" + s + ").*$");try {this.regexp = new RegExp(s, n);} catch (e) {this.regexp = !1;}return this.regexp;}, c.match = function (e, t, r) {var n = new d(t, r = r || {});return e = e.filter(function (e) {return n.match(e);}), n.options.nonull && !e.length && e.push(t), e;}, d.prototype.match = function (e, t) {if (this.debug("match", e, this.pattern), this.comment) return !1;if (this.empty) return "" === e;if ("/" === e && t) return !0;var r = this.options;"/" !== n.sep && (e = e.split(n.sep).join("/"));e = e.split(l), this.debug(this.pattern, "split", e);var o, - s, - i = this.set;for (this.debug(this.pattern, "set", i), s = e.length - 1; s >= 0 && !(o = e[s]); s--);for (s = 0; s < i.length; s++) {var a = i[s], - u = e;if (r.matchBase && 1 === a.length && (u = [o]), this.matchOne(u, a, t)) return !!r.flipNegate || !this.negate;}return !r.flipNegate && this.negate;}, d.prototype.matchOne = function (e, t, r) {var n = this.options;this.debug("matchOne", { this: this, file: e, pattern: t }), this.debug("matchOne", e.length, t.length);for (var s = 0, i = 0, a = e.length, l = t.length; s < a && i < l; s++, i++) {this.debug("matchOne loop");var u, - c = t[i], - d = e[s];if (this.debug(t, c, d), !1 === c) return !1;if (c === o) {this.debug("GLOBSTAR", [t, c, d]);var h = s, - f = i + 1;if (f === l) {for (this.debug("** at the end"); s < a; s++) if ("." === e[s] || ".." === e[s] || !n.dot && "." === e[s].charAt(0)) return !1;return !0;}for (; h < a;) {var p = e[h];if (this.debug("\nglobstar while", e, h, t, f, p), this.matchOne(e.slice(h), t.slice(f), r)) return this.debug("globstar found match!", h, a, p), !0;if ("." === p || ".." === p || !n.dot && "." === p.charAt(0)) {this.debug("dot detected!", e, h, t, f);break;}this.debug("globstar swallow a segment, and continue"), h++;}return !(!r || (this.debug("\n>>> no match, partial?", e, h, t, f), h !== a));}if ("string" == typeof c ? (u = n.nocase ? d.toLowerCase() === c.toLowerCase() : d === c, this.debug("string match", c, d, u)) : (u = d.match(c), this.debug("pattern match", c, d, u)), !u) return !1;}if (s === a && i === l) return !0;if (s === a) return r;if (i === l) return s === a - 1 && "" === e[s];throw new Error("wtf?");};}, "./node_modules/ms/index.js": function (e, t) {var r = 1e3, - n = 6e4, - o = 60 * n, - s = 24 * o;function i(e, t, r, n) {var o = t >= 1.5 * r;return Math.round(e / r) + " " + n + (o ? "s" : "");}e.exports = function (e, t) {t = t || {};var a = typeof e;if ("string" === a && e.length > 0) return function (e) {if ((e = String(e)).length > 100) return;var t = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if (!t) return;var i = parseFloat(t[1]);switch ((t[2] || "ms").toLowerCase()) {case "years":case "year":case "yrs":case "yr":case "y": - return 315576e5 * i; - case "weeks":case "week":case "w": - return 6048e5 * i; - case "days":case "day":case "d": - return i * s; - case "hours":case "hour":case "hrs":case "hr":case "h": - return i * o; - case "minutes":case "minute":case "mins":case "min":case "m": - return i * n; - case "seconds":case "second":case "secs":case "sec":case "s": - return i * r; - case "milliseconds":case "millisecond":case "msecs":case "msec":case "ms": - return i; - default: - return; - }}(e);if ("number" === a && isFinite(e)) return t.long ? function (e) {var t = Math.abs(e);if (t >= s) return i(e, t, s, "day");if (t >= o) return i(e, t, o, "hour");if (t >= n) return i(e, t, n, "minute");if (t >= r) return i(e, t, r, "second");return e + " ms";}(e) : function (e) {var t = Math.abs(e);if (t >= s) return Math.round(e / s) + "d";if (t >= o) return Math.round(e / o) + "h";if (t >= n) return Math.round(e / n) + "m";if (t >= r) return Math.round(e / r) + "s";return e + "ms";}(e);throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(e));};}, "./node_modules/once/once.js": function (e, t, r) {var n = r("./node_modules/wrappy/wrappy.js");function o(e) {var t = function () {return t.called ? t.value : (t.called = !0, t.value = e.apply(this, arguments));};return t.called = !1, t;}function s(e) {var t = function () {if (t.called) throw new Error(t.onceError);return t.called = !0, t.value = e.apply(this, arguments);}, - r = e.name || "Function wrapped with `once`";return t.onceError = r + " shouldn't be called more than once", t.called = !1, t;}e.exports = n(o), e.exports.strict = n(s), o.proto = o(function () {Object.defineProperty(Function.prototype, "once", { value: function () {return o(this);}, configurable: !0 }), Object.defineProperty(Function.prototype, "onceStrict", { value: function () {return s(this);}, configurable: !0 });});}, "./node_modules/pako/index.js": function (e, t, r) {"use strict"; - var n = {};(0, r("./node_modules/pako/lib/utils/common.js").assign)(n, r("./node_modules/pako/lib/deflate.js"), r("./node_modules/pako/lib/inflate.js"), r("./node_modules/pako/lib/zlib/constants.js")), e.exports = n;}, "./node_modules/pako/lib/deflate.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/pako/lib/zlib/deflate.js"), - o = r("./node_modules/pako/lib/utils/common.js"), - s = r("./node_modules/pako/lib/utils/strings.js"), - i = r("./node_modules/pako/lib/zlib/messages.js"), - a = r("./node_modules/pako/lib/zlib/zstream.js"), - l = Object.prototype.toString;function u(e) {if (!(this instanceof u)) return new u(e);this.options = o.assign({ level: -1, method: 8, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: 0, to: "" }, e || {});var t = this.options;t.raw && t.windowBits > 0 ? t.windowBits = -t.windowBits : t.gzip && t.windowBits > 0 && t.windowBits < 16 && (t.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new a(), this.strm.avail_out = 0;var r = n.deflateInit2(this.strm, t.level, t.method, t.windowBits, t.memLevel, t.strategy);if (0 !== r) throw new Error(i[r]);if (t.header && n.deflateSetHeader(this.strm, t.header), t.dictionary) {var c;if (c = "string" == typeof t.dictionary ? s.string2buf(t.dictionary) : "[object ArrayBuffer]" === l.call(t.dictionary) ? new Uint8Array(t.dictionary) : t.dictionary, 0 !== (r = n.deflateSetDictionary(this.strm, c))) throw new Error(i[r]);this._dict_set = !0;}}function c(e, t) {var r = new u(t);if (r.push(e, !0), r.err) throw r.msg || i[r.err];return r.result;}u.prototype.push = function (e, t) {var r, - i, - a = this.strm, - u = this.options.chunkSize;if (this.ended) return !1;i = t === ~~t ? t : !0 === t ? 4 : 0, "string" == typeof e ? a.input = s.string2buf(e) : "[object ArrayBuffer]" === l.call(e) ? a.input = new Uint8Array(e) : a.input = e, a.next_in = 0, a.avail_in = a.input.length;do {if (0 === a.avail_out && (a.output = new o.Buf8(u), a.next_out = 0, a.avail_out = u), 1 !== (r = n.deflate(a, i)) && 0 !== r) return this.onEnd(r), this.ended = !0, !1;0 !== a.avail_out && (0 !== a.avail_in || 4 !== i && 2 !== i) || ("string" === this.options.to ? this.onData(s.buf2binstring(o.shrinkBuf(a.output, a.next_out))) : this.onData(o.shrinkBuf(a.output, a.next_out)));} while ((a.avail_in > 0 || 0 === a.avail_out) && 1 !== r);return 4 === i ? (r = n.deflateEnd(this.strm), this.onEnd(r), this.ended = !0, 0 === r) : 2 !== i || (this.onEnd(0), a.avail_out = 0, !0);}, u.prototype.onData = function (e) {this.chunks.push(e);}, u.prototype.onEnd = function (e) {0 === e && ("string" === this.options.to ? this.result = this.chunks.join("") : this.result = o.flattenChunks(this.chunks)), this.chunks = [], this.err = e, this.msg = this.strm.msg;}, t.Deflate = u, t.deflate = c, t.deflateRaw = function (e, t) {return (t = t || {}).raw = !0, c(e, t);}, t.gzip = function (e, t) {return (t = t || {}).gzip = !0, c(e, t);};}, "./node_modules/pako/lib/inflate.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/pako/lib/zlib/inflate.js"), - o = r("./node_modules/pako/lib/utils/common.js"), - s = r("./node_modules/pako/lib/utils/strings.js"), - i = r("./node_modules/pako/lib/zlib/constants.js"), - a = r("./node_modules/pako/lib/zlib/messages.js"), - l = r("./node_modules/pako/lib/zlib/zstream.js"), - u = r("./node_modules/pako/lib/zlib/gzheader.js"), - c = Object.prototype.toString;function d(e) {if (!(this instanceof d)) return new d(e);this.options = o.assign({ chunkSize: 16384, windowBits: 0, to: "" }, e || {});var t = this.options;t.raw && t.windowBits >= 0 && t.windowBits < 16 && (t.windowBits = -t.windowBits, 0 === t.windowBits && (t.windowBits = -15)), !(t.windowBits >= 0 && t.windowBits < 16) || e && e.windowBits || (t.windowBits += 32), t.windowBits > 15 && t.windowBits < 48 && 0 == (15 & t.windowBits) && (t.windowBits |= 15), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new l(), this.strm.avail_out = 0;var r = n.inflateInit2(this.strm, t.windowBits);if (r !== i.Z_OK) throw new Error(a[r]);if (this.header = new u(), n.inflateGetHeader(this.strm, this.header), t.dictionary && ("string" == typeof t.dictionary ? t.dictionary = s.string2buf(t.dictionary) : "[object ArrayBuffer]" === c.call(t.dictionary) && (t.dictionary = new Uint8Array(t.dictionary)), t.raw && (r = n.inflateSetDictionary(this.strm, t.dictionary)) !== i.Z_OK)) throw new Error(a[r]);}function h(e, t) {var r = new d(t);if (r.push(e, !0), r.err) throw r.msg || a[r.err];return r.result;}d.prototype.push = function (e, t) {var r, - a, - l, - u, - d, - h = this.strm, - f = this.options.chunkSize, - p = this.options.dictionary, - m = !1;if (this.ended) return !1;a = t === ~~t ? t : !0 === t ? i.Z_FINISH : i.Z_NO_FLUSH, "string" == typeof e ? h.input = s.binstring2buf(e) : "[object ArrayBuffer]" === c.call(e) ? h.input = new Uint8Array(e) : h.input = e, h.next_in = 0, h.avail_in = h.input.length;do {if (0 === h.avail_out && (h.output = new o.Buf8(f), h.next_out = 0, h.avail_out = f), (r = n.inflate(h, i.Z_NO_FLUSH)) === i.Z_NEED_DICT && p && (r = n.inflateSetDictionary(this.strm, p)), r === i.Z_BUF_ERROR && !0 === m && (r = i.Z_OK, m = !1), r !== i.Z_STREAM_END && r !== i.Z_OK) return this.onEnd(r), this.ended = !0, !1;h.next_out && (0 !== h.avail_out && r !== i.Z_STREAM_END && (0 !== h.avail_in || a !== i.Z_FINISH && a !== i.Z_SYNC_FLUSH) || ("string" === this.options.to ? (l = s.utf8border(h.output, h.next_out), u = h.next_out - l, d = s.buf2string(h.output, l), h.next_out = u, h.avail_out = f - u, u && o.arraySet(h.output, h.output, l, u, 0), this.onData(d)) : this.onData(o.shrinkBuf(h.output, h.next_out)))), 0 === h.avail_in && 0 === h.avail_out && (m = !0);} while ((h.avail_in > 0 || 0 === h.avail_out) && r !== i.Z_STREAM_END);return r === i.Z_STREAM_END && (a = i.Z_FINISH), a === i.Z_FINISH ? (r = n.inflateEnd(this.strm), this.onEnd(r), this.ended = !0, r === i.Z_OK) : a !== i.Z_SYNC_FLUSH || (this.onEnd(i.Z_OK), h.avail_out = 0, !0);}, d.prototype.onData = function (e) {this.chunks.push(e);}, d.prototype.onEnd = function (e) {e === i.Z_OK && ("string" === this.options.to ? this.result = this.chunks.join("") : this.result = o.flattenChunks(this.chunks)), this.chunks = [], this.err = e, this.msg = this.strm.msg;}, t.Inflate = d, t.inflate = h, t.inflateRaw = function (e, t) {return (t = t || {}).raw = !0, h(e, t);}, t.ungzip = h;}, "./node_modules/pako/lib/utils/common.js": function (e, t, r) {"use strict"; - var n = "undefined" != typeof Uint8Array && "undefined" != typeof Uint16Array && "undefined" != typeof Int32Array;function o(e, t) {return Object.prototype.hasOwnProperty.call(e, t);}t.assign = function (e) {for (var t = Array.prototype.slice.call(arguments, 1); t.length;) {var r = t.shift();if (r) {if ("object" != typeof r) throw new TypeError(r + "must be non-object");for (var n in r) o(r, n) && (e[n] = r[n]);}}return e;}, t.shrinkBuf = function (e, t) {return e.length === t ? e : e.subarray ? e.subarray(0, t) : (e.length = t, e);};var s = { arraySet: function (e, t, r, n, o) {if (t.subarray && e.subarray) e.set(t.subarray(r, r + n), o);else for (var s = 0; s < n; s++) e[o + s] = t[r + s];}, flattenChunks: function (e) {var t, r, n, o, s, i;for (n = 0, t = 0, r = e.length; t < r; t++) n += e[t].length;for (i = new Uint8Array(n), o = 0, t = 0, r = e.length; t < r; t++) s = e[t], i.set(s, o), o += s.length;return i;} }, - i = { arraySet: function (e, t, r, n, o) {for (var s = 0; s < n; s++) e[o + s] = t[r + s];}, flattenChunks: function (e) {return [].concat.apply([], e);} };t.setTyped = function (e) {e ? (t.Buf8 = Uint8Array, t.Buf16 = Uint16Array, t.Buf32 = Int32Array, t.assign(t, s)) : (t.Buf8 = Array, t.Buf16 = Array, t.Buf32 = Array, t.assign(t, i));}, t.setTyped(n);}, "./node_modules/pako/lib/utils/strings.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/pako/lib/utils/common.js"), - o = !0, - s = !0;try {String.fromCharCode.apply(null, [0]);} catch (e) {o = !1;}try {String.fromCharCode.apply(null, new Uint8Array(1));} catch (e) {s = !1;}for (var i = new n.Buf8(256), a = 0; a < 256; a++) i[a] = a >= 252 ? 6 : a >= 248 ? 5 : a >= 240 ? 4 : a >= 224 ? 3 : a >= 192 ? 2 : 1;function l(e, t) {if (t < 65534 && (e.subarray && s || !e.subarray && o)) return String.fromCharCode.apply(null, n.shrinkBuf(e, t));for (var r = "", i = 0; i < t; i++) r += String.fromCharCode(e[i]);return r;}i[254] = i[254] = 1, t.string2buf = function (e) {var t, - r, - o, - s, - i, - a = e.length, - l = 0;for (s = 0; s < a; s++) 55296 == (64512 & (r = e.charCodeAt(s))) && s + 1 < a && 56320 == (64512 & (o = e.charCodeAt(s + 1))) && (r = 65536 + (r - 55296 << 10) + (o - 56320), s++), l += r < 128 ? 1 : r < 2048 ? 2 : r < 65536 ? 3 : 4;for (t = new n.Buf8(l), i = 0, s = 0; i < l; s++) 55296 == (64512 & (r = e.charCodeAt(s))) && s + 1 < a && 56320 == (64512 & (o = e.charCodeAt(s + 1))) && (r = 65536 + (r - 55296 << 10) + (o - 56320), s++), r < 128 ? t[i++] = r : r < 2048 ? (t[i++] = 192 | r >>> 6, t[i++] = 128 | 63 & r) : r < 65536 ? (t[i++] = 224 | r >>> 12, t[i++] = 128 | r >>> 6 & 63, t[i++] = 128 | 63 & r) : (t[i++] = 240 | r >>> 18, t[i++] = 128 | r >>> 12 & 63, t[i++] = 128 | r >>> 6 & 63, t[i++] = 128 | 63 & r);return t;}, t.buf2binstring = function (e) {return l(e, e.length);}, t.binstring2buf = function (e) {for (var t = new n.Buf8(e.length), r = 0, o = t.length; r < o; r++) t[r] = e.charCodeAt(r);return t;}, t.buf2string = function (e, t) {var r, - n, - o, - s, - a = t || e.length, - u = new Array(2 * a);for (n = 0, r = 0; r < a;) if ((o = e[r++]) < 128) u[n++] = o;else if ((s = i[o]) > 4) u[n++] = 65533, r += s - 1;else {for (o &= 2 === s ? 31 : 3 === s ? 15 : 7; s > 1 && r < a;) o = o << 6 | 63 & e[r++], s--;s > 1 ? u[n++] = 65533 : o < 65536 ? u[n++] = o : (o -= 65536, u[n++] = 55296 | o >> 10 & 1023, u[n++] = 56320 | 1023 & o);}return l(u, n);}, t.utf8border = function (e, t) {var r;for ((t = t || e.length) > e.length && (t = e.length), r = t - 1; r >= 0 && 128 == (192 & e[r]);) r--;return r < 0 || 0 === r ? t : r + i[e[r]] > t ? r : t;};}, "./node_modules/pako/lib/zlib/adler32.js": function (e, t, r) {"use strict"; - e.exports = function (e, t, r, n) {for (var o = 65535 & e | 0, s = e >>> 16 & 65535 | 0, i = 0; 0 !== r;) {r -= i = r > 2e3 ? 2e3 : r;do {s = s + (o = o + t[n++] | 0) | 0;} while (--i);o %= 65521, s %= 65521;}return o | s << 16 | 0;};}, "./node_modules/pako/lib/zlib/constants.js": function (e, t, r) {"use strict"; - e.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 };}, "./node_modules/pako/lib/zlib/crc32.js": function (e, t, r) {"use strict"; - var n = function () {for (var e, t = [], r = 0; r < 256; r++) {e = r;for (var n = 0; n < 8; n++) e = 1 & e ? 3988292384 ^ e >>> 1 : e >>> 1;t[r] = e;}return t;}();e.exports = function (e, t, r, o) {var s = n, - i = o + r;e ^= -1;for (var a = o; a < i; a++) e = e >>> 8 ^ s[255 & (e ^ t[a])];return -1 ^ e;};}, "./node_modules/pako/lib/zlib/deflate.js": function (e, t, r) {"use strict"; - var n, - o = r("./node_modules/pako/lib/utils/common.js"), - s = r("./node_modules/pako/lib/zlib/trees.js"), - i = r("./node_modules/pako/lib/zlib/adler32.js"), - a = r("./node_modules/pako/lib/zlib/crc32.js"), - l = r("./node_modules/pako/lib/zlib/messages.js");function u(e, t) {return e.msg = l[t], t;}function c(e) {return (e << 1) - (e > 4 ? 9 : 0);}function d(e) {for (var t = e.length; --t >= 0;) e[t] = 0;}function h(e) {var t = e.state, - r = t.pending;r > e.avail_out && (r = e.avail_out), 0 !== r && (o.arraySet(e.output, t.pending_buf, t.pending_out, r, e.next_out), e.next_out += r, t.pending_out += r, e.total_out += r, e.avail_out -= r, t.pending -= r, 0 === t.pending && (t.pending_out = 0));}function f(e, t) {s._tr_flush_block(e, e.block_start >= 0 ? e.block_start : -1, e.strstart - e.block_start, t), e.block_start = e.strstart, h(e.strm);}function p(e, t) {e.pending_buf[e.pending++] = t;}function m(e, t) {e.pending_buf[e.pending++] = t >>> 8 & 255, e.pending_buf[e.pending++] = 255 & t;}function g(e, t) {var r, - n, - o = e.max_chain_length, - s = e.strstart, - i = e.prev_length, - a = e.nice_match, - l = e.strstart > e.w_size - 262 ? e.strstart - (e.w_size - 262) : 0, - u = e.window, - c = e.w_mask, - d = e.prev, - h = e.strstart + 258, - f = u[s + i - 1], - p = u[s + i];e.prev_length >= e.good_match && (o >>= 2), a > e.lookahead && (a = e.lookahead);do {if (u[(r = t) + i] === p && u[r + i - 1] === f && u[r] === u[s] && u[++r] === u[s + 1]) {s += 2, r++;do {} while (u[++s] === u[++r] && u[++s] === u[++r] && u[++s] === u[++r] && u[++s] === u[++r] && u[++s] === u[++r] && u[++s] === u[++r] && u[++s] === u[++r] && u[++s] === u[++r] && s < h);if (n = 258 - (h - s), s = h - 258, n > i) {if (e.match_start = t, i = n, n >= a) break;f = u[s + i - 1], p = u[s + i];}}} while ((t = d[t & c]) > l && 0 != --o);return i <= e.lookahead ? i : e.lookahead;}function _(e) {var t, - r, - n, - s, - l, - u, - c, - d, - h, - f, - p = e.w_size;do {if (s = e.window_size - e.lookahead - e.strstart, e.strstart >= p + (p - 262)) {o.arraySet(e.window, e.window, p, p, 0), e.match_start -= p, e.strstart -= p, e.block_start -= p, t = r = e.hash_size;do {n = e.head[--t], e.head[t] = n >= p ? n - p : 0;} while (--r);t = r = p;do {n = e.prev[--t], e.prev[t] = n >= p ? n - p : 0;} while (--r);s += p;}if (0 === e.strm.avail_in) break;if (u = e.strm, c = e.window, d = e.strstart + e.lookahead, h = s, f = void 0, (f = u.avail_in) > h && (f = h), r = 0 === f ? 0 : (u.avail_in -= f, o.arraySet(c, u.input, u.next_in, f, d), 1 === u.state.wrap ? u.adler = i(u.adler, c, f, d) : 2 === u.state.wrap && (u.adler = a(u.adler, c, f, d)), u.next_in += f, u.total_in += f, f), e.lookahead += r, e.lookahead + e.insert >= 3) for (l = e.strstart - e.insert, e.ins_h = e.window[l], e.ins_h = (e.ins_h << e.hash_shift ^ e.window[l + 1]) & e.hash_mask; e.insert && (e.ins_h = (e.ins_h << e.hash_shift ^ e.window[l + 3 - 1]) & e.hash_mask, e.prev[l & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = l, l++, e.insert--, !(e.lookahead + e.insert < 3)););} while (e.lookahead < 262 && 0 !== e.strm.avail_in);}function v(e, t) {for (var r, n;;) {if (e.lookahead < 262) {if (_(e), e.lookahead < 262 && 0 === t) return 1;if (0 === e.lookahead) break;}if (r = 0, e.lookahead >= 3 && (e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 3 - 1]) & e.hash_mask, r = e.prev[e.strstart & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = e.strstart), 0 !== r && e.strstart - r <= e.w_size - 262 && (e.match_length = g(e, r)), e.match_length >= 3) { - if (n = s._tr_tally(e, e.strstart - e.match_start, e.match_length - 3), e.lookahead -= e.match_length, e.match_length <= e.max_lazy_match && e.lookahead >= 3) {e.match_length--;do {e.strstart++, e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 3 - 1]) & e.hash_mask, r = e.prev[e.strstart & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = e.strstart;} while (0 != --e.match_length);e.strstart++;} else e.strstart += e.match_length, e.match_length = 0, e.ins_h = e.window[e.strstart], e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 1]) & e.hash_mask; - } else n = s._tr_tally(e, 0, e.window[e.strstart]), e.lookahead--, e.strstart++;if (n && (f(e, !1), 0 === e.strm.avail_out)) return 1;}return e.insert = e.strstart < 2 ? e.strstart : 2, 4 === t ? (f(e, !0), 0 === e.strm.avail_out ? 3 : 4) : e.last_lit && (f(e, !1), 0 === e.strm.avail_out) ? 1 : 2;}function b(e, t) {for (var r, n, o;;) {if (e.lookahead < 262) {if (_(e), e.lookahead < 262 && 0 === t) return 1;if (0 === e.lookahead) break;}if (r = 0, e.lookahead >= 3 && (e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 3 - 1]) & e.hash_mask, r = e.prev[e.strstart & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = e.strstart), e.prev_length = e.match_length, e.prev_match = e.match_start, e.match_length = 2, 0 !== r && e.prev_length < e.max_lazy_match && e.strstart - r <= e.w_size - 262 && (e.match_length = g(e, r), e.match_length <= 5 && (1 === e.strategy || 3 === e.match_length && e.strstart - e.match_start > 4096) && (e.match_length = 2)), e.prev_length >= 3 && e.match_length <= e.prev_length) {o = e.strstart + e.lookahead - 3, n = s._tr_tally(e, e.strstart - 1 - e.prev_match, e.prev_length - 3), e.lookahead -= e.prev_length - 1, e.prev_length -= 2;do {++e.strstart <= o && (e.ins_h = (e.ins_h << e.hash_shift ^ e.window[e.strstart + 3 - 1]) & e.hash_mask, r = e.prev[e.strstart & e.w_mask] = e.head[e.ins_h], e.head[e.ins_h] = e.strstart);} while (0 != --e.prev_length);if (e.match_available = 0, e.match_length = 2, e.strstart++, n && (f(e, !1), 0 === e.strm.avail_out)) return 1;} else if (e.match_available) {if ((n = s._tr_tally(e, 0, e.window[e.strstart - 1])) && f(e, !1), e.strstart++, e.lookahead--, 0 === e.strm.avail_out) return 1;} else e.match_available = 1, e.strstart++, e.lookahead--;}return e.match_available && (n = s._tr_tally(e, 0, e.window[e.strstart - 1]), e.match_available = 0), e.insert = e.strstart < 2 ? e.strstart : 2, 4 === t ? (f(e, !0), 0 === e.strm.avail_out ? 3 : 4) : e.last_lit && (f(e, !1), 0 === e.strm.avail_out) ? 1 : 2;}function y(e, t, r, n, o) {this.good_length = e, this.max_lazy = t, this.nice_length = r, this.max_chain = n, this.func = o;}function w() {this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = 8, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new o.Buf16(1146), this.dyn_dtree = new o.Buf16(122), this.bl_tree = new o.Buf16(78), d(this.dyn_ltree), d(this.dyn_dtree), d(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new o.Buf16(16), this.heap = new o.Buf16(573), d(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new o.Buf16(573), d(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;}function j(e) {var t;return e && e.state ? (e.total_in = e.total_out = 0, e.data_type = 2, (t = e.state).pending = 0, t.pending_out = 0, t.wrap < 0 && (t.wrap = -t.wrap), t.status = t.wrap ? 42 : 113, e.adler = 2 === t.wrap ? 0 : 1, t.last_flush = 0, s._tr_init(t), 0) : u(e, -2);}function E(e) {var t, - r = j(e);return 0 === r && ((t = e.state).window_size = 2 * t.w_size, d(t.head), t.max_lazy_match = n[t.level].max_lazy, t.good_match = n[t.level].good_length, t.nice_match = n[t.level].nice_length, t.max_chain_length = n[t.level].max_chain, t.strstart = 0, t.block_start = 0, t.lookahead = 0, t.insert = 0, t.match_length = t.prev_length = 2, t.match_available = 0, t.ins_h = 0), r;}function k(e, t, r, n, s, i) {if (!e) return -2;var a = 1;if (-1 === t && (t = 6), n < 0 ? (a = 0, n = -n) : n > 15 && (a = 2, n -= 16), s < 1 || s > 9 || 8 !== r || n < 8 || n > 15 || t < 0 || t > 9 || i < 0 || i > 4) return u(e, -2);8 === n && (n = 9);var l = new w();return e.state = l, l.strm = e, l.wrap = a, l.gzhead = null, l.w_bits = n, l.w_size = 1 << l.w_bits, l.w_mask = l.w_size - 1, l.hash_bits = s + 7, l.hash_size = 1 << l.hash_bits, l.hash_mask = l.hash_size - 1, l.hash_shift = ~~((l.hash_bits + 3 - 1) / 3), l.window = new o.Buf8(2 * l.w_size), l.head = new o.Buf16(l.hash_size), l.prev = new o.Buf16(l.w_size), l.lit_bufsize = 1 << s + 6, l.pending_buf_size = 4 * l.lit_bufsize, l.pending_buf = new o.Buf8(l.pending_buf_size), l.d_buf = 1 * l.lit_bufsize, l.l_buf = 3 * l.lit_bufsize, l.level = t, l.strategy = i, l.method = r, E(e);}n = [new y(0, 0, 0, 0, function (e, t) {var r = 65535;for (r > e.pending_buf_size - 5 && (r = e.pending_buf_size - 5);;) {if (e.lookahead <= 1) {if (_(e), 0 === e.lookahead && 0 === t) return 1;if (0 === e.lookahead) break;}e.strstart += e.lookahead, e.lookahead = 0;var n = e.block_start + r;if ((0 === e.strstart || e.strstart >= n) && (e.lookahead = e.strstart - n, e.strstart = n, f(e, !1), 0 === e.strm.avail_out)) return 1;if (e.strstart - e.block_start >= e.w_size - 262 && (f(e, !1), 0 === e.strm.avail_out)) return 1;}return e.insert = 0, 4 === t ? (f(e, !0), 0 === e.strm.avail_out ? 3 : 4) : (e.strstart > e.block_start && (f(e, !1), e.strm.avail_out), 1);}), new y(4, 4, 8, 4, v), new y(4, 5, 16, 8, v), new y(4, 6, 32, 32, v), new y(4, 4, 16, 16, b), new y(8, 16, 32, 32, b), new y(8, 16, 128, 128, b), new y(8, 32, 128, 256, b), new y(32, 128, 258, 1024, b), new y(32, 258, 258, 4096, b)], t.deflateInit = function (e, t) {return k(e, t, 8, 15, 8, 0);}, t.deflateInit2 = k, t.deflateReset = E, t.deflateResetKeep = j, t.deflateSetHeader = function (e, t) {return e && e.state ? 2 !== e.state.wrap ? -2 : (e.state.gzhead = t, 0) : -2;}, t.deflate = function (e, t) {var r, o, i, l;if (!e || !e.state || t > 5 || t < 0) return e ? u(e, -2) : -2;if (o = e.state, !e.output || !e.input && 0 !== e.avail_in || 666 === o.status && 4 !== t) return u(e, 0 === e.avail_out ? -5 : -2);if (o.strm = e, r = o.last_flush, o.last_flush = t, 42 === o.status) if (2 === o.wrap) e.adler = 0, p(o, 31), p(o, 139), p(o, 8), o.gzhead ? (p(o, (o.gzhead.text ? 1 : 0) + (o.gzhead.hcrc ? 2 : 0) + (o.gzhead.extra ? 4 : 0) + (o.gzhead.name ? 8 : 0) + (o.gzhead.comment ? 16 : 0)), p(o, 255 & o.gzhead.time), p(o, o.gzhead.time >> 8 & 255), p(o, o.gzhead.time >> 16 & 255), p(o, o.gzhead.time >> 24 & 255), p(o, 9 === o.level ? 2 : o.strategy >= 2 || o.level < 2 ? 4 : 0), p(o, 255 & o.gzhead.os), o.gzhead.extra && o.gzhead.extra.length && (p(o, 255 & o.gzhead.extra.length), p(o, o.gzhead.extra.length >> 8 & 255)), o.gzhead.hcrc && (e.adler = a(e.adler, o.pending_buf, o.pending, 0)), o.gzindex = 0, o.status = 69) : (p(o, 0), p(o, 0), p(o, 0), p(o, 0), p(o, 0), p(o, 9 === o.level ? 2 : o.strategy >= 2 || o.level < 2 ? 4 : 0), p(o, 3), o.status = 113);else {var g = 8 + (o.w_bits - 8 << 4) << 8;g |= (o.strategy >= 2 || o.level < 2 ? 0 : o.level < 6 ? 1 : 6 === o.level ? 2 : 3) << 6, 0 !== o.strstart && (g |= 32), g += 31 - g % 31, o.status = 113, m(o, g), 0 !== o.strstart && (m(o, e.adler >>> 16), m(o, 65535 & e.adler)), e.adler = 1;}if (69 === o.status) if (o.gzhead.extra) {for (i = o.pending; o.gzindex < (65535 & o.gzhead.extra.length) && (o.pending !== o.pending_buf_size || (o.gzhead.hcrc && o.pending > i && (e.adler = a(e.adler, o.pending_buf, o.pending - i, i)), h(e), i = o.pending, o.pending !== o.pending_buf_size));) p(o, 255 & o.gzhead.extra[o.gzindex]), o.gzindex++;o.gzhead.hcrc && o.pending > i && (e.adler = a(e.adler, o.pending_buf, o.pending - i, i)), o.gzindex === o.gzhead.extra.length && (o.gzindex = 0, o.status = 73);} else o.status = 73;if (73 === o.status) if (o.gzhead.name) {i = o.pending;do {if (o.pending === o.pending_buf_size && (o.gzhead.hcrc && o.pending > i && (e.adler = a(e.adler, o.pending_buf, o.pending - i, i)), h(e), i = o.pending, o.pending === o.pending_buf_size)) {l = 1;break;}l = o.gzindex < o.gzhead.name.length ? 255 & o.gzhead.name.charCodeAt(o.gzindex++) : 0, p(o, l);} while (0 !== l);o.gzhead.hcrc && o.pending > i && (e.adler = a(e.adler, o.pending_buf, o.pending - i, i)), 0 === l && (o.gzindex = 0, o.status = 91);} else o.status = 91;if (91 === o.status) if (o.gzhead.comment) {i = o.pending;do {if (o.pending === o.pending_buf_size && (o.gzhead.hcrc && o.pending > i && (e.adler = a(e.adler, o.pending_buf, o.pending - i, i)), h(e), i = o.pending, o.pending === o.pending_buf_size)) {l = 1;break;}l = o.gzindex < o.gzhead.comment.length ? 255 & o.gzhead.comment.charCodeAt(o.gzindex++) : 0, p(o, l);} while (0 !== l);o.gzhead.hcrc && o.pending > i && (e.adler = a(e.adler, o.pending_buf, o.pending - i, i)), 0 === l && (o.status = 103);} else o.status = 103;if (103 === o.status && (o.gzhead.hcrc ? (o.pending + 2 > o.pending_buf_size && h(e), o.pending + 2 <= o.pending_buf_size && (p(o, 255 & e.adler), p(o, e.adler >> 8 & 255), e.adler = 0, o.status = 113)) : o.status = 113), 0 !== o.pending) {if (h(e), 0 === e.avail_out) return o.last_flush = -1, 0;} else if (0 === e.avail_in && c(t) <= c(r) && 4 !== t) return u(e, -5);if (666 === o.status && 0 !== e.avail_in) return u(e, -5);if (0 !== e.avail_in || 0 !== o.lookahead || 0 !== t && 666 !== o.status) {var v = 2 === o.strategy ? function (e, t) {for (var r;;) {if (0 === e.lookahead && (_(e), 0 === e.lookahead)) {if (0 === t) return 1;break;}if (e.match_length = 0, r = s._tr_tally(e, 0, e.window[e.strstart]), e.lookahead--, e.strstart++, r && (f(e, !1), 0 === e.strm.avail_out)) return 1;}return e.insert = 0, 4 === t ? (f(e, !0), 0 === e.strm.avail_out ? 3 : 4) : e.last_lit && (f(e, !1), 0 === e.strm.avail_out) ? 1 : 2;}(o, t) : 3 === o.strategy ? function (e, t) {for (var r, n, o, i, a = e.window;;) {if (e.lookahead <= 258) {if (_(e), e.lookahead <= 258 && 0 === t) return 1;if (0 === e.lookahead) break;}if (e.match_length = 0, e.lookahead >= 3 && e.strstart > 0 && (n = a[o = e.strstart - 1]) === a[++o] && n === a[++o] && n === a[++o]) {i = e.strstart + 258;do {} while (n === a[++o] && n === a[++o] && n === a[++o] && n === a[++o] && n === a[++o] && n === a[++o] && n === a[++o] && n === a[++o] && o < i);e.match_length = 258 - (i - o), e.match_length > e.lookahead && (e.match_length = e.lookahead);}if (e.match_length >= 3 ? (r = s._tr_tally(e, 1, e.match_length - 3), e.lookahead -= e.match_length, e.strstart += e.match_length, e.match_length = 0) : (r = s._tr_tally(e, 0, e.window[e.strstart]), e.lookahead--, e.strstart++), r && (f(e, !1), 0 === e.strm.avail_out)) return 1;}return e.insert = 0, 4 === t ? (f(e, !0), 0 === e.strm.avail_out ? 3 : 4) : e.last_lit && (f(e, !1), 0 === e.strm.avail_out) ? 1 : 2;}(o, t) : n[o.level].func(o, t);if (3 !== v && 4 !== v || (o.status = 666), 1 === v || 3 === v) return 0 === e.avail_out && (o.last_flush = -1), 0;if (2 === v && (1 === t ? s._tr_align(o) : 5 !== t && (s._tr_stored_block(o, 0, 0, !1), 3 === t && (d(o.head), 0 === o.lookahead && (o.strstart = 0, o.block_start = 0, o.insert = 0))), h(e), 0 === e.avail_out)) return o.last_flush = -1, 0;}return 4 !== t ? 0 : o.wrap <= 0 ? 1 : (2 === o.wrap ? (p(o, 255 & e.adler), p(o, e.adler >> 8 & 255), p(o, e.adler >> 16 & 255), p(o, e.adler >> 24 & 255), p(o, 255 & e.total_in), p(o, e.total_in >> 8 & 255), p(o, e.total_in >> 16 & 255), p(o, e.total_in >> 24 & 255)) : (m(o, e.adler >>> 16), m(o, 65535 & e.adler)), h(e), o.wrap > 0 && (o.wrap = -o.wrap), 0 !== o.pending ? 0 : 1);}, t.deflateEnd = function (e) {var t;return e && e.state ? 42 !== (t = e.state.status) && 69 !== t && 73 !== t && 91 !== t && 103 !== t && 113 !== t && 666 !== t ? u(e, -2) : (e.state = null, 113 === t ? u(e, -3) : 0) : -2;}, t.deflateSetDictionary = function (e, t) {var r, - n, - s, - a, - l, - u, - c, - h, - f = t.length;if (!e || !e.state) return -2;if (2 === (a = (r = e.state).wrap) || 1 === a && 42 !== r.status || r.lookahead) return -2;for (1 === a && (e.adler = i(e.adler, t, f, 0)), r.wrap = 0, f >= r.w_size && (0 === a && (d(r.head), r.strstart = 0, r.block_start = 0, r.insert = 0), h = new o.Buf8(r.w_size), o.arraySet(h, t, f - r.w_size, r.w_size, 0), t = h, f = r.w_size), l = e.avail_in, u = e.next_in, c = e.input, e.avail_in = f, e.next_in = 0, e.input = t, _(r); r.lookahead >= 3;) {n = r.strstart, s = r.lookahead - 2;do {r.ins_h = (r.ins_h << r.hash_shift ^ r.window[n + 3 - 1]) & r.hash_mask, r.prev[n & r.w_mask] = r.head[r.ins_h], r.head[r.ins_h] = n, n++;} while (--s);r.strstart = n, r.lookahead = 2, _(r);}return r.strstart += r.lookahead, r.block_start = r.strstart, r.insert = r.lookahead, r.lookahead = 0, r.match_length = r.prev_length = 2, r.match_available = 0, e.next_in = u, e.input = c, e.avail_in = l, r.wrap = a, 0;}, t.deflateInfo = "pako deflate (from Nodeca project)";}, "./node_modules/pako/lib/zlib/gzheader.js": function (e, t, r) {"use strict"; - e.exports = function () {this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = !1;};}, "./node_modules/pako/lib/zlib/inffast.js": function (e, t, r) {"use strict"; - e.exports = function (e, t) {var r, n, o, s, i, a, l, u, c, d, h, f, p, m, g, _, v, b, y, w, j, E, k, S, C;r = e.state, n = e.next_in, S = e.input, o = n + (e.avail_in - 5), s = e.next_out, C = e.output, i = s - (t - e.avail_out), a = s + (e.avail_out - 257), l = r.dmax, u = r.wsize, c = r.whave, d = r.wnext, h = r.window, f = r.hold, p = r.bits, m = r.lencode, g = r.distcode, _ = (1 << r.lenbits) - 1, v = (1 << r.distbits) - 1;e: do {p < 15 && (f += S[n++] << p, p += 8, f += S[n++] << p, p += 8), b = m[f & _];t: for (;;) {if (f >>>= y = b >>> 24, p -= y, 0 === (y = b >>> 16 & 255)) C[s++] = 65535 & b;else {if (!(16 & y)) {if (0 == (64 & y)) {b = m[(65535 & b) + (f & (1 << y) - 1)];continue t;}if (32 & y) {r.mode = 12;break e;}e.msg = "invalid literal/length code", r.mode = 30;break e;}w = 65535 & b, (y &= 15) && (p < y && (f += S[n++] << p, p += 8), w += f & (1 << y) - 1, f >>>= y, p -= y), p < 15 && (f += S[n++] << p, p += 8, f += S[n++] << p, p += 8), b = g[f & v];r: for (;;) {if (f >>>= y = b >>> 24, p -= y, !(16 & (y = b >>> 16 & 255))) {if (0 == (64 & y)) {b = g[(65535 & b) + (f & (1 << y) - 1)];continue r;}e.msg = "invalid distance code", r.mode = 30;break e;}if (j = 65535 & b, p < (y &= 15) && (f += S[n++] << p, (p += 8) < y && (f += S[n++] << p, p += 8)), (j += f & (1 << y) - 1) > l) {e.msg = "invalid distance too far back", r.mode = 30;break e;}if (f >>>= y, p -= y, j > (y = s - i)) {if ((y = j - y) > c && r.sane) {e.msg = "invalid distance too far back", r.mode = 30;break e;}if (E = 0, k = h, 0 === d) {if (E += u - y, y < w) {w -= y;do {C[s++] = h[E++];} while (--y);E = s - j, k = C;}} else if (d < y) {if (E += u + d - y, (y -= d) < w) {w -= y;do {C[s++] = h[E++];} while (--y);if (E = 0, d < w) {w -= y = d;do {C[s++] = h[E++];} while (--y);E = s - j, k = C;}}} else if (E += d - y, y < w) {w -= y;do {C[s++] = h[E++];} while (--y);E = s - j, k = C;}for (; w > 2;) C[s++] = k[E++], C[s++] = k[E++], C[s++] = k[E++], w -= 3;w && (C[s++] = k[E++], w > 1 && (C[s++] = k[E++]));} else {E = s - j;do {C[s++] = C[E++], C[s++] = C[E++], C[s++] = C[E++], w -= 3;} while (w > 2);w && (C[s++] = C[E++], w > 1 && (C[s++] = C[E++]));}break;}}break;}} while (n < o && s < a);n -= w = p >> 3, f &= (1 << (p -= w << 3)) - 1, e.next_in = n, e.next_out = s, e.avail_in = n < o ? o - n + 5 : 5 - (n - o), e.avail_out = s < a ? a - s + 257 : 257 - (s - a), r.hold = f, r.bits = p;};}, "./node_modules/pako/lib/zlib/inflate.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/pako/lib/utils/common.js"), - o = r("./node_modules/pako/lib/zlib/adler32.js"), - s = r("./node_modules/pako/lib/zlib/crc32.js"), - i = r("./node_modules/pako/lib/zlib/inffast.js"), - a = r("./node_modules/pako/lib/zlib/inftrees.js");function l(e) {return (e >>> 24 & 255) + (e >>> 8 & 65280) + ((65280 & e) << 8) + ((255 & e) << 24);}function u() {this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new n.Buf16(320), this.work = new n.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;}function c(e) {var t;return e && e.state ? (t = e.state, e.total_in = e.total_out = t.total = 0, e.msg = "", t.wrap && (e.adler = 1 & t.wrap), t.mode = 1, t.last = 0, t.havedict = 0, t.dmax = 32768, t.head = null, t.hold = 0, t.bits = 0, t.lencode = t.lendyn = new n.Buf32(852), t.distcode = t.distdyn = new n.Buf32(592), t.sane = 1, t.back = -1, 0) : -2;}function d(e) {var t;return e && e.state ? ((t = e.state).wsize = 0, t.whave = 0, t.wnext = 0, c(e)) : -2;}function h(e, t) {var r, n;return e && e.state ? (n = e.state, t < 0 ? (r = 0, t = -t) : (r = 1 + (t >> 4), t < 48 && (t &= 15)), t && (t < 8 || t > 15) ? -2 : (null !== n.window && n.wbits !== t && (n.window = null), n.wrap = r, n.wbits = t, d(e))) : -2;}function f(e, t) {var r, n;return e ? (n = new u(), e.state = n, n.window = null, 0 !== (r = h(e, t)) && (e.state = null), r) : -2;}var p, - m, - g = !0;function _(e) {if (g) {var t;for (p = new n.Buf32(512), m = new n.Buf32(32), t = 0; t < 144;) e.lens[t++] = 8;for (; t < 256;) e.lens[t++] = 9;for (; t < 280;) e.lens[t++] = 7;for (; t < 288;) e.lens[t++] = 8;for (a(1, e.lens, 0, 288, p, 0, e.work, { bits: 9 }), t = 0; t < 32;) e.lens[t++] = 5;a(2, e.lens, 0, 32, m, 0, e.work, { bits: 5 }), g = !1;}e.lencode = p, e.lenbits = 9, e.distcode = m, e.distbits = 5;}function v(e, t, r, o) {var s, - i = e.state;return null === i.window && (i.wsize = 1 << i.wbits, i.wnext = 0, i.whave = 0, i.window = new n.Buf8(i.wsize)), o >= i.wsize ? (n.arraySet(i.window, t, r - i.wsize, i.wsize, 0), i.wnext = 0, i.whave = i.wsize) : ((s = i.wsize - i.wnext) > o && (s = o), n.arraySet(i.window, t, r - o, s, i.wnext), (o -= s) ? (n.arraySet(i.window, t, r - o, o, 0), i.wnext = o, i.whave = i.wsize) : (i.wnext += s, i.wnext === i.wsize && (i.wnext = 0), i.whave < i.wsize && (i.whave += s))), 0;}t.inflateReset = d, t.inflateReset2 = h, t.inflateResetKeep = c, t.inflateInit = function (e) {return f(e, 15);}, t.inflateInit2 = f, t.inflate = function (e, t) {var r, - u, - c, - d, - h, - f, - p, - m, - g, - b, - y, - w, - j, - E, - k, - S, - C, - x, - O, - A, - R, - I, - T, - L, - N = 0, - z = new n.Buf8(4), - M = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];if (!e || !e.state || !e.output || !e.input && 0 !== e.avail_in) return -2;12 === (r = e.state).mode && (r.mode = 13), h = e.next_out, c = e.output, p = e.avail_out, d = e.next_in, u = e.input, f = e.avail_in, m = r.hold, g = r.bits, b = f, y = p, I = 0;e: for (;;) switch (r.mode) {case 1: - if (0 === r.wrap) {r.mode = 13;break;} - - for (; g < 16;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} - - if (2 & r.wrap && 35615 === m) {r.check = 0, z[0] = 255 & m, z[1] = m >>> 8 & 255, r.check = s(r.check, z, 2, 0), m = 0, g = 0, r.mode = 2;break;} - - if (r.flags = 0, r.head && (r.head.done = !1), !(1 & r.wrap) || (((255 & m) << 8) + (m >> 8)) % 31) {e.msg = "incorrect header check", r.mode = 30;break;} - - if (8 != (15 & m)) {e.msg = "unknown compression method", r.mode = 30;break;} - - if (g -= 4, R = 8 + (15 & (m >>>= 4)), 0 === r.wbits) r.wbits = R;else if (R > r.wbits) {e.msg = "invalid window size", r.mode = 30;break;} - r.dmax = 1 << R, e.adler = r.check = 1, r.mode = 512 & m ? 10 : 12, m = 0, g = 0; - break; - case 2: - for (; g < 16;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} - - if (r.flags = m, 8 != (255 & r.flags)) {e.msg = "unknown compression method", r.mode = 30;break;} - - if (57344 & r.flags) {e.msg = "unknown header flags set", r.mode = 30;break;} - - r.head && (r.head.text = m >> 8 & 1), 512 & r.flags && (z[0] = 255 & m, z[1] = m >>> 8 & 255, r.check = s(r.check, z, 2, 0)), m = 0, g = 0, r.mode = 3; - case 3: - for (; g < 32;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} - - r.head && (r.head.time = m), 512 & r.flags && (z[0] = 255 & m, z[1] = m >>> 8 & 255, z[2] = m >>> 16 & 255, z[3] = m >>> 24 & 255, r.check = s(r.check, z, 4, 0)), m = 0, g = 0, r.mode = 4; - case 4: - for (; g < 16;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} - - r.head && (r.head.xflags = 255 & m, r.head.os = m >> 8), 512 & r.flags && (z[0] = 255 & m, z[1] = m >>> 8 & 255, r.check = s(r.check, z, 2, 0)), m = 0, g = 0, r.mode = 5; - case 5: - if (1024 & r.flags) {for (; g < 16;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}r.length = m, r.head && (r.head.extra_len = m), 512 & r.flags && (z[0] = 255 & m, z[1] = m >>> 8 & 255, r.check = s(r.check, z, 2, 0)), m = 0, g = 0;} else r.head && (r.head.extra = null); - - r.mode = 6; - case 6: - if (1024 & r.flags && ((w = r.length) > f && (w = f), w && (r.head && (R = r.head.extra_len - r.length, r.head.extra || (r.head.extra = new Array(r.head.extra_len)), n.arraySet(r.head.extra, u, d, w, R)), 512 & r.flags && (r.check = s(r.check, u, w, d)), f -= w, d += w, r.length -= w), r.length)) break e; - r.length = 0, r.mode = 7; - case 7: - if (2048 & r.flags) {if (0 === f) break e;w = 0;do {R = u[d + w++], r.head && R && r.length < 65536 && (r.head.name += String.fromCharCode(R));} while (R && w < f);if (512 & r.flags && (r.check = s(r.check, u, w, d)), f -= w, d += w, R) break e;} else r.head && (r.head.name = null); - - r.length = 0, r.mode = 8; - case 8: - if (4096 & r.flags) {if (0 === f) break e;w = 0;do {R = u[d + w++], r.head && R && r.length < 65536 && (r.head.comment += String.fromCharCode(R));} while (R && w < f);if (512 & r.flags && (r.check = s(r.check, u, w, d)), f -= w, d += w, R) break e;} else r.head && (r.head.comment = null); - - r.mode = 9; - case 9: - if (512 & r.flags) {for (; g < 16;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}if (m !== (65535 & r.check)) {e.msg = "header crc mismatch", r.mode = 30;break;}m = 0, g = 0;} - - r.head && (r.head.hcrc = r.flags >> 9 & 1, r.head.done = !0), e.adler = r.check = 0, r.mode = 12; - break; - case 10: - for (; g < 32;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} - - e.adler = r.check = l(m), m = 0, g = 0, r.mode = 11; - case 11: - if (0 === r.havedict) return e.next_out = h, e.avail_out = p, e.next_in = d, e.avail_in = f, r.hold = m, r.bits = g, 2; - e.adler = r.check = 1, r.mode = 12; - case 12: - if (5 === t || 6 === t) break e; - case 13: - if (r.last) {m >>>= 7 & g, g -= 7 & g, r.mode = 27;break;} - - for (; g < 3;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} - - switch (r.last = 1 & m, g -= 1, 3 & (m >>>= 1)) {case 0: - r.mode = 14; - break; - case 1: - if (_(r), r.mode = 20, 6 === t) {m >>>= 2, g -= 2;break e;} - - break; - case 2: - r.mode = 17; - break; - case 3: - e.msg = "invalid block type", r.mode = 30; - } - - m >>>= 2, g -= 2; - break; - case 14: - for (m >>>= 7 & g, g -= 7 & g; g < 32;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} - - if ((65535 & m) != (m >>> 16 ^ 65535)) {e.msg = "invalid stored block lengths", r.mode = 30;break;} - - if (r.length = 65535 & m, m = 0, g = 0, r.mode = 15, 6 === t) break e; - case 15: - r.mode = 16; - case 16: - if (w = r.length) {if (w > f && (w = f), w > p && (w = p), 0 === w) break e;n.arraySet(c, u, d, w, h), f -= w, d += w, p -= w, h += w, r.length -= w;break;} - - r.mode = 12; - break; - case 17: - for (; g < 14;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} - - if (r.nlen = 257 + (31 & m), m >>>= 5, g -= 5, r.ndist = 1 + (31 & m), m >>>= 5, g -= 5, r.ncode = 4 + (15 & m), m >>>= 4, g -= 4, r.nlen > 286 || r.ndist > 30) {e.msg = "too many length or distance symbols", r.mode = 30;break;} - - r.have = 0, r.mode = 18; - case 18: - for (; r.have < r.ncode;) {for (; g < 3;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}r.lens[M[r.have++]] = 7 & m, m >>>= 3, g -= 3;} - - for (; r.have < 19;) r.lens[M[r.have++]] = 0; - - if (r.lencode = r.lendyn, r.lenbits = 7, T = { bits: r.lenbits }, I = a(0, r.lens, 0, 19, r.lencode, 0, r.work, T), r.lenbits = T.bits, I) {e.msg = "invalid code lengths set", r.mode = 30;break;} - - r.have = 0, r.mode = 19; - case 19: - for (; r.have < r.nlen + r.ndist;) {for (; S = (N = r.lencode[m & (1 << r.lenbits) - 1]) >>> 16 & 255, C = 65535 & N, !((k = N >>> 24) <= g);) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}if (C < 16) m >>>= k, g -= k, r.lens[r.have++] = C;else {if (16 === C) {for (L = k + 2; g < L;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}if (m >>>= k, g -= k, 0 === r.have) {e.msg = "invalid bit length repeat", r.mode = 30;break;}R = r.lens[r.have - 1], w = 3 + (3 & m), m >>>= 2, g -= 2;} else if (17 === C) {for (L = k + 3; g < L;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}g -= k, R = 0, w = 3 + (7 & (m >>>= k)), m >>>= 3, g -= 3;} else {for (L = k + 7; g < L;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}g -= k, R = 0, w = 11 + (127 & (m >>>= k)), m >>>= 7, g -= 7;}if (r.have + w > r.nlen + r.ndist) {e.msg = "invalid bit length repeat", r.mode = 30;break;}for (; w--;) r.lens[r.have++] = R;}} - - if (30 === r.mode) break; - - if (0 === r.lens[256]) {e.msg = "invalid code -- missing end-of-block", r.mode = 30;break;} - - if (r.lenbits = 9, T = { bits: r.lenbits }, I = a(1, r.lens, 0, r.nlen, r.lencode, 0, r.work, T), r.lenbits = T.bits, I) {e.msg = "invalid literal/lengths set", r.mode = 30;break;} - - if (r.distbits = 6, r.distcode = r.distdyn, T = { bits: r.distbits }, I = a(2, r.lens, r.nlen, r.ndist, r.distcode, 0, r.work, T), r.distbits = T.bits, I) {e.msg = "invalid distances set", r.mode = 30;break;} - - if (r.mode = 20, 6 === t) break e; - case 20: - r.mode = 21; - case 21: - if (f >= 6 && p >= 258) {e.next_out = h, e.avail_out = p, e.next_in = d, e.avail_in = f, r.hold = m, r.bits = g, i(e, y), h = e.next_out, c = e.output, p = e.avail_out, d = e.next_in, u = e.input, f = e.avail_in, m = r.hold, g = r.bits, 12 === r.mode && (r.back = -1);break;} - - for (r.back = 0; S = (N = r.lencode[m & (1 << r.lenbits) - 1]) >>> 16 & 255, C = 65535 & N, !((k = N >>> 24) <= g);) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} - - if (S && 0 == (240 & S)) {for (x = k, O = S, A = C; S = (N = r.lencode[A + ((m & (1 << x + O) - 1) >> x)]) >>> 16 & 255, C = 65535 & N, !(x + (k = N >>> 24) <= g);) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}m >>>= x, g -= x, r.back += x;} - - if (m >>>= k, g -= k, r.back += k, r.length = C, 0 === S) {r.mode = 26;break;} - - if (32 & S) {r.back = -1, r.mode = 12;break;} - - if (64 & S) {e.msg = "invalid literal/length code", r.mode = 30;break;} - - r.extra = 15 & S, r.mode = 22; - case 22: - if (r.extra) {for (L = r.extra; g < L;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}r.length += m & (1 << r.extra) - 1, m >>>= r.extra, g -= r.extra, r.back += r.extra;} - - r.was = r.length, r.mode = 23; - case 23: - for (; S = (N = r.distcode[m & (1 << r.distbits) - 1]) >>> 16 & 255, C = 65535 & N, !((k = N >>> 24) <= g);) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;} - - if (0 == (240 & S)) {for (x = k, O = S, A = C; S = (N = r.distcode[A + ((m & (1 << x + O) - 1) >> x)]) >>> 16 & 255, C = 65535 & N, !(x + (k = N >>> 24) <= g);) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}m >>>= x, g -= x, r.back += x;} - - if (m >>>= k, g -= k, r.back += k, 64 & S) {e.msg = "invalid distance code", r.mode = 30;break;} - - r.offset = C, r.extra = 15 & S, r.mode = 24; - case 24: - if (r.extra) {for (L = r.extra; g < L;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}r.offset += m & (1 << r.extra) - 1, m >>>= r.extra, g -= r.extra, r.back += r.extra;} - - if (r.offset > r.dmax) {e.msg = "invalid distance too far back", r.mode = 30;break;} - - r.mode = 25; - case 25: - if (0 === p) break e; - - if (w = y - p, r.offset > w) {if ((w = r.offset - w) > r.whave && r.sane) {e.msg = "invalid distance too far back", r.mode = 30;break;}w > r.wnext ? (w -= r.wnext, j = r.wsize - w) : j = r.wnext - w, w > r.length && (w = r.length), E = r.window;} else E = c, j = h - r.offset, w = r.length; - - w > p && (w = p), p -= w, r.length -= w; - - do {c[h++] = E[j++];} while (--w); - - 0 === r.length && (r.mode = 21); - break; - case 26: - if (0 === p) break e; - c[h++] = r.length, p--, r.mode = 21; - break; - case 27: - if (r.wrap) {for (; g < 32;) {if (0 === f) break e;f--, m |= u[d++] << g, g += 8;}if (y -= p, e.total_out += y, r.total += y, y && (e.adler = r.check = r.flags ? s(r.check, c, y, h - y) : o(r.check, c, y, h - y)), y = p, (r.flags ? m : l(m)) !== r.check) {e.msg = "incorrect data check", r.mode = 30;break;}m = 0, g = 0;} - - r.mode = 28; - case 28: - if (r.wrap && r.flags) {for (; g < 32;) {if (0 === f) break e;f--, m += u[d++] << g, g += 8;}if (m !== (4294967295 & r.total)) {e.msg = "incorrect length check", r.mode = 30;break;}m = 0, g = 0;} - - r.mode = 29; - case 29: - I = 1; - break e; - case 30: - I = -3; - break e; - case 31: - return -4; - case 32:default: - return -2; - }return e.next_out = h, e.avail_out = p, e.next_in = d, e.avail_in = f, r.hold = m, r.bits = g, (r.wsize || y !== e.avail_out && r.mode < 30 && (r.mode < 27 || 4 !== t)) && v(e, e.output, e.next_out, y - e.avail_out) ? (r.mode = 31, -4) : (b -= e.avail_in, y -= e.avail_out, e.total_in += b, e.total_out += y, r.total += y, r.wrap && y && (e.adler = r.check = r.flags ? s(r.check, c, y, e.next_out - y) : o(r.check, c, y, e.next_out - y)), e.data_type = r.bits + (r.last ? 64 : 0) + (12 === r.mode ? 128 : 0) + (20 === r.mode || 15 === r.mode ? 256 : 0), (0 === b && 0 === y || 4 === t) && 0 === I && (I = -5), I);}, t.inflateEnd = function (e) {if (!e || !e.state) return -2;var t = e.state;return t.window && (t.window = null), e.state = null, 0;}, t.inflateGetHeader = function (e, t) {var r;return e && e.state ? 0 == (2 & (r = e.state).wrap) ? -2 : (r.head = t, t.done = !1, 0) : -2;}, t.inflateSetDictionary = function (e, t) {var r, - n = t.length;return e && e.state ? 0 !== (r = e.state).wrap && 11 !== r.mode ? -2 : 11 === r.mode && o(1, t, n, 0) !== r.check ? -3 : v(e, t, n, n) ? (r.mode = 31, -4) : (r.havedict = 1, 0) : -2;}, t.inflateInfo = "pako inflate (from Nodeca project)";}, "./node_modules/pako/lib/zlib/inftrees.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/pako/lib/utils/common.js"), - o = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], - s = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], - i = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], - a = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];e.exports = function (e, t, r, l, u, c, d, h) {var f, - p, - m, - g, - _, - v, - b, - y, - w, - j = h.bits, - E = 0, - k = 0, - S = 0, - C = 0, - x = 0, - O = 0, - A = 0, - R = 0, - I = 0, - T = 0, - L = null, - N = 0, - z = new n.Buf16(16), - M = new n.Buf16(16), - D = null, - P = 0;for (E = 0; E <= 15; E++) z[E] = 0;for (k = 0; k < l; k++) z[t[r + k]]++;for (x = j, C = 15; C >= 1 && 0 === z[C]; C--);if (x > C && (x = C), 0 === C) return u[c++] = 20971520, u[c++] = 20971520, h.bits = 1, 0;for (S = 1; S < C && 0 === z[S]; S++);for (x < S && (x = S), R = 1, E = 1; E <= 15; E++) if (R <<= 1, (R -= z[E]) < 0) return -1;if (R > 0 && (0 === e || 1 !== C)) return -1;for (M[1] = 0, E = 1; E < 15; E++) M[E + 1] = M[E] + z[E];for (k = 0; k < l; k++) 0 !== t[r + k] && (d[M[t[r + k]]++] = k);if (0 === e ? (L = D = d, v = 19) : 1 === e ? (L = o, N -= 257, D = s, P -= 257, v = 256) : (L = i, D = a, v = -1), T = 0, k = 0, E = S, _ = c, O = x, A = 0, m = -1, g = (I = 1 << x) - 1, 1 === e && I > 852 || 2 === e && I > 592) return 1;for (;;) {b = E - A, d[k] < v ? (y = 0, w = d[k]) : d[k] > v ? (y = D[P + d[k]], w = L[N + d[k]]) : (y = 96, w = 0), f = 1 << E - A, S = p = 1 << O;do {u[_ + (T >> A) + (p -= f)] = b << 24 | y << 16 | w | 0;} while (0 !== p);for (f = 1 << E - 1; T & f;) f >>= 1;if (0 !== f ? (T &= f - 1, T += f) : T = 0, k++, 0 == --z[E]) {if (E === C) break;E = t[r + d[k]];}if (E > x && (T & g) !== m) {for (0 === A && (A = x), _ += S, R = 1 << (O = E - A); O + A < C && !((R -= z[O + A]) <= 0);) O++, R <<= 1;if (I += 1 << O, 1 === e && I > 852 || 2 === e && I > 592) return 1;u[m = T & g] = x << 24 | O << 16 | _ - c | 0;}}return 0 !== T && (u[_ + T] = E - A << 24 | 64 << 16 | 0), h.bits = x, 0;};}, "./node_modules/pako/lib/zlib/messages.js": function (e, t, r) {"use strict"; - e.exports = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" };}, "./node_modules/pako/lib/zlib/trees.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/pako/lib/utils/common.js");function o(e) {for (var t = e.length; --t >= 0;) e[t] = 0;}var s = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], - i = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], - a = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], - l = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], - u = new Array(576);o(u);var c = new Array(60);o(c);var d = new Array(512);o(d);var h = new Array(256);o(h);var f = new Array(29);o(f);var p, - m, - g, - _ = new Array(30);function v(e, t, r, n, o) {this.static_tree = e, this.extra_bits = t, this.extra_base = r, this.elems = n, this.max_length = o, this.has_stree = e && e.length;}function b(e, t) {this.dyn_tree = e, this.max_code = 0, this.stat_desc = t;}function y(e) {return e < 256 ? d[e] : d[256 + (e >>> 7)];}function w(e, t) {e.pending_buf[e.pending++] = 255 & t, e.pending_buf[e.pending++] = t >>> 8 & 255;}function j(e, t, r) {e.bi_valid > 16 - r ? (e.bi_buf |= t << e.bi_valid & 65535, w(e, e.bi_buf), e.bi_buf = t >> 16 - e.bi_valid, e.bi_valid += r - 16) : (e.bi_buf |= t << e.bi_valid & 65535, e.bi_valid += r);}function E(e, t, r) {j(e, r[2 * t], r[2 * t + 1]);}function k(e, t) {var r = 0;do {r |= 1 & e, e >>>= 1, r <<= 1;} while (--t > 0);return r >>> 1;}function S(e, t, r) {var n, - o, - s = new Array(16), - i = 0;for (n = 1; n <= 15; n++) s[n] = i = i + r[n - 1] << 1;for (o = 0; o <= t; o++) {var a = e[2 * o + 1];0 !== a && (e[2 * o] = k(s[a]++, a));}}function C(e) {var t;for (t = 0; t < 286; t++) e.dyn_ltree[2 * t] = 0;for (t = 0; t < 30; t++) e.dyn_dtree[2 * t] = 0;for (t = 0; t < 19; t++) e.bl_tree[2 * t] = 0;e.dyn_ltree[512] = 1, e.opt_len = e.static_len = 0, e.last_lit = e.matches = 0;}function x(e) {e.bi_valid > 8 ? w(e, e.bi_buf) : e.bi_valid > 0 && (e.pending_buf[e.pending++] = e.bi_buf), e.bi_buf = 0, e.bi_valid = 0;}function O(e, t, r, n) {var o = 2 * t, - s = 2 * r;return e[o] < e[s] || e[o] === e[s] && n[t] <= n[r];}function A(e, t, r) {for (var n = e.heap[r], o = r << 1; o <= e.heap_len && (o < e.heap_len && O(t, e.heap[o + 1], e.heap[o], e.depth) && o++, !O(t, n, e.heap[o], e.depth));) e.heap[r] = e.heap[o], r = o, o <<= 1;e.heap[r] = n;}function R(e, t, r) {var n, - o, - a, - l, - u = 0;if (0 !== e.last_lit) do {n = e.pending_buf[e.d_buf + 2 * u] << 8 | e.pending_buf[e.d_buf + 2 * u + 1], o = e.pending_buf[e.l_buf + u], u++, 0 === n ? E(e, o, t) : (E(e, (a = h[o]) + 256 + 1, t), 0 !== (l = s[a]) && j(e, o -= f[a], l), E(e, a = y(--n), r), 0 !== (l = i[a]) && j(e, n -= _[a], l));} while (u < e.last_lit);E(e, 256, t);}function I(e, t) {var r, - n, - o, - s = t.dyn_tree, - i = t.stat_desc.static_tree, - a = t.stat_desc.has_stree, - l = t.stat_desc.elems, - u = -1;for (e.heap_len = 0, e.heap_max = 573, r = 0; r < l; r++) 0 !== s[2 * r] ? (e.heap[++e.heap_len] = u = r, e.depth[r] = 0) : s[2 * r + 1] = 0;for (; e.heap_len < 2;) s[2 * (o = e.heap[++e.heap_len] = u < 2 ? ++u : 0)] = 1, e.depth[o] = 0, e.opt_len--, a && (e.static_len -= i[2 * o + 1]);for (t.max_code = u, r = e.heap_len >> 1; r >= 1; r--) A(e, s, r);o = l;do {r = e.heap[1], e.heap[1] = e.heap[e.heap_len--], A(e, s, 1), n = e.heap[1], e.heap[--e.heap_max] = r, e.heap[--e.heap_max] = n, s[2 * o] = s[2 * r] + s[2 * n], e.depth[o] = (e.depth[r] >= e.depth[n] ? e.depth[r] : e.depth[n]) + 1, s[2 * r + 1] = s[2 * n + 1] = o, e.heap[1] = o++, A(e, s, 1);} while (e.heap_len >= 2);e.heap[--e.heap_max] = e.heap[1], function (e, t) {var r, - n, - o, - s, - i, - a, - l = t.dyn_tree, - u = t.max_code, - c = t.stat_desc.static_tree, - d = t.stat_desc.has_stree, - h = t.stat_desc.extra_bits, - f = t.stat_desc.extra_base, - p = t.stat_desc.max_length, - m = 0;for (s = 0; s <= 15; s++) e.bl_count[s] = 0;for (l[2 * e.heap[e.heap_max] + 1] = 0, r = e.heap_max + 1; r < 573; r++) (s = l[2 * l[2 * (n = e.heap[r]) + 1] + 1] + 1) > p && (s = p, m++), l[2 * n + 1] = s, n > u || (e.bl_count[s]++, i = 0, n >= f && (i = h[n - f]), a = l[2 * n], e.opt_len += a * (s + i), d && (e.static_len += a * (c[2 * n + 1] + i)));if (0 !== m) {do {for (s = p - 1; 0 === e.bl_count[s];) s--;e.bl_count[s]--, e.bl_count[s + 1] += 2, e.bl_count[p]--, m -= 2;} while (m > 0);for (s = p; 0 !== s; s--) for (n = e.bl_count[s]; 0 !== n;) (o = e.heap[--r]) > u || (l[2 * o + 1] !== s && (e.opt_len += (s - l[2 * o + 1]) * l[2 * o], l[2 * o + 1] = s), n--);}}(e, t), S(s, u, e.bl_count);}function T(e, t, r) {var n, - o, - s = -1, - i = t[1], - a = 0, - l = 7, - u = 4;for (0 === i && (l = 138, u = 3), t[2 * (r + 1) + 1] = 65535, n = 0; n <= r; n++) o = i, i = t[2 * (n + 1) + 1], ++a < l && o === i || (a < u ? e.bl_tree[2 * o] += a : 0 !== o ? (o !== s && e.bl_tree[2 * o]++, e.bl_tree[32]++) : a <= 10 ? e.bl_tree[34]++ : e.bl_tree[36]++, a = 0, s = o, 0 === i ? (l = 138, u = 3) : o === i ? (l = 6, u = 3) : (l = 7, u = 4));}function L(e, t, r) {var n, - o, - s = -1, - i = t[1], - a = 0, - l = 7, - u = 4;for (0 === i && (l = 138, u = 3), n = 0; n <= r; n++) if (o = i, i = t[2 * (n + 1) + 1], !(++a < l && o === i)) {if (a < u) do {E(e, o, e.bl_tree);} while (0 != --a);else 0 !== o ? (o !== s && (E(e, o, e.bl_tree), a--), E(e, 16, e.bl_tree), j(e, a - 3, 2)) : a <= 10 ? (E(e, 17, e.bl_tree), j(e, a - 3, 3)) : (E(e, 18, e.bl_tree), j(e, a - 11, 7));a = 0, s = o, 0 === i ? (l = 138, u = 3) : o === i ? (l = 6, u = 3) : (l = 7, u = 4);}}o(_);var N = !1;function z(e, t, r, o) {j(e, 0 + (o ? 1 : 0), 3), function (e, t, r, o) {x(e), o && (w(e, r), w(e, ~r)), n.arraySet(e.pending_buf, e.window, t, r, e.pending), e.pending += r;}(e, t, r, !0);}t._tr_init = function (e) {N || (!function () {var e, - t, - r, - n, - o, - l = new Array(16);for (r = 0, n = 0; n < 28; n++) for (f[n] = r, e = 0; e < 1 << s[n]; e++) h[r++] = n;for (h[r - 1] = n, o = 0, n = 0; n < 16; n++) for (_[n] = o, e = 0; e < 1 << i[n]; e++) d[o++] = n;for (o >>= 7; n < 30; n++) for (_[n] = o << 7, e = 0; e < 1 << i[n] - 7; e++) d[256 + o++] = n;for (t = 0; t <= 15; t++) l[t] = 0;for (e = 0; e <= 143;) u[2 * e + 1] = 8, e++, l[8]++;for (; e <= 255;) u[2 * e + 1] = 9, e++, l[9]++;for (; e <= 279;) u[2 * e + 1] = 7, e++, l[7]++;for (; e <= 287;) u[2 * e + 1] = 8, e++, l[8]++;for (S(u, 287, l), e = 0; e < 30; e++) c[2 * e + 1] = 5, c[2 * e] = k(e, 5);p = new v(u, s, 257, 286, 15), m = new v(c, i, 0, 30, 15), g = new v(new Array(0), a, 0, 19, 7);}(), N = !0), e.l_desc = new b(e.dyn_ltree, p), e.d_desc = new b(e.dyn_dtree, m), e.bl_desc = new b(e.bl_tree, g), e.bi_buf = 0, e.bi_valid = 0, C(e);}, t._tr_stored_block = z, t._tr_flush_block = function (e, t, r, n) {var o, - s, - i = 0;e.level > 0 ? (2 === e.strm.data_type && (e.strm.data_type = function (e) {var t, - r = 4093624447;for (t = 0; t <= 31; t++, r >>>= 1) if (1 & r && 0 !== e.dyn_ltree[2 * t]) return 0;if (0 !== e.dyn_ltree[18] || 0 !== e.dyn_ltree[20] || 0 !== e.dyn_ltree[26]) return 1;for (t = 32; t < 256; t++) if (0 !== e.dyn_ltree[2 * t]) return 1;return 0;}(e)), I(e, e.l_desc), I(e, e.d_desc), i = function (e) {var t;for (T(e, e.dyn_ltree, e.l_desc.max_code), T(e, e.dyn_dtree, e.d_desc.max_code), I(e, e.bl_desc), t = 18; t >= 3 && 0 === e.bl_tree[2 * l[t] + 1]; t--);return e.opt_len += 3 * (t + 1) + 5 + 5 + 4, t;}(e), o = e.opt_len + 3 + 7 >>> 3, (s = e.static_len + 3 + 7 >>> 3) <= o && (o = s)) : o = s = r + 5, r + 4 <= o && -1 !== t ? z(e, t, r, n) : 4 === e.strategy || s === o ? (j(e, 2 + (n ? 1 : 0), 3), R(e, u, c)) : (j(e, 4 + (n ? 1 : 0), 3), function (e, t, r, n) {var o;for (j(e, t - 257, 5), j(e, r - 1, 5), j(e, n - 4, 4), o = 0; o < n; o++) j(e, e.bl_tree[2 * l[o] + 1], 3);L(e, e.dyn_ltree, t - 1), L(e, e.dyn_dtree, r - 1);}(e, e.l_desc.max_code + 1, e.d_desc.max_code + 1, i + 1), R(e, e.dyn_ltree, e.dyn_dtree)), C(e), n && x(e);}, t._tr_tally = function (e, t, r) {return e.pending_buf[e.d_buf + 2 * e.last_lit] = t >>> 8 & 255, e.pending_buf[e.d_buf + 2 * e.last_lit + 1] = 255 & t, e.pending_buf[e.l_buf + e.last_lit] = 255 & r, e.last_lit++, 0 === t ? e.dyn_ltree[2 * r]++ : (e.matches++, t--, e.dyn_ltree[2 * (h[r] + 256 + 1)]++, e.dyn_dtree[2 * y(t)]++), e.last_lit === e.lit_bufsize - 1;}, t._tr_align = function (e) {j(e, 2, 3), E(e, 256, u), function (e) {16 === e.bi_valid ? (w(e, e.bi_buf), e.bi_buf = 0, e.bi_valid = 0) : e.bi_valid >= 8 && (e.pending_buf[e.pending++] = 255 & e.bi_buf, e.bi_buf >>= 8, e.bi_valid -= 8);}(e);};}, "./node_modules/pako/lib/zlib/zstream.js": function (e, t, r) {"use strict"; - e.exports = function () {this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0;};}, "./node_modules/path-is-absolute/index.js": function (e, t, r) {"use strict"; - function n(e) {return "/" === e.charAt(0);}function o(e) {var t = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/.exec(e), - r = t[1] || "", - n = Boolean(r && ":" !== r.charAt(1));return Boolean(t[2] || n);}e.exports = "win32" === process.platform ? o : n, e.exports.posix = n, e.exports.win32 = o;}, "./node_modules/process-nextick-args/index.js": function (e, t, r) {"use strict"; - "undefined" == typeof process || !process.version || 0 === process.version.indexOf("v0.") || 0 === process.version.indexOf("v1.") && 0 !== process.version.indexOf("v1.8.") ? e.exports = { nextTick: function (e, t, r, n) {if ("function" != typeof e) throw new TypeError('"callback" argument must be a function');var o, - s, - i = arguments.length;switch (i) {case 0:case 1: - return process.nextTick(e); - case 2: - return process.nextTick(function () {e.call(null, t);}); - case 3: - return process.nextTick(function () {e.call(null, t, r);}); - case 4: - return process.nextTick(function () {e.call(null, t, r, n);}); - default: - for (o = new Array(i - 1), s = 0; s < o.length;) o[s++] = arguments[s]; - - return process.nextTick(function () {e.apply(null, o);}); - }} } : e.exports = process;}, "./node_modules/readable-stream/lib/_stream_duplex.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/process-nextick-args/index.js"), - o = Object.keys || function (e) {var t = [];for (var r in e) t.push(r);return t;};e.exports = d;var s = Object.create(r("./node_modules/core-util-is/lib/util.js"));s.inherits = r("./node_modules/inherits/inherits.js");var i = r("./node_modules/readable-stream/lib/_stream_readable.js"), - a = r("./node_modules/readable-stream/lib/_stream_writable.js");s.inherits(d, i);for (var l = o(a.prototype), u = 0; u < l.length; u++) {var c = l[u];d.prototype[c] || (d.prototype[c] = a.prototype[c]);}function d(e) {if (!(this instanceof d)) return new d(e);i.call(this, e), a.call(this, e), e && !1 === e.readable && (this.readable = !1), e && !1 === e.writable && (this.writable = !1), this.allowHalfOpen = !0, e && !1 === e.allowHalfOpen && (this.allowHalfOpen = !1), this.once("end", h);}function h() {this.allowHalfOpen || this._writableState.ended || n.nextTick(f, this);}function f(e) {e.end();}Object.defineProperty(d.prototype, "writableHighWaterMark", { enumerable: !1, get: function () {return this._writableState.highWaterMark;} }), Object.defineProperty(d.prototype, "destroyed", { get: function () {return void 0 !== this._readableState && void 0 !== this._writableState && (this._readableState.destroyed && this._writableState.destroyed);}, set: function (e) {void 0 !== this._readableState && void 0 !== this._writableState && (this._readableState.destroyed = e, this._writableState.destroyed = e);} }), d.prototype._destroy = function (e, t) {this.push(null), this.end(), n.nextTick(t, e);};}, "./node_modules/readable-stream/lib/_stream_passthrough.js": function (e, t, r) {"use strict"; - e.exports = s;var n = r("./node_modules/readable-stream/lib/_stream_transform.js"), - o = Object.create(r("./node_modules/core-util-is/lib/util.js"));function s(e) {if (!(this instanceof s)) return new s(e);n.call(this, e);}o.inherits = r("./node_modules/inherits/inherits.js"), o.inherits(s, n), s.prototype._transform = function (e, t, r) {r(null, e);};}, "./node_modules/readable-stream/lib/_stream_readable.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/process-nextick-args/index.js");e.exports = v;var o, - s = r("./node_modules/isarray/index.js");v.ReadableState = _;r("events").EventEmitter;var i = function (e, t) {return e.listeners(t).length;}, - a = r("./node_modules/readable-stream/lib/internal/streams/stream.js"), - l = r("./node_modules/safe-buffer/index.js").Buffer, - u = global.Uint8Array || function () {};var c = Object.create(r("./node_modules/core-util-is/lib/util.js"));c.inherits = r("./node_modules/inherits/inherits.js");var d = r("util"), - h = void 0;h = d && d.debuglog ? d.debuglog("stream") : function () {};var f, - p = r("./node_modules/readable-stream/lib/internal/streams/BufferList.js"), - m = r("./node_modules/readable-stream/lib/internal/streams/destroy.js");c.inherits(v, a);var g = ["error", "close", "destroy", "pause", "resume"];function _(e, t) {e = e || {};var n = t instanceof (o = o || r("./node_modules/readable-stream/lib/_stream_duplex.js"));this.objectMode = !!e.objectMode, n && (this.objectMode = this.objectMode || !!e.readableObjectMode);var s = e.highWaterMark, - i = e.readableHighWaterMark, - a = this.objectMode ? 16 : 16384;this.highWaterMark = s || 0 === s ? s : n && (i || 0 === i) ? i : a, this.highWaterMark = Math.floor(this.highWaterMark), this.buffer = new p(), this.length = 0, this.pipes = null, this.pipesCount = 0, this.flowing = null, this.ended = !1, this.endEmitted = !1, this.reading = !1, this.sync = !0, this.needReadable = !1, this.emittedReadable = !1, this.readableListening = !1, this.resumeScheduled = !1, this.destroyed = !1, this.defaultEncoding = e.defaultEncoding || "utf8", this.awaitDrain = 0, this.readingMore = !1, this.decoder = null, this.encoding = null, e.encoding && (f || (f = r("./node_modules/string_decoder/lib/string_decoder.js").StringDecoder), this.decoder = new f(e.encoding), this.encoding = e.encoding);}function v(e) {if (o = o || r("./node_modules/readable-stream/lib/_stream_duplex.js"), !(this instanceof v)) return new v(e);this._readableState = new _(e, this), this.readable = !0, e && ("function" == typeof e.read && (this._read = e.read), "function" == typeof e.destroy && (this._destroy = e.destroy)), a.call(this);}function b(e, t, r, n, o) {var s, - i = e._readableState;null === t ? (i.reading = !1, function (e, t) {if (t.ended) return;if (t.decoder) {var r = t.decoder.end();r && r.length && (t.buffer.push(r), t.length += t.objectMode ? 1 : r.length);}t.ended = !0, j(e);}(e, i)) : (o || (s = function (e, t) {var r;n = t, l.isBuffer(n) || n instanceof u || "string" == typeof t || void 0 === t || e.objectMode || (r = new TypeError("Invalid non-string/buffer chunk"));var n;return r;}(i, t)), s ? e.emit("error", s) : i.objectMode || t && t.length > 0 ? ("string" == typeof t || i.objectMode || Object.getPrototypeOf(t) === l.prototype || (t = function (e) {return l.from(e);}(t)), n ? i.endEmitted ? e.emit("error", new Error("stream.unshift() after end event")) : y(e, i, t, !0) : i.ended ? e.emit("error", new Error("stream.push() after EOF")) : (i.reading = !1, i.decoder && !r ? (t = i.decoder.write(t), i.objectMode || 0 !== t.length ? y(e, i, t, !1) : k(e, i)) : y(e, i, t, !1))) : n || (i.reading = !1));return function (e) {return !e.ended && (e.needReadable || e.length < e.highWaterMark || 0 === e.length);}(i);}function y(e, t, r, n) {t.flowing && 0 === t.length && !t.sync ? (e.emit("data", r), e.read(0)) : (t.length += t.objectMode ? 1 : r.length, n ? t.buffer.unshift(r) : t.buffer.push(r), t.needReadable && j(e)), k(e, t);}Object.defineProperty(v.prototype, "destroyed", { get: function () {return void 0 !== this._readableState && this._readableState.destroyed;}, set: function (e) {this._readableState && (this._readableState.destroyed = e);} }), v.prototype.destroy = m.destroy, v.prototype._undestroy = m.undestroy, v.prototype._destroy = function (e, t) {this.push(null), t(e);}, v.prototype.push = function (e, t) {var r, - n = this._readableState;return n.objectMode ? r = !0 : "string" == typeof e && ((t = t || n.defaultEncoding) !== n.encoding && (e = l.from(e, t), t = ""), r = !0), b(this, e, t, !1, r);}, v.prototype.unshift = function (e) {return b(this, e, null, !0, !1);}, v.prototype.isPaused = function () {return !1 === this._readableState.flowing;}, v.prototype.setEncoding = function (e) {return f || (f = r("./node_modules/string_decoder/lib/string_decoder.js").StringDecoder), this._readableState.decoder = new f(e), this._readableState.encoding = e, this;};function w(e, t) {return e <= 0 || 0 === t.length && t.ended ? 0 : t.objectMode ? 1 : e != e ? t.flowing && t.length ? t.buffer.head.data.length : t.length : (e > t.highWaterMark && (t.highWaterMark = function (e) {return e >= 8388608 ? e = 8388608 : (e--, e |= e >>> 1, e |= e >>> 2, e |= e >>> 4, e |= e >>> 8, e |= e >>> 16, e++), e;}(e)), e <= t.length ? e : t.ended ? t.length : (t.needReadable = !0, 0));}function j(e) {var t = e._readableState;t.needReadable = !1, t.emittedReadable || (h("emitReadable", t.flowing), t.emittedReadable = !0, t.sync ? n.nextTick(E, e) : E(e));}function E(e) {h("emit readable"), e.emit("readable"), O(e);}function k(e, t) {t.readingMore || (t.readingMore = !0, n.nextTick(S, e, t));}function S(e, t) {for (var r = t.length; !t.reading && !t.flowing && !t.ended && t.length < t.highWaterMark && (h("maybeReadMore read 0"), e.read(0), r !== t.length);) r = t.length;t.readingMore = !1;}function C(e) {h("readable nexttick read 0"), e.read(0);}function x(e, t) {t.reading || (h("resume read 0"), e.read(0)), t.resumeScheduled = !1, t.awaitDrain = 0, e.emit("resume"), O(e), t.flowing && !t.reading && e.read(0);}function O(e) {var t = e._readableState;for (h("flow", t.flowing); t.flowing && null !== e.read(););}function A(e, t) {return 0 === t.length ? null : (t.objectMode ? r = t.buffer.shift() : !e || e >= t.length ? (r = t.decoder ? t.buffer.join("") : 1 === t.buffer.length ? t.buffer.head.data : t.buffer.concat(t.length), t.buffer.clear()) : r = function (e, t, r) {var n;e < t.head.data.length ? (n = t.head.data.slice(0, e), t.head.data = t.head.data.slice(e)) : n = e === t.head.data.length ? t.shift() : r ? function (e, t) {var r = t.head, - n = 1, - o = r.data;e -= o.length;for (; r = r.next;) {var s = r.data, - i = e > s.length ? s.length : e;if (i === s.length ? o += s : o += s.slice(0, e), 0 === (e -= i)) {i === s.length ? (++n, r.next ? t.head = r.next : t.head = t.tail = null) : (t.head = r, r.data = s.slice(i));break;}++n;}return t.length -= n, o;}(e, t) : function (e, t) {var r = l.allocUnsafe(e), - n = t.head, - o = 1;n.data.copy(r), e -= n.data.length;for (; n = n.next;) {var s = n.data, - i = e > s.length ? s.length : e;if (s.copy(r, r.length - e, 0, i), 0 === (e -= i)) {i === s.length ? (++o, n.next ? t.head = n.next : t.head = t.tail = null) : (t.head = n, n.data = s.slice(i));break;}++o;}return t.length -= o, r;}(e, t);return n;}(e, t.buffer, t.decoder), r);var r;}function R(e) {var t = e._readableState;if (t.length > 0) throw new Error('"endReadable()" called on non-empty stream');t.endEmitted || (t.ended = !0, n.nextTick(I, t, e));}function I(e, t) {e.endEmitted || 0 !== e.length || (e.endEmitted = !0, t.readable = !1, t.emit("end"));}function T(e, t) {for (var r = 0, n = e.length; r < n; r++) if (e[r] === t) return r;return -1;}v.prototype.read = function (e) {h("read", e), e = parseInt(e, 10);var t = this._readableState, - r = e;if (0 !== e && (t.emittedReadable = !1), 0 === e && t.needReadable && (t.length >= t.highWaterMark || t.ended)) return h("read: emitReadable", t.length, t.ended), 0 === t.length && t.ended ? R(this) : j(this), null;if (0 === (e = w(e, t)) && t.ended) return 0 === t.length && R(this), null;var n, - o = t.needReadable;return h("need readable", o), (0 === t.length || t.length - e < t.highWaterMark) && h("length less than watermark", o = !0), t.ended || t.reading ? h("reading or ended", o = !1) : o && (h("do read"), t.reading = !0, t.sync = !0, 0 === t.length && (t.needReadable = !0), this._read(t.highWaterMark), t.sync = !1, t.reading || (e = w(r, t))), null === (n = e > 0 ? A(e, t) : null) ? (t.needReadable = !0, e = 0) : t.length -= e, 0 === t.length && (t.ended || (t.needReadable = !0), r !== e && t.ended && R(this)), null !== n && this.emit("data", n), n;}, v.prototype._read = function (e) {this.emit("error", new Error("_read() is not implemented"));}, v.prototype.pipe = function (e, t) {var r = this, - o = this._readableState;switch (o.pipesCount) {case 0: - o.pipes = e; - break; - case 1: - o.pipes = [o.pipes, e]; - break; - default: - o.pipes.push(e); - }o.pipesCount += 1, h("pipe count=%d opts=%j", o.pipesCount, t);var a = (!t || !1 !== t.end) && e !== process.stdout && e !== process.stderr ? u : v;function l(t, n) {h("onunpipe"), t === r && n && !1 === n.hasUnpiped && (n.hasUnpiped = !0, h("cleanup"), e.removeListener("close", g), e.removeListener("finish", _), e.removeListener("drain", c), e.removeListener("error", m), e.removeListener("unpipe", l), r.removeListener("end", u), r.removeListener("end", v), r.removeListener("data", p), d = !0, !o.awaitDrain || e._writableState && !e._writableState.needDrain || c());}function u() {h("onend"), e.end();}o.endEmitted ? n.nextTick(a) : r.once("end", a), e.on("unpipe", l);var c = function (e) {return function () {var t = e._readableState;h("pipeOnDrain", t.awaitDrain), t.awaitDrain && t.awaitDrain--, 0 === t.awaitDrain && i(e, "data") && (t.flowing = !0, O(e));};}(r);e.on("drain", c);var d = !1;var f = !1;function p(t) {h("ondata"), f = !1, !1 !== e.write(t) || f || ((1 === o.pipesCount && o.pipes === e || o.pipesCount > 1 && -1 !== T(o.pipes, e)) && !d && (h("false write response, pause", r._readableState.awaitDrain), r._readableState.awaitDrain++, f = !0), r.pause());}function m(t) {h("onerror", t), v(), e.removeListener("error", m), 0 === i(e, "error") && e.emit("error", t);}function g() {e.removeListener("finish", _), v();}function _() {h("onfinish"), e.removeListener("close", g), v();}function v() {h("unpipe"), r.unpipe(e);}return r.on("data", p), function (e, t, r) {if ("function" == typeof e.prependListener) return e.prependListener(t, r);e._events && e._events[t] ? s(e._events[t]) ? e._events[t].unshift(r) : e._events[t] = [r, e._events[t]] : e.on(t, r);}(e, "error", m), e.once("close", g), e.once("finish", _), e.emit("pipe", r), o.flowing || (h("pipe resume"), r.resume()), e;}, v.prototype.unpipe = function (e) {var t = this._readableState, - r = { hasUnpiped: !1 };if (0 === t.pipesCount) return this;if (1 === t.pipesCount) return e && e !== t.pipes || (e || (e = t.pipes), t.pipes = null, t.pipesCount = 0, t.flowing = !1, e && e.emit("unpipe", this, r)), this;if (!e) {var n = t.pipes, - o = t.pipesCount;t.pipes = null, t.pipesCount = 0, t.flowing = !1;for (var s = 0; s < o; s++) n[s].emit("unpipe", this, r);return this;}var i = T(t.pipes, e);return -1 === i || (t.pipes.splice(i, 1), t.pipesCount -= 1, 1 === t.pipesCount && (t.pipes = t.pipes[0]), e.emit("unpipe", this, r)), this;}, v.prototype.on = function (e, t) {var r = a.prototype.on.call(this, e, t);if ("data" === e) !1 !== this._readableState.flowing && this.resume();else if ("readable" === e) {var o = this._readableState;o.endEmitted || o.readableListening || (o.readableListening = o.needReadable = !0, o.emittedReadable = !1, o.reading ? o.length && j(this) : n.nextTick(C, this));}return r;}, v.prototype.addListener = v.prototype.on, v.prototype.resume = function () {var e = this._readableState;return e.flowing || (h("resume"), e.flowing = !0, function (e, t) {t.resumeScheduled || (t.resumeScheduled = !0, n.nextTick(x, e, t));}(this, e)), this;}, v.prototype.pause = function () {return h("call pause flowing=%j", this._readableState.flowing), !1 !== this._readableState.flowing && (h("pause"), this._readableState.flowing = !1, this.emit("pause")), this;}, v.prototype.wrap = function (e) {var t = this, - r = this._readableState, - n = !1;for (var o in e.on("end", function () {if (h("wrapped end"), r.decoder && !r.ended) {var e = r.decoder.end();e && e.length && t.push(e);}t.push(null);}), e.on("data", function (o) {(h("wrapped data"), r.decoder && (o = r.decoder.write(o)), r.objectMode && null == o) || (r.objectMode || o && o.length) && (t.push(o) || (n = !0, e.pause()));}), e) void 0 === this[o] && "function" == typeof e[o] && (this[o] = function (t) {return function () {return e[t].apply(e, arguments);};}(o));for (var s = 0; s < g.length; s++) e.on(g[s], this.emit.bind(this, g[s]));return this._read = function (t) {h("wrapped _read", t), n && (n = !1, e.resume());}, this;}, Object.defineProperty(v.prototype, "readableHighWaterMark", { enumerable: !1, get: function () {return this._readableState.highWaterMark;} }), v._fromList = A;}, "./node_modules/readable-stream/lib/_stream_transform.js": function (e, t, r) {"use strict"; - e.exports = i;var n = r("./node_modules/readable-stream/lib/_stream_duplex.js"), - o = Object.create(r("./node_modules/core-util-is/lib/util.js"));function s(e, t) {var r = this._transformState;r.transforming = !1;var n = r.writecb;if (!n) return this.emit("error", new Error("write callback called multiple times"));r.writechunk = null, r.writecb = null, null != t && this.push(t), n(e);var o = this._readableState;o.reading = !1, (o.needReadable || o.length < o.highWaterMark) && this._read(o.highWaterMark);}function i(e) {if (!(this instanceof i)) return new i(e);n.call(this, e), this._transformState = { afterTransform: s.bind(this), needTransform: !1, transforming: !1, writecb: null, writechunk: null, writeencoding: null }, this._readableState.needReadable = !0, this._readableState.sync = !1, e && ("function" == typeof e.transform && (this._transform = e.transform), "function" == typeof e.flush && (this._flush = e.flush)), this.on("prefinish", a);}function a() {var e = this;"function" == typeof this._flush ? this._flush(function (t, r) {l(e, t, r);}) : l(this, null, null);}function l(e, t, r) {if (t) return e.emit("error", t);if (null != r && e.push(r), e._writableState.length) throw new Error("Calling transform done when ws.length != 0");if (e._transformState.transforming) throw new Error("Calling transform done when still transforming");return e.push(null);}o.inherits = r("./node_modules/inherits/inherits.js"), o.inherits(i, n), i.prototype.push = function (e, t) {return this._transformState.needTransform = !1, n.prototype.push.call(this, e, t);}, i.prototype._transform = function (e, t, r) {throw new Error("_transform() is not implemented");}, i.prototype._write = function (e, t, r) {var n = this._transformState;if (n.writecb = r, n.writechunk = e, n.writeencoding = t, !n.transforming) {var o = this._readableState;(n.needTransform || o.needReadable || o.length < o.highWaterMark) && this._read(o.highWaterMark);}}, i.prototype._read = function (e) {var t = this._transformState;null !== t.writechunk && t.writecb && !t.transforming ? (t.transforming = !0, this._transform(t.writechunk, t.writeencoding, t.afterTransform)) : t.needTransform = !0;}, i.prototype._destroy = function (e, t) {var r = this;n.prototype._destroy.call(this, e, function (e) {t(e), r.emit("close");});};}, "./node_modules/readable-stream/lib/_stream_writable.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/process-nextick-args/index.js");function o(e) {var t = this;this.next = null, this.entry = null, this.finish = function () {!function (e, t, r) {var n = e.entry;e.entry = null;for (; n;) {var o = n.callback;t.pendingcb--, o(r), n = n.next;}t.corkedRequestsFree ? t.corkedRequestsFree.next = e : t.corkedRequestsFree = e;}(t, e);};}e.exports = g;var s, - i = !process.browser && ["v0.10", "v0.9."].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : n.nextTick;g.WritableState = m;var a = Object.create(r("./node_modules/core-util-is/lib/util.js"));a.inherits = r("./node_modules/inherits/inherits.js");var l = { deprecate: r("./node_modules/util-deprecate/node.js") }, - u = r("./node_modules/readable-stream/lib/internal/streams/stream.js"), - c = r("./node_modules/safe-buffer/index.js").Buffer, - d = global.Uint8Array || function () {};var h, - f = r("./node_modules/readable-stream/lib/internal/streams/destroy.js");function p() {}function m(e, t) {s = s || r("./node_modules/readable-stream/lib/_stream_duplex.js"), e = e || {};var a = t instanceof s;this.objectMode = !!e.objectMode, a && (this.objectMode = this.objectMode || !!e.writableObjectMode);var l = e.highWaterMark, - u = e.writableHighWaterMark, - c = this.objectMode ? 16 : 16384;this.highWaterMark = l || 0 === l ? l : a && (u || 0 === u) ? u : c, this.highWaterMark = Math.floor(this.highWaterMark), this.finalCalled = !1, this.needDrain = !1, this.ending = !1, this.ended = !1, this.finished = !1, this.destroyed = !1;var d = !1 === e.decodeStrings;this.decodeStrings = !d, this.defaultEncoding = e.defaultEncoding || "utf8", this.length = 0, this.writing = !1, this.corked = 0, this.sync = !0, this.bufferProcessing = !1, this.onwrite = function (e) {!function (e, t) {var r = e._writableState, - o = r.sync, - s = r.writecb;if (function (e) {e.writing = !1, e.writecb = null, e.length -= e.writelen, e.writelen = 0;}(r), t) !function (e, t, r, o, s) {--t.pendingcb, r ? (n.nextTick(s, o), n.nextTick(j, e, t), e._writableState.errorEmitted = !0, e.emit("error", o)) : (s(o), e._writableState.errorEmitted = !0, e.emit("error", o), j(e, t));}(e, r, o, t, s);else {var a = y(r);a || r.corked || r.bufferProcessing || !r.bufferedRequest || b(e, r), o ? i(v, e, r, a, s) : v(e, r, a, s);}}(t, e);}, this.writecb = null, this.writelen = 0, this.bufferedRequest = null, this.lastBufferedRequest = null, this.pendingcb = 0, this.prefinished = !1, this.errorEmitted = !1, this.bufferedRequestCount = 0, this.corkedRequestsFree = new o(this);}function g(e) {if (s = s || r("./node_modules/readable-stream/lib/_stream_duplex.js"), !(h.call(g, this) || this instanceof s)) return new g(e);this._writableState = new m(e, this), this.writable = !0, e && ("function" == typeof e.write && (this._write = e.write), "function" == typeof e.writev && (this._writev = e.writev), "function" == typeof e.destroy && (this._destroy = e.destroy), "function" == typeof e.final && (this._final = e.final)), u.call(this);}function _(e, t, r, n, o, s, i) {t.writelen = n, t.writecb = i, t.writing = !0, t.sync = !0, r ? e._writev(o, t.onwrite) : e._write(o, s, t.onwrite), t.sync = !1;}function v(e, t, r, n) {r || function (e, t) {0 === t.length && t.needDrain && (t.needDrain = !1, e.emit("drain"));}(e, t), t.pendingcb--, n(), j(e, t);}function b(e, t) {t.bufferProcessing = !0;var r = t.bufferedRequest;if (e._writev && r && r.next) {var n = t.bufferedRequestCount, - s = new Array(n), - i = t.corkedRequestsFree;i.entry = r;for (var a = 0, l = !0; r;) s[a] = r, r.isBuf || (l = !1), r = r.next, a += 1;s.allBuffers = l, _(e, t, !0, t.length, s, "", i.finish), t.pendingcb++, t.lastBufferedRequest = null, i.next ? (t.corkedRequestsFree = i.next, i.next = null) : t.corkedRequestsFree = new o(t), t.bufferedRequestCount = 0;} else {for (; r;) {var u = r.chunk, - c = r.encoding, - d = r.callback;if (_(e, t, !1, t.objectMode ? 1 : u.length, u, c, d), r = r.next, t.bufferedRequestCount--, t.writing) break;}null === r && (t.lastBufferedRequest = null);}t.bufferedRequest = r, t.bufferProcessing = !1;}function y(e) {return e.ending && 0 === e.length && null === e.bufferedRequest && !e.finished && !e.writing;}function w(e, t) {e._final(function (r) {t.pendingcb--, r && e.emit("error", r), t.prefinished = !0, e.emit("prefinish"), j(e, t);});}function j(e, t) {var r = y(t);return r && (!function (e, t) {t.prefinished || t.finalCalled || ("function" == typeof e._final ? (t.pendingcb++, t.finalCalled = !0, n.nextTick(w, e, t)) : (t.prefinished = !0, e.emit("prefinish")));}(e, t), 0 === t.pendingcb && (t.finished = !0, e.emit("finish"))), r;}a.inherits(g, u), m.prototype.getBuffer = function () {for (var e = this.bufferedRequest, t = []; e;) t.push(e), e = e.next;return t;}, function () {try {Object.defineProperty(m.prototype, "buffer", { get: l.deprecate(function () {return this.getBuffer();}, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003") });} catch (e) {}}(), "function" == typeof Symbol && Symbol.hasInstance && "function" == typeof Function.prototype[Symbol.hasInstance] ? (h = Function.prototype[Symbol.hasInstance], Object.defineProperty(g, Symbol.hasInstance, { value: function (e) {return !!h.call(this, e) || this === g && (e && e._writableState instanceof m);} })) : h = function (e) {return e instanceof this;}, g.prototype.pipe = function () {this.emit("error", new Error("Cannot pipe, not readable"));}, g.prototype.write = function (e, t, r) {var o, - s = this._writableState, - i = !1, - a = !s.objectMode && (o = e, c.isBuffer(o) || o instanceof d);return a && !c.isBuffer(e) && (e = function (e) {return c.from(e);}(e)), "function" == typeof t && (r = t, t = null), a ? t = "buffer" : t || (t = s.defaultEncoding), "function" != typeof r && (r = p), s.ended ? function (e, t) {var r = new Error("write after end");e.emit("error", r), n.nextTick(t, r);}(this, r) : (a || function (e, t, r, o) {var s = !0, - i = !1;return null === r ? i = new TypeError("May not write null values to stream") : "string" == typeof r || void 0 === r || t.objectMode || (i = new TypeError("Invalid non-string/buffer chunk")), i && (e.emit("error", i), n.nextTick(o, i), s = !1), s;}(this, s, e, r)) && (s.pendingcb++, i = function (e, t, r, n, o, s) {if (!r) {var i = function (e, t, r) {e.objectMode || !1 === e.decodeStrings || "string" != typeof t || (t = c.from(t, r));return t;}(t, n, o);n !== i && (r = !0, o = "buffer", n = i);}var a = t.objectMode ? 1 : n.length;t.length += a;var l = t.length < t.highWaterMark;l || (t.needDrain = !0);if (t.writing || t.corked) {var u = t.lastBufferedRequest;t.lastBufferedRequest = { chunk: n, encoding: o, isBuf: r, callback: s, next: null }, u ? u.next = t.lastBufferedRequest : t.bufferedRequest = t.lastBufferedRequest, t.bufferedRequestCount += 1;} else _(e, t, !1, a, n, o, s);return l;}(this, s, a, e, t, r)), i;}, g.prototype.cork = function () {this._writableState.corked++;}, g.prototype.uncork = function () {var e = this._writableState;e.corked && (e.corked--, e.writing || e.corked || e.finished || e.bufferProcessing || !e.bufferedRequest || b(this, e));}, g.prototype.setDefaultEncoding = function (e) {if ("string" == typeof e && (e = e.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((e + "").toLowerCase()) > -1)) throw new TypeError("Unknown encoding: " + e);return this._writableState.defaultEncoding = e, this;}, Object.defineProperty(g.prototype, "writableHighWaterMark", { enumerable: !1, get: function () {return this._writableState.highWaterMark;} }), g.prototype._write = function (e, t, r) {r(new Error("_write() is not implemented"));}, g.prototype._writev = null, g.prototype.end = function (e, t, r) {var o = this._writableState;"function" == typeof e ? (r = e, e = null, t = null) : "function" == typeof t && (r = t, t = null), null != e && this.write(e, t), o.corked && (o.corked = 1, this.uncork()), o.ending || o.finished || function (e, t, r) {t.ending = !0, j(e, t), r && (t.finished ? n.nextTick(r) : e.once("finish", r));t.ended = !0, e.writable = !1;}(this, o, r);}, Object.defineProperty(g.prototype, "destroyed", { get: function () {return void 0 !== this._writableState && this._writableState.destroyed;}, set: function (e) {this._writableState && (this._writableState.destroyed = e);} }), g.prototype.destroy = f.destroy, g.prototype._undestroy = f.undestroy, g.prototype._destroy = function (e, t) {this.end(), t(e);};}, "./node_modules/readable-stream/lib/internal/streams/BufferList.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/safe-buffer/index.js").Buffer, - o = r("util");e.exports = function () {function e() {!function (e, t) {if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function");}(this, e), this.head = null, this.tail = null, this.length = 0;}return e.prototype.push = function (e) {var t = { data: e, next: null };this.length > 0 ? this.tail.next = t : this.head = t, this.tail = t, ++this.length;}, e.prototype.unshift = function (e) {var t = { data: e, next: this.head };0 === this.length && (this.tail = t), this.head = t, ++this.length;}, e.prototype.shift = function () {if (0 !== this.length) {var e = this.head.data;return 1 === this.length ? this.head = this.tail = null : this.head = this.head.next, --this.length, e;}}, e.prototype.clear = function () {this.head = this.tail = null, this.length = 0;}, e.prototype.join = function (e) {if (0 === this.length) return "";for (var t = this.head, r = "" + t.data; t = t.next;) r += e + t.data;return r;}, e.prototype.concat = function (e) {if (0 === this.length) return n.alloc(0);if (1 === this.length) return this.head.data;for (var t, r, o, s = n.allocUnsafe(e >>> 0), i = this.head, a = 0; i;) t = i.data, r = s, o = a, t.copy(r, o), a += i.data.length, i = i.next;return s;}, e;}(), o && o.inspect && o.inspect.custom && (e.exports.prototype[o.inspect.custom] = function () {var e = o.inspect({ length: this.length });return this.constructor.name + " " + e;});}, "./node_modules/readable-stream/lib/internal/streams/destroy.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/process-nextick-args/index.js");function o(e, t) {e.emit("error", t);}e.exports = { destroy: function (e, t) {var r = this, - s = this._readableState && this._readableState.destroyed, - i = this._writableState && this._writableState.destroyed;return s || i ? (t ? t(e) : !e || this._writableState && this._writableState.errorEmitted || n.nextTick(o, this, e), this) : (this._readableState && (this._readableState.destroyed = !0), this._writableState && (this._writableState.destroyed = !0), this._destroy(e || null, function (e) {!t && e ? (n.nextTick(o, r, e), r._writableState && (r._writableState.errorEmitted = !0)) : t && t(e);}), this);}, undestroy: function () {this._readableState && (this._readableState.destroyed = !1, this._readableState.reading = !1, this._readableState.ended = !1, this._readableState.endEmitted = !1), this._writableState && (this._writableState.destroyed = !1, this._writableState.ended = !1, this._writableState.ending = !1, this._writableState.finished = !1, this._writableState.errorEmitted = !1);} };}, "./node_modules/readable-stream/lib/internal/streams/stream.js": function (e, t, r) {e.exports = r("stream");}, "./node_modules/readable-stream/readable.js": function (e, t, r) {var n = r("stream");"disable" === process.env.READABLE_STREAM && n ? (e.exports = n, (t = e.exports = n.Readable).Readable = n.Readable, t.Writable = n.Writable, t.Duplex = n.Duplex, t.Transform = n.Transform, t.PassThrough = n.PassThrough, t.Stream = n) : ((t = e.exports = r("./node_modules/readable-stream/lib/_stream_readable.js")).Stream = n || t, t.Readable = t, t.Writable = r("./node_modules/readable-stream/lib/_stream_writable.js"), t.Duplex = r("./node_modules/readable-stream/lib/_stream_duplex.js"), t.Transform = r("./node_modules/readable-stream/lib/_stream_transform.js"), t.PassThrough = r("./node_modules/readable-stream/lib/_stream_passthrough.js"));}, "./node_modules/rimraf/rimraf.js": function (e, t, r) {const n = r("assert"), - o = r("path"), - s = r("fs");let i = void 0;try {i = r("./node_modules/glob/glob.js");} catch (e) {}const a = { nosort: !0, silent: !0 };let l = 0;const u = "win32" === process.platform, - c = e => {if (["unlink", "chmod", "stat", "lstat", "rmdir", "readdir"].forEach(t => {e[t] = e[t] || s[t], e[t += "Sync"] = e[t] || s[t];}), e.maxBusyTries = e.maxBusyTries || 3, e.emfileWait = e.emfileWait || 1e3, !1 === e.glob && (e.disableGlob = !0), !0 !== e.disableGlob && void 0 === i) throw Error("glob dependency not found, set `options.disableGlob = true` if intentional");e.disableGlob = e.disableGlob || !1, e.glob = e.glob || a;}, - d = (e, t, r) => {"function" == typeof t && (r = t, t = {}), n(e, "rimraf: missing path"), n.equal(typeof e, "string", "rimraf: path should be a string"), n.equal(typeof r, "function", "rimraf: callback function required"), n(t, "rimraf: invalid options argument provided"), n.equal(typeof t, "object", "rimraf: options should be object"), c(t);let o = 0, - s = null, - a = 0;const u = (e, n) => e ? r(e) : (a = n.length, 0 === a ? r() : void n.forEach(e => {const n = i => {if (i) {if (("EBUSY" === i.code || "ENOTEMPTY" === i.code || "EPERM" === i.code) && o < t.maxBusyTries) return o++, setTimeout(() => h(e, t, n), 100 * o);if ("EMFILE" === i.code && l < t.emfileWait) return setTimeout(() => h(e, t, n), l++);"ENOENT" === i.code && (i = null);}l = 0, (e => {s = s || e, 0 == --a && r(s);})(i);};h(e, t, n);}));if (t.disableGlob || !i.hasMagic(e)) return u(null, [e]);t.lstat(e, (r, n) => {if (!r) return u(null, [e]);i(e, t.glob, u);});}, - h = (e, t, r) => {n(e), n(t), n("function" == typeof r), t.lstat(e, (n, o) => n && "ENOENT" === n.code ? r(null) : (n && "EPERM" === n.code && u && f(e, t, n, r), o && o.isDirectory() ? m(e, t, n, r) : void t.unlink(e, n => {if (n) {if ("ENOENT" === n.code) return r(null);if ("EPERM" === n.code) return u ? f(e, t, n, r) : m(e, t, n, r);if ("EISDIR" === n.code) return m(e, t, n, r);}return r(n);})));}, - f = (e, t, r, o) => {n(e), n(t), n("function" == typeof o), t.chmod(e, 438, n => {n ? o("ENOENT" === n.code ? null : r) : t.stat(e, (n, s) => {n ? o("ENOENT" === n.code ? null : r) : s.isDirectory() ? m(e, t, r, o) : t.unlink(e, o);});});}, - p = (e, t, r) => {n(e), n(t);try {t.chmodSync(e, 438);} catch (e) {if ("ENOENT" === e.code) return;throw r;}let o;try {o = t.statSync(e);} catch (e) {if ("ENOENT" === e.code) return;throw r;}o.isDirectory() ? v(e, t, r) : t.unlinkSync(e);}, - m = (e, t, r, o) => {n(e), n(t), n("function" == typeof o), t.rmdir(e, n => {!n || "ENOTEMPTY" !== n.code && "EEXIST" !== n.code && "EPERM" !== n.code ? n && "ENOTDIR" === n.code ? o(r) : o(n) : g(e, t, o);});}, - g = (e, t, r) => {n(e), n(t), n("function" == typeof r), t.readdir(e, (n, s) => {if (n) return r(n);let i, - a = s.length;if (0 === a) return t.rmdir(e, r);s.forEach(n => {d(o.join(e, n), t, n => {if (!i) return n ? r(i = n) : void (0 == --a && t.rmdir(e, r));});});});}, - _ = (e, t) => {let r;if (c(t = t || {}), n(e, "rimraf: missing path"), n.equal(typeof e, "string", "rimraf: path should be a string"), n(t, "rimraf: missing options"), n.equal(typeof t, "object", "rimraf: options should be object"), t.disableGlob || !i.hasMagic(e)) r = [e];else try {t.lstatSync(e), r = [e];} catch (n) {r = i.sync(e, t.glob);}if (r.length) for (let e = 0; e < r.length; e++) {const n = r[e];let o;try {o = t.lstatSync(n);} catch (e) {if ("ENOENT" === e.code) return;"EPERM" === e.code && u && p(n, t, e);}try {o && o.isDirectory() ? v(n, t, null) : t.unlinkSync(n);} catch (e) {if ("ENOENT" === e.code) return;if ("EPERM" === e.code) return u ? p(n, t, e) : v(n, t, e);if ("EISDIR" !== e.code) throw e;v(n, t, e);}}}, - v = (e, t, r) => {n(e), n(t);try {t.rmdirSync(e);} catch (n) {if ("ENOENT" === n.code) return;if ("ENOTDIR" === n.code) throw r;"ENOTEMPTY" !== n.code && "EEXIST" !== n.code && "EPERM" !== n.code || b(e, t);}}, - b = (e, t) => {n(e), n(t), t.readdirSync(e).forEach(r => _(o.join(e, r), t));const r = u ? 100 : 1;let s = 0;for (;;) {let n = !0;try {const o = t.rmdirSync(e, t);return n = !1, o;} finally {if (++s < r && n) continue;}}};e.exports = d, d.sync = _;}, "./node_modules/safe-buffer/index.js": function (e, t, r) {var n = r("buffer"), - o = n.Buffer;function s(e, t) {for (var r in e) t[r] = e[r];}function i(e, t, r) {return o(e, t, r);}o.from && o.alloc && o.allocUnsafe && o.allocUnsafeSlow ? e.exports = n : (s(n, t), t.Buffer = i), s(o, i), i.from = function (e, t, r) {if ("number" == typeof e) throw new TypeError("Argument must not be a number");return o(e, t, r);}, i.alloc = function (e, t, r) {if ("number" != typeof e) throw new TypeError("Argument must be a number");var n = o(e);return void 0 !== t ? "string" == typeof r ? n.fill(t, r) : n.fill(t) : n.fill(0), n;}, i.allocUnsafe = function (e) {if ("number" != typeof e) throw new TypeError("Argument must be a number");return o(e);}, i.allocUnsafeSlow = function (e) {if ("number" != typeof e) throw new TypeError("Argument must be a number");return n.SlowBuffer(e);};}, "./node_modules/set-immediate-shim/index.js": function (e, t, r) {"use strict"; - e.exports = "function" == typeof setImmediate ? setImmediate : function () {var e = [].slice.apply(arguments);e.splice(1, 0, 0), setTimeout.apply(null, e);};}, "./node_modules/string_decoder/lib/string_decoder.js": function (e, t, r) {"use strict"; - var n = r("./node_modules/safe-buffer/index.js").Buffer, - o = n.isEncoding || function (e) {switch ((e = "" + e) && e.toLowerCase()) {case "hex":case "utf8":case "utf-8":case "ascii":case "binary":case "base64":case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":case "raw": - return !0; - default: - return !1; - }};function s(e) {var t;switch (this.encoding = function (e) {var t = function (e) {if (!e) return "utf8";for (var t;;) switch (e) {case "utf8":case "utf-8": - return "utf8"; - case "ucs2":case "ucs-2":case "utf16le":case "utf-16le": - return "utf16le"; - case "latin1":case "binary": - return "latin1"; - case "base64":case "ascii":case "hex": - return e; - default: - if (t) return; - e = ("" + e).toLowerCase(), t = !0; - }}(e);if ("string" != typeof t && (n.isEncoding === o || !o(e))) throw new Error("Unknown encoding: " + e);return t || e;}(e), this.encoding) {case "utf16le": - this.text = l, this.end = u, t = 4; - break; - case "utf8": - this.fillLast = a, t = 4; - break; - case "base64": - this.text = c, this.end = d, t = 3; - break; - default: - return this.write = h, void (this.end = f); - }this.lastNeed = 0, this.lastTotal = 0, this.lastChar = n.allocUnsafe(t);}function i(e) {return e <= 127 ? 0 : e >> 5 == 6 ? 2 : e >> 4 == 14 ? 3 : e >> 3 == 30 ? 4 : e >> 6 == 2 ? -1 : -2;}function a(e) {var t = this.lastTotal - this.lastNeed, - r = function (e, t, r) {if (128 != (192 & t[0])) return e.lastNeed = 0, "�";if (e.lastNeed > 1 && t.length > 1) {if (128 != (192 & t[1])) return e.lastNeed = 1, "�";if (e.lastNeed > 2 && t.length > 2 && 128 != (192 & t[2])) return e.lastNeed = 2, "�";}}(this, e);return void 0 !== r ? r : this.lastNeed <= e.length ? (e.copy(this.lastChar, t, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal)) : (e.copy(this.lastChar, t, 0, e.length), void (this.lastNeed -= e.length));}function l(e, t) {if ((e.length - t) % 2 == 0) {var r = e.toString("utf16le", t);if (r) {var n = r.charCodeAt(r.length - 1);if (n >= 55296 && n <= 56319) return this.lastNeed = 2, this.lastTotal = 4, this.lastChar[0] = e[e.length - 2], this.lastChar[1] = e[e.length - 1], r.slice(0, -1);}return r;}return this.lastNeed = 1, this.lastTotal = 2, this.lastChar[0] = e[e.length - 1], e.toString("utf16le", t, e.length - 1);}function u(e) {var t = e && e.length ? this.write(e) : "";if (this.lastNeed) {var r = this.lastTotal - this.lastNeed;return t + this.lastChar.toString("utf16le", 0, r);}return t;}function c(e, t) {var r = (e.length - t) % 3;return 0 === r ? e.toString("base64", t) : (this.lastNeed = 3 - r, this.lastTotal = 3, 1 === r ? this.lastChar[0] = e[e.length - 1] : (this.lastChar[0] = e[e.length - 2], this.lastChar[1] = e[e.length - 1]), e.toString("base64", t, e.length - r));}function d(e) {var t = e && e.length ? this.write(e) : "";return this.lastNeed ? t + this.lastChar.toString("base64", 0, 3 - this.lastNeed) : t;}function h(e) {return e.toString(this.encoding);}function f(e) {return e && e.length ? this.write(e) : "";}t.StringDecoder = s, s.prototype.write = function (e) {if (0 === e.length) return "";var t, r;if (this.lastNeed) {if (void 0 === (t = this.fillLast(e))) return "";r = this.lastNeed, this.lastNeed = 0;} else r = 0;return r < e.length ? t ? t + this.text(e, r) : this.text(e, r) : t || "";}, s.prototype.end = function (e) {var t = e && e.length ? this.write(e) : "";return this.lastNeed ? t + "�" : t;}, s.prototype.text = function (e, t) {var r = function (e, t, r) {var n = t.length - 1;if (n < r) return 0;var o = i(t[n]);if (o >= 0) return o > 0 && (e.lastNeed = o - 1), o;if (--n < r || -2 === o) return 0;if ((o = i(t[n])) >= 0) return o > 0 && (e.lastNeed = o - 2), o;if (--n < r || -2 === o) return 0;if ((o = i(t[n])) >= 0) return o > 0 && (2 === o ? o = 0 : e.lastNeed = o - 3), o;return 0;}(this, e, t);if (!this.lastNeed) return e.toString("utf8", t);this.lastTotal = r;var n = e.length - (r - this.lastNeed);return e.copy(this.lastChar, 0, n), e.toString("utf8", t, n);}, s.prototype.fillLast = function (e) {if (this.lastNeed <= e.length) return e.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal);e.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, e.length), this.lastNeed -= e.length;};}, "./node_modules/supports-color/index.js": function (e, t, r) {"use strict"; - const n = r("os"), - o = r("tty"), - s = r("./node_modules/has-flag/index.js"), - { - env: i - } = process;let a;function l(e) {return 0 !== e && { level: e, hasBasic: !0, has256: e >= 2, has16m: e >= 3 };}function u(e, t) {if (0 === a) return 0;if (s("color=16m") || s("color=full") || s("color=truecolor")) return 3;if (s("color=256")) return 2;if (e && !t && void 0 === a) return 0;const r = a || 0;if ("dumb" === i.TERM) return r;if ("win32" === process.platform) {const e = n.release().split(".");return Number(e[0]) >= 10 && Number(e[2]) >= 10586 ? Number(e[2]) >= 14931 ? 3 : 2 : 1;}if ("CI" in i) return ["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI"].some(e => e in i) || "codeship" === i.CI_NAME ? 1 : r;if ("TEAMCITY_VERSION" in i) return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(i.TEAMCITY_VERSION) ? 1 : 0;if ("GITHUB_ACTIONS" in i) return 1;if ("truecolor" === i.COLORTERM) return 3;if ("TERM_PROGRAM" in i) {const e = parseInt((i.TERM_PROGRAM_VERSION || "").split(".")[0], 10);switch (i.TERM_PROGRAM) {case "iTerm.app": - return e >= 3 ? 3 : 2; - case "Apple_Terminal": - return 2; - }}return /-256(color)?$/i.test(i.TERM) ? 2 : /^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(i.TERM) || "COLORTERM" in i ? 1 : r;}s("no-color") || s("no-colors") || s("color=false") || s("color=never") ? a = 0 : (s("color") || s("colors") || s("color=true") || s("color=always")) && (a = 1), "FORCE_COLOR" in i && (a = "true" === i.FORCE_COLOR ? 1 : "false" === i.FORCE_COLOR ? 0 : 0 === i.FORCE_COLOR.length ? 1 : Math.min(parseInt(i.FORCE_COLOR, 10), 3)), e.exports = { supportsColor: function (e) {return l(u(e, e && e.isTTY));}, stdout: l(u(!0, o.isatty(1))), stderr: l(u(!0, o.isatty(2))) };}, "./node_modules/unzip-crx/dist/index.js": function (e, t, r) {"use strict"; - var n = r("fs"), - o = r("path"), - s = r("./node_modules/jszip/lib/index.js"), - i = r("./node_modules/unzip-crx/node_modules/mkdirp/index.js"), - a = r("./node_modules/yaku/lib/promisify.js"), - l = a(n.writeFile), - u = a(n.readFile), - c = a(i);e.exports = function (e, t) {var r = o.resolve(e), - n = o.extname(e), - i = o.basename(e, n), - a = o.dirname(e);return t = t || o.resolve(a, i), u(r).then(function (e) {return s.loadAsync(function (e) {function t(e, t, r, n) {var o = 0;return o += e, o += t << 8, o += r << 16, o += n << 24;}if (80 === e[0] && 75 === e[1] && 3 === e[2] && 4 === e[3]) return e;if (67 !== e[0] || 114 !== e[1] || 50 !== e[2] || 52 !== e[3]) throw new Error("Invalid header: Does not start with Cr24");if (2 !== e[4] || e[5] || e[6] || e[7]) throw new Error("Unexpected crx format version number.");var r = 16 + t(e[8], e[9], e[10], e[11]) + t(e[12], e[13], e[14], e[15]);return e.slice(r, e.length);}(e));}).then(function (e) {var r = Object.keys(e.files);return Promise.all(r.map(function (r) {var n = !e.files[r].dir, - s = o.join(t, r), - i = n && o.dirname(s) || s, - a = e.files[r].async("nodebuffer");return c(i).then(function () {return !!n && a;}).then(function (e) {return !e || l(s, e);});}));});};}, "./node_modules/unzip-crx/node_modules/mkdirp/index.js": function (e, t, r) {var n = r("path"), - o = r("fs"), - s = parseInt("0777", 8);function i(e, t, r, a) {"function" == typeof t ? (r = t, t = {}) : t && "object" == typeof t || (t = { mode: t });var l = t.mode, - u = t.fs || o;void 0 === l && (l = s), a || (a = null);var c = r || function () {};e = n.resolve(e), u.mkdir(e, l, function (r) {if (!r) return c(null, a = a || e);switch (r.code) {case "ENOENT": - if (n.dirname(e) === e) return c(r); - i(n.dirname(e), t, function (r, n) {r ? c(r, n) : i(e, t, c, n);}); - break; - default: - u.stat(e, function (e, t) {e || !t.isDirectory() ? c(r, a) : c(null, a);}); - }});}e.exports = i.mkdirp = i.mkdirP = i, i.sync = function e(t, r, i) {r && "object" == typeof r || (r = { mode: r });var a = r.mode, - l = r.fs || o;void 0 === a && (a = s), i || (i = null), t = n.resolve(t);try {l.mkdirSync(t, a), i = i || t;} catch (o) {switch (o.code) {case "ENOENT": - i = e(n.dirname(t), r, i), e(t, r, i); - break; - default: - var u; - - try {u = l.statSync(t);} catch (e) {throw o;} - - if (!u.isDirectory()) throw o; - }}return i;};}, "./node_modules/util-deprecate/node.js": function (e, t, r) {e.exports = r("util").deprecate;}, "./node_modules/webpack/buildin/module.js": function (e, t) {e.exports = function (e) {return e.webpackPolyfill || (e.deprecate = function () {}, e.paths = [], e.children || (e.children = []), Object.defineProperty(e, "loaded", { enumerable: !0, get: function () {return e.l;} }), Object.defineProperty(e, "id", { enumerable: !0, get: function () {return e.i;} }), e.webpackPolyfill = 1), e;};}, "./node_modules/wrappy/wrappy.js": function (e, t) {e.exports = function e(t, r) {if (t && r) return e(t)(r);if ("function" != typeof t) throw new TypeError("need wrapper function");return Object.keys(t).forEach(function (e) {n[e] = t[e];}), n;function n() {for (var e = new Array(arguments.length), r = 0; r < e.length; r++) e[r] = arguments[r];var n = t.apply(this, e), - o = e[e.length - 1];return "function" == typeof n && n !== o && Object.keys(o).forEach(function (e) {n[e] = o[e];}), n;}};}, "./node_modules/yaku/lib/_.js": function (e, t, r) {var n = r("./node_modules/yaku/lib/yaku.js");e.exports = { extendPrototype: function (e, t) {for (var r in t) e.prototype[r] = t[r];return e;}, isFunction: function (e) {return "function" == typeof e;}, isNumber: function (e) {return "number" == typeof e;}, Promise: n, slice: [].slice };}, "./node_modules/yaku/lib/promisify.js": function (e, t, r) {var n = r("./node_modules/yaku/lib/_.js"), - o = n.isFunction;e.exports = function (e, t) {return function (r, s, i, a, l) {var u, - c, - d, - h, - f = arguments.length;function p(e, t) {null == e ? d(t) : h(e);}switch (c = new n.Promise(function (e, t) {d = e, h = t;}), f) {case 0: - e.call(t, p); - break; - case 1: - o(r) ? e.call(t, r) : e.call(t, r, p); - break; - case 2: - o(s) ? e.call(t, r, s) : e.call(t, r, s, p); - break; - case 3: - o(i) ? e.call(t, r, s, i) : e.call(t, r, s, i, p); - break; - case 4: - o(a) ? e.call(t, r, s, i, a) : e.call(t, r, s, i, a, p); - break; - case 5: - o(l) ? e.call(t, r, s, i, a, l) : e.call(t, r, s, i, a, l, p); - break; - default: - u = new Array(f); - - for (var m = 0; m < f; m++) u[m] = arguments[m]; - - if (o(u[f - 1])) return e.apply(t, u); - u[m] = p, e.apply(t, u); - }return c;};};}, "./node_modules/yaku/lib/yaku.js": function (e, t) {!function () {"use strict"; - var t, - r, - n = "object" == typeof window ? window : global, - o = !1, - s = n.process, - i = Array, - a = Error, - l = { e: null }, - u = function () {}, - c = /^.+\/node_modules\/yaku\/.+\n?/gm, - d = e.exports = function (e) {var t;if (!f(this) || void 0 !== this._s) throw w("Invalid this");if (this._s = 2, o && (this._pt = j()), e !== u) {if (!p(e)) throw w("Invalid argument");(t = v(e)(O(this, 1), O(this, 0))) === l && I(this, 0, t.e);}};function h() {return d.Symbol.species || "Symbol(species)";}function f(e) {return e && "object" == typeof e;}function p(e) {return "function" == typeof e;}function m(e, t) {return e instanceof t;}function g(e, t, r) {if (!t(e)) throw w(r);}function _() {try {return t.apply(r, arguments);} catch (e) {return l.e = e, l;}}function v(e, n) {return t = e, r = n, _;}function b(e, t) {var r = i(e), - n = 0;function o() {for (var o = 0; o < n;) t(r[o], r[o + 1]), r[o++] = void 0, r[o++] = void 0;n = 0, r.length > e && (r.length = e);}return function (e, t) {r[n++] = e, r[n++] = t, 2 === n && d.nextTick(o);};}function y(e, t) {var r, - n, - o, - s, - a = 0;if (!e) throw w("Invalid argument");var u = e[d.Symbol.iterator];if (p(u)) n = u.call(e);else {if (!p(e.next)) {if (m(e, i)) {for (r = e.length; a < r;) t(e[a], a++);return a;}throw w("Invalid argument");}n = e;}for (; !(o = n.next()).done;) if ((s = v(t)(o.value, a++)) === l) throw p(n.return) && n.return(), s.e;return a;}function w(e) {return new TypeError(e);}function j(e) {return (e ? "" : "\nFrom previous ") + new a().stack;}d.default = d, function (e, t) {for (var r in t) e.prototype[r] = t[r];}(d, { then: function (e, t) {if (void 0 === this._s) throw w();return function (e, t, r, n) {p(r) && (t._onFulfilled = r);p(n) && (e._uh && S("rejectionHandled", e), t._onRejected = n);o && (t._pre = e);e[e._pCount++] = t, 2 !== e._s && E(e, t);return t;}(this, x(d.speciesConstructor(this, d)), e, t);}, catch: function (e) {return this.then(void 0, e);}, _pCount: 0, _pre: null, _Yaku: 1 }), d.resolve = function (e) {return C(e) ? e : T(x(this), e);}, d.reject = function (e) {return I(x(this), 0, e);}, d.race = function (e) {var t = this, - r = x(t), - n = function (e) {I(r, 1, e);}, - o = function (e) {I(r, 0, e);}, - s = v(y)(e, function (e) {t.resolve(e).then(n, o);});return s === l ? t.reject(s.e) : r;}, d.all = function (e) {var t, - r = this, - n = x(r), - o = [];function s(e) {I(n, 0, e);}return (t = v(y)(e, function (e, i) {r.resolve(e).then(function (e) {o[i] = e, --t || I(n, 1, o);}, s);})) === l ? r.reject(t.e) : (t || I(n, 1, []), n);}, d.Symbol = n.Symbol || {}, v(function () {Object.defineProperty(d, h(), { get: function () {return this;} });})(), d.speciesConstructor = function (e, t) {var r = e.constructor;return r && r[h()] || t;}, d.unhandledRejection = function (e, t) {try {n.console.error("Uncaught (in promise)", o ? t.longStack : A(e, t));} catch (e) {}}, d.rejectionHandled = u, d.enableLongStackTrace = function () {o = !0;}, d.nextTick = s ? s.nextTick : function (e) {setTimeout(e);}, d._Yaku = 1;var E = b(999, function (e, t) {var r, n;void 0 !== (n = e._s ? t._onFulfilled : t._onRejected) ? (r = v(R)(n, e._v)) !== l ? T(t, r) : I(t, 0, r.e) : I(t, e._s, e._v);}), - k = b(9, function (e) {(function e(t) {if (t._umark) return !0;t._umark = !0;var r, - n = 0, - o = t._pCount;for (; n < o;) if ((r = t[n++])._onRejected || e(r)) return !0;})(e) || (e._uh = 1, S("unhandledRejection", e));});function S(e, t) {var r = "on" + e.toLowerCase(), - o = n[r];s && s.listeners(e).length ? "unhandledRejection" === e ? s.emit(e, t._v, t) : s.emit(e, t) : o ? o({ reason: t._v, promise: t }) : d[e](t._v, t);}function C(e) {return e && e._Yaku;}function x(e) {return C(e) ? new e(u) : (t = new e(function (e, o) {if (t) throw w();r = e, n = o;}), g(r, p), g(n, p), t);var t, r, n;}function O(e, t) {return function (r) {o && (e._st = j(!0)), 1 === t ? T(e, r) : I(e, t, r);};}function A(e, t) {var r = [];function n(e) {return r.push(e.replace(/^\s+|\s+$/g, ""));}return o && (t._st && n(t._st), function e(t) {t && "_pt" in t && (e(t._next), n(t._pt + ""), e(t._pre));}(t)), (e && e.stack ? e.stack : e) + ("\n" + r.join("\n")).replace(c, "");}function R(e, t) {return e(t);}function I(e, t, r) {var n = 0, - s = e._pCount;if (2 === e._s) for (e._s = t, e._v = r, 0 === t && (o && m(r, a) && (r.longStack = A(r, e)), k(e)); n < s;) E(e, e[n++]);return e;}function T(e, t) {if (t === e && t) return I(e, 0, w("Chaining cycle detected for promise")), e;if (null !== t && (p(t) || f(t))) {var r = v(L)(t);if (r === l) return I(e, 0, r.e), e;p(r) ? (o && C(t) && (e._next = t), C(t) ? N(e, t, r) : d.nextTick(function () {N(e, t, r);})) : I(e, 1, t);} else I(e, 1, t);return e;}function L(e) {return e.then;}function N(e, t, r) {var n = v(r, t)(function (r) {t && (t = null, T(e, r));}, function (r) {t && (t = null, I(e, 0, r));});n === l && t && (I(e, 0, n.e), t = null);}}();}, assert: function (e, t) {e.exports = require("assert");}, buffer: function (e, t) {e.exports = require("buffer");}, electron: function (e, t) {e.exports = require("electron");}, events: function (e, t) {e.exports = require("events");}, fs: function (e, t) {e.exports = require("fs");}, https: function (e, t) {e.exports = require("https");}, module: function (e, t) {e.exports = require("module");}, os: function (e, t) {e.exports = require("os");}, path: function (e, t) {e.exports = require("path");}, stream: function (e, t) {e.exports = require("stream");}, tty: function (e, t) {e.exports = require("tty");}, util: function (e, t) {e.exports = require("util");} }); \ No newline at end of file diff --git a/app/menu.ts b/app/menu.ts index 36ff03e9..77a32684 100644 --- a/app/menu.ts +++ b/app/menu.ts @@ -1,8 +1,18 @@ +/* eslint @typescript-eslint/ban-ts-ignore: off */ +import { + app, + Menu, + shell, + BrowserWindow, + MenuItemConstructorOptions +} from 'electron'; -import { app, Menu, shell, BrowserWindow } from "electron"; +interface DarwinMenuItemConstructorOptions extends MenuItemConstructorOptions { + selector?: string; + submenu?: DarwinMenuItemConstructorOptions[] | Menu; +} export default class MenuBuilder { - mainWindow: BrowserWindow; constructor(mainWindow: BrowserWindow) { @@ -10,11 +20,17 @@ export default class MenuBuilder { } buildMenu() { - if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') { + if ( + process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' + ) { this.setupDevelopmentEnvironment(); } - const template = process.platform === 'darwin' ? this.buildDarwinTemplate() : this.buildDefaultTemplate(); + const template = + process.platform === 'darwin' + ? this.buildDarwinTemplate() + : this.buildDefaultTemplate(); const menu = Menu.buildFromTemplate(template); Menu.setApplicationMenu(menu); @@ -23,162 +39,253 @@ export default class MenuBuilder { } setupDevelopmentEnvironment() { - this.mainWindow.webContents.on('context-menu', (e, props) => { - const { - x, - y - } = props; + this.mainWindow.webContents.on('context-menu', (_, props) => { + const { x, y } = props; - Menu.buildFromTemplate([{ - label: 'Inspect element', - click: () => { - this.mainWindow.inspectElement(x, y); + Menu.buildFromTemplate([ + { + label: 'Inspect element', + click: () => { + this.mainWindow.webContents.inspectElement(x, y); + } } - }]).popup(this.mainWindow); + ]).popup({ window: this.mainWindow }); }); } buildDarwinTemplate() { - const subMenuAbout = { - label: 'Electron', - submenu: [{ - label: 'About BrainWaves', - selector: 'orderFrontStandardAboutPanel:' - }, { type: 'separator' }, { label: 'Services', submenu: [] }, { type: 'separator' }, { - label: 'Hide BrainWaves', - accelerator: 'Command+H', - selector: 'hide:' - }, { - label: 'Hide Others', - accelerator: 'Command+Shift+H', - selector: 'hideOtherApplications:' - }, { label: 'Show All', selector: 'unhideAllApplications:' }, { type: 'separator' }, { - label: 'Quit', - accelerator: 'Command+Q', - click: () => { - app.quit(); + const subMenuAbout: DarwinMenuItemConstructorOptions = { + label: 'BrainWaves', + submenu: [ + { + label: 'About BrainWaves', + selector: 'orderFrontStandardAboutPanel:' + }, + { type: 'separator' }, + { label: 'Services', submenu: [] }, + { type: 'separator' }, + { + label: 'Hide ElectronReact', + accelerator: 'Command+H', + selector: 'hide:' + }, + { + label: 'Hide Others', + accelerator: 'Command+Shift+H', + selector: 'hideOtherApplications:' + }, + { label: 'Show All', selector: 'unhideAllApplications:' }, + { type: 'separator' }, + { + label: 'Quit', + accelerator: 'Command+Q', + click: () => { + app.quit(); + } } - }] + ] }; - const subMenuEdit = { + const subMenuEdit: DarwinMenuItemConstructorOptions = { label: 'Edit', - submenu: [{ label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' }, { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' }, { type: 'separator' }, { label: 'Cut', accelerator: 'Command+X', selector: 'cut:' }, { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' }, { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' }, { - label: 'Select All', - accelerator: 'Command+A', - selector: 'selectAll:' - }] + submenu: [ + { label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' }, + { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' }, + { type: 'separator' }, + { label: 'Cut', accelerator: 'Command+X', selector: 'cut:' }, + { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' }, + { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' }, + { + label: 'Select All', + accelerator: 'Command+A', + selector: 'selectAll:' + } + ] }; - const subMenuViewDev = { + const subMenuViewDev: MenuItemConstructorOptions = { label: 'View', - submenu: [{ - label: 'Reload', - accelerator: 'Command+R', - click: () => { - this.mainWindow.webContents.reload(); - } - }, { - label: 'Toggle Full Screen', - accelerator: 'Ctrl+Command+F', - click: () => { - this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + submenu: [ + { + label: 'Reload', + accelerator: 'Command+R', + click: () => { + this.mainWindow.webContents.reload(); + } + }, + { + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + } + }, + { + label: 'Toggle Developer Tools', + accelerator: 'Alt+Command+I', + click: () => { + this.mainWindow.webContents.toggleDevTools(); + } } - }, { - label: 'Toggle Developer Tools', - accelerator: 'Alt+Command+I', - click: () => { - this.mainWindow.toggleDevTools(); - } - }] + ] }; - const subMenuViewProd = { + const subMenuViewProd: MenuItemConstructorOptions = { label: 'View', - submenu: [{ - label: 'Toggle Full Screen', - accelerator: 'Ctrl+Command+F', - click: () => { - this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + submenu: [ + { + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + } } - }] + ] }; - const subMenuWindow = { + const subMenuWindow: DarwinMenuItemConstructorOptions = { label: 'Window', - submenu: [{ - label: 'Minimize', - accelerator: 'Command+M', - selector: 'performMiniaturize:' - }, { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' }, { type: 'separator' }, { label: 'Bring All to Front', selector: 'arrangeInFront:' }] + submenu: [ + { + label: 'Minimize', + accelerator: 'Command+M', + selector: 'performMiniaturize:' + }, + { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' }, + { type: 'separator' }, + { label: 'Bring All to Front', selector: 'arrangeInFront:' } + ] + }; + const subMenuHelp: MenuItemConstructorOptions = { + label: 'Help', + submenu: [ + { + label: 'Learn More', + click() { + shell.openExternal('https://electronjs.org'); + } + }, + { + label: 'Documentation', + click() { + shell.openExternal( + 'https://github.com/electron/electron/tree/master/docs#readme' + ); + } + }, + { + label: 'Community Discussions', + click() { + shell.openExternal('https://www.electronjs.org/community'); + } + }, + { + label: 'Search Issues', + click() { + shell.openExternal('https://github.com/electron/electron/issues'); + } + } + ] }; - const subMenuView = process.env.NODE_ENV === 'development' ? subMenuViewDev : subMenuViewProd; + const subMenuView = + process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' + ? subMenuViewDev + : subMenuViewProd; - return [subMenuAbout, subMenuEdit, subMenuView, subMenuWindow]; + return [subMenuAbout, subMenuEdit, subMenuView, subMenuWindow, subMenuHelp]; } buildDefaultTemplate() { - const templateDefault = [{ - label: '&File', - submenu: [{ - label: '&Open', - accelerator: 'Ctrl+O' - }, { - label: '&Close', - accelerator: 'Ctrl+W', - click: () => { - this.mainWindow.close(); - } - }] - }, { - label: '&View', - submenu: process.env.NODE_ENV === 'development' ? [{ - label: '&Reload', - accelerator: 'Ctrl+R', - click: () => { - this.mainWindow.webContents.reload(); - } - }, { - label: 'Toggle &Full Screen', - accelerator: 'F11', - click: () => { - this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - } - }, { - label: 'Toggle &Developer Tools', - accelerator: 'Alt+Ctrl+I', - click: () => { - this.mainWindow.toggleDevTools(); - } - }] : [{ - label: 'Toggle &Full Screen', - accelerator: 'F11', - click: () => { - this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - } - }] - }, { - label: 'Help', - submenu: [{ - label: 'Learn More', - click() { - shell.openExternal('http://electron.atom.io'); - } - }, { - label: 'Documentation', - click() { - shell.openExternal('https://github.com/atom/electron/tree/master/docs#readme'); - } - }, { - label: 'Community Discussions', - click() { - shell.openExternal('https://discuss.atom.io/c/electron'); - } - }, { - label: 'Search Issues', - click() { - shell.openExternal('https://github.com/atom/electron/issues'); - } - }] - }]; + const templateDefault = [ + { + label: '&File', + submenu: [ + { + label: '&Open', + accelerator: 'Ctrl+O' + }, + { + label: '&Close', + accelerator: 'Ctrl+W', + click: () => { + this.mainWindow.close(); + } + } + ] + }, + { + label: '&View', + submenu: + process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' + ? [ + { + label: '&Reload', + accelerator: 'Ctrl+R', + click: () => { + this.mainWindow.webContents.reload(); + } + }, + { + label: 'Toggle &Full Screen', + accelerator: 'F11', + click: () => { + this.mainWindow.setFullScreen( + !this.mainWindow.isFullScreen() + ); + } + }, + { + label: 'Toggle &Developer Tools', + accelerator: 'Alt+Ctrl+I', + click: () => { + this.mainWindow.webContents.toggleDevTools(); + } + } + ] + : [ + { + label: 'Toggle &Full Screen', + accelerator: 'F11', + click: () => { + this.mainWindow.setFullScreen( + !this.mainWindow.isFullScreen() + ); + } + } + ] + }, + { + label: 'Help', + submenu: [ + { + label: 'Learn More', + click() { + shell.openExternal('https://electronjs.org'); + } + }, + { + label: 'Documentation', + click() { + shell.openExternal( + 'https://github.com/electron/electron/tree/master/docs#readme' + ); + } + }, + { + label: 'Community Discussions', + click() { + shell.openExternal('https://www.electronjs.org/community'); + } + }, + { + label: 'Search Issues', + click() { + shell.openExternal('https://github.com/electron/electron/issues'); + } + } + ] + } + ]; return templateDefault; } -} \ No newline at end of file +} diff --git a/app/package.json b/app/package.json index 437b6dc9..4f3f7039 100644 --- a/app/package.json +++ b/app/package.json @@ -12,7 +12,7 @@ }, "scripts": { "electron-rebuild": "node -r ../internals/scripts/BabelRegister.js ../internals/scripts/ElectronRebuild.js", - "postinstall": "patch-package && npm run electron-rebuild" + "postinstall": "patch-package && yarn electron-rebuild" }, "license": "MIT", "dependencies": { diff --git a/app/reducers/index.ts b/app/reducers/index.ts index b55cfe11..934c9f94 100644 --- a/app/reducers/index.ts +++ b/app/reducers/index.ts @@ -1,9 +1,8 @@ - -import { combineReducers } from "redux"; -import { routerReducer as router } from "react-router-redux"; -import jupyter from "./jupyterReducer"; -import device from "./deviceReducer"; -import experiment from "./experimentReducer"; +import { combineReducers } from 'redux'; +import { routerReducer as router } from 'react-router-redux'; +import jupyter from './jupyterReducer'; +import device from './deviceReducer'; +import experiment from './experimentReducer'; const rootReducer = combineReducers({ jupyter, @@ -12,4 +11,4 @@ const rootReducer = combineReducers({ router }); -export default rootReducer; \ No newline at end of file +export default rootReducer; diff --git a/app/reducers/types.ts b/app/reducers/types.ts new file mode 100644 index 00000000..32c9085f --- /dev/null +++ b/app/reducers/types.ts @@ -0,0 +1,7 @@ +import { Dispatch as ReduxDispatch, Store as ReduxStore, Action } from 'redux'; + +export type GetState = () => T; + +export type Dispatch = ReduxDispatch>; + +export type Store = ReduxStore>; diff --git a/app/routes.tsx b/app/routes.tsx index 2e988bcf..5f5b48bd 100644 --- a/app/routes.tsx +++ b/app/routes.tsx @@ -1,31 +1,47 @@ -/* eslint flowtype-errors/show-errors: 0 */ -import React from "react"; -import { Switch, Route } from "react-router"; -import App from "./containers/App"; -import HomeContainer from "./containers/HomeContainer"; -import ExperimentDesignContainer from "./containers/ExperimentDesignContainer"; -import CollectContainer from "./containers/CollectContainer"; -import CleanContainer from "./containers/CleanContainer"; -import AnalyzeContainer from "./containers/AnalyzeContainer"; -import { SCREENS } from "./constants/constants"; +import React from 'react'; +import { Switch, Route } from 'react-router'; +import App from './containers/App'; +import HomeContainer from './containers/HomeContainer'; +import ExperimentDesignContainer from './containers/ExperimentDesignContainer'; +import CollectContainer from './containers/CollectContainer'; +import CleanContainer from './containers/CleanContainer'; +import AnalyzeContainer from './containers/AnalyzeContainer'; +import { SCREENS } from './constants/constants'; const renderMergedProps = (component, ...rest) => { const finalProps = Object.assign({}, ...rest); return React.createElement(component, finalProps); }; -const PropsRoute = ({ - component, - ...rest -}) => renderMergedProps(component, routeProps, rest)} />; +// Wraps the normal Route class with a function that will inject a particular prop +// Allows us to manipulate props directly thruogh route transitions +const PropsRoute = ({ component, ...rest }) => ( + renderMergedProps(component, routeProps, rest)} + /> +); -export default (() => +export default () => ( + - - - + + + - ); \ No newline at end of file + +); diff --git a/app/viewer.ts b/app/viewer.ts index fa29b204..35c1c208 100644 --- a/app/viewer.ts +++ b/app/viewer.ts @@ -2,6 +2,7 @@ const ipcChannel = require('electron').ipcRenderer; const EEGGraph = require('./components/d3Classes/EEGViewer'); +// TODO: should this by js? let graph = {}; ipcChannel.on('initGraph', (event, message) => { graph = new EEGGraph(document.getElementById('graph'), message); @@ -26,4 +27,4 @@ ipcChannel.on('updateDownsampling', (event, message) => { }); ipcChannel.on('autoScale', () => { graph.autoScale(); -}); \ No newline at end of file +}); From 08178d6368bf5bb9fe7275b335dfb4579e35f295 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Tue, 23 Jun 2020 11:13:28 -0700 Subject: [PATCH 13/66] updated routes --- app/routes.tsx | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/app/routes.tsx b/app/routes.tsx index 5f5b48bd..93ba0d3e 100644 --- a/app/routes.tsx +++ b/app/routes.tsx @@ -13,7 +13,7 @@ const renderMergedProps = (component, ...rest) => { return React.createElement(component, finalProps); }; -// Wraps the normal Route class with a function that will inject a particular prop +// Wraps the normal Route class with the ability to inject a particular prop // Allows us to manipulate props directly thruogh route transitions const PropsRoute = ({ component, ...rest }) => ( ( /> ); -export default () => ( - - - - - - - - - - -); +export default function Routes() { + return ( + + + + + + + + + + + ); +} From 3efd62792c1f54fc90104caf51aef66974e72f3c Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Wed, 24 Jun 2020 17:22:26 -0700 Subject: [PATCH 14/66] added redux thunk back --- package.json | 1 + yarn.lock | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/package.json b/package.json index d954e965..b0338b1f 100644 --- a/package.json +++ b/package.json @@ -311,6 +311,7 @@ "recursive-readdir": "^2.2.2", "redux": "^4.0.5", "redux-observable": "^1.2.0", + "redux-thunk": "^2.3.0", "rxjs": "^6.5.5", "rxjs-compat": "^6.5.5", "semantic-ui-css": "^2.4.1", diff --git a/yarn.lock b/yarn.lock index bb903db1..582b2ab0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15068,6 +15068,11 @@ redux-observable@^1.2.0: resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-1.2.0.tgz#ff51b6c6be2598e9b5e89fc36639186bb0e669c7" integrity sha512-yeR90RP2WzZzCxxnQPlh2uFzyfFLsfXu8ROh53jGDPXVqj71uNDMmvi/YKQkd9ofiVoO4OYb1snbowO49tCEMg== +redux-thunk@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" + integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== + redux@^4.0.0, redux@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" From 914e9c4759a714111a8084fedc4fdd70316fe57d Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Wed, 24 Jun 2020 17:25:09 -0700 Subject: [PATCH 15/66] Ran prettier --- app/actions/deviceActions.ts | 4 +- app/actions/experimentActions.ts | 2 +- app/actions/jupyterActions.ts | 2 +- app/components/AnalyzeComponent.tsx | 489 +- .../CleanComponent/CleanSidebar.tsx | 96 +- app/components/CleanComponent/index.tsx | 199 +- .../CollectComponent/ConnectModal.tsx | 204 +- .../CollectComponent/HelpSidebar.tsx | 115 +- .../CollectComponent/PreTestComponent.tsx | 110 +- .../CollectComponent/RunComponent.tsx | 149 +- app/components/CollectComponent/index.tsx | 99 +- .../DesignComponent/CustomDesignComponent.tsx | 711 ++- .../DesignComponent/ParamSlider.tsx | 39 +- .../DesignComponent/StimuliDesignColumn.tsx | 80 +- app/components/DesignComponent/StimuliRow.tsx | 64 +- app/components/DesignComponent/index.tsx | 222 +- app/components/EEGExplorationComponent.tsx | 95 +- .../HomeComponent/OverviewComponent.tsx | 134 +- app/components/HomeComponent/index.tsx | 327 +- app/components/InputCollect.tsx | 66 +- app/components/InputModal.tsx | 35 +- app/components/JupyterPlotWidget.tsx | 50 +- app/components/PreviewButtonComponent.tsx | 19 +- app/components/PreviewExperimentComponent.tsx | 53 +- .../SecondaryNavSegment.tsx | 20 +- .../SecondaryNavComponent/index.tsx | 66 +- .../SignalQualityIndicatorComponent.tsx | 44 +- .../TopNavComponent/PrimaryNavSegment.tsx | 20 +- app/components/TopNavComponent/index.tsx | 100 +- app/components/ViewerComponent.tsx | 48 +- app/components/d3Classes/EEGViewer.ts | 179 +- .../svgs/ClickableHeadDiagramSVG.tsx | 560 +- .../svgs/SignalQualityIndicatorSVG.tsx | 465 +- app/constants/constants.ts | 19 +- app/containers/AnalyzeContainer.ts | 13 +- app/containers/App.tsx | 15 +- app/containers/CleanContainer.ts | 13 +- app/containers/CollectContainer.ts | 13 +- app/containers/ExperimentDesignContainer.ts | 11 +- app/containers/HomeContainer.ts | 15 +- app/containers/TopNavBarContainer.ts | 11 +- app/css.d.ts | 14 +- app/epics/deviceEpics.ts | 269 +- app/epics/experimentEpics.ts | 232 +- app/epics/index.ts | 10 +- app/epics/jupyterEpics.ts | 457 +- app/reducers/deviceReducer.ts | 31 +- app/reducers/experimentReducer.ts | 38 +- app/reducers/jupyterReducer.ts | 64 +- app/store/configureStore.dev.ts | 36 +- app/store/configureStore.prod.ts | 17 +- app/store/configureStore.ts | 17 +- app/utils/behavior/compute.ts | 423 +- app/utils/eeg/cortex.ts | 99 +- app/utils/eeg/emotiv.ts | 62 +- app/utils/eeg/muse.ts | 78 +- app/utils/eeg/pipes.ts | 85 +- app/utils/filesystem/dialog.ts | 48 +- app/utils/filesystem/select.ts | 17 +- app/utils/filesystem/storage.ts | 155 +- app/utils/filesystem/write.ts | 28 +- app/utils/jupyter/cells.ts | 111 +- app/utils/jupyter/functions.ts | 12 +- app/utils/jupyter/pipes.ts | 24 +- app/utils/labjs/functions.ts | 34 +- app/utils/labjs/index.tsx | 69 +- app/utils/labjs/protocols/custom.ts | 38 +- app/utils/labjs/protocols/faceshouses.ts | 101 +- app/utils/labjs/protocols/multi.ts | 46 +- app/utils/labjs/protocols/search.ts | 27 +- app/utils/labjs/protocols/stroop.ts | 38 +- app/utils/labjs/scripts/custom.ts | 870 +-- app/utils/labjs/scripts/faceshouses.ts | 869 +-- app/utils/labjs/scripts/multitasking.ts | 5069 +++++++++-------- app/utils/labjs/scripts/stroop.ts | 1347 +++-- app/utils/labjs/scripts/visualsearch.ts | 1169 ++-- 76 files changed, 10473 insertions(+), 6507 deletions(-) diff --git a/app/actions/deviceActions.ts b/app/actions/deviceActions.ts index 8b000662..86719165 100644 --- a/app/actions/deviceActions.ts +++ b/app/actions/deviceActions.ts @@ -1,4 +1,4 @@ -import { EXPERIMENT_CLEANUP } from "../epics/experimentEpics"; +import { EXPERIMENT_CLEANUP } from '../epics/experimentEpics'; // ------------------------------------------------------------------------- // Action Types @@ -27,4 +27,4 @@ export const setConnectionStatus = payload => ({ export const setDeviceAvailability = payload => ({ payload, type: SET_DEVICE_AVAILABILITY -}); \ No newline at end of file +}); diff --git a/app/actions/experimentActions.ts b/app/actions/experimentActions.ts index 0a8001f8..1bff6996 100644 --- a/app/actions/experimentActions.ts +++ b/app/actions/experimentActions.ts @@ -40,4 +40,4 @@ export const loadDefaultTimeline = () => ({ type: LOAD_DEFAULT_TIMELINE }); export const setTitle = payload => ({ payload, type: SET_TITLE }); export const saveWorkspace = () => ({ type: SAVE_WORKSPACE }); export const setState = payload => ({ payload, type: SET_EXPERIMENT_STATE }); -export const setEEGEnabled = payload => ({ payload, type: SET_EEG_ENABLED }); \ No newline at end of file +export const setEEGEnabled = payload => ({ payload, type: SET_EEG_ENABLED }); diff --git a/app/actions/jupyterActions.ts b/app/actions/jupyterActions.ts index a783a2f9..3fe25266 100644 --- a/app/actions/jupyterActions.ts +++ b/app/actions/jupyterActions.ts @@ -49,4 +49,4 @@ export const loadTopo = () => ({ export const cleanEpochs = () => ({ type: CLEAN_EPOCHS }); -export const closeKernel = () => ({ type: CLOSE_KERNEL }); \ No newline at end of file +export const closeKernel = () => ({ type: CLOSE_KERNEL }); diff --git a/app/components/AnalyzeComponent.tsx b/app/components/AnalyzeComponent.tsx index e4bd8e7b..05b42cf9 100644 --- a/app/components/AnalyzeComponent.tsx +++ b/app/components/AnalyzeComponent.tsx @@ -1,16 +1,40 @@ - -import React, { Component } from "react"; -import { Grid, Icon, Segment, Header, Dropdown, Divider, Button, Checkbox, Sidebar } from "semantic-ui-react"; -import { isNil } from "lodash"; -import Plot from "react-plotly.js"; -import styles from "./styles/common.css"; -import { DEVICES, MUSE_CHANNELS, EMOTIV_CHANNELS, KERNEL_STATUS, EXPERIMENTS } from "../constants/constants"; -import { readWorkspaceCleanedEEGData, getSubjectNamesFromFiles, readWorkspaceBehaviorData, readBehaviorData, storeAggregatedBehaviorData } from "../utils/filesystem/storage"; -import { aggregateDataForPlot, aggregateBehaviorDataToSave } from "../utils/behavior/compute"; -import SecondaryNavComponent from "./SecondaryNavComponent"; -import ClickableHeadDiagramSVG from "./svgs/ClickableHeadDiagramSVG"; -import JupyterPlotWidget from "./JupyterPlotWidget"; -import { HelpButton } from "./CollectComponent/HelpSidebar"; +import React, { Component } from 'react'; +import { + Grid, + Icon, + Segment, + Header, + Dropdown, + Divider, + Button, + Checkbox, + Sidebar +} from 'semantic-ui-react'; +import { isNil } from 'lodash'; +import Plot from 'react-plotly.js'; +import styles from './styles/common.css'; +import { + DEVICES, + MUSE_CHANNELS, + EMOTIV_CHANNELS, + KERNEL_STATUS, + EXPERIMENTS +} from '../constants/constants'; +import { + readWorkspaceCleanedEEGData, + getSubjectNamesFromFiles, + readWorkspaceBehaviorData, + readBehaviorData, + storeAggregatedBehaviorData +} from '../utils/filesystem/storage'; +import { + aggregateDataForPlot, + aggregateBehaviorDataToSave +} from '../utils/behavior/compute'; +import SecondaryNavComponent from './SecondaryNavComponent'; +import ClickableHeadDiagramSVG from './svgs/ClickableHeadDiagramSVG'; +import JupyterPlotWidget from './JupyterPlotWidget'; +import { HelpButton } from './CollectComponent/HelpSidebar'; const ANALYZE_STEPS = { OVERVIEW: 'OVERVIEW', @@ -30,35 +54,55 @@ interface Props { kernel: Kernel | null | undefined; kernelStatus: KERNEL_STATUS; mainChannel: any | null | undefined; - epochsInfo: Array<{ - [key: string]: number | string; - }> | null | undefined; + epochsInfo: + | Array<{ + [key: string]: number | string; + }> + | null + | undefined; channelInfo: Array | null | undefined; - psdPlot: { - [key: string]: string; - } | null | undefined; - topoPlot: { - [key: string]: string; - } | null | undefined; - erpPlot: { - [key: string]: string; - } | null | undefined; + psdPlot: + | { + [key: string]: string; + } + | null + | undefined; + topoPlot: + | { + [key: string]: string; + } + | null + | undefined; + erpPlot: + | { + [key: string]: string; + } + | null + | undefined; jupyterActions: Object; } interface State { activeStep: string; selectedChannel: string; - eegFilePaths: Array<{ - key: string; - text: string; - value: {name: string;dir: string;}; - } | null | undefined>; - behaviorFilePaths: Array<{ - key: string; - text: string; - value: string; - } | null | undefined>; + eegFilePaths: Array< + | { + key: string; + text: string; + value: { name: string; dir: string }; + } + | null + | undefined + >; + behaviorFilePaths: Array< + | { + key: string; + text: string; + value: string; + } + | null + | undefined + >; selectedFilePaths: Array; selectedBehaviorFilePaths: Array; selectedSubjects: Array; @@ -69,11 +113,15 @@ interface State { displayOutlierVisible: boolean; displayMode: string; helpMode: string; - dependentVariables: Array<{ - key: string; - text: string; - value: string; - } | null | undefined>; + dependentVariables: Array< + | { + key: string; + text: string; + value: string; + } + | null + | undefined + >; } // TODO: Add a channel callback from reading epochs so this screen can be aware of which channels are // available in dataset @@ -89,7 +137,10 @@ export default class Analyze extends Component { constructor(props: Props) { super(props); this.state = { - activeStep: this.props.isEEGEnabled === true ? ANALYZE_STEPS.OVERVIEW : ANALYZE_STEPS.BEHAVIOR, + activeStep: + this.props.isEEGEnabled === true + ? ANALYZE_STEPS.OVERVIEW + : ANALYZE_STEPS.BEHAVIOR, eegFilePaths: [{ key: '', text: '', value: '' }], behaviorFilePaths: [{ key: '', text: '', value: '' }], dependentVariables: [{ key: '', text: '', value: '' }], @@ -105,23 +156,34 @@ export default class Analyze extends Component { selectedFilePaths: [], selectedBehaviorFilePaths: [], selectedSubjects: [], - selectedChannel: props.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS[0] : MUSE_CHANNELS[0] + selectedChannel: + props.deviceType === DEVICES.EMOTIV + ? EMOTIV_CHANNELS[0] + : MUSE_CHANNELS[0] }; this.handleChannelSelect = this.handleChannelSelect.bind(this); this.handleDatasetChange = this.handleDatasetChange.bind(this); - this.handleBehaviorDatasetChange = this.handleBehaviorDatasetChange.bind(this); - this.handleDependentVariableChange = this.handleDependentVariableChange.bind(this); + this.handleBehaviorDatasetChange = this.handleBehaviorDatasetChange.bind( + this + ); + this.handleDependentVariableChange = this.handleDependentVariableChange.bind( + this + ); this.handleRemoveOutliers = this.handleRemoveOutliers.bind(this); this.handleDisplayModeChange = this.handleDisplayModeChange.bind(this); this.handleDataPoints = this.handleDataPoints.bind(this); this.saveSelectedDatasets = this.saveSelectedDatasets.bind(this); this.handleStepClick = this.handleStepClick.bind(this); this.handleDropdownClick = this.handleDropdownClick.bind(this); - this.toggleDisplayInfoVisibility = this.toggleDisplayInfoVisibility.bind(this); + this.toggleDisplayInfoVisibility = this.toggleDisplayInfoVisibility.bind( + this + ); } async componentDidMount() { - const workspaceCleanData = await readWorkspaceCleanedEEGData(this.props.title); + const workspaceCleanData = await readWorkspaceCleanedEEGData( + this.props.title + ); if (this.props.kernelStatus === KERNEL_STATUS.OFFLINE) { this.props.jupyterActions.launchKernel(); } @@ -159,10 +221,13 @@ export default class Analyze extends Component { } handleBehaviorDatasetChange(event: Object, data: Object) { - const { - dataToPlot, - layout - } = aggregateDataForPlot(readBehaviorData(data.value), this.state.selectedDependentVariable, this.state.removeOutliers, this.state.showDataPoints, this.state.displayMode); + const { dataToPlot, layout } = aggregateDataForPlot( + readBehaviorData(data.value), + this.state.selectedDependentVariable, + this.state.removeOutliers, + this.state.showDataPoints, + this.state.displayMode + ); this.setState({ selectedBehaviorFilePaths: data.value, selectedSubjects: getSubjectNamesFromFiles(data.value), @@ -185,10 +250,13 @@ export default class Analyze extends Component { } handleDependentVariableChange(event: Object, data: Object) { - const { - dataToPlot, - layout - } = aggregateDataForPlot(readBehaviorData(this.state.selectedBehaviorFilePaths), data.value, this.state.removeOutliers, this.state.showDataPoints, this.state.displayMode); + const { dataToPlot, layout } = aggregateDataForPlot( + readBehaviorData(this.state.selectedBehaviorFilePaths), + data.value, + this.state.removeOutliers, + this.state.showDataPoints, + this.state.displayMode + ); this.setState({ selectedDependentVariable: data.value, dataToPlot, @@ -197,10 +265,13 @@ export default class Analyze extends Component { } handleRemoveOutliers(event: Object, data: Object) { - const { - dataToPlot, - layout - } = aggregateDataForPlot(readBehaviorData(this.state.selectedBehaviorFilePaths), this.state.selectedDependentVariable, !this.state.removeOutliers, this.state.showDataPoints, this.state.displayMode); + const { dataToPlot, layout } = aggregateDataForPlot( + readBehaviorData(this.state.selectedBehaviorFilePaths), + this.state.selectedDependentVariable, + !this.state.removeOutliers, + this.state.showDataPoints, + this.state.displayMode + ); this.setState({ removeOutliers: !this.state.removeOutliers, dataToPlot, @@ -210,10 +281,13 @@ export default class Analyze extends Component { } handleDataPoints(event: Object, data: Object) { - const { - dataToPlot, - layout - } = aggregateDataForPlot(readBehaviorData(this.state.selectedBehaviorFilePaths), this.state.selectedDependentVariable, this.state.removeOutliers, !this.state.showDataPoints, this.state.displayMode); + const { dataToPlot, layout } = aggregateDataForPlot( + readBehaviorData(this.state.selectedBehaviorFilePaths), + this.state.selectedDependentVariable, + this.state.removeOutliers, + !this.state.showDataPoints, + this.state.displayMode + ); this.setState({ showDataPoints: !this.state.showDataPoints, dataToPlot, @@ -222,11 +296,17 @@ export default class Analyze extends Component { } handleDisplayModeChange(displayMode) { - if (this.state.selectedBehaviorFilePaths && this.state.selectedBehaviorFilePaths.length > 0) { - const { - dataToPlot, - layout - } = aggregateDataForPlot(readBehaviorData(this.state.selectedBehaviorFilePaths), this.state.selectedDependentVariable, this.state.removeOutliers, this.state.showDataPoints, displayMode); + if ( + this.state.selectedBehaviorFilePaths && + this.state.selectedBehaviorFilePaths.length > 0 + ) { + const { dataToPlot, layout } = aggregateDataForPlot( + readBehaviorData(this.state.selectedBehaviorFilePaths), + this.state.selectedDependentVariable, + this.state.removeOutliers, + this.state.showDataPoints, + displayMode + ); this.setState({ dataToPlot, layout, @@ -244,7 +324,10 @@ export default class Analyze extends Component { saveSelectedDatasets() { const data = readBehaviorData(this.state.selectedBehaviorFilePaths); - const aggregatedData = aggregateBehaviorDataToSave(data, this.state.removeOutliers); + const aggregatedData = aggregateBehaviorDataToSave( + data, + this.state.removeOutliers + ); storeAggregatedBehaviorData(aggregatedData, this.props.title); } @@ -261,21 +344,37 @@ export default class Analyze extends Component { }; renderEpochLabels() { - if (!isNil(this.props.epochsInfo) && this.state.selectedFilePaths.length >= 1) { - const numberConditions = this.props.epochsInfo.filter(infoObj => infoObj.name !== 'Drop Percentage' && infoObj.name !== 'Total Epochs').length; + if ( + !isNil(this.props.epochsInfo) && + this.state.selectedFilePaths.length >= 1 + ) { + const numberConditions = this.props.epochsInfo.filter( + infoObj => + infoObj.name !== 'Drop Percentage' && infoObj.name !== 'Total Epochs' + ).length; let colors; if (numberConditions === 4) { colors = ['red', 'yellow', 'green', 'blue']; } else { colors = ['red', 'green', 'teal', 'orange']; } - return
- {this.props.epochsInfo.filter(infoObj => infoObj.name !== 'Drop Percentage' && infoObj.name !== 'Total Epochs').map((infoObj, index) => <> -
{infoObj.name}
- + return ( +
+ {this.props.epochsInfo + .filter( + infoObj => + infoObj.name !== 'Drop Percentage' && + infoObj.name !== 'Total Epochs' + ) + .map((infoObj, index) => ( + <> +
{infoObj.name}
+ {infoObj.value} - )} -
; + + ))} +
+ ); } return
; } @@ -283,153 +382,269 @@ export default class Analyze extends Component { renderHelpContent() { switch (this.state.helpMode) { case 'datapoints': - return this.renderHelp('Data Points', `In this graph, each dot refers to one data point, clustered by group (e.g., conditions). + return this.renderHelp( + 'Data Points', + `In this graph, each dot refers to one data point, clustered by group (e.g., conditions). It’s the most “neutral” way of presenting the data, of course, but it may be difficult to see any patterns. - Why is it always a good idea to look at all your datapoints before interpreting any trends in the data?`); + Why is it always a good idea to look at all your datapoints before interpreting any trends in the data?` + ); case 'errorbars': - return this.renderHelp('Bar Graph', `Bar graphs are the most common way to summarize data. + return this.renderHelp( + 'Bar Graph', + `Bar graphs are the most common way to summarize data. It allows you to compare mean values between groups of datapoints (e.g., conditions), and the error bars give some indication of the variance (here: the standard error of the mean). Importantly, this way of summarizing data assumes that the mean is in fact representative of the data. Many researchers have veered away from bar graphs because they can be deceptive, especially without error bars. - Can you think of any such cases?`); + Can you think of any such cases?` + ); case 'whiskers': - return this.renderHelp('Box Plot', `Box plots summarize the data in a more informative way: + return this.renderHelp( + 'Box Plot', + `Box plots summarize the data in a more informative way: they actually tell you something about the distribution of datapoints within a group, by taking the median as its reference point instead of the mean (the median is the “middle” point in a dataset after sorting it from the lowest to the highest value). The boxes represent so-called “quartiles” which are cut off at the value right between the median and the smallest value or highest value in the dataset. The lines (“whiskers”) show how much variability there is in the data outside of those quartiles; any outliers are shown as individual points. Can you go through each plot and describe exactly what you see? - When you toggle between this view and the bar graph view, do the data look very different?`); - case 'outliers':default: - return this.renderHelp('Outliers', `A datapoint is tagged as an “outlier” if its value exceeds 2 standard deviations below or above the mean of all data in the group. + When you toggle between this view and the bar graph view, do the data look very different?` + ); + case 'outliers': + default: + return this.renderHelp( + 'Outliers', + `A datapoint is tagged as an “outlier” if its value exceeds 2 standard deviations below or above the mean of all data in the group. If a datapoint is unusually high or low (it “deviates”) compared to the rest of the group, it is likely a special case that doesn’t tell us anything informative about the group as a whole. Removing such outliers can help unskew the data. What might outliers mean in your dataset? - Can you think of any other cases where identifying outliers can be helpful?`); - + Can you think of any other cases where identifying outliers can be helpful?` + ); } } renderHelp(header: string, content: string) { - return <> + return ( + <> -

- +

- + - - + +

- +

- - - - + {this.renderHelpContent()} - ; - + + ); } } render() { - return

- - + return ( +
+ + {this.renderSectionContent()} -
; +
+ ); } -} \ No newline at end of file +} diff --git a/app/components/CleanComponent/CleanSidebar.tsx b/app/components/CleanComponent/CleanSidebar.tsx index d04ffae7..7763e868 100644 --- a/app/components/CleanComponent/CleanSidebar.tsx +++ b/app/components/CleanComponent/CleanSidebar.tsx @@ -1,6 +1,6 @@ -import React, { Component } from "react"; -import { Segment, Header, Menu, Icon, Button, Grid } from "semantic-ui-react"; -import styles from "../styles/collect.css"; +import React, { Component } from 'react'; +import { Segment, Header, Menu, Icon, Button, Grid } from 'semantic-ui-react'; +import styles from '../styles/collect.css'; const HELP_STEP = { MENU: 0, @@ -22,7 +22,6 @@ interface State { helpStep: HELP_STEP; } export default class CleanSidebar extends Component { - props: Props; constructor(props) { super(props); @@ -44,7 +43,10 @@ export default class CleanSidebar extends Component { } handleNext() { - if (this.state.helpStep === HELP_STEP.SIGNAL_MOVEMENT || this.state.helpStep === HELP_STEP.LEARN_ALPHA) { + if ( + this.state.helpStep === HELP_STEP.SIGNAL_MOVEMENT || + this.state.helpStep === HELP_STEP.LEARN_ALPHA + ) { this.setState({ helpStep: HELP_STEP.MENU }); } else { this.setState({ helpStep: this.state.helpStep + 1 }); @@ -56,36 +58,39 @@ export default class CleanSidebar extends Component { } renderMenu() { - return <> + return ( + <> -
+
What would you like to do?
- + Improve the signal quality of your sensors - + Learn about how the subjects movements create noise
- ; + + ); } renderHelp(header: string, content: string) { - return <> + return ( + <> -
+
{header}
{content} - + - ; + + ); } renderHelpContent() { switch (this.state.helpStep) { case HELP_STEP.SIGNAL_EXPLANATION: - return this.renderHelp('Improve the signal quality', 'In order to collect quality data, you want to make sure that all electrodes have a strong connection'); + return this.renderHelp( + 'Improve the signal quality', + 'In order to collect quality data, you want to make sure that all electrodes have a strong connection' + ); case HELP_STEP.SIGNAL_SALINE: - return this.renderHelp('Tip #1: Saturate the sensors in saline', 'Make sure the sensors are thoroughly soaked with saline solution. They should be wet to the touch'); + return this.renderHelp( + 'Tip #1: Saturate the sensors in saline', + 'Make sure the sensors are thoroughly soaked with saline solution. They should be wet to the touch' + ); case HELP_STEP.SIGNAL_CONTACT: - return this.renderHelp('Tip #2: Ensure the sensors are making firm contact', 'Re-seat the headset to make sure that all sensors contact the head with some tension. You may need to sweep hair out of the way to accomplish this'); + return this.renderHelp( + 'Tip #2: Ensure the sensors are making firm contact', + 'Re-seat the headset to make sure that all sensors contact the head with some tension. You may need to sweep hair out of the way to accomplish this' + ); case HELP_STEP.SIGNAL_MOVEMENT: - return this.renderHelp('Tip #3: Stay still', 'To reduce noise during your experiment, ensure your subject is relaxed and has both feet on the floor. Sometimes, focusing on relaxing the jaw and the tongue can improve the EEG signal'); + return this.renderHelp( + 'Tip #3: Stay still', + 'To reduce noise during your experiment, ensure your subject is relaxed and has both feet on the floor. Sometimes, focusing on relaxing the jaw and the tongue can improve the EEG signal' + ); case HELP_STEP.LEARN_BRAIN: - return this.renderHelp('Your brain produces electricity', 'Using the device that you are wearing, we can detect the electrical activity of your brain.'); + return this.renderHelp( + 'Your brain produces electricity', + 'Using the device that you are wearing, we can detect the electrical activity of your brain.' + ); case HELP_STEP.LEARN_BLINK: - return this.renderHelp('Try blinking your eyes', 'Does the signal change? Eye movements create noise in the EEG signal'); + return this.renderHelp( + 'Try blinking your eyes', + 'Does the signal change? Eye movements create noise in the EEG signal' + ); case HELP_STEP.LEARN_THOUGHTS: - return this.renderHelp('Try thinking of a cat', "Does the signal change? Although EEG can measure overall brain activity, it's not capable of reading minds"); + return this.renderHelp( + 'Try thinking of a cat', + "Does the signal change? Although EEG can measure overall brain activity, it's not capable of reading minds" + ); case HELP_STEP.LEARN_ALPHA: - return this.renderHelp('Try closing your eyes for 10 seconds', 'You may notice a change in your signal due to an increase in alpha waves'); - case HELP_STEP.MENU:default: + return this.renderHelp( + 'Try closing your eyes for 10 seconds', + 'You may notice a change in your signal due to an increase in alpha waves' + ); + case HELP_STEP.MENU: + default: return this.renderMenu(); - } } render() { - return - - ; + + ); } } render() { - return - + return ( + + - - + + -
+
Clean
- -
Select & Clean
+ +
Select & Clean

- Ready to clean some data? Select a subject and one or more EEG recordings, then - launch the editor + Ready to clean some data? Select a subject and one or more + EEG recordings, then launch the editor

-
Select Subject
- -
Select Recordings
- this.state.selectedSubject === filepath.value.split(path.sep)[filepath.value.split(path.sep).length - 3])} onChange={this.handleRecordingChange} /> +
Select Subject
+ +
Select Recordings
+ + this.state.selectedSubject === + filepath.value.split(path.sep)[ + filepath.value.split(path.sep).length - 3 + ] + )} + onChange={this.handleRecordingChange} + />
- ; + + ); } -} \ No newline at end of file +} diff --git a/app/components/CollectComponent/ConnectModal.tsx b/app/components/CollectComponent/ConnectModal.tsx index e127616b..00a574a1 100644 --- a/app/components/CollectComponent/ConnectModal.tsx +++ b/app/components/CollectComponent/ConnectModal.tsx @@ -1,8 +1,13 @@ -import React, { Component } from "react"; -import { isNil, debounce } from "lodash"; -import { Modal, Button, Segment, List, Grid, Divider } from "semantic-ui-react"; -import { DEVICES, DEVICE_AVAILABILITY, CONNECTION_STATUS, SCREENS } from "../../constants/constants"; -import styles from "../styles/collect.css"; +import React, { Component } from 'react'; +import { isNil, debounce } from 'lodash'; +import { Modal, Button, Segment, List, Grid, Divider } from 'semantic-ui-react'; +import { + DEVICES, + DEVICE_AVAILABILITY, + CONNECTION_STATUS, + SCREENS +} from '../../constants/constants'; +import styles from '../styles/collect.css'; interface Props { history: Object; @@ -57,17 +62,25 @@ export default class ConnectModal extends Component { } componentWillUpdate(nextProps: Props) { - if (nextProps.deviceAvailability === DEVICE_AVAILABILITY.NONE && this.props.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING) { + if ( + nextProps.deviceAvailability === DEVICE_AVAILABILITY.NONE && + this.props.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING + ) { this.setState({ instructionProgress: 1 }); } - if (nextProps.deviceAvailability === DEVICE_AVAILABILITY.AVAILABLE && this.props.deviceAvailability === DEVICE_AVAILABILITY.NONE) { + if ( + nextProps.deviceAvailability === DEVICE_AVAILABILITY.AVAILABLE && + this.props.deviceAvailability === DEVICE_AVAILABILITY.NONE + ) { this.setState({ instructionProgress: 0 }); } } handleSearch() { this.setState({ instructionProgress: 0 }); - this.props.deviceActions.setDeviceAvailability(DEVICE_AVAILABILITY.SEARCHING); + this.props.deviceActions.setDeviceAvailability( + DEVICE_AVAILABILITY.SEARCHING + ); } handleConnect() { @@ -81,116 +94,209 @@ export default class ConnectModal extends Component { } renderAvailableDeviceList() { - return + return ( + - {this.props.availableDevices.map(device => - this.setState({ selectedDevice: device })} /> + {this.props.availableDevices.map(device => ( + + this.setState({ selectedDevice: device })} + /> {ConnectModal.getDeviceName(device)} - )} + + ))} - ; + + ); } renderContent() { if (this.props.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING) { - return <> + return ( + <> Searching for available headset(s)... - ; + + ); } if (this.props.connectionStatus === CONNECTION_STATUS.CONNECTING) { - return <> + return ( + <> - Connecting to {ConnectModal.getDeviceName(this.state.selectedDevice)} + Connecting to{' '} + {ConnectModal.getDeviceName(this.state.selectedDevice)} ... - ; + + ); } if (this.state.instructionProgress === INSTRUCTION_PROGRESS.TURN_ON) { - return <> - Turn your headset on + return ( + <> + + Turn your headset on + Make sure your headset is on and fully charged.

- If the headset needs charging, set the power switch to off and plug in the headset.{' '} - Do not charge the headset while wearing it + If the headset needs charging, set the power switch to off and plug + in the headset. Do not charge the headset while wearing it - + - {this.state.step !== 0 && } + + )} - - ; + + ); } - if (this.state.instructionProgress === INSTRUCTION_PROGRESS.COMPUTER_CONNECTABILITY) { - return <> - Insert the USB Receiver + if ( + this.state.instructionProgress === + INSTRUCTION_PROGRESS.COMPUTER_CONNECTABILITY + ) { + return ( + <> + + Insert the USB Receiver + - Insert the USB receiver into a USB port on your computer. Ensure that the LED on the - receiver is continously lit or flickering rapidly. If it is blinking slowly or not - illuminated, remove and reinsert the receiver + Insert the USB receiver into a USB port on your computer. Ensure + that the LED on the receiver is continously lit or flickering + rapidly. If it is blinking slowly or not illuminated, remove and + reinsert the receiver - + - - - ; + + ); } if (this.props.deviceAvailability === DEVICE_AVAILABILITY.AVAILABLE) { - return <> - Headset(s) found - Please select which headset you would like to connect. + return ( + <> + + Headset(s) found + + + Please select which headset you would like to connect. + {this.renderAvailableDeviceList()}

- -
{this.props.title}
-
-
; + + ); } - return
- { - this.props.experimentActions.stop({ data: csv }); - } - }} /> -
; + return ( +
+ { + this.props.experimentActions.stop({ data: csv }); + } + }} + /> +
+ ); } render() { - return
- + return ( +
+ {this.renderExperiment()} - this.setState({ isInputCollectOpen: false })} header='Enter Data' data={{ - subject: this.props.subject, - group: this.props.group, - session: this.props.session - }} /> -
; + this.setState({ isInputCollectOpen: false })} + header="Enter Data" + data={{ + subject: this.props.subject, + group: this.props.group, + session: this.props.session + }} + /> +
+ ); } -} \ No newline at end of file +} diff --git a/app/components/CollectComponent/index.tsx b/app/components/CollectComponent/index.tsx index 9265d9e0..8aedf872 100644 --- a/app/components/CollectComponent/index.tsx +++ b/app/components/CollectComponent/index.tsx @@ -1,11 +1,19 @@ - -import React, { Component } from "react"; -import { isNil } from "lodash"; -import { EXPERIMENTS, DEVICES, CONNECTION_STATUS, DEVICE_AVAILABILITY } from "../../constants/constants"; -import { MainTimeline, Trial, ExperimentParameters } from "../../constants/interfaces"; -import PreTestComponent from "./PreTestComponent"; -import ConnectModal from "./ConnectModal"; -import RunComponent from "./RunComponent"; +import React, { Component } from 'react'; +import { isNil } from 'lodash'; +import { + EXPERIMENTS, + DEVICES, + CONNECTION_STATUS, + DEVICE_AVAILABILITY +} from '../../constants/constants'; +import { + MainTimeline, + Trial, + ExperimentParameters +} from '../../constants/interfaces'; +import PreTestComponent from './PreTestComponent'; +import ConnectModal from './ConnectModal'; +import RunComponent from './RunComponent'; interface Props { history: Object; @@ -21,9 +29,12 @@ interface Props { isRunning: boolean; params: ExperimentParameters | null | undefined; mainTimeline: MainTimeline | null | undefined; - trials: { - [key: string]: Trial; - } | null | undefined; + trials: + | { + [key: string]: Trial; + } + | null + | undefined; timelines: {} | null | undefined; subject: string; group: string; @@ -37,7 +48,6 @@ interface State { } export default class Collect extends Component { - // handleConnectModalClose: () => void; // handleRunComponentOpen: () => void; // handleRunComponentClose: () => void; @@ -57,20 +67,28 @@ export default class Collect extends Component { } componentDidMount() { - if (this.props.connectionStatus !== CONNECTION_STATUS.CONNECTED && this.props.isEEGEnabled) { + if ( + this.props.connectionStatus !== CONNECTION_STATUS.CONNECTED && + this.props.isEEGEnabled + ) { this.handleStartConnect(); } } componentDidUpdate = (prevProps: Props, prevState: State) => { - if (this.props.connectionStatus === CONNECTION_STATUS.CONNECTED && prevState.isConnectModalOpen) { + if ( + this.props.connectionStatus === CONNECTION_STATUS.CONNECTED && + prevState.isConnectModalOpen + ) { this.setState({ isConnectModalOpen: false }); } }; handleStartConnect() { this.setState({ isConnectModalOpen: true }); - this.props.deviceActions.setDeviceAvailability(DEVICE_AVAILABILITY.SEARCHING); + this.props.deviceActions.setDeviceAvailability( + DEVICE_AVAILABILITY.SEARCHING + ); } handleConnectModalClose() { @@ -87,11 +105,50 @@ export default class Collect extends Component { render() { if (this.state.isRunComponentOpen) { - return ; + return ( + + ); } - return <> - - - ; + return ( + <> + + + + ); } -} \ No newline at end of file +} diff --git a/app/components/DesignComponent/CustomDesignComponent.tsx b/app/components/DesignComponent/CustomDesignComponent.tsx index d687b39d..b20692b9 100644 --- a/app/components/DesignComponent/CustomDesignComponent.tsx +++ b/app/components/DesignComponent/CustomDesignComponent.tsx @@ -1,21 +1,34 @@ - -import React, { Component } from "react"; -import { Grid, Button, Segment, Header, Form, Checkbox, Image, Table } from "semantic-ui-react"; -import { isNil } from "lodash"; -import styles from "../styles/common.css"; -import { EXPERIMENTS, SCREENS } from "../../constants/constants"; -import { MainTimeline, Trial, ExperimentParameters, ExperimentDescription } from "../../constants/interfaces"; -import SecondaryNavComponent from "../SecondaryNavComponent"; -import PreviewExperimentComponent from "../PreviewExperimentComponent"; -import StimuliDesignColumn from "./StimuliDesignColumn"; -import ParamSlider from "./ParamSlider"; -import PreviewButton from "../PreviewButtonComponent"; -import researchQuestionImage from "../../assets/common/ResearchQuestion2.png"; -import methodsImage from "../../assets/common/Methods2.png"; -import hypothesisImage from "../../assets/common/Hypothesis2.png"; -import { loadProtocol } from "../../utils/labjs/functions"; -import { readImages } from "../../utils/filesystem/storage"; -import StimuliRow from "./StimuliRow"; +import React, { Component } from 'react'; +import { + Grid, + Button, + Segment, + Header, + Form, + Checkbox, + Image, + Table +} from 'semantic-ui-react'; +import { isNil } from 'lodash'; +import styles from '../styles/common.css'; +import { EXPERIMENTS, SCREENS } from '../../constants/constants'; +import { + MainTimeline, + Trial, + ExperimentParameters, + ExperimentDescription +} from '../../constants/interfaces'; +import SecondaryNavComponent from '../SecondaryNavComponent'; +import PreviewExperimentComponent from '../PreviewExperimentComponent'; +import StimuliDesignColumn from './StimuliDesignColumn'; +import ParamSlider from './ParamSlider'; +import PreviewButton from '../PreviewButtonComponent'; +import researchQuestionImage from '../../assets/common/ResearchQuestion2.png'; +import methodsImage from '../../assets/common/Methods2.png'; +import hypothesisImage from '../../assets/common/Hypothesis2.png'; +import { loadProtocol } from '../../utils/labjs/functions'; +import { readImages } from '../../utils/filesystem/storage'; +import StimuliRow from './StimuliRow'; const CUSTOM_STEPS = { OVERVIEW: 'OVERVIEW', @@ -84,7 +97,8 @@ export default class CustomDesign extends Component { this.endPreview = this.endPreview.bind(this); } - endPreview() {// this.setState({ isPreviewing: false }); + endPreview() { + // this.setState({ isPreviewing: false }); } handleStepClick(step: string) { @@ -119,62 +133,123 @@ export default class CustomDesign extends Component { } renderSectionContent() { - const stimi = [{ name: 'stimulus1', number: 1 }, { name: 'stimulus2', number: 2 }, { name: 'stimulus3', number: 3 }, { name: 'stimulus4', number: 4 }]; + const stimi = [ + { name: 'stimulus1', number: 1 }, + { name: 'stimulus2', number: 2 }, + { name: 'stimulus3', number: 3 }, + { name: 'stimulus4', number: 4 } + ]; switch (this.state.activeStep) { - case CUSTOM_STEPS.OVERVIEW:default: - return - - + case CUSTOM_STEPS.OVERVIEW: + default: + return ( + + +
- this.setState({ - description: { - ...this.state.description, - question: data.value - }, - saved: false - })} /> + + this.setState({ + description: { + ...this.state.description, + question: data.value + }, + saved: false + }) + } + />
- - + +
- this.setState({ - description: { - ...this.state.description, - hypothesis: data.value - }, - saved: false - })} /> + + this.setState({ + description: { + ...this.state.description, + hypothesis: data.value + }, + saved: false + }) + } + />
- - + +
- this.setState({ - description: { - ...this.state.description, - methods: data.value - }, - saved: false - })} /> + + this.setState({ + description: { + ...this.state.description, + methods: data.value + }, + saved: false + }) + } + />
-
; +
+ ); case CUSTOM_STEPS.CONDITIONS: - return + return ( + -
Conditions
+
Conditions

- Select the folder with images for each condition and choose the correct response. - You can upload image files with the following extensions: ".png", ".jpg", ".jpeg". - Make sure when you preview your experiment that the resolution is high enough. You - can resize or compress your images in an image editing program or on one of the - websites online. + Select the folder with images for each condition and choose the + correct response. You can upload image files with the following + extensions: ".png", ".jpg", ".jpeg". Make sure when you preview + your experiment that the resolution is high enough. You can + resize or compress your images in an image editing program or on + one of the websites online.

- +
@@ -186,86 +261,136 @@ export default class CustomDesign extends Component { - {stimi.map(({ - name, - number - }) => trial.type === number).length} onChange={async (key, data, changedName) => { - await this.setState({ - params: { - ...this.state.params, - [changedName]: { ...this.state.params[changedName], [key]: data } - } - }); - let newStimuli = []; - await stimi.map(stimul => { - let dirStimuli = []; - const dir = this.state.params[stimul.name].dir; - if (dir && typeof dir !== 'undefined' && dir !== '') { - dirStimuli = readImages(dir).map(i => ({ - dir: dir, - filename: i, - name: i, - condition: this.state.params[stimul.name].title, - response: this.state.params[stimul.name].response, - phase: 'main', - type: stimul.number - })); - } - if (dirStimuli.length) dirStimuli[0].phase = 'practice'; - newStimuli = newStimuli.concat(...dirStimuli); - }); - this.setState({ - params: { - ...this.state.params, - stimuli: [...newStimuli], - nbTrials: newStimuli.filter(t => t.phase === 'main').length, - nbPracticeTrials: newStimuli.filter(t => t.phase === 'practice').length - }, - saved: false - }); - }} />)} + {stimi.map(({ name, number }) => ( + trial.type === number + ).length + } + onChange={async (key, data, changedName) => { + await this.setState({ + params: { + ...this.state.params, + [changedName]: { + ...this.state.params[changedName], + [key]: data + } + } + }); + let newStimuli = []; + await stimi.map(stimul => { + let dirStimuli = []; + const dir = this.state.params[stimul.name].dir; + if (dir && typeof dir !== 'undefined' && dir !== '') { + dirStimuli = readImages(dir).map(i => ({ + dir: dir, + filename: i, + name: i, + condition: this.state.params[stimul.name].title, + response: this.state.params[stimul.name].response, + phase: 'main', + type: stimul.number + })); + } + if (dirStimuli.length) dirStimuli[0].phase = 'practice'; + newStimuli = newStimuli.concat(...dirStimuli); + }); + this.setState({ + params: { + ...this.state.params, + stimuli: [...newStimuli], + nbTrials: newStimuli.filter(t => t.phase === 'main') + .length, + nbPracticeTrials: newStimuli.filter( + t => t.phase === 'practice' + ).length + }, + saved: false + }); + }} + /> + ))}
-
; +
+ ); case CUSTOM_STEPS.TRIALS: - return + return ( +
-
Trials
+
Trials

Edit the correct key response and type of each trial.

- this.setState({ - params: { - ...this.state.params, - randomize: data.value - }, - saved: false - })} placeholder='Response' options={[{ key: 'random', text: 'Random', value: 'random' }, { key: 'sequential', text: 'Sequential', value: 'sequential' }]} /> - this.setState({ - params: { - ...this.state.params, - nbTrials: parseInt(data.value) - }, - saved: false - })} /> - this.setState({ - params: { - ...this.state.params, - nbPracticeTrials: parseInt(data.value) - }, - saved: false - })} /> + + this.setState({ + params: { + ...this.state.params, + randomize: data.value + }, + saved: false + }) + } + placeholder="Response" + options={[ + { key: 'random', text: 'Random', value: 'random' }, + { + key: 'sequential', + text: 'Sequential', + value: 'sequential' + } + ]} + /> + + this.setState({ + params: { + ...this.state.params, + nbTrials: parseInt(data.value) + }, + saved: false + }) + } + /> + + this.setState({ + params: { + ...this.state.params, + nbPracticeTrials: parseInt(data.value) + }, + saved: false + }) + } + />
- +
@@ -277,156 +402,288 @@ export default class CustomDesign extends Component { - {this.state.params.stimuli && this.state.params.stimuli.map((e, num) => this.state.params[`stimulus${n}`].title)} {...e} onDelete={num => { - const stimuli = this.state.params.stimuli; - stimuli.splice(num, 1); - const nbPracticeTrials = stimuli.filter(s => s.phase === 'practice').length; - const nbTrials = stimuli.filter(s => s.phase === 'main').length; - this.setState({ - params: { - ...this.state.params, - stimuli: [...stimuli], - nbPracticeTrials, - nbTrials - }, - saved: false - }); - }} onChange={(num, key, data) => { - const stimuli = this.state.params.stimuli; - stimuli[num][key] = data; - let nbPracticeTrials = this.state.params.nbPracticeTrials; - let nbTrials = this.state.params.nbTrials; - if (key === 'phase') { - nbPracticeTrials = stimuli.filter(s => s.phase === 'practice').length; - nbTrials = stimuli.filter(s => s.phase === 'main').length; - } - this.setState({ - params: { - ...this.state.params, - stimuli: [...stimuli], - nbPracticeTrials, - nbTrials - }, - saved: false - }); - }} />)} + {this.state.params.stimuli && + this.state.params.stimuli.map((e, num) => ( + this.state.params[`stimulus${n}`].title + )} + {...e} + onDelete={num => { + const stimuli = this.state.params.stimuli; + stimuli.splice(num, 1); + const nbPracticeTrials = stimuli.filter( + s => s.phase === 'practice' + ).length; + const nbTrials = stimuli.filter(s => s.phase === 'main') + .length; + this.setState({ + params: { + ...this.state.params, + stimuli: [...stimuli], + nbPracticeTrials, + nbTrials + }, + saved: false + }); + }} + onChange={(num, key, data) => { + const stimuli = this.state.params.stimuli; + stimuli[num][key] = data; + let nbPracticeTrials = this.state.params + .nbPracticeTrials; + let nbTrials = this.state.params.nbTrials; + if (key === 'phase') { + nbPracticeTrials = stimuli.filter( + s => s.phase === 'practice' + ).length; + nbTrials = stimuli.filter(s => s.phase === 'main') + .length; + } + this.setState({ + params: { + ...this.state.params, + stimuli: [...stimuli], + nbPracticeTrials, + nbTrials + }, + saved: false + }); + }} + /> + ))}
-
; +
+ ); case CUSTOM_STEPS.PARAMETERS: - return - + return ( + + -
Inter-trial interval
+
Inter-trial interval

- Select the inter-trial interval duration. This is the amount of time between - trials measured from the end of one trial to the start of the next one. + Select the inter-trial interval duration. This is the amount + of time between trials measured from the end of one trial to + the start of the next one.

- this.setState({ - params: { ...this.state.params, iti: value }, - saved: false - })} /> + + this.setState({ + params: { ...this.state.params, iti: value }, + saved: false + }) + } + />
- + -
Image duration
+
Image duration

- Select the time of presentation or make it self-paced - present the image until - participants respond. + Select the time of presentation or make it self-paced - + present the image until participants respond.

- this.setState({ - params: { ...this.state.params, selfPaced: !this.state.params.selfPaced }, - saved: false - })} /> + + this.setState({ + params: { + ...this.state.params, + selfPaced: !this.state.params.selfPaced + }, + saved: false + }) + } + /> - {!this.state.params.selfPaced ? - this.setState({ - params: { ...this.state.params, presentationTime: value }, - saved: false - })} /> - : } + {!this.state.params.selfPaced ? ( + + + this.setState({ + params: { + ...this.state.params, + presentationTime: value + }, + saved: false + }) + } + /> + + ) : ( + + )}
-
; +
+ ); case CUSTOM_STEPS.INSTRUCTIONS: - return - + return ( + + -
Experiment Instructions
-

Edit the instruction that will be displayed on the first screen.

+
Experiment Instructions
+

+ Edit the instruction that will be displayed on the first + screen. +

- this.setState({ - params: { ...this.state.params, intro: data.value }, - saved: false - })} /> + + this.setState({ + params: { ...this.state.params, intro: data.value }, + saved: false + }) + } + />
- + -
Instructions for the task screen
-

Edit the instruction that will be displayed in the footer during the task.

+
Instructions for the task screen
+

+ Edit the instruction that will be displayed in the footer + during the task. +

- this.setState({ - params: { ...this.state.params, taskHelp: data.value }, - saved: false - })} /> + + this.setState({ + params: { ...this.state.params, taskHelp: data.value }, + saved: false + }) + } + />
-
; +
+ ); case CUSTOM_STEPS.PREVIEW: - return - - + return ( + + + - + - this.handlePreview(e)} /> + this.handlePreview(e)} + /> - ; - + + ); } } render() { - return
- this.handleEEGEnabled(event, data)} className={styles.EEGToggle} />} saveButton={} /> + + } + /> {this.renderSectionContent()} -
; + + ); } -} \ No newline at end of file +} diff --git a/app/components/DesignComponent/ParamSlider.tsx b/app/components/DesignComponent/ParamSlider.tsx index d4e1b91c..6cf5a1b5 100644 --- a/app/components/DesignComponent/ParamSlider.tsx +++ b/app/components/DesignComponent/ParamSlider.tsx @@ -1,7 +1,7 @@ -import { Segment } from "semantic-ui-react"; -import React, { PureComponent } from "react"; -import Slider from "rc-slider"; -import styles from "../styles/common.css"; +import { Segment } from 'semantic-ui-react'; +import React, { PureComponent } from 'react'; +import Slider from 'rc-slider'; +import styles from '../styles/common.css'; interface Props { value: number; @@ -10,17 +10,30 @@ interface Props { } export default class ParamSlider extends PureComponent { - render() { - const { - marks, - ms_conversion - } = this.props; - return
+ const { marks, ms_conversion } = this.props; + return ( +

{this.props.label}

- {this.props.label !== 'Practice trials' || Object.keys(marks).length > 1 ? this.props.onChange(value * parseInt(ms_conversion, 10))} defaultValue={1} /> :
You have not chosen any practice trials.
} + {this.props.label !== 'Practice trials' || + Object.keys(marks).length > 1 ? ( + + this.props.onChange(value * parseInt(ms_conversion, 10)) + } + defaultValue={1} + /> + ) : ( +
You have not chosen any practice trials.
+ )}
-
; +
+ ); } -} \ No newline at end of file +} diff --git a/app/components/DesignComponent/StimuliDesignColumn.tsx b/app/components/DesignComponent/StimuliDesignColumn.tsx index 88b7534b..d88ac60d 100644 --- a/app/components/DesignComponent/StimuliDesignColumn.tsx +++ b/app/components/DesignComponent/StimuliDesignColumn.tsx @@ -1,13 +1,13 @@ /* Breaking this component on its own is done mainly to increase performance. Text input is slow otherwise */ -import React, { Component } from "react"; -import { Form, Button, Table, Icon } from "semantic-ui-react"; -import { toast } from "react-toastify"; -import { readImages } from "../../utils/filesystem/storage"; -import { loadFromSystemDialog } from "../../utils/filesystem/select"; -import { FILE_TYPES } from "../../constants/constants"; -import * as path from "path"; -import styles from "../styles/common.css"; +import React, { Component } from 'react'; +import { Form, Button, Table, Icon } from 'semantic-ui-react'; +import { toast } from 'react-toastify'; +import { readImages } from '../../utils/filesystem/storage'; +import { loadFromSystemDialog } from '../../utils/filesystem/select'; +import { FILE_TYPES } from '../../constants/constants'; +import * as path from 'path'; +import styles from '../styles/common.css'; interface Props { num: number; @@ -24,7 +24,6 @@ const RESPONSE_OPTIONS = new Array(10).fill(0).map((_, i) => ({ })); export default class StimuliDesignColumn extends Component { - constructor(props: Props) { super(props); this.handleSelectFolder = this.handleSelectFolder.bind(this); @@ -35,7 +34,11 @@ export default class StimuliDesignColumn extends Component { } shouldComponentUpdate(nextProps) { - if (nextProps.title !== this.props.title || nextProps.response !== this.props.response || nextProps.dir !== this.props.dir) { + if ( + nextProps.title !== this.props.title || + nextProps.response !== this.props.response || + nextProps.dir !== this.props.dir + ) { return true; } return false; @@ -63,32 +66,67 @@ export default class StimuliDesignColumn extends Component { } render() { - return + return ( + {this.props.num}
- this.props.onChange('title', data.value, `stimulus${this.props.num}`)} placeholder='Enter condition name' /> + + this.props.onChange( + 'title', + data.value, + `stimulus${this.props.num}` + ) + } + placeholder="Enter condition name" + />
- this.props.onChange('response', data.value, `stimulus${this.props.num}`)} placeholder='Select' options={RESPONSE_OPTIONS} /> + + this.props.onChange( + 'response', + data.value, + `stimulus${this.props.num}` + ) + } + placeholder="Select" + options={RESPONSE_OPTIONS} + /> - {this.props.dir ?
+ {this.props.dir ? ( +
Folder{' '} - {this.props.dir && this.props.dir.split(path.sep).slice(-1).join(' / ')} + {this.props.dir && + this.props.dir + .split(path.sep) + .slice(-1) + .join(' / ')} +
+
+ ( {this.state.numberImages || this.props.numberImages} images ){' '}
-
( {this.state.numberImages || this.props.numberImages} images )
- +
-
:
+ ) : ( + } + + )}
-
; +
+ ); } -} \ No newline at end of file +} diff --git a/app/components/DesignComponent/StimuliRow.tsx b/app/components/DesignComponent/StimuliRow.tsx index 2e3e333f..81eaeb24 100644 --- a/app/components/DesignComponent/StimuliRow.tsx +++ b/app/components/DesignComponent/StimuliRow.tsx @@ -1,8 +1,8 @@ /* Breaking this component on its own is done mainly to increase performance. Text input is slow otherwise */ -import React, { Component } from "react"; -import { Segment, Form, Button, Table, Dropdown } from "semantic-ui-react"; -import styles from "../styles/common.css"; +import React, { Component } from 'react'; +import { Segment, Form, Button, Table, Dropdown } from 'semantic-ui-react'; +import styles from '../styles/common.css'; interface Props { num: number; @@ -19,9 +19,9 @@ const RESPONSE_OPTIONS = new Array(10).fill(0).map((_, i) => ({ })); export default class StimuliRow extends Component { - render() { - return + return ( +
{this.props.num + 1}.
{this.props.name}
@@ -32,33 +32,67 @@ export default class StimuliRow extends Component {
- this.props.onChange(this.props.num, 'response', data.value)} placeholder='Response' options={RESPONSE_OPTIONS} /> + + this.props.onChange(this.props.num, 'response', data.value) + } + placeholder="Response" + options={RESPONSE_OPTIONS} + /> -
+
{this.props.phase === 'main' ? 'Experimental' : 'Practice'}
- + - this.props.onChange(this.props.num, 'phase', 'main')}> + + this.props.onChange(this.props.num, 'phase', 'main') + } + >
Experimental
- this.props.onChange(this.props.num, 'phase', 'practice')}> + + this.props.onChange(this.props.num, 'phase', 'practice') + } + >
Practice
- - ; + + ); } } @@ -74,4 +108,4 @@ export default class StimuliRow extends Component { // options={[{key: 'main', text: 'Experimental', value: 'main'}, // {key: 'practice', text: 'Practice', value: 'practice'}]} // className={styles.trialsTrialTypeRowSelector} -// /> \ No newline at end of file +// /> diff --git a/app/components/DesignComponent/index.tsx b/app/components/DesignComponent/index.tsx index 37ed5773..83024afc 100644 --- a/app/components/DesignComponent/index.tsx +++ b/app/components/DesignComponent/index.tsx @@ -1,37 +1,48 @@ - -import React, { Component } from "react"; -import { Grid, Button, Segment, Header, Image, Checkbox } from "semantic-ui-react"; -import { isNil } from "lodash"; -import styles from "../styles/common.css"; -import { EXPERIMENTS, SCREENS } from "../../constants/constants"; -import { readWorkspaces } from "../../utils/filesystem/storage"; -import { MainTimeline, Trial, ExperimentParameters, ExperimentDescription } from "../../constants/interfaces"; -import SecondaryNavComponent from "../SecondaryNavComponent"; -import PreviewExperimentComponent from "../PreviewExperimentComponent"; -import CustomDesign from "./CustomDesignComponent"; -import PreviewButton from "../PreviewButtonComponent"; - -import facesHousesOverview from "../../assets/common/FacesHouses.png"; -import stroopOverview from "../../assets/common/Stroop.png"; -import multitaskingOverview from "../../assets/common/Multitasking.png"; -import searchOverview from "../../assets/common/VisualSearch.png"; -import customOverview from "../../assets/common/Custom.png"; +import React, { Component } from 'react'; +import { + Grid, + Button, + Segment, + Header, + Image, + Checkbox +} from 'semantic-ui-react'; +import { isNil } from 'lodash'; +import styles from '../styles/common.css'; +import { EXPERIMENTS, SCREENS } from '../../constants/constants'; +import { readWorkspaces } from '../../utils/filesystem/storage'; +import { + MainTimeline, + Trial, + ExperimentParameters, + ExperimentDescription +} from '../../constants/interfaces'; +import SecondaryNavComponent from '../SecondaryNavComponent'; +import PreviewExperimentComponent from '../PreviewExperimentComponent'; +import CustomDesign from './CustomDesignComponent'; +import PreviewButton from '../PreviewButtonComponent'; + +import facesHousesOverview from '../../assets/common/FacesHouses.png'; +import stroopOverview from '../../assets/common/Stroop.png'; +import multitaskingOverview from '../../assets/common/Multitasking.png'; +import searchOverview from '../../assets/common/VisualSearch.png'; +import customOverview from '../../assets/common/Custom.png'; // conditions images -import multiConditionShape from "../../assets/multi/multiConditionShape.png"; -import multiConditionDots from "../../assets/multi/multiConditionDots.png"; -import conditionFace from "../../assets/face_house/faces/Face1.jpg"; -import conditionHouse from "../../assets/face_house/houses/House1.jpg"; -import conditionOrangeT from "../../assets/search/conditionOrangeT.png"; -import conditionNoOrangeT from "../../assets/search/conditionNoOrangeT.png"; -import conditionCongruent from "../../assets/stroop/match_g.png"; -import conditionIncongruent from "../../assets/stroop/mismatch6_r.png"; +import multiConditionShape from '../../assets/multi/multiConditionShape.png'; +import multiConditionDots from '../../assets/multi/multiConditionDots.png'; +import conditionFace from '../../assets/face_house/faces/Face1.jpg'; +import conditionHouse from '../../assets/face_house/houses/House1.jpg'; +import conditionOrangeT from '../../assets/search/conditionOrangeT.png'; +import conditionNoOrangeT from '../../assets/search/conditionNoOrangeT.png'; +import conditionCongruent from '../../assets/stroop/match_g.png'; +import conditionIncongruent from '../../assets/stroop/mismatch6_r.png'; -import { loadProtocol } from "../../utils/labjs/functions"; -import { toast } from "react-toastify"; -import InputModal from "../InputModal"; +import { loadProtocol } from '../../utils/labjs/functions'; +import { toast } from 'react-toastify'; +import InputModal from '../InputModal'; -import { shell } from "electron"; +import { shell } from 'electron'; const DESIGN_STEPS = { OVERVIEW: 'OVERVIEW', @@ -80,7 +91,9 @@ export default class Design extends Component { this.handleStepClick = this.handleStepClick.bind(this); this.handleStartExperiment = this.handleStartExperiment.bind(this); this.handleCustomizeExperiment = this.handleCustomizeExperiment.bind(this); - this.handleLoadCustomExperiment = this.handleLoadCustomExperiment.bind(this); + this.handleLoadCustomExperiment = this.handleLoadCustomExperiment.bind( + this + ); this.handlePreview = this.handlePreview.bind(this); this.endPreview = this.endPreview.bind(this); this.handleEEGEnabled = this.handleEEGEnabled.bind(this); @@ -164,10 +177,10 @@ export default class Design extends Component { case 'multiConditionShape': return multiConditionShape; break; - case 'multiConditionDots':default: + case 'multiConditionDots': + default: return multiConditionDots; break; - } } @@ -189,17 +202,25 @@ export default class Design extends Component { return searchOverview; break; - case EXPERIMENTS.CUSTOM:default: + case EXPERIMENTS.CUSTOM: + default: return customOverview; break; - } } renderSectionContent() { switch (this.state.activeStep) { - case DESIGN_STEPS.OVERVIEW:default: - return + case DESIGN_STEPS.OVERVIEW: + default: + return ( + @@ -209,15 +230,22 @@ export default class Design extends Component { -
{this.props.overview_title}
+
{this.props.overview_title}

{this.props.overview}

-
; +
+ ); case DESIGN_STEPS.BACKGROUND: - return + return ( + @@ -246,23 +274,36 @@ export default class Design extends Component {
- {this.props.background_links.map(link => )} + + ))}
-
; +
+ ); case DESIGN_STEPS.PROTOCOL: - return + return ( + - + -
{this.props.protocol_title}
+
{this.props.protocol_title}

{this.props.protocol}

@@ -271,11 +312,17 @@ export default class Design extends Component { - + -
{this.props.protocol_condition_first_title}
+
+ {this.props.protocol_condition_first_title} +

{this.props.protocol_condition_first}

@@ -283,11 +330,17 @@ export default class Design extends Component { - + -
{this.props.protocol_condition_second_title}
+
+ {this.props.protocol_condition_second_title} +

{this.props.protocol_condition_second}

@@ -295,18 +348,35 @@ export default class Design extends Component {
-
; +
+ ); case DESIGN_STEPS.PREVIEW: - return - - + return ( + + + - - this.handlePreview(e)} /> + + this.handlePreview(e)} + /> - ; - + + ); } } @@ -314,10 +384,32 @@ export default class Design extends Component { if (this.props.type === EXPERIMENTS.CUSTOM) { return ; } - return
- this.handleEEGEnabled(event, data)} className={styles.EEGToggle} />} canEditExperiment={this.props.paradigm === 'Faces and Houses'} /> + return ( +
+ this.handleEEGEnabled(event, data)} + className={styles.EEGToggle} + /> + } + canEditExperiment={this.props.paradigm === 'Faces and Houses'} + /> {this.renderSectionContent()} - this.setState({ isNewExperimentModalOpen: false })} header='Enter a title for this experiment' /> -
; + this.setState({ isNewExperimentModalOpen: false })} + header="Enter a title for this experiment" + /> +
+ ); } -} \ No newline at end of file +} diff --git a/app/components/EEGExplorationComponent.tsx b/app/components/EEGExplorationComponent.tsx index 2d8abced..9bb6c2d2 100644 --- a/app/components/EEGExplorationComponent.tsx +++ b/app/components/EEGExplorationComponent.tsx @@ -1,12 +1,22 @@ - -import React, { Component } from "react"; -import { Grid, Button, Header, Segment, Image, Divider } from "semantic-ui-react"; -import { PLOTTING_INTERVAL, CONNECTION_STATUS, DEVICE_AVAILABILITY } from "../constants/constants"; -import eegImage from "../assets/common/EEG.png"; -import SignalQualityIndicatorComponent from "./SignalQualityIndicatorComponent"; -import ViewerComponent from "./ViewerComponent"; -import ConnectModal from "./CollectComponent/ConnectModal"; -import styles from "./styles/common.css"; +import React, { Component } from 'react'; +import { + Grid, + Button, + Header, + Segment, + Image, + Divider +} from 'semantic-ui-react'; +import { + PLOTTING_INTERVAL, + CONNECTION_STATUS, + DEVICE_AVAILABILITY +} from '../constants/constants'; +import eegImage from '../assets/common/EEG.png'; +import SignalQualityIndicatorComponent from './SignalQualityIndicatorComponent'; +import ViewerComponent from './ViewerComponent'; +import ConnectModal from './CollectComponent/ConnectModal'; +import styles from './styles/common.css'; interface Props { history: Object; @@ -24,7 +34,6 @@ interface State { } export default class Home extends Component { - // handleConnectModalClose: () => void; // handleStartConnect: () => void; constructor(props: Props) { @@ -38,14 +47,19 @@ export default class Home extends Component { } componentDidUpdate = (prevProps: Props, prevState: State) => { - if (this.props.connectionStatus === CONNECTION_STATUS.CONNECTED && prevState.isConnectModalOpen) { + if ( + this.props.connectionStatus === CONNECTION_STATUS.CONNECTED && + prevState.isConnectModalOpen + ) { this.setState({ isConnectModalOpen: false }); } }; handleStartConnect() { this.setState({ isConnectModalOpen: true }); - this.props.deviceActions.setDeviceAvailability(DEVICE_AVAILABILITY.SEARCHING); + this.props.deviceActions.setDeviceAvailability( + DEVICE_AVAILABILITY.SEARCHING + ); } handleStopConnect() { @@ -59,10 +73,21 @@ export default class Home extends Component { } render() { - return - {this.props.connectionStatus === CONNECTION_STATUS.CONNECTED && + return ( + + {this.props.connectionStatus === CONNECTION_STATUS.CONNECTED && ( + - +
@@ -70,10 +95,16 @@ export default class Home extends Component { Disconnect EEG Device
- +
-
} - {this.props.connectionStatus !== CONNECTION_STATUS.CONNECTED && + + )} + {this.props.connectionStatus !== CONNECTION_STATUS.CONNECTED && ( + @@ -82,16 +113,32 @@ export default class Home extends Component { -
Explore Raw EEG
+
Explore Raw EEG
-

Connect directly to an EEG device and view raw streaming data

+

+ Connect directly to an EEG device and view raw streaming data +

- -
} -
; + +
+ )} +
+ ); } -} \ No newline at end of file +} diff --git a/app/components/HomeComponent/OverviewComponent.tsx b/app/components/HomeComponent/OverviewComponent.tsx index b2dd8cd0..e0f81120 100644 --- a/app/components/HomeComponent/OverviewComponent.tsx +++ b/app/components/HomeComponent/OverviewComponent.tsx @@ -1,12 +1,12 @@ -import React, { Component } from "react"; -import { Grid, Header, Button, Segment } from "semantic-ui-react"; -import { isNil } from "lodash"; -import styles from "../styles/common.css"; -import { EXPERIMENTS } from "../../constants/constants"; -import SecondaryNavComponent from "../SecondaryNavComponent"; -import PreviewExperimentComponent from "../PreviewExperimentComponent"; -import PreviewButton from "../PreviewButtonComponent"; -import { loadProtocol } from "../../utils/labjs/functions"; +import React, { Component } from 'react'; +import { Grid, Header, Button, Segment } from 'semantic-ui-react'; +import { isNil } from 'lodash'; +import styles from '../styles/common.css'; +import { EXPERIMENTS } from '../../constants/constants'; +import SecondaryNavComponent from '../SecondaryNavComponent'; +import PreviewExperimentComponent from '../PreviewExperimentComponent'; +import PreviewButton from '../PreviewButtonComponent'; +import { loadProtocol } from '../../utils/labjs/functions'; const OVERVIEW_STEPS = { OVERVIEW: 'OVERVIEW', @@ -26,7 +26,6 @@ interface State { } export default class OverviewComponent extends Component { - constructor(props) { super(props); this.state = { @@ -44,7 +43,10 @@ export default class OverviewComponent extends Component { handlePreview(e) { e.target.blur(); - this.setState(prevState => ({ ...prevState, isPreviewing: !prevState.isPreviewing })); + this.setState(prevState => ({ + ...prevState, + isPreviewing: !prevState.isPreviewing + })); } endPreview() { @@ -54,50 +56,104 @@ export default class OverviewComponent extends Component { renderSectionContent() { switch (this.state.activeStep) { case OVERVIEW_STEPS.PROTOCOL: - return - - + return ( + + + - - + + {this.props.protocol} - this.handlePreview(e)} /> + this.handlePreview(e)} + /> - ; + + ); case OVERVIEW_STEPS.BACKGROUND: - return - -
{this.props.background_title}
+ return ( + + +
{this.props.background_title}
- - + + {this.props.background} -
; - case OVERVIEW_STEPS.OVERVIEW:default: - return - -
{this.props.type}
+
+ ); + case OVERVIEW_STEPS.OVERVIEW: + default: + return ( + + +
{this.props.type}
- - + + {this.props.overview} -
; - +
+ ); } } render() { - return <> - } /> -
{this.renderSectionContent()}
- ; + + } + /> +
+ {this.renderSectionContent()} +
+ + ); } -} \ No newline at end of file +} diff --git a/app/components/HomeComponent/index.tsx b/app/components/HomeComponent/index.tsx index b4072d65..93a0b5e8 100644 --- a/app/components/HomeComponent/index.tsx +++ b/app/components/HomeComponent/index.tsx @@ -1,31 +1,40 @@ -import React, { Component } from "react"; -import { isNil } from "lodash"; -import { Grid, Button, Header, Segment, Image, Table } from "semantic-ui-react"; -import { toast } from "react-toastify"; -import * as moment from "moment"; +import React, { Component } from 'react'; +import { isNil } from 'lodash'; +import { Grid, Button, Header, Segment, Image, Table } from 'semantic-ui-react'; +import { toast } from 'react-toastify'; +import * as moment from 'moment'; -import styles from "../styles/common.css"; -import { EXPERIMENTS, SCREENS, KERNEL_STATUS, CONNECTION_STATUS, DEVICE_AVAILABILITY } from "../../constants/constants"; -import faceHouseIcon from "../../assets/common/FacesHouses.png"; -import stroopIcon from "../../assets/common/Stroop.png"; -import multitaskingIcon from "../../assets/common/Multitasking.png"; -import searchIcon from "../../assets/common/VisualSearch.png"; -import customIcon from "../../assets/common/Custom.png"; -import appLogo from "../../assets/common/app_logo.png"; -import divingMan from "../../assets/common/divingMan.svg"; -import { readWorkspaces, readAndParseState, openWorkspaceDir, deleteWorkspaceDir } from "../../utils/filesystem/storage"; +import styles from '../styles/common.css'; +import { + EXPERIMENTS, + SCREENS, + KERNEL_STATUS, + CONNECTION_STATUS, + DEVICE_AVAILABILITY +} from '../../constants/constants'; +import faceHouseIcon from '../../assets/common/FacesHouses.png'; +import stroopIcon from '../../assets/common/Stroop.png'; +import multitaskingIcon from '../../assets/common/Multitasking.png'; +import searchIcon from '../../assets/common/VisualSearch.png'; +import customIcon from '../../assets/common/Custom.png'; +import appLogo from '../../assets/common/app_logo.png'; +import divingMan from '../../assets/common/divingMan.svg'; +import { + readWorkspaces, + readAndParseState, + openWorkspaceDir, + deleteWorkspaceDir +} from '../../utils/filesystem/storage'; -import InputModal from "../InputModal"; -import SecondaryNavComponent from "../SecondaryNavComponent"; -import OverviewComponent from "./OverviewComponent"; -import { loadProtocol } from "../../utils/labjs/functions"; -import EEGExplorationComponent from "../EEGExplorationComponent"; +import InputModal from '../InputModal'; +import SecondaryNavComponent from '../SecondaryNavComponent'; +import OverviewComponent from './OverviewComponent'; +import { loadProtocol } from '../../utils/labjs/functions'; +import EEGExplorationComponent from '../EEGExplorationComponent'; -import { remote } from "electron"; +import { remote } from 'electron'; -const { - dialog -} = remote; +const { dialog } = remote; const HOME_STEPS = { // TODO: maybe change the recent and new labels, but not necessary right now @@ -57,7 +66,6 @@ interface State { } export default class Home extends Component { - // handleLoadCustomExperiment: (string) => void; // handleOpenOverview: (EXPERIMENTS) => void; // handleCloseOverview: () => void; @@ -73,7 +81,9 @@ export default class Home extends Component { }; this.handleStepClick = this.handleStepClick.bind(this); this.handleNewExperiment = this.handleNewExperiment.bind(this); - this.handleLoadCustomExperiment = this.handleLoadCustomExperiment.bind(this); + this.handleLoadCustomExperiment = this.handleLoadCustomExperiment.bind( + this + ); this.handleOpenOverview = this.handleOpenOverview.bind(this); this.handleCloseOverview = this.handleCloseOverview.bind(this); this.handleDeleteWorkspace = this.handleDeleteWorkspace.bind(this); @@ -162,80 +172,131 @@ export default class Home extends Component { renderSectionContent() { switch (this.state.activeStep) { case HOME_STEPS.RECENT: - return - {this.state.recentWorkspaces.length > 0 ? + return ( + + {this.state.recentWorkspaces.length > 0 ? ( +
Experiment name Date Last Opened - + Actions - {this.state.recentWorkspaces.sort((a, b) => { - const aTime = readAndParseState(a).params.dateModified || 0; - const bTime = readAndParseState(b).params.dateModified || 0; - return bTime - aTime; - }).map(dir => { - const { - params: { - dateModified - } - } = readAndParseState(dir); - return - {dir} + {this.state.recentWorkspaces + .sort((a, b) => { + const aTime = + readAndParseState(a).params.dateModified || 0; + const bTime = + readAndParseState(b).params.dateModified || 0; + return bTime - aTime; + }) + .map(dir => { + const { + params: { dateModified } + } = readAndParseState(dir); + return ( + + + {dir} + - {dateModified && moment.default(dateModified).fromNow()} + {dateModified && + moment.default(dateModified).fromNow()} - - - - ; - })} + + ); + })} -
: - + + ) : ( + +
You don't have any experiments yet

- Head over to the "Experiment Bank" section to start an experiment. + Head over to the "Experiment Bank" section to start + an experiment.

- -
} -
; - case HOME_STEPS.NEW:default: - return + + )} + + ); + case HOME_STEPS.NEW: + default: + return ( + - this.handleNewExperiment(EXPERIMENTS.N170)}> + this.handleNewExperiment(EXPERIMENTS.N170)} + > - + - -
+ +
Faces/Houses

- Explore how people react to different kinds of images, like faces vs. - houses. + Explore how people react to different kinds of + images, like faces vs. houses.

@@ -246,19 +307,30 @@ export default class Home extends Component { - this.handleNewExperiment(EXPERIMENTS.STROOP)}> + this.handleNewExperiment(EXPERIMENTS.STROOP)} + > - + - -
+ +
Stroop

- Investigate why it is hard to deal with contradictory information (like - the word "RED" printed in blue). + Investigate why it is hard to deal with + contradictory information (like the word "RED" + printed in blue).

@@ -271,19 +343,29 @@ export default class Home extends Component { - this.handleNewExperiment(EXPERIMENTS.MULTI)}> + this.handleNewExperiment(EXPERIMENTS.MULTI)} + > - + - -
+ +
Multi-tasking

- Explore why it is challenging to carry out multiple tasks at the same - time. + Explore why it is challenging to carry out multiple + tasks at the same time.

@@ -294,17 +376,30 @@ export default class Home extends Component { - this.handleNewExperiment(EXPERIMENTS.SEARCH)}> + this.handleNewExperiment(EXPERIMENTS.SEARCH)} + > - + - -
+ +
Visual Search
-

Examine why it is difficult to find your keys in a messy room.

+

+ Examine why it is difficult to find your keys in a + messy room. +

@@ -316,13 +411,23 @@ export default class Home extends Component { - this.handleNewExperiment(EXPERIMENTS.CUSTOM)}> + this.handleNewExperiment(EXPERIMENTS.CUSTOM)} + > - + - -
+ +
Custom experiment
@@ -336,27 +441,61 @@ export default class Home extends Component { - ; + + ); case HOME_STEPS.EXPLORE: - return ; - + return ( + + ); } } renderOverviewOrHome() { if (this.state.isOverviewComponentOpen) { - return ; + return ( + + ); } - return <> - } steps={HOME_STEPS} activeStep={this.state.activeStep} onStepClick={this.handleStepClick} /> -
{this.renderSectionContent()}
- ; + return ( + <> + } + steps={HOME_STEPS} + activeStep={this.state.activeStep} + onStepClick={this.handleStepClick} + /> +
+ {this.renderSectionContent()} +
+ + ); } render() { - return
+ return ( +
{this.renderOverviewOrHome()} - this.setState({ isNewExperimentModalOpen: false })} header='Enter a title for this experiment' /> -
; + this.setState({ isNewExperimentModalOpen: false })} + header="Enter a title for this experiment" + /> +
+ ); } -} \ No newline at end of file +} diff --git a/app/components/InputCollect.tsx b/app/components/InputCollect.tsx index d522a4c2..08b740d7 100644 --- a/app/components/InputCollect.tsx +++ b/app/components/InputCollect.tsx @@ -1,8 +1,7 @@ - -import React, { Component } from "react"; -import { Input, Modal, Button } from "semantic-ui-react"; -import { debounce } from "lodash"; -import styles from "./styles/common.css"; +import React, { Component } from 'react'; +import { Input, Modal, Button } from 'semantic-ui-react'; +import { debounce } from 'lodash'; +import styles from './styles/common.css'; interface Props { open: boolean; @@ -21,7 +20,6 @@ interface State { } export default class InputCollect extends Component { - // handleClose: () => void; // handleExit: () => void; // handleEnterSubmit: (Object) => void; @@ -52,7 +50,11 @@ export default class InputCollect extends Component { handleClose() { if (this.state.subject.length >= 1 && this.state.session) { - this.props.onClose(this.sanitizeTextInput(this.state.subject), this.sanitizeTextInput(this.state.group), this.state.session); + this.props.onClose( + this.sanitizeTextInput(this.state.subject), + this.sanitizeTextInput(this.state.group), + this.state.session + ); } else { if (this.state.subject.length < 1) { this.setState({ isSubjectError: true }); @@ -74,22 +76,58 @@ export default class InputCollect extends Component { } render() { - return + return ( + Enter Subject ID - this.handleTextEntry(object, data, 'subject')} onKeyDown={this.handleEnterSubmit} value={this.state.subject} autoFocus /> + + this.handleTextEntry(object, data, 'subject') + } + onKeyDown={this.handleEnterSubmit} + value={this.state.subject} + autoFocus + /> Enter group name (optional) - this.handleTextEntry(object, data, 'group')} onKeyDown={this.handleEnterSubmit} value={this.state.group} /> + + this.handleTextEntry(object, data, 'group') + } + onKeyDown={this.handleEnterSubmit} + value={this.state.group} + /> Enter session number - this.handleTextEntry(object, data, 'session')} onKeyDown={this.handleEnterSubmit} value={this.state.session} type="number" /> + + this.handleTextEntry(object, data, 'session') + } + onKeyDown={this.handleEnterSubmit} + value={this.state.session} + type="number" + /> - ; + + ); } } render() { - return + return ( + {this.renderResults()} {this.renderSaveButton()} - ; + + ); } -} \ No newline at end of file +} diff --git a/app/components/PreviewButtonComponent.tsx b/app/components/PreviewButtonComponent.tsx index 9213f861..92a59f5f 100644 --- a/app/components/PreviewButtonComponent.tsx +++ b/app/components/PreviewButtonComponent.tsx @@ -1,5 +1,5 @@ -import React, { PureComponent } from "react"; -import { Button } from "semantic-ui-react"; +import React, { PureComponent } from 'react'; +import { Button } from 'semantic-ui-react'; interface Props { isPreviewing: boolean; @@ -7,15 +7,18 @@ interface Props { } export default class PreviewButton extends PureComponent { - render() { if (!this.props.isPreviewing) { - return ; + + ); } - return ; + + ); } -} \ No newline at end of file +} diff --git a/app/components/PreviewExperimentComponent.tsx b/app/components/PreviewExperimentComponent.tsx index ac3dcb80..ef90b262 100644 --- a/app/components/PreviewExperimentComponent.tsx +++ b/app/components/PreviewExperimentComponent.tsx @@ -1,11 +1,14 @@ - -import React, { Component } from "react"; -import { Segment } from "semantic-ui-react"; -import { ExperimentWindow } from "../utils/labjs"; -import styles from "./styles/collect.css"; - -import { getImages } from "../utils/filesystem/storage"; -import { MainTimeline, Trial, ExperimentParameters } from "../constants/interfaces"; +import React, { Component } from 'react'; +import { Segment } from 'semantic-ui-react'; +import { ExperimentWindow } from '../utils/labjs'; +import styles from './styles/collect.css'; + +import { getImages } from '../utils/filesystem/storage'; +import { + MainTimeline, + Trial, + ExperimentParameters +} from '../constants/interfaces'; interface Props { params: ExperimentParameters; @@ -34,20 +37,26 @@ export default class PreviewExperimentComponent extends Component { render() { if (!this.props.isPreviewing) { - return
+ return ( +
The experiment will be shown in the window -
; +
+ ); } - return
- { - this.props.onEnd(); - } - }} /> -
; + return ( +
+ { + this.props.onEnd(); + } + }} + /> +
+ ); } -} \ No newline at end of file +} diff --git a/app/components/SecondaryNavComponent/SecondaryNavSegment.tsx b/app/components/SecondaryNavComponent/SecondaryNavSegment.tsx index 4a4e11d6..8d2c531c 100644 --- a/app/components/SecondaryNavComponent/SecondaryNavSegment.tsx +++ b/app/components/SecondaryNavComponent/SecondaryNavSegment.tsx @@ -1,6 +1,6 @@ -import React, { Component } from "react"; -import { Grid } from "semantic-ui-react"; -import styles from "../styles/secondarynav.css"; +import React, { Component } from 'react'; +import { Grid } from 'semantic-ui-react'; +import styles from '../styles/secondarynav.css'; interface Props { title: string; @@ -12,8 +12,16 @@ export default class SecondaryNavSegment extends Component { // props: Props; render() { - return + return ( + {this.props.title} - ; + + ); } -} \ No newline at end of file +} diff --git a/app/components/SecondaryNavComponent/index.tsx b/app/components/SecondaryNavComponent/index.tsx index 2c8b4052..ce03d1ad 100644 --- a/app/components/SecondaryNavComponent/index.tsx +++ b/app/components/SecondaryNavComponent/index.tsx @@ -1,9 +1,9 @@ -import React, { Component } from "react"; -import { Grid, Header, Dropdown } from "semantic-ui-react"; -import styles from "../styles/secondarynav.css"; -import SecondaryNavSegment from "./SecondaryNavSegment"; -import { NavLink } from "react-router-dom"; -import { SCREENS } from "../../constants/constants"; +import React, { Component } from 'react'; +import { Grid, Header, Dropdown } from 'semantic-ui-react'; +import styles from '../styles/secondarynav.css'; +import SecondaryNavSegment from './SecondaryNavSegment'; +import { NavLink } from 'react-router-dom'; +import { SCREENS } from '../../constants/constants'; interface Props { title: string | React.ReactNode; @@ -16,37 +16,63 @@ interface Props { } export default class SecondaryNavComponent extends Component { - shouldComponentUpdate(nextProps) { return nextProps.activeStep !== this.props.activeStep; } renderTitle() { if (typeof this.props.title === 'string') { - return
{this.props.title}
; + return ( +
+ {this.props.title} +
+ ); } return this.props.title; } renderSteps() { - return <> - {Object.values(this.props.steps).map(stepTitle => this.props.onStepClick(stepTitle)} />)} - ; + return ( + <> + {Object.values(this.props.steps).map(stepTitle => ( + this.props.onStepClick(stepTitle)} + /> + ))} + + ); } render() { - return - + return ( + + {this.renderTitle()} {this.renderSteps()} - {this.props.enableEEGToggle && + {this.props.enableEEGToggle && ( +
- + - e.stopPropagation()}> + e.stopPropagation()} + >
Enable EEG
{this.props.enableEEGToggle}
@@ -59,7 +85,9 @@ export default class SecondaryNavComponent extends Component {
{this.props.saveButton}
-
} -
; +
+ )} +
+ ); } -} \ No newline at end of file +} diff --git a/app/components/SignalQualityIndicatorComponent.tsx b/app/components/SignalQualityIndicatorComponent.tsx index 8e9d9980..d16f0e83 100644 --- a/app/components/SignalQualityIndicatorComponent.tsx +++ b/app/components/SignalQualityIndicatorComponent.tsx @@ -1,10 +1,9 @@ - -import React, { Component } from "react"; -import { isNil } from "lodash"; -import { Segment } from "semantic-ui-react"; -import * as d3 from "d3"; -import { Observable } from "rxjs"; -import SignalQualityIndicatorSVG from "./svgs/SignalQualityIndicatorSVG"; +import React, { Component } from 'react'; +import { isNil } from 'lodash'; +import { Segment } from 'semantic-ui-react'; +import * as d3 from 'd3'; +import { Observable } from 'rxjs'; +import SignalQualityIndicatorSVG from './svgs/SignalQualityIndicatorSVG'; interface Props { signalQualityObservable: Observable | null | undefined; @@ -26,7 +25,9 @@ class SignalQualityIndicatorComponent extends Component { } componentDidUpdate(prevProps: Props) { - if (this.props.signalQualityObservable !== prevProps.signalQualityObservable) { + if ( + this.props.signalQualityObservable !== prevProps.signalQualityObservable + ) { this.subscribeToObservable(this.props.signalQualityObservable); } } @@ -42,18 +43,29 @@ class SignalQualityIndicatorComponent extends Component { this.signalQualitySubscription.unsubscribe(); } - this.signalQualitySubscription = observable.subscribe(epoch => { - Object.keys(epoch.signalQuality).forEach(key => { - d3.select(`#${key}`).attr('visibility', 'show').attr('stroke', '#000').transition().duration(this.props.plottingInterval).ease(d3.easeLinear).attr('fill', epoch.signalQuality[key]); - }); - }, error => new Error(`Error in signalQualitySubscription ${error}`)); + this.signalQualitySubscription = observable.subscribe( + epoch => { + Object.keys(epoch.signalQuality).forEach(key => { + d3.select(`#${key}`) + .attr('visibility', 'show') + .attr('stroke', '#000') + .transition() + .duration(this.props.plottingInterval) + .ease(d3.easeLinear) + .attr('fill', epoch.signalQuality[key]); + }); + }, + error => new Error(`Error in signalQualitySubscription ${error}`) + ); } render() { - return + return ( + - ; + + ); } } -export default SignalQualityIndicatorComponent; \ No newline at end of file +export default SignalQualityIndicatorComponent; diff --git a/app/components/TopNavComponent/PrimaryNavSegment.tsx b/app/components/TopNavComponent/PrimaryNavSegment.tsx index 14c18856..66b6ee0c 100644 --- a/app/components/TopNavComponent/PrimaryNavSegment.tsx +++ b/app/components/TopNavComponent/PrimaryNavSegment.tsx @@ -1,7 +1,7 @@ -import React, { Component } from "react"; -import { Grid } from "semantic-ui-react"; -import { NavLink } from "react-router-dom"; -import styles from "../styles/topnavbar.css"; +import React, { Component } from 'react'; +import { Grid } from 'semantic-ui-react'; +import { NavLink } from 'react-router-dom'; +import styles from '../styles/topnavbar.css'; interface Props { style: string; @@ -11,13 +11,17 @@ interface Props { } export default class PrimaryNavSegment extends Component { - render() { - return + return ( +
{this.props.order}
{this.props.title}
-
; +
+ ); } -} \ No newline at end of file +} diff --git a/app/components/TopNavComponent/index.tsx b/app/components/TopNavComponent/index.tsx index c8c78526..12403615 100644 --- a/app/components/TopNavComponent/index.tsx +++ b/app/components/TopNavComponent/index.tsx @@ -1,16 +1,19 @@ -import React, { Component } from "react"; -import { Grid, Button, Segment, Image, Dropdown } from "semantic-ui-react"; -import { NavLink } from "react-router-dom"; -import { EXPERIMENTS, SCREENS } from "../../constants/constants"; -import styles from "../styles/topnavbar.css"; -import PrimaryNavSegment from "./PrimaryNavSegment"; -import { readAndParseState, readWorkspaces } from "../../utils/filesystem/storage"; -import BrainwavesIcon from "../../assets/common/Brainwaves_Icon_big.png"; -import { isNil } from "lodash"; +import React, { Component } from 'react'; +import { Grid, Button, Segment, Image, Dropdown } from 'semantic-ui-react'; +import { NavLink } from 'react-router-dom'; +import { EXPERIMENTS, SCREENS } from '../../constants/constants'; +import styles from '../styles/topnavbar.css'; +import PrimaryNavSegment from './PrimaryNavSegment'; +import { + readAndParseState, + readWorkspaces +} from '../../utils/filesystem/storage'; +import BrainwavesIcon from '../../assets/common/Brainwaves_Icon_big.png'; +import { isNil } from 'lodash'; interface Props { title: string | null | undefined; - location: {pathname: string;search: string;hash: string;}; + location: { pathname: string; search: string; hash: string }; isRunning: boolean; experimentActions: Object; type: EXPERIMENTS; @@ -32,8 +35,12 @@ export default class TopNavComponent extends Component { return styles.activeNavColumn; } - const routeOrder = Object.values(SCREENS).find(screen => screen.route === navSegmentScreen.route).order; - const currentOrder = Object.values(SCREENS).find(screen => screen.route === this.props.location.pathname).order; + const routeOrder = Object.values(SCREENS).find( + screen => screen.route === navSegmentScreen.route + ).order; + const currentOrder = Object.values(SCREENS).find( + screen => screen.route === this.props.location.pathname + ).order; if (currentOrder > routeOrder) { return styles.visitedNavColumn; } @@ -52,14 +59,24 @@ export default class TopNavComponent extends Component { }; render() { - if (this.props.location.pathname === SCREENS.HOME.route || this.props.location.pathname === SCREENS.BANK.route || this.props.location.pathname === '/' || this.props.isRunning) { + if ( + this.props.location.pathname === SCREENS.HOME.route || + this.props.location.pathname === SCREENS.BANK.route || + this.props.location.pathname === '/' || + this.props.isRunning + ) { return null; } - return + return ( + - + Home @@ -67,22 +84,53 @@ export default class TopNavComponent extends Component { - { - this.updateWorkspaces(); - }}> + { + this.updateWorkspaces(); + }} + > - {this.state.recentWorkspaces.map(workspace => this.handleLoadRecentWorkspace(workspace)}> + {this.state.recentWorkspaces.map(workspace => ( + this.handleLoadRecentWorkspace(workspace)} + >

{workspace}

-
)} +
+ ))}
- - - {this.props.isEEGEnabled ? : null} - {this.props.isEEGEnabled ? : } -
; + + + {this.props.isEEGEnabled ? ( + + ) : null} + {this.props.isEEGEnabled ? ( + + ) : ( + + )} +
+ ); } -} \ No newline at end of file +} diff --git a/app/components/ViewerComponent.tsx b/app/components/ViewerComponent.tsx index acab1305..ac630f72 100644 --- a/app/components/ViewerComponent.tsx +++ b/app/components/ViewerComponent.tsx @@ -1,8 +1,12 @@ - -import React, { Component } from "react"; -import { Subscription, Observable } from "rxjs"; -import { isNil } from "lodash"; -import { MUSE_CHANNELS, EMOTIV_CHANNELS, DEVICES, VIEWER_DEFAULTS } from "../constants/constants"; +import React, { Component } from 'react'; +import { Subscription, Observable } from 'rxjs'; +import { isNil } from 'lodash'; +import { + MUSE_CHANNELS, + EMOTIV_CHANNELS, + DEVICES, + VIEWER_DEFAULTS +} from '../constants/constants'; const Mousetrap = require('mousetrap'); @@ -19,14 +23,14 @@ interface State { } class ViewerComponent extends Component { - // graphView: ?HTMLElement; // signalQualitySubscription: Subscription; constructor(props: Props) { super(props); this.state = { ...VIEWER_DEFAULTS, - channels: props.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS : MUSE_CHANNELS + channels: + props.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS : MUSE_CHANNELS }; this.graphView = null; this.signalQualitySubscription = null; @@ -49,12 +53,17 @@ class ViewerComponent extends Component { } componentDidUpdate(prevProps: Props, prevState: State) { - if (this.props.signalQualityObservable !== prevProps.signalQualityObservable) { + if ( + this.props.signalQualityObservable !== prevProps.signalQualityObservable + ) { this.subscribeToObservable(this.props.signalQualityObservable); } if (this.props.deviceType !== prevProps.deviceType) { this.setState({ - channels: this.props.deviceType === DEVICES.MUSE ? MUSE_CHANNELS : EMOTIV_CHANNELS + channels: + this.props.deviceType === DEVICES.MUSE + ? MUSE_CHANNELS + : EMOTIV_CHANNELS }); } if (this.state.channels !== prevState.channels) { @@ -88,14 +97,25 @@ class ViewerComponent extends Component { if (!isNil(this.signalQualitySubscription)) { this.signalQualitySubscription.unsubscribe(); } - this.signalQualitySubscription = observable.subscribe(chunk => { - this.graphView.send('newData', chunk); - }, error => new Error(`Error in epochSubscription ${error}`)); + this.signalQualitySubscription = observable.subscribe( + chunk => { + this.graphView.send('newData', chunk); + }, + error => new Error(`Error in epochSubscription ${error}`) + ); } render() { - return ; + return ( + + ); } } -export default ViewerComponent; \ No newline at end of file +export default ViewerComponent; diff --git a/app/components/d3Classes/EEGViewer.ts b/app/components/d3Classes/EEGViewer.ts index a0080246..0d0409c0 100644 --- a/app/components/d3Classes/EEGViewer.ts +++ b/app/components/d3Classes/EEGViewer.ts @@ -4,7 +4,6 @@ const throttle = require('lodash/throttle'); const simplify = require('simplify-js'); class EEGViewer { - constructor(svg, parameters) { this.channels = parameters.channels; this.plottingInterval = parameters.plottingInterval; // NOTE: Plotting interval in Ms @@ -29,21 +28,28 @@ class EEGViewer { updateData(epoch) { const { - info: { - samplingRate, - startTime - } + info: { samplingRate, startTime } } = epoch; - this.lastTimestamp = startTime + epoch.data[0].length / (samplingRate / 1000); + this.lastTimestamp = + startTime + epoch.data[0].length / (samplingRate / 1000); this.firstTimestamp = this.lastTimestamp - this.domain; for (let i = 0; i < this.channels.length; i++) { - this.data[i] = this.data[i].concat(simplify(epoch.data[i].map((dataPoint, index) => ({ - x: startTime + index / (samplingRate / 1000), - y: dataPoint - })), this.downsampling)).filter(sample => sample.x >= this.firstTimestamp); + this.data[i] = this.data[i] + .concat( + simplify( + epoch.data[i].map((dataPoint, index) => ({ + x: startTime + index / (samplingRate / 1000), + y: dataPoint + })), + this.downsampling + ) + ) + .filter(sample => sample.x >= this.firstTimestamp); } - this.channelColours = this.channels.map(channelName => epoch.signalQuality[channelName]); + this.channelColours = this.channels.map( + channelName => epoch.signalQuality[channelName] + ); this.redraw(); } @@ -70,14 +76,20 @@ class EEGViewer { } autoScale() { - this.channelMaxs = this.data.map(channelData => EEGViewer.findExtreme(channelData, (a, b) => a > b)); - this.channelMins = this.data.map(channelData => EEGViewer.findExtreme(channelData, (a, b) => a < b)); + this.channelMaxs = this.data.map(channelData => + EEGViewer.findExtreme(channelData, (a, b) => a > b) + ); + this.channelMins = this.data.map(channelData => + EEGViewer.findExtreme(channelData, (a, b) => a < b) + ); this.zoom = 1; this.redraw(); } resetData() { - this.data = new Array(this.channels.length).fill([{ x: this.lastTimestamp, y: 0 }]); + this.data = new Array(this.channels.length).fill([ + { x: this.lastTimestamp, y: 0 } + ]); this.channelMaxs = new Array(this.channels.length).fill(100); this.channelMins = new Array(this.channels.length).fill(-100); } @@ -85,9 +97,20 @@ class EEGViewer { init() { try { d3.selectAll('svg > *').remove(); - this.width = parseInt(d3.select('#graph').style('width'), 10) - (this.margin.left + this.margin.right); - this.height = parseInt(d3.select('#graph').style('height'), 10) - (this.margin.top + this.margin.bottom); - this.graph = this.canvas.attr('width', this.width).attr('height', this.height).append('g').attr('transform', 'translate(' + this.margin.left + ',' + this.margin.top + ')'); + this.width = + parseInt(d3.select('#graph').style('width'), 10) - + (this.margin.left + this.margin.right); + this.height = + parseInt(d3.select('#graph').style('height'), 10) - + (this.margin.top + this.margin.bottom); + this.graph = this.canvas + .attr('width', this.width) + .attr('height', this.height) + .append('g') + .attr( + 'transform', + 'translate(' + this.margin.left + ',' + this.margin.top + ')' + ); this.addScales(); this.addAxes(); this.addLines(); @@ -97,17 +120,35 @@ class EEGViewer { } addScales() { - this.xScale = d3.scaleTime().domain([this.lastTimestamp, this.firstTimestamp + this.plottingInterval]).range([this.width, 0]); + this.xScale = d3 + .scaleTime() + .domain([this.lastTimestamp, this.firstTimestamp + this.plottingInterval]) + .range([this.width, 0]); this.yScaleLines = d3.scaleLinear(); - this.yScaleLabels = d3.scaleLinear().domain([this.channels.length - 1, 0]).range([(this.channels.length - 1) * (this.height / this.channels.length) + this.height / this.channels.length / 2, this.height / this.channels.length / 2]); + this.yScaleLabels = d3 + .scaleLinear() + .domain([this.channels.length - 1, 0]) + .range([ + (this.channels.length - 1) * (this.height / this.channels.length) + + this.height / this.channels.length / 2, + this.height / this.channels.length / 2 + ]); } addAxes() { - this.yAxis = d3.axisLeft().scale(this.yScaleLabels).tickSize(2).tickFormat((d, i) => this.channels[i].replace(/\s/g, '')).tickValues(d3.range(this.channels.length)); + this.yAxis = d3 + .axisLeft() + .scale(this.yScaleLabels) + .tickSize(2) + .tickFormat((d, i) => this.channels[i].replace(/\s/g, '')) + .tickValues(d3.range(this.channels.length)); - this.axisY = this.graph.append('g').attr('class', 'axis').call(this.yAxis); + this.axisY = this.graph + .append('g') + .attr('class', 'axis') + .call(this.yAxis); } addLines() { @@ -115,16 +156,45 @@ class EEGViewer { this.graph.select('#lines').remove(); this.graph.selectAll('#clip').remove(); this.paths = []; - this.graph.append('clipPath').attr('id', 'clip').append('rect').attr('height', this.height + this.height / this.channels.length).attr('width', this.width).attr('transform', 'translate(0,' + -this.height / this.channels.length + ')'); - this.lines = this.graph.append('g').attr('id', 'lines').attr('clip-path', 'url(#clip)'); - this.line = d3.line().x(d => this.xScale(d.x)).y(d => this.yScaleLines(d.y)).curve(d3.curveLinear).defined(d => d.y); + this.graph + .append('clipPath') + .attr('id', 'clip') + .append('rect') + .attr('height', this.height + this.height / this.channels.length) + .attr('width', this.width) + .attr( + 'transform', + 'translate(0,' + -this.height / this.channels.length + ')' + ); + this.lines = this.graph + .append('g') + .attr('id', 'lines') + .attr('clip-path', 'url(#clip)'); + this.line = d3 + .line() + .x(d => this.xScale(d.x)) + .y(d => this.yScaleLines(d.y)) + .curve(d3.curveLinear) + .defined(d => d.y); for (let i = 0; i < this.channels.length; i++) { const channelData = this.data[i]; - this.yScaleLines.domain([this.channelMins[i] / this.zoom, this.channelMaxs[i] / this.zoom]).range(EEGViewer.getLineRange(i, this.channels.length, this.height)); + this.yScaleLines + .domain([ + this.channelMins[i] / this.zoom, + this.channelMaxs[i] / this.zoom + ]) + .range(EEGViewer.getLineRange(i, this.channels.length, this.height)); - this.paths[i] = this.lines.append('path').data([channelData]).attr('class', 'line').attr('id', 'line' + i + 1).attr('d', this.line).attr('stroke', this.channelColours[i]).attr('stroke-width', this.lineWidth); + this.paths[i] = this.lines + .append('path') + .data([channelData]) + .attr('class', 'line') + .attr('id', 'line' + i + 1) + .attr('d', this.line) + .attr('stroke', this.channelColours[i]) + .attr('stroke-width', this.lineWidth); } } @@ -132,32 +202,71 @@ class EEGViewer { if (this.paths != null) { for (let i = 0; i < this.channels.length; i++) { const channelData = this.data[i]; - this.yScaleLines.domain([this.channelMins[i] / this.zoom, this.channelMaxs[i] / this.zoom]).range(EEGViewer.getLineRange(i, this.channels.length, this.height)); + this.yScaleLines + .domain([ + this.channelMins[i] / this.zoom, + this.channelMaxs[i] / this.zoom + ]) + .range(EEGViewer.getLineRange(i, this.channels.length, this.height)); - this.paths[i].interrupt().transition().duration(this.plottingInterval).ease(d3.easeLinear).attr('transform', 'translate(' + -(this.xScale(channelData[channelData.length - 1].x) - this.width) + ', 0)').attr('stroke', this.channelColours[i]); + this.paths[i] + .interrupt() + .transition() + .duration(this.plottingInterval) + .ease(d3.easeLinear) + .attr( + 'transform', + 'translate(' + + -( + this.xScale(channelData[channelData.length - 1].x) - this.width + ) + + ', 0)' + ) + .attr('stroke', this.channelColours[i]); - this.paths[i].data([channelData]).attr('d', this.line).attr('transform', 'translate(0,0)'); + this.paths[i] + .data([channelData]) + .attr('d', this.line) + .attr('transform', 'translate(0,0)'); } - this.xScale.domain([this.lastTimestamp, this.firstTimestamp + this.plottingInterval]).range([this.width, 0]); + this.xScale + .domain([ + this.lastTimestamp, + this.firstTimestamp + this.plottingInterval + ]) + .range([this.width, 0]); } } resize() { if (this.paths != null) { - this.width = parseInt(d3.select('#graph').style('width'), 10) - (this.margin.left + this.margin.right); - this.height = parseInt(d3.select('#graph').style('height'), 10) - (this.margin.top + this.margin.bottom); + this.width = + parseInt(d3.select('#graph').style('width'), 10) - + (this.margin.left + this.margin.right); + this.height = + parseInt(d3.select('#graph').style('height'), 10) - + (this.margin.top + this.margin.bottom); this.lines.attr('height', this.height).attr('width', this.width); this.xScale.range([this.width, 0]); this.yScaleLines.range([this.height, 0]); - this.yScaleLabels.range([(this.channels.length - 1) * (this.height / this.channels.length) + this.height / this.channels.length / 2, this.height / this.channels.length / 2]); + this.yScaleLabels.range([ + (this.channels.length - 1) * (this.height / this.channels.length) + + this.height / this.channels.length / 2, + this.height / this.channels.length / 2 + ]); this.axisY.call(this.yAxis); this.addLines(); } } static findExtreme(data, comparison) { - return data.slice(data.slice(data.length / 2)).reduce((acc, curr) => comparison(curr.y, acc) ? curr.y : acc, data[0].y); + return data + .slice(data.slice(data.length / 2)) + .reduce( + (acc, curr) => (comparison(curr.y, acc) ? curr.y : acc), + data[0].y + ); } static getLineRange(index, nbChannels, height) { @@ -165,4 +274,4 @@ class EEGViewer { } } -module.exports = EEGViewer; \ No newline at end of file +module.exports = EEGViewer; diff --git a/app/components/svgs/ClickableHeadDiagramSVG.tsx b/app/components/svgs/ClickableHeadDiagramSVG.tsx index 19fa09a4..f38f113c 100644 --- a/app/components/svgs/ClickableHeadDiagramSVG.tsx +++ b/app/components/svgs/ClickableHeadDiagramSVG.tsx @@ -1,140 +1,554 @@ -import React from "react"; +import React from 'react'; interface Props { channelinfo: Array; onChannelClick: (arg0: string) => void; } -const SvgComponent = (props: Props) => +const SvgComponent = (props: Props) => ( + Signal Quality Indicator - - - - - - - - - - - - props.onChannelClick('T7')}> - - + + + + + + + + + + + + props.onChannelClick('T7')} + > + + T7 - props.onChannelClick('FC5')} visibility={props.channelinfo.includes('FC5') ? 'show' : 'hidden'}> - - + props.onChannelClick('FC5')} + visibility={props.channelinfo.includes('FC5') ? 'show' : 'hidden'} + > + + FC5 - props.onChannelClick('FC6')} visibility={props.channelinfo.includes('FC6') ? 'show' : 'hidden'}> - - + props.onChannelClick('FC6')} + visibility={props.channelinfo.includes('FC6') ? 'show' : 'hidden'} + > + + FC6 - props.onChannelClick('F3')} visibility={props.channelinfo.includes('F3') ? 'show' : 'hidden'}> - - + props.onChannelClick('F3')} + visibility={props.channelinfo.includes('F3') ? 'show' : 'hidden'} + > + + F3 - props.onChannelClick('F4')} visibility={props.channelinfo.includes('F4') ? 'show' : 'hidden'}> - - + props.onChannelClick('F4')} + visibility={props.channelinfo.includes('F4') ? 'show' : 'hidden'} + > + + F4 - props.onChannelClick('AF3')} visibility={props.channelinfo.includes('AF3') ? 'show' : 'hidden'}> - - + props.onChannelClick('AF3')} + visibility={props.channelinfo.includes('AF3') ? 'show' : 'hidden'} + > + + AF3 - props.onChannelClick('AF4')} visibility={props.channelinfo.includes('AF4') ? 'show' : 'hidden'}> - - + props.onChannelClick('AF4')} + visibility={props.channelinfo.includes('AF4') ? 'show' : 'hidden'} + > + + AF4 - props.onChannelClick('M1')} visibility={props.channelinfo.includes('M1') ? 'show' : 'hidden'}> - - + props.onChannelClick('M1')} + visibility={props.channelinfo.includes('M1') ? 'show' : 'hidden'} + > + + M1 - props.onChannelClick('P7')} visibility={props.channelinfo.includes('P7') ? 'show' : 'hidden'}> - - + props.onChannelClick('P7')} + visibility={props.channelinfo.includes('P7') ? 'show' : 'hidden'} + > + + P7 - props.onChannelClick('O1')} visibility={props.channelinfo.includes('O1') ? 'show' : 'hidden'}> - - + props.onChannelClick('O1')} + visibility={props.channelinfo.includes('O1') ? 'show' : 'hidden'} + > + + O1 - props.onChannelClick('O2')} visibility={props.channelinfo.includes('O2') ? 'show' : 'hidden'}> - - + props.onChannelClick('O2')} + visibility={props.channelinfo.includes('O2') ? 'show' : 'hidden'} + > + + O2 - props.onChannelClick('P8')} visibility={props.channelinfo.includes('P8') ? 'show' : 'hidden'}> - - + props.onChannelClick('P8')} + visibility={props.channelinfo.includes('P8') ? 'show' : 'hidden'} + > + + P8 - props.onChannelClick('T8')} visibility={props.channelinfo.includes('T8') ? 'show' : 'hidden'}> - - + props.onChannelClick('T8')} + visibility={props.channelinfo.includes('T8') ? 'show' : 'hidden'} + > + + T8 - props.onChannelClick('M2')} visibility={props.channelinfo.includes('M2') ? 'show' : 'hidden'}> - - + props.onChannelClick('M2')} + visibility={props.channelinfo.includes('M2') ? 'show' : 'hidden'} + > + + M2 - props.onChannelClick('TP10')} visibility={props.channelinfo.includes('TP10') ? 'show' : 'hidden'}> - - + props.onChannelClick('TP10')} + visibility={props.channelinfo.includes('TP10') ? 'show' : 'hidden'} + > + + TP10 - props.onChannelClick('Fpz')} visibility={props.channelinfo.includes('Fpz') ? 'show' : 'hidden'}> - - - F + props.onChannelClick('Fpz')} + visibility={props.channelinfo.includes('Fpz') ? 'show' : 'hidden'} + > + + + F pz - props.onChannelClick('TP9')} visibility={props.channelinfo.includes('TP9') ? 'show' : 'hidden'}> - - + props.onChannelClick('TP9')} + visibility={props.channelinfo.includes('TP9') ? 'show' : 'hidden'} + > + + TP9 - props.onChannelClick('AF7')} visibility={props.channelinfo.includes('AF7') ? 'show' : 'hidden'}> - - + props.onChannelClick('AF7')} + visibility={props.channelinfo.includes('AF7') ? 'show' : 'hidden'} + > + + AF7 - props.onChannelClick('AF8')} visibility={props.channelinfo.includes('AF8') ? 'show' : 'hidden'}> - - + props.onChannelClick('AF8')} + visibility={props.channelinfo.includes('AF8') ? 'show' : 'hidden'} + > + + AF8 - ; + +); -export default SvgComponent; \ No newline at end of file +export default SvgComponent; diff --git a/app/components/svgs/SignalQualityIndicatorSVG.tsx b/app/components/svgs/SignalQualityIndicatorSVG.tsx index 0dba1619..1123c73b 100644 --- a/app/components/svgs/SignalQualityIndicatorSVG.tsx +++ b/app/components/svgs/SignalQualityIndicatorSVG.tsx @@ -1,135 +1,454 @@ -import React from "react"; +import React from 'react'; -const SvgComponent = props => +const SvgComponent = props => ( + Signal Quality Indicator - - - - - - - - - - - - - - + + + + + + + + + + + + + + T7 - - - + + + FC5 - - - + + + FC6 - - - + + + F3 - - - + + + F4 - - - + + + AF3 - - - + + + AF4 - - - + + + M1 - - - + + + P7 - - - + + + O1 - - - + + + O2 - - - + + + P8 - - - + + + T8 - - - + + + M2 - - - + + + TP10 - - - - F + + + + F pz - - - + + + TP9 - - - + + + AF7 - - - + + + AF8 - ; + +); -export default SvgComponent; \ No newline at end of file +export default SvgComponent; diff --git a/app/constants/constants.ts b/app/constants/constants.ts index a687ade6..574416f9 100644 --- a/app/constants/constants.ts +++ b/app/constants/constants.ts @@ -92,7 +92,22 @@ export const CHANNELS = { AUX: { index: 4, color: '#E7789E' } }; -export const EMOTIV_CHANNELS = ['AF3', 'F7', 'F3', 'FC5', 'T7', 'P7', 'O1', 'O2', 'P8', 'T8', 'FC6', 'F4', 'F8', 'AF4']; +export const EMOTIV_CHANNELS = [ + 'AF3', + 'F7', + 'F3', + 'FC5', + 'T7', + 'P7', + 'O1', + 'O2', + 'P8', + 'T8', + 'FC6', + 'F4', + 'F8', + 'AF4' +]; export const MUSE_CHANNELS = ['TP9', 'AF7', 'AF8', 'TP10', 'AUX']; @@ -123,4 +138,4 @@ export const SIGNAL_QUALITY_THRESHOLDS = { export const FILE_TYPES = { STIMULUS_DIR: 'STIMULUS_DIR', TIMELINE: 'TIMELINE' -}; \ No newline at end of file +}; diff --git a/app/containers/AnalyzeContainer.ts b/app/containers/AnalyzeContainer.ts index 7481dcec..0fc76c54 100644 --- a/app/containers/AnalyzeContainer.ts +++ b/app/containers/AnalyzeContainer.ts @@ -1,9 +1,8 @@ - -import { bindActionCreators } from "redux"; -import { connect } from "react-redux"; -import Analyze from "../components/AnalyzeComponent"; -import * as experimentActions from "../actions/experimentActions"; -import * as jupyterActions from "../actions/jupyterActions"; +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import Analyze from '../components/AnalyzeComponent'; +import * as experimentActions from '../actions/experimentActions'; +import * as jupyterActions from '../actions/jupyterActions'; function mapStateToProps(state) { return { @@ -22,4 +21,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(Analyze); \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(Analyze); diff --git a/app/containers/App.tsx b/app/containers/App.tsx index 082cba0b..137b4171 100644 --- a/app/containers/App.tsx +++ b/app/containers/App.tsx @@ -1,7 +1,6 @@ - -import * as React from "react"; -import { ToastContainer } from "react-toastify"; -import TopNav from "./TopNavBarContainer"; +import * as React from 'react'; +import { ToastContainer } from 'react-toastify'; +import TopNav from './TopNavBarContainer'; type Props = { children: React.ReactNode; @@ -11,10 +10,12 @@ export default class App extends React.Component { // props: Props; render() { - return
+ return ( +
{this.props.children} -
; +
+ ); } -} \ No newline at end of file +} diff --git a/app/containers/CleanContainer.ts b/app/containers/CleanContainer.ts index c672fd6d..ce06589b 100644 --- a/app/containers/CleanContainer.ts +++ b/app/containers/CleanContainer.ts @@ -1,9 +1,8 @@ - -import { bindActionCreators } from "redux"; -import { connect } from "react-redux"; -import CleanComponent from "../components/CleanComponent"; -import * as experimentActions from "../actions/experimentActions"; -import * as jupyterActions from "../actions/jupyterActions"; +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import CleanComponent from '../components/CleanComponent'; +import * as experimentActions from '../actions/experimentActions'; +import * as jupyterActions from '../actions/jupyterActions'; function mapStateToProps(state) { return { @@ -24,4 +23,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(CleanComponent); \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(CleanComponent); diff --git a/app/containers/CollectContainer.ts b/app/containers/CollectContainer.ts index 4692fb1a..53f2e81e 100644 --- a/app/containers/CollectContainer.ts +++ b/app/containers/CollectContainer.ts @@ -1,9 +1,8 @@ - -import { bindActionCreators } from "redux"; -import { connect } from "react-redux"; -import Collect from "../components/CollectComponent"; -import * as deviceActions from "../actions/deviceActions"; -import * as experimentActions from "../actions/experimentActions"; +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import Collect from '../components/CollectComponent'; +import * as deviceActions from '../actions/deviceActions'; +import * as experimentActions from '../actions/experimentActions'; function mapStateToProps(state) { return { @@ -19,4 +18,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(Collect); \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(Collect); diff --git a/app/containers/ExperimentDesignContainer.ts b/app/containers/ExperimentDesignContainer.ts index 679f1269..5d9c0e95 100644 --- a/app/containers/ExperimentDesignContainer.ts +++ b/app/containers/ExperimentDesignContainer.ts @@ -1,8 +1,7 @@ - -import { bindActionCreators } from "redux"; -import { connect } from "react-redux"; -import Design from "../components/DesignComponent"; -import * as experimentActions from "../actions/experimentActions"; +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import Design from '../components/DesignComponent'; +import * as experimentActions from '../actions/experimentActions'; function mapStateToProps(state) { return { @@ -16,4 +15,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(Design); \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(Design); diff --git a/app/containers/HomeContainer.ts b/app/containers/HomeContainer.ts index 30318f5b..a9139339 100644 --- a/app/containers/HomeContainer.ts +++ b/app/containers/HomeContainer.ts @@ -1,10 +1,9 @@ - -import { connect } from "react-redux"; -import { bindActionCreators } from "redux"; -import Home from "../components/HomeComponent"; -import * as deviceActions from "../actions/deviceActions"; -import * as jupyterActions from "../actions/jupyterActions"; -import * as experimentActions from "../actions/experimentActions"; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import Home from '../components/HomeComponent'; +import * as deviceActions from '../actions/deviceActions'; +import * as jupyterActions from '../actions/jupyterActions'; +import * as experimentActions from '../actions/experimentActions'; function mapStateToProps(state) { return { @@ -21,4 +20,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(Home); \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(Home); diff --git a/app/containers/TopNavBarContainer.ts b/app/containers/TopNavBarContainer.ts index bdfb18c8..c80f3d3c 100644 --- a/app/containers/TopNavBarContainer.ts +++ b/app/containers/TopNavBarContainer.ts @@ -1,8 +1,7 @@ - -import { connect } from "react-redux"; -import { bindActionCreators } from "redux"; -import TopNavComponent from "../components/TopNavComponent"; -import * as experimentActions from "../actions/experimentActions"; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import TopNavComponent from '../components/TopNavComponent'; +import * as experimentActions from '../actions/experimentActions'; function mapStateToProps(state) { return { @@ -20,4 +19,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(TopNavComponent); \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(TopNavComponent); diff --git a/app/css.d.ts b/app/css.d.ts index f27c653e..af3d0300 100644 --- a/app/css.d.ts +++ b/app/css.d.ts @@ -1,9 +1,9 @@ declare module '*.scss' { - const content: { [className: string]: string }; - export default content; - } + const content: { [className: string]: string }; + export default content; +} - declare module '*.css' { - const content: { [className: string]: string }; - export default content; - } +declare module '*.css' { + const content: { [className: string]: string }; + export default content; +} diff --git a/app/epics/deviceEpics.ts b/app/epics/deviceEpics.ts index 9214166e..b3c48bef 100644 --- a/app/epics/deviceEpics.ts +++ b/app/epics/deviceEpics.ts @@ -1,13 +1,35 @@ -import { combineEpics } from "redux-observable"; -import { of, from, timer } from "rxjs"; -import { map, pluck, mergeMap, tap, filter, catchError } from "rxjs/operators"; -import { isNil } from "lodash"; -import { toast } from "react-toastify"; -import { CONNECT_TO_DEVICE, SET_DEVICE_AVAILABILITY, setDeviceAvailability, setConnectionStatus } from "../actions/deviceActions"; -import { getEmotiv, connectToEmotiv, createRawEmotivObservable, createEmotivSignalQualityObservable, disconnectFromEmotiv } from "../utils/eeg/emotiv"; -import { getMuse, connectToMuse, createRawMuseObservable, createMuseSignalQualityObservable, disconnectFromMuse } from "../utils/eeg/muse"; -import { CONNECTION_STATUS, DEVICES, DEVICE_AVAILABILITY, SEARCH_TIMER } from "../constants/constants"; -import { EXPERIMENT_CLEANUP } from "./experimentEpics"; +import { combineEpics } from 'redux-observable'; +import { of, from, timer } from 'rxjs'; +import { map, pluck, mergeMap, tap, filter, catchError } from 'rxjs/operators'; +import { isNil } from 'lodash'; +import { toast } from 'react-toastify'; +import { + CONNECT_TO_DEVICE, + SET_DEVICE_AVAILABILITY, + setDeviceAvailability, + setConnectionStatus +} from '../actions/deviceActions'; +import { + getEmotiv, + connectToEmotiv, + createRawEmotivObservable, + createEmotivSignalQualityObservable, + disconnectFromEmotiv +} from '../utils/eeg/emotiv'; +import { + getMuse, + connectToMuse, + createRawMuseObservable, + createMuseSignalQualityObservable, + disconnectFromMuse +} from '../utils/eeg/muse'; +import { + CONNECTION_STATUS, + DEVICES, + DEVICE_AVAILABILITY, + SEARCH_TIMER +} from '../constants/constants'; +import { EXPERIMENT_CLEANUP } from './experimentEpics'; export const DEVICE_FOUND = 'DEVICE_FOUND'; export const SET_DEVICE_TYPE = 'DEVICE_TYPE'; @@ -57,63 +79,174 @@ const cleanup = () => ({ type: DEVICE_CLEANUP }); // Epics // NOTE: Uses a Promise "then" inside b/c Observable.from leads to loss of user gesture propagation for web bluetooth -const searchMuseEpic = action$ => action$.ofType(SET_DEVICE_AVAILABILITY).pipe(pluck('payload'), filter(status => status === DEVICE_AVAILABILITY.SEARCHING), map(getMuse), mergeMap(promise => promise.then(devices => devices, error => { - // This error will fire a bit too promiscuously until we fix windows web bluetooth - // toast.error(`"Device Error: " ${error.toString()}`); - return []; -})), filter(devices => devices), // filter out nulls if running on win7 -filter(devices => devices.length >= 1), map(deviceFound)); - -const searchEmotivEpic = action$ => action$.ofType(SET_DEVICE_AVAILABILITY).pipe(pluck('payload'), filter(status => status === DEVICE_AVAILABILITY.SEARCHING), filter(() => process.platform === 'darwin' || process.platform === 'win32'), map(getEmotiv), mergeMap(promise => promise.then(devices => devices, error => { - if (error.message.includes('client.queryHeadsets')) { - toast.error('Could not connect to Cortex Service. Please connect to the internet and install Cortex to use Emotiv EEG', { autoclose: 7000 }); - } else { - toast.error(`"Device Error: " ${error.toString()}`); - } - console.error('searchEpic: ', error.toString()); - return []; -})), filter(devices => devices.length >= 1), map(deviceFound)); - -const deviceFoundEpic = (action$, state$) => action$.ofType(DEVICE_FOUND).pipe(pluck('payload'), map(foundDevices => foundDevices.reduce((acc, curr) => { - if (acc.find(device => device.id === curr.id)) { - return acc; - } - return acc.concat(curr); -}, state$.value.device.availableDevices)), mergeMap(devices => of(setAvailableDevices(devices), setDeviceAvailability(DEVICE_AVAILABILITY.AVAILABLE)))); - -const searchTimerEpic = (action$, state$) => action$.ofType(SET_DEVICE_AVAILABILITY).pipe(pluck('payload'), filter(status => status === DEVICE_AVAILABILITY.SEARCHING), mergeMap(() => timer(SEARCH_TIMER)), filter(() => state$.value.device.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING), map(() => setDeviceAvailability(DEVICE_AVAILABILITY.NONE))); - -const connectEpic = action$ => action$.ofType(CONNECT_TO_DEVICE).pipe(pluck('payload'), map(device => isNil(device.name) ? connectToEmotiv(device) : connectToMuse(device)), mergeMap(promise => promise.then(deviceInfo => deviceInfo)), mergeMap(deviceInfo => { - if (!isNil(deviceInfo) && !isNil(deviceInfo.samplingRate)) { - return of(setDeviceType(deviceInfo.name.includes('Muse') ? DEVICES.MUSE : DEVICES.EMOTIV), setDeviceInfo(deviceInfo), setConnectionStatus(CONNECTION_STATUS.CONNECTED)); - } - return of(setConnectionStatus(CONNECTION_STATUS.DISCONNECTED)); -})); - -const isConnectingEpic = action$ => action$.ofType(CONNECT_TO_DEVICE).pipe(map(() => setConnectionStatus(CONNECTION_STATUS.CONNECTING))); - -const setRawObservableEpic = (action$, state$) => action$.ofType(SET_DEVICE_INFO).pipe(mergeMap(() => { - if (state$.value.device.deviceType === DEVICES.EMOTIV) { - return from(createRawEmotivObservable()); - } - return from(createRawMuseObservable()); -}), map(setRawObservable)); - -const setSignalQualityObservableEpic = (action$, state$) => action$.ofType(SET_RAW_OBSERVABLE).pipe(pluck('payload'), map(rawObservable => { - if (state$.value.device.deviceType === DEVICES.EMOTIV) { - return createEmotivSignalQualityObservable(rawObservable, state$.value.device.connectedDevice); - } - return createMuseSignalQualityObservable(rawObservable, state$.value.device.connectedDevice); -}), map(setSignalQualityObservable)); - -const deviceCleanupEpic = (action$, state$) => action$.ofType(EXPERIMENT_CLEANUP).pipe(filter(() => state$.value.device.connectionStatus !== CONNECTION_STATUS.NOT_YET_CONNECTED), map(() => { - if (state$.value.device.deviceType === DEVICES.EMOTIV) { - disconnectFromEmotiv(); - } - disconnectFromMuse(); -}), map(cleanup)); +const searchMuseEpic = action$ => + action$.ofType(SET_DEVICE_AVAILABILITY).pipe( + pluck('payload'), + filter(status => status === DEVICE_AVAILABILITY.SEARCHING), + map(getMuse), + mergeMap(promise => + promise.then( + devices => devices, + error => { + // This error will fire a bit too promiscuously until we fix windows web bluetooth + // toast.error(`"Device Error: " ${error.toString()}`); + return []; + } + ) + ), + filter(devices => devices), // filter out nulls if running on win7 + filter(devices => devices.length >= 1), + map(deviceFound) + ); + +const searchEmotivEpic = action$ => + action$.ofType(SET_DEVICE_AVAILABILITY).pipe( + pluck('payload'), + filter(status => status === DEVICE_AVAILABILITY.SEARCHING), + filter(() => process.platform === 'darwin' || process.platform === 'win32'), + map(getEmotiv), + mergeMap(promise => + promise.then( + devices => devices, + error => { + if (error.message.includes('client.queryHeadsets')) { + toast.error( + 'Could not connect to Cortex Service. Please connect to the internet and install Cortex to use Emotiv EEG', + { autoclose: 7000 } + ); + } else { + toast.error(`"Device Error: " ${error.toString()}`); + } + console.error('searchEpic: ', error.toString()); + return []; + } + ) + ), + filter(devices => devices.length >= 1), + map(deviceFound) + ); + +const deviceFoundEpic = (action$, state$) => + action$.ofType(DEVICE_FOUND).pipe( + pluck('payload'), + map(foundDevices => + foundDevices.reduce((acc, curr) => { + if (acc.find(device => device.id === curr.id)) { + return acc; + } + return acc.concat(curr); + }, state$.value.device.availableDevices) + ), + mergeMap(devices => + of( + setAvailableDevices(devices), + setDeviceAvailability(DEVICE_AVAILABILITY.AVAILABLE) + ) + ) + ); + +const searchTimerEpic = (action$, state$) => + action$.ofType(SET_DEVICE_AVAILABILITY).pipe( + pluck('payload'), + filter(status => status === DEVICE_AVAILABILITY.SEARCHING), + mergeMap(() => timer(SEARCH_TIMER)), + filter( + () => + state$.value.device.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING + ), + map(() => setDeviceAvailability(DEVICE_AVAILABILITY.NONE)) + ); + +const connectEpic = action$ => + action$.ofType(CONNECT_TO_DEVICE).pipe( + pluck('payload'), + map(device => + isNil(device.name) ? connectToEmotiv(device) : connectToMuse(device) + ), + mergeMap(promise => promise.then(deviceInfo => deviceInfo)), + mergeMap(deviceInfo => { + if (!isNil(deviceInfo) && !isNil(deviceInfo.samplingRate)) { + return of( + setDeviceType( + deviceInfo.name.includes('Muse') ? DEVICES.MUSE : DEVICES.EMOTIV + ), + setDeviceInfo(deviceInfo), + setConnectionStatus(CONNECTION_STATUS.CONNECTED) + ); + } + return of(setConnectionStatus(CONNECTION_STATUS.DISCONNECTED)); + }) + ); + +const isConnectingEpic = action$ => + action$ + .ofType(CONNECT_TO_DEVICE) + .pipe(map(() => setConnectionStatus(CONNECTION_STATUS.CONNECTING))); + +const setRawObservableEpic = (action$, state$) => + action$.ofType(SET_DEVICE_INFO).pipe( + mergeMap(() => { + if (state$.value.device.deviceType === DEVICES.EMOTIV) { + return from(createRawEmotivObservable()); + } + return from(createRawMuseObservable()); + }), + map(setRawObservable) + ); + +const setSignalQualityObservableEpic = (action$, state$) => + action$.ofType(SET_RAW_OBSERVABLE).pipe( + pluck('payload'), + map(rawObservable => { + if (state$.value.device.deviceType === DEVICES.EMOTIV) { + return createEmotivSignalQualityObservable( + rawObservable, + state$.value.device.connectedDevice + ); + } + return createMuseSignalQualityObservable( + rawObservable, + state$.value.device.connectedDevice + ); + }), + map(setSignalQualityObservable) + ); + +const deviceCleanupEpic = (action$, state$) => + action$.ofType(EXPERIMENT_CLEANUP).pipe( + filter( + () => + state$.value.device.connectionStatus !== + CONNECTION_STATUS.NOT_YET_CONNECTED + ), + map(() => { + if (state$.value.device.deviceType === DEVICES.EMOTIV) { + disconnectFromEmotiv(); + } + disconnectFromMuse(); + }), + map(cleanup) + ); // TODO: Fix this error handling so epics can refire once they error out -const rootEpic = (action$, state$) => combineEpics(searchMuseEpic, searchEmotivEpic, deviceFoundEpic, searchTimerEpic, connectEpic, isConnectingEpic, setRawObservableEpic, setSignalQualityObservableEpic, deviceCleanupEpic)(action$, state$).pipe(catchError(error => of(error).pipe(tap(err => toast.error(`"Device Error: " ${err.toString()}`)), map(cleanup)))); - -export default rootEpic; \ No newline at end of file +const rootEpic = (action$, state$) => + combineEpics( + searchMuseEpic, + searchEmotivEpic, + deviceFoundEpic, + searchTimerEpic, + connectEpic, + isConnectingEpic, + setRawObservableEpic, + setSignalQualityObservableEpic, + deviceCleanupEpic + )(action$, state$).pipe( + catchError(error => + of(error).pipe( + tap(err => toast.error(`"Device Error: " ${err.toString()}`)), + map(cleanup) + ) + ) + ); + +export default rootEpic; diff --git a/app/epics/experimentEpics.ts b/app/epics/experimentEpics.ts index 970d9174..f6fbda63 100644 --- a/app/epics/experimentEpics.ts +++ b/app/epics/experimentEpics.ts @@ -1,13 +1,52 @@ -import { combineEpics } from "redux-observable"; -import { from, of } from "rxjs"; -import { map, mapTo, mergeMap, pluck, filter, takeUntil, throttleTime, ignoreElements, tap } from "rxjs/operators"; -import { setType, setParadigm, setTitle, saveWorkspace, loadDefaultTimeline, LOAD_DEFAULT_TIMELINE, START, STOP, SAVE_WORKSPACE, CREATE_NEW_WORKSPACE, SET_SUBJECT, SET_GROUP } from "../actions/experimentActions"; -import { DEVICES, MUSE_CHANNELS, EMOTIV_CHANNELS, CONNECTION_STATUS } from "../constants/constants"; -import { loadProtocol, getBehaviouralData } from "../utils/labjs/functions"; -import { createEEGWriteStream, writeHeader, writeEEGData } from "../utils/filesystem/write"; -import { getWorkspaceDir, storeExperimentState, restoreExperimentState, createWorkspaceDir, storeBehaviouralData, readWorkspaceBehaviorData } from "../utils/filesystem/storage"; - -import { createEmotivRecord, stopEmotivRecord } from "../utils/eeg/emotiv"; +import { combineEpics } from 'redux-observable'; +import { from, of } from 'rxjs'; +import { + map, + mapTo, + mergeMap, + pluck, + filter, + takeUntil, + throttleTime, + ignoreElements, + tap +} from 'rxjs/operators'; +import { + setType, + setParadigm, + setTitle, + saveWorkspace, + loadDefaultTimeline, + LOAD_DEFAULT_TIMELINE, + START, + STOP, + SAVE_WORKSPACE, + CREATE_NEW_WORKSPACE, + SET_SUBJECT, + SET_GROUP +} from '../actions/experimentActions'; +import { + DEVICES, + MUSE_CHANNELS, + EMOTIV_CHANNELS, + CONNECTION_STATUS +} from '../constants/constants'; +import { loadProtocol, getBehaviouralData } from '../utils/labjs/functions'; +import { + createEEGWriteStream, + writeHeader, + writeEEGData +} from '../utils/filesystem/write'; +import { + getWorkspaceDir, + storeExperimentState, + restoreExperimentState, + createWorkspaceDir, + storeBehaviouralData, + readWorkspaceBehaviorData +} from '../utils/filesystem/storage'; + +import { createEmotivRecord, stopEmotivRecord } from '../utils/eeg/emotiv'; export const SET_TIMELINE = 'SET_TIMELINE'; export const SET_IS_RUNNING = 'SET_IS_RUNNING'; @@ -42,32 +81,84 @@ const cleanup = () => ({ // ------------------------------------------------------------------------- // Epics -const createNewWorkspaceEpic = action$ => action$.ofType(CREATE_NEW_WORKSPACE).pipe(pluck('payload'), tap(workspaceInfo => createWorkspaceDir(workspaceInfo.title)), mergeMap(workspaceInfo => of(setType(workspaceInfo.type), setParadigm(workspaceInfo.paradigm), setTitle(workspaceInfo.title), loadDefaultTimeline()))); - -const loadDefaultTimelineEpic = (action$, state$) => action$.ofType(LOAD_DEFAULT_TIMELINE).pipe(map(() => state$.value.experiment.paradigm), map(loadProtocol), map(setTimeline)); - -const startEpic = (action$, state$) => action$.ofType(START).pipe(filter(() => !state$.value.experiment.isRunning), map(() => { - if (state$.value.device.connectionStatus === CONNECTION_STATUS.CONNECTED) { - const writeStream = createEEGWriteStream(state$.value.experiment.title, state$.value.experiment.subject, state$.value.experiment.group, state$.value.experiment.session); - - writeHeader(writeStream, state$.value.device.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS : MUSE_CHANNELS); - - if (state$.value.device.deviceType === DEVICES.EMOTIV) { - createEmotivRecord(state$.value.experiment.subject, state$.value.experiment.session); - } - - state$.value.device.rawObservable.pipe(takeUntil(action$.ofType(STOP, EXPERIMENT_CLEANUP))).subscribe(eegData => writeEEGData(writeStream, eegData)); - } -}), mapTo(true), map(setIsRunning)); - -const experimentStopEpic = (action$, state$) => action$.ofType(STOP).pipe(filter(() => state$.value.experiment.isRunning), map(({ - payload -}) => { - storeBehaviouralData(payload.data, state$.value.experiment.title, state$.value.experiment.subject, state$.value.experiment.group, state$.value.experiment.session); - if (state$.value.experiment.isEEGEnabled && state$.value.device.deviceType === DEVICES.EMOTIV) { - stopEmotivRecord(); - } -}), mergeMap(() => of(setIsRunning(false)))); +const createNewWorkspaceEpic = action$ => + action$.ofType(CREATE_NEW_WORKSPACE).pipe( + pluck('payload'), + tap(workspaceInfo => createWorkspaceDir(workspaceInfo.title)), + mergeMap(workspaceInfo => + of( + setType(workspaceInfo.type), + setParadigm(workspaceInfo.paradigm), + setTitle(workspaceInfo.title), + loadDefaultTimeline() + ) + ) + ); + +const loadDefaultTimelineEpic = (action$, state$) => + action$.ofType(LOAD_DEFAULT_TIMELINE).pipe( + map(() => state$.value.experiment.paradigm), + map(loadProtocol), + map(setTimeline) + ); + +const startEpic = (action$, state$) => + action$.ofType(START).pipe( + filter(() => !state$.value.experiment.isRunning), + map(() => { + if ( + state$.value.device.connectionStatus === CONNECTION_STATUS.CONNECTED + ) { + const writeStream = createEEGWriteStream( + state$.value.experiment.title, + state$.value.experiment.subject, + state$.value.experiment.group, + state$.value.experiment.session + ); + + writeHeader( + writeStream, + state$.value.device.deviceType === DEVICES.EMOTIV + ? EMOTIV_CHANNELS + : MUSE_CHANNELS + ); + + if (state$.value.device.deviceType === DEVICES.EMOTIV) { + createEmotivRecord( + state$.value.experiment.subject, + state$.value.experiment.session + ); + } + + state$.value.device.rawObservable + .pipe(takeUntil(action$.ofType(STOP, EXPERIMENT_CLEANUP))) + .subscribe(eegData => writeEEGData(writeStream, eegData)); + } + }), + mapTo(true), + map(setIsRunning) + ); + +const experimentStopEpic = (action$, state$) => + action$.ofType(STOP).pipe( + filter(() => state$.value.experiment.isRunning), + map(({ payload }) => { + storeBehaviouralData( + payload.data, + state$.value.experiment.title, + state$.value.experiment.subject, + state$.value.experiment.group, + state$.value.experiment.session + ); + if ( + state$.value.experiment.isEEGEnabled && + state$.value.device.deviceType === DEVICES.EMOTIV + ) { + stopEmotivRecord(); + } + }), + mergeMap(() => of(setIsRunning(false))) + ); // const setSubjectEpic = action$ => // action$.ofType(SET_SUBJECT).pipe(map(updateSession)); @@ -75,20 +166,55 @@ const experimentStopEpic = (action$, state$) => action$.ofType(STOP).pipe(filter // const setGroupEpic = action$ => // action$.ofType(SET_GROUP).pipe(map(updateSession)); -const updateSessionEpic = (action$, state$) => action$.ofType(UPDATE_SESSION).pipe(mergeMap(() => from(readWorkspaceBehaviorData(state$.value.experiment.title))), map(behaviorFiles => { - if (behaviorFiles.length > 0) { - const subjectFiles = behaviorFiles.filter(filepath => filepath.name.startsWith(state$.value.experiment.subject)); - return subjectFiles.length + 1; - } - return 1; -}), map(setSession)); - -const autoSaveEpic = action$ => action$.ofType('@@router/LOCATION_CHANGE').pipe(pluck('payload', 'pathname'), filter(pathname => pathname !== '/' && pathname !== '/home'), map(saveWorkspace)); - -const saveWorkspaceEpic = (action$, state$) => action$.ofType(SAVE_WORKSPACE).pipe(throttleTime(1000), filter(() => state$.value.experiment.title.length > 1), map(() => getWorkspaceDir(state$.value.experiment.title)), tap(() => storeExperimentState(state$.value.experiment)), ignoreElements()); - -const navigationCleanupEpic = (action$, state$) => action$.ofType('@@router/LOCATION_CHANGE').pipe(pluck('payload', 'pathname'), filter(pathname => pathname === '/' || pathname === '/home'), tap(() => restoreExperimentState(state$.value.experiment)), map(cleanup)); - -export default combineEpics(loadDefaultTimelineEpic, createNewWorkspaceEpic, startEpic, experimentStopEpic, // setSubjectEpic, -// setGroupEpic, -updateSessionEpic, autoSaveEpic, saveWorkspaceEpic, navigationCleanupEpic); \ No newline at end of file +const updateSessionEpic = (action$, state$) => + action$.ofType(UPDATE_SESSION).pipe( + mergeMap(() => + from(readWorkspaceBehaviorData(state$.value.experiment.title)) + ), + map(behaviorFiles => { + if (behaviorFiles.length > 0) { + const subjectFiles = behaviorFiles.filter(filepath => + filepath.name.startsWith(state$.value.experiment.subject) + ); + return subjectFiles.length + 1; + } + return 1; + }), + map(setSession) + ); + +const autoSaveEpic = action$ => + action$.ofType('@@router/LOCATION_CHANGE').pipe( + pluck('payload', 'pathname'), + filter(pathname => pathname !== '/' && pathname !== '/home'), + map(saveWorkspace) + ); + +const saveWorkspaceEpic = (action$, state$) => + action$.ofType(SAVE_WORKSPACE).pipe( + throttleTime(1000), + filter(() => state$.value.experiment.title.length > 1), + map(() => getWorkspaceDir(state$.value.experiment.title)), + tap(() => storeExperimentState(state$.value.experiment)), + ignoreElements() + ); + +const navigationCleanupEpic = (action$, state$) => + action$.ofType('@@router/LOCATION_CHANGE').pipe( + pluck('payload', 'pathname'), + filter(pathname => pathname === '/' || pathname === '/home'), + tap(() => restoreExperimentState(state$.value.experiment)), + map(cleanup) + ); + +export default combineEpics( + loadDefaultTimelineEpic, + createNewWorkspaceEpic, + startEpic, + experimentStopEpic, // setSubjectEpic, + // setGroupEpic, + updateSessionEpic, + autoSaveEpic, + saveWorkspaceEpic, + navigationCleanupEpic +); diff --git a/app/epics/index.ts b/app/epics/index.ts index cbb31acc..076d6cbe 100644 --- a/app/epics/index.ts +++ b/app/epics/index.ts @@ -1,6 +1,6 @@ -import { combineEpics } from "redux-observable"; -import jupyter from "./jupyterEpics"; -import device from "./deviceEpics"; -import experiment from "./experimentEpics"; +import { combineEpics } from 'redux-observable'; +import jupyter from './jupyterEpics'; +import device from './deviceEpics'; +import experiment from './experimentEpics'; -export default combineEpics(device, jupyter, experiment); \ No newline at end of file +export default combineEpics(device, jupyter, experiment); diff --git a/app/epics/jupyterEpics.ts b/app/epics/jupyterEpics.ts index 5b77e6de..441b5997 100644 --- a/app/epics/jupyterEpics.ts +++ b/app/epics/jupyterEpics.ts @@ -1,18 +1,62 @@ -import { combineEpics } from "redux-observable"; -import { from, of } from "rxjs"; -import { map, mergeMap, tap, pluck, ignoreElements, filter, take } from "rxjs/operators"; -import { find } from "kernelspecs"; -import { launchSpec } from "spawnteract"; -import { createMainChannel } from "enchannel-zmq-backend"; -import { isNil } from "lodash"; -import { kernelInfoRequest, executeRequest } from "@nteract/messaging"; -import { toast } from "react-toastify"; -import { execute, awaitOkMessage } from "../utils/jupyter/pipes"; -import { getWorkspaceDir } from "../utils/filesystem/storage"; -import { LAUNCH_KERNEL, REQUEST_KERNEL_INFO, LOAD_EPOCHS, LOAD_CLEANED_EPOCHS, LOAD_PSD, LOAD_ERP, LOAD_TOPO, CLEAN_EPOCHS, CLOSE_KERNEL, loadTopo, loadERP } from "../actions/jupyterActions"; -import { imports, utils, loadCSV, loadCleanedEpochs, filterIIR, epochEvents, requestEpochsInfo, requestChannelInfo, cleanEpochsPlot, plotPSD, plotERP, plotTopoMap, saveEpochs } from "../utils/jupyter/cells"; -import { EMOTIV_CHANNELS, EVENTS, DEVICES, MUSE_CHANNELS, JUPYTER_VARIABLE_NAMES } from "../constants/constants"; -import { parseSingleQuoteJSON, parseKernelStatus, debugParseMessage } from "../utils/jupyter/functions"; +import { combineEpics } from 'redux-observable'; +import { from, of } from 'rxjs'; +import { + map, + mergeMap, + tap, + pluck, + ignoreElements, + filter, + take +} from 'rxjs/operators'; +import { find } from 'kernelspecs'; +import { launchSpec } from 'spawnteract'; +import { createMainChannel } from 'enchannel-zmq-backend'; +import { isNil } from 'lodash'; +import { kernelInfoRequest, executeRequest } from '@nteract/messaging'; +import { toast } from 'react-toastify'; +import { execute, awaitOkMessage } from '../utils/jupyter/pipes'; +import { getWorkspaceDir } from '../utils/filesystem/storage'; +import { + LAUNCH_KERNEL, + REQUEST_KERNEL_INFO, + LOAD_EPOCHS, + LOAD_CLEANED_EPOCHS, + LOAD_PSD, + LOAD_ERP, + LOAD_TOPO, + CLEAN_EPOCHS, + CLOSE_KERNEL, + loadTopo, + loadERP +} from '../actions/jupyterActions'; +import { + imports, + utils, + loadCSV, + loadCleanedEpochs, + filterIIR, + epochEvents, + requestEpochsInfo, + requestChannelInfo, + cleanEpochsPlot, + plotPSD, + plotERP, + plotTopoMap, + saveEpochs +} from '../utils/jupyter/cells'; +import { + EMOTIV_CHANNELS, + EVENTS, + DEVICES, + MUSE_CHANNELS, + JUPYTER_VARIABLE_NAMES +} from '../constants/constants'; +import { + parseSingleQuoteJSON, + parseKernelStatus, + debugParseMessage +} from '../utils/jupyter/functions'; export const GET_EPOCHS_INFO = 'GET_EPOCHS_INFO'; export const GET_CHANNEL_INFO = 'GET_CHANNEL_INFO'; @@ -105,93 +149,296 @@ const receiveStream = payload => ({ // ------------------------------------------------------------------------- // Epics -const launchEpic = action$ => action$.ofType(LAUNCH_KERNEL).pipe(mergeMap(() => from(find('brainwaves'))), tap(kernelInfo => { - if (isNil(kernelInfo)) { - toast.error("Could not find 'brainwaves' jupyter kernel. Have you installed Python?"); - } -}), filter(kernelInfo => !isNil(kernelInfo)), mergeMap(kernelInfo => from(launchSpec(kernelInfo.spec, { - // No STDIN, opt in to STDOUT and STDERR as node streams - stdio: ['ignore', 'pipe', 'pipe'] -}))), tap(kernel => { - // Route everything that we won't get in messages to our own stdout - kernel.spawn.stdout.on('data', data => { - const text = data.toString(); - console.log('KERNEL STDOUT: ', text); - }); - kernel.spawn.stderr.on('data', data => { - const text = data.toString(); - console.log('KERNEL STDERR: ', text); - toast.error('Jupyter: ', text); - }); - - kernel.spawn.on('close', () => { - console.log('Kernel closed'); - }); -}), map(setKernel)); - -const setUpChannelEpic = action$ => action$.ofType(SET_KERNEL).pipe(pluck('payload'), mergeMap(kernel => from(createMainChannel(kernel.config))), tap(mainChannel => mainChannel.next(executeRequest(imports()))), tap(mainChannel => mainChannel.next(executeRequest(utils()))), map(setMainChannel)); - -const receiveChannelMessageEpic = (action$, state$) => action$.ofType(SET_MAIN_CHANNEL).pipe(mergeMap(() => state$.value.jupyter.mainChannel.pipe(map(msg => { - console.log(debugParseMessage(msg)); - switch (msg['header']['msg_type']) { - case 'kernel_info_reply': - return setKernelInfo(msg); - case 'status': - return setKernelStatus(parseKernelStatus(msg)); - case 'stream': - return receiveStream(msg); - case 'execute_reply': - return receiveExecuteReply(msg); - case 'execute_result': - return receiveExecuteResult(msg); - case 'display_data': - return receiveDisplayData(msg); - default: - } -}), filter(action => !isNil(action))))); - -const requestKernelInfoEpic = (action$, state$) => action$.ofType(REQUEST_KERNEL_INFO).pipe(filter(() => state$.value.jupyter.mainChannel), map(() => state$.value.jupyter.mainChannel.next(kernelInfoRequest())), ignoreElements()); - -const loadEpochsEpic = (action$, state$) => action$.ofType(LOAD_EPOCHS).pipe(pluck('payload'), filter(filePathsArray => filePathsArray.length >= 1), map(filePathsArray => state$.value.jupyter.mainChannel.next(executeRequest(loadCSV(filePathsArray)))), awaitOkMessage(action$), execute(filterIIR(1, 30), state$), awaitOkMessage(action$), map(() => epochEvents({ - [state$.value.experiment.params.stimulus1.title]: EVENTS.STIMULUS_1, - [state$.value.experiment.params.stimulus2.title]: EVENTS.STIMULUS_2, - [state$.value.experiment.params.stimulus3.title]: EVENTS.STIMULUS_3, - [state$.value.experiment.params.stimulus4.title]: EVENTS.STIMULUS_4 -}, -0.1, 0.8)), tap(e => { - console.log('e', e); -}), map(epochEventsCommand => state$.value.jupyter.mainChannel.next(executeRequest(epochEventsCommand))), awaitOkMessage(action$), map(() => getEpochsInfo(JUPYTER_VARIABLE_NAMES.RAW_EPOCHS))); - -const loadCleanedEpochsEpic = (action$, state$) => action$.ofType(LOAD_CLEANED_EPOCHS).pipe(pluck('payload'), filter(filePathsArray => filePathsArray.length >= 1), map(filePathsArray => state$.value.jupyter.mainChannel.next(executeRequest(loadCleanedEpochs(filePathsArray)))), awaitOkMessage(action$), mergeMap(() => of(getEpochsInfo(JUPYTER_VARIABLE_NAMES.CLEAN_EPOCHS), getChannelInfo(), loadTopo()))); - -const cleanEpochsEpic = (action$, state$) => action$.ofType(CLEAN_EPOCHS).pipe(execute(cleanEpochsPlot(), state$), mergeMap(() => action$.ofType(RECEIVE_STREAM).pipe(pluck('payload'), filter(msg => msg.channel === 'iopub' && msg.content.text.includes('Channels marked as bad')), take(1))), map(() => state$.value.jupyter.mainChannel.next(executeRequest(saveEpochs(getWorkspaceDir(state$.value.experiment.title), state$.value.experiment.subject)))), awaitOkMessage(action$), map(() => getEpochsInfo(JUPYTER_VARIABLE_NAMES.RAW_EPOCHS))); - -const getEpochsInfoEpic = (action$, state$) => action$.ofType(GET_EPOCHS_INFO).pipe(pluck('payload'), map(variableName => state$.value.jupyter.mainChannel.next(executeRequest(requestEpochsInfo(variableName)))), mergeMap(() => action$.ofType(RECEIVE_EXECUTE_RESULT).pipe(pluck('payload'), filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), pluck('content', 'data', 'text/plain'), filter(msg => msg.includes('Drop Percentage')), take(1))), map(epochInfoString => parseSingleQuoteJSON(epochInfoString).map(infoObj => ({ - name: Object.keys(infoObj)[0], - value: infoObj[Object.keys(infoObj)[0]] -}))), map(setEpochInfo)); - -const getChannelInfoEpic = (action$, state$) => action$.ofType(GET_CHANNEL_INFO).pipe(execute(requestChannelInfo(), state$), mergeMap(() => action$.ofType(RECEIVE_EXECUTE_RESULT).pipe(pluck('payload'), filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), pluck('content', 'data', 'text/plain'), // Filter to prevent this from reading requestEpochsInfo returns -filter(msg => !msg.includes('Drop Percentage')), take(1))), map(channelInfoString => setChannelInfo(parseSingleQuoteJSON(channelInfoString)))); - -const loadPSDEpic = (action$, state$) => action$.ofType(LOAD_PSD).pipe(execute(plotPSD(), state$), mergeMap(() => action$.ofType(RECEIVE_DISPLAY_DATA).pipe(pluck('payload'), // PSD graphs should have two axes -filter(msg => msg.content.data['text/plain'].includes('2 Axes')), pluck('content', 'data'), take(1))), map(setPSDPlot)); - -const loadTopoEpic = (action$, state$) => action$.ofType(LOAD_TOPO).pipe(execute(plotTopoMap(), state$), mergeMap(() => action$.ofType(RECEIVE_DISPLAY_DATA).pipe(pluck('payload'), pluck('content', 'data'), take(1))), mergeMap(topoPlot => of(setTopoPlot(topoPlot), loadERP(state$.value.device.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS[0] : MUSE_CHANNELS[0])))); - -const loadERPEpic = (action$, state$) => action$.ofType(LOAD_ERP).pipe(pluck('payload'), map(channelName => { - if (MUSE_CHANNELS.includes(channelName)) { - return MUSE_CHANNELS.indexOf(channelName); - } else if (EMOTIV_CHANNELS.includes(channelName)) { - return EMOTIV_CHANNELS.indexOf(channelName); - } - console.warn('channel name supplied to loadERPEpic does not belong to either device'); - return EMOTIV_CHANNELS[0]; -}), map(channelIndex => state$.value.jupyter.mainChannel.next(executeRequest(plotERP(channelIndex)))), mergeMap(() => action$.ofType(RECEIVE_DISPLAY_DATA).pipe(pluck('payload'), // ERP graphs should have 1 axis according to MNE -filter(msg => msg.content.data['text/plain'].includes('1 Axes')), pluck('content', 'data'), take(1))), map(setERPPlot)); - -const closeKernelEpic = (action$, state$) => action$.ofType(CLOSE_KERNEL).pipe(map(() => { - state$.value.jupyter.kernel.spawn.kill(); - state$.value.jupyter.mainChannel.complete(); -}), ignoreElements()); - -export default combineEpics(launchEpic, setUpChannelEpic, requestKernelInfoEpic, receiveChannelMessageEpic, loadEpochsEpic, loadCleanedEpochsEpic, cleanEpochsEpic, getEpochsInfoEpic, getChannelInfoEpic, loadPSDEpic, loadTopoEpic, loadERPEpic, closeKernelEpic); \ No newline at end of file +const launchEpic = action$ => + action$.ofType(LAUNCH_KERNEL).pipe( + mergeMap(() => from(find('brainwaves'))), + tap(kernelInfo => { + if (isNil(kernelInfo)) { + toast.error( + "Could not find 'brainwaves' jupyter kernel. Have you installed Python?" + ); + } + }), + filter(kernelInfo => !isNil(kernelInfo)), + mergeMap(kernelInfo => + from( + launchSpec(kernelInfo.spec, { + // No STDIN, opt in to STDOUT and STDERR as node streams + stdio: ['ignore', 'pipe', 'pipe'] + }) + ) + ), + tap(kernel => { + // Route everything that we won't get in messages to our own stdout + kernel.spawn.stdout.on('data', data => { + const text = data.toString(); + console.log('KERNEL STDOUT: ', text); + }); + kernel.spawn.stderr.on('data', data => { + const text = data.toString(); + console.log('KERNEL STDERR: ', text); + toast.error('Jupyter: ', text); + }); + + kernel.spawn.on('close', () => { + console.log('Kernel closed'); + }); + }), + map(setKernel) + ); + +const setUpChannelEpic = action$ => + action$.ofType(SET_KERNEL).pipe( + pluck('payload'), + mergeMap(kernel => from(createMainChannel(kernel.config))), + tap(mainChannel => mainChannel.next(executeRequest(imports()))), + tap(mainChannel => mainChannel.next(executeRequest(utils()))), + map(setMainChannel) + ); + +const receiveChannelMessageEpic = (action$, state$) => + action$.ofType(SET_MAIN_CHANNEL).pipe( + mergeMap(() => + state$.value.jupyter.mainChannel.pipe( + map(msg => { + console.log(debugParseMessage(msg)); + switch (msg['header']['msg_type']) { + case 'kernel_info_reply': + return setKernelInfo(msg); + case 'status': + return setKernelStatus(parseKernelStatus(msg)); + case 'stream': + return receiveStream(msg); + case 'execute_reply': + return receiveExecuteReply(msg); + case 'execute_result': + return receiveExecuteResult(msg); + case 'display_data': + return receiveDisplayData(msg); + default: + } + }), + filter(action => !isNil(action)) + ) + ) + ); + +const requestKernelInfoEpic = (action$, state$) => + action$.ofType(REQUEST_KERNEL_INFO).pipe( + filter(() => state$.value.jupyter.mainChannel), + map(() => state$.value.jupyter.mainChannel.next(kernelInfoRequest())), + ignoreElements() + ); + +const loadEpochsEpic = (action$, state$) => + action$.ofType(LOAD_EPOCHS).pipe( + pluck('payload'), + filter(filePathsArray => filePathsArray.length >= 1), + map(filePathsArray => + state$.value.jupyter.mainChannel.next( + executeRequest(loadCSV(filePathsArray)) + ) + ), + awaitOkMessage(action$), + execute(filterIIR(1, 30), state$), + awaitOkMessage(action$), + map(() => + epochEvents( + { + [state$.value.experiment.params.stimulus1.title]: EVENTS.STIMULUS_1, + [state$.value.experiment.params.stimulus2.title]: EVENTS.STIMULUS_2, + [state$.value.experiment.params.stimulus3.title]: EVENTS.STIMULUS_3, + [state$.value.experiment.params.stimulus4.title]: EVENTS.STIMULUS_4 + }, + -0.1, + 0.8 + ) + ), + tap(e => { + console.log('e', e); + }), + map(epochEventsCommand => + state$.value.jupyter.mainChannel.next(executeRequest(epochEventsCommand)) + ), + awaitOkMessage(action$), + map(() => getEpochsInfo(JUPYTER_VARIABLE_NAMES.RAW_EPOCHS)) + ); + +const loadCleanedEpochsEpic = (action$, state$) => + action$.ofType(LOAD_CLEANED_EPOCHS).pipe( + pluck('payload'), + filter(filePathsArray => filePathsArray.length >= 1), + map(filePathsArray => + state$.value.jupyter.mainChannel.next( + executeRequest(loadCleanedEpochs(filePathsArray)) + ) + ), + awaitOkMessage(action$), + mergeMap(() => + of( + getEpochsInfo(JUPYTER_VARIABLE_NAMES.CLEAN_EPOCHS), + getChannelInfo(), + loadTopo() + ) + ) + ); + +const cleanEpochsEpic = (action$, state$) => + action$.ofType(CLEAN_EPOCHS).pipe( + execute(cleanEpochsPlot(), state$), + mergeMap(() => + action$.ofType(RECEIVE_STREAM).pipe( + pluck('payload'), + filter( + msg => + msg.channel === 'iopub' && + msg.content.text.includes('Channels marked as bad') + ), + take(1) + ) + ), + map(() => + state$.value.jupyter.mainChannel.next( + executeRequest( + saveEpochs( + getWorkspaceDir(state$.value.experiment.title), + state$.value.experiment.subject + ) + ) + ) + ), + awaitOkMessage(action$), + map(() => getEpochsInfo(JUPYTER_VARIABLE_NAMES.RAW_EPOCHS)) + ); + +const getEpochsInfoEpic = (action$, state$) => + action$.ofType(GET_EPOCHS_INFO).pipe( + pluck('payload'), + map(variableName => + state$.value.jupyter.mainChannel.next( + executeRequest(requestEpochsInfo(variableName)) + ) + ), + mergeMap(() => + action$.ofType(RECEIVE_EXECUTE_RESULT).pipe( + pluck('payload'), + filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), + pluck('content', 'data', 'text/plain'), + filter(msg => msg.includes('Drop Percentage')), + take(1) + ) + ), + map(epochInfoString => + parseSingleQuoteJSON(epochInfoString).map(infoObj => ({ + name: Object.keys(infoObj)[0], + value: infoObj[Object.keys(infoObj)[0]] + })) + ), + map(setEpochInfo) + ); + +const getChannelInfoEpic = (action$, state$) => + action$.ofType(GET_CHANNEL_INFO).pipe( + execute(requestChannelInfo(), state$), + mergeMap(() => + action$.ofType(RECEIVE_EXECUTE_RESULT).pipe( + pluck('payload'), + filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), + pluck('content', 'data', 'text/plain'), // Filter to prevent this from reading requestEpochsInfo returns + filter(msg => !msg.includes('Drop Percentage')), + take(1) + ) + ), + map(channelInfoString => + setChannelInfo(parseSingleQuoteJSON(channelInfoString)) + ) + ); + +const loadPSDEpic = (action$, state$) => + action$.ofType(LOAD_PSD).pipe( + execute(plotPSD(), state$), + mergeMap(() => + action$.ofType(RECEIVE_DISPLAY_DATA).pipe( + pluck('payload'), // PSD graphs should have two axes + filter(msg => msg.content.data['text/plain'].includes('2 Axes')), + pluck('content', 'data'), + take(1) + ) + ), + map(setPSDPlot) + ); + +const loadTopoEpic = (action$, state$) => + action$.ofType(LOAD_TOPO).pipe( + execute(plotTopoMap(), state$), + mergeMap(() => + action$ + .ofType(RECEIVE_DISPLAY_DATA) + .pipe(pluck('payload'), pluck('content', 'data'), take(1)) + ), + mergeMap(topoPlot => + of( + setTopoPlot(topoPlot), + loadERP( + state$.value.device.deviceType === DEVICES.EMOTIV + ? EMOTIV_CHANNELS[0] + : MUSE_CHANNELS[0] + ) + ) + ) + ); + +const loadERPEpic = (action$, state$) => + action$.ofType(LOAD_ERP).pipe( + pluck('payload'), + map(channelName => { + if (MUSE_CHANNELS.includes(channelName)) { + return MUSE_CHANNELS.indexOf(channelName); + } else if (EMOTIV_CHANNELS.includes(channelName)) { + return EMOTIV_CHANNELS.indexOf(channelName); + } + console.warn( + 'channel name supplied to loadERPEpic does not belong to either device' + ); + return EMOTIV_CHANNELS[0]; + }), + map(channelIndex => + state$.value.jupyter.mainChannel.next( + executeRequest(plotERP(channelIndex)) + ) + ), + mergeMap(() => + action$.ofType(RECEIVE_DISPLAY_DATA).pipe( + pluck('payload'), // ERP graphs should have 1 axis according to MNE + filter(msg => msg.content.data['text/plain'].includes('1 Axes')), + pluck('content', 'data'), + take(1) + ) + ), + map(setERPPlot) + ); + +const closeKernelEpic = (action$, state$) => + action$.ofType(CLOSE_KERNEL).pipe( + map(() => { + state$.value.jupyter.kernel.spawn.kill(); + state$.value.jupyter.mainChannel.complete(); + }), + ignoreElements() + ); + +export default combineEpics( + launchEpic, + setUpChannelEpic, + requestKernelInfoEpic, + receiveChannelMessageEpic, + loadEpochsEpic, + loadCleanedEpochsEpic, + cleanEpochsEpic, + getEpochsInfoEpic, + getChannelInfoEpic, + loadPSDEpic, + loadTopoEpic, + loadERPEpic, + closeKernelEpic +); diff --git a/app/reducers/deviceReducer.ts b/app/reducers/deviceReducer.ts index ed8dc525..e3b490b0 100644 --- a/app/reducers/deviceReducer.ts +++ b/app/reducers/deviceReducer.ts @@ -1,9 +1,20 @@ - -import { Observable } from "rxjs"; -import { SET_DEVICE_INFO, SET_DEVICE_TYPE, SET_AVAILABLE_DEVICES, SET_CONNECTION_STATUS, SET_RAW_OBSERVABLE, SET_SIGNAL_OBSERVABLE, DEVICE_CLEANUP } from "../epics/deviceEpics"; -import { DEVICES, CONNECTION_STATUS, DEVICE_AVAILABILITY } from "../constants/constants"; -import { ActionType, DeviceInfo } from "../constants/interfaces"; -import { SET_DEVICE_AVAILABILITY } from "../actions/deviceActions"; +import { Observable } from 'rxjs'; +import { + SET_DEVICE_INFO, + SET_DEVICE_TYPE, + SET_AVAILABLE_DEVICES, + SET_CONNECTION_STATUS, + SET_RAW_OBSERVABLE, + SET_SIGNAL_OBSERVABLE, + DEVICE_CLEANUP +} from '../epics/deviceEpics'; +import { + DEVICES, + CONNECTION_STATUS, + DEVICE_AVAILABILITY +} from '../constants/constants'; +import { ActionType, DeviceInfo } from '../constants/interfaces'; +import { SET_DEVICE_AVAILABILITY } from '../actions/deviceActions'; interface DeviceStateType { readonly availableDevices: Array; @@ -25,7 +36,10 @@ const initialState = { deviceType: DEVICES.EMOTIV }; -export default function device(state: DeviceStateType = initialState, action: ActionType) { +export default function device( + state: DeviceStateType = initialState, + action: ActionType +) { switch (action.type) { case SET_DEVICE_TYPE: return { @@ -74,6 +88,5 @@ export default function device(state: DeviceStateType = initialState, action: Ac default: return state; - } -} \ No newline at end of file +} diff --git a/app/reducers/experimentReducer.ts b/app/reducers/experimentReducer.ts index 8917676f..891a35a2 100644 --- a/app/reducers/experimentReducer.ts +++ b/app/reducers/experimentReducer.ts @@ -1,8 +1,28 @@ - -import { SET_TIMELINE, SET_IS_RUNNING, SET_SESSION, EXPERIMENT_CLEANUP } from "../epics/experimentEpics"; -import { SET_TYPE, SET_PARADIGM, SET_SUBJECT, SET_GROUP, SET_TITLE, SET_EXPERIMENT_STATE, SET_PARAMS, SET_DESCRIPTION, SET_EEG_ENABLED } from "../actions/experimentActions"; -import { EXPERIMENTS } from "../constants/constants"; -import { MainTimeline, Trial, ActionType, ExperimentDescription, ExperimentParameters } from "../constants/interfaces"; +import { + SET_TIMELINE, + SET_IS_RUNNING, + SET_SESSION, + EXPERIMENT_CLEANUP +} from '../epics/experimentEpics'; +import { + SET_TYPE, + SET_PARADIGM, + SET_SUBJECT, + SET_GROUP, + SET_TITLE, + SET_EXPERIMENT_STATE, + SET_PARAMS, + SET_DESCRIPTION, + SET_EEG_ENABLED +} from '../actions/experimentActions'; +import { EXPERIMENTS } from '../constants/constants'; +import { + MainTimeline, + Trial, + ActionType, + ExperimentDescription, + ExperimentParameters +} from '../constants/interfaces'; export interface ExperimentStateType { readonly type: EXPERIMENTS | null | undefined; @@ -38,7 +58,10 @@ const initialState = { description: { question: '', hypothesis: '', methods: '' } }; -export default function experiment(state: ExperimentStateType = initialState, action: ActionType) { +export default function experiment( + state: ExperimentStateType = initialState, + action: ActionType +) { switch (action.type) { case SET_TYPE: return { @@ -116,6 +139,5 @@ export default function experiment(state: ExperimentStateType = initialState, ac default: return state; - } -} \ No newline at end of file +} diff --git a/app/reducers/jupyterReducer.ts b/app/reducers/jupyterReducer.ts index db51901d..cd08d995 100644 --- a/app/reducers/jupyterReducer.ts +++ b/app/reducers/jupyterReducer.ts @@ -1,26 +1,48 @@ - -import { SET_KERNEL, SET_KERNEL_STATUS, SET_MAIN_CHANNEL, SET_KERNEL_INFO, SET_EPOCH_INFO, SET_CHANNEL_INFO, SET_PSD_PLOT, SET_TOPO_PLOT, SET_ERP_PLOT, RECEIVE_EXECUTE_RETURN } from "../epics/jupyterEpics"; -import { ActionType, Kernel } from "../constants/interfaces"; -import { KERNEL_STATUS } from "../constants/constants"; -import { EXPERIMENT_CLEANUP } from "../epics/experimentEpics"; +import { + SET_KERNEL, + SET_KERNEL_STATUS, + SET_MAIN_CHANNEL, + SET_KERNEL_INFO, + SET_EPOCH_INFO, + SET_CHANNEL_INFO, + SET_PSD_PLOT, + SET_TOPO_PLOT, + SET_ERP_PLOT, + RECEIVE_EXECUTE_RETURN +} from '../epics/jupyterEpics'; +import { ActionType, Kernel } from '../constants/interfaces'; +import { KERNEL_STATUS } from '../constants/constants'; +import { EXPERIMENT_CLEANUP } from '../epics/experimentEpics'; export interface JupyterStateType { readonly kernel: Kernel | null | undefined; readonly kernelStatus: KERNEL_STATUS; readonly mainChannel: any | null | undefined; - readonly epochsInfo: Array<{ - [key: string]: number | string; - }> | null | undefined; + readonly epochsInfo: + | Array<{ + [key: string]: number | string; + }> + | null + | undefined; readonly channelInfo: Array | null | undefined; - readonly psdPlot: { - [key: string]: string; - } | null | undefined; - readonly topoPlot: { - [key: string]: string; - } | null | undefined; - readonly erpPlot: { - [key: string]: string; - } | null | undefined; + readonly psdPlot: + | { + [key: string]: string; + } + | null + | undefined; + readonly topoPlot: + | { + [key: string]: string; + } + | null + | undefined; + readonly erpPlot: + | { + [key: string]: string; + } + | null + | undefined; } const initialState = { @@ -34,7 +56,10 @@ const initialState = { erpPlot: null }; -export default function jupyter(state: JupyterStateType = initialState, action: ActionType) { +export default function jupyter( + state: JupyterStateType = initialState, + action: ActionType +) { switch (action.type) { case SET_KERNEL: return { @@ -100,6 +125,5 @@ export default function jupyter(state: JupyterStateType = initialState, action: default: return state; - } -} \ No newline at end of file +} diff --git a/app/store/configureStore.dev.ts b/app/store/configureStore.dev.ts index 54d8f116..07b7a4fc 100644 --- a/app/store/configureStore.dev.ts +++ b/app/store/configureStore.dev.ts @@ -1,13 +1,13 @@ -import { createStore, applyMiddleware, compose } from "redux"; -import thunk from "redux-thunk"; -import { createEpicMiddleware } from "redux-observable"; -import { createHashHistory } from "history"; -import { routerMiddleware, routerActions } from "react-router-redux"; -import { createLogger } from "redux-logger"; -import rootReducer from "../reducers"; -import rootEpic from "../epics"; -import * as jupyterActions from "../actions/jupyterActions"; -import * as deviceActions from "../actions/deviceActions"; +import { createStore, applyMiddleware, compose } from 'redux'; +import thunk from 'redux-thunk'; +import { createEpicMiddleware } from 'redux-observable'; +import { createHashHistory } from 'history'; +import { routerMiddleware, routerActions } from 'react-router-redux'; +import { createLogger } from 'redux-logger'; +import rootReducer from '../reducers'; +import rootEpic from '../epics'; +import * as jupyterActions from '../actions/jupyterActions'; +import * as deviceActions from '../actions/deviceActions'; const history = createHashHistory(); @@ -47,10 +47,12 @@ const configureStore = (initialState?: AppState) => { // If Redux DevTools Extension is installed use it, otherwise use Redux compose /* eslint-disable no-underscore-dangle */ - const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ - // Options: http://zalmoxisus.github.io/redux-devtools-extension/API/Arguments.html - actionCreators - }) : compose; + const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ + ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ + // Options: http://zalmoxisus.github.io/redux-devtools-extension/API/Arguments.html + actionCreators + }) + : compose; /* eslint-enable no-underscore-dangle */ @@ -62,7 +64,9 @@ const configureStore = (initialState?: AppState) => { const store = createStore(rootReducer, initialState, enhancer); if (module.hot) { - module.hot.accept('../reducers', () => store.replaceReducer(require('../reducers')) // eslint-disable-line global-require + module.hot.accept( + '../reducers', + () => store.replaceReducer(require('../reducers')) // eslint-disable-line global-require ); } @@ -72,4 +76,4 @@ const configureStore = (initialState?: AppState) => { return store; }; -export default { configureStore, history }; \ No newline at end of file +export default { configureStore, history }; diff --git a/app/store/configureStore.prod.ts b/app/store/configureStore.prod.ts index 0a54869e..2f224d10 100644 --- a/app/store/configureStore.prod.ts +++ b/app/store/configureStore.prod.ts @@ -1,12 +1,11 @@ +import { createStore, applyMiddleware } from 'redux'; +import thunk from 'redux-thunk'; +import { createHashHistory } from 'history'; +import { createEpicMiddleware } from 'redux-observable'; +import rootEpic from '../epics'; -import { createStore, applyMiddleware } from "redux"; -import thunk from "redux-thunk"; -import { createHashHistory } from "history"; -import { createEpicMiddleware } from "redux-observable"; -import rootEpic from "../epics"; - -import { routerMiddleware } from "react-router-redux"; -import rootReducer from "../reducers"; +import { routerMiddleware } from 'react-router-redux'; +import rootReducer from '../reducers'; const history = createHashHistory(); const epicMiddleware = createEpicMiddleware(); @@ -19,4 +18,4 @@ function configureStore(initialState?: any) { return store; } -export default { configureStore, history }; \ No newline at end of file +export default { configureStore, history }; diff --git a/app/store/configureStore.ts b/app/store/configureStore.ts index 4c9eee39..e0c7e576 100644 --- a/app/store/configureStore.ts +++ b/app/store/configureStore.ts @@ -1,12 +1,11 @@ -import configureStoreDev from "./configureStore.dev"; -import configureStoreProd from "./configureStore.prod"; +import configureStoreDev from './configureStore.dev'; +import configureStoreProd from './configureStore.prod'; -const selectedConfigureStore = process.env.NODE_ENV === 'production' ? configureStoreProd : configureStoreDev; +const selectedConfigureStore = + process.env.NODE_ENV === 'production' + ? configureStoreProd + : configureStoreDev; -export const { - configureStore -} = selectedConfigureStore; +export const { configureStore } = selectedConfigureStore; -export const { - history -} = selectedConfigureStore; \ No newline at end of file +export const { history } = selectedConfigureStore; diff --git a/app/utils/behavior/compute.ts b/app/utils/behavior/compute.ts index 966b4344..1efc46b3 100644 --- a/app/utils/behavior/compute.ts +++ b/app/utils/behavior/compute.ts @@ -1,5 +1,5 @@ -import * as ss from "simple-statistics"; -import * as path from "path"; +import * as ss from 'simple-statistics'; +import * as path from 'path'; export const aggregateBehaviorDataToSave = (data, removeOutliers) => { const processedData = data.map(result => { @@ -11,14 +11,34 @@ export const aggregateBehaviorDataToSave = (data, removeOutliers) => { const aggregatedData = processedData.map(e => { const conditionsArray = e.map(row => row.condition); const unsortedConditions = [...new Set(conditionsArray)].sort(); - const conditions = unsortedConditions.sort((a, b) => parseInt(a) - parseInt(b)); + const conditions = unsortedConditions.sort( + (a, b) => parseInt(a) - parseInt(b) + ); let rtMean = {}, - accuracyPercent = {}; + accuracyPercent = {}; for (const condition of conditions) { - const rt = e.filter(row => row.response_given === 'yes').filter(row => row.correct_response === 'true').filter(row => row.condition === condition).map(row => row.reaction_time).map(value => parseFloat(value)); + const rt = e + .filter(row => row.response_given === 'yes') + .filter(row => row.correct_response === 'true') + .filter(row => row.condition === condition) + .map(row => row.reaction_time) + .map(value => parseFloat(value)); rtMean[condition] = Math.round(ss.mean(rt)); - const accuracy = e.filter(row => row.condition === condition && row.correct_response === 'true' && row.response_given === 'yes'); - accuracyPercent[condition] = accuracy.length ? Math.round(100 * (accuracy.length / e.filter(r => r.condition === condition).length)) : ss.mean(e.filter(r => r.condition === condition).map(r => r.accuracy)); + const accuracy = e.filter( + row => + row.condition === condition && + row.correct_response === 'true' && + row.response_given === 'yes' + ); + accuracyPercent[condition] = accuracy.length + ? Math.round( + 100 * + (accuracy.length / + e.filter(r => r.condition === condition).length) + ) + : ss.mean( + e.filter(r => r.condition === condition).map(r => r.accuracy) + ); } const row = { subject: e.map(r => r.subject)[0], @@ -34,7 +54,13 @@ export const aggregateBehaviorDataToSave = (data, removeOutliers) => { return aggregatedData; }; -export const aggregateDataForPlot = (data, dependentVariable, removeOutliers, showDataPoints, displayMode) => { +export const aggregateDataForPlot = ( + data, + dependentVariable, + removeOutliers, + showDataPoints, + displayMode +) => { if (data && data.length > 0) { const processedData = data.map(result => { if (path.basename(result.meta.datafile).includes('aggregated')) { @@ -43,73 +69,140 @@ export const aggregateDataForPlot = (data, dependentVariable, removeOutliers, sh return filterData(result, removeOutliers); }); const colors = ['#28619E', '#3DBBDB']; - const unsortedConditions = [...new Set(processedData[0].map(row => row.condition))].sort(); - const conditions = unsortedConditions.sort((a, b) => parseInt(a) - parseInt(b)); + const unsortedConditions = [ + ...new Set(processedData[0].map(row => row.condition)) + ].sort(); + const conditions = unsortedConditions.sort( + (a, b) => parseInt(a) - parseInt(b) + ); switch (dependentVariable) { - case 'RT':default: - return computeRT(processedData, dependentVariable, conditions, showDataPoints, colors, displayMode); + case 'RT': + default: + return computeRT( + processedData, + dependentVariable, + conditions, + showDataPoints, + colors, + displayMode + ); case 'Accuracy': - return computeAccuracy(processedData, dependentVariable, conditions, showDataPoints, colors, displayMode); - + return computeAccuracy( + processedData, + dependentVariable, + conditions, + showDataPoints, + colors, + displayMode + ); } } }; const transformAggregated = result => { - const unsortedConditions = result.meta.fields.filter(field => field.startsWith('RT_')).map(c => c.split('RT_')[1]).sort(); - const conditions = unsortedConditions.sort((a, b) => parseInt(a) - parseInt(b)); - const transformed = conditions.map(condition => result.data.map(e => ({ - reaction_time: parseFloat(e[`RT_${condition}`]), - subject: path.parse(result.meta.datafile).name, - condition, - group: e.group, - session: e.session, - accuracy: parseFloat(e[`Accuracy_${condition}`]), - response_given: 'yes', - correct_response: 'true' - }))); + const unsortedConditions = result.meta.fields + .filter(field => field.startsWith('RT_')) + .map(c => c.split('RT_')[1]) + .sort(); + const conditions = unsortedConditions.sort( + (a, b) => parseInt(a) - parseInt(b) + ); + const transformed = conditions.map(condition => + result.data.map(e => ({ + reaction_time: parseFloat(e[`RT_${condition}`]), + subject: path.parse(result.meta.datafile).name, + condition, + group: e.group, + session: e.session, + accuracy: parseFloat(e[`Accuracy_${condition}`]), + response_given: 'yes', + correct_response: 'true' + })) + ); const data = transformed.reduce((acc, item) => acc.concat(item), []); return data; }; const filterData = (data, removeOutliers) => { - let filteredData = data.data.filter(row => row.trial_number && row.phase !== 'practice').map(row => ({ - condition: row.condition, - subject: path.parse(data.meta.datafile).name.split('-')[0], - group: path.parse(data.meta.datafile).name.split('-')[1], - session: path.parse(data.meta.datafile).name.split('-')[2], - reaction_time: Math.round(parseFloat(row.reaction_time)), - correct_response: row.correct_response, - trial_number: row.trial_number, - response_given: row.response_given - })); + let filteredData = data.data + .filter(row => row.trial_number && row.phase !== 'practice') + .map(row => ({ + condition: row.condition, + subject: path.parse(data.meta.datafile).name.split('-')[0], + group: path.parse(data.meta.datafile).name.split('-')[1], + session: path.parse(data.meta.datafile).name.split('-')[2], + reaction_time: Math.round(parseFloat(row.reaction_time)), + correct_response: row.correct_response, + trial_number: row.trial_number, + response_given: row.response_given + })); if (removeOutliers) { try { - const mean = ss.mean(filteredData.filter(r => r.response_given === 'yes' && r.correct_response === 'true').map(r => r.reaction_time)); - const standardDeviation = ss.sampleStandardDeviation(filteredData.filter(r => r.response_given === 'yes' && r.correct_response === 'true').map(r => r.reaction_time)); + const mean = ss.mean( + filteredData + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .map(r => r.reaction_time) + ); + const standardDeviation = ss.sampleStandardDeviation( + filteredData + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .map(r => r.reaction_time) + ); const upperBoarder = mean + 2 * standardDeviation; const lowerBoarder = mean - 2 * standardDeviation; - filteredData = filteredData.filter(r => (r.reaction_time > lowerBoarder && r.reaction_time < upperBoarder) || isNaN(r.reaction_time)); + filteredData = filteredData.filter( + r => + (r.reaction_time > lowerBoarder && r.reaction_time < upperBoarder) || + isNaN(r.reaction_time) + ); } catch (err) { - alert('Calculation of the mean and the standard deviation requires at least two completed trials in each condition.'); + alert( + 'Calculation of the mean and the standard deviation requires at least two completed trials in each condition.' + ); return filteredData; } } return filteredData; }; -const computeRT = (data, dependentVariable, conditions, showDataPoints, colors, displayMode) => { +const computeRT = ( + data, + dependentVariable, + conditions, + showDataPoints, + colors, + displayMode +) => { let dataToPlot = 0; let maxValue = 0; switch (displayMode) { - case 'datapoints':default: + case 'datapoints': + default: let tickValuesX, tickTextX; dataToPlot = conditions.reduce((obj, condition, i) => { - const xRaw = data.reduce((a, b) => a.concat(b), []).filter(r => r.response_given === 'yes' && r.correct_response === 'true').filter(e => e.condition === condition).map(r => r.subject); - const y = data.reduce((a, b) => a.concat(b), []).filter(r => r.response_given === 'yes' && r.correct_response === 'true').filter(e => e.condition === condition).map(r => r.reaction_time); + const xRaw = data + .reduce((a, b) => a.concat(b), []) + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .filter(e => e.condition === condition) + .map(r => r.subject); + const y = data + .reduce((a, b) => a.concat(b), []) + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .filter(e => e.condition === condition) + .map(r => r.reaction_time); maxValue = Math.max(...y) > maxValue ? Math.max(...y) : maxValue; const subjects = Array.from(new Set(xRaw)); - const x = xRaw.map(x => subjects.indexOf(x) + 1 + i / 4 + (Math.random() - 0.5) / 5); + const x = xRaw.map( + x => subjects.indexOf(x) + 1 + i / 4 + (Math.random() - 0.5) / 5 + ); tickValuesX = subjects.map(x => subjects.indexOf(x) + 1 + 1 / 8); tickTextX = subjects; obj[condition] = { x, y }; @@ -119,31 +212,79 @@ const computeRT = (data, dependentVariable, conditions, showDataPoints, colors, dataToPlot['ticktext'] = tickTextX; dataToPlot['lowerLimit'] = 0; dataToPlot['upperLimit'] = maxValue > 1000 ? maxValue + 100 : 1000; - return makeDataPointsGraph(dataToPlot, conditions, colors, dependentVariable); + return makeDataPointsGraph( + dataToPlot, + conditions, + colors, + dependentVariable + ); case 'errorbars': let maxValueSE = 0; dataToPlot = conditions.reduce((obj, condition) => { - const xRaw = data.reduce((a, b) => a.concat(b), []).filter(r => r.response_given === 'yes' && r.correct_response === 'true').filter(e => e.condition === condition).map(r => r.subject); + const xRaw = data + .reduce((a, b) => a.concat(b), []) + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .filter(e => e.condition === condition) + .map(r => r.subject); const x = Array.from(new Set(xRaw)); - const data_condition = data.map(d => d.filter(r => r.response_given === 'yes' && r.correct_response === 'true').filter(e => e.condition == condition)); - const y_bars_prep = x.map(a => data_condition.map(d => d.filter(e => e.subject === a)).filter(d => d.length > 0)); - const y = y_bars_prep.map(y => ss.mean(y.reduce((a, b) => a.concat(b), []).map(r => r.reaction_time))).map(v => Math.round(v)); + const data_condition = data.map(d => + d + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .filter(e => e.condition == condition) + ); + const y_bars_prep = x.map(a => + data_condition + .map(d => d.filter(e => e.subject === a)) + .filter(d => d.length > 0) + ); + const y = y_bars_prep + .map(y => + ss.mean( + y.reduce((a, b) => a.concat(b), []).map(r => r.reaction_time) + ) + ) + .map(v => Math.round(v)); maxValue = Math.max(...y) > maxValue ? Math.max(...y) : maxValue; - const stErrorFunction = array => ss.sampleStandardDeviation(array) / Math.sqrt(array.length); - const stErrors = data_condition.map(a => a.length > 1 ? stErrorFunction(a.map(r => r.reaction_time)) : 0).map(v => Math.round(v)); - maxValueSE = Math.max(...stErrors) > maxValueSE ? Math.max(...stErrors) : maxValueSE; + const stErrorFunction = array => + ss.sampleStandardDeviation(array) / Math.sqrt(array.length); + const stErrors = data_condition + .map(a => + a.length > 1 ? stErrorFunction(a.map(r => r.reaction_time)) : 0 + ) + .map(v => Math.round(v)); + maxValueSE = + Math.max(...stErrors) > maxValueSE + ? Math.max(...stErrors) + : maxValueSE; obj[condition] = { x, y, stErrors }; return obj; }, {}); dataToPlot['lowerLimit'] = 0; - dataToPlot['upperLimit'] = maxValue + maxValueSE > 1000 ? maxValue + maxValueSE + 100 : 1000; + dataToPlot['upperLimit'] = + maxValue + maxValueSE > 1000 ? maxValue + maxValueSE + 100 : 1000; return makeBarGraph(dataToPlot, conditions, colors, dependentVariable); case 'whiskers': dataToPlot = conditions.reduce((obj, condition, i) => { - const x = data.reduce((a, b) => a.concat(b), []).filter(r => r.response_given === 'yes' && r.correct_response === 'true').filter(e => e.condition === condition).map(r => r.subject); - const y = data.reduce((a, b) => a.concat(b), []).filter(r => r.response_given === 'yes' && r.correct_response === 'true').filter(e => e.condition === condition).map(r => r.reaction_time); + const x = data + .reduce((a, b) => a.concat(b), []) + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .filter(e => e.condition === condition) + .map(r => r.subject); + const y = data + .reduce((a, b) => a.concat(b), []) + .filter( + r => r.response_given === 'yes' && r.correct_response === 'true' + ) + .filter(e => e.condition === condition) + .map(r => r.reaction_time); maxValue = Math.max(...y) > maxValue ? Math.max(...y) : maxValue; obj[condition] = { x, y }; return obj; @@ -151,35 +292,52 @@ const computeRT = (data, dependentVariable, conditions, showDataPoints, colors, dataToPlot['lowerLimit'] = 0; dataToPlot['upperLimit'] = maxValue > 1000 ? maxValue + 100 : 1000; return makeBoxPlot(dataToPlot, conditions, colors, dependentVariable); - } }; -const computeAccuracy = (data, dependentVariable, conditions, showDataPoints, colors, displayMode) => { +const computeAccuracy = ( + data, + dependentVariable, + conditions, + showDataPoints, + colors, + displayMode +) => { let dataToPlot; switch (displayMode) { - case 'datapoints':default: + case 'datapoints': + default: let tickValuesX, tickTextX; dataToPlot = conditions.reduce((obj, condition, i) => { - const correctDataForCondition = data.map(d => d.filter(e => e.condition == condition)); + const correctDataForCondition = data.map(d => + d.filter(e => e.condition == condition) + ); - const y = correctDataForCondition.map(d => { - if (d.filter(l => l.accuracy).length > 0) { - return d.map(l => l.accuracy); - } - const c = d.filter(e => e.response_given === 'yes' && e.correct_response === 'true'); - return Math.round(c.length / d.length * 100); - }).reduce((acc, item) => acc.concat(item), []); + const y = correctDataForCondition + .map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => l.accuracy); + } + const c = d.filter( + e => e.response_given === 'yes' && e.correct_response === 'true' + ); + return Math.round((c.length / d.length) * 100); + }) + .reduce((acc, item) => acc.concat(item), []); - const xRaw = correctDataForCondition.map(d => { - if (d.filter(l => l.accuracy).length > 0) { - return d.map(l => l.subject); - } - return d.map(r => r.subject)[0]; - }).reduce((acc, item) => acc.concat(item), []); + const xRaw = correctDataForCondition + .map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => l.subject); + } + return d.map(r => r.subject)[0]; + }) + .reduce((acc, item) => acc.concat(item), []); const subjects = Array.from(new Set(xRaw)); - const x = xRaw.map(x => subjects.indexOf(x) + 1 + i / 4 + (Math.random() - 0.5) / 5); + const x = xRaw.map( + x => subjects.indexOf(x) + 1 + i / 4 + (Math.random() - 0.5) / 5 + ); tickValuesX = subjects.map(x => subjects.indexOf(x) + 1 + 1 / 8); tickTextX = subjects; obj[condition] = { x, y }; @@ -189,29 +347,51 @@ const computeAccuracy = (data, dependentVariable, conditions, showDataPoints, co dataToPlot['ticktext'] = tickTextX; dataToPlot['lowerLimit'] = 0; dataToPlot['upperLimit'] = 105; - return makeDataPointsGraph(dataToPlot, conditions, colors, dependentVariable); + return makeDataPointsGraph( + dataToPlot, + conditions, + colors, + dependentVariable + ); case 'errorbars': dataToPlot = conditions.reduce((obj, condition, i) => { - const correctDataForCondition = data.map(d => d.filter(e => e.condition == condition)); - const transformedData = correctDataForCondition.map(d => { - if (d.filter(l => l.accuracy).length > 0) { - return d.map(l => ({ - accuracy: l.accuracy, - subject: l.subject - })); - } - const c = d.filter(e => e.response_given === 'yes' && e.correct_response === 'true'); - return { - accuracy: Math.round(c.length / d.length * 100), - subject: d.map(r => r.subject)[0] - }; - }).reduce((acc, item) => acc.concat(item), []); - const subjects = Array.from(new Set(transformedData.map(e => e.subject))); - const y = subjects.map(subject => ss.mean(transformedData.filter(e => e.subject === subject).map(d => d.accuracy))); - const stErrorFunction = array => ss.sampleStandardDeviation(array) / Math.sqrt(array.length); + const correctDataForCondition = data.map(d => + d.filter(e => e.condition == condition) + ); + const transformedData = correctDataForCondition + .map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => ({ + accuracy: l.accuracy, + subject: l.subject + })); + } + const c = d.filter( + e => e.response_given === 'yes' && e.correct_response === 'true' + ); + return { + accuracy: Math.round((c.length / d.length) * 100), + subject: d.map(r => r.subject)[0] + }; + }) + .reduce((acc, item) => acc.concat(item), []); + const subjects = Array.from( + new Set(transformedData.map(e => e.subject)) + ); + const y = subjects.map(subject => + ss.mean( + transformedData + .filter(e => e.subject === subject) + .map(d => d.accuracy) + ) + ); + const stErrorFunction = array => + ss.sampleStandardDeviation(array) / Math.sqrt(array.length); const stErrors = subjects.map(subject => { - const array = transformedData.filter(e => e.subject === subject).map(d => d.accuracy); + const array = transformedData + .filter(e => e.subject === subject) + .map(d => d.accuracy); if (array.length > 1) { return stErrorFunction(array); } @@ -226,27 +406,34 @@ const computeAccuracy = (data, dependentVariable, conditions, showDataPoints, co case 'whiskers': dataToPlot = conditions.reduce((obj, condition, i) => { - const correctDataForCondition = data.map(d => d.filter(e => e.condition == condition)); - const y = correctDataForCondition.map(d => { - if (d.filter(l => l.accuracy).length > 0) { - return d.map(l => l.accuracy); - } - const c = d.filter(e => e.response_given === 'yes' && e.correct_response === 'true'); - return Math.round(c.length / d.length * 100); - }).reduce((acc, item) => acc.concat(item), []); - const xRaw = correctDataForCondition.map(d => { - if (d.filter(l => l.accuracy).length > 0) { - return d.map(l => l.subject); - } - return d.map(r => r.subject)[0]; - }).reduce((acc, item) => acc.concat(item), []); + const correctDataForCondition = data.map(d => + d.filter(e => e.condition == condition) + ); + const y = correctDataForCondition + .map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => l.accuracy); + } + const c = d.filter( + e => e.response_given === 'yes' && e.correct_response === 'true' + ); + return Math.round((c.length / d.length) * 100); + }) + .reduce((acc, item) => acc.concat(item), []); + const xRaw = correctDataForCondition + .map(d => { + if (d.filter(l => l.accuracy).length > 0) { + return d.map(l => l.subject); + } + return d.map(r => r.subject)[0]; + }) + .reduce((acc, item) => acc.concat(item), []); obj[condition] = { x: xRaw, y }; return obj; }, {}); dataToPlot['lowerLimit'] = 0; dataToPlot['upperLimit'] = 105; return makeBoxPlot(dataToPlot, conditions, colors, dependentVariable); - } }; @@ -275,7 +462,11 @@ const makeDataPointsGraph = (data, conditions, colors, dependentVariable) => { ticktext: data.ticktext }, yaxis: { - title: `${dependentVariable == 'Response Time' ? 'Response Time (milliseconds)' : '% correct'}`, + title: `${ + dependentVariable == 'Response Time' + ? 'Response Time (milliseconds)' + : '% correct' + }`, range: [data.lowerLimit, data.upperLimit] }, title: `${dependentVariable}` @@ -307,7 +498,11 @@ const makeBarGraph = (data, conditions, colors, dependentVariable) => { }); const layout = { yaxis: { - title: `${dependentVariable == 'Response Time' ? 'Response Time (milliseconds)' : '% correct'}`, + title: `${ + dependentVariable == 'Response Time' + ? 'Response Time (milliseconds)' + : '% correct' + }`, zeroline: false, range: [data.lowerLimit, data.upperLimit] }, @@ -340,7 +535,11 @@ const makeBoxPlot = (data, conditions, colors, dependentVariable) => { }); const layout = { yaxis: { - title: `${dependentVariable == 'Response Time' ? 'Response Time (milliseconds)' : '% correct'}`, + title: `${ + dependentVariable == 'Response Time' + ? 'Response Time (milliseconds)' + : '% correct' + }`, zeroline: false, range: [data.lowerLimit, data.upperLimit] }, @@ -351,4 +550,4 @@ const makeBoxPlot = (data, conditions, colors, dependentVariable) => { dataToPlot, layout }; -}; \ No newline at end of file +}; diff --git a/app/utils/eeg/cortex.ts b/app/utils/eeg/cortex.ts index 3e45ef36..a55e96c3 100644 --- a/app/utils/eeg/cortex.ts +++ b/app/utils/eeg/cortex.ts @@ -36,7 +36,6 @@ if (global.process) { } class JSONRPCError extends Error { - constructor(err) { super(err.message); this.name = this.constructor.name; @@ -49,7 +48,6 @@ class JSONRPCError extends Error { } class Cortex extends EventEmitter { - constructor(options = {}) { super(); this.options = options; @@ -66,13 +64,19 @@ class Cortex extends EventEmitter { throw new JSONRPCError(error); }; - this.ready = new Promise(resolve => this.ws.addEventListener('open', resolve), this.handleError).then(() => this._log('ws: Socket opened')).then(() => this.call('inspectApi')).then(methods => { - methods.forEach(m => { - this.defineMethod(m.methodName, m.params); + this.ready = new Promise( + resolve => this.ws.addEventListener('open', resolve), + this.handleError + ) + .then(() => this._log('ws: Socket opened')) + .then(() => this.call('inspectApi')) + .then(methods => { + methods.forEach(m => { + this.defineMethod(m.methodName, m.params); + }); + this._log(`rpc: Added ${methods.length} methods from inspectApi`); + return methods; }); - this._log(`rpc: Added ${methods.length} methods from inspectApi`); - return methods; - }); } _onmsg(msg) { const data = safeParse(msg.data); @@ -82,15 +86,23 @@ class Cortex extends EventEmitter { if ('id' in data) { const id = data.id; - this._log(`[${id}] <-`, data.result ? 'success' : `error (${data.error.message})`); + this._log( + `[${id}] <-`, + data.result ? 'success' : `error (${data.error.message})` + ); if (this.requests[id]) { this.requests[id](data.error, data.result); } else { this._warn('rpc: Got response for unknown id', id); } } else if ('sid' in data) { - const dataKeys = Object.keys(data).filter(k => k !== 'sid' && k !== 'time' && Array.isArray(data[k])); - dataKeys.forEach(k => this.emit(k, data) || this._warn('no listeners for stream event', k)); + const dataKeys = Object.keys(data).filter( + k => k !== 'sid' && k !== 'time' && Array.isArray(data[k]) + ); + dataKeys.forEach( + k => + this.emit(k, data) || this._warn('no listeners for stream event', k) + ); } else { this._log('rpc: Unrecognised data', data); } @@ -104,37 +116,32 @@ class Cortex extends EventEmitter { _debug(...msg) { if (this.verbose > 2) console.debug('[Cortex DEBUG]', ...msg); } - init({ - clientId, - clientSecret, - license, - debit - } = {}) { - const token = this.getUserLogin().then(users => { - if (users.length === 0) { - return Promise.reject(new Error('No logged in user')); - } - return this.requestAccess({ clientId, clientSecret }); - }).then(({ - accessGranted - }) => { - if (!accessGranted) { - return Promise.reject(new Error('Please approve this application in the EMOTIV app')); - } - return this.authorize({ - clientId, - clientSecret, - license, - debit - }).then(({ - cortexToken - }) => { - this._log('init: Got auth token'); - this._debug('init: Auth token', cortexToken); - this.cortexToken = cortexToken; - return cortexToken; + init({ clientId, clientSecret, license, debit } = {}) { + const token = this.getUserLogin() + .then(users => { + if (users.length === 0) { + return Promise.reject(new Error('No logged in user')); + } + return this.requestAccess({ clientId, clientSecret }); + }) + .then(({ accessGranted }) => { + if (!accessGranted) { + return Promise.reject( + new Error('Please approve this application in the EMOTIV app') + ); + } + return this.authorize({ + clientId, + clientSecret, + license, + debit + }).then(({ cortexToken }) => { + this._log('init: Got auth token'); + this._debug('init: Auth token', cortexToken); + this.cortexToken = cortexToken; + return cortexToken; + }); }); - }); return token; } @@ -172,7 +179,13 @@ class Cortex extends EventEmitter { } const missingParams = requiredParams.filter(p => params[p] == null); if (missingParams.length > 0) { - return this.handleError(new Error(`Missing required params for ${methodName}: ${missingParams.join(', ')}`)); + return this.handleError( + new Error( + `Missing required params for ${methodName}: ${missingParams.join( + ', ' + )}` + ) + ); } return this.call(methodName, params); }; @@ -181,4 +194,4 @@ class Cortex extends EventEmitter { Cortex.JSONRPCError = JSONRPCError; -module.exports = Cortex; \ No newline at end of file +module.exports = Cortex; diff --git a/app/utils/eeg/emotiv.ts b/app/utils/eeg/emotiv.ts index 59f27abe..77a276cf 100644 --- a/app/utils/eeg/emotiv.ts +++ b/app/utils/eeg/emotiv.ts @@ -3,14 +3,14 @@ * an RxJS Observable of raw EEG data * */ -import { fromEvent } from "rxjs"; -import { map, withLatestFrom, share } from "rxjs/operators"; -import { addInfo, epoch, bandpassFilter } from "@neurosity/pipes"; -import { toast } from "react-toastify"; -import { parseEmotivSignalQuality } from "./pipes"; -import { CLIENT_ID, CLIENT_SECRET, LICENSE_ID } from "../../../keys"; -import { EMOTIV_CHANNELS, PLOTTING_INTERVAL } from "../../constants/constants"; -import Cortex from "./cortex"; +import { fromEvent } from 'rxjs'; +import { map, withLatestFrom, share } from 'rxjs/operators'; +import { addInfo, epoch, bandpassFilter } from '@neurosity/pipes'; +import { toast } from 'react-toastify'; +import { parseEmotivSignalQuality } from './pipes'; +import { CLIENT_ID, CLIENT_SECRET, LICENSE_ID } from '../../../keys'; +import { EMOTIV_CHANNELS, PLOTTING_INTERVAL } from '../../constants/constants'; +import Cortex from './cortex'; // Creates the Cortex object from SDK const verbose = process.env.LOG_LEVEL || 1; @@ -101,18 +101,25 @@ export const createEmotivSignalQualityObservable = rawObservable => { const signalQualityObservable = fromEvent(client, 'dev'); const samplingRate = 128; const channels = EMOTIV_CHANNELS; - const intervalSamples = PLOTTING_INTERVAL * samplingRate / 1000; - return rawObservable.pipe(addInfo({ - samplingRate, - channels - }), epoch({ - duration: intervalSamples, - interval: intervalSamples - }), bandpassFilter({ - nbChannels: channels.length, - lowCutoff: 1, - highCutoff: 50 - }), withLatestFrom(signalQualityObservable, integrateSignalQuality), parseEmotivSignalQuality(), share()); + const intervalSamples = (PLOTTING_INTERVAL * samplingRate) / 1000; + return rawObservable.pipe( + addInfo({ + samplingRate, + channels + }), + epoch({ + duration: intervalSamples, + interval: intervalSamples + }), + bandpassFilter({ + nbChannels: channels.length, + lowCutoff: 1, + highCutoff: 50 + }), + withLatestFrom(signalQualityObservable, integrateSignalQuality), + parseEmotivSignalQuality(), + share() + ); }; export const injectEmotivMarker = (value, time) => { @@ -143,7 +150,10 @@ const createEEGSample = eegEvent => { prunedArray[i] = eegEvent.eeg[i + 2]; } if (eegEvent.eeg[eegEvent.eeg.length - 1].length >= 1) { - const marker = (eegEvent.eeg[eegEvent.eeg.length - 1][0] && eegEvent.eeg[eegEvent.eeg.length - 1][0].value) || 0; + const marker = + (eegEvent.eeg[eegEvent.eeg.length - 1][0] && + eegEvent.eeg[eegEvent.eeg.length - 1][0].value) || + 0; return { data: prunedArray, timestamp: eegEvent.time * 1000, marker }; } return { data: prunedArray, timestamp: eegEvent.time * 1000 }; @@ -151,7 +161,9 @@ const createEEGSample = eegEvent => { const integrateSignalQuality = (newEpoch, devSample) => ({ ...newEpoch, - signalQuality: Object.assign(...devSample.dev[2].map((signalQuality, index) => ({ - [EMOTIV_CHANNELS[index]]: signalQuality - }))) -}); \ No newline at end of file + signalQuality: Object.assign( + ...devSample.dev[2].map((signalQuality, index) => ({ + [EMOTIV_CHANNELS[index]]: signalQuality + })) + ) +}); diff --git a/app/utils/eeg/muse.ts b/app/utils/eeg/muse.ts index f3918ade..ae2b076d 100644 --- a/app/utils/eeg/muse.ts +++ b/app/utils/eeg/muse.ts @@ -1,11 +1,20 @@ -import "hazardous"; -import { withLatestFrom, share, startWith, filter } from "rxjs/operators"; -import { addInfo, epoch, bandpassFilter, addSignalQuality } from "@neurosity/pipes"; -import { release } from "os"; -import { MUSE_SERVICE, MuseClient, zipSamples } from "muse-js"; -import { from } from "rxjs"; -import { parseMuseSignalQuality } from "./pipes"; -import { MUSE_SAMPLING_RATE, MUSE_CHANNELS, PLOTTING_INTERVAL } from "../../constants/constants"; +import 'hazardous'; +import { withLatestFrom, share, startWith, filter } from 'rxjs/operators'; +import { + addInfo, + epoch, + bandpassFilter, + addSignalQuality +} from '@neurosity/pipes'; +import { release } from 'os'; +import { MUSE_SERVICE, MuseClient, zipSamples } from 'muse-js'; +import { from } from 'rxjs'; +import { parseMuseSignalQuality } from './pipes'; +import { + MUSE_SAMPLING_RATE, + MUSE_CHANNELS, + PLOTTING_INTERVAL +} from '../../constants/constants'; const INTER_SAMPLE_INTERVAL = -(1 / 256) * 1000; @@ -59,27 +68,37 @@ export const createRawMuseObservable = async () => { await client.start(); const eegStream = await client.eegReadings; const markers = await client.eventMarkers.pipe(startWith({ timestamp: 0 })); - return from(zipSamples(eegStream)).pipe(filter(sample => !sample.data.includes(NaN)), withLatestFrom(markers, synchronizeTimestamp), share()); + return from(zipSamples(eegStream)).pipe( + filter(sample => !sample.data.includes(NaN)), + withLatestFrom(markers, synchronizeTimestamp), + share() + ); }; // Creates an observable that will epoch, filter, and add signal quality to EEG stream -export const createMuseSignalQualityObservable = (rawObservable, deviceInfo) => { - const { - samplingRate, - channels: channelNames - } = deviceInfo; - const intervalSamples = PLOTTING_INTERVAL * samplingRate / 1000; - return rawObservable.pipe(addInfo({ - samplingRate, - channelNames - }), epoch({ - duration: intervalSamples, - interval: intervalSamples - }), bandpassFilter({ - nbChannels: channelNames.length, - lowCutoff: 1, - highCutoff: 50 - }), addSignalQuality(), parseMuseSignalQuality()); +export const createMuseSignalQualityObservable = ( + rawObservable, + deviceInfo +) => { + const { samplingRate, channels: channelNames } = deviceInfo; + const intervalSamples = (PLOTTING_INTERVAL * samplingRate) / 1000; + return rawObservable.pipe( + addInfo({ + samplingRate, + channelNames + }), + epoch({ + duration: intervalSamples, + interval: intervalSamples + }), + bandpassFilter({ + nbChannels: channelNames.length, + lowCutoff: 1, + highCutoff: 50 + }), + addSignalQuality(), + parseMuseSignalQuality() + ); }; // Injects an event marker that will be included in muse-js's data stream through @@ -91,8 +110,11 @@ export const injectMuseMarker = (value, time) => { // Helpers const synchronizeTimestamp = (eegSample, marker) => { - if (eegSample['timestamp'] - marker['timestamp'] < 0 && eegSample['timestamp'] - marker['timestamp'] >= INTER_SAMPLE_INTERVAL) { + if ( + eegSample['timestamp'] - marker['timestamp'] < 0 && + eegSample['timestamp'] - marker['timestamp'] >= INTER_SAMPLE_INTERVAL + ) { return { ...eegSample, marker: marker['value'] }; } return eegSample; -}; \ No newline at end of file +}; diff --git a/app/utils/eeg/pipes.ts b/app/utils/eeg/pipes.ts index 05f9fbcf..256019e0 100644 --- a/app/utils/eeg/pipes.ts +++ b/app/utils/eeg/pipes.ts @@ -1,35 +1,54 @@ -import { pipe } from "rxjs"; -import { map } from "rxjs/operators"; -import { SIGNAL_QUALITY, SIGNAL_QUALITY_THRESHOLDS } from "../../constants/constants"; +import { pipe } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { + SIGNAL_QUALITY, + SIGNAL_QUALITY_THRESHOLDS +} from '../../constants/constants'; -export const parseMuseSignalQuality = () => pipe(map(epoch => ({ - ...epoch, - signalQuality: Object.assign({}, ...Object.entries(epoch.signalQuality).map(([channelName, signalQuality]) => { - if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.BAD) { - return { [channelName]: SIGNAL_QUALITY.BAD }; - } - if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.OK) { - return { [channelName]: SIGNAL_QUALITY.OK }; - } - if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.GREAT) { - return { [channelName]: SIGNAL_QUALITY.GREAT }; - } - return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; - })) -}))); +export const parseMuseSignalQuality = () => + pipe( + map(epoch => ({ + ...epoch, + signalQuality: Object.assign( + {}, + ...Object.entries(epoch.signalQuality).map( + ([channelName, signalQuality]) => { + if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.BAD) { + return { [channelName]: SIGNAL_QUALITY.BAD }; + } + if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.OK) { + return { [channelName]: SIGNAL_QUALITY.OK }; + } + if (signalQuality >= SIGNAL_QUALITY_THRESHOLDS.GREAT) { + return { [channelName]: SIGNAL_QUALITY.GREAT }; + } + return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; + } + ) + ) + })) + ); -export const parseEmotivSignalQuality = () => pipe(map(epoch => ({ - ...epoch, - signalQuality: Object.assign({}, ...Object.entries(epoch.signalQuality).map(([channelName, signalQuality]) => { - if (signalQuality === 0) { - return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; - } - if (signalQuality === 3) { - return { [channelName]: SIGNAL_QUALITY.OK }; - } - if (signalQuality === 4) { - return { [channelName]: SIGNAL_QUALITY.GREAT }; - } - return { [channelName]: SIGNAL_QUALITY.BAD }; - })) -}))); \ No newline at end of file +export const parseEmotivSignalQuality = () => + pipe( + map(epoch => ({ + ...epoch, + signalQuality: Object.assign( + {}, + ...Object.entries(epoch.signalQuality).map( + ([channelName, signalQuality]) => { + if (signalQuality === 0) { + return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; + } + if (signalQuality === 3) { + return { [channelName]: SIGNAL_QUALITY.OK }; + } + if (signalQuality === 4) { + return { [channelName]: SIGNAL_QUALITY.GREAT }; + } + return { [channelName]: SIGNAL_QUALITY.BAD }; + } + ) + ) + })) + ); diff --git a/app/utils/filesystem/dialog.ts b/app/utils/filesystem/dialog.ts index f1470452..76889ae6 100644 --- a/app/utils/filesystem/dialog.ts +++ b/app/utils/filesystem/dialog.ts @@ -3,40 +3,46 @@ * These functions are all executed in the main process */ -import { dialog } from "electron"; -import { FILE_TYPES } from "../../constants/constants"; +import { dialog } from 'electron'; +import { FILE_TYPES } from '../../constants/constants'; export const loadDialog = (event, arg) => { switch (arg) { case FILE_TYPES.STIMULUS_DIR: return selectStimulusFolder(event); - case FILE_TYPES.TIMELINE:default: + case FILE_TYPES.TIMELINE: + default: return selectTimeline(event); - } }; const selectTimeline = event => { - dialog.showOpenDialog({ - title: 'Select a jsPsych timeline file', - properties: ['openFile', 'promptToCreate'] - }, filePaths => { - if (filePaths) { - event.sender.send('loadDialogReply', filePaths[0]); + dialog.showOpenDialog( + { + title: 'Select a jsPsych timeline file', + properties: ['openFile', 'promptToCreate'] + }, + filePaths => { + if (filePaths) { + event.sender.send('loadDialogReply', filePaths[0]); + } } - }); + ); }; const selectStimulusFolder = event => { - dialog.showOpenDialog({ - title: 'Select a folder of images', - properties: ['openDirectory'] - }, dir => { - if (dir) { - event.sender.send('loadDialogReply', dir[0]); - } else { - event.sender.send('loadDialogReply', ''); + dialog.showOpenDialog( + { + title: 'Select a folder of images', + properties: ['openDirectory'] + }, + dir => { + if (dir) { + event.sender.send('loadDialogReply', dir[0]); + } else { + event.sender.send('loadDialogReply', ''); + } } - }); -}; \ No newline at end of file + ); +}; diff --git a/app/utils/filesystem/select.ts b/app/utils/filesystem/select.ts index 22c23035..2ad213bb 100644 --- a/app/utils/filesystem/select.ts +++ b/app/utils/filesystem/select.ts @@ -1,15 +1,14 @@ - - /** * Functions for selecting files and directories from disk */ -import { ipcRenderer } from "electron"; -import { FILE_TYPES } from "../../constants/constants"; +import { ipcRenderer } from 'electron'; +import { FILE_TYPES } from '../../constants/constants'; -export const loadFromSystemDialog = (fileType: FILE_TYPES) => new Promise(resolve => { - ipcRenderer.send('loadDialog', fileType); - ipcRenderer.on('loadDialogReply', (event, result) => { - resolve(result); +export const loadFromSystemDialog = (fileType: FILE_TYPES) => + new Promise(resolve => { + ipcRenderer.send('loadDialog', fileType); + ipcRenderer.on('loadDialogReply', (event, result) => { + resolve(result); + }); }); -}); \ No newline at end of file diff --git a/app/utils/filesystem/storage.ts b/app/utils/filesystem/storage.ts index 41fca40e..ef8ca801 100644 --- a/app/utils/filesystem/storage.ts +++ b/app/utils/filesystem/storage.ts @@ -1,33 +1,31 @@ - - /** * Functions for managing user data stored on disk */ -import * as fs from "fs"; -import * as os from "os"; -import * as path from "path"; -import recursive from "recursive-readdir"; -import { shell, remote } from "electron"; -import Papa from "papaparse"; -import { ExperimentStateType } from "../../reducers/experimentReducer"; -import { mkdirPathSync } from "./write"; +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; +import recursive from 'recursive-readdir'; +import { shell, remote } from 'electron'; +import Papa from 'papaparse'; +import { ExperimentStateType } from '../../reducers/experimentReducer'; +import { mkdirPathSync } from './write'; const workspaces = path.join(os.homedir(), 'BrainWaves_Workspaces'); -const { - dialog -} = remote; +const { dialog } = remote; // ----------------------------------------------------------------------------------------------- // Creating and Getting // Creates a new directory for a given workspace with the passed title if it doesn't already exist -export const createWorkspaceDir = (title: string) => mkdirPathSync(getWorkspaceDir(title)); +export const createWorkspaceDir = (title: string) => + mkdirPathSync(getWorkspaceDir(title)); // Gets the absolute path for a workspace from a given title export const getWorkspaceDir = (title: string) => path.join(workspaces, title); // Opens a workspace folder in explorer (or other native OS filesystem browser) -export const openWorkspaceDir = (title: string) => shell.openItem(path.join(workspaces, title)); +export const openWorkspaceDir = (title: string) => + shell.openItem(path.join(workspaces, title)); // ----------------------------------------------------------------------------------------------- // Storing @@ -35,8 +33,12 @@ export const openWorkspaceDir = (title: string) => shell.openItem(path.join(work // Writes 'experiment' store state to file as a JSON object export const storeExperimentState = (state: ExperimentStateType) => { const timestampedState = state; - if (timestampedState && timestampedState.params) timestampedState.params.dateModified = Date.now(); // saves the timestamp - fs.writeFileSync(path.join(getWorkspaceDir(timestampedState.title), 'appState.json'), JSON.stringify(timestampedState)); + if (timestampedState && timestampedState.params) + timestampedState.params.dateModified = Date.now(); // saves the timestamp + fs.writeFileSync( + path.join(getWorkspaceDir(timestampedState.title), 'appState.json'), + JSON.stringify(timestampedState) + ); }; export const restoreExperimentState = (state: ExperimentStateType) => { @@ -47,11 +49,20 @@ export const restoreExperimentState = (state: ExperimentStateType) => { group: '', session: 1 }; - fs.writeFileSync(path.join(getWorkspaceDir(timestampedState.title), 'appState.json'), JSON.stringify(timestampedState)); + fs.writeFileSync( + path.join(getWorkspaceDir(timestampedState.title), 'appState.json'), + JSON.stringify(timestampedState) + ); } }; -export const storeBehaviouralData = (csv: string, title: string, subject: string, group: string, session: number) => { +export const storeBehaviouralData = ( + csv: string, + title: string, + subject: string, + group: string, + session: number +) => { const dir = path.join(getWorkspaceDir(title), 'Data', subject, 'Behavior'); const filename = `${subject}-${group}-${session}-behavior.csv`; mkdirPathSync(dir); @@ -63,7 +74,11 @@ export const storeBehaviouralData = (csv: string, title: string, subject: string }; // Stores an image to workspace dir -export const storeJupyterImage = (title: string, imageTitle: string, rawData: Buffer) => { +export const storeJupyterImage = ( + title: string, + imageTitle: string, + rawData: Buffer +) => { const dir = path.join(getWorkspaceDir(title), 'Results', 'Images'); const filename = `${imageTitle}.png`; mkdirPathSync(dir); @@ -80,7 +95,9 @@ export const storeJupyterImage = (title: string, imageTitle: string, rawData: Bu // Returns a list of workspaces in the workspaces directory. Will make the workspaces dir if it doesn't exist yet export const readWorkspaces = () => { try { - return fs.readdirSync(workspaces).filter(workspace => workspace !== '.DS_Store'); + return fs + .readdirSync(workspaces) + .filter(workspace => workspace !== '.DS_Store'); } catch (e) { if (e.code === 'ENOENT') { mkdirPathSync(workspaces); @@ -94,10 +111,12 @@ export const readWorkspaces = () => { export const readWorkspaceRawEEGData = async (title: string) => { try { const files = await recursive(getWorkspaceDir(title)); - const rawFiles = files.filter(filepath => filepath.slice(-7).includes('raw.csv')).map(filepath => ({ - name: path.basename(filepath), - path: filepath - })); + const rawFiles = files + .filter(filepath => filepath.slice(-7).includes('raw.csv')) + .map(filepath => ({ + name: path.basename(filepath), + path: filepath + })); return rawFiles; } catch (e) { if (e.code === 'ENOENT') { @@ -111,10 +130,12 @@ export const readWorkspaceRawEEGData = async (title: string) => { export const readWorkspaceCleanedEEGData = async (title: string) => { try { const files = await recursive(getWorkspaceDir(title)); - return files.filter(filepath => filepath.slice(-7).includes('epo.fif')).map(filepath => ({ - name: path.basename(filepath), - path: filepath - })); + return files + .filter(filepath => filepath.slice(-7).includes('epo.fif')) + .map(filepath => ({ + name: path.basename(filepath), + path: filepath + })); } catch (e) { console.log(e); return []; @@ -125,10 +146,12 @@ export const readWorkspaceCleanedEEGData = async (title: string) => { export const readWorkspaceBehaviorData = async (title: string) => { try { const files = await recursive(getWorkspaceDir(title)); - const behaviorFiles = files.filter(filepath => filepath.slice(-12).includes('behavior.csv')).map(filepath => ({ - name: path.basename(filepath), - path: filepath - })); + const behaviorFiles = files + .filter(filepath => filepath.slice(-12).includes('behavior.csv')) + .map(filepath => ({ + name: path.basename(filepath), + path: filepath + })); return behaviorFiles; } catch (e) { if (e.code === 'ENOENT') { @@ -141,7 +164,9 @@ export const readWorkspaceBehaviorData = async (title: string) => { // Reads an experiment state tree from disk and parses it from JSON export const readAndParseState = (dir: string) => { try { - return JSON.parse(fs.readFileSync(path.join(workspaces, dir, 'appState.json'))); + return JSON.parse( + fs.readFileSync(path.join(workspaces, dir, 'appState.json')) + ); } catch (e) { if (e.code === 'ENOENT') { console.log('appState does not exist for recent workspace'); @@ -151,19 +176,36 @@ export const readAndParseState = (dir: string) => { }; // Reads a list of images that are in a directory -export const readImages = (dir: string) => fs.readdirSync(dir).filter(filename => { - const extension = filename.slice(-3).toLowerCase(); - return (extension === 'png' || extension === 'jpg' || extension === 'gif' || extension === 'peg' // support .jpeg? - ); -}); +export const readImages = (dir: string) => + fs.readdirSync(dir).filter(filename => { + const extension = filename.slice(-3).toLowerCase(); + return ( + extension === 'png' || + extension === 'jpg' || + extension === 'gif' || + extension === 'peg' // support .jpeg? + ); + }); // Returns an array of images that are used in a timeline for use in preloading -export const getImages = (params: ExperimentParameters) => readdirSync(params.stimulus1.dir).map(filename => path.join(params.stimulus1.dir, filename)).concat(readdirSync(params.stimulus2.dir).map(filename => path.join(params.stimulus2.dir, filename))); +export const getImages = (params: ExperimentParameters) => + readdirSync(params.stimulus1.dir) + .map(filename => path.join(params.stimulus1.dir, filename)) + .concat( + readdirSync(params.stimulus2.dir).map(filename => + path.join(params.stimulus2.dir, filename) + ) + ); // ----------------------------------------------------------------------------------------------- // Util -export const getSubjectNamesFromFiles = (filePaths: Array) => filePaths.map(filePath => path.basename(filePath)).map(fileName => fileName.substring(0, fileName.indexOf('-'))); +export const getSubjectNamesFromFiles = ( + filePaths: Array +) => + filePaths + .map(filePath => path.basename(filePath)) + .map(fileName => fileName.substring(0, fileName.indexOf('-'))); // Read CSV files with behavioral data and return an object export const readBehaviorData = (files: Array) => { @@ -186,16 +228,19 @@ export const storeAggregatedBehaviorData = (data, title) => { }; const saveFileOnDisk = (data, title) => { - dialog.showSaveDialog({ - title: 'Select a folder to save the data', - defaultPath: path.join(getWorkspaceDir(title), 'Data', `aggregated.csv`) - }, filename => { - if (filename && typeof filename !== 'undefined') { - fs.writeFile(filename, data, err => { - if (err) console.error(err); - }); + dialog.showSaveDialog( + { + title: 'Select a folder to save the data', + defaultPath: path.join(getWorkspaceDir(title), 'Data', `aggregated.csv`) + }, + filename => { + if (filename && typeof filename !== 'undefined') { + fs.writeFile(filename, data, err => { + if (err) console.error(err); + }); + } } - }); + ); }; // convert a csv file to an object with Papaparse @@ -219,7 +264,13 @@ export const deleteWorkspaceDir = (title: string) => { // Check whether the file with the given name already exists in the filesystem export const checkFileExists = (title, subject, filename) => { - const file = path.join(getWorkspaceDir(title), 'Data', subject, 'Behavior', filename); + const file = path.join( + getWorkspaceDir(title), + 'Data', + subject, + 'Behavior', + filename + ); const fileExists = fs.existsSync(file); return fileExists; -}; \ No newline at end of file +}; diff --git a/app/utils/filesystem/write.ts b/app/utils/filesystem/write.ts index d309e72e..64599a8a 100644 --- a/app/utils/filesystem/write.ts +++ b/app/utils/filesystem/write.ts @@ -1,18 +1,21 @@ - - /** * Functions for writing EEG data to disk */ -import * as fs from "fs"; -import * as path from "path"; -import mkdirp from "mkdirp"; -import { has } from "lodash"; -import { getWorkspaceDir } from "./storage"; -import { EEGData } from "../../constants/interfaces"; +import * as fs from 'fs'; +import * as path from 'path'; +import mkdirp from 'mkdirp'; +import { has } from 'lodash'; +import { getWorkspaceDir } from './storage'; +import { EEGData } from '../../constants/interfaces'; // Creates an appropriate filename and returns a writestream that will write to that file -export const createEEGWriteStream = (title: string, subject: string, group: string, session: number) => { +export const createEEGWriteStream = ( + title: string, + subject: string, + group: string, + session: number +) => { try { const dir = path.join(getWorkspaceDir(title), 'Data', subject, 'EEG'); const filename = `${subject}-${group}-${session}-raw.csv`; @@ -25,7 +28,10 @@ export const createEEGWriteStream = (title: string, subject: string, group: stri // Writes the header for a simple CSV EEG file format. // timestamp followed by channels, followed by markers -export const writeHeader = (writeStream: fs.WriteStream, channels: Array) => { +export const writeHeader = ( + writeStream: fs.WriteStream, + channels: Array +) => { try { const headerLabels = `Timestamp,${channels.join(',')},Marker\n`; writeStream.write(headerLabels); @@ -54,4 +60,4 @@ export const writeEEGData = (writeStream: fs.WriteStream, eegData: EEGData) => { // Creates a directory path if it doesn't exist export const mkdirPathSync = dirPath => { mkdirp.sync(dirPath); -}; \ No newline at end of file +}; diff --git a/app/utils/jupyter/cells.ts b/app/utils/jupyter/cells.ts index 308d7d29..f2d59076 100644 --- a/app/utils/jupyter/cells.ts +++ b/app/utils/jupyter/cells.ts @@ -1,43 +1,110 @@ -import * as path from "path"; -import { readFileSync } from "fs"; +import * as path from 'path'; +import { readFileSync } from 'fs'; -export const imports = () => ['from mne import Epochs, find_events, set_eeg_reference, read_epochs, concatenate_epochs', 'from time import time, strftime, gmtime', 'import os', 'from collections import OrderedDict', 'from glob import glob', 'from mne import create_info, concatenate_raws', 'from mne.io import RawArray', 'from mne.io import RawArray', 'from mne.channels import read_montage', 'import pandas as pd', 'import numpy as np', 'import seaborn as sns', 'from matplotlib import pyplot as plt', "plt.style.use('fivethirtyeight')"].join('\n'); +export const imports = () => + [ + 'from mne import Epochs, find_events, set_eeg_reference, read_epochs, concatenate_epochs', + 'from time import time, strftime, gmtime', + 'import os', + 'from collections import OrderedDict', + 'from glob import glob', + 'from mne import create_info, concatenate_raws', + 'from mne.io import RawArray', + 'from mne.io import RawArray', + 'from mne.channels import read_montage', + 'import pandas as pd', + 'import numpy as np', + 'import seaborn as sns', + 'from matplotlib import pyplot as plt', + "plt.style.use('fivethirtyeight')" + ].join('\n'); -export const utils = () => readFileSync(path.join(__dirname, '/utils/jupyter/utils.py'), 'utf8'); +export const utils = () => + readFileSync(path.join(__dirname, '/utils/jupyter/utils.py'), 'utf8'); -export const loadCSV = (filePathArray: Array) => [`files = [${filePathArray.map(filePath => formatFilePath(filePath))}]`, `replace_ch_names = None`, `raw = load_data(files, replace_ch_names)`].join('\n'); +export const loadCSV = (filePathArray: Array) => + [ + `files = [${filePathArray.map(filePath => formatFilePath(filePath))}]`, + `replace_ch_names = None`, + `raw = load_data(files, replace_ch_names)` + ].join('\n'); -export const loadCleanedEpochs = (filePathArray: Array) => [`files = [${filePathArray.map(filePath => formatFilePath(filePath))}]`, `clean_epochs = concatenate_epochs([read_epochs(file) for file in files])`, `conditions = OrderedDict({key: [value] for (key, value) in clean_epochs.event_id.items()})`].join('\n'); +export const loadCleanedEpochs = (filePathArray: Array) => + [ + `files = [${filePathArray.map(filePath => formatFilePath(filePath))}]`, + `clean_epochs = concatenate_epochs([read_epochs(file) for file in files])`, + `conditions = OrderedDict({key: [value] for (key, value) in clean_epochs.event_id.items()})` + ].join('\n'); // NOTE: this command includes a ';' to prevent returning data -export const filterIIR = (lowCutoff: number, highCutoff: number) => `raw.filter(${lowCutoff}, ${highCutoff}, method='iir');`; +export const filterIIR = (lowCutoff: number, highCutoff: number) => + `raw.filter(${lowCutoff}, ${highCutoff}, method='iir');`; -export const plotPSD = () => [`%matplotlib inline`, `raw.plot_psd(fmin=1, fmax=30)`].join('\n'); +export const plotPSD = () => + [`%matplotlib inline`, `raw.plot_psd(fmin=1, fmax=30)`].join('\n'); -export const epochEvents = (eventIDs: { - [key: string]: number; -}, tmin: number, tmax: number, reject?: Array | string = 'None') => { - const IDs = Object.keys(eventIDs).filter(k => k !== '').reduce((res, key) => (res[key] = eventIDs[key], res), {}); - const command = [`event_id = ${JSON.stringify(IDs)}`, `tmin=${tmin}`, `tmax=${tmax}`, `baseline= (tmin, tmax)`, `picks = None`, `reject = ${reject}`, 'events = find_events(raw)', `raw_epochs = Epochs(raw, events=events, event_id=event_id, +export const epochEvents = ( + eventIDs: { + [key: string]: number; + }, + tmin: number, + tmax: number, + reject?: Array | string = 'None' +) => { + const IDs = Object.keys(eventIDs) + .filter(k => k !== '') + .reduce((res, key) => ((res[key] = eventIDs[key]), res), {}); + const command = [ + `event_id = ${JSON.stringify(IDs)}`, + `tmin=${tmin}`, + `tmax=${tmax}`, + `baseline= (tmin, tmax)`, + `picks = None`, + `reject = ${reject}`, + 'events = find_events(raw)', + `raw_epochs = Epochs(raw, events=events, event_id=event_id, tmin=tmin, tmax=tmax, baseline=baseline, reject=reject, preload=True, - verbose=False, picks=picks)`, `conditions = OrderedDict({key: [value] for (key, value) in raw_epochs.event_id.items()})`].join('\n'); + verbose=False, picks=picks)`, + `conditions = OrderedDict({key: [value] for (key, value) in raw_epochs.event_id.items()})` + ].join('\n'); return command; }; -export const requestEpochsInfo = (variableName: string) => `get_epochs_info(${variableName})`; +export const requestEpochsInfo = (variableName: string) => + `get_epochs_info(${variableName})`; -export const requestChannelInfo = () => `[ch for ch in clean_epochs.ch_names if ch != 'Marker']`; +export const requestChannelInfo = () => + `[ch for ch in clean_epochs.ch_names if ch != 'Marker']`; -export const cleanEpochsPlot = () => [`%matplotlib`, `raw_epochs.plot(scalings='auto', n_epochs=6, title="Clean Data", events=None)`].join('\n'); +export const cleanEpochsPlot = () => + [ + `%matplotlib`, + `raw_epochs.plot(scalings='auto', n_epochs=6, title="Clean Data", events=None)` + ].join('\n'); -export const plotTopoMap = () => [`%matplotlib inline`, `plot_topo(clean_epochs, conditions)`].join('\n'); +export const plotTopoMap = () => + [`%matplotlib inline`, `plot_topo(clean_epochs, conditions)`].join('\n'); -export const plotERP = (channelIndex: number) => [`%matplotlib inline`, `X, y = plot_conditions(clean_epochs, ch_ind=${channelIndex}, conditions=conditions, - ci=97.5, n_boot=1000, title='', diff_waveform=None)`].join('\n'); +export const plotERP = (channelIndex: number) => + [ + `%matplotlib inline`, + `X, y = plot_conditions(clean_epochs, ch_ind=${channelIndex}, conditions=conditions, + ci=97.5, n_boot=1000, title='', diff_waveform=None)` + ].join('\n'); -export const saveEpochs = (workspaceDir: string, subject: string) => `raw_epochs.save(${formatFilePath(path.join(workspaceDir, 'Data', subject, 'EEG', `${subject}-cleaned-epo.fif`))})`; +export const saveEpochs = (workspaceDir: string, subject: string) => + `raw_epochs.save(${formatFilePath( + path.join( + workspaceDir, + 'Data', + subject, + 'EEG', + `${subject}-cleaned-epo.fif` + ) + )})`; // ------------------------------------------- // Helper methods -const formatFilePath = (filePath: string) => `"${filePath.replace(/\\/g, '/')}"`; \ No newline at end of file +const formatFilePath = (filePath: string) => + `"${filePath.replace(/\\/g, '/')}"`; diff --git a/app/utils/jupyter/functions.ts b/app/utils/jupyter/functions.ts index d25783f9..7801272c 100644 --- a/app/utils/jupyter/functions.ts +++ b/app/utils/jupyter/functions.ts @@ -1,6 +1,7 @@ -import { KERNEL_STATUS } from "../../constants/constants"; +import { KERNEL_STATUS } from '../../constants/constants'; -export const parseSingleQuoteJSON = (string: string) => JSON.parse(string.replace(/'/g, '"')); +export const parseSingleQuoteJSON = (string: string) => + JSON.parse(string.replace(/'/g, '"')); export const parseKernelStatus = (msg: Object) => { switch (msg['content']['execution_state']) { @@ -8,9 +9,9 @@ export const parseKernelStatus = (msg: Object) => { return KERNEL_STATUS.BUSY; case 'idle': return KERNEL_STATUS.IDLE; - case 'starting':default: + case 'starting': + default: return KERNEL_STATUS.STARTING; - } }; @@ -41,7 +42,6 @@ export const debugParseMessage = (msg: Object) => { default: content = JSON.stringify(msg); - } return `${msg.channel} ${content}`; -}; \ No newline at end of file +}; diff --git a/app/utils/jupyter/pipes.ts b/app/utils/jupyter/pipes.ts index 51754ea5..07d8252a 100644 --- a/app/utils/jupyter/pipes.ts +++ b/app/utils/jupyter/pipes.ts @@ -1,9 +1,21 @@ -import { pipe } from "rxjs"; -import { map, pluck, filter, take, mergeMap } from "rxjs/operators"; -import { executeRequest } from "@nteract/messaging"; -import { RECEIVE_EXECUTE_REPLY } from "../../epics/jupyterEpics"; +import { pipe } from 'rxjs'; +import { map, pluck, filter, take, mergeMap } from 'rxjs/operators'; +import { executeRequest } from '@nteract/messaging'; +import { RECEIVE_EXECUTE_REPLY } from '../../epics/jupyterEpics'; // Refactor this so command can be calculated either up stream or inside pipe -export const execute = (command, state$) => pipe(map(() => state$.value.jupyter.mainChannel.next(executeRequest(command)))); +export const execute = (command, state$) => + pipe( + map(() => state$.value.jupyter.mainChannel.next(executeRequest(command))) + ); -export const awaitOkMessage = action$ => pipe(mergeMap(() => action$.ofType(RECEIVE_EXECUTE_REPLY).pipe(pluck('payload'), filter(msg => msg.channel === 'shell' && msg.content.status === 'ok'), take(1)))); \ No newline at end of file +export const awaitOkMessage = action$ => + pipe( + mergeMap(() => + action$.ofType(RECEIVE_EXECUTE_REPLY).pipe( + pluck('payload'), + filter(msg => msg.channel === 'shell' && msg.content.status === 'ok'), + take(1) + ) + ) + ); diff --git a/app/utils/labjs/functions.ts b/app/utils/labjs/functions.ts index 2ae7b26e..966f2ec8 100644 --- a/app/utils/labjs/functions.ts +++ b/app/utils/labjs/functions.ts @@ -1,15 +1,19 @@ -import { isNil } from "lodash"; -import * as path from "path"; -import { readdirSync } from "fs"; -import { EXPERIMENTS } from "../../constants/constants"; - -import { buildN170Timeline } from "./protocols/faceshouses"; -import { buildStroopTimeline } from "./protocols/stroop"; -import { buildMultiTimeline } from "./protocols/multi"; -import { buildSearchTimeline } from "./protocols/search"; -import { buildCustomTimeline } from "./protocols/custom"; - -import { MainTimeline, Trial, ExperimentParameters } from "../../constants/interfaces"; +import { isNil } from 'lodash'; +import * as path from 'path'; +import { readdirSync } from 'fs'; +import { EXPERIMENTS } from '../../constants/constants'; + +import { buildN170Timeline } from './protocols/faceshouses'; +import { buildStroopTimeline } from './protocols/stroop'; +import { buildMultiTimeline } from './protocols/multi'; +import { buildSearchTimeline } from './protocols/search'; +import { buildCustomTimeline } from './protocols/custom'; + +import { + MainTimeline, + Trial, + ExperimentParameters +} from '../../constants/interfaces'; // loads a protocol of the experiment export const loadProtocol = (paradigm: EXPERIMENTS) => { @@ -31,10 +35,10 @@ export const loadProtocol = (paradigm: EXPERIMENTS) => { protocol = buildN170Timeline(); break; - case EXPERIMENTS.CUSTOM:default: + case EXPERIMENTS.CUSTOM: + default: protocol = buildCustomTimeline(); break; - } return protocol; -}; \ No newline at end of file +}; diff --git a/app/utils/labjs/index.tsx b/app/utils/labjs/index.tsx index 884cfd77..54e5ead8 100644 --- a/app/utils/labjs/index.tsx +++ b/app/utils/labjs/index.tsx @@ -1,24 +1,21 @@ -import React, { Component } from "react"; -import clonedeep from "lodash.clonedeep"; -import * as lab from "lab.js/dist/lab.dev"; +import React, { Component } from 'react'; +import clonedeep from 'lodash.clonedeep'; +import * as lab from 'lab.js/dist/lab.dev'; -import path from "path"; -import visualsearch from "./scripts/visualsearch"; -import stroop from "./scripts/stroop"; -import multitasking from "./scripts/multitasking"; -import faceshouses from "./scripts/faceshouses"; -import custom from "./scripts/custom"; +import path from 'path'; +import visualsearch from './scripts/visualsearch'; +import stroop from './scripts/stroop'; +import multitasking from './scripts/multitasking'; +import faceshouses from './scripts/faceshouses'; +import custom from './scripts/custom'; class ExperimentWindow extends Component { - constructor(props) { super(props); } componentDidMount() { - const { - props - } = this; + const { props } = this; switch (props.settings.script) { case 'Multi-tasking': multitasking.parameters = props.settings.params; @@ -35,26 +32,36 @@ class ExperimentWindow extends Component { case 'Faces and Houses': faceshouses.parameters = props.settings.params; faceshouses.parameters.title = props.settings.title; - faceshouses.files = props.settings.params.stimuli.map(image => ({ - [path.join(image.dir, image.filename)]: path.join(image.dir, image.filename) - })).reduce((obj, item) => { - obj[Object.keys(item)[0]] = Object.values(item)[0]; - return obj; - }, {}); + faceshouses.files = props.settings.params.stimuli + .map(image => ({ + [path.join(image.dir, image.filename)]: path.join( + image.dir, + image.filename + ) + })) + .reduce((obj, item) => { + obj[Object.keys(item)[0]] = Object.values(item)[0]; + return obj; + }, {}); this.study = lab.util.fromObject(clonedeep(faceshouses), lab); break; - case 'Custom':default: + case 'Custom': + default: custom.parameters = props.settings.params; custom.parameters.title = props.settings.title; - custom.files = props.settings.params.stimuli.map(image => ({ - [path.join(image.dir, image.filename)]: path.join(image.dir, image.filename) - })).reduce((obj, item) => { - obj[Object.keys(item)[0]] = Object.values(item)[0]; - return obj; - }, {}); + custom.files = props.settings.params.stimuli + .map(image => ({ + [path.join(image.dir, image.filename)]: path.join( + image.dir, + image.filename + ) + })) + .reduce((obj, item) => { + obj[Object.keys(item)[0]] = Object.values(item)[0]; + return obj; + }, {}); this.study = lab.util.fromObject(clonedeep(custom), lab); break; - } this.study.run(); this.study.on('end', () => { @@ -87,15 +94,17 @@ class ExperimentWindow extends Component { } render() { - return
+ return ( +

Loading Experiment

The experiment is loading and should start in a few seconds

-
; +
+ ); } } -export { ExperimentWindow }; \ No newline at end of file +export { ExperimentWindow }; diff --git a/app/utils/labjs/protocols/custom.ts b/app/utils/labjs/protocols/custom.ts index 99655852..38ee3677 100644 --- a/app/utils/labjs/protocols/custom.ts +++ b/app/utils/labjs/protocols/custom.ts @@ -1,5 +1,5 @@ -import * as path from "path"; -import { EVENTS } from "../../../constants/constants"; +import * as path from 'path'; +import { EVENTS } from '../../../constants/constants'; // Default directories containing stimuli const rootFolder = __dirname; // Note: there's a weird issue where the fs readdir function reads from BrainWaves dir @@ -32,10 +32,13 @@ export const buildCustomTimeline = () => ({ protocol_condition_second_title: `Houses`, protocol_condition_second: `If you see a house, press “9”.`, overview_links: [], - background_links: [{ - name: 'Link 1', - address: 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn' - }], + background_links: [ + { + name: 'Link 1', + address: + 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn' + } + ], protocal_links: [], params: { imageHeight: '500px', @@ -96,15 +99,18 @@ export const buildCustomTimeline = () => ({ timelines: { faceHouseTimeline: { id: 'faceHouseTimeline', - timeline: [{ - id: 'interTrial', - type: 'callback-image-display', - stimulus: fixation, - response_ends_trial: false - }, { - id: 'trial', - response_ends_trial: false - }] + timeline: [ + { + id: 'interTrial', + type: 'callback-image-display', + stimulus: fixation, + response_ends_trial: false + }, + { + id: 'trial', + response_ends_trial: false + } + ] } } -}); \ No newline at end of file +}); diff --git a/app/utils/labjs/protocols/faceshouses.ts b/app/utils/labjs/protocols/faceshouses.ts index 11c13fd2..66f610e3 100644 --- a/app/utils/labjs/protocols/faceshouses.ts +++ b/app/utils/labjs/protocols/faceshouses.ts @@ -1,5 +1,5 @@ -import * as path from "path"; -import { EVENTS } from "../../../constants/constants"; +import * as path from 'path'; +import { EVENTS } from '../../../constants/constants'; // Default directories containing stimuli const rootFolder = __dirname; // Note: there's a weird issue where the fs readdir function reads from BrainWaves dir @@ -8,7 +8,68 @@ const facesDir = path.join(rootFolder, 'assets', 'face_house', 'faces'); const housesDir = path.join(rootFolder, 'assets', 'face_house', 'houses'); const fixation = path.join(rootFolder, 'assets', 'common', 'fixationcross.png'); -const stimuli = ['Face1', 'Face2', 'Face3', 'Face4', 'Face5', 'Face6', 'Face7', 'Face8', 'Face9', 'Face10', 'Face11', 'Face12', 'Face13', 'Face14', 'Face15', 'Face16', 'Face17', 'Face18', 'Face19', 'Face20', 'Face21', 'Face22', 'Face23', 'Face24', 'Face25', 'Face26', 'Face27', 'Face28', 'Face29', 'Face30', 'House1', 'House2', 'House3', 'House4', 'House5', 'House6', 'House7', 'House8', 'House9', 'House10', 'House11', 'House12', 'House13', 'House14', 'House15', 'House16', 'House17', 'House18', 'House19', 'House20', 'House21', 'House22', 'House23', 'House24', 'House25', 'House26', 'House27', 'House28', 'House29', 'House30'].map(s => ({ +const stimuli = [ + 'Face1', + 'Face2', + 'Face3', + 'Face4', + 'Face5', + 'Face6', + 'Face7', + 'Face8', + 'Face9', + 'Face10', + 'Face11', + 'Face12', + 'Face13', + 'Face14', + 'Face15', + 'Face16', + 'Face17', + 'Face18', + 'Face19', + 'Face20', + 'Face21', + 'Face22', + 'Face23', + 'Face24', + 'Face25', + 'Face26', + 'Face27', + 'Face28', + 'Face29', + 'Face30', + 'House1', + 'House2', + 'House3', + 'House4', + 'House5', + 'House6', + 'House7', + 'House8', + 'House9', + 'House10', + 'House11', + 'House12', + 'House13', + 'House14', + 'House15', + 'House16', + 'House17', + 'House18', + 'House19', + 'House20', + 'House21', + 'House22', + 'House23', + 'House24', + 'House25', + 'House26', + 'House27', + 'House28', + 'House29', + 'House30' +].map(s => ({ condition: s.startsWith('Face') ? 'Face' : 'House', dir: s.startsWith('Face') ? facesDir : housesDir, filename: `${s}.jpg`, @@ -44,10 +105,13 @@ export const buildN170Timeline = () => ({ protocol_condition_second_title: `Houses`, protocol_condition_second: `If participants see a house, they should press “9”.`, overview_links: [], - background_links: [{ - name: 'Link 1', - address: 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn' - }], + background_links: [ + { + name: 'Link 1', + address: + 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn' + } + ], protocal_links: [], params: { imageHeight: '500px', @@ -108,15 +172,18 @@ export const buildN170Timeline = () => ({ timelines: { faceHouseTimeline: { id: 'faceHouseTimeline', - timeline: [{ - id: 'interTrial', - type: 'callback-image-display', - stimulus: fixation, - response_ends_trial: false - }, { - id: 'trial', - response_ends_trial: false - }] + timeline: [ + { + id: 'interTrial', + type: 'callback-image-display', + stimulus: fixation, + response_ends_trial: false + }, + { + id: 'trial', + response_ends_trial: false + } + ] } } -}); \ No newline at end of file +}); diff --git a/app/utils/labjs/protocols/multi.ts b/app/utils/labjs/protocols/multi.ts index 6eb6e61c..47b323da 100644 --- a/app/utils/labjs/protocols/multi.ts +++ b/app/utils/labjs/protocols/multi.ts @@ -1,5 +1,5 @@ -import * as path from "path"; -import { EVENTS } from "../../../constants/constants"; +import * as path from 'path'; +import { EVENTS } from '../../../constants/constants'; // Default directories containing stimuli const rootFolder = __dirname; // Note: there's a weird issue where the fs readdir function reads from BrainWaves dir @@ -31,13 +31,18 @@ export const buildMultiTimeline = () => ({ protocol_condition_second_title: `Rule 2`, protocol_condition_second: `If the object is shown on the bottom, they need to respond to the number of dots inside (pressing ‘n’ for 3 dots and ‘b’ for 2 dots). `, overview_links: [], - background_links: [{ - name: 'Link 1', - address: 'https://www.scientificamerican.com/podcast/episode/the-myth-of-multitasking-09-07-15/' - }, { - name: 'Link 2', - address: 'https://www.scientificamerican.com/article/multitasking-two-tasks/' - }], + background_links: [ + { + name: 'Link 1', + address: + 'https://www.scientificamerican.com/podcast/episode/the-myth-of-multitasking-09-07-15/' + }, + { + name: 'Link 2', + address: + 'https://www.scientificamerican.com/article/multitasking-two-tasks/' + } + ], protocal_links: [], params: { trialDuration: 1000, @@ -78,15 +83,18 @@ export const buildMultiTimeline = () => ({ timelines: { faceHouseTimeline: { id: 'multiTaskingTimeline', - timeline: [{ - id: 'interTrial', - type: 'callback-image-display', - stimulus: fixation, - response_ends_trial: false - }, { - id: 'trial', - response_ends_trial: false - }] + timeline: [ + { + id: 'interTrial', + type: 'callback-image-display', + stimulus: fixation, + response_ends_trial: false + }, + { + id: 'trial', + response_ends_trial: false + } + ] } } -}); \ No newline at end of file +}); diff --git a/app/utils/labjs/protocols/search.ts b/app/utils/labjs/protocols/search.ts index 5e576788..eb3af316 100644 --- a/app/utils/labjs/protocols/search.ts +++ b/app/utils/labjs/protocols/search.ts @@ -1,5 +1,5 @@ -import * as path from "path"; -import { EVENTS } from "../../../constants/constants"; +import * as path from 'path'; +import { EVENTS } from '../../../constants/constants'; // Default directories containing stimuli const rootFolder = __dirname; // Note: there's a weird issue where the fs readdir function reads from BrainWaves dir @@ -75,15 +75,18 @@ export const buildSearchTimeline = () => ({ timelines: { faceHouseTimeline: { id: 'visualSearchTimeline', - timeline: [{ - id: 'interTrial', - type: 'callback-image-display', - stimulus: fixation, - response_ends_trial: false - }, { - id: 'trial', - response_ends_trial: false - }] + timeline: [ + { + id: 'interTrial', + type: 'callback-image-display', + stimulus: fixation, + response_ends_trial: false + }, + { + id: 'trial', + response_ends_trial: false + } + ] } } -}); \ No newline at end of file +}); diff --git a/app/utils/labjs/protocols/stroop.ts b/app/utils/labjs/protocols/stroop.ts index c8180bdc..36117c90 100644 --- a/app/utils/labjs/protocols/stroop.ts +++ b/app/utils/labjs/protocols/stroop.ts @@ -1,5 +1,5 @@ -import * as path from "path"; -import { EVENTS } from "../../../constants/constants"; +import * as path from 'path'; +import { EVENTS } from '../../../constants/constants'; // Default directories containing stimuli const rootFolder = __dirname; // Note: there's a weird issue where the fs readdir function reads from BrainWaves dir @@ -34,10 +34,13 @@ export const buildStroopTimeline = () => ({ protocol_condition_second_title: `"Green" written in red`, protocol_condition_second: `The color is red, so the correct response is ‘r’.`, overview_links: [], - background_links: [{ - name: 'Link 1', - address: 'https://www.psychologytoday.com/us/blog/play-in-mind/201204/when-red-looks-blue-and-yes-means-no' - }], + background_links: [ + { + name: 'Link 1', + address: + 'https://www.psychologytoday.com/us/blog/play-in-mind/201204/when-red-looks-blue-and-yes-means-no' + } + ], protocal_links: [], params: { trialDuration: 1000, @@ -78,15 +81,18 @@ export const buildStroopTimeline = () => ({ timelines: { faceHouseTimeline: { id: 'stroopTimeline', - timeline: [{ - id: 'interTrial', - type: 'callback-image-display', - stimulus: fixation, - response_ends_trial: false - }, { - id: 'trial', - response_ends_trial: false - }] + timeline: [ + { + id: 'interTrial', + type: 'callback-image-display', + stimulus: fixation, + response_ends_trial: false + }, + { + id: 'trial', + response_ends_trial: false + } + ] } } -}); \ No newline at end of file +}); diff --git a/app/utils/labjs/scripts/custom.ts b/app/utils/labjs/scripts/custom.ts index bfbe5ed0..db233e45 100644 --- a/app/utils/labjs/scripts/custom.ts +++ b/app/utils/labjs/scripts/custom.ts @@ -7,430 +7,516 @@ const studyObject = { metadata: {}, files: {}, responses: {}, - content: [{ - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'The face-house task', - content: [{ - type: 'lab.html.Screen', + content: [ + { + type: 'lab.flow.Sequence', files: {}, parameters: {}, - responses: { - 'keypress(Space)': 'continue', - 'keypress(q)': 'skipPractice' - }, - messageHandlers: {}, - title: 'Instruction', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003E${this.parameters.title || "The face-house task"}\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' - }, { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw-shuffle', - n: '' - }, responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - let initParameters = [...this.parameters.stimuli] || []; - initParameters = initParameters.filter(t => t.phase === 'practice') || []; - let numberTrials = this.parameters.nbPracticeTrials; - if (initParameters.length === 0) { - numberTrials = 0; - } - const randomize = this.parameters.randomize; - const trialsLength = initParameters.length; - if (numberTrials > trialsLength) { - const append = [...initParameters]; - const multiply = Math.ceil(numberTrials / trialsLength); - for (let i = 0; i < multiply; i++) { - initParameters = initParameters.concat(append); - } - } - - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - if (randomize === 'random') { - shuffle(initParameters); - } - - const trialConstructor = file => ({ - condition: file.condition, - image: `${file.dir}/${file.filename}`, - correctResponse: file.response, - phase: 'practice', - name: file.name, - type: file.type - }); - - // balance design across conditions - const conditions = Array.from(new Set(initParameters.map(p => p.condition))); - const conditionsParameters = {}; - for (const c of conditions) { - conditionsParameters[c] = initParameters.filter(p => p.condition == c); - } - const numberConditionsTrials = Math.ceil(numberTrials / conditions.length); - let balancedParameters = []; - for (let i = 0; i < numberConditionsTrials; i++) { - for (const c of conditions) { - balancedParameters = balancedParameters.concat(conditionsParameters[c][i % conditionsParameters[c].length]); - } - } - initParameters = [...balancedParameters.slice(0, numberTrials)]; - - let practiceParameters = []; - for (let i = 0; i < numberTrials; i++) { - practiceParameters = practiceParameters.concat(trialConstructor(initParameters[i])); - } - - // assign options values to parameters of this task - this.options.templateParameters = practiceParameters; - if (randomize === 'random') { - this.options.shuffle = true; - } else { - this.options.shuffle = false; - } - } - }, - title: 'Practice loop', - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial', - content: [{ - type: 'lab.canvas.Screen', - content: [{ - type: 'rect', - left: 0, - top: 0, - angle: 0, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - }, { - type: 'rect', - left: 0, - top: 0, - angle: 90, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - }], + messageHandlers: {}, + title: 'The face-house task', + content: [ + { + type: 'lab.html.Screen', files: {}, parameters: {}, - responses: {}, + responses: { + 'keypress(Space)': 'continue', + 'keypress(q)': 'skipPractice' + }, messageHandlers: {}, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${parameters.iti}' - }, { - type: 'lab.html.Screen', + title: 'Instruction', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003E${this.parameters.title || "The face-house task"}\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' + }, + { + type: 'lab.flow.Loop', files: {}, - responses: {}, parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle', + n: '' + }, + responses: {}, messageHandlers: { 'before:prepare': function anonymous() { - // This code registers an event listener for this screen. - // We have a timeout for this screen, but we also want to record responses. - // On a keydown event, we record the key and the time of response. - // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). - // "this" in the code means the lab.js experiment. - const responses = [...new Set(this.parameters.stimuli.map(e => e.response))]; - this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); - this.data.response_given = 'no'; + let initParameters = [...this.parameters.stimuli] || []; + initParameters = + initParameters.filter(t => t.phase === 'practice') || []; + let numberTrials = this.parameters.nbPracticeTrials; + if (initParameters.length === 0) { + numberTrials = 0; + } + const randomize = this.parameters.randomize; + const trialsLength = initParameters.length; + if (numberTrials > trialsLength) { + const append = [...initParameters]; + const multiply = Math.ceil(numberTrials / trialsLength); + for (let i = 0; i < multiply; i++) { + initParameters = initParameters.concat(append); + } + } - this.options.events = { - keydown: event => { - if (responses.includes(event.key)) { - this.data.reaction_time = this.timer; - if (this.parameters.phase === 'task') this.data.response_given = 'yes'; - this.data.response = event.key; - if (this.data.response == this.parameters.correctResponse) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - this.end(); - } + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; } - }; - }, - run: function anonymous() { - this.parameters.callbackForEEG(this.parameters.type); - } - }, - title: 'Stimulus', - timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - content: '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - left: 0, - top: 0, - angle: 0, - width: 895.3, - height: 36.16, - stroke: null, - strokeWidth: 1, - fill: "${ state.correct_response ? 'green' : 'red' }", - text: "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", - fontStyle: 'normal', - fontWeight: 'bold', - fontSize: '52', - fontFamily: 'sans-serif', - lineHeight: 1.16, - textAlign: 'center' - }], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - end: function anonymous() { - this.data.correct_response = false; - } - }, - viewport: [800, 600], - title: 'Feedback', - tardy: true, - timeout: '1000', - skip: "${ parameters.phase === 'task' }" - }] - } - }, { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: {}, - title: 'Main task', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' - }, { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw-shuffle', - n: '' - }, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - let initialParameters = [...this.parameters.stimuli] || []; - initialParameters = initialParameters.filter(t => t.phase === 'main') || []; - let numberTrials = this.parameters.nbTrials; - if (initialParameters.length === 0) { - numberTrials = 0; - } - const randomize = this.parameters.randomize; - const trialsLength = initialParameters.length; - if (numberTrials > trialsLength) { - const append = [...initialParameters]; - const multiply = Math.ceil(numberTrials / trialsLength); - for (let i = 0; i < multiply; i++) { - initialParameters = initialParameters.concat(append); - } - } + return a; + } - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } + if (randomize === 'random') { + shuffle(initParameters); + } - if (randomize === 'random') { - shuffle(initialParameters); - } + const trialConstructor = file => ({ + condition: file.condition, + image: `${file.dir}/${file.filename}`, + correctResponse: file.response, + phase: 'practice', + name: file.name, + type: file.type + }); - const trialConstructor = file => ({ - condition: file.condition, - image: `${file.dir}/${file.filename}`, - correctResponse: file.response, - phase: 'task', - name: file.name, - type: file.type - }); - // balance design across conditions - const conditions = Array.from(new Set(initialParameters.map(p => p.condition))); - const conditionsParameters = {}; - for (const c of conditions) { - conditionsParameters[c] = initialParameters.filter(p => p.condition == c); - } - const numberConditionsTrials = Math.ceil(numberTrials / conditions.length); - let balancedParameters = []; - for (let i = 0; i < numberConditionsTrials; i++) { - for (const c of conditions) { - balancedParameters = balancedParameters.concat(conditionsParameters[c][i % conditionsParameters[c].length]); + // balance design across conditions + const conditions = Array.from( + new Set(initParameters.map(p => p.condition)) + ); + const conditionsParameters = {}; + for (const c of conditions) { + conditionsParameters[c] = initParameters.filter( + p => p.condition == c + ); + } + const numberConditionsTrials = Math.ceil( + numberTrials / conditions.length + ); + let balancedParameters = []; + for (let i = 0; i < numberConditionsTrials; i++) { + for (const c of conditions) { + balancedParameters = balancedParameters.concat( + conditionsParameters[c][i % conditionsParameters[c].length] + ); + } + } + initParameters = [...balancedParameters.slice(0, numberTrials)]; + + let practiceParameters = []; + for (let i = 0; i < numberTrials; i++) { + practiceParameters = practiceParameters.concat( + trialConstructor(initParameters[i]) + ); + } + + // assign options values to parameters of this task + this.options.templateParameters = practiceParameters; + if (randomize === 'random') { + this.options.shuffle = true; + } else { + this.options.shuffle = false; + } } - } - initialParameters = [...balancedParameters.slice(0, numberTrials)]; + }, + title: 'Practice loop', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [ + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'rect', + left: 0, + top: 0, + angle: 0, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + }, + { + type: 'rect', + left: 0, + top: 0, + angle: 90, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${parameters.iti}' + }, + { + type: 'lab.html.Screen', + files: {}, + responses: {}, + parameters: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + // This code registers an event listener for this screen. + // We have a timeout for this screen, but we also want to record responses. + // On a keydown event, we record the key and the time of response. + // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). + // "this" in the code means the lab.js experiment. + const responses = [ + ...new Set(this.parameters.stimuli.map(e => e.response)) + ]; + this.data.trial_number = + 1 + + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); + this.data.response_given = 'no'; - let trialParameters = []; - for (let i = 0; i < numberTrials; i++) { - trialParameters = [...trialParameters.concat(trialConstructor(initialParameters[i]))]; - } - // assign options values to parameters of this task - this.options.templateParameters = trialParameters; - if (randomize === 'random') { - this.options.shuffle = true; - } else { - this.options.shuffle = false; + this.options.events = { + keydown: event => { + if (responses.includes(event.key)) { + this.data.reaction_time = this.timer; + if (this.parameters.phase === 'task') + this.data.response_given = 'yes'; + this.data.response = event.key; + if ( + this.data.response == + this.parameters.correctResponse + ) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + this.end(); + } + } + }; + }, + run: function anonymous() { + this.parameters.callbackForEEG(this.parameters.type); + } + }, + title: 'Stimulus', + timeout: + "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + content: + '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + left: 0, + top: 0, + angle: 0, + width: 895.3, + height: 36.16, + stroke: null, + strokeWidth: 1, + fill: "${ state.correct_response ? 'green' : 'red' }", + text: + "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", + fontStyle: 'normal', + fontWeight: 'bold', + fontSize: '52', + fontFamily: 'sans-serif', + lineHeight: 1.16, + textAlign: 'center' + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + end: function anonymous() { + this.data.correct_response = false; + } + }, + viewport: [800, 600], + title: 'Feedback', + tardy: true, + timeout: '1000', + skip: "${ parameters.phase === 'task' }" + } + ] } - } - }, - title: 'Experiment loop', - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial', - content: [{ - type: 'lab.canvas.Screen', - content: [{ - type: 'rect', - left: 0, - top: 0, - angle: 0, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - }, { - type: 'rect', - left: 0, - top: 0, - angle: 90, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - }], + }, + { + type: 'lab.html.Screen', files: {}, parameters: {}, - responses: {}, + responses: { + 'keypress(Space)': 'continue' + }, messageHandlers: {}, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${parameters.iti}' - }, { - type: 'lab.html.Screen', + title: 'Main task', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' + }, + { + type: 'lab.flow.Loop', files: {}, - responses: {}, parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle', + n: '' + }, + responses: {}, messageHandlers: { 'before:prepare': function anonymous() { - // This code registers an event listener for this screen. - // We have a timeout for this screen, but we also want to record responses. - // On a keydown event, we record the key and the time of response. - // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). - // "this" in the code means the lab.js experiment. - const responses = [...new Set(this.parameters.stimuli.map(e => e.response))]; - this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); - this.data.response_given = 'no'; + let initialParameters = [...this.parameters.stimuli] || []; + initialParameters = + initialParameters.filter(t => t.phase === 'main') || []; + let numberTrials = this.parameters.nbTrials; + if (initialParameters.length === 0) { + numberTrials = 0; + } + const randomize = this.parameters.randomize; + const trialsLength = initialParameters.length; + if (numberTrials > trialsLength) { + const append = [...initialParameters]; + const multiply = Math.ceil(numberTrials / trialsLength); + for (let i = 0; i < multiply; i++) { + initialParameters = initialParameters.concat(append); + } + } - this.options.events = { - keydown: event => { - if (responses.includes(event.key)) { - this.data.reaction_time = this.timer; - if (this.parameters.phase === 'task') this.data.response_given = 'yes'; - this.data.response = event.key; - if (this.data.response == this.parameters.correctResponse) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - this.end(); - } + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; } - }; - }, - run: function anonymous() { - this.parameters.callbackForEEG(this.parameters.type); + return a; + } + + if (randomize === 'random') { + shuffle(initialParameters); + } + + const trialConstructor = file => ({ + condition: file.condition, + image: `${file.dir}/${file.filename}`, + correctResponse: file.response, + phase: 'task', + name: file.name, + type: file.type + }); + // balance design across conditions + const conditions = Array.from( + new Set(initialParameters.map(p => p.condition)) + ); + const conditionsParameters = {}; + for (const c of conditions) { + conditionsParameters[c] = initialParameters.filter( + p => p.condition == c + ); + } + const numberConditionsTrials = Math.ceil( + numberTrials / conditions.length + ); + let balancedParameters = []; + for (let i = 0; i < numberConditionsTrials; i++) { + for (const c of conditions) { + balancedParameters = balancedParameters.concat( + conditionsParameters[c][i % conditionsParameters[c].length] + ); + } + } + initialParameters = [ + ...balancedParameters.slice(0, numberTrials) + ]; + + let trialParameters = []; + for (let i = 0; i < numberTrials; i++) { + trialParameters = [ + ...trialParameters.concat( + trialConstructor(initialParameters[i]) + ) + ]; + } + // assign options values to parameters of this task + this.options.templateParameters = trialParameters; + if (randomize === 'random') { + this.options.shuffle = true; + } else { + this.options.shuffle = false; + } } }, - title: 'Stimulus', - timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - content: '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - left: 0, - top: 0, - angle: 0, - width: 895.3, - height: 36.16, - stroke: null, - strokeWidth: 1, - fill: "${ state.correct_response ? 'green' : 'red' }", - text: "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", - fontStyle: 'normal', - fontWeight: 'bold', - fontSize: '52', - fontFamily: 'sans-serif', - lineHeight: 1.16, - textAlign: 'center' - }], + title: 'Experiment loop', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [ + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'rect', + left: 0, + top: 0, + angle: 0, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + }, + { + type: 'rect', + left: 0, + top: 0, + angle: 90, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${parameters.iti}' + }, + { + type: 'lab.html.Screen', + files: {}, + responses: {}, + parameters: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + // This code registers an event listener for this screen. + // We have a timeout for this screen, but we also want to record responses. + // On a keydown event, we record the key and the time of response. + // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). + // "this" in the code means the lab.js experiment. + const responses = [ + ...new Set(this.parameters.stimuli.map(e => e.response)) + ]; + this.data.trial_number = + 1 + + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); + this.data.response_given = 'no'; + + this.options.events = { + keydown: event => { + if (responses.includes(event.key)) { + this.data.reaction_time = this.timer; + if (this.parameters.phase === 'task') + this.data.response_given = 'yes'; + this.data.response = event.key; + if ( + this.data.response == + this.parameters.correctResponse + ) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + this.end(); + } + } + }; + }, + run: function anonymous() { + this.parameters.callbackForEEG(this.parameters.type); + } + }, + title: 'Stimulus', + timeout: + "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + timeout: + "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + content: + '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + left: 0, + top: 0, + angle: 0, + width: 895.3, + height: 36.16, + stroke: null, + strokeWidth: 1, + fill: "${ state.correct_response ? 'green' : 'red' }", + text: + "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", + fontStyle: 'normal', + fontWeight: 'bold', + fontSize: '52', + fontFamily: 'sans-serif', + lineHeight: 1.16, + textAlign: 'center' + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Feedback', + tardy: true, + timeout: '1000', + skip: "${ parameters.phase === 'task' }" + } + ] + } + }, + { + type: 'lab.html.Screen', files: {}, parameters: {}, - responses: {}, + responses: { + 'keypress(Space)': 'end' + }, messageHandlers: {}, - viewport: [800, 600], - title: 'Feedback', - tardy: true, - timeout: '1000', - skip: "${ parameters.phase === 'task' }" - }] - } - }, { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'end' - }, - messageHandlers: {}, - title: 'End', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' - }] - }] + title: 'End', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' + } + ] + } + ] }; // export -export default studyObject; \ No newline at end of file +export default studyObject; diff --git a/app/utils/labjs/scripts/faceshouses.ts b/app/utils/labjs/scripts/faceshouses.ts index 247bb66e..3a3338f8 100644 --- a/app/utils/labjs/scripts/faceshouses.ts +++ b/app/utils/labjs/scripts/faceshouses.ts @@ -7,430 +7,515 @@ const studyObject = { metadata: {}, files: {}, responses: {}, - content: [{ - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'The face-house task', - content: [{ - type: 'lab.html.Screen', + content: [ + { + type: 'lab.flow.Sequence', files: {}, parameters: {}, - responses: { - 'keypress(Space)': 'continue', - 'keypress(q)': 'skipPractice' - }, - messageHandlers: {}, - title: 'Instruction', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EThe face-house task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' - }, { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw-shuffle', - n: '' - }, responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - let initParameters = [...this.parameters.stimuli] || []; - // initParameters = initParameters.filter(t => t.phase === 'practice') || []; - let numberTrials = this.parameters.nbPracticeTrials; - if (initParameters.length === 0) { - numberTrials = 0; - } - const randomize = this.parameters.randomize; - const trialsLength = initParameters.length; - if (numberTrials > trialsLength) { - const append = [...initParameters]; - const multiply = Math.ceil(numberTrials / trialsLength); - for (let i = 0; i < multiply; i++) { - initParameters = initParameters.concat(append); - } - } - - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - if (randomize === 'random') { - shuffle(initParameters); - } - - const trialConstructor = file => ({ - condition: file.condition, - image: `${file.dir}/${file.filename}`, - correctResponse: file.response, - phase: 'practice', - name: file.name, - type: file.type - }); - - // balance design across conditions - const conditions = Array.from(new Set(initParameters.map(p => p.condition))); - const conditionsParameters = {}; - for (const c of conditions) { - conditionsParameters[c] = initParameters.filter(p => p.condition == c); - } - const numberConditionsTrials = Math.ceil(numberTrials / conditions.length); - let balancedParameters = []; - for (let i = 0; i < numberConditionsTrials; i++) { - for (const c of conditions) { - balancedParameters = balancedParameters.concat(conditionsParameters[c][i % conditionsParameters[c].length]); - } - } - initParameters = [...balancedParameters.slice(0, numberTrials)]; - - let practiceParameters = []; - for (let i = 0; i < numberTrials; i++) { - practiceParameters = practiceParameters.concat(trialConstructor(initParameters[i])); - } - - // assign options values to parameters of this task - this.options.templateParameters = practiceParameters; - if (randomize === 'random') { - this.options.shuffle = true; - } else { - this.options.shuffle = false; - } - } - }, - title: 'Practice loop', - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial', - content: [{ - type: 'lab.canvas.Screen', - content: [{ - type: 'rect', - left: 0, - top: 0, - angle: 0, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - }, { - type: 'rect', - left: 0, - top: 0, - angle: 90, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - }], + messageHandlers: {}, + title: 'The face-house task', + content: [ + { + type: 'lab.html.Screen', files: {}, parameters: {}, - responses: {}, + responses: { + 'keypress(Space)': 'continue', + 'keypress(q)': 'skipPractice' + }, messageHandlers: {}, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${parameters.iti}' - }, { - type: 'lab.html.Screen', + title: 'Instruction', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EThe face-house task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' + }, + { + type: 'lab.flow.Loop', files: {}, - responses: {}, parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle', + n: '' + }, + responses: {}, messageHandlers: { 'before:prepare': function anonymous() { - // This code registers an event listener for this screen. - // We have a timeout for this screen, but we also want to record responses. - // On a keydown event, we record the key and the time of response. - // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). - // "this" in the code means the lab.js experiment. - const responses = [...new Set(this.parameters.stimuli.map(e => e.response))]; - this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); - this.data.response_given = 'no'; + let initParameters = [...this.parameters.stimuli] || []; + // initParameters = initParameters.filter(t => t.phase === 'practice') || []; + let numberTrials = this.parameters.nbPracticeTrials; + if (initParameters.length === 0) { + numberTrials = 0; + } + const randomize = this.parameters.randomize; + const trialsLength = initParameters.length; + if (numberTrials > trialsLength) { + const append = [...initParameters]; + const multiply = Math.ceil(numberTrials / trialsLength); + for (let i = 0; i < multiply; i++) { + initParameters = initParameters.concat(append); + } + } - this.options.events = { - keydown: event => { - if (responses.includes(event.key)) { - this.data.reaction_time = this.timer; - if (this.parameters.phase === 'task') this.data.response_given = 'yes'; - this.data.response = event.key; - if (this.data.response == this.parameters.correctResponse) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - this.end(); - } + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; } - }; - }, - run: function anonymous() { - this.parameters.callbackForEEG(this.parameters.type); - } - }, - title: 'Stimulus', - timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - content: '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - left: 0, - top: 0, - angle: 0, - width: 895.3, - height: 36.16, - stroke: null, - strokeWidth: 1, - fill: "${ state.correct_response ? 'green' : 'red' }", - text: "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", - fontStyle: 'normal', - fontWeight: 'bold', - fontSize: '52', - fontFamily: 'sans-serif', - lineHeight: 1.16, - textAlign: 'center' - }], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - end: function anonymous() { - this.data.correct_response = false; - } - }, - viewport: [800, 600], - title: 'Feedback', - tardy: true, - timeout: '1000', - skip: "${ parameters.phase === 'task' }" - }] - } - }, { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: {}, - title: 'Main task', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' - }, { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw-shuffle', - n: '' - }, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - let initialParameters = [...this.parameters.stimuli] || []; - initialParameters = initialParameters.filter(t => t.phase === 'main') || []; - let numberTrials = this.parameters.nbTrials; - if (initialParameters.length === 0) { - numberTrials = 0; - } - const randomize = this.parameters.randomize; - const trialsLength = initialParameters.length; - if (numberTrials > trialsLength) { - const append = [...initialParameters]; - const multiply = Math.ceil(numberTrials / trialsLength); - for (let i = 0; i < multiply; i++) { - initialParameters = initialParameters.concat(append); - } - } + return a; + } - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } + if (randomize === 'random') { + shuffle(initParameters); + } - if (randomize === 'random') { - shuffle(initialParameters); - } + const trialConstructor = file => ({ + condition: file.condition, + image: `${file.dir}/${file.filename}`, + correctResponse: file.response, + phase: 'practice', + name: file.name, + type: file.type + }); - const trialConstructor = file => ({ - condition: file.condition, - image: `${file.dir}/${file.filename}`, - correctResponse: file.response, - phase: 'task', - name: file.name, - type: file.type - }); - // balance design across conditions - const conditions = Array.from(new Set(initialParameters.map(p => p.condition))); - const conditionsParameters = {}; - for (const c of conditions) { - conditionsParameters[c] = initialParameters.filter(p => p.condition == c); - } - const numberConditionsTrials = Math.ceil(numberTrials / conditions.length); - let balancedParameters = []; - for (let i = 0; i < numberConditionsTrials; i++) { - for (const c of conditions) { - balancedParameters = balancedParameters.concat(conditionsParameters[c][i % conditionsParameters[c].length]); + // balance design across conditions + const conditions = Array.from( + new Set(initParameters.map(p => p.condition)) + ); + const conditionsParameters = {}; + for (const c of conditions) { + conditionsParameters[c] = initParameters.filter( + p => p.condition == c + ); + } + const numberConditionsTrials = Math.ceil( + numberTrials / conditions.length + ); + let balancedParameters = []; + for (let i = 0; i < numberConditionsTrials; i++) { + for (const c of conditions) { + balancedParameters = balancedParameters.concat( + conditionsParameters[c][i % conditionsParameters[c].length] + ); + } + } + initParameters = [...balancedParameters.slice(0, numberTrials)]; + + let practiceParameters = []; + for (let i = 0; i < numberTrials; i++) { + practiceParameters = practiceParameters.concat( + trialConstructor(initParameters[i]) + ); + } + + // assign options values to parameters of this task + this.options.templateParameters = practiceParameters; + if (randomize === 'random') { + this.options.shuffle = true; + } else { + this.options.shuffle = false; + } } - } - initialParameters = [...balancedParameters.slice(0, numberTrials)]; + }, + title: 'Practice loop', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [ + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'rect', + left: 0, + top: 0, + angle: 0, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + }, + { + type: 'rect', + left: 0, + top: 0, + angle: 90, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${parameters.iti}' + }, + { + type: 'lab.html.Screen', + files: {}, + responses: {}, + parameters: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + // This code registers an event listener for this screen. + // We have a timeout for this screen, but we also want to record responses. + // On a keydown event, we record the key and the time of response. + // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). + // "this" in the code means the lab.js experiment. + const responses = [ + ...new Set(this.parameters.stimuli.map(e => e.response)) + ]; + this.data.trial_number = + 1 + + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); + this.data.response_given = 'no'; - let trialParameters = []; - for (let i = 0; i < numberTrials; i++) { - trialParameters = [...trialParameters.concat(trialConstructor(initialParameters[i]))]; - } - // assign options values to parameters of this task - this.options.templateParameters = trialParameters; - if (randomize === 'random') { - this.options.shuffle = true; - } else { - this.options.shuffle = false; + this.options.events = { + keydown: event => { + if (responses.includes(event.key)) { + this.data.reaction_time = this.timer; + if (this.parameters.phase === 'task') + this.data.response_given = 'yes'; + this.data.response = event.key; + if ( + this.data.response == + this.parameters.correctResponse + ) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + this.end(); + } + } + }; + }, + run: function anonymous() { + this.parameters.callbackForEEG(this.parameters.type); + } + }, + title: 'Stimulus', + timeout: + "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + content: + '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + left: 0, + top: 0, + angle: 0, + width: 895.3, + height: 36.16, + stroke: null, + strokeWidth: 1, + fill: "${ state.correct_response ? 'green' : 'red' }", + text: + "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", + fontStyle: 'normal', + fontWeight: 'bold', + fontSize: '52', + fontFamily: 'sans-serif', + lineHeight: 1.16, + textAlign: 'center' + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + end: function anonymous() { + this.data.correct_response = false; + } + }, + viewport: [800, 600], + title: 'Feedback', + tardy: true, + timeout: '1000', + skip: "${ parameters.phase === 'task' }" + } + ] } - } - }, - title: 'Experiment loop', - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial', - content: [{ - type: 'lab.canvas.Screen', - content: [{ - type: 'rect', - left: 0, - top: 0, - angle: 0, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - }, { - type: 'rect', - left: 0, - top: 0, - angle: 90, - width: 10, - height: '50', - stroke: null, - strokeWidth: 1, - fill: 'black' - }], + }, + { + type: 'lab.html.Screen', files: {}, parameters: {}, - responses: {}, + responses: { + 'keypress(Space)': 'continue' + }, messageHandlers: {}, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${parameters.iti}' - }, { - type: 'lab.html.Screen', + title: 'Main task', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' + }, + { + type: 'lab.flow.Loop', files: {}, - responses: {}, parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle', + n: '' + }, + responses: {}, messageHandlers: { 'before:prepare': function anonymous() { - // This code registers an event listener for this screen. - // We have a timeout for this screen, but we also want to record responses. - // On a keydown event, we record the key and the time of response. - // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). - // "this" in the code means the lab.js experiment. - const responses = [...new Set(this.parameters.stimuli.map(e => e.response))]; - this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); - this.data.response_given = 'no'; + let initialParameters = [...this.parameters.stimuli] || []; + initialParameters = + initialParameters.filter(t => t.phase === 'main') || []; + let numberTrials = this.parameters.nbTrials; + if (initialParameters.length === 0) { + numberTrials = 0; + } + const randomize = this.parameters.randomize; + const trialsLength = initialParameters.length; + if (numberTrials > trialsLength) { + const append = [...initialParameters]; + const multiply = Math.ceil(numberTrials / trialsLength); + for (let i = 0; i < multiply; i++) { + initialParameters = initialParameters.concat(append); + } + } - this.options.events = { - keydown: event => { - if (responses.includes(event.key)) { - this.data.reaction_time = this.timer; - if (this.parameters.phase === 'task') this.data.response_given = 'yes'; - this.data.response = event.key; - if (this.data.response == this.parameters.correctResponse) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } - this.end(); - } + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; } - }; - }, - run: function anonymous() { - this.parameters.callbackForEEG(this.parameters.type); + return a; + } + + if (randomize === 'random') { + shuffle(initialParameters); + } + + const trialConstructor = file => ({ + condition: file.condition, + image: `${file.dir}/${file.filename}`, + correctResponse: file.response, + phase: 'task', + name: file.name, + type: file.type + }); + // balance design across conditions + const conditions = Array.from( + new Set(initialParameters.map(p => p.condition)) + ); + const conditionsParameters = {}; + for (const c of conditions) { + conditionsParameters[c] = initialParameters.filter( + p => p.condition == c + ); + } + const numberConditionsTrials = Math.ceil( + numberTrials / conditions.length + ); + let balancedParameters = []; + for (let i = 0; i < numberConditionsTrials; i++) { + for (const c of conditions) { + balancedParameters = balancedParameters.concat( + conditionsParameters[c][i % conditionsParameters[c].length] + ); + } + } + initialParameters = [ + ...balancedParameters.slice(0, numberTrials) + ]; + + let trialParameters = []; + for (let i = 0; i < numberTrials; i++) { + trialParameters = [ + ...trialParameters.concat( + trialConstructor(initialParameters[i]) + ) + ]; + } + // assign options values to parameters of this task + this.options.templateParameters = trialParameters; + if (randomize === 'random') { + this.options.shuffle = true; + } else { + this.options.shuffle = false; + } } }, - title: 'Stimulus', - timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - timeout: "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", - content: '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - left: 0, - top: 0, - angle: 0, - width: 895.3, - height: 36.16, - stroke: null, - strokeWidth: 1, - fill: "${ state.correct_response ? 'green' : 'red' }", - text: "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", - fontStyle: 'normal', - fontWeight: 'bold', - fontSize: '52', - fontFamily: 'sans-serif', - lineHeight: 1.16, - textAlign: 'center' - }], + title: 'Experiment loop', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [ + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'rect', + left: 0, + top: 0, + angle: 0, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + }, + { + type: 'rect', + left: 0, + top: 0, + angle: 90, + width: 10, + height: '50', + stroke: null, + strokeWidth: 1, + fill: 'black' + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${parameters.iti}' + }, + { + type: 'lab.html.Screen', + files: {}, + responses: {}, + parameters: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + // This code registers an event listener for this screen. + // We have a timeout for this screen, but we also want to record responses. + // On a keydown event, we record the key and the time of response. + // We also record whether the response was correct (by comparing the pressed key with the correct response which is defined inside the Experiment loop). + // "this" in the code means the lab.js experiment. + const responses = [ + ...new Set(this.parameters.stimuli.map(e => e.response)) + ]; + this.data.trial_number = + 1 + + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); + this.data.response_given = 'no'; + + this.options.events = { + keydown: event => { + if (responses.includes(event.key)) { + this.data.reaction_time = this.timer; + if (this.parameters.phase === 'task') + this.data.response_given = 'yes'; + this.data.response = event.key; + if ( + this.data.response == + this.parameters.correctResponse + ) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + this.end(); + } + } + }; + }, + run: function anonymous() { + this.parameters.callbackForEEG(this.parameters.type); + } + }, + title: 'Stimulus', + timeout: + "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + timeout: + "${parameters.selfPaced ? '3600000' : parameters.presentationTime}", + content: + '\u003Cmain class="content-horizontal-center content-vertical-center"\u003E\n \u003Cdiv\u003E\n \u003Cimg src=${ this.files[this.parameters.image] } height=${ this.parameters.imageHeight } \u002F\u003E\n \u003C\u002Fdiv\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n ${this.parameters.taskHelp} \n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + left: 0, + top: 0, + angle: 0, + width: 895.3, + height: 36.16, + stroke: null, + strokeWidth: 1, + fill: "${ state.correct_response ? 'green' : 'red' }", + text: + "${ state.correct_response ? 'Well done!' : 'Please respond accurately' }", + fontStyle: 'normal', + fontWeight: 'bold', + fontSize: '52', + fontFamily: 'sans-serif', + lineHeight: 1.16, + textAlign: 'center' + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Feedback', + tardy: true, + timeout: '1000', + skip: "${ parameters.phase === 'task' }" + } + ] + } + }, + { + type: 'lab.html.Screen', files: {}, parameters: {}, - responses: {}, + responses: { + 'keypress(Space)': 'end' + }, messageHandlers: {}, - viewport: [800, 600], - title: 'Feedback', - tardy: true, - timeout: '1000', - skip: "${ parameters.phase === 'task' }" - }] - } - }, { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'end' - }, - messageHandlers: {}, - title: 'End', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' - }] - }] + title: 'End', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' + } + ] + } + ] }; // export -export default studyObject; \ No newline at end of file +export default studyObject; diff --git a/app/utils/labjs/scripts/multitasking.ts b/app/utils/labjs/scripts/multitasking.ts index 00e2dc23..7253e4bf 100644 --- a/app/utils/labjs/scripts/multitasking.ts +++ b/app/utils/labjs/scripts/multitasking.ts @@ -1,7 +1,12 @@ -import * as path from "path"; +import * as path from 'path'; const rootFolder = __dirname; -const assetsDirectory = path.join(rootFolder, 'assets', 'labjs', 'multitasking'); +const assetsDirectory = path.join( + rootFolder, + 'assets', + 'labjs', + 'multitasking' +); // Define study const studyObject = { @@ -12,1179 +17,146 @@ const studyObject = { metadata: {}, files: {}, responses: {}, - content: [{ - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Multi-tasking', - content: [{ - type: 'lab.html.Screen', + content: [ + { + type: 'lab.flow.Sequence', files: {}, parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, + responses: {}, messageHandlers: {}, - title: 'Intro', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EThe multi-tasking test\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' - }, { - type: 'lab.html.Screen', - files: { - 'diamond_2.png': `${assetsDirectory}/diamond_2.png`, - 'diamond_3.png': `${assetsDirectory}/diamond_3.png`, - 'rectangle_2.png': `${assetsDirectory}/rectangle_2.png`, - 'rectangle_3.png': `${assetsDirectory}/rectangle_3.png`, - 'filling.png': `${assetsDirectory}/filling.png`, - 'shape.png': `${assetsDirectory}/shape.png`, - 'example_1.png': `${assetsDirectory}/example_1.png`, - 'example_2.png': `${assetsDirectory}/example_2.png`, - 'example_3.png': `${assetsDirectory}/example_3.png`, - 'example_4.png': `${assetsDirectory}/example_4.png`, - 'all_conditions.png': `${assetsDirectory}/all_conditions.png` - }, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: { - 'before:prepare': function anonymous() { - this.options.events['keydown'] = e => { - if (e.code === 'KeyQ') { - this.data.skipTraining = true; - this.end(); - } + title: 'Multi-tasking', + content: [ + { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue' + }, + messageHandlers: {}, + title: 'Intro', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EThe multi-tasking test\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E' + }, + { + type: 'lab.html.Screen', + files: { + 'diamond_2.png': `${assetsDirectory}/diamond_2.png`, + 'diamond_3.png': `${assetsDirectory}/diamond_3.png`, + 'rectangle_2.png': `${assetsDirectory}/rectangle_2.png`, + 'rectangle_3.png': `${assetsDirectory}/rectangle_3.png`, + 'filling.png': `${assetsDirectory}/filling.png`, + 'shape.png': `${assetsDirectory}/shape.png`, + 'example_1.png': `${assetsDirectory}/example_1.png`, + 'example_2.png': `${assetsDirectory}/example_2.png`, + 'example_3.png': `${assetsDirectory}/example_3.png`, + 'example_4.png': `${assetsDirectory}/example_4.png`, + 'all_conditions.png': `${assetsDirectory}/all_conditions.png` + }, + parameters: {}, + responses: { + 'keypress(Space)': 'continue' + }, + messageHandlers: { + 'before:prepare': function anonymous() { + this.options.events['keydown'] = e => { + if (e.code === 'KeyQ') { + this.data.skipTraining = true; + this.end(); + } - if (e.code === 'ArrowLeft' || e.code === 'ArrowRight') { - const instructions = document.querySelectorAll('div.instruction'); - let notFound = true; - instructions.forEach(i => { - if (i.style.display === 'block' && notFound) { - const cur_id = parseInt(i.id.split('screen_')[1]); - let next_id; - if (e.code === 'ArrowLeft') { - next_id = cur_id - 1; - } - if (e.code === 'ArrowRight') { - next_id = cur_id + 1; - } - if (next_id > 0 && next_id <= 10) { - i.style.display = 'none'; - next_id = `screen_${next_id}`; - document.querySelector(`#${next_id}`).style.display = 'block'; - notFound = false; - } + if (e.code === 'ArrowLeft' || e.code === 'ArrowRight') { + const instructions = document.querySelectorAll( + 'div.instruction' + ); + let notFound = true; + instructions.forEach(i => { + if (i.style.display === 'block' && notFound) { + const cur_id = parseInt(i.id.split('screen_')[1]); + let next_id; + if (e.code === 'ArrowLeft') { + next_id = cur_id - 1; + } + if (e.code === 'ArrowRight') { + next_id = cur_id + 1; + } + if (next_id > 0 && next_id <= 10) { + i.style.display = 'none'; + next_id = `screen_${next_id}`; + document.querySelector(`#${next_id}`).style.display = + 'block'; + notFound = false; + } + } + }); } - }); + }; } - }; - } - }, - title: 'Instructions', - content: '\u003Cmain\u003E\n\n\u003Cdiv class="instruction" id=\'screen_1\' style="display:block"\u003E\n \u003Cp\u003E\n In the following, you will respond to various figures. These are the figures that you will see: diamonds and rectangles with a filling of 2 or 3 dots:\n \u003C\u002Fp\u003E\n \u003Ctable\u003E\n \u003Cthead\u003E\n \u003Ctr\u003E\n \u003Cth\u003EDiamond with filling of 3 dots\u003C\u002Fth\u003E\n \u003Cth\u003EDiamond with filling of 2 dots\u003C\u002Fth\u003E\n \u003Cth\u003ERectangle with filling of 3 dots\u003C\u002Fth\u003E\n \u003Cth\u003ERectangle with filling of 2 dots\u003C\u002Fth\u003E\n \u003C\u002Ftr\u003E\n \u003C\u002Fthead\u003E\n \u003Ctbody\u003E\n \u003Ctr\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'diamond_3.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'diamond_2.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'rectangle_3.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'rectangle_2.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003C\u002Ftr\u003E\n \u003C\u002Ftbody\u003E\n \u003C\u002Ftable\u003E\n \u003Cp\u003E\n Use the right arrow key to move to the next instruction.\n \u003C\u002Fp\u003E\n\n \u003Cp\u003E\n If you want to skip the instruction with practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_2\' style="display:none"\u003E\n\n \u003Cp\u003E\n You will be shown these figures in sequences of trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Each time you will need to respond with a button press.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n How exactly will be explained in the next screens.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_3\' style="display:none"\u003E\n \u003Cp\u003E\n In the shape task, a diamond requires a b button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, a rectangle requires a n button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In this task, ignore the filling (dots) of the shape!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'shape.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_4\' style="display:none"\u003E\n \u003Cp\u003E\n In the filling task, a filling of two dots requires a b button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, a filling with three dots requires a n button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, ignore the outer shape!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'filling.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_5\' style="display:none"\u003E\n \u003Cp\u003E\n Example 1. If you see a figure in the upper part of the frame, you know you need to do the shape task, that is easy, because the word shape is at the top. Here you see a diamond, which requires a button press of the keyboard key \u003Cstrong\u003E\u003Cem\u003Eb\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, entirely ignore the filling dots!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_1.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_6\' style="display:none" style="width:400px"\u003E\n \u003Cp\u003E\n Example 2. If you see a figure in the lower part of the frame, you know you need to do the filling task, that is easy, because the word filling is at the bottom. This diamond is filled with 3 dots, and thus press the keyboard key \u003Cstrong\u003E\u003Cem\u003En\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, entirely ignore the outer shape (here a diamond)!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_2.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_7\' style="display:none"\u003E\n \u003Cimg src=${this.files[\'example_3.png\']} style="width:400px"\u003E\n \u003Cp\u003E\n Example 3. If you see a figure in the upper part of the frame, you know you need to do the shape task, that is easy, because the word shape is at the top. Here you see a rectangle, which requires the \u003Cstrong\u003E\u003Cem\u003En\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E key.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, entirely ignore the filling (here 2 dots)!!!\n \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_8\' style="display:none"\u003E\n \u003Cp\u003E\n Example 4. If you see a figure in the lower part of the frame, you know you need to do the filling task, that is easy, because the word filling is at the bottom. This diamond is filled with 2 dots, and thus press \u003Cstrong\u003E\u003Cem\u003Eb\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E key.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, entirely ignore the outer shape (here a diamond)!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_4.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\n\u003Cdiv class="instruction" id=\'screen_9\' style="display:none"\u003E\n \u003Cp\u003E\n Here, you can see how to respond in all conditions...\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Just look at shape in the shape task, and at the dots in the filling task...\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'all_conditions.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_10\' style="display:none"\u003E\n \u003Cp\u003E\n Are you ready? Press the space bar on your keyboard to quit the instructions and start doing the practice trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Or you can browse back to the previous screens until you understand what you need to do in the two tasks (use the arrow keys).\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n If you want to skip practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter\u003E\n \u003Cp\u003E\n Use left\u002Fright arrow keys to go further or back.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' - }, { - type: 'lab.canvas.Frame', - context: '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Please press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E or \n \u003Ckbd\u003En\u003C\u002Fkbd\u003E according to the current condition.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n', - contextSelector: 'canvas', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Frame', - content: { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [{ - block: 'shape', - task: 'training', - num_trials: '10', - cond: 'No switching' - }, { - block: 'filling', - task: 'training', - num_trials: '10', - cond: 'No switching' - }, { - block: 'mixed', - task: 'training', - num_trials: '20', - cond: 'Switching' - }, { - block: 'shape', - task: 'main', - num_trials: '20', - cond: 'No switching' - }, { - block: 'filling', - task: 'main', - num_trials: '20', - cond: 'No switching' - }, { - block: 'mixed', - task: 'main', - num_trials: '40', - cond: 'Switching' - }], - sample: { - mode: 'sequential', - n: '6' + }, + title: 'Instructions', + content: + '\u003Cmain\u003E\n\n\u003Cdiv class="instruction" id=\'screen_1\' style="display:block"\u003E\n \u003Cp\u003E\n In the following, you will respond to various figures. These are the figures that you will see: diamonds and rectangles with a filling of 2 or 3 dots:\n \u003C\u002Fp\u003E\n \u003Ctable\u003E\n \u003Cthead\u003E\n \u003Ctr\u003E\n \u003Cth\u003EDiamond with filling of 3 dots\u003C\u002Fth\u003E\n \u003Cth\u003EDiamond with filling of 2 dots\u003C\u002Fth\u003E\n \u003Cth\u003ERectangle with filling of 3 dots\u003C\u002Fth\u003E\n \u003Cth\u003ERectangle with filling of 2 dots\u003C\u002Fth\u003E\n \u003C\u002Ftr\u003E\n \u003C\u002Fthead\u003E\n \u003Ctbody\u003E\n \u003Ctr\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'diamond_3.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'diamond_2.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'rectangle_3.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003Ctd\u003E\u003Cimg src=${this.files[\'rectangle_2.png\']} style="width:100px"\u003E\u003C\u002Ftd\u003E\n \u003C\u002Ftr\u003E\n \u003C\u002Ftbody\u003E\n \u003C\u002Ftable\u003E\n \u003Cp\u003E\n Use the right arrow key to move to the next instruction.\n \u003C\u002Fp\u003E\n\n \u003Cp\u003E\n If you want to skip the instruction with practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_2\' style="display:none"\u003E\n\n \u003Cp\u003E\n You will be shown these figures in sequences of trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Each time you will need to respond with a button press.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n How exactly will be explained in the next screens.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_3\' style="display:none"\u003E\n \u003Cp\u003E\n In the shape task, a diamond requires a b button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, a rectangle requires a n button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In this task, ignore the filling (dots) of the shape!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'shape.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_4\' style="display:none"\u003E\n \u003Cp\u003E\n In the filling task, a filling of two dots requires a b button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, a filling with three dots requires a n button press. \n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, ignore the outer shape!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'filling.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_5\' style="display:none"\u003E\n \u003Cp\u003E\n Example 1. If you see a figure in the upper part of the frame, you know you need to do the shape task, that is easy, because the word shape is at the top. Here you see a diamond, which requires a button press of the keyboard key \u003Cstrong\u003E\u003Cem\u003Eb\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, entirely ignore the filling dots!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_1.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_6\' style="display:none" style="width:400px"\u003E\n \u003Cp\u003E\n Example 2. If you see a figure in the lower part of the frame, you know you need to do the filling task, that is easy, because the word filling is at the bottom. This diamond is filled with 3 dots, and thus press the keyboard key \u003Cstrong\u003E\u003Cem\u003En\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, entirely ignore the outer shape (here a diamond)!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_2.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_7\' style="display:none"\u003E\n \u003Cimg src=${this.files[\'example_3.png\']} style="width:400px"\u003E\n \u003Cp\u003E\n Example 3. If you see a figure in the upper part of the frame, you know you need to do the shape task, that is easy, because the word shape is at the top. Here you see a rectangle, which requires the \u003Cstrong\u003E\u003Cem\u003En\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E key.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the shape task, entirely ignore the filling (here 2 dots)!!!\n \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_8\' style="display:none"\u003E\n \u003Cp\u003E\n Example 4. If you see a figure in the lower part of the frame, you know you need to do the filling task, that is easy, because the word filling is at the bottom. This diamond is filled with 2 dots, and thus press \u003Cstrong\u003E\u003Cem\u003Eb\u003C\u002Fem\u003E\u003C\u002Fstrong\u003E key.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n In the filling task, entirely ignore the outer shape (here a diamond)!!!\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'example_4.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\n\u003Cdiv class="instruction" id=\'screen_9\' style="display:none"\u003E\n \u003Cp\u003E\n Here, you can see how to respond in all conditions...\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Just look at shape in the shape task, and at the dots in the filling task...\n \u003C\u002Fp\u003E\n \u003Cimg src=${this.files[\'all_conditions.png\']} style="width:400px"\u003E\n\u003C\u002Fdiv\u003E\n\n\u003Cdiv class="instruction" id=\'screen_10\' style="display:none"\u003E\n \u003Cp\u003E\n Are you ready? Press the space bar on your keyboard to quit the instructions and start doing the practice trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Or you can browse back to the previous screens until you understand what you need to do in the two tasks (use the arrow keys).\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n If you want to skip practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter\u003E\n \u003Cp\u003E\n Use left\u002Fright arrow keys to go further or back.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E' }, - responses: {}, - messageHandlers: {}, - title: 'Block loop', - tardy: true, - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', + { + type: 'lab.canvas.Frame', + context: + '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Please press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E or \n \u003Ckbd\u003En\u003C\u002Fkbd\u003E according to the current condition.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n', + contextSelector: 'canvas', files: {}, parameters: {}, responses: {}, messageHandlers: {}, - title: 'Block sequence', - skip: "${this.parameters.task === 'training' && this.state.skipTraining === true}", - content: [{ - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: -112, - width: 103.95, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Ready? ', - fontSize: '50', - fontWeight: 'bold', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '277', - styles: {} - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: -25, - width: 1090.61, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: "${parameters.task === 'training' ? 'for some training?' : 'for the real data collection?'}", - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '278', - styles: {} - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 50, - width: 416.41, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'When ready, press the space bar.', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '279', - styles: {} - }], - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: {}, - viewport: [800, 600], - title: 'Ready' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - version: '2.7.0', - originX: 'left', - originY: 'center', - left: "${this.parameters.block === 'mixed' ? 1000 : -120}", - top: -64, - width: 372.81, - height: 78.11, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'A block of just \nthe ${parameters.block} task', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'left', - textBackgroundColor: '', - charSpacing: 0, - id: '298', - styles: { - '1': { - '4': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '5': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '6': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '7': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '8': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '9': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '10': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '11': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '12': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '13': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '14': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '15': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '16': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '17': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '18': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '19': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '20': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '21': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '22': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '23': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '24': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '25': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '26': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - }, - '27': { - stroke: null, - strokeWidth: 1, - fill: 'black', - fontFamily: 'Times New Roman', - fontSize: 32, - fontWeight: 'normal', - fontStyle: 'normal', - underline: false, - overline: false, - linethrough: false, - deltaY: 0, - textBackgroundColor: '' - } - } - } - }, { - type: 'i-text', - version: '2.7.0', - originX: 'left', - originY: 'center', - left: -125, - top: 75, - width: 293.18, - height: 126.56, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Try to be as fast as you\ncan without making errors!\nPress space bar when\nyou are ready!', - fontSize: '25', - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'left', - textBackgroundColor: '', - charSpacing: 0, - id: '300', - styles: {} - }, { - type: 'i-text', - version: '2.7.0', - originX: 'left', - originY: 'center', - left: "${this.parameters.block === 'mixed' ? -120 : 1000}", - top: -75, - width: 247.08, - height: 120.05, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'A block with a mix\nof the shape & \nthe filling task', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'left', - textBackgroundColor: '', - charSpacing: 0, - id: '397', - styles: {} - }], - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: {}, - viewport: [800, 600], - title: 'Block description' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 154.59, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Concentrate', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '276', - styles: {} - }], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: 'Concentrate', - timeout: '1000' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: '100', - height: 55, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 5, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 27.5, - startAngle: 0, - endAngle: 6.283185307179586, - id: '273' - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 25, - height: 56.5, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '3', - fontSize: '50', - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '274', - styles: {} - }], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: '3', - timeout: '1000' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: '100', - height: 55, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 5, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 27.5, - startAngle: 0, - endAngle: 6.283185307179586, - id: '273' - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 27.81, - height: 56.5, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '2', - fontSize: '50', - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '274', - styles: {} - }], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: '2', - timeout: '1000' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: '100', - height: 55, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 5, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 27.5, - startAngle: 0, - endAngle: 6.283185307179586, - id: '273' - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 27.81, - height: 56.5, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '1', - fontSize: '50', - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '274', - styles: {} - }], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: '1', - timeout: '1000' - }, { + title: 'Frame', + content: { type: 'lab.flow.Loop', files: {}, parameters: {}, - templateParameters: [], + templateParameters: [ + { + block: 'shape', + task: 'training', + num_trials: '10', + cond: 'No switching' + }, + { + block: 'filling', + task: 'training', + num_trials: '10', + cond: 'No switching' + }, + { + block: 'mixed', + task: 'training', + num_trials: '20', + cond: 'Switching' + }, + { + block: 'shape', + task: 'main', + num_trials: '20', + cond: 'No switching' + }, + { + block: 'filling', + task: 'main', + num_trials: '20', + cond: 'No switching' + }, + { + block: 'mixed', + task: 'main', + num_trials: '40', + cond: 'Switching' + } + ], sample: { - mode: 'draw', - n: '' + mode: 'sequential', + n: '6' }, responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - let tasksParameters = []; - const blocks = this.parameters.block === 'mixed' ? ['shape', 'filling'] : [this.parameters.block, this.parameters.block]; - - function trialConstructor(block, dots, form, cor_response) { - return { - type: block, - dots, - form, - cor_response - }; - } - - const numberBlocks = Math.ceil(this.parameters.num_trials / 4); - - for (let i = 1; i <= numberBlocks; i++) { - for (const block of blocks) { - if (block === 'shape') { - tasksParameters = tasksParameters.concat(trialConstructor(block, 2, 'diamond', 'b')); - tasksParameters = tasksParameters.concat(trialConstructor(block, 2, 'square', 'n')); - tasksParameters = tasksParameters.concat(trialConstructor(block, 3, 'diamond', 'b')); - tasksParameters = tasksParameters.concat(trialConstructor(block, 3, 'square', 'n')); - } else if (block === 'filling') { - tasksParameters = tasksParameters.concat(trialConstructor(block, 2, 'diamond', 'b')); - tasksParameters = tasksParameters.concat(trialConstructor(block, 2, 'square', 'b')); - tasksParameters = tasksParameters.concat(trialConstructor(block, 3, 'diamond', 'n')); - tasksParameters = tasksParameters.concat(trialConstructor(block, 3, 'square', 'n')); - } - } - } - - const tasksParametersShuffled = shuffle(tasksParameters); - // assign options values to parameters of this task - this.options.templateParameters = tasksParametersShuffled.slice(0, this.parameters.num_trials); - } - }, - title: 'Trial loop', + messageHandlers: {}, + title: 'Block loop', + tardy: true, shuffleGroups: [], template: { type: 'lab.flow.Sequence', @@ -1192,1311 +164,2498 @@ const studyObject = { parameters: {}, responses: {}, messageHandlers: {}, - title: 'Trial sequence', - content: [{ - type: 'lab.canvas.Screen', - content: [{ - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 400, - height: 300, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '17' - }, { - type: 'line', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 400, - height: 0, - fill: 'rgb(0,0,0)', - stroke: 'black', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - id: '90', - x1: -200, - x2: 200, - y1: 0, - y2: 0 - }, { - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: "${this.parameters.form === 'square' ? 0 : 1000}", - top: "${this.parameters.type === 'shape' ? -75 : 75}", - width: '100', - height: '100', - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '91' - }, { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '0', - top: "${this.parameters.type === 'shape' ? -50 : 50}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '105' - }, { - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: "${this.parameters.form === 'diamond' ? 0 : 1000}", - top: "${this.parameters.type === 'shape' ? -75 : 75}", - width: 80, - height: 80, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 315, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '98' - }, { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '${this.parameters.dots === 3 ? 0 : 1000}', - top: "${this.parameters.type === 'shape' ? -75 : 75}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '103' - }, { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '0', - top: "${this.parameters.type === 'shape' ? -100 : 100}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '104' - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: '-195', - width: 78.2, - height: 36.16, - fill: '#000000', - stroke: '#000000', - strokeWidth: 0, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Shape', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '112', - styles: {} - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: '195', - width: 85.36, - height: 36.16, - fill: '#000000', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Filling', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '113', - styles: {} - }], - files: {}, - parameters: {}, - responses: { - 'keypress(b)': 'b', - 'keypress(n)': 'n' + title: 'Block sequence', + skip: + "${this.parameters.task === 'training' && this.state.skipTraining === true}", + content: [ + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: -112, + width: 103.95, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Ready? ', + fontSize: '50', + fontWeight: 'bold', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '277', + styles: {} + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: -25, + width: 1090.61, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: + "${parameters.task === 'training' ? 'for some training?' : 'for the real data collection?'}", + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '278', + styles: {} + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 50, + width: 416.41, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'When ready, press the space bar.', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '279', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue' + }, + messageHandlers: {}, + viewport: [800, 600], + title: 'Ready' }, - messageHandlers: { - run: function anonymous() { - this.parameters.callbackForEEG(this.parameters.cond === 'Switching' ? 1 : 2); - this.data.correct = 'empty'; - } + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + version: '2.7.0', + originX: 'left', + originY: 'center', + left: + "${this.parameters.block === 'mixed' ? 1000 : -120}", + top: -64, + width: 372.81, + height: 78.11, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'A block of just \nthe ${parameters.block} task', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + textBackgroundColor: '', + charSpacing: 0, + id: '298', + styles: { + '1': { + '4': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '5': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '6': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '7': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '8': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '9': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '10': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '11': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '12': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '13': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '14': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '15': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '16': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '17': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '18': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '19': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '20': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '21': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '22': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '23': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '24': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '25': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '26': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + }, + '27': { + stroke: null, + strokeWidth: 1, + fill: 'black', + fontFamily: 'Times New Roman', + fontSize: 32, + fontWeight: 'normal', + fontStyle: 'normal', + underline: false, + overline: false, + linethrough: false, + deltaY: 0, + textBackgroundColor: '' + } + } + } + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'left', + originY: 'center', + left: -125, + top: 75, + width: 293.18, + height: 126.56, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: + 'Try to be as fast as you\ncan without making errors!\nPress space bar when\nyou are ready!', + fontSize: '25', + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + textBackgroundColor: '', + charSpacing: 0, + id: '300', + styles: {} + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'left', + originY: 'center', + left: + "${this.parameters.block === 'mixed' ? -120 : 1000}", + top: -75, + width: 247.08, + height: 120.05, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: + 'A block with a mix\nof the shape & \nthe filling task', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'left', + textBackgroundColor: '', + charSpacing: 0, + id: '397', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'continue' + }, + messageHandlers: {}, + viewport: [800, 600], + title: 'Block description' }, - viewport: [800, 600], - title: 'Stimulus', - correctResponse: '${parameters.cor_response}', - timeout: '5000' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 655.95, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: "${this.state.correct ? '' : 'That was the wrong key.'} ", - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '37', - styles: {} - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 688.19, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: "${this.state.correct === 'empty' ? 'The time is up' : ''} ", - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '310', - styles: {} - }, { - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 400, - height: 300, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '36' - }, { - type: 'line', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: '${this.state.correct === true ? 0 : 1000} ', - width: 400, - height: 0, - fill: 'rgb(0,0,0)', - stroke: 'black', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - id: '125', - x1: -200, - x2: 200, - y1: 0, - y2: 0 - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: '-195', - width: 78.2, - height: 36.16, - fill: '#000000', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Shape', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '126', - styles: {} - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: '195', - width: 85.36, - height: 36.16, - fill: '#000000', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Filling', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '127', - styles: {} - }], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); - this.data.condition = this.parameters.cond; - this.data.reaction_time = this.state.duration; - - if (this.state.response === this.parameters.cor_response) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 154.59, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Concentrate', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '276', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Concentrate', + timeout: '1000' + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: '100', + height: 55, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 5, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 27.5, + startAngle: 0, + endAngle: 6.283185307179586, + id: '273' + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 25, + height: 56.5, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '3', + fontSize: '50', + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '274', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: '3', + timeout: '1000' + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: '100', + height: 55, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 5, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 27.5, + startAngle: 0, + endAngle: 6.283185307179586, + id: '273' + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 27.81, + height: 56.5, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '2', + fontSize: '50', + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '274', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: '2', + timeout: '1000' + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: '100', + height: 55, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 5, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 27.5, + startAngle: 0, + endAngle: 6.283185307179586, + id: '273' + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 27.81, + height: 56.5, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '1', + fontSize: '50', + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '274', + styles: {} } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: '1', + timeout: '1000' + }, + { + type: 'lab.flow.Loop', + files: {}, + parameters: {}, + templateParameters: [], + sample: { + mode: 'draw', + n: '' + }, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; + } + + let tasksParameters = []; + const blocks = + this.parameters.block === 'mixed' + ? ['shape', 'filling'] + : [this.parameters.block, this.parameters.block]; + + function trialConstructor( + block, + dots, + form, + cor_response + ) { + return { + type: block, + dots, + form, + cor_response + }; + } - if (this.parameters.task === 'main') { - this.data.response_given = this.state.correct === 'empty' ? 'no' : 'yes'; - } else { - this.data.phase = 'practice'; + const numberBlocks = Math.ceil( + this.parameters.num_trials / 4 + ); + + for (let i = 1; i <= numberBlocks; i++) { + for (const block of blocks) { + if (block === 'shape') { + tasksParameters = tasksParameters.concat( + trialConstructor(block, 2, 'diamond', 'b') + ); + tasksParameters = tasksParameters.concat( + trialConstructor(block, 2, 'square', 'n') + ); + tasksParameters = tasksParameters.concat( + trialConstructor(block, 3, 'diamond', 'b') + ); + tasksParameters = tasksParameters.concat( + trialConstructor(block, 3, 'square', 'n') + ); + } else if (block === 'filling') { + tasksParameters = tasksParameters.concat( + trialConstructor(block, 2, 'diamond', 'b') + ); + tasksParameters = tasksParameters.concat( + trialConstructor(block, 2, 'square', 'b') + ); + tasksParameters = tasksParameters.concat( + trialConstructor(block, 3, 'diamond', 'n') + ); + tasksParameters = tasksParameters.concat( + trialConstructor(block, 3, 'square', 'n') + ); + } + } + } + + const tasksParametersShuffled = shuffle(tasksParameters); + // assign options values to parameters of this task + this.options.templateParameters = tasksParametersShuffled.slice( + 0, + this.parameters.num_trials + ); } + }, + title: 'Trial loop', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial sequence', + content: [ + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 400, + height: 300, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '17' + }, + { + type: 'line', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 400, + height: 0, + fill: 'rgb(0,0,0)', + stroke: 'black', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + id: '90', + x1: -200, + x2: 200, + y1: 0, + y2: 0 + }, + { + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: + "${this.parameters.form === 'square' ? 0 : 1000}", + top: + "${this.parameters.type === 'shape' ? -75 : 75}", + width: '100', + height: '100', + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '91' + }, + { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '0', + top: + "${this.parameters.type === 'shape' ? -50 : 50}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '105' + }, + { + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: + "${this.parameters.form === 'diamond' ? 0 : 1000}", + top: + "${this.parameters.type === 'shape' ? -75 : 75}", + width: 80, + height: 80, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 315, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '98' + }, + { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '${this.parameters.dots === 3 ? 0 : 1000}', + top: + "${this.parameters.type === 'shape' ? -75 : 75}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '103' + }, + { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '0', + top: + "${this.parameters.type === 'shape' ? -100 : 100}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '104' + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: '-195', + width: 78.2, + height: 36.16, + fill: '#000000', + stroke: '#000000', + strokeWidth: 0, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Shape', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '112', + styles: {} + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: '195', + width: 85.36, + height: 36.16, + fill: '#000000', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Filling', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '113', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: { + 'keypress(b)': 'b', + 'keypress(n)': 'n' + }, + messageHandlers: { + run: function anonymous() { + this.parameters.callbackForEEG( + this.parameters.cond === 'Switching' ? 1 : 2 + ); + this.data.correct = 'empty'; + } + }, + viewport: [800, 600], + title: 'Stimulus', + correctResponse: '${parameters.cor_response}', + timeout: '5000' + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 655.95, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: + "${this.state.correct ? '' : 'That was the wrong key.'} ", + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '37', + styles: {} + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 688.19, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: + "${this.state.correct === 'empty' ? 'The time is up' : ''} ", + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '310', + styles: {} + }, + { + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 400, + height: 300, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '36' + }, + { + type: 'line', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: '${this.state.correct === true ? 0 : 1000} ', + width: 400, + height: 0, + fill: 'rgb(0,0,0)', + stroke: 'black', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + id: '125', + x1: -200, + x2: 200, + y1: 0, + y2: 0 + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: '-195', + width: 78.2, + height: 36.16, + fill: '#000000', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Shape', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '126', + styles: {} + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: '195', + width: 85.36, + height: 36.16, + fill: '#000000', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Filling', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '127', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + this.data.trial_number = + 1 + + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); + this.data.condition = this.parameters.cond; + this.data.reaction_time = this.state.duration; + + if ( + this.state.response === + this.parameters.cor_response + ) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + + if (this.parameters.task === 'main') { + this.data.response_given = + this.state.correct === 'empty' ? 'no' : 'yes'; + } else { + this.data.phase = 'practice'; + } + } + }, + viewport: [800, 600], + title: 'Feedback', + timeout: '${this.parameters.iti}', + tardy: true + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 400, + height: 300, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '123' + }, + { + type: 'line', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: '400', + height: 0, + fill: 'rgb(0,0,0)', + stroke: 'black', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + id: '124', + x1: -50, + x2: 50, + y1: 0, + y2: 0 + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: -195, + width: 78.2, + height: 36.16, + fill: + "${this.parameters.type === 'shape' ? 'black' : 'lightgrey'}", + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Shape', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '128', + styles: {} + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: '195', + width: 85.36, + height: 36.16, + fill: + "${this.parameters.type === 'filling' ? 'black' : 'lightgrey'}", + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'Filling', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '129', + styles: {} + }, + { + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '120', + top: + "${this.parameters.type === 'shape' ? -90 : 1000}", + width: 80, + height: 80, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '130' + }, + { + type: 'rect', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '-120', + top: + "${this.parameters.type === 'shape' ? -90 : 1000}", + width: 60, + height: 60, + fill: 'transparent', + stroke: '#000000', + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 315, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + rx: 0, + ry: 0, + id: '131' + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '-120', + top: + "${this.parameters.type === 'shape' ? -25 : 1000}", + width: 16, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'b', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'Times New Roman', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '132', + styles: {} + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '120', + top: + "${this.parameters.type === 'shape' ? -25 : 1000}", + width: 16, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'n', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'Times New Roman', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '133', + styles: {} + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '-120', + top: + "${this.parameters.type === 'filling' ? 125 : 1000}", + width: 16, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'b', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'Times New Roman', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '134', + styles: {} + }, + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '120', + top: + "${this.parameters.type === 'filling' ? 125 : 1000}", + width: 16, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: 'n', + fontSize: 32, + fontWeight: 'normal', + fontFamily: 'Times New Roman', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '135', + styles: {} + }, + { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '-120', + top: + "${this.parameters.type === 'filling' ? 30 : 1000}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '136' + }, + { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '-120', + top: + "${this.parameters.type === 'filling' ? 90 : 1000}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '137' + }, + { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '120', + top: + "${this.parameters.type === 'filling' ? 90 : 1000}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '138' + }, + { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '120', + top: + "${this.parameters.type === 'filling' ? 60 : 1000}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '139' + }, + { + type: 'circle', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: '120', + top: + "${this.parameters.type === 'filling' ? 30 : 1000}", + width: 20, + height: 20, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + radius: 10, + startAngle: 0, + endAngle: 6.283185307179586, + id: '140' + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + viewport: [800, 600], + title: 'Pause', + skip: '${this.state.correct === true}', + timeout: '3000', + tardy: true + } + ] } - }, - viewport: [800, 600], - title: 'Feedback', - timeout: '${this.parameters.iti}', - tardy: true - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 400, - height: 300, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '123' - }, { - type: 'line', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: '400', - height: 0, - fill: 'rgb(0,0,0)', - stroke: 'black', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - id: '124', - x1: -50, - x2: 50, - y1: 0, - y2: 0 - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: -195, - width: 78.2, - height: 36.16, - fill: "${this.parameters.type === 'shape' ? 'black' : 'lightgrey'}", - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Shape', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '128', - styles: {} - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: '195', - width: 85.36, - height: 36.16, - fill: "${this.parameters.type === 'filling' ? 'black' : 'lightgrey'}", - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'Filling', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '129', - styles: {} - }, { - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '120', - top: "${this.parameters.type === 'shape' ? -90 : 1000}", - width: 80, - height: 80, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '130' - }, { - type: 'rect', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '-120', - top: "${this.parameters.type === 'shape' ? -90 : 1000}", - width: 60, - height: 60, - fill: 'transparent', - stroke: '#000000', - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 315, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - rx: 0, - ry: 0, - id: '131' - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '-120', - top: "${this.parameters.type === 'shape' ? -25 : 1000}", - width: 16, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'b', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'Times New Roman', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '132', - styles: {} - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '120', - top: "${this.parameters.type === 'shape' ? -25 : 1000}", - width: 16, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'n', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'Times New Roman', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '133', - styles: {} - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '-120', - top: "${this.parameters.type === 'filling' ? 125 : 1000}", - width: 16, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'b', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'Times New Roman', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '134', - styles: {} - }, { - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '120', - top: "${this.parameters.type === 'filling' ? 125 : 1000}", - width: 16, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: 'n', - fontSize: 32, - fontWeight: 'normal', - fontFamily: 'Times New Roman', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '135', - styles: {} - }, { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '-120', - top: "${this.parameters.type === 'filling' ? 30 : 1000}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '136' - }, { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '-120', - top: "${this.parameters.type === 'filling' ? 90 : 1000}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '137' - }, { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '120', - top: "${this.parameters.type === 'filling' ? 90 : 1000}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '138' - }, { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '120', - top: "${this.parameters.type === 'filling' ? 60 : 1000}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '139' - }, { - type: 'circle', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: '120', - top: "${this.parameters.type === 'filling' ? 30 : 1000}", - width: 20, - height: 20, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - radius: 10, - startAngle: 0, - endAngle: 6.283185307179586, - id: '140' - }], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - viewport: [800, 600], - title: 'Pause', - skip: '${this.state.correct === true}', - timeout: '3000', - tardy: true - }] + } + ] } - }] + } + }, + { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'end' + }, + messageHandlers: {}, + title: 'End', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' } - } - }, { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'end' - }, - messageHandlers: {}, - title: 'End', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' - }] - }] + ] + } + ] }; // export -export default studyObject; \ No newline at end of file +export default studyObject; diff --git a/app/utils/labjs/scripts/stroop.ts b/app/utils/labjs/scripts/stroop.ts index b627d95b..a5d59f41 100644 --- a/app/utils/labjs/scripts/stroop.ts +++ b/app/utils/labjs/scripts/stroop.ts @@ -8,662 +8,753 @@ const studyObject = { parameters: {}, files: {}, responses: {}, - content: [{ - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Stroop task', - content: [{ - messageHandlers: {}, - type: 'lab.html.Screen', - responses: { - 'keypress(Space)': 'continue', - 'keypress(q)': 'skipPractice' - }, - title: 'Instruction', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EStroop Task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Cp\u003E\n Welcome to the \u003Cstrong\u003EStroop experiment\u003C\u002Fstrong\u003E!\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n To indicate the color of the word, please use the keys \u003Cstrong\u003Er\u003C\u002Fstrong\u003E, \u003Cstrong\u003Eg\u003C\u002Fstrong\u003E, \u003Cstrong\u003Eb\u003C\u002Fstrong\u003E and \u003Cstrong\u003Ey\u003C\u002Fstrong\u003E for \u003Cspan style="color: red;"\u003Ered\u003C\u002Fspan\u003E, \u003Cspan style="color: green;"\u003Egreen\u003C\u002Fspan\u003E, \u003Cspan style="color: blue;"\u003Eblue\u003C\u002Fspan\u003E and \u003Cspan style="color: #c5ad0b;"\u003Eyellow\u003C\u002Fspan\u003E, respectively.\n \u003Cbr\u003E\n Please answer quickly, and as accurately as you can.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Press the the space bar on your keyboard to start doing the practice trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n If you want to skip the practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n\n\n', - parameters: {}, - files: {} - }, { - type: 'lab.canvas.Frame', - context: '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n What\'s the \u003Cem\u003Ecolor\u003C\u002Fem\u003E of \n the word shown above? \u003Cbr\u003E\n Please press \u003Ckbd\u003Er\u003C\u002Fkbd\u003E for red,\n \u003Ckbd\u003Eg\u003C\u002Fkbd\u003E for green,\n \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E for blue and \u003Ckbd\u003Ey\u003C\u002Fkbd\u003E for yellow.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n', - contextSelector: 'canvas', + content: [ + { + type: 'lab.flow.Sequence', files: {}, parameters: {}, responses: {}, messageHandlers: {}, - title: 'Practice frame', - tardy: true, - skip: "${ state.response === 'skipPractice' }", - content: { - messageHandlers: {}, - type: 'lab.flow.Loop', - responses: {}, - templateParameters: [{ - color: 'red', - word: 'red', - phase: 'practice' - }, { - color: 'green', - word: 'green', - phase: 'practice' - }, { - color: 'blue', - word: 'blue', - phase: 'practice' - }, { - color: '#ffe32a', - word: 'yellow', - phase: 'practice' - }, { - color: 'red', - word: 'green', - phase: 'practice' - }, { - color: 'green', - word: 'blue', - phase: 'practice' - }, { - color: 'blue', - word: 'yellow', - phase: 'practice' - }, { - color: '#ffe32a', - word: 'red', - phase: 'practice' - }], - title: 'Practice task', - parameters: {}, - files: {}, - sample: { - mode: 'draw-shuffle' - }, - shuffleGroups: [], - template: { + title: 'Stroop task', + content: [ + { messageHandlers: {}, - type: 'lab.flow.Sequence', - responses: {}, - title: 'Trial', + type: 'lab.html.Screen', + responses: { + 'keypress(Space)': 'continue', + 'keypress(q)': 'skipPractice' + }, + title: 'Instruction', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EStroop Task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Cp\u003E\n Welcome to the \u003Cstrong\u003EStroop experiment\u003C\u002Fstrong\u003E!\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n To indicate the color of the word, please use the keys \u003Cstrong\u003Er\u003C\u002Fstrong\u003E, \u003Cstrong\u003Eg\u003C\u002Fstrong\u003E, \u003Cstrong\u003Eb\u003C\u002Fstrong\u003E and \u003Cstrong\u003Ey\u003C\u002Fstrong\u003E for \u003Cspan style="color: red;"\u003Ered\u003C\u002Fspan\u003E, \u003Cspan style="color: green;"\u003Egreen\u003C\u002Fspan\u003E, \u003Cspan style="color: blue;"\u003Eblue\u003C\u002Fspan\u003E and \u003Cspan style="color: #c5ad0b;"\u003Eyellow\u003C\u002Fspan\u003E, respectively.\n \u003Cbr\u003E\n Please answer quickly, and as accurately as you can.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n Press the the space bar on your keyboard to start doing the practice trials.\n \u003C\u002Fp\u003E\n \u003Cp\u003E\n If you want to skip the practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n\n\n', parameters: {}, + files: {} + }, + { + type: 'lab.canvas.Frame', + context: + '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n What\'s the \u003Cem\u003Ecolor\u003C\u002Fem\u003E of \n the word shown above? \u003Cbr\u003E\n Please press \u003Ckbd\u003Er\u003C\u002Fkbd\u003E for red,\n \u003Ckbd\u003Eg\u003C\u002Fkbd\u003E for green,\n \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E for blue and \u003Ckbd\u003Ey\u003C\u002Fkbd\u003E for yellow.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n', + contextSelector: 'canvas', files: {}, - content: [{ - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - version: '2.4.4', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 18.69, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '+', - fontSize: '72', - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '5', - styles: {} - }], - files: {}, - parameters: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Practice frame', + tardy: true, + skip: "${ state.response === 'skipPractice' }", + content: { + messageHandlers: {}, + type: 'lab.flow.Loop', responses: {}, - messageHandlers: { - run: function anonymous() { - this.data.correct = 'empty'; + templateParameters: [ + { + color: 'red', + word: 'red', + phase: 'practice' + }, + { + color: 'green', + word: 'green', + phase: 'practice' + }, + { + color: 'blue', + word: 'blue', + phase: 'practice' + }, + { + color: '#ffe32a', + word: 'yellow', + phase: 'practice' + }, + { + color: 'red', + word: 'green', + phase: 'practice' + }, + { + color: 'green', + word: 'blue', + phase: 'practice' + }, + { + color: 'blue', + word: 'yellow', + phase: 'practice' + }, + { + color: '#ffe32a', + word: 'red', + phase: 'practice' } - }, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${this.parameters.iti}' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - version: '2.4.4', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 331.08, - height: 36.16, - fill: '${ this.parameters.color }', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '${ this.parameters.word }', - fontSize: '72', - fontWeight: 'bold', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '6', - styles: {} - }], - files: {}, + ], + title: 'Practice task', parameters: {}, - responses: { - 'keydown(r)': 'red', - 'keydown(g)': 'green', - 'keydown(b)': 'blue', - 'keydown(y)': '#ffe32a' - }, - messageHandlers: {}, - viewport: [800, 600], - title: 'Stroop screen', - correctResponse: '${ this.parameters.color }' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: "${ parameters.phase == 'practice' ? 0 : 1000 }", - width: 1246.91, - height: 58.76, - fill: "${ state.correct ? 'green' : 'red' }", - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: "${ state.correct ? 'Well done!' : 'Please respond accurately' }", - fontSize: '52', - fontWeight: 'bold', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '24', - styles: {} - }], files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + sample: { + mode: 'draw-shuffle' + }, + shuffleGroups: [], + template: { + messageHandlers: {}, + type: 'lab.flow.Sequence', + responses: {}, + title: 'Trial', + parameters: {}, + files: {}, + content: [ + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + version: '2.4.4', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 18.69, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '+', + fontSize: '72', + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '5', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + run: function anonymous() { + this.data.correct = 'empty'; + } + }, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${this.parameters.iti}' + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + version: '2.4.4', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 331.08, + height: 36.16, + fill: '${ this.parameters.color }', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '${ this.parameters.word }', + fontSize: '72', + fontWeight: 'bold', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '6', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: { + 'keydown(r)': 'red', + 'keydown(g)': 'green', + 'keydown(b)': 'blue', + 'keydown(y)': '#ffe32a' + }, + messageHandlers: {}, + viewport: [800, 600], + title: 'Stroop screen', + correctResponse: '${ this.parameters.color }' + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: "${ parameters.phase == 'practice' ? 0 : 1000 }", + width: 1246.91, + height: 58.76, + fill: "${ state.correct ? 'green' : 'red' }", + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: + "${ state.correct ? 'Well done!' : 'Please respond accurately' }", + fontSize: '52', + fontWeight: 'bold', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '24', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + this.data.trial_number = + 1 + + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); - this.data.condition = this.parameters.congruent === 'yes' ? 'Match' : 'Mismatch'; + this.data.condition = + this.parameters.congruent === 'yes' + ? 'Match' + : 'Mismatch'; - this.data.reaction_time = this.state.duration; + this.data.reaction_time = this.state.duration; - if (this.state.response === this.parameters.color) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } + if (this.state.response === this.parameters.color) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } - this.data.response_given = this.state.correct === 'empty' ? 'no' : 'yes'; - } - }, - viewport: [800, 600], - title: 'Inter-trial interval', - timeout: "${ parameters.phase == 'practice' ? 1000 : 500 }", - tardy: true - }] - } - } - }, { - messageHandlers: {}, - type: 'lab.html.Screen', - responses: { - 'keypress(Space)': 'continue' - }, - title: 'Main task', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n\n\n', - parameters: {}, - files: {} - }, { - type: 'lab.canvas.Frame', - context: '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n What\'s the \u003Cem\u003Ecolor\u003C\u002Fem\u003E of \n the word shown above? \u003Cbr\u003E\n Please press \u003Ckbd\u003Er\u003C\u002Fkbd\u003E for red,\n \u003Ckbd\u003Eg\u003C\u002Fkbd\u003E for green,\n \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E for blue and \u003Ckbd\u003Ey\u003C\u002Fkbd\u003E for yellow.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n', - contextSelector: 'canvas', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Task frame', - content: { - messageHandlers: {}, - type: 'lab.flow.Loop', - responses: {}, - templateParameters: [{ - color: 'red', - word: 'red', - phase: 'task', - congruent: 'yes' - }, { - color: 'red', - word: 'red', - phase: 'task', - congruent: 'yes' - }, { - color: 'red', - word: 'red', - phase: 'task', - congruent: 'yes' - }, { - color: 'red', - word: 'green', - phase: 'task', - congruent: 'no' - }, { - color: 'red', - word: 'blue', - phase: 'task', - congruent: 'no' - }, { - color: 'red', - word: 'yellow', - phase: 'task', - congruent: 'no' - }, { - color: 'green', - word: 'red', - phase: 'task', - congruent: 'no' - }, { - color: 'green', - word: 'green', - phase: 'task', - congruent: 'yes' - }, { - color: 'green', - word: 'green', - phase: 'task', - congruent: 'yes' - }, { - color: 'green', - word: 'green', - phase: 'task', - congruent: 'yes' - }, { - color: 'green', - word: 'blue', - phase: 'task', - congruent: 'no' - }, { - color: 'green', - word: 'yellow', - phase: 'task', - congruent: 'no' - }, { - color: 'blue', - word: 'red', - phase: 'task', - congruent: 'no' - }, { - color: 'blue', - word: 'green', - phase: 'task', - congruent: 'no' - }, { - color: 'blue', - word: 'blue', - phase: 'task', - congruent: 'yes' - }, { - color: 'blue', - word: 'blue', - phase: 'task', - congruent: 'yes' - }, { - color: 'blue', - word: 'blue', - phase: 'task', - congruent: 'yes' - }, { - color: 'blue', - word: 'yellow', - phase: 'task', - congruent: 'no' - }, { - color: '#ffe32a', - word: 'red', - phase: 'task', - congruent: 'no' - }, { - color: '#ffe32a', - word: 'green', - phase: 'task', - congruent: 'no' - }, { - color: '#ffe32a', - word: 'blue', - phase: 'task', - congruent: 'no' - }, { - color: '#ffe32a', - word: 'yellow', - phase: 'task', - congruent: 'yes' - }, { - color: '#ffe32a', - word: 'yellow', - phase: 'task', - congruent: 'yes' - }, { - color: '#ffe32a', - word: 'yellow', - phase: 'task', - congruent: 'yes' - }], - title: 'Stroop task', - parameters: {}, - files: {}, - sample: { - mode: 'draw-shuffle', - n: '96' + this.data.response_given = + this.state.correct === 'empty' ? 'no' : 'yes'; + } + }, + viewport: [800, 600], + title: 'Inter-trial interval', + timeout: "${ parameters.phase == 'practice' ? 1000 : 500 }", + tardy: true + } + ] + } + } }, - shuffleGroups: [], - template: { + { messageHandlers: {}, - type: 'lab.flow.Sequence', - responses: {}, - title: 'Trial', + type: 'lab.html.Screen', + responses: { + 'keypress(Space)': 'continue' + }, + title: 'Main task', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n\n\n', parameters: {}, + files: {} + }, + { + type: 'lab.canvas.Frame', + context: + '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n What\'s the \u003Cem\u003Ecolor\u003C\u002Fem\u003E of \n the word shown above? \u003Cbr\u003E\n Please press \u003Ckbd\u003Er\u003C\u002Fkbd\u003E for red,\n \u003Ckbd\u003Eg\u003C\u002Fkbd\u003E for green,\n \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E for blue and \u003Ckbd\u003Ey\u003C\u002Fkbd\u003E for yellow.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n', + contextSelector: 'canvas', files: {}, - content: [{ - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - version: '2.4.4', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 18.69, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '+', - fontSize: '72', - fontWeight: 'normal', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '5', - styles: {} - }], - files: {}, - parameters: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Task frame', + content: { + messageHandlers: {}, + type: 'lab.flow.Loop', responses: {}, - messageHandlers: { - run: function anonymous() { - this.data.correct = 'empty'; + templateParameters: [ + { + color: 'red', + word: 'red', + phase: 'task', + congruent: 'yes' + }, + { + color: 'red', + word: 'red', + phase: 'task', + congruent: 'yes' + }, + { + color: 'red', + word: 'red', + phase: 'task', + congruent: 'yes' + }, + { + color: 'red', + word: 'green', + phase: 'task', + congruent: 'no' + }, + { + color: 'red', + word: 'blue', + phase: 'task', + congruent: 'no' + }, + { + color: 'red', + word: 'yellow', + phase: 'task', + congruent: 'no' + }, + { + color: 'green', + word: 'red', + phase: 'task', + congruent: 'no' + }, + { + color: 'green', + word: 'green', + phase: 'task', + congruent: 'yes' + }, + { + color: 'green', + word: 'green', + phase: 'task', + congruent: 'yes' + }, + { + color: 'green', + word: 'green', + phase: 'task', + congruent: 'yes' + }, + { + color: 'green', + word: 'blue', + phase: 'task', + congruent: 'no' + }, + { + color: 'green', + word: 'yellow', + phase: 'task', + congruent: 'no' + }, + { + color: 'blue', + word: 'red', + phase: 'task', + congruent: 'no' + }, + { + color: 'blue', + word: 'green', + phase: 'task', + congruent: 'no' + }, + { + color: 'blue', + word: 'blue', + phase: 'task', + congruent: 'yes' + }, + { + color: 'blue', + word: 'blue', + phase: 'task', + congruent: 'yes' + }, + { + color: 'blue', + word: 'blue', + phase: 'task', + congruent: 'yes' + }, + { + color: 'blue', + word: 'yellow', + phase: 'task', + congruent: 'no' + }, + { + color: '#ffe32a', + word: 'red', + phase: 'task', + congruent: 'no' + }, + { + color: '#ffe32a', + word: 'green', + phase: 'task', + congruent: 'no' + }, + { + color: '#ffe32a', + word: 'blue', + phase: 'task', + congruent: 'no' + }, + { + color: '#ffe32a', + word: 'yellow', + phase: 'task', + congruent: 'yes' + }, + { + color: '#ffe32a', + word: 'yellow', + phase: 'task', + congruent: 'yes' + }, + { + color: '#ffe32a', + word: 'yellow', + phase: 'task', + congruent: 'yes' } - }, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${this.parameters.iti}' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - version: '2.4.4', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 331.08, - height: 36.16, - fill: '${ this.parameters.color }', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '${ this.parameters.word }', - fontSize: '72', - fontWeight: 'bold', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '6', - styles: {} - }], - files: {}, + ], + title: 'Stroop task', parameters: {}, - responses: { - 'keydown(r)': 'red', - 'keydown(g)': 'green', - 'keydown(b)': 'blue', - 'keydown(y)': '#ffe32a' - }, - messageHandlers: { - run: function anonymous() { - this.parameters.callbackForEEG(this.parameters.congruent === 'yes' ? 1 : 2); - } - }, - viewport: [800, 600], - title: 'Stroop screen', - correctResponse: '${ this.parameters.color }' - }, { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: "${ parameters.phase == 'practice' ? 0 : 1000 }", - width: 1246.91, - height: 58.76, - fill: "${ state.correct ? 'green' : 'red' }", - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: "${ state.correct ? 'Well done!' : 'Please respond accurately' }", - fontSize: '52', - fontWeight: 'bold', - fontFamily: 'sans-serif', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '24', - styles: {} - }], files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); + sample: { + mode: 'draw-shuffle', + n: '96' + }, + shuffleGroups: [], + template: { + messageHandlers: {}, + type: 'lab.flow.Sequence', + responses: {}, + title: 'Trial', + parameters: {}, + files: {}, + content: [ + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + version: '2.4.4', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 18.69, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '+', + fontSize: '72', + fontWeight: 'normal', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '5', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + run: function anonymous() { + this.data.correct = 'empty'; + } + }, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${this.parameters.iti}' + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + version: '2.4.4', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 331.08, + height: 36.16, + fill: '${ this.parameters.color }', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '${ this.parameters.word }', + fontSize: '72', + fontWeight: 'bold', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '6', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: { + 'keydown(r)': 'red', + 'keydown(g)': 'green', + 'keydown(b)': 'blue', + 'keydown(y)': '#ffe32a' + }, + messageHandlers: { + run: function anonymous() { + this.parameters.callbackForEEG( + this.parameters.congruent === 'yes' ? 1 : 2 + ); + } + }, + viewport: [800, 600], + title: 'Stroop screen', + correctResponse: '${ this.parameters.color }' + }, + { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: "${ parameters.phase == 'practice' ? 0 : 1000 }", + width: 1246.91, + height: 58.76, + fill: "${ state.correct ? 'green' : 'red' }", + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: + "${ state.correct ? 'Well done!' : 'Please respond accurately' }", + fontSize: '52', + fontWeight: 'bold', + fontFamily: 'sans-serif', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '24', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + 'before:prepare': function anonymous() { + this.data.trial_number = + 1 + + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); - this.data.condition = this.parameters.congruent === 'yes' ? 'Match' : 'Mismatch'; + this.data.condition = + this.parameters.congruent === 'yes' + ? 'Match' + : 'Mismatch'; - this.data.reaction_time = this.state.duration; + this.data.reaction_time = this.state.duration; - if (this.state.response === this.parameters.color) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; - } + if (this.state.response === this.parameters.color) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } - this.data.response_given = this.state.correct === 'empty' ? 'no' : 'yes'; - } - }, - viewport: [800, 600], - title: 'Inter-trial interval', - timeout: "${ parameters.phase == 'practice' ? 1000 : 500 }", - tardy: true - }] + this.data.response_given = + this.state.correct === 'empty' ? 'no' : 'yes'; + } + }, + viewport: [800, 600], + title: 'Inter-trial interval', + timeout: "${ parameters.phase == 'practice' ? 1000 : 500 }", + tardy: true + } + ] + } + } + }, + { + messageHandlers: {}, + type: 'lab.html.Screen', + responses: { + 'keypress(Space)': 'end' + }, + title: 'Thanks', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n', + parameters: {}, + files: {} } - } - }, { - messageHandlers: {}, - type: 'lab.html.Screen', - responses: { - 'keypress(Space)': 'end' - }, - title: 'Thanks', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n', - parameters: {}, - files: {} - }] - }] + ] + } + ] }; // export -export default studyObject; \ No newline at end of file +export default studyObject; diff --git a/app/utils/labjs/scripts/visualsearch.ts b/app/utils/labjs/scripts/visualsearch.ts index fa2bb202..c06d69c0 100644 --- a/app/utils/labjs/scripts/visualsearch.ts +++ b/app/utils/labjs/scripts/visualsearch.ts @@ -7,585 +7,684 @@ const studyObject = { metadata: {}, files: {}, responses: {}, - content: [{ - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Visual search', - content: [{ - type: 'lab.html.Screen', + content: [ + { + type: 'lab.flow.Sequence', files: {}, parameters: {}, - responses: { - 'keypress(Space)': 'next', - 'keypress(q)': 'skipPractice' - }, - messageHandlers: {}, - title: 'Instruction', - content: '\u003Cstyle\u003E\n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cheader\u003E\n \u003Ch1\u003EVisual search task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n \u003Cp\u003E\n Again, all you need to do is to find an \u003Cb\u003Eorange T\u003C\u002Fb\u003E. If you see the \u003Cb\u003Eorange T\u003C\u002Fb\u003E, press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E. Ignore the upside-down orange T, as well as blue Ts! IF THERE IS NO ORANGE T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E.\n It is very important to respond \u003Cb\u003EAS FAST AS YOU CAN\u003C\u002Fb\u003E.\n \u003C\u002Fp\u003E\n\n \u003Cdiv style="display:grid; grid-template-columns:1fr 1fr;"\u003E\n \u003Cdiv\u003E\n \u003Cp\u003E\n Find \n \u003C\u002Fp\u003E\n \u003Cbr\u003E\n \u003Cdiv class="letter" style="color:orange; height: 100px;"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003Cdiv\u003E\n \u003Cp\u003E\n But do not respond to any of these distractors:\n \u003C\u002Fp\u003E\n \u003Cbr\u003E\n \u003Cdiv style="display:grid; grid-template-columns: 100px 50px; justify-content: center; "\u003E\n \u003Cdiv class="letter" style="color:lightblue;"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003Cdiv class="letter" style="color:orange; transform: rotate(-180deg);"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n\n \u003Cp\u003E\n Press the space bar on your keyboard to start doing the practice trials.\n If you want to skip the practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fmain\u003E' - }, { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw-shuffle' - }, responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - let practiceTrialParameters = []; - - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - const randomBetween = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; - - const makeStimuliArray = (arrLen, stLen, isTarget) => { - const arr = Array(arrLen).fill(0); - const shuffled = shuffle([...Array(arrLen).keys()]).slice(0, stLen); - for (const p of shuffled) { - if (randomBetween(0, 1) === 0) { - arr[p] = 1; - } else { - arr[p] = 2; - } - } - if (isTarget === 'yes') { - arr[shuffled[0]] = 3; - } - return arr; - }; - - const arrLength = 25; - function trialConstructor(i, stimLength, isTarget) { - return { - trialId: i, - stimuli: makeStimuliArray(arrLength, stimLength, isTarget), - target: isTarget, - size: stimLength, - phase: 'practice' - }; - } - - const numberTrials = 1; - for (let i = 1; i <= numberTrials; i++) { - practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 5, 'yes')); - practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 5, 'no')); - practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 10, 'yes')); - practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 10, 'no')); - practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 15, 'yes')); - practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 15, 'no')); - practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 20, 'yes')); - practiceTrialParameters = practiceTrialParameters.concat(trialConstructor(i, 20, 'no')); - } - - // assign options values to parameters of this task - this.options.templateParameters = practiceTrialParameters; - this.options.shuffle = true; // already shuffled before - } - }, - title: 'Practice task', - tardy: true, - skip: "${ state.response === 'skipPractice' }", - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial', - content: [{ - type: 'lab.canvas.Frame', - context: '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', - contextSelector: 'canvas', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Frame', - content: { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 18.05, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '+', - fontSize: '50', - fontWeight: 'bold', - fontFamily: 'Times New Roman', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '15', - styles: {} - }], - files: {}, - parameters: {}, - responses: {}, - messageHandlers: { - run: function anonymous() { - this.data.response = 'noresponse'; - this.data.correct = false; - } - }, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${this.parameters.iti}' - } - }, { + messageHandlers: {}, + title: 'Visual search', + content: [ + { type: 'lab.html.Screen', files: {}, parameters: {}, responses: { - 'keypress(b)': 'yes', - 'keypress(n)': 'no' - }, - messageHandlers: { - run: function anonymous() { - const taskgrid = document.querySelector('#taskgrid'); - const stimuli = this.parameters.stimuli; - - for (const s of stimuli) { - const d = document.createElement('div'); - d.classList.add('box'); - const el = document.createElement('span'); - el.classList.add('letter'); - - if (s > 0) { - if (s === 1) { - el.innerHTML = 'T'; - el.style.color = 'lightblue'; - } - if (s === 2) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - el.style.transform = 'rotate(-180deg)'; - } - if (s === 3) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - } - } - d.appendChild(el); - taskgrid.appendChild(d); - } - } + 'keypress(Space)': 'next', + 'keypress(q)': 'skipPractice' }, - title: 'Stimuli', - content: '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', - correctResponse: '${this.parameters.target}' - }, { - type: 'lab.html.Screen', + messageHandlers: {}, + title: 'Instruction', + content: + '\u003Cstyle\u003E\n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cheader\u003E\n \u003Ch1\u003EVisual search task\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \n \u003Cp\u003E\n ${this.parameters.intro}\n \u003C\u002Fp\u003E\n \n \u003Cp\u003E\n Again, all you need to do is to find an \u003Cb\u003Eorange T\u003C\u002Fb\u003E. If you see the \u003Cb\u003Eorange T\u003C\u002Fb\u003E, press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E. Ignore the upside-down orange T, as well as blue Ts! IF THERE IS NO ORANGE T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E.\n It is very important to respond \u003Cb\u003EAS FAST AS YOU CAN\u003C\u002Fb\u003E.\n \u003C\u002Fp\u003E\n\n \u003Cdiv style="display:grid; grid-template-columns:1fr 1fr;"\u003E\n \u003Cdiv\u003E\n \u003Cp\u003E\n Find \n \u003C\u002Fp\u003E\n \u003Cbr\u003E\n \u003Cdiv class="letter" style="color:orange; height: 100px;"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003Cdiv\u003E\n \u003Cp\u003E\n But do not respond to any of these distractors:\n \u003C\u002Fp\u003E\n \u003Cbr\u003E\n \u003Cdiv style="display:grid; grid-template-columns: 100px 50px; justify-content: center; "\u003E\n \u003Cdiv class="letter" style="color:lightblue;"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003Cdiv class="letter" style="color:orange; transform: rotate(-180deg);"\u003E\n T\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n \u003C\u002Fdiv\u003E\n\n \u003Cp\u003E\n Press the space bar on your keyboard to start doing the practice trials.\n If you want to skip the practice trials and go directly to the task, press the "q" button on your keyboard.\n \u003C\u002Fp\u003E\n\u003C\u002Fmain\u003E' + }, + { + type: 'lab.flow.Loop', files: {}, parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle' + }, responses: {}, messageHandlers: { - run: function anonymous() { - const taskgrid = document.querySelector('#taskgrid'); - const stimuli = this.parameters.stimuli; - - for (const s of stimuli) { - const d = document.createElement('div'); - d.classList.add('box'); - const el = document.createElement('span'); - el.classList.add('letter'); - - if (s > 0) { - if (s === 1) { - el.innerHTML = 'T'; - el.style.color = 'lightblue'; - } - if (s === 2) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - el.style.transform = 'rotate(-180deg)'; - } - if (s === 3) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - d.id = 'target'; - } + 'before:prepare': function anonymous() { + let practiceTrialParameters = []; + + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; } - d.appendChild(el); - taskgrid.appendChild(d); + return a; } - if (this.state.response === 'noresponse') { - document.querySelector('#feedback').innerHTML = 'Please respond.'; - return; - } - - if (this.state.correct) { - document.querySelector('#feedback').innerHTML = 'Well done!'; - document.querySelector('#feedback').style.color = 'green'; - } else if (this.parameters.target === 'yes') { - document.querySelector('#feedback').innerHTML = 'Error! There was one!'; - document.querySelector('#target').style.border = 'solid'; - } else { - document.querySelector('#feedback').innerHTML = 'Error! There was none!'; + const randomBetween = (min, max) => + Math.floor(Math.random() * (max - min + 1)) + min; + + const makeStimuliArray = (arrLen, stLen, isTarget) => { + const arr = Array(arrLen).fill(0); + const shuffled = shuffle([...Array(arrLen).keys()]).slice( + 0, + stLen + ); + for (const p of shuffled) { + if (randomBetween(0, 1) === 0) { + arr[p] = 1; + } else { + arr[p] = 2; + } + } + if (isTarget === 'yes') { + arr[shuffled[0]] = 3; + } + return arr; + }; + + const arrLength = 25; + function trialConstructor(i, stimLength, isTarget) { + return { + trialId: i, + stimuli: makeStimuliArray(arrLength, stimLength, isTarget), + target: isTarget, + size: stimLength, + phase: 'practice' + }; } - }, - 'before:prepare': function anonymous() { - this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); - - this.data.condition = `${this.parameters.size} letters`; - - this.data.reaction_time = this.state.duration; - // this.data.target = this.parameters.target; - if (this.state.response === this.parameters.target) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; + const numberTrials = 1; + for (let i = 1; i <= numberTrials; i++) { + practiceTrialParameters = practiceTrialParameters.concat( + trialConstructor(i, 5, 'yes') + ); + practiceTrialParameters = practiceTrialParameters.concat( + trialConstructor(i, 5, 'no') + ); + practiceTrialParameters = practiceTrialParameters.concat( + trialConstructor(i, 10, 'yes') + ); + practiceTrialParameters = practiceTrialParameters.concat( + trialConstructor(i, 10, 'no') + ); + practiceTrialParameters = practiceTrialParameters.concat( + trialConstructor(i, 15, 'yes') + ); + practiceTrialParameters = practiceTrialParameters.concat( + trialConstructor(i, 15, 'no') + ); + practiceTrialParameters = practiceTrialParameters.concat( + trialConstructor(i, 20, 'yes') + ); + practiceTrialParameters = practiceTrialParameters.concat( + trialConstructor(i, 20, 'no') + ); } - this.data.response_given = this.parameters.phase === 'practice' || this.state.response === 'noresponse' ? 'no' : 'yes'; + // assign options values to parameters of this task + this.options.templateParameters = practiceTrialParameters; + this.options.shuffle = true; // already shuffled before } }, - title: 'Feedback', - content: '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n .feedback{\n position: absolute;\n top: 50px;\n font-size: 2rem;\n font-weight: bold;\n color: #da5b1c;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n \u003Cdiv id="feedback" class="feedback"\u003E\n Feedback\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n\n', - timeout: '2000', + title: 'Practice task', tardy: true, - skip: "${ parameters.phase === 'main' }" - }] - } - }, { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'continue' - }, - messageHandlers: {}, - title: 'Main task instruction', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n' - }, { - type: 'lab.flow.Loop', - files: {}, - parameters: {}, - templateParameters: [], - sample: { - mode: 'draw-shuffle' - }, - responses: {}, - messageHandlers: { - 'before:prepare': function anonymous() { - let trialParameters = []; - - function shuffle(a) { - let j, x, i; - for (i = a.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - const randomBetween = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; - - const makeStimuliArray = (arrLen, stLen, isTarget) => { - const arr = Array(arrLen).fill(0); - const shuffled = shuffle([...Array(arrLen).keys()]).slice(0, stLen); - for (const p of shuffled) { - if (randomBetween(0, 1) === 0) { - arr[p] = 1; - } else { - arr[p] = 2; - } - } - if (isTarget === 'yes') { - arr[shuffled[0]] = 3; - } - return arr; - }; - - const arrLength = 25; - function trialConstructor(i, stimLength, isTarget) { - return { - trialId: i, - stimuli: makeStimuliArray(arrLength, stimLength, isTarget), - target: isTarget, - size: stimLength, - phase: 'main' - }; - } - - const numberTrials = 10; - for (let i = 1; i <= numberTrials; i++) { - trialParameters = trialParameters.concat(trialConstructor(i, 5, 'yes')); - trialParameters = trialParameters.concat(trialConstructor(i, 5, 'no')); - trialParameters = trialParameters.concat(trialConstructor(i, 10, 'yes')); - trialParameters = trialParameters.concat(trialConstructor(i, 10, 'no')); - trialParameters = trialParameters.concat(trialConstructor(i, 15, 'yes')); - trialParameters = trialParameters.concat(trialConstructor(i, 15, 'no')); - trialParameters = trialParameters.concat(trialConstructor(i, 20, 'yes')); - trialParameters = trialParameters.concat(trialConstructor(i, 20, 'no')); - } - - // assign options values to parameters of this task - this.options.templateParameters = trialParameters; - this.options.shuffle = true; // already shuffled before - } - }, - title: 'Main task', - shuffleGroups: [], - template: { - type: 'lab.flow.Sequence', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Trial', - content: [{ - type: 'lab.canvas.Frame', - context: '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', - contextSelector: 'canvas', - files: {}, - parameters: {}, - responses: {}, - messageHandlers: {}, - title: 'Frame', - content: { - type: 'lab.canvas.Screen', - content: [{ - type: 'i-text', - version: '2.7.0', - originX: 'center', - originY: 'center', - left: 0, - top: 0, - width: 18.05, - height: 36.16, - fill: 'black', - stroke: null, - strokeWidth: 1, - strokeDashArray: null, - strokeLineCap: 'butt', - strokeDashOffset: 0, - strokeLineJoin: 'round', - strokeMiterLimit: 4, - scaleX: 1, - scaleY: 1, - angle: 0, - flipX: false, - flipY: false, - opacity: 1, - shadow: null, - visible: true, - clipTo: null, - backgroundColor: '', - fillRule: 'nonzero', - paintFirst: 'fill', - globalCompositeOperation: 'source-over', - transformMatrix: null, - skewX: 0, - skewY: 0, - text: '+', - fontSize: '50', - fontWeight: 'bold', - fontFamily: 'Times New Roman', - fontStyle: 'normal', - lineHeight: 1.16, - underline: false, - overline: false, - linethrough: false, - textAlign: 'center', - textBackgroundColor: '', - charSpacing: 0, - id: '15', - styles: {} - }], + skip: "${ state.response === 'skipPractice' }", + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', files: {}, parameters: {}, responses: {}, - messageHandlers: { - run: function anonymous() { - this.data.response = 'noresponse'; - this.data.correct = false; + messageHandlers: {}, + title: 'Trial', + content: [ + { + type: 'lab.canvas.Frame', + context: + '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', + contextSelector: 'canvas', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Frame', + content: { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 18.05, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '+', + fontSize: '50', + fontWeight: 'bold', + fontFamily: 'Times New Roman', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '15', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + run: function anonymous() { + this.data.response = 'noresponse'; + this.data.correct = false; + } + }, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${this.parameters.iti}' + } + }, + { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(b)': 'yes', + 'keypress(n)': 'no' + }, + messageHandlers: { + run: function anonymous() { + const taskgrid = document.querySelector('#taskgrid'); + const stimuli = this.parameters.stimuli; + + for (const s of stimuli) { + const d = document.createElement('div'); + d.classList.add('box'); + const el = document.createElement('span'); + el.classList.add('letter'); + + if (s > 0) { + if (s === 1) { + el.innerHTML = 'T'; + el.style.color = 'lightblue'; + } + if (s === 2) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + el.style.transform = 'rotate(-180deg)'; + } + if (s === 3) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + } + } + d.appendChild(el); + taskgrid.appendChild(d); + } + } + }, + title: 'Stimuli', + content: + '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', + correctResponse: '${this.parameters.target}' + }, + { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + run: function anonymous() { + const taskgrid = document.querySelector('#taskgrid'); + const stimuli = this.parameters.stimuli; + + for (const s of stimuli) { + const d = document.createElement('div'); + d.classList.add('box'); + const el = document.createElement('span'); + el.classList.add('letter'); + + if (s > 0) { + if (s === 1) { + el.innerHTML = 'T'; + el.style.color = 'lightblue'; + } + if (s === 2) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + el.style.transform = 'rotate(-180deg)'; + } + if (s === 3) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + d.id = 'target'; + } + } + d.appendChild(el); + taskgrid.appendChild(d); + } + + if (this.state.response === 'noresponse') { + document.querySelector('#feedback').innerHTML = + 'Please respond.'; + return; + } + + if (this.state.correct) { + document.querySelector('#feedback').innerHTML = + 'Well done!'; + document.querySelector('#feedback').style.color = 'green'; + } else if (this.parameters.target === 'yes') { + document.querySelector('#feedback').innerHTML = + 'Error! There was one!'; + document.querySelector('#target').style.border = 'solid'; + } else { + document.querySelector('#feedback').innerHTML = + 'Error! There was none!'; + } + }, + 'before:prepare': function anonymous() { + this.data.trial_number = + 1 + + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); + + this.data.condition = `${this.parameters.size} letters`; + + this.data.reaction_time = this.state.duration; + // this.data.target = this.parameters.target; + + if (this.state.response === this.parameters.target) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + + this.data.response_given = + this.parameters.phase === 'practice' || + this.state.response === 'noresponse' + ? 'no' + : 'yes'; + } + }, + title: 'Feedback', + content: + '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n .feedback{\n position: absolute;\n top: 50px;\n font-size: 2rem;\n font-weight: bold;\n color: #da5b1c;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n \u003Cdiv id="feedback" class="feedback"\u003E\n Feedback\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n\n', + timeout: '2000', + tardy: true, + skip: "${ parameters.phase === 'main' }" } - }, - viewport: [800, 600], - title: 'Fixation cross', - timeout: '${this.parameters.iti}' + ] } - }, { + }, + { type: 'lab.html.Screen', files: {}, parameters: {}, responses: { - 'keypress(b)': 'yes', - 'keypress(n)': 'no' + 'keypress(Space)': 'continue' }, - messageHandlers: { - run: function anonymous() { - this.parameters.callbackForEEG(parseInt(this.parameters.size) < 13 ? 2 : 1); - const taskgrid = document.querySelector('#taskgrid'); - const stimuli = this.parameters.stimuli; - - for (const s of stimuli) { - const d = document.createElement('div'); - d.classList.add('box'); - const el = document.createElement('span'); - el.classList.add('letter'); - - if (s > 0) { - if (s === 1) { - el.innerHTML = 'T'; - el.style.color = 'lightblue'; - } - if (s === 2) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - el.style.transform = 'rotate(-180deg)'; - } - if (s === 3) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - } - } - d.appendChild(el); - taskgrid.appendChild(d); - } - } - }, - title: 'Stimuli', - content: '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', - correctResponse: '${this.parameters.target}' - }, { - type: 'lab.html.Screen', + messageHandlers: {}, + title: 'Main task instruction', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \u003Ch1\u003EReady for the real data collection?\u003C\u002Fh1\u003E\n\u003C\u002Fheader\u003E\n\u003Cmain\u003E\n\n \u003Cp\u003E\n Press the the space bar to start the main task.\n \u003C\u002Fp\u003E\n\n\u003C\u002Fmain\u003E\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Ffooter\u003E\n' + }, + { + type: 'lab.flow.Loop', files: {}, parameters: {}, + templateParameters: [], + sample: { + mode: 'draw-shuffle' + }, responses: {}, messageHandlers: { - run: function anonymous() { - const taskgrid = document.querySelector('#taskgrid'); - const stimuli = this.parameters.stimuli; - - for (const s of stimuli) { - const d = document.createElement('div'); - d.classList.add('box'); - const el = document.createElement('span'); - el.classList.add('letter'); - - if (s > 0) { - if (s === 1) { - el.innerHTML = 'T'; - el.style.color = 'lightblue'; - } - if (s === 2) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - el.style.transform = 'rotate(-180deg)'; - } - if (s === 3) { - el.innerHTML = 'T'; - el.style.color = 'orange'; - d.id = 'target'; - } + 'before:prepare': function anonymous() { + let trialParameters = []; + + function shuffle(a) { + let j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; } - d.appendChild(el); - taskgrid.appendChild(d); - } - - if (this.state.response === 'noresponse') { - document.querySelector('#feedback').innerHTML = 'Please respond!'; - return; + return a; } - if (this.state.correct) { - document.querySelector('#feedback').innerHTML = 'Well done!'; - document.querySelector('#feedback').style.color = 'green'; - } else if (this.parameters.target === 'yes') { - document.querySelector('#feedback').innerHTML = 'Error! There was one!'; - document.querySelector('#target').style.border = 'solid'; - } else { - document.querySelector('#feedback').innerHTML = 'Error! There was none!'; + const randomBetween = (min, max) => + Math.floor(Math.random() * (max - min + 1)) + min; + + const makeStimuliArray = (arrLen, stLen, isTarget) => { + const arr = Array(arrLen).fill(0); + const shuffled = shuffle([...Array(arrLen).keys()]).slice( + 0, + stLen + ); + for (const p of shuffled) { + if (randomBetween(0, 1) === 0) { + arr[p] = 1; + } else { + arr[p] = 2; + } + } + if (isTarget === 'yes') { + arr[shuffled[0]] = 3; + } + return arr; + }; + + const arrLength = 25; + function trialConstructor(i, stimLength, isTarget) { + return { + trialId: i, + stimuli: makeStimuliArray(arrLength, stimLength, isTarget), + target: isTarget, + size: stimLength, + phase: 'main' + }; } - }, - 'before:prepare': function anonymous() { - this.data.trial_number = 1 + parseInt(this.options.id.split('_')[this.options.id.split('_').length - 2]); - this.data.condition = `${this.parameters.size} letters`; - - this.data.reaction_time = this.state.duration; - // this.data.target = this.parameters.target; - - if (this.state.response === this.parameters.target) { - this.data.correct_response = true; - } else { - this.data.correct_response = false; + const numberTrials = 10; + for (let i = 1; i <= numberTrials; i++) { + trialParameters = trialParameters.concat( + trialConstructor(i, 5, 'yes') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 5, 'no') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 10, 'yes') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 10, 'no') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 15, 'yes') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 15, 'no') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 20, 'yes') + ); + trialParameters = trialParameters.concat( + trialConstructor(i, 20, 'no') + ); } - this.data.response_given = this.parameters.phase === 'practice' || this.state.response === 'noresponse' ? 'no' : 'yes'; + // assign options values to parameters of this task + this.options.templateParameters = trialParameters; + this.options.shuffle = true; // already shuffled before } }, - title: 'Feedback', - content: '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n .feedback{\n position: absolute;\n top: 50px;\n font-size: 2rem;\n font-weight: bold;\n color: #da5b1c;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n \u003Cdiv id="feedback" class="feedback"\u003E\n Feedback\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n\n', - timeout: '2000', - tardy: true, - skip: "${ parameters.phase === 'main' }" - }] - } - }, { - type: 'lab.html.Screen', - files: {}, - parameters: {}, - responses: { - 'keypress(Space)': 'end' - }, - messageHandlers: {}, - title: 'End', - content: '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' - }] - }] + title: 'Main task', + shuffleGroups: [], + template: { + type: 'lab.flow.Sequence', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Trial', + content: [ + { + type: 'lab.canvas.Frame', + context: + '\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n \u003Ccanvas \u002F\u003E\n\u003C\u002Fmain\u003E\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', + contextSelector: 'canvas', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: {}, + title: 'Frame', + content: { + type: 'lab.canvas.Screen', + content: [ + { + type: 'i-text', + version: '2.7.0', + originX: 'center', + originY: 'center', + left: 0, + top: 0, + width: 18.05, + height: 36.16, + fill: 'black', + stroke: null, + strokeWidth: 1, + strokeDashArray: null, + strokeLineCap: 'butt', + strokeDashOffset: 0, + strokeLineJoin: 'round', + strokeMiterLimit: 4, + scaleX: 1, + scaleY: 1, + angle: 0, + flipX: false, + flipY: false, + opacity: 1, + shadow: null, + visible: true, + clipTo: null, + backgroundColor: '', + fillRule: 'nonzero', + paintFirst: 'fill', + globalCompositeOperation: 'source-over', + transformMatrix: null, + skewX: 0, + skewY: 0, + text: '+', + fontSize: '50', + fontWeight: 'bold', + fontFamily: 'Times New Roman', + fontStyle: 'normal', + lineHeight: 1.16, + underline: false, + overline: false, + linethrough: false, + textAlign: 'center', + textBackgroundColor: '', + charSpacing: 0, + id: '15', + styles: {} + } + ], + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + run: function anonymous() { + this.data.response = 'noresponse'; + this.data.correct = false; + } + }, + viewport: [800, 600], + title: 'Fixation cross', + timeout: '${this.parameters.iti}' + } + }, + { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(b)': 'yes', + 'keypress(n)': 'no' + }, + messageHandlers: { + run: function anonymous() { + this.parameters.callbackForEEG( + parseInt(this.parameters.size) < 13 ? 2 : 1 + ); + const taskgrid = document.querySelector('#taskgrid'); + const stimuli = this.parameters.stimuli; + + for (const s of stimuli) { + const d = document.createElement('div'); + d.classList.add('box'); + const el = document.createElement('span'); + el.classList.add('letter'); + + if (s > 0) { + if (s === 1) { + el.innerHTML = 'T'; + el.style.color = 'lightblue'; + } + if (s === 2) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + el.style.transform = 'rotate(-180deg)'; + } + if (s === 3) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + } + } + d.appendChild(el); + taskgrid.appendChild(d); + } + } + }, + title: 'Stimuli', + content: + '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E', + correctResponse: '${this.parameters.target}' + }, + { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: {}, + messageHandlers: { + run: function anonymous() { + const taskgrid = document.querySelector('#taskgrid'); + const stimuli = this.parameters.stimuli; + + for (const s of stimuli) { + const d = document.createElement('div'); + d.classList.add('box'); + const el = document.createElement('span'); + el.classList.add('letter'); + + if (s > 0) { + if (s === 1) { + el.innerHTML = 'T'; + el.style.color = 'lightblue'; + } + if (s === 2) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + el.style.transform = 'rotate(-180deg)'; + } + if (s === 3) { + el.innerHTML = 'T'; + el.style.color = 'orange'; + d.id = 'target'; + } + } + d.appendChild(el); + taskgrid.appendChild(d); + } + + if (this.state.response === 'noresponse') { + document.querySelector('#feedback').innerHTML = + 'Please respond!'; + return; + } + + if (this.state.correct) { + document.querySelector('#feedback').innerHTML = + 'Well done!'; + document.querySelector('#feedback').style.color = 'green'; + } else if (this.parameters.target === 'yes') { + document.querySelector('#feedback').innerHTML = + 'Error! There was one!'; + document.querySelector('#target').style.border = 'solid'; + } else { + document.querySelector('#feedback').innerHTML = + 'Error! There was none!'; + } + }, + 'before:prepare': function anonymous() { + this.data.trial_number = + 1 + + parseInt( + this.options.id.split('_')[ + this.options.id.split('_').length - 2 + ] + ); + + this.data.condition = `${this.parameters.size} letters`; + + this.data.reaction_time = this.state.duration; + // this.data.target = this.parameters.target; + + if (this.state.response === this.parameters.target) { + this.data.correct_response = true; + } else { + this.data.correct_response = false; + } + + this.data.response_given = + this.parameters.phase === 'practice' || + this.state.response === 'noresponse' + ? 'no' + : 'yes'; + } + }, + title: 'Feedback', + content: + '\u003Cstyle\u003E\n #taskgrid{\n display: grid;\n grid-template-columns: repeat(5, 100px);\n grid-template-rows: repeat(5, 100px);\n grid-row-gap: 10px;\n grid-column-gap: 10px;\n }\n .box{\n display: grid;\n align-items: center;\n } \n .letter{\n font-size: 90px;\n font-weight: bold;\n }\n .feedback{\n position: absolute;\n top: 50px;\n font-size: 2rem;\n font-weight: bold;\n color: #da5b1c;\n }\n\u003C\u002Fstyle\u003E\n\n\u003Cmain class="content-vertical-center content-horizontal-center"\u003E\n\n \u003Cdiv id="taskgrid"\u003E\n\n\n \u003C\u002Fdiv\u003E\n\n \u003Cdiv id="feedback" class="feedback"\u003E\n Feedback\n \u003C\u002Fdiv\u003E\n\n\u003C\u002Fmain\u003E\n\n\n\u003Cfooter class="content-vertical-center content-horizontal-center"\u003E\n \u003Cp\u003E\n Press \u003Ckbd\u003Eb\u003C\u002Fkbd\u003E if you see the orange T, press \u003Ckbd\u003En\u003C\u002Fkbd\u003E if there is no orange T.\n \u003C\u002Fp\u003E\n\u003C\u002Ffooter\u003E\n\n', + timeout: '2000', + tardy: true, + skip: "${ parameters.phase === 'main' }" + } + ] + } + }, + { + type: 'lab.html.Screen', + files: {}, + parameters: {}, + responses: { + 'keypress(Space)': 'end' + }, + messageHandlers: {}, + title: 'End', + content: + '\u003Cheader class="content-vertical-center content-horizontal-center"\u003E\n \n\u003C\u002Fheader\u003E\n\n\u003Cmain\u003E\n \u003Ch1\u003E\n Thank you!\n \u003C\u002Fh1\u003E\n \u003Ch1\u003E\n Press the space bar to finish the task.\n \u003C\u002Fh1\u003E\n\u003C\u002Fmain\u003E\n\n' + } + ] + } + ] }; // export -export default studyObject; \ No newline at end of file +export default studyObject; From 074a274cfc424f353471b6e89b9cb5df01476221 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Wed, 24 Jun 2020 17:47:43 -0700 Subject: [PATCH 16/66] started adding ts and eslint rules --- .eslintrc.js | 4 +++- tsconfig.json | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index 38f99fff..92ac0af1 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -2,7 +2,9 @@ module.exports = { extends: 'erb/typescript', rules: { // A temporary hack related to IDE not resolving correct package.json - 'import/no-extraneous-dependencies': 'off' + 'import/no-extraneous-dependencies': 'off', + 'react/destructuring-assignment': 'warn', + 'react/no-access-state-in-setstate': 'warn' }, settings: { 'import/resolver': { diff --git a/tsconfig.json b/tsconfig.json index 79a055ac..81533851 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,7 @@ "strict": true, "pretty": true, "sourceMap": true, + "noImplicitAny": false, /* Additional Checks */ "noUnusedLocals": true, "noUnusedParameters": true, From 95b42b97dee4e03a67b1cb193938c6b5ed87b44a Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Wed, 24 Jun 2020 17:47:53 -0700 Subject: [PATCH 17/66] Started fixing things! --- .../CleanComponent/CleanSidebar.tsx | 23 ++++++++-------- app/constants/interfaces.ts | 27 +++++++++++++------ app/{viewer.ts => viewer.js} | 0 3 files changed, 30 insertions(+), 20 deletions(-) rename app/{viewer.ts => viewer.js} (100%) diff --git a/app/components/CleanComponent/CleanSidebar.tsx b/app/components/CleanComponent/CleanSidebar.tsx index 7763e868..5a0d6efa 100644 --- a/app/components/CleanComponent/CleanSidebar.tsx +++ b/app/components/CleanComponent/CleanSidebar.tsx @@ -2,17 +2,17 @@ import React, { Component } from 'react'; import { Segment, Header, Menu, Icon, Button, Grid } from 'semantic-ui-react'; import styles from '../styles/collect.css'; -const HELP_STEP = { - MENU: 0, - SIGNAL_EXPLANATION: 1, - SIGNAL_SALINE: 2, - SIGNAL_CONTACT: 3, - SIGNAL_MOVEMENT: 4, - LEARN_BRAIN: 5, - LEARN_BLINK: 6, - LEARN_THOUGHTS: 7, - LEARN_ALPHA: 8 -}; +enum HELP_STEP { + MENU = 0, + SIGNAL_EXPLANATION = 1, + SIGNAL_SALINE = 2, + SIGNAL_CONTACT = 3, + SIGNAL_MOVEMENT = 4, + LEARN_BRAIN = 5, + LEARN_BLINK = 6, + LEARN_THOUGHT = 7, + LEARN_ALPHA = 8 +} interface Props { handleClose: () => void; @@ -22,7 +22,6 @@ interface State { helpStep: HELP_STEP; } export default class CleanSidebar extends Component { - props: Props; constructor(props) { super(props); this.state = { diff --git a/app/constants/interfaces.ts b/app/constants/interfaces.ts index 8b5a943e..5b6d2d60 100644 --- a/app/constants/interfaces.ts +++ b/app/constants/interfaces.ts @@ -2,7 +2,8 @@ * This file contains all the custom types that we use for Flow type checking */ -import { EVENTS } from "./constants"; +import { ChildProcess } from 'child_process'; +import { EVENTS } from './constants'; // TODO: Write interfaces for device objects (Observables, Classes, etc) @@ -18,8 +19,18 @@ export type ExperimentParameters = { intro: string; // Setting this to any prevents ridiculous flow runtime errors showProgessBar: any; - stimulus1: {dir: string;type: EVENTS;title: string;response: string;}; - stimulus2: {dir: string;type: EVENTS;title: string;response: string;}; + stimulus1: { + dir: string; + type: typeof EVENTS; + title: string; + response: string; + }; + stimulus2: { + dir: string; + type: typeof EVENTS; + title: string; + response: string; + }; }; export type ExperimentDescription = { @@ -36,7 +47,7 @@ export interface Trial { id: string; type: string; stimulus?: string | StimulusVariable; - trial_duration?: number | () => number; + trial_duration?: (() => number) | number; post_trial_gap?: number; on_load?: (arg0: string) => void | StimulusVariable; choices?: Array; @@ -47,7 +58,7 @@ export type Timeline = { id: string; timeline: Array; sample?: SampleParameter; - timeline_variables?: Array; + timeline_variables?: Array; }; export interface SampleParameter { @@ -62,9 +73,9 @@ export type StimulusVariable = () => any; // Jupyter export interface Kernel { - config: Object; + config: object; connectionFile: string; - kernelSpec: Object; + kernelSpec: object; spawn: ChildProcess; } @@ -88,4 +99,4 @@ export interface DeviceInfo { export interface ActionType { readonly payload: any; readonly type: string; -} \ No newline at end of file +} diff --git a/app/viewer.ts b/app/viewer.js similarity index 100% rename from app/viewer.ts rename to app/viewer.js From 75cdb114d4471b1d628d29a90e47dcdd054b6a8a Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sat, 27 Jun 2020 11:19:21 -0700 Subject: [PATCH 18/66] Object -> object --- app/components/AnalyzeComponent.tsx | 12 ++++++------ app/components/CleanComponent/index.tsx | 12 ++++++------ app/components/CollectComponent/ConnectModal.tsx | 6 +++--- app/components/CollectComponent/PreTestComponent.tsx | 8 ++++---- app/components/CollectComponent/RunComponent.tsx | 2 +- app/components/CollectComponent/index.tsx | 8 ++++---- .../DesignComponent/CustomDesignComponent.tsx | 8 ++++---- app/components/DesignComponent/index.tsx | 6 +++--- app/components/EEGExplorationComponent.tsx | 6 +++--- app/components/HomeComponent/index.tsx | 10 +++++----- app/components/InputCollect.tsx | 2 +- app/components/InputModal.tsx | 2 +- app/components/TopNavComponent/index.tsx | 2 +- app/epics/jupyterEpics.ts | 2 +- app/reducers/experimentReducer.ts | 2 +- app/utils/eeg/emotiv.ts | 2 +- app/utils/eeg/pipes.ts | 4 ++-- app/utils/jupyter/functions.ts | 4 ++-- configs/webpack.config.renderer.dev.dll.babel.js | 2 +- 19 files changed, 50 insertions(+), 50 deletions(-) diff --git a/app/components/AnalyzeComponent.tsx b/app/components/AnalyzeComponent.tsx index 05b42cf9..a38868b8 100644 --- a/app/components/AnalyzeComponent.tsx +++ b/app/components/AnalyzeComponent.tsx @@ -79,7 +79,7 @@ interface Props { } | null | undefined; - jupyterActions: Object; + jupyterActions: object; } interface State { @@ -212,7 +212,7 @@ export default class Analyze extends Component { this.setState({ activeStep: step }); } - handleDatasetChange(event: Object, data: Object) { + handleDatasetChange(event: object, data: object) { this.setState({ selectedFilePaths: data.value, selectedSubjects: getSubjectNamesFromFiles(data.value) @@ -220,7 +220,7 @@ export default class Analyze extends Component { this.props.jupyterActions.loadCleanedEpochs(data.value); } - handleBehaviorDatasetChange(event: Object, data: Object) { + handleBehaviorDatasetChange(event: object, data: object) { const { dataToPlot, layout } = aggregateDataForPlot( readBehaviorData(data.value), this.state.selectedDependentVariable, @@ -249,7 +249,7 @@ export default class Analyze extends Component { } } - handleDependentVariableChange(event: Object, data: Object) { + handleDependentVariableChange(event: object, data: object) { const { dataToPlot, layout } = aggregateDataForPlot( readBehaviorData(this.state.selectedBehaviorFilePaths), data.value, @@ -264,7 +264,7 @@ export default class Analyze extends Component { }); } - handleRemoveOutliers(event: Object, data: Object) { + handleRemoveOutliers(event: object, data: object) { const { dataToPlot, layout } = aggregateDataForPlot( readBehaviorData(this.state.selectedBehaviorFilePaths), this.state.selectedDependentVariable, @@ -280,7 +280,7 @@ export default class Analyze extends Component { }); } - handleDataPoints(event: Object, data: Object) { + handleDataPoints(event: object, data: object) { const { dataToPlot, layout } = aggregateDataForPlot( readBehaviorData(this.state.selectedBehaviorFilePaths), this.state.selectedDependentVariable, diff --git a/app/components/CleanComponent/index.tsx b/app/components/CleanComponent/index.tsx index 8518b4f7..6e17fa14 100644 --- a/app/components/CleanComponent/index.tsx +++ b/app/components/CleanComponent/index.tsx @@ -32,8 +32,8 @@ interface Props { }> | null | undefined; - jupyterActions: Object; - experimentActions: Object; + jupyterActions: object; + experimentActions: object; subject: string; session: number; } @@ -56,9 +56,9 @@ interface State { export default class Clean extends Component { props: Props; state: State; - handleRecordingChange: (arg0: Object, arg1: Object) => void; + handleRecordingChange: (arg0: object, arg1: object) => void; handleLoadData: () => void; - handleSubjectChange: (arg0: Object, arg1: Object) => void; + handleSubjectChange: (arg0: object, arg1: object) => void; icons: string[]; constructor(props: Props) { @@ -110,11 +110,11 @@ export default class Clean extends Component { }); } - handleRecordingChange(event: Object, data: Object) { + handleRecordingChange(event: object, data: object) { this.setState({ selectedFilePaths: data.value }); } - handleSubjectChange(event: Object, data: Object) { + handleSubjectChange(event: object, data: object) { this.setState({ selectedSubject: data.value, selectedFilePaths: [] }); } diff --git a/app/components/CollectComponent/ConnectModal.tsx b/app/components/CollectComponent/ConnectModal.tsx index 00a574a1..61360efe 100644 --- a/app/components/CollectComponent/ConnectModal.tsx +++ b/app/components/CollectComponent/ConnectModal.tsx @@ -10,15 +10,15 @@ import { import styles from '../styles/collect.css'; interface Props { - history: Object; + history: object; open: boolean; onClose: () => void; - connectedDevice: Object; + connectedDevice: object; signalQualityObservable: any | null | undefined; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; - deviceActions: Object; + deviceActions: object; availableDevices: Array; } diff --git a/app/components/CollectComponent/PreTestComponent.tsx b/app/components/CollectComponent/PreTestComponent.tsx index b276f65c..b0f1cd5f 100644 --- a/app/components/CollectComponent/PreTestComponent.tsx +++ b/app/components/CollectComponent/PreTestComponent.tsx @@ -21,14 +21,14 @@ import { import { loadProtocol } from '../../utils/labjs/functions'; interface Props { - experimentActions: Object; - connectedDevice: Object; + experimentActions: object; + connectedDevice: object; signalQualityObservable: any | null | undefined; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; - deviceActions: Object; - experimentActions: Object; + deviceActions: object; + experimentActions: object; availableDevices: Array; type: EXPERIMENTS; paradigm: EXPERIMENTS; diff --git a/app/components/CollectComponent/RunComponent.tsx b/app/components/CollectComponent/RunComponent.tsx index aef88046..f4d62488 100644 --- a/app/components/CollectComponent/RunComponent.tsx +++ b/app/components/CollectComponent/RunComponent.tsx @@ -33,7 +33,7 @@ interface Props { session: number; deviceType: DEVICES; isEEGEnabled: boolean; - experimentActions: Object; + experimentActions: object; } interface State { diff --git a/app/components/CollectComponent/index.tsx b/app/components/CollectComponent/index.tsx index 8aedf872..313665a2 100644 --- a/app/components/CollectComponent/index.tsx +++ b/app/components/CollectComponent/index.tsx @@ -16,14 +16,14 @@ import ConnectModal from './ConnectModal'; import RunComponent from './RunComponent'; interface Props { - history: Object; - experimentActions: Object; - connectedDevice: Object; + history: object; + experimentActions: object; + connectedDevice: object; signalQualityObservable: any | null | undefined; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; - deviceActions: Object; + deviceActions: object; availableDevices: Array; type: EXPERIMENTS | null | undefined; isRunning: boolean; diff --git a/app/components/DesignComponent/CustomDesignComponent.tsx b/app/components/DesignComponent/CustomDesignComponent.tsx index b20692b9..347350a1 100644 --- a/app/components/DesignComponent/CustomDesignComponent.tsx +++ b/app/components/DesignComponent/CustomDesignComponent.tsx @@ -48,7 +48,7 @@ const FIELDS = { }; interface Props { - history: Object; + history: object; type: EXPERIMENTS | null | undefined; title: string; params: ExperimentParameters; @@ -57,7 +57,7 @@ interface Props { [key: string]: Trial; }; timelines: {}; - experimentActions: Object; + experimentActions: object; isEEGEnabled: boolean; description: ExperimentDescription; } @@ -106,13 +106,13 @@ export default class CustomDesign extends Component { this.setState({ activeStep: step }); } - handleProgressBar(event: Object, data: Object) { + handleProgressBar(event: object, data: object) { this.setState({ params: { ...this.state.params, showProgessBar: data.checked } }); } - handleEEGEnabled(event: Object, data: Object) { + handleEEGEnabled(event: object, data: object) { this.props.experimentActions.setEEGEnabled(data.checked); } diff --git a/app/components/DesignComponent/index.tsx b/app/components/DesignComponent/index.tsx index 83024afc..17928e20 100644 --- a/app/components/DesignComponent/index.tsx +++ b/app/components/DesignComponent/index.tsx @@ -52,7 +52,7 @@ const DESIGN_STEPS = { }; interface Props { - history: Object; + history: object; type: EXPERIMENTS; paradigm: EXPERIMENTS; title: string; @@ -62,7 +62,7 @@ interface Props { [key: string]: Trial; }; timelines: {}; - experimentActions: Object; + experimentActions: object; description: ExperimentDescription; isEEGEnabled: boolean; } @@ -149,7 +149,7 @@ export default class Design extends Component { this.setState({ isPreviewing: false }); } - handleEEGEnabled(event: Object, data: Object) { + handleEEGEnabled(event: object, data: object) { this.props.experimentActions.setEEGEnabled(data.checked); this.props.experimentActions.saveWorkspace(); } diff --git a/app/components/EEGExplorationComponent.tsx b/app/components/EEGExplorationComponent.tsx index 9bb6c2d2..0e1bbce3 100644 --- a/app/components/EEGExplorationComponent.tsx +++ b/app/components/EEGExplorationComponent.tsx @@ -19,13 +19,13 @@ import ConnectModal from './CollectComponent/ConnectModal'; import styles from './styles/common.css'; interface Props { - history: Object; - connectedDevice: Object; + history: object; + connectedDevice: object; signalQualityObservable: any | null | undefined; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; - deviceActions: Object; + deviceActions: object; availableDevices: Array; } diff --git a/app/components/HomeComponent/index.tsx b/app/components/HomeComponent/index.tsx index 93a0b5e8..a62462cc 100644 --- a/app/components/HomeComponent/index.tsx +++ b/app/components/HomeComponent/index.tsx @@ -45,16 +45,16 @@ const HOME_STEPS = { interface Props { kernelStatus: KERNEL_STATUS; - history: Object; - jupyterActions: Object; - connectedDevice: Object; + history: object; + jupyterActions: object; + connectedDevice: object; signalQualityObservable: any | null | undefined; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; - deviceActions: Object; + deviceActions: object; availableDevices: Array; - experimentActions: Object; + experimentActions: object; } interface State { diff --git a/app/components/InputCollect.tsx b/app/components/InputCollect.tsx index 08b740d7..848a6f7f 100644 --- a/app/components/InputCollect.tsx +++ b/app/components/InputCollect.tsx @@ -69,7 +69,7 @@ export default class InputCollect extends Component { this.props.onExit(); } - handleEnterSubmit(event: Object) { + handleEnterSubmit(event: object) { if (event.key === 'Enter') { this.handleClose(); } diff --git a/app/components/InputModal.tsx b/app/components/InputModal.tsx index b6d4c040..44c88c09 100644 --- a/app/components/InputModal.tsx +++ b/app/components/InputModal.tsx @@ -50,7 +50,7 @@ export default class InputModal extends Component { this.props.onExit(); } - handleEnterSubmit(event: Object) { + handleEnterSubmit(event: object) { if (event.key === 'Enter') { this.handleClose(); } diff --git a/app/components/TopNavComponent/index.tsx b/app/components/TopNavComponent/index.tsx index 12403615..b2b5ef14 100644 --- a/app/components/TopNavComponent/index.tsx +++ b/app/components/TopNavComponent/index.tsx @@ -15,7 +15,7 @@ interface Props { title: string | null | undefined; location: { pathname: string; search: string; hash: string }; isRunning: boolean; - experimentActions: Object; + experimentActions: object; type: EXPERIMENTS; } diff --git a/app/epics/jupyterEpics.ts b/app/epics/jupyterEpics.ts index 441b5997..0970368c 100644 --- a/app/epics/jupyterEpics.ts +++ b/app/epics/jupyterEpics.ts @@ -330,7 +330,7 @@ const getEpochsInfoEpic = (action$, state$) => ), map(epochInfoString => parseSingleQuoteJSON(epochInfoString).map(infoObj => ({ - name: Object.keys(infoObj)[0], + name: object.keys(infoObj)[0], value: infoObj[Object.keys(infoObj)[0]] })) ), diff --git a/app/reducers/experimentReducer.ts b/app/reducers/experimentReducer.ts index 891a35a2..5181e7aa 100644 --- a/app/reducers/experimentReducer.ts +++ b/app/reducers/experimentReducer.ts @@ -33,7 +33,7 @@ export interface ExperimentStateType { [key: string]: Trial; }; readonly timelines: {}; - readonly plugins: Object; + readonly plugins: object; readonly subject: string; readonly group: string; readonly session: number; diff --git a/app/utils/eeg/emotiv.ts b/app/utils/eeg/emotiv.ts index 77a276cf..b91e93b8 100644 --- a/app/utils/eeg/emotiv.ts +++ b/app/utils/eeg/emotiv.ts @@ -161,7 +161,7 @@ const createEEGSample = eegEvent => { const integrateSignalQuality = (newEpoch, devSample) => ({ ...newEpoch, - signalQuality: Object.assign( + signalQuality: object.assign( ...devSample.dev[2].map((signalQuality, index) => ({ [EMOTIV_CHANNELS[index]]: signalQuality })) diff --git a/app/utils/eeg/pipes.ts b/app/utils/eeg/pipes.ts index 256019e0..3aa77ef4 100644 --- a/app/utils/eeg/pipes.ts +++ b/app/utils/eeg/pipes.ts @@ -9,7 +9,7 @@ export const parseMuseSignalQuality = () => pipe( map(epoch => ({ ...epoch, - signalQuality: Object.assign( + signalQuality: object.assign( {}, ...Object.entries(epoch.signalQuality).map( ([channelName, signalQuality]) => { @@ -33,7 +33,7 @@ export const parseEmotivSignalQuality = () => pipe( map(epoch => ({ ...epoch, - signalQuality: Object.assign( + signalQuality: object.assign( {}, ...Object.entries(epoch.signalQuality).map( ([channelName, signalQuality]) => { diff --git a/app/utils/jupyter/functions.ts b/app/utils/jupyter/functions.ts index 7801272c..d6931f0c 100644 --- a/app/utils/jupyter/functions.ts +++ b/app/utils/jupyter/functions.ts @@ -3,7 +3,7 @@ import { KERNEL_STATUS } from '../../constants/constants'; export const parseSingleQuoteJSON = (string: string) => JSON.parse(string.replace(/'/g, '"')); -export const parseKernelStatus = (msg: Object) => { +export const parseKernelStatus = (msg: object) => { switch (msg['content']['execution_state']) { case 'busy': return KERNEL_STATUS.BUSY; @@ -15,7 +15,7 @@ export const parseKernelStatus = (msg: Object) => { } }; -export const debugParseMessage = (msg: Object) => { +export const debugParseMessage = (msg: object) => { let content = ''; switch (msg.channel) { case 'iopub': diff --git a/configs/webpack.config.renderer.dev.dll.babel.js b/configs/webpack.config.renderer.dev.dll.babel.js index 99fc2f30..b69f5694 100644 --- a/configs/webpack.config.renderer.dev.dll.babel.js +++ b/configs/webpack.config.renderer.dev.dll.babel.js @@ -30,7 +30,7 @@ export default merge.smart(baseConfig, { module: require('./webpack.config.renderer.dev.babel').default.module, entry: { - renderer: Object.keys(dependencies || {}) + renderer: object.keys(dependencies || {}) }, output: { From 2ee02d046118cf73ac3443c9d434d8c7c4cea528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98peter-robert-cole=E2=80=99?= Date: Sat, 27 Jun 2020 12:09:29 -0700 Subject: [PATCH 19/66] updated constants to enum --- app/constants/constants.ts | 146 ++++++++++++++++++------------------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/app/constants/constants.ts b/app/constants/constants.ts index 574416f9..2f9f881c 100644 --- a/app/constants/constants.ts +++ b/app/constants/constants.ts @@ -1,13 +1,13 @@ -export const EXPERIMENTS = { - NONE: 'NONE', - P300: 'Visual Oddball', - N170: 'Faces and Houses', - SSVEP: 'Steady-state Visual Evoked Potential', - STROOP: 'Stroop Task', - MULTI: 'Multi-tasking', - SEARCH: 'Visual search', - CUSTOM: 'Custom' -}; +export enum EXPERIMENTS { + NONE = 'NONE', + P300 = 'Visual Oddball', + N170 = 'Faces and Houses', + SSVEP = 'Steady-state Visual Evoked Potential', + STROOP = 'Stroop Task', + MULTI = 'Multi-tasking', + SEARCH = 'Visual search', + CUSTOM = 'Custom' +} export const SCREENS = { HOME: { route: '/', title: 'HOME', order: 0 }, @@ -18,55 +18,55 @@ export const SCREENS = { CLEAN: { route: '/clean', title: 'CLEAN', order: 3 }, ANALYZE: { route: '/analyze', title: 'ANALYZE', order: 4 }, ANALYZEBEHAVIOR: { route: '/analyze', title: 'ANALYZE', order: 3 } -}; - -export const DEVICES = { - NONE: 'NONE', - MUSE: 'MUSE', - EMOTIV: 'EMOTIV', - GANGLION: 'GANGLION' // One day ;) -}; - -export const CONNECTION_STATUS = { - CONNECTED: 'CONNECTED', - CONNECTING: 'CONNECTING', - DISCONNECTED: 'DISCONNECTED', - NO_DEVICES: 'NO_DEVICES', - NOT_YET_CONNECTED: 'NOT_YET_CONNECTED', - SEARCHING: 'SEARCHING', - BLUETOOTH_DISABLED: 'BLUETOOTH_DISABLED' -}; - -export const KERNEL_STATUS = { - OFFLINE: 'Offline', - BUSY: 'Busy', - IDLE: 'Idle', - STARTING: 'Starting' -}; - -export const DEVICE_AVAILABILITY = { - NONE: 'NONE', - SEARCHING: 'SEARCHING', - AVAILABLE: 'AVAILABLE' -}; +} as const; + +export enum DEVICES { + NONE = 'NONE', + MUSE = 'MUSE', + EMOTIV = 'EMOTIV', + GANGLION = 'GANGLION' // One day ;) +} + +export enum CONNECTION_STATUS { + CONNECTED = 'CONNECTED', + CONNECTING = 'CONNECTING', + DISCONNECTED = 'DISCONNECTED', + NO_DEVICES = 'NO_DEVICES', + NOT_YET_CONNECTED = 'NOT_YET_CONNECTED', + SEARCHING = 'SEARCHING', + BLUETOOTH_DISABLED = 'BLUETOOTH_DISABLED' +} + +export enum KERNEL_STATUS { + OFFLINE = 'Offline', + BUSY = 'Busy', + IDLE = 'Idle', + STARTING = 'Starting' +} + +export enum DEVICE_AVAILABILITY { + NONE = 'NONE', + SEARCHING = 'SEARCHING', + AVAILABLE = 'AVAILABLE' +} // Names of variables in the jupyter kernel -export const JUPYTER_VARIABLE_NAMES = { - RAW_EPOCHS: 'raw_epochs', - CLEAN_EPOCHS: 'clean_epochs' -}; +export enum JUPYTER_VARIABLE_NAMES { + RAW_EPOCHS = 'raw_epochs', + CLEAN_EPOCHS = 'clean_epochs' +} export const SEARCH_TIMER = 3000; // NOTE: the actual marker id values of stimulus 1 and 2 are reversed -export const EVENTS = { - STIMULUS_1: 1, - STIMULUS_2: 2, - STIMULUS_3: 3, - STIMULUS_4: 4, - TARGET: 2, - NONTARGET: 1 -}; +export enum EVENTS { + STIMULUS_1 = 1, + STIMULUS_2 = 2, + STIMULUS_3 = 3, + STIMULUS_4 = 4, + TARGET = 2, + NONTARGET = 1 +} export const CHANNELS = { // Epoc channels @@ -90,7 +90,7 @@ export const CHANNELS = { AF8: { index: 2, color: '#8BD6E9' }, TP10: { index: 3, color: '#66B0A9' }, AUX: { index: 4, color: '#E7789E' } -}; +} as const; export const EMOTIV_CHANNELS = [ 'AF3', @@ -120,22 +120,22 @@ export const VIEWER_DEFAULTS = { domain: 5000, // ms zoom: 1, autoScale: false -}; - -export const SIGNAL_QUALITY = { - BAD: '#ed5a5a', - OK: '#FFCD39', - GREAT: '#66B0A9', - DISCONNECTED: '#BFBFBF' -}; - -export const SIGNAL_QUALITY_THRESHOLDS = { - BAD: 15, - OK: 10, - GREAT: 1.5 // Below 1.5 usually indicates not connected to anything -}; - -export const FILE_TYPES = { - STIMULUS_DIR: 'STIMULUS_DIR', - TIMELINE: 'TIMELINE' -}; +} as const; + +export enum SIGNAL_QUALITY { + BAD = '#ed5a5a', + OK = '#FFCD39', + GREAT = '#66B0A9', + DISCONNECTED = '#BFBFBF' +} + +export enum SIGNAL_QUALITY_THRESHOLDS { + BAD = 15, + OK = 10, + GREAT = 1.5 // Below 1.5 usually indicates not connected to anything +} + +export enum FILE_TYPES { + STIMULUS_DIR = 'STIMULUS_DIR', + TIMELINE = 'TIMELINE' +} From 09c14e3cbb22db97a4a04411a2c80f2280b62898 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sat, 27 Jun 2020 14:57:06 -0700 Subject: [PATCH 20/66] Refactored Device Reducer to use toolkit --- app/actions/deviceActions.ts | 58 +++++++------ app/actions/index.tsx | 1 + app/constants/interfaces.ts | 5 ++ app/containers/CollectContainer.ts | 7 +- app/epics/deviceEpics.ts | 134 ++++++++++------------------- app/reducers/deviceReducer.ts | 64 ++++++-------- 6 files changed, 112 insertions(+), 157 deletions(-) create mode 100644 app/actions/index.tsx diff --git a/app/actions/deviceActions.ts b/app/actions/deviceActions.ts index 86719165..7c7cc3d2 100644 --- a/app/actions/deviceActions.ts +++ b/app/actions/deviceActions.ts @@ -1,30 +1,36 @@ -import { EXPERIMENT_CLEANUP } from '../epics/experimentEpics'; -// ------------------------------------------------------------------------- -// Action Types - -export const INIT_EMOTIV = 'INIT_EMOTIV'; -export const INIT_MUSE = 'INIT_MUSE'; -export const CONNECT_TO_DEVICE = 'CONNECT_TO_DEVICE'; -export const SET_DEVICE_TYPE = 'SET_DEVICE_TYPE'; -export const SET_CONNECTION_STATUS = 'SET_CONNECTION_STATUS'; -export const SET_DEVICE_AVAILABILITY = 'SET_DEVICE_AVAILABILITY'; +import { createAction } from '@reduxjs/toolkit'; +import { DEVICE_AVAILABILITY } from '../constants/constants'; +import { DeviceInfo } from '../constants/interfaces'; // ------------------------------------------------------------------------- // Actions -export const connectToDevice = payload => ({ - payload, - type: CONNECT_TO_DEVICE -}); -export const disconnectFromDevice = payload => ({ - payload, - type: EXPERIMENT_CLEANUP -}); -export const setConnectionStatus = payload => ({ - payload, - type: SET_CONNECTION_STATUS -}); -export const setDeviceAvailability = payload => ({ - payload, - type: SET_DEVICE_AVAILABILITY -}); +export const DeviceActions = { + // TODO: write type for devices + ConnectToDevice: createAction('CONNECT_TO_DEVICE'), + DisconnectFromDevice: createAction( + 'EXPERIMENT_CLEANUP' + ), + SetConnectionStatus: createAction( + 'SET_CONNECTION_STATUS' + ), + SetDeviceAvailability: createAction< + DEVICE_AVAILABILITY, + 'SET_DEVICE_AVAILABILITY' + >('SET_DEVICE_AVAILABILITY'), + + // Actions From Epics + SetDeviceInfo: createAction('SET_DEVICE_INFO'), + SetAvailableDevices: createAction( + 'SET_AVAILABLE_DEVICES' + ), + DeviceFound: createAction('DEVICE_FOUND'), + SetDeviceType: createAction('SET_DEVICE_TYPE'), + SetRawObservable: createAction( + 'SET_RAW_OBSERVABLE' + ), + SetSignalQualityObservable: createAction( + 'SET_SIGNAL_OBSERVABLE' + ), + Cleanup: createAction('CLEANUP') +} as const; diff --git a/app/actions/index.tsx b/app/actions/index.tsx new file mode 100644 index 00000000..9bdaed5b --- /dev/null +++ b/app/actions/index.tsx @@ -0,0 +1 @@ +export * from './deviceActions'; diff --git a/app/constants/interfaces.ts b/app/constants/interfaces.ts index 5b6d2d60..3ccc5dc1 100644 --- a/app/constants/interfaces.ts +++ b/app/constants/interfaces.ts @@ -82,6 +82,11 @@ export interface Kernel { // -------------------------------------------------------------------- // Device +// TODO: type this based on what comes out of muse and emotiv +export interface Device { + [key: string]: any; +} + export interface EEGData { data: Array; timestamp: number; diff --git a/app/containers/CollectContainer.ts b/app/containers/CollectContainer.ts index 53f2e81e..1a2f7fc7 100644 --- a/app/containers/CollectContainer.ts +++ b/app/containers/CollectContainer.ts @@ -1,8 +1,7 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import Collect from '../components/CollectComponent'; -import * as deviceActions from '../actions/deviceActions'; -import * as experimentActions from '../actions/experimentActions'; +import { DeviceActions, ExperimentActions } from '../actions'; function mapStateToProps(state) { return { @@ -13,8 +12,8 @@ function mapStateToProps(state) { function mapDispatchToProps(dispatch) { return { - deviceActions: bindActionCreators(deviceActions, dispatch), - experimentActions: bindActionCreators(experimentActions, dispatch) + deviceActions: bindActionCreators(DeviceActions, dispatch), + experimentActions: bindActionCreators(ExperimentActions, dispatch) }; } diff --git a/app/epics/deviceEpics.ts b/app/epics/deviceEpics.ts index b3c48bef..af6bc96d 100644 --- a/app/epics/deviceEpics.ts +++ b/app/epics/deviceEpics.ts @@ -1,14 +1,9 @@ import { combineEpics } from 'redux-observable'; -import { of, from, timer } from 'rxjs'; +import { of, from, timer, ObservableInput } from 'rxjs'; import { map, pluck, mergeMap, tap, filter, catchError } from 'rxjs/operators'; import { isNil } from 'lodash'; import { toast } from 'react-toastify'; -import { - CONNECT_TO_DEVICE, - SET_DEVICE_AVAILABILITY, - setDeviceAvailability, - setConnectionStatus -} from '../actions/deviceActions'; +import { DeviceActions } from '../actions'; import { getEmotiv, connectToEmotiv, @@ -29,62 +24,18 @@ import { DEVICE_AVAILABILITY, SEARCH_TIMER } from '../constants/constants'; -import { EXPERIMENT_CLEANUP } from './experimentEpics'; - -export const DEVICE_FOUND = 'DEVICE_FOUND'; -export const SET_DEVICE_TYPE = 'DEVICE_TYPE'; -export const SET_CONNECTION_STATUS = 'SET_CONNECTION_STATUS'; -export const SET_DEVICE_INFO = 'SET_DEVICE_INFO'; -export const SET_AVAILABLE_DEVICES = 'SET_AVAILABLE_DEVICES'; -export const SET_RAW_OBSERVABLE = 'SET_RAW_OBSERVABLE'; -export const SET_SIGNAL_OBSERVABLE = 'SET_SIGNAL_OBSERVABLE'; -export const DEVICE_CLEANUP = 'DEVICE_CLEANUP'; - -// ------------------------------------------------------------------------- -// Action Creators - -const deviceFound = payload => ({ - payload, - type: DEVICE_FOUND -}); - -const setDeviceType = payload => ({ - payload, - type: SET_DEVICE_TYPE -}); - -const setRawObservable = payload => ({ - payload, - type: SET_RAW_OBSERVABLE -}); - -const setSignalQualityObservable = payload => ({ - payload, - type: SET_SIGNAL_OBSERVABLE -}); - -const setAvailableDevices = payload => ({ - payload, - type: SET_AVAILABLE_DEVICES -}); - -const setDeviceInfo = payload => ({ - payload, - type: SET_DEVICE_INFO -}); - -const cleanup = () => ({ type: DEVICE_CLEANUP }); +import { Device, DeviceInfo } from '../constants/interfaces'; // ------------------------------------------------------------------------- // Epics // NOTE: Uses a Promise "then" inside b/c Observable.from leads to loss of user gesture propagation for web bluetooth const searchMuseEpic = action$ => - action$.ofType(SET_DEVICE_AVAILABILITY).pipe( + action$.ofType(DeviceActions.SetDeviceAvailability.type).pipe( pluck('payload'), filter(status => status === DEVICE_AVAILABILITY.SEARCHING), map(getMuse), - mergeMap(promise => + mergeMap, ObservableInput>(promise => promise.then( devices => devices, error => { @@ -94,25 +45,25 @@ const searchMuseEpic = action$ => } ) ), - filter(devices => devices), // filter out nulls if running on win7 - filter(devices => devices.length >= 1), - map(deviceFound) + filter(devices => isNil(devices)), // filter out nulls if running on win7 + filter(devices => devices.length >= 1), + map(DeviceActions.DeviceFound) ); const searchEmotivEpic = action$ => - action$.ofType(SET_DEVICE_AVAILABILITY).pipe( + action$.ofType(DeviceActions.SetDeviceAvailability.type).pipe( pluck('payload'), filter(status => status === DEVICE_AVAILABILITY.SEARCHING), filter(() => process.platform === 'darwin' || process.platform === 'win32'), map(getEmotiv), - mergeMap(promise => + mergeMap, ObservableInput>(promise => promise.then( devices => devices, error => { if (error.message.includes('client.queryHeadsets')) { toast.error( 'Could not connect to Cortex Service. Please connect to the internet and install Cortex to use Emotiv EEG', - { autoclose: 7000 } + { autoClose: 7000 } ); } else { toast.error(`"Device Error: " ${error.toString()}`); @@ -122,14 +73,14 @@ const searchEmotivEpic = action$ => } ) ), - filter(devices => devices.length >= 1), - map(deviceFound) + filter(devices => devices.length >= 1), + map(DeviceActions.DeviceFound) ); const deviceFoundEpic = (action$, state$) => - action$.ofType(DEVICE_FOUND).pipe( + action$.ofType(DeviceActions.DeviceFound.type).pipe( pluck('payload'), - map(foundDevices => + map(foundDevices => foundDevices.reduce((acc, curr) => { if (acc.find(device => device.id === curr.id)) { return acc; @@ -137,16 +88,16 @@ const deviceFoundEpic = (action$, state$) => return acc.concat(curr); }, state$.value.device.availableDevices) ), - mergeMap(devices => + mergeMap>(devices => of( - setAvailableDevices(devices), - setDeviceAvailability(DEVICE_AVAILABILITY.AVAILABLE) + DeviceActions.SetAvailableDevices(devices), + DeviceActions.SetDeviceAvailability(DEVICE_AVAILABILITY.AVAILABLE) ) ) ); const searchTimerEpic = (action$, state$) => - action$.ofType(SET_DEVICE_AVAILABILITY).pipe( + action$.ofType(DeviceActions.SetDeviceAvailability.type).pipe( pluck('payload'), filter(status => status === DEVICE_AVAILABILITY.SEARCHING), mergeMap(() => timer(SEARCH_TIMER)), @@ -154,66 +105,69 @@ const searchTimerEpic = (action$, state$) => () => state$.value.device.deviceAvailability === DEVICE_AVAILABILITY.SEARCHING ), - map(() => setDeviceAvailability(DEVICE_AVAILABILITY.NONE)) + map(() => DeviceActions.SetDeviceAvailability(DEVICE_AVAILABILITY.NONE)) ); const connectEpic = action$ => - action$.ofType(CONNECT_TO_DEVICE).pipe( + action$.ofType(DeviceActions.ConnectToDevice.type).pipe( pluck('payload'), - map(device => + map>(device => isNil(device.name) ? connectToEmotiv(device) : connectToMuse(device) ), - mergeMap(promise => promise.then(deviceInfo => deviceInfo)), - mergeMap(deviceInfo => { + mergeMap, ObservableInput>(promise => + promise.then(deviceInfo => deviceInfo) + ), + mergeMap>(deviceInfo => { if (!isNil(deviceInfo) && !isNil(deviceInfo.samplingRate)) { return of( - setDeviceType( + DeviceActions.SetDeviceType( deviceInfo.name.includes('Muse') ? DEVICES.MUSE : DEVICES.EMOTIV ), - setDeviceInfo(deviceInfo), - setConnectionStatus(CONNECTION_STATUS.CONNECTED) + DeviceActions.SetDeviceInfo(deviceInfo), + DeviceActions.SetConnectionStatus(CONNECTION_STATUS.CONNECTED) ); } - return of(setConnectionStatus(CONNECTION_STATUS.DISCONNECTED)); + return of( + DeviceActions.SetConnectionStatus(CONNECTION_STATUS.DISCONNECTED) + ); }) ); const isConnectingEpic = action$ => action$ - .ofType(CONNECT_TO_DEVICE) - .pipe(map(() => setConnectionStatus(CONNECTION_STATUS.CONNECTING))); + .ofType(DeviceActions.ConnectToDevice.type) + .pipe( + map(() => DeviceActions.SetConnectionStatus(CONNECTION_STATUS.CONNECTING)) + ); const setRawObservableEpic = (action$, state$) => - action$.ofType(SET_DEVICE_INFO).pipe( + action$.ofType(DeviceActions.SetDeviceInfo.type).pipe( mergeMap(() => { if (state$.value.device.deviceType === DEVICES.EMOTIV) { return from(createRawEmotivObservable()); } return from(createRawMuseObservable()); }), - map(setRawObservable) + map(DeviceActions.SetRawObservable) ); const setSignalQualityObservableEpic = (action$, state$) => - action$.ofType(SET_RAW_OBSERVABLE).pipe( + action$.ofType(DeviceActions.SetRawObservable.type).pipe( pluck('payload'), map(rawObservable => { if (state$.value.device.deviceType === DEVICES.EMOTIV) { - return createEmotivSignalQualityObservable( - rawObservable, - state$.value.device.connectedDevice - ); + return createEmotivSignalQualityObservable(rawObservable); } return createMuseSignalQualityObservable( rawObservable, state$.value.device.connectedDevice ); }), - map(setSignalQualityObservable) + map(DeviceActions.SetSignalQualityObservable) ); const deviceCleanupEpic = (action$, state$) => - action$.ofType(EXPERIMENT_CLEANUP).pipe( + action$.ofType(ExperimentActions.ExperimentCleanup.type).pipe( filter( () => state$.value.device.connectionStatus !== @@ -225,7 +179,7 @@ const deviceCleanupEpic = (action$, state$) => } disconnectFromMuse(); }), - map(cleanup) + map(DeviceActions.Cleanup) ); // TODO: Fix this error handling so epics can refire once they error out @@ -244,7 +198,7 @@ const rootEpic = (action$, state$) => catchError(error => of(error).pipe( tap(err => toast.error(`"Device Error: " ${err.toString()}`)), - map(cleanup) + map(DeviceActions.Cleanup) ) ) ); diff --git a/app/reducers/deviceReducer.ts b/app/reducers/deviceReducer.ts index e3b490b0..f11e05e4 100644 --- a/app/reducers/deviceReducer.ts +++ b/app/reducers/deviceReducer.ts @@ -1,33 +1,26 @@ import { Observable } from 'rxjs'; -import { - SET_DEVICE_INFO, - SET_DEVICE_TYPE, - SET_AVAILABLE_DEVICES, - SET_CONNECTION_STATUS, - SET_RAW_OBSERVABLE, - SET_SIGNAL_OBSERVABLE, - DEVICE_CLEANUP -} from '../epics/deviceEpics'; +import { createReducer } from '@reduxjs/toolkit'; import { DEVICES, CONNECTION_STATUS, DEVICE_AVAILABILITY } from '../constants/constants'; -import { ActionType, DeviceInfo } from '../constants/interfaces'; -import { SET_DEVICE_AVAILABILITY } from '../actions/deviceActions'; +import { ActionType, DeviceInfo, Device } from '../constants/interfaces'; +import { DeviceActions } from '../actions'; interface DeviceStateType { - readonly availableDevices: Array; + readonly availableDevices: Array; readonly connectedDevice: DeviceInfo | null | undefined; readonly connectionStatus: CONNECTION_STATUS; readonly deviceAvailability: DEVICE_AVAILABILITY; - readonly rawObservable: Observable | null | undefined; - readonly signalQualityObservable: Observable | null | undefined; + // TODO: type EEG data + readonly rawObservable: Observable | null | undefined; + readonly signalQualityObservable: Observable | null | undefined; readonly deviceType: DEVICES; } const initialState = { - availableDevices: [], + availableDevices: [''], connectedDevice: { name: 'disconnected', samplingRate: 0 }, connectionStatus: CONNECTION_STATUS.NOT_YET_CONNECTED, deviceAvailability: DEVICE_AVAILABILITY.NONE, @@ -36,57 +29,54 @@ const initialState = { deviceType: DEVICES.EMOTIV }; -export default function device( - state: DeviceStateType = initialState, - action: ActionType -) { - switch (action.type) { - case SET_DEVICE_TYPE: +export default createReducer(initialState, builder => + builder + .addCase(DeviceActions.ConnectToDevice, (state, action) => { return { ...state, deviceType: action.payload }; - - case SET_DEVICE_INFO: + }) + .addCase(DeviceActions.SetDeviceInfo, (state, action) => { return { ...state, connectedDevice: action.payload }; + }) - case SET_AVAILABLE_DEVICES: + .addCase(DeviceActions.SetAvailableDevices, (state, action) => { return { ...state, availableDevices: action.payload }; - - case SET_CONNECTION_STATUS: + }) + .addCase(DeviceActions.SetConnectionStatus, (state, action) => { return { ...state, connectionStatus: action.payload }; - - case SET_DEVICE_AVAILABILITY: + }) + .addCase(DeviceActions.SetDeviceAvailability, (state, action) => { return { ...state, deviceAvailability: action.payload }; + }) - case SET_RAW_OBSERVABLE: + .addCase(DeviceActions.SetRawObservable, (state, action) => { return { ...state, rawObservable: action.payload }; + }) - case SET_SIGNAL_OBSERVABLE: + .addCase(DeviceActions.SetSignalQualityObservable, (state, action) => { return { ...state, signalQualityObservable: action.payload }; - - case DEVICE_CLEANUP: + }) + .addCase(DeviceActions.Cleanup, (state, action) => { return initialState; - - default: - return state; - } -} + }) +); From 593ec0bcefb108887b79b6f3507725edc7fe0383 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sat, 11 Jul 2020 17:08:13 -0400 Subject: [PATCH 21/66] Updated experiment actions and reducer --- app/actions/experimentActions.ts | 62 +++++++++--------------- app/reducers/deviceReducer.ts | 6 +-- app/reducers/experimentReducer.ts | 78 ++++++++++++++----------------- 3 files changed, 60 insertions(+), 86 deletions(-) diff --git a/app/actions/experimentActions.ts b/app/actions/experimentActions.ts index 1bff6996..9bbb5345 100644 --- a/app/actions/experimentActions.ts +++ b/app/actions/experimentActions.ts @@ -1,43 +1,27 @@ -// ------------------------------------------------------------------------- -// Action Types - -export const START = 'START'; -export const PAUSE = 'PAUSE'; -export const STOP = 'STOP'; -export const SET_TYPE = 'SET_TYPE'; -export const SET_PARADIGM = 'SET_PARADIGM'; -export const SET_SUBJECT = 'SET_SUBJECT'; -export const SET_GROUP = 'SET_GROUP'; -export const CREATE_NEW_WORKSPACE = 'CREATE_NEW_WORKSPACE'; -export const SET_SESSION = 'SET_SESSION'; -export const SET_PARAMS = 'SET_PARAMS'; -export const SET_DESCRIPTION = 'SET_DESCRIPTION'; -export const LOAD_DEFAULT_TIMELINE = 'LOAD_DEFAULT_TIMELINE'; -export const SET_TITLE = 'SET_TITLE'; -export const SAVE_WORKSPACE = 'SAVE_WORKSPACE'; -export const SET_EXPERIMENT_STATE = 'SET_EXPERIMENT_STATE'; -export const SET_EEG_ENABLED = 'SET_EEG_ENABLED'; +import { createAction } from '@reduxjs/toolkit'; // ------------------------------------------------------------------------- // Actions -export const start = () => ({ type: START }); -export const pause = () => ({ type: PAUSE }); -// export const stop = () => ({ type: STOP }); -export const stop = payload => ({ payload, type: STOP }); -export const setType = payload => ({ payload, type: SET_TYPE }); -export const setParadigm = payload => ({ payload, type: SET_PARADIGM }); -export const setSubject = payload => ({ payload, type: SET_SUBJECT }); -export const setGroup = payload => ({ payload, type: SET_GROUP }); -export const setSession = payload => ({ payload, type: SET_SESSION }); -export const setParams = payload => ({ payload, type: SET_PARAMS }); -export const setDescription = payload => ({ payload, type: SET_DESCRIPTION }); -export const createNewWorkspace = payload => ({ - payload, - type: CREATE_NEW_WORKSPACE -}); -export const loadDefaultTimeline = () => ({ type: LOAD_DEFAULT_TIMELINE }); -export const setTitle = payload => ({ payload, type: SET_TITLE }); -export const saveWorkspace = () => ({ type: SAVE_WORKSPACE }); -export const setState = payload => ({ payload, type: SET_EXPERIMENT_STATE }); -export const setEEGEnabled = payload => ({ payload, type: SET_EEG_ENABLED }); +export const ExperimentActions = { + Start: createAction('Start'), + Pause: createAction('Pause'), + Stop: createAction('STOP'), + SetType: createAction('SET_TYPE'), + SetParadigm: createAction('SET_PARADIGM'), + SetSubject: createAction('SET_SUBJECT'), + SetGroup: createAction('SET_GROUP'), + SetSession: createAction('SET_SESSION'), + SetParams: createAction('SET_PARAMS'), + SetDescription: createAction('SET_DESCRIPTION'), + CreateNewWorkspace: createAction( + 'CREATE_NEW_WORKSPACE' + ), + LoadDefaultTimeline: createAction( + 'LOAD_DEFAULT_TIMELINE' + ), + SetTitle: createAction('SET_TITLE'), + SaveWorkspace: createAction('SAVE_WORKSPACE'), + SetState: createAction('SET_EXPERIMENT_STATE'), + SetEEGEnabled: createAction('SET_EEG_ENABLED') +}; diff --git a/app/reducers/deviceReducer.ts b/app/reducers/deviceReducer.ts index f11e05e4..79bc2f05 100644 --- a/app/reducers/deviceReducer.ts +++ b/app/reducers/deviceReducer.ts @@ -5,7 +5,7 @@ import { CONNECTION_STATUS, DEVICE_AVAILABILITY } from '../constants/constants'; -import { ActionType, DeviceInfo, Device } from '../constants/interfaces'; +import { DeviceInfo, Device } from '../constants/interfaces'; import { DeviceActions } from '../actions'; interface DeviceStateType { @@ -19,8 +19,8 @@ interface DeviceStateType { readonly deviceType: DEVICES; } -const initialState = { - availableDevices: [''], +const initialState: DeviceStateType = { + availableDevices: [{}], connectedDevice: { name: 'disconnected', samplingRate: 0 }, connectionStatus: CONNECTION_STATUS.NOT_YET_CONNECTED, deviceAvailability: DEVICE_AVAILABILITY.NONE, diff --git a/app/reducers/experimentReducer.ts b/app/reducers/experimentReducer.ts index 5181e7aa..4c96b47d 100644 --- a/app/reducers/experimentReducer.ts +++ b/app/reducers/experimentReducer.ts @@ -1,25 +1,9 @@ -import { - SET_TIMELINE, - SET_IS_RUNNING, - SET_SESSION, - EXPERIMENT_CLEANUP -} from '../epics/experimentEpics'; -import { - SET_TYPE, - SET_PARADIGM, - SET_SUBJECT, - SET_GROUP, - SET_TITLE, - SET_EXPERIMENT_STATE, - SET_PARAMS, - SET_DESCRIPTION, - SET_EEG_ENABLED -} from '../actions/experimentActions'; +import { createReducer } from '@reduxjs/toolkit'; +import { ExperimentActions } from '../actions/experimentActions'; import { EXPERIMENTS } from '../constants/constants'; import { MainTimeline, Trial, - ActionType, ExperimentDescription, ExperimentParameters } from '../constants/interfaces'; @@ -42,7 +26,7 @@ export interface ExperimentStateType { readonly description: ExperimentDescription; } -const initialState = { +const initialState: ExperimentStateType = { type: EXPERIMENTS.NONE, title: '', params: null, @@ -58,86 +42,92 @@ const initialState = { description: { question: '', hypothesis: '', methods: '' } }; -export default function experiment( - state: ExperimentStateType = initialState, - action: ActionType -) { - switch (action.type) { - case SET_TYPE: +export default createReducer(initialState, builder => + builder + .addCase(ExperimentActions.SetType, (state, action) => { return { ...state, type: action.payload }; + }) - case SET_PARADIGM: + .addCase(ExperimentActions.SetParadigm, (state, action) => { return { ...state, paradigm: action.payload }; + }) - case SET_SUBJECT: + .addCase(ExperimentActions.SetSubject, (state, action) => { return { ...state, subject: action.payload }; + }) - case SET_GROUP: + .addCase(ExperimentActions.SetGroup, (state, action) => { return { ...state, group: action.payload }; + }) - case SET_SESSION: + .addCase(ExperimentActions.SetSession, (state, action) => { return { ...state, session: action.payload }; + }) - case SET_PARAMS: + .addCase(ExperimentActions.SetParams, (state, action) => { return { ...state, params: { ...state.params, ...action.payload } }; + }) - case SET_TIMELINE: + .addCase(ExperimentActions.SetTimeline, (state, action) => { return { ...state, ...action.payload }; + }) - case SET_TITLE: + .addCase(ExperimentActions.SetTitle, (state, action) => { return { ...state, title: action.payload }; + }) - case SET_DESCRIPTION: + .addCase(ExperimentActions.SetDescription, (state, action) => { return { ...state, description: action.payload }; + }) - case SET_IS_RUNNING: + .addCase(ExperimentActions.SetIsRunning, (state, action) => { return { ...state, isRunning: action.payload }; + }) - case SET_EEG_ENABLED: + .addCase(ExperimentActions.SetEEGEnabled, (state, action) => { return { ...state, isEEGEnabled: action.payload }; + }) - case SET_EXPERIMENT_STATE: + .addCase(ExperimentActions.SetExperimentState, (state, action) => { return { ...action.payload }; - - case EXPERIMENT_CLEANUP: - return initialState; - - default: - return state; - } -} + }) + .addCase( + ExperimentActions.ExperimentCleanup, + (state, action) => initialState + ) +); From ecd36ef939f558511200de0e78c61df2539ab6a3 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 19 Jul 2020 14:29:27 -0400 Subject: [PATCH 22/66] turned off default export rule --- .eslintrc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.js b/.eslintrc.js index 92ac0af1..f86d9bc9 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -3,6 +3,7 @@ module.exports = { rules: { // A temporary hack related to IDE not resolving correct package.json 'import/no-extraneous-dependencies': 'off', + 'import/prefer-default-export': 'off', 'react/destructuring-assignment': 'warn', 'react/no-access-state-in-setstate': 'warn' }, From 96adea663e1c4686c8f2d1a96b16c95ebd627de9 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 19 Jul 2020 16:13:56 -0400 Subject: [PATCH 23/66] Added typesafe actions --- package.json | 2 ++ yarn.lock | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/package.json b/package.json index b0338b1f..774b30f2 100644 --- a/package.json +++ b/package.json @@ -277,6 +277,7 @@ "@hot-loader/react-dom": "^16.13.0", "@nteract/messaging": "^7.0.7", "@nteract/transforms": "^4.4.7", + "@reduxjs/toolkit": "1.4.0", "ajv": "^6.12.2", "connected-react-router": "^6.8.0", "core-js": "^3.6.5", @@ -320,6 +321,7 @@ "simplify-js": "^1.2.4", "source-map-support": "^0.5.19", "spawnteract": "^5.0.1", + "typesafe-actions": "^5.1.0", "ws": "^7.3.0" }, "devEngines": { diff --git a/yarn.lock b/yarn.lock index 582b2ab0..1b73d4f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1563,6 +1563,16 @@ d3-collection "1" d3-shape "^1.2.0" +"@reduxjs/toolkit@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.4.0.tgz#ee2e2384cc3d1d76780d844b9c2da3580d32710d" + integrity sha512-hkxQwVx4BNVRsYdxjNF6cAseRmtrkpSlcgJRr3kLUcHPIAMZAmMJkXmHh/eUEGTMqPzsYpJLM7NN2w9fxQDuGw== + dependencies: + immer "^7.0.3" + redux "^4.0.0" + redux-thunk "^2.3.0" + reselect "^4.0.0" + "@semantic-ui-react/event-stack@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@semantic-ui-react/event-stack/-/event-stack-3.1.1.tgz#3263d17511db81a743167fe45281a24b3eb6b3c8" @@ -9809,6 +9819,11 @@ image-palette@^2.1.0: pxls "^2.0.0" quantize "^1.0.2" +immer@^7.0.3: + version "7.0.5" + resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.5.tgz#8af347db5b60b40af8ae7baf1784ea4d35b5208e" + integrity sha512-TtRAKZyuqld2eYjvWgXISLJ0ZlOl1OOTzRmrmiY8SlB0dnAhZ1OiykIDL5KDFNaPHDXiLfGQFNJGtet8z8AEmg== + immutable@^4.0.0-rc.12: version "4.0.0-rc.12" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217" @@ -15455,6 +15470,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +reselect@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" + integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== + resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" @@ -18050,6 +18070,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typesafe-actions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/typesafe-actions/-/typesafe-actions-5.1.0.tgz#9afe8b1e6a323af1fd59e6a57b11b7dd6623d2f1" + integrity sha512-bna6Yi1pRznoo6Bz1cE6btB/Yy8Xywytyfrzu/wc+NFW3ZF0I+2iCGImhBsoYYCOWuICtRO4yHcnDlzgo1AdNg== + typescript@^3.3.3, typescript@^3.7.5: version "3.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" From d3384720812107244f9f155f5b6d5933d5643848 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 19 Jul 2020 16:14:26 -0400 Subject: [PATCH 24/66] Finished experiment epics and refactored to use typesafe actions --- app/actions/deviceActions.ts | 5 + app/actions/experimentActions.ts | 24 +++-- app/actions/index.tsx | 2 + app/epics/deviceEpics.ts | 106 +++++++++++++------ app/epics/experimentEpics.ts | 169 +++++++++++++++++-------------- app/reducers/deviceReducer.ts | 2 +- app/reducers/index.ts | 13 ++- app/reducers/jupyterReducer.ts | 4 +- 8 files changed, 202 insertions(+), 123 deletions(-) diff --git a/app/actions/deviceActions.ts b/app/actions/deviceActions.ts index 7c7cc3d2..97fe77b6 100644 --- a/app/actions/deviceActions.ts +++ b/app/actions/deviceActions.ts @@ -1,4 +1,5 @@ import { createAction } from '@reduxjs/toolkit'; +import { ActionType } from 'typesafe-actions'; import { DEVICE_AVAILABILITY } from '../constants/constants'; import { DeviceInfo } from '../constants/interfaces'; @@ -34,3 +35,7 @@ export const DeviceActions = { ), Cleanup: createAction('CLEANUP') } as const; + +export type DeviceActionType = ActionType< + typeof DeviceActions[keyof typeof DeviceActions] +>; diff --git a/app/actions/experimentActions.ts b/app/actions/experimentActions.ts index 9bbb5345..e1b22d17 100644 --- a/app/actions/experimentActions.ts +++ b/app/actions/experimentActions.ts @@ -1,12 +1,13 @@ import { createAction } from '@reduxjs/toolkit'; +import { ActionType } from 'typesafe-actions'; // ------------------------------------------------------------------------- // Actions export const ExperimentActions = { - Start: createAction('Start'), - Pause: createAction('Pause'), - Stop: createAction('STOP'), + Start: createAction('START'), + Pause: createAction('PAUSE'), + Stop: createAction<{ data: string }, 'STOP'>('STOP'), SetType: createAction('SET_TYPE'), SetParadigm: createAction('SET_PARADIGM'), SetSubject: createAction('SET_SUBJECT'), @@ -17,11 +18,20 @@ export const ExperimentActions = { CreateNewWorkspace: createAction( 'CREATE_NEW_WORKSPACE' ), - LoadDefaultTimeline: createAction( - 'LOAD_DEFAULT_TIMELINE' + LoadDefaultTimeline: createAction('LOAD_DEFAULT_TIMELINE'), + SetIsRunning: createAction('SET_IS_RUNNING'), + SetExperimentState: createAction( + 'SET_EXPERIMENT_STATE' ), + ExperimentCleanup: createAction('EXPERIMENT_CLEANUP'), + SetTimeline: createAction('SET_TIMELINE'), SetTitle: createAction('SET_TITLE'), SaveWorkspace: createAction('SAVE_WORKSPACE'), SetState: createAction('SET_EXPERIMENT_STATE'), - SetEEGEnabled: createAction('SET_EEG_ENABLED') -}; + SetEEGEnabled: createAction('SET_EEG_ENABLED'), + UpdateSession: createAction('UPDATE_SESSION') +} as const; + +export type ExperimentActionType = ActionType< + typeof ExperimentActions[keyof typeof ExperimentActions] +>; diff --git a/app/actions/index.tsx b/app/actions/index.tsx index 9bdaed5b..1c8728d1 100644 --- a/app/actions/index.tsx +++ b/app/actions/index.tsx @@ -1 +1,3 @@ +export * from './experimentActions'; +export * from './jupyterActions'; export * from './deviceActions'; diff --git a/app/epics/deviceEpics.ts b/app/epics/deviceEpics.ts index af6bc96d..928db2dd 100644 --- a/app/epics/deviceEpics.ts +++ b/app/epics/deviceEpics.ts @@ -1,9 +1,10 @@ -import { combineEpics } from 'redux-observable'; +import { combineEpics, Epic } from 'redux-observable'; import { of, from, timer, ObservableInput } from 'rxjs'; import { map, pluck, mergeMap, tap, filter, catchError } from 'rxjs/operators'; import { isNil } from 'lodash'; import { toast } from 'react-toastify'; -import { DeviceActions } from '../actions'; +import { isActionOf } from 'typesafe-actions'; +import { DeviceActions, DeviceActionType, ExperimentActions } from '../actions'; import { getEmotiv, connectToEmotiv, @@ -25,17 +26,24 @@ import { SEARCH_TIMER } from '../constants/constants'; import { Device, DeviceInfo } from '../constants/interfaces'; +import { DeviceStateType } from '../reducers/deviceReducer'; +import { RootState } from '../reducers'; // ------------------------------------------------------------------------- // Epics // NOTE: Uses a Promise "then" inside b/c Observable.from leads to loss of user gesture propagation for web bluetooth -const searchMuseEpic = action$ => - action$.ofType(DeviceActions.SetDeviceAvailability.type).pipe( +const searchMuseEpic: Epic< + DeviceActionType, + DeviceActionType, + RootState +> = action$ => + action$.pipe( + filter(isActionOf(DeviceActions.SetDeviceAvailability)), pluck('payload'), filter(status => status === DEVICE_AVAILABILITY.SEARCHING), map(getMuse), - mergeMap, ObservableInput>(promise => + mergeMap(promise => promise.then( devices => devices, error => { @@ -45,18 +53,22 @@ const searchMuseEpic = action$ => } ) ), - filter(devices => isNil(devices)), // filter out nulls if running on win7 - filter(devices => devices.length >= 1), + filter(devices => !isNil(devices) && devices.length >= 1), map(DeviceActions.DeviceFound) ); -const searchEmotivEpic = action$ => - action$.ofType(DeviceActions.SetDeviceAvailability.type).pipe( +const searchEmotivEpic: Epic< + DeviceActionType, + DeviceActionType, + RootState +> = action$ => + action$.pipe( + filter(isActionOf(DeviceActions.SetDeviceAvailability)), pluck('payload'), filter(status => status === DEVICE_AVAILABILITY.SEARCHING), filter(() => process.platform === 'darwin' || process.platform === 'win32'), map(getEmotiv), - mergeMap, ObservableInput>(promise => + mergeMap(promise => promise.then( devices => devices, error => { @@ -73,14 +85,18 @@ const searchEmotivEpic = action$ => } ) ), - filter(devices => devices.length >= 1), + filter(devices => devices.length >= 1), map(DeviceActions.DeviceFound) ); -const deviceFoundEpic = (action$, state$) => - action$.ofType(DeviceActions.DeviceFound.type).pipe( +const deviceFoundEpic: Epic = ( + action$, + state$ +) => + action$.pipe( + filter(isActionOf(DeviceActions.DeviceFound)), pluck('payload'), - map(foundDevices => + map(foundDevices => foundDevices.reduce((acc, curr) => { if (acc.find(device => device.id === curr.id)) { return acc; @@ -88,7 +104,7 @@ const deviceFoundEpic = (action$, state$) => return acc.concat(curr); }, state$.value.device.availableDevices) ), - mergeMap>(devices => + mergeMap(devices => of( DeviceActions.SetAvailableDevices(devices), DeviceActions.SetDeviceAvailability(DEVICE_AVAILABILITY.AVAILABLE) @@ -96,8 +112,12 @@ const deviceFoundEpic = (action$, state$) => ) ); -const searchTimerEpic = (action$, state$) => - action$.ofType(DeviceActions.SetDeviceAvailability.type).pipe( +const searchTimerEpic: Epic = ( + action$, + state$ +) => + action$.pipe( + filter(isActionOf(DeviceActions.SetDeviceAvailability)), pluck('payload'), filter(status => status === DEVICE_AVAILABILITY.SEARCHING), mergeMap(() => timer(SEARCH_TIMER)), @@ -108,8 +128,13 @@ const searchTimerEpic = (action$, state$) => map(() => DeviceActions.SetDeviceAvailability(DEVICE_AVAILABILITY.NONE)) ); -const connectEpic = action$ => - action$.ofType(DeviceActions.ConnectToDevice.type).pipe( +const connectEpic: Epic< + DeviceActionType, + DeviceActionType, + RootState +> = action$ => + action$.pipe( + filter(isActionOf(DeviceActions.ConnectToDevice)), pluck('payload'), map>(device => isNil(device.name) ? connectToEmotiv(device) : connectToMuse(device) @@ -133,15 +158,23 @@ const connectEpic = action$ => }) ); -const isConnectingEpic = action$ => - action$ - .ofType(DeviceActions.ConnectToDevice.type) - .pipe( - map(() => DeviceActions.SetConnectionStatus(CONNECTION_STATUS.CONNECTING)) - ); +const isConnectingEpic: Epic< + DeviceActionType, + DeviceActionType, + RootState +> = action$ => + action$.pipe( + filter(isActionOf(DeviceActions.ConnectToDevice)), + map(() => DeviceActions.SetConnectionStatus(CONNECTION_STATUS.CONNECTING)) + ); -const setRawObservableEpic = (action$, state$) => - action$.ofType(DeviceActions.SetDeviceInfo.type).pipe( +const setRawObservableEpic: Epic< + DeviceActionType, + DeviceActionType, + RootState +> = (action$, state$) => + action$.pipe( + filter(isActionOf(DeviceActions.SetDeviceInfo)), mergeMap(() => { if (state$.value.device.deviceType === DEVICES.EMOTIV) { return from(createRawEmotivObservable()); @@ -151,8 +184,13 @@ const setRawObservableEpic = (action$, state$) => map(DeviceActions.SetRawObservable) ); -const setSignalQualityObservableEpic = (action$, state$) => - action$.ofType(DeviceActions.SetRawObservable.type).pipe( +const setSignalQualityObservableEpic: Epic< + DeviceActionType, + DeviceActionType, + RootState +> = (action$, state$) => + action$.pipe( + filter(isActionOf(DeviceActions.SetRawObservable)), pluck('payload'), map(rawObservable => { if (state$.value.device.deviceType === DEVICES.EMOTIV) { @@ -166,8 +204,12 @@ const setSignalQualityObservableEpic = (action$, state$) => map(DeviceActions.SetSignalQualityObservable) ); -const deviceCleanupEpic = (action$, state$) => - action$.ofType(ExperimentActions.ExperimentCleanup.type).pipe( +const deviceCleanupEpic: Epic = ( + action$, + state$ +) => + action$.pipe( + filter(isActionOf(ExperimentActions.ExperimentCleanup)), filter( () => state$.value.device.connectionStatus !== @@ -194,7 +236,7 @@ const rootEpic = (action$, state$) => setRawObservableEpic, setSignalQualityObservableEpic, deviceCleanupEpic - )(action$, state$).pipe( + )(action$, state$, null).pipe( catchError(error => of(error).pipe( tap(err => toast.error(`"Device Error: " ${err.toString()}`)), diff --git a/app/epics/experimentEpics.ts b/app/epics/experimentEpics.ts index f6fbda63..22456a21 100644 --- a/app/epics/experimentEpics.ts +++ b/app/epics/experimentEpics.ts @@ -1,5 +1,6 @@ -import { combineEpics } from 'redux-observable'; -import { from, of } from 'rxjs'; +import { isActionOf } from 'typesafe-actions'; +import { combineEpics, Epic } from 'redux-observable'; +import { from, of, ObservableInput } from 'rxjs'; import { map, mapTo, @@ -12,18 +13,8 @@ import { tap } from 'rxjs/operators'; import { - setType, - setParadigm, - setTitle, - saveWorkspace, - loadDefaultTimeline, - LOAD_DEFAULT_TIMELINE, - START, - STOP, - SAVE_WORKSPACE, - CREATE_NEW_WORKSPACE, - SET_SUBJECT, - SET_GROUP + ExperimentActions, + ExperimentActionType } from '../actions/experimentActions'; import { DEVICES, @@ -31,7 +22,7 @@ import { EMOTIV_CHANNELS, CONNECTION_STATUS } from '../constants/constants'; -import { loadProtocol, getBehaviouralData } from '../utils/labjs/functions'; +import { loadProtocol } from '../utils/labjs/functions'; import { createEEGWriteStream, writeHeader, @@ -45,65 +36,54 @@ import { storeBehaviouralData, readWorkspaceBehaviorData } from '../utils/filesystem/storage'; - import { createEmotivRecord, stopEmotivRecord } from '../utils/eeg/emotiv'; - -export const SET_TIMELINE = 'SET_TIMELINE'; -export const SET_IS_RUNNING = 'SET_IS_RUNNING'; -export const UPDATE_SESSION = 'UPDATE_SESSION'; -export const SET_SESSION = 'SET_SESSION'; -export const EXPERIMENT_CLEANUP = 'EXPERIMENT_CLEANUP'; - -// ------------------------------------------------------------------------- -// Action Creators - -const setTimeline = payload => ({ - payload, - type: SET_TIMELINE -}); - -const setIsRunning = payload => ({ - payload, - type: SET_IS_RUNNING -}); - -const updateSession = () => ({ type: UPDATE_SESSION }); - -const setSession = payload => ({ - payload, - type: SET_SESSION -}); - -const cleanup = () => ({ - type: EXPERIMENT_CLEANUP -}); +import { ExperimentStateType } from '../reducers/experimentReducer'; +import { RootState } from '../reducers'; // ------------------------------------------------------------------------- // Epics -const createNewWorkspaceEpic = action$ => - action$.ofType(CREATE_NEW_WORKSPACE).pipe( +const createNewWorkspaceEpic: Epic< + ExperimentActionType, + ExperimentActionType, + RootState +> = action$ => + action$.pipe( + filter(isActionOf(ExperimentActions.CreateNewWorkspace)), pluck('payload'), - tap(workspaceInfo => createWorkspaceDir(workspaceInfo.title)), - mergeMap(workspaceInfo => + tap<{ + title: string; + type: string; + paradigm: string; + }>(workspaceInfo => createWorkspaceDir(workspaceInfo.title)), + mergeMap< + { + title: string; + type: string; + paradigm: string; + }, + ObservableInput + >(workspaceInfo => of( - setType(workspaceInfo.type), - setParadigm(workspaceInfo.paradigm), - setTitle(workspaceInfo.title), - loadDefaultTimeline() + ExperimentActions.SetType(workspaceInfo.type), + ExperimentActions.SetParadigm(workspaceInfo.paradigm), + ExperimentActions.SetTitle(workspaceInfo.title), + ExperimentActions.LoadDefaultTimeline() ) ) ); const loadDefaultTimelineEpic = (action$, state$) => - action$.ofType(LOAD_DEFAULT_TIMELINE).pipe( + action$.pipe( + filter(isActionOf(ExperimentActions.LoadDefaultTimeline)), map(() => state$.value.experiment.paradigm), map(loadProtocol), - map(setTimeline) + map(ExperimentActions.SetTimeline) ); const startEpic = (action$, state$) => - action$.ofType(START).pipe( + action$.pipe( + filter(isActionOf(ExperimentActions.Start)), filter(() => !state$.value.experiment.isRunning), map(() => { if ( @@ -116,6 +96,9 @@ const startEpic = (action$, state$) => state$.value.experiment.session ); + if (!writeStream) { + return; + } writeHeader( writeStream, state$.value.device.deviceType === DEVICES.EMOTIV @@ -131,18 +114,33 @@ const startEpic = (action$, state$) => } state$.value.device.rawObservable - .pipe(takeUntil(action$.ofType(STOP, EXPERIMENT_CLEANUP))) + .pipe( + takeUntil( + action$.ofType( + ExperimentActions.Stop.type, + ExperimentActions.ExperimentCleanup.type + ) + ) + ) .subscribe(eegData => writeEEGData(writeStream, eegData)); } }), mapTo(true), - map(setIsRunning) + map(ExperimentActions.SetIsRunning) ); -const experimentStopEpic = (action$, state$) => - action$.ofType(STOP).pipe( +const experimentStopEpic: Epic< + ExperimentActionType, + ExperimentActionType, + RootState +> = (action$, state$) => + action$.pipe( + filter(isActionOf(ExperimentActions.Stop)), filter(() => state$.value.experiment.isRunning), map(({ payload }) => { + if (!state$.value.experiment.title) { + return; + } storeBehaviouralData( payload.data, state$.value.experiment.title, @@ -157,19 +155,24 @@ const experimentStopEpic = (action$, state$) => stopEmotivRecord(); } }), - mergeMap(() => of(setIsRunning(false))) + mergeMap(() => of(ExperimentActions.SetIsRunning(false))) ); // const setSubjectEpic = action$ => -// action$.ofType(SET_SUBJECT).pipe(map(updateSession)); +// action$.pipe(filter(isActionOf(SET_SUBJECT).pipe(map(updateSession)); // // const setGroupEpic = action$ => -// action$.ofType(SET_GROUP).pipe(map(updateSession)); - -const updateSessionEpic = (action$, state$) => - action$.ofType(UPDATE_SESSION).pipe( +// action$.pipe(filter(isActionOf(SET_GROUP).pipe(map(updateSession)); + +const updateSessionEpic: Epic< + ExperimentActionType, + ExperimentActionType, + RootState +> = (action$, state$) => + action$.pipe( + filter(isActionOf(ExperimentActions.UpdateSession)), mergeMap(() => - from(readWorkspaceBehaviorData(state$.value.experiment.title)) + from(readWorkspaceBehaviorData(state$.value.experiment.title!)) ), map(behaviorFiles => { if (behaviorFiles.length > 0) { @@ -180,31 +183,43 @@ const updateSessionEpic = (action$, state$) => } return 1; }), - map(setSession) + map(ExperimentActions.SetSession) ); -const autoSaveEpic = action$ => +const autoSaveEpic: Epic = action$ => action$.ofType('@@router/LOCATION_CHANGE').pipe( pluck('payload', 'pathname'), filter(pathname => pathname !== '/' && pathname !== '/home'), - map(saveWorkspace) + map(ExperimentActions.SaveWorkspace) ); -const saveWorkspaceEpic = (action$, state$) => - action$.ofType(SAVE_WORKSPACE).pipe( +const saveWorkspaceEpic: Epic< + ExperimentActionType, + ExperimentActionType, + RootState +> = (action$, state$) => + action$.pipe( + filter(isActionOf(ExperimentActions.SaveWorkspace)), throttleTime(1000), - filter(() => state$.value.experiment.title.length > 1), - map(() => getWorkspaceDir(state$.value.experiment.title)), + filter(() => + state$.value.experiment.title + ? state$.value.experiment.title.length > 1 + : false + ), + map(() => getWorkspaceDir(state$.value.experiment.title!)), tap(() => storeExperimentState(state$.value.experiment)), ignoreElements() ); -const navigationCleanupEpic = (action$, state$) => +const navigationCleanupEpic: Epic = ( + action$, + state$ +) => action$.ofType('@@router/LOCATION_CHANGE').pipe( pluck('payload', 'pathname'), filter(pathname => pathname === '/' || pathname === '/home'), tap(() => restoreExperimentState(state$.value.experiment)), - map(cleanup) + map(ExperimentActions.ExperimentCleanup) ); export default combineEpics( diff --git a/app/reducers/deviceReducer.ts b/app/reducers/deviceReducer.ts index 79bc2f05..2a7a5707 100644 --- a/app/reducers/deviceReducer.ts +++ b/app/reducers/deviceReducer.ts @@ -8,7 +8,7 @@ import { import { DeviceInfo, Device } from '../constants/interfaces'; import { DeviceActions } from '../actions'; -interface DeviceStateType { +export interface DeviceStateType { readonly availableDevices: Array; readonly connectedDevice: DeviceInfo | null | undefined; readonly connectionStatus: CONNECTION_STATUS; diff --git a/app/reducers/index.ts b/app/reducers/index.ts index 934c9f94..db22f379 100644 --- a/app/reducers/index.ts +++ b/app/reducers/index.ts @@ -1,8 +1,15 @@ import { combineReducers } from 'redux'; import { routerReducer as router } from 'react-router-redux'; -import jupyter from './jupyterReducer'; -import device from './deviceReducer'; -import experiment from './experimentReducer'; +import jupyter, { JupyterStateType } from './jupyterReducer'; +import device, { DeviceStateType } from './deviceReducer'; +import experiment, { ExperimentStateType } from './experimentReducer'; + +export interface RootState { + jupyter: JupyterStateType; + device: DeviceStateType; + experiment: ExperimentStateType; + router: unknown; +} const rootReducer = combineReducers({ jupyter, diff --git a/app/reducers/jupyterReducer.ts b/app/reducers/jupyterReducer.ts index cd08d995..693d0d0b 100644 --- a/app/reducers/jupyterReducer.ts +++ b/app/reducers/jupyterReducer.ts @@ -7,12 +7,10 @@ import { SET_CHANNEL_INFO, SET_PSD_PLOT, SET_TOPO_PLOT, - SET_ERP_PLOT, - RECEIVE_EXECUTE_RETURN + SET_ERP_PLOT } from '../epics/jupyterEpics'; import { ActionType, Kernel } from '../constants/interfaces'; import { KERNEL_STATUS } from '../constants/constants'; -import { EXPERIMENT_CLEANUP } from '../epics/experimentEpics'; export interface JupyterStateType { readonly kernel: Kernel | null | undefined; From 29a312f84b0f8ba3ce6944aa9a324b6e7e0a8442 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 19 Jul 2020 17:37:37 -0400 Subject: [PATCH 25/66] Updated jupyter redux tree --- .eslintrc.js | 4 +- app/actions/jupyterActions.ts | 94 ++++++----- app/constants/interfaces.ts | 12 ++ app/epics/experimentEpics.ts | 16 +- app/epics/jupyterEpics.ts | 293 ++++++++++++++------------------- app/reducers/jupyterReducer.ts | 84 ++++------ app/utils/jupyter/cells.ts | 2 +- 7 files changed, 222 insertions(+), 283 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index f86d9bc9..3bac1d8c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -5,7 +5,9 @@ module.exports = { 'import/no-extraneous-dependencies': 'off', 'import/prefer-default-export': 'off', 'react/destructuring-assignment': 'warn', - 'react/no-access-state-in-setstate': 'warn' + 'react/no-access-state-in-setstate': 'warn', + 'dot-notation': 'off', + '@typescript-eslint/ban-ts-ignore': 'warn' }, settings: { 'import/resolver': { diff --git a/app/actions/jupyterActions.ts b/app/actions/jupyterActions.ts index 3fe25266..a7ba941d 100644 --- a/app/actions/jupyterActions.ts +++ b/app/actions/jupyterActions.ts @@ -1,52 +1,50 @@ -// ------------------------------------------------------------------------- -// Action Types - -export const LAUNCH_KERNEL = 'LAUNCH_KERNEL'; -export const REQUEST_KERNEL_INFO = 'REQUEST_KERNEL_INFO'; -export const SEND_EXECUTE_REQUEST = 'SEND_EXECUTE_REQUEST'; -export const LOAD_EPOCHS = 'LOAD_EPOCHS'; -export const LOAD_CLEANED_EPOCHS = 'LOAD_CLEANED_EPOCHS'; -export const LOAD_PSD = 'LOAD_PSD'; -export const LOAD_ERP = 'LOAD_ERP'; -export const LOAD_TOPO = 'LOAD_TOPO'; -export const CLEAN_EPOCHS = 'CLEAN_EPOCHS'; -export const CLOSE_KERNEL = 'CLOSE_KERNEL'; +import { createAction } from '@reduxjs/toolkit'; +import { ActionType } from 'typesafe-actions'; +import { JUPYTER_VARIABLE_NAMES } from '../constants/constants'; // ------------------------------------------------------------------------- // Actions -export const launchKernel = () => ({ type: LAUNCH_KERNEL }); - -export const requestKernelInfo = () => ({ type: REQUEST_KERNEL_INFO }); - -export const sendExecuteRequest = (payload: string) => ({ - payload, - type: SEND_EXECUTE_REQUEST -}); - -export const loadEpochs = (payload: Array) => ({ - payload, - type: LOAD_EPOCHS -}); - -export const loadCleanedEpochs = (payload: Array) => ({ - payload, - type: LOAD_CLEANED_EPOCHS -}); - -export const loadPSD = () => ({ - type: LOAD_PSD -}); - -export const loadERP = (payload: string | null | undefined) => ({ - payload, - type: LOAD_ERP -}); - -export const loadTopo = () => ({ - type: LOAD_TOPO -}); - -export const cleanEpochs = () => ({ type: CLEAN_EPOCHS }); - -export const closeKernel = () => ({ type: CLOSE_KERNEL }); +export const JupyterActions = { + LaunchKernel: createAction('LAUNCH_KERNEL'), + RequestKernelInfo: createAction('REQUEST_KERNEL_INFO'), + SendExecuteRequest: createAction( + 'SEND_EXECUTE_REQUEST' + ), + LoadEpochs: createAction('LOAD_EPOCHS'), + LoadCleanedEpochs: createAction( + 'LOAD_CLEANED_EPOCHS' + ), + LoadPSD: createAction('LOAD_PSD'), + LoadERP: createAction('LOAD_ERP'), + LoadTopo: createAction('LOAD_TOPO'), + CleanEpochs: createAction('CLEAN_EPOCHS'), + CloseKernel: createAction('CLOSE_KERNEL'), + SetKernel: createAction('SET_KERNEL'), + GetEpochsInfo: createAction( + 'GET_EPOCHS_INFO' + ), + GetChannelInfo: createAction('GET_CHANNEL_INFO'), + SetKernelStatus: createAction('SET_KERNEL_STATUS'), + SetKernelInfo: createAction('SET_KERNEL_INFO'), + SetMainChannel: createAction('SET_MAIN_CHANNEL'), + SetEpochInfo: createAction('SET_EPOCH_INFO'), + SetChannelInfo: createAction('SET_CHANNEL_INFO'), + SetPSDPlot: createAction('SET_PSD_PLOT'), + SetTopoPlot: createAction('SET_TOPO_PLOT'), + SetERPPlot: createAction('SET_ERP_PLOT'), + ReceiveExecuteReply: createAction( + 'RECEIVE_EXECUTE_REPLY' + ), + ReceiveExecuteResult: createAction( + 'RECEIVE_EXECUTE_RESULT' + ), + ReceiveDisplayData: createAction( + 'RECEIVE_DISPLAY_DATA' + ), + ReceiveStream: createAction('RECEIVE_STREAM') +} as const; + +export type JupyterActionType = ActionType< + typeof JupyterActions[keyof typeof JupyterActions] +>; diff --git a/app/constants/interfaces.ts b/app/constants/interfaces.ts index 3ccc5dc1..ebce71b4 100644 --- a/app/constants/interfaces.ts +++ b/app/constants/interfaces.ts @@ -31,6 +31,18 @@ export type ExperimentParameters = { title: string; response: string; }; + stimulus3?: { + dir: string; + type: typeof EVENTS; + title: string; + response: string; + }; + stimulus4?: { + dir: string; + type: typeof EVENTS; + title: string; + response: string; + }; }; export type ExperimentDescription = { diff --git a/app/epics/experimentEpics.ts b/app/epics/experimentEpics.ts index 22456a21..e85bd13e 100644 --- a/app/epics/experimentEpics.ts +++ b/app/epics/experimentEpics.ts @@ -37,7 +37,6 @@ import { readWorkspaceBehaviorData } from '../utils/filesystem/storage'; import { createEmotivRecord, stopEmotivRecord } from '../utils/eeg/emotiv'; -import { ExperimentStateType } from '../reducers/experimentReducer'; import { RootState } from '../reducers'; // ------------------------------------------------------------------------- @@ -51,19 +50,8 @@ const createNewWorkspaceEpic: Epic< action$.pipe( filter(isActionOf(ExperimentActions.CreateNewWorkspace)), pluck('payload'), - tap<{ - title: string; - type: string; - paradigm: string; - }>(workspaceInfo => createWorkspaceDir(workspaceInfo.title)), - mergeMap< - { - title: string; - type: string; - paradigm: string; - }, - ObservableInput - >(workspaceInfo => + tap(workspaceInfo => createWorkspaceDir(workspaceInfo.title)), + mergeMap(workspaceInfo => of( ExperimentActions.SetType(workspaceInfo.type), ExperimentActions.SetParadigm(workspaceInfo.paradigm), diff --git a/app/epics/jupyterEpics.ts b/app/epics/jupyterEpics.ts index 0970368c..ed4c751f 100644 --- a/app/epics/jupyterEpics.ts +++ b/app/epics/jupyterEpics.ts @@ -1,5 +1,5 @@ -import { combineEpics } from 'redux-observable'; -import { from, of } from 'rxjs'; +import { combineEpics, Epic } from 'redux-observable'; +import { from, of, ObservableInput } from 'rxjs'; import { map, mergeMap, @@ -11,25 +11,15 @@ import { } from 'rxjs/operators'; import { find } from 'kernelspecs'; import { launchSpec } from 'spawnteract'; +import { isActionOf } from 'typesafe-actions'; import { createMainChannel } from 'enchannel-zmq-backend'; import { isNil } from 'lodash'; import { kernelInfoRequest, executeRequest } from '@nteract/messaging'; import { toast } from 'react-toastify'; +import { JupyterActions, JupyterActionType } from '../actions'; import { execute, awaitOkMessage } from '../utils/jupyter/pipes'; +import { RootState } from '../reducers'; import { getWorkspaceDir } from '../utils/filesystem/storage'; -import { - LAUNCH_KERNEL, - REQUEST_KERNEL_INFO, - LOAD_EPOCHS, - LOAD_CLEANED_EPOCHS, - LOAD_PSD, - LOAD_ERP, - LOAD_TOPO, - CLEAN_EPOCHS, - CLOSE_KERNEL, - loadTopo, - loadERP -} from '../actions/jupyterActions'; import { imports, utils, @@ -58,99 +48,16 @@ import { debugParseMessage } from '../utils/jupyter/functions'; -export const GET_EPOCHS_INFO = 'GET_EPOCHS_INFO'; -export const GET_CHANNEL_INFO = 'GET_CHANNEL_INFO'; -export const SET_KERNEL = 'SET_KERNEL'; -export const SET_KERNEL_STATUS = 'SET_KERNEL_STATUS'; -export const SET_KERNEL_INFO = 'SET_KERNEL_INFO'; -export const SET_MAIN_CHANNEL = 'SET_MAIN_CHANNEL'; -export const SET_EPOCH_INFO = 'SET_EPOCH_INFO'; -export const SET_CHANNEL_INFO = 'SET_CHANNEL_INFO'; -export const SET_PSD_PLOT = 'SET_PSD_PLOT'; -export const SET_ERP_PLOT = 'SET_ERP_PLOT'; -export const SET_TOPO_PLOT = 'SET_TOPO_PLOT'; -export const RECEIVE_EXECUTE_REPLY = 'RECEIVE_EXECUTE_REPLY'; -export const RECEIVE_EXECUTE_RESULT = 'RECEIVE_EXECUTE_RESULT'; -export const RECEIVE_STREAM = 'RECEIVE_STREAM'; -export const RECEIVE_DISPLAY_DATA = 'RECEIVE_DISPLAY_DATA'; - -// ------------------------------------------------------------------------- -// Action Creators - -const getEpochsInfo = payload => ({ payload, type: GET_EPOCHS_INFO }); - -const getChannelInfo = () => ({ type: GET_CHANNEL_INFO }); - -const setKernel = payload => ({ - payload, - type: SET_KERNEL -}); - -const setKernelStatus = payload => ({ - payload, - type: SET_KERNEL_STATUS -}); - -const setKernelInfo = payload => ({ - payload, - type: SET_KERNEL_INFO -}); - -const setMainChannel = payload => ({ - payload, - type: SET_MAIN_CHANNEL -}); - -const setEpochInfo = payload => ({ - payload, - type: SET_EPOCH_INFO -}); - -const setChannelInfo = payload => ({ - payload, - type: SET_CHANNEL_INFO -}); - -const setPSDPlot = payload => ({ - payload, - type: SET_PSD_PLOT -}); - -const setTopoPlot = payload => ({ - payload, - type: SET_TOPO_PLOT -}); - -const setERPPlot = payload => ({ - payload, - type: SET_ERP_PLOT -}); - -const receiveExecuteReply = payload => ({ - payload, - type: RECEIVE_EXECUTE_REPLY -}); - -const receiveExecuteResult = payload => ({ - payload, - type: RECEIVE_EXECUTE_RESULT -}); - -const receiveDisplayData = payload => ({ - payload, - type: RECEIVE_DISPLAY_DATA -}); - -const receiveStream = payload => ({ - payload, - type: RECEIVE_STREAM -}); - // ------------------------------------------------------------------------- // Epics -const launchEpic = action$ => - action$.ofType(LAUNCH_KERNEL).pipe( +const launchEpic: Epic< + JupyterActionType, + JupyterActionType, + RootState +> = action$ => + action$.pipe( + filter(isActionOf(JupyterActions.LaunchKernel)), mergeMap(() => from(find('brainwaves'))), tap(kernelInfo => { if (isNil(kernelInfo)) { @@ -160,7 +67,7 @@ const launchEpic = action$ => } }), filter(kernelInfo => !isNil(kernelInfo)), - mergeMap(kernelInfo => + mergeMap>(kernelInfo => from( launchSpec(kernelInfo.spec, { // No STDIN, opt in to STDOUT and STDERR as node streams @@ -184,38 +91,48 @@ const launchEpic = action$ => console.log('Kernel closed'); }); }), - map(setKernel) + map(JupyterActions.SetKernel) ); -const setUpChannelEpic = action$ => - action$.ofType(SET_KERNEL).pipe( +const setUpChannelEpic: Epic< + JupyterActionType, + JupyterActionType, + RootState +> = action$ => + action$.pipe( + filter(isActionOf(JupyterActions.SetKernel)), pluck('payload'), mergeMap(kernel => from(createMainChannel(kernel.config))), tap(mainChannel => mainChannel.next(executeRequest(imports()))), tap(mainChannel => mainChannel.next(executeRequest(utils()))), - map(setMainChannel) + map(JupyterActions.SetMainChannel) ); -const receiveChannelMessageEpic = (action$, state$) => - action$.ofType(SET_MAIN_CHANNEL).pipe( - mergeMap(() => +const receiveChannelMessageEpic: Epic< + JupyterActionType, + JupyterActionType, + RootState +> = (action$, state$) => + action$.pipe( + filter(isActionOf(JupyterActions.SetMainChannel)), + mergeMap<{}, ObservableInput>(() => state$.value.jupyter.mainChannel.pipe( - map(msg => { + map(msg => { console.log(debugParseMessage(msg)); switch (msg['header']['msg_type']) { case 'kernel_info_reply': - return setKernelInfo(msg); + return JupyterActions.SetKernelInfo(msg); case 'status': - return setKernelStatus(parseKernelStatus(msg)); + return JupyterActions.SetKernelStatus(parseKernelStatus(msg)); case 'stream': - return receiveStream(msg); + return JupyterActions.ReceiveStream(msg); case 'execute_reply': - return receiveExecuteReply(msg); + return JupyterActions.ReceiveExecuteReply(msg); case 'execute_result': - return receiveExecuteResult(msg); + return JupyterActions.ReceiveExecuteResult(msg); case 'display_data': - return receiveDisplayData(msg); default: + return JupyterActions.ReceiveDisplayData(msg); } }), filter(action => !isNil(action)) @@ -223,15 +140,25 @@ const receiveChannelMessageEpic = (action$, state$) => ) ); -const requestKernelInfoEpic = (action$, state$) => - action$.ofType(REQUEST_KERNEL_INFO).pipe( +const requestKernelInfoEpic: Epic< + JupyterActionType, + JupyterActionType, + RootState +> = (action$, state$) => + action$.pipe( + filter(isActionOf(JupyterActions.RequestKernelInfo)), filter(() => state$.value.jupyter.mainChannel), map(() => state$.value.jupyter.mainChannel.next(kernelInfoRequest())), ignoreElements() ); -const loadEpochsEpic = (action$, state$) => - action$.ofType(LOAD_EPOCHS).pipe( +const loadEpochsEpic: Epic = ( + action$, + state$ +) => + // @ts-ignore + action$.pipe( + filter(isActionOf(JupyterActions.LoadEpochs)), pluck('payload'), filter(filePathsArray => filePathsArray.length >= 1), map(filePathsArray => @@ -245,10 +172,10 @@ const loadEpochsEpic = (action$, state$) => map(() => epochEvents( { - [state$.value.experiment.params.stimulus1.title]: EVENTS.STIMULUS_1, - [state$.value.experiment.params.stimulus2.title]: EVENTS.STIMULUS_2, - [state$.value.experiment.params.stimulus3.title]: EVENTS.STIMULUS_3, - [state$.value.experiment.params.stimulus4.title]: EVENTS.STIMULUS_4 + [state$.value.experiment.params!.stimulus1!.title]: EVENTS.STIMULUS_1, + [state$.value.experiment.params!.stimulus2!.title]: EVENTS.STIMULUS_2, + [state$.value.experiment.params!.stimulus3!.title]: EVENTS.STIMULUS_3, + [state$.value.experiment.params!.stimulus4!.title]: EVENTS.STIMULUS_4 }, -0.1, 0.8 @@ -261,11 +188,16 @@ const loadEpochsEpic = (action$, state$) => state$.value.jupyter.mainChannel.next(executeRequest(epochEventsCommand)) ), awaitOkMessage(action$), - map(() => getEpochsInfo(JUPYTER_VARIABLE_NAMES.RAW_EPOCHS)) + map(() => JupyterActions.GetEpochsInfo(JUPYTER_VARIABLE_NAMES.RAW_EPOCHS)) ); -const loadCleanedEpochsEpic = (action$, state$) => - action$.ofType(LOAD_CLEANED_EPOCHS).pipe( +const loadCleanedEpochsEpic: Epic< + JupyterActionType, + JupyterActionType, + RootState +> = (action$, state$) => + action$.pipe( + filter(isActionOf(JupyterActions.LoadCleanedEpochs)), pluck('payload'), filter(filePathsArray => filePathsArray.length >= 1), map(filePathsArray => @@ -276,18 +208,22 @@ const loadCleanedEpochsEpic = (action$, state$) => awaitOkMessage(action$), mergeMap(() => of( - getEpochsInfo(JUPYTER_VARIABLE_NAMES.CLEAN_EPOCHS), - getChannelInfo(), - loadTopo() + JupyterActions.GetEpochsInfo(JUPYTER_VARIABLE_NAMES.CLEAN_EPOCHS), + JupyterActions.GetChannelInfo(), + JupyterActions.LoadTopo() ) ) ); -const cleanEpochsEpic = (action$, state$) => - action$.ofType(CLEAN_EPOCHS).pipe( +const cleanEpochsEpic: Epic = ( + action$, + state$ +) => + action$.pipe( + filter(isActionOf(JupyterActions.CleanEpochs)), execute(cleanEpochsPlot(), state$), mergeMap(() => - action$.ofType(RECEIVE_STREAM).pipe( + action$.ofType(JupyterActions.ReceiveStream.type).pipe( pluck('payload'), filter( msg => @@ -301,18 +237,23 @@ const cleanEpochsEpic = (action$, state$) => state$.value.jupyter.mainChannel.next( executeRequest( saveEpochs( - getWorkspaceDir(state$.value.experiment.title), + getWorkspaceDir(state$.value.experiment.title!), state$.value.experiment.subject ) ) ) ), awaitOkMessage(action$), - map(() => getEpochsInfo(JUPYTER_VARIABLE_NAMES.RAW_EPOCHS)) + map(() => JupyterActions.GetEpochsInfo(JUPYTER_VARIABLE_NAMES.RAW_EPOCHS)) ); -const getEpochsInfoEpic = (action$, state$) => - action$.ofType(GET_EPOCHS_INFO).pipe( +const getEpochsInfoEpic: Epic< + JupyterActionType, + JupyterActionType, + RootState +> = (action$, state$) => + action$.pipe( + filter(isActionOf(JupyterActions.GetEpochsInfo)), pluck('payload'), map(variableName => state$.value.jupyter.mainChannel.next( @@ -320,7 +261,7 @@ const getEpochsInfoEpic = (action$, state$) => ) ), mergeMap(() => - action$.ofType(RECEIVE_EXECUTE_RESULT).pipe( + action$.ofType(JupyterActions.ReceiveExecuteReply.type).pipe( pluck('payload'), filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), pluck('content', 'data', 'text/plain'), @@ -330,18 +271,23 @@ const getEpochsInfoEpic = (action$, state$) => ), map(epochInfoString => parseSingleQuoteJSON(epochInfoString).map(infoObj => ({ - name: object.keys(infoObj)[0], + name: Object.keys(infoObj)[0], value: infoObj[Object.keys(infoObj)[0]] })) ), - map(setEpochInfo) + map(JupyterActions.SetEpochInfo) ); -const getChannelInfoEpic = (action$, state$) => - action$.ofType(GET_CHANNEL_INFO).pipe( +const getChannelInfoEpic: Epic< + JupyterActionType, + JupyterActionType, + RootState +> = (action$, state$) => + action$.pipe( + filter(isActionOf(JupyterActions.GetChannelInfo)), execute(requestChannelInfo(), state$), mergeMap(() => - action$.ofType(RECEIVE_EXECUTE_RESULT).pipe( + action$.ofType(JupyterActions.ReceiveExecuteResult.type).pipe( pluck('payload'), filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), pluck('content', 'data', 'text/plain'), // Filter to prevent this from reading requestEpochsInfo returns @@ -350,36 +296,44 @@ const getChannelInfoEpic = (action$, state$) => ) ), map(channelInfoString => - setChannelInfo(parseSingleQuoteJSON(channelInfoString)) + JupyterActions.SetChannelInfo(parseSingleQuoteJSON(channelInfoString)) ) ); -const loadPSDEpic = (action$, state$) => - action$.ofType(LOAD_PSD).pipe( +const loadPSDEpic: Epic = ( + action$, + state$ +) => + action$.pipe( + filter(isActionOf(JupyterActions.LoadPSD)), execute(plotPSD(), state$), mergeMap(() => - action$.ofType(RECEIVE_DISPLAY_DATA).pipe( + action$.ofType(JupyterActions.ReceiveDisplayData.type).pipe( pluck('payload'), // PSD graphs should have two axes filter(msg => msg.content.data['text/plain'].includes('2 Axes')), pluck('content', 'data'), take(1) ) ), - map(setPSDPlot) + map(JupyterActions.SetPSDPlot) ); -const loadTopoEpic = (action$, state$) => - action$.ofType(LOAD_TOPO).pipe( +const loadTopoEpic: Epic = ( + action$, + state$ +) => + action$.pipe( + filter(isActionOf(JupyterActions.LoadTopo)), execute(plotTopoMap(), state$), mergeMap(() => action$ - .ofType(RECEIVE_DISPLAY_DATA) + .ofType(JupyterActions.ReceiveDisplayData.type) .pipe(pluck('payload'), pluck('content', 'data'), take(1)) ), mergeMap(topoPlot => of( - setTopoPlot(topoPlot), - loadERP( + JupyterActions.SetTopoPlot(topoPlot), + JupyterActions.LoadERP( state$.value.device.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS[0] : MUSE_CHANNELS[0] @@ -388,13 +342,18 @@ const loadTopoEpic = (action$, state$) => ) ); -const loadERPEpic = (action$, state$) => - action$.ofType(LOAD_ERP).pipe( +const loadERPEpic: Epic = ( + action$, + state$ +) => + action$.pipe( + filter(isActionOf(JupyterActions.LoadERP)), pluck('payload'), map(channelName => { if (MUSE_CHANNELS.includes(channelName)) { return MUSE_CHANNELS.indexOf(channelName); - } else if (EMOTIV_CHANNELS.includes(channelName)) { + } + if (EMOTIV_CHANNELS.includes(channelName)) { return EMOTIV_CHANNELS.indexOf(channelName); } console.warn( @@ -408,20 +367,24 @@ const loadERPEpic = (action$, state$) => ) ), mergeMap(() => - action$.ofType(RECEIVE_DISPLAY_DATA).pipe( + action$.ofType(JupyterActions.ReceiveDisplayData.type).pipe( pluck('payload'), // ERP graphs should have 1 axis according to MNE filter(msg => msg.content.data['text/plain'].includes('1 Axes')), pluck('content', 'data'), take(1) ) ), - map(setERPPlot) + map(JupyterActions.SetERPPlot) ); -const closeKernelEpic = (action$, state$) => - action$.ofType(CLOSE_KERNEL).pipe( +const closeKernelEpic: Epic = ( + action$, + state$ +) => + action$.pipe( + filter(isActionOf(JupyterActions.CloseKernel)), map(() => { - state$.value.jupyter.kernel.spawn.kill(); + state$.value.jupyter.kernel?.spawn.kill(); state$.value.jupyter.mainChannel.complete(); }), ignoreElements() diff --git a/app/reducers/jupyterReducer.ts b/app/reducers/jupyterReducer.ts index 693d0d0b..9618476b 100644 --- a/app/reducers/jupyterReducer.ts +++ b/app/reducers/jupyterReducer.ts @@ -1,28 +1,16 @@ -import { - SET_KERNEL, - SET_KERNEL_STATUS, - SET_MAIN_CHANNEL, - SET_KERNEL_INFO, - SET_EPOCH_INFO, - SET_CHANNEL_INFO, - SET_PSD_PLOT, - SET_TOPO_PLOT, - SET_ERP_PLOT -} from '../epics/jupyterEpics'; -import { ActionType, Kernel } from '../constants/interfaces'; +import { createReducer } from '@reduxjs/toolkit'; +import { Kernel } from '../constants/interfaces'; import { KERNEL_STATUS } from '../constants/constants'; +import { JupyterActions, ExperimentActions } from '../actions'; export interface JupyterStateType { readonly kernel: Kernel | null | undefined; readonly kernelStatus: KERNEL_STATUS; readonly mainChannel: any | null | undefined; - readonly epochsInfo: - | Array<{ - [key: string]: number | string; - }> - | null - | undefined; - readonly channelInfo: Array | null | undefined; + readonly epochsInfo: Array<{ + [key: string]: number | string; + }>; + readonly channelInfo: string[]; readonly psdPlot: | { [key: string]: string; @@ -47,81 +35,69 @@ const initialState = { kernel: null, kernelStatus: KERNEL_STATUS.OFFLINE, mainChannel: null, - epochsInfo: null, + epochsInfo: [], channelInfo: [], psdPlot: null, topoPlot: null, erpPlot: null }; -export default function jupyter( - state: JupyterStateType = initialState, - action: ActionType -) { - switch (action.type) { - case SET_KERNEL: +export default createReducer(initialState, builder => + builder + .addCase(JupyterActions.SetKernel, (state, action) => { return { ...state, kernel: action.payload }; - - case SET_KERNEL_STATUS: + }) + .addCase(JupyterActions.SetKernelStatus, (state, action) => { return { ...state, kernelStatus: action.payload }; - - case SET_MAIN_CHANNEL: + }) + .addCase(JupyterActions.SetMainChannel, (state, action) => { return { ...state, mainChannel: action.payload }; - - case SET_KERNEL_INFO: - return state; - - case SET_EPOCH_INFO: + }) + .addCase(JupyterActions.SetEpochInfo, (state, action) => { return { ...state, epochsInfo: action.payload }; - - case SET_CHANNEL_INFO: + }) + .addCase(JupyterActions.SetChannelInfo, (state, action) => { return { ...state, channelInfo: action.payload }; - - case SET_PSD_PLOT: + }) + .addCase(JupyterActions.SetPSDPlot, (state, action) => { return { ...state, psdPlot: action.payload }; - - case SET_TOPO_PLOT: + }) + .addCase(JupyterActions.SetTopoPlot, (state, action) => { return { ...state, topoPlot: action.payload }; - - case SET_ERP_PLOT: + }) + .addCase(JupyterActions.SetERPPlot, (state, action) => { return { ...state, erpPlot: action.payload }; - - case EXPERIMENT_CLEANUP: + }) + .addCase(ExperimentActions.ExperimentCleanup, (state, action) => { return { ...state, - epochsInfo: null, + epochsInfo: [], psdPlot: null, erpPlot: null }; - - case RECEIVE_EXECUTE_RETURN: - return state; - - default: - return state; - } -} + }) +); diff --git a/app/utils/jupyter/cells.ts b/app/utils/jupyter/cells.ts index f2d59076..0d9ecfa5 100644 --- a/app/utils/jupyter/cells.ts +++ b/app/utils/jupyter/cells.ts @@ -85,7 +85,7 @@ export const cleanEpochsPlot = () => export const plotTopoMap = () => [`%matplotlib inline`, `plot_topo(clean_epochs, conditions)`].join('\n'); -export const plotERP = (channelIndex: number) => +export const plotERP = (channelIndex: number | string) => [ `%matplotlib inline`, `X, y = plot_conditions(clean_epochs, ch_ind=${channelIndex}, conditions=conditions, From c4c43c030c4ff31cef25cfa28a165fce1321c2ba Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 26 Jul 2020 12:41:29 -0400 Subject: [PATCH 26/66] updated await pipe --- app/utils/jupyter/pipes.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/utils/jupyter/pipes.ts b/app/utils/jupyter/pipes.ts index 07d8252a..49b41a86 100644 --- a/app/utils/jupyter/pipes.ts +++ b/app/utils/jupyter/pipes.ts @@ -1,7 +1,7 @@ import { pipe } from 'rxjs'; import { map, pluck, filter, take, mergeMap } from 'rxjs/operators'; import { executeRequest } from '@nteract/messaging'; -import { RECEIVE_EXECUTE_REPLY } from '../../epics/jupyterEpics'; +import { JupyterActions } from '../../actions'; // Refactor this so command can be calculated either up stream or inside pipe export const execute = (command, state$) => @@ -12,9 +12,11 @@ export const execute = (command, state$) => export const awaitOkMessage = action$ => pipe( mergeMap(() => - action$.ofType(RECEIVE_EXECUTE_REPLY).pipe( + action$.ofType(JupyterActions.ReceiveExecuteReply.type).pipe( pluck('payload'), - filter(msg => msg.channel === 'shell' && msg.content.status === 'ok'), + filter( + msg => msg.channel === 'shell' && msg.content.status === 'ok' + ), take(1) ) ) From 0277678c2aec1dbf29f4aaf0388cf791bbc80ba8 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 26 Jul 2020 15:57:41 -0400 Subject: [PATCH 27/66] Post breaky changes with Teon --- .eslintrc.js | 13 +- .../CleanComponent/CleanSidebar.tsx | 4 +- app/components/CleanComponent/index.tsx | 114 ++-- .../CollectComponent/ConnectModal.tsx | 17 +- .../CollectComponent/HelpSidebar.tsx | 46 +- .../CollectComponent/RunComponent.tsx | 3 +- app/constants/interfaces.ts | 13 + app/utils/behavior/{compute.ts => compute.js} | 1 + app/utils/labjs/functions.ts | 9 - app/utils/labjs/index.tsx | 14 +- app/utils/labjs/lab.css | 531 ------------------ .../labjs/scripts/{custom.ts => custom.js} | 2 + .../{faceshouses.ts => faceshouses.js} | 2 + .../{multitasking.ts => multitasking.js} | 2 + .../labjs/scripts/{stroop.ts => stroop.js} | 2 + .../{visualsearch.ts => visualsearch.js} | 2 + test/actions/counter.spec.ts | 45 -- test/components/Counter.spec.tsx | 71 --- test/containers/CounterPage.spec.tsx | 61 -- test/e2e/HomePage.e2e.ts | 97 ---- test/e2e/helpers.ts | 4 - test/reducers/counter.spec.ts | 25 - 22 files changed, 139 insertions(+), 939 deletions(-) rename app/utils/behavior/{compute.ts => compute.js} (99%) delete mode 100755 app/utils/labjs/lab.css rename app/utils/labjs/scripts/{custom.ts => custom.js} (99%) rename app/utils/labjs/scripts/{faceshouses.ts => faceshouses.js} (99%) rename app/utils/labjs/scripts/{multitasking.ts => multitasking.js} (99%) rename app/utils/labjs/scripts/{stroop.ts => stroop.js} (99%) rename app/utils/labjs/scripts/{visualsearch.ts => visualsearch.js} (99%) delete mode 100644 test/actions/counter.spec.ts delete mode 100644 test/components/Counter.spec.tsx delete mode 100644 test/containers/CounterPage.spec.tsx delete mode 100644 test/e2e/HomePage.e2e.ts delete mode 100644 test/e2e/helpers.ts delete mode 100644 test/reducers/counter.spec.ts diff --git a/.eslintrc.js b/.eslintrc.js index 3bac1d8c..e4f69c74 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -4,10 +4,21 @@ module.exports = { // A temporary hack related to IDE not resolving correct package.json 'import/no-extraneous-dependencies': 'off', 'import/prefer-default-export': 'off', + 'lines-between-class-members': 'off', 'react/destructuring-assignment': 'warn', 'react/no-access-state-in-setstate': 'warn', + 'react/static-property-placement': 'off', + 'react/no-will-update-set-state': 'warn', + 'react/prop-types': 'off', + 'react/jsx-one-expression-per-line': 'off', 'dot-notation': 'off', - '@typescript-eslint/ban-ts-ignore': 'warn' + 'prefer-destructuring': 'warn', + 'jsx-a11y/anchor-is-valid': 'warn', + 'jsx-a11y/click-events-have-key-events': 'warn', + '@typescript-eslint/ban-ts-ignore': 'warn', + 'max-classes-per-file': 'off', + 'no-restricted-syntax': 'off', + 'no-plusplus': 'off' }, settings: { 'import/resolver': { diff --git a/app/components/CleanComponent/CleanSidebar.tsx b/app/components/CleanComponent/CleanSidebar.tsx index 5a0d6efa..200241a6 100644 --- a/app/components/CleanComponent/CleanSidebar.tsx +++ b/app/components/CleanComponent/CleanSidebar.tsx @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import { Segment, Header, Menu, Icon, Button, Grid } from 'semantic-ui-react'; -import styles from '../styles/collect.css'; +import styles from '../styles/common.css'; enum HELP_STEP { MENU = 0, @@ -137,7 +137,7 @@ export default class CleanSidebar extends Component { 'Try blinking your eyes', 'Does the signal change? Eye movements create noise in the EEG signal' ); - case HELP_STEP.LEARN_THOUGHTS: + case HELP_STEP.LEARN_THOUGHT: return this.renderHelp( 'Try thinking of a cat', "Does the signal change? Although EEG can measure overall brain activity, it's not capable of reading minds" diff --git a/app/components/CleanComponent/index.tsx b/app/components/CleanComponent/index.tsx index 6e17fa14..f38ad8bd 100644 --- a/app/components/CleanComponent/index.tsx +++ b/app/components/CleanComponent/index.tsx @@ -8,30 +8,32 @@ import { Dropdown, Sidebar, SidebarPusher, - Divider + Divider, + DropdownProps, + DropdownItemProps } from 'semantic-ui-react'; +import * as path from 'path'; import { Link } from 'react-router-dom'; -import { isNil } from 'lodash'; -import styles from './../styles/collect.css'; +import { isNil, isArray, isString } from 'lodash'; +import styles from '../styles/collect.css'; +import commonStyles from '../styles/common.css'; import { EXPERIMENTS, DEVICES, KERNEL_STATUS } from '../../constants/constants'; import { Kernel } from '../../constants/interfaces'; import { readWorkspaceRawEEGData } from '../../utils/filesystem/storage'; import CleanSidebar from './CleanSidebar'; -import * as path from 'path'; +import { isStr } from 'react-toastify/dist/utils'; +import { SemanticICONS } from 'semantic-ui-react/dist/commonjs/generic'; interface Props { - type: EXPERIMENTS | null | undefined; + type?: EXPERIMENTS; title: string; deviceType: DEVICES; - mainChannel: any | null | undefined; - kernel: Kernel | null | undefined; + mainChannel?: any; + kernel?: Kernel; kernelStatus: KERNEL_STATUS; - epochsInfo: - | Array<{ - [key: string]: number | string; - }> - | null - | undefined; + epochsInfo: Array<{ + [key: string]: number | string; + }>; jupyterActions: object; experimentActions: object; subject: string; @@ -39,27 +41,15 @@ interface Props { } interface State { - subjects: Array; - eegFilePaths: Array< - | { - key: string; - text: string; - value: { name: string; dir: string }; - } - | null - | undefined - >; + subjects: Array; + eegFilePaths: Array; selectedSubject: string; - selectedFilePaths: Array; + selectedFilePaths: Array; + isSidebarVisible: boolean; } export default class Clean extends Component { - props: Props; - state: State; - handleRecordingChange: (arg0: object, arg1: object) => void; - handleLoadData: () => void; - handleSubjectChange: (arg0: object, arg1: object) => void; - icons: string[]; + icons: SemanticICONS[]; constructor(props: Props) { super(props); @@ -67,7 +57,8 @@ export default class Clean extends Component { subjects: [], eegFilePaths: [{ key: '', text: '', value: '' }], selectedFilePaths: [], - selectedSubject: props.subject + selectedSubject: props.subject, + isSidebarVisible: false }; this.handleRecordingChange = this.handleRecordingChange.bind(this); this.handleLoadData = this.handleLoadData.bind(this); @@ -110,12 +101,17 @@ export default class Clean extends Component { }); } - handleRecordingChange(event: object, data: object) { - this.setState({ selectedFilePaths: data.value }); + handleRecordingChange(event: object, data: DropdownProps) { + if (isArray(data.value)) { + const filePaths = data.value.filter(isString); + this.setState({ selectedFilePaths: filePaths }); + } } - handleSubjectChange(event: object, data: object) { - this.setState({ selectedSubject: data.value, selectedFilePaths: [] }); + handleSubjectChange(event: object, data: DropdownProps) { + if (!isNil(data) && isString(data.value)) { + this.setState({ selectedSubject: data.value, selectedFilePaths: [] }); + } } handleLoadData() { @@ -148,17 +144,21 @@ export default class Clean extends Component { } renderAnalyzeButton() { - if ( - !isNil(this.props.epochsInfo) && - this.props.epochsInfo.find(infoObj => infoObj.name === 'Drop Percentage') - .value >= 2 - ) { - return ( - - - - ); + const { epochsInfo } = this.props; + if (!isNil(epochsInfo)) { + const drop = epochsInfo.find( + infoObj => infoObj.name === 'Drop Percentage' + )?.value; + + if (drop && drop >= 2) { + return ( + + + + ); + } } + return <>; } render() { @@ -188,7 +188,11 @@ export default class Clean extends Component { - +
Select & Clean

Ready to clean some data? Select a subject and one or more @@ -210,13 +214,17 @@ export default class Clean extends Component { selection closeOnChange value={this.state.selectedFilePaths} - options={this.state.eegFilePaths.filter( - filepath => - this.state.selectedSubject === - filepath.value.split(path.sep)[ - filepath.value.split(path.sep).length - 3 - ] - )} + options={this.state.eegFilePaths.filter(filepath => { + if (isString(filepath.value)) { + const subjectFromFilepath = filepath.value.split( + path.sep + )[filepath.value.split(path.sep).length - 3]; + return ( + this.state.selectedSubject === subjectFromFilepath + ); + } + return false; + })} onChange={this.handleRecordingChange} />

Experimental
+ + props.onChange(props.num, 'phase', 'practice')} + > +
Practice
+
+ + +
-// -// this.props.onChange(this.props.num, 'phase', data.value) -// } -// placeholder="Response" -// options={[{key: 'main', text: 'Experimental', value: 'main'}, -// {key: 'practice', text: 'Practice', value: 'practice'}]} -// className={styles.trialsTrialTypeRowSelector} -// /> + + + + ); +}; diff --git a/app/components/PreviewExperimentComponent.tsx b/app/components/PreviewExperimentComponent.tsx index ef90b262..b48cd895 100644 --- a/app/components/PreviewExperimentComponent.tsx +++ b/app/components/PreviewExperimentComponent.tsx @@ -11,30 +11,28 @@ import { } from '../constants/interfaces'; interface Props { + title: string; + paradigm: string; params: ExperimentParameters; + previewParams?: ExperimentParameters; isPreviewing: boolean; mainTimeline: MainTimeline; trials: { [key: string]: Trial; }; timelines: {}; + onEnd: () => void; } export default class PreviewExperimentComponent extends Component { - // props: Props; - - constructor(props: Props) { - super(props); + static insertPreviewLabJsCallback(e) { + console.log('EEG marker', e); } handleImages() { return getImages(this.props.params); } - insertPreviewLabJsCallback(e) { - console.log('EEG marker', e); - } - render() { if (!this.props.isPreviewing) { return ( @@ -50,7 +48,8 @@ export default class PreviewExperimentComponent extends Component { title: this.props.title, script: this.props.paradigm, params: this.props.previewParams || this.props.params, - eventCallback: this.insertPreviewLabJsCallback, + eventCallback: + PreviewExperimentComponent.insertPreviewLabJsCallback, on_finish: csv => { this.props.onEnd(); } diff --git a/app/constants/interfaces.ts b/app/constants/interfaces.ts index 5b4301cb..e0fd6d5d 100644 --- a/app/constants/interfaces.ts +++ b/app/constants/interfaces.ts @@ -45,6 +45,10 @@ export type ExperimentParameters = { title: string; response: string; }; + nbPracticeTrials?: number; + randomize?: 'random' | 'sequential'; + selfPaced?: boolean; + presentationTime?: number; }; export type ExperimentDescription = { @@ -95,6 +99,16 @@ export interface SampleParameter { export type StimulusVariable = () => any; +export interface StimuliDesc { + dir: any; + filename: string; + name: string; + condition: any; + response: any; + phase: string; + type: number; +} + // -------------------------------------------------------------------- // Jupyter diff --git a/package.json b/package.json index 774b30f2..89bba5c0 100644 --- a/package.json +++ b/package.json @@ -299,7 +299,7 @@ "muse-js": "^3.1.0", "papaparse": "^5.2.0", "plotly.js": "^1.54.2", - "rc-slider": "^9.3.1", + "rc-slider": "^9.2.4", "react": "^16.13.1", "react-dom": "^16.13.1", "react-hot-loader": "^4.12.19", From d38b042161022df9319b34f5cf9ebae6c4f8bc42 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 9 Aug 2020 11:30:56 -0400 Subject: [PATCH 35/66] Fixed last of the warnings --- .../DesignComponent/CustomDesignComponent.tsx | 6 ++-- app/components/EEGExplorationComponent.tsx | 14 +++++---- app/components/InputModal.tsx | 16 +++++----- .../SecondaryNavSegment.tsx | 30 ++++++++----------- app/components/TopNavComponent/index.tsx | 6 ++-- app/containers/CleanContainer.ts | 1 + app/epics/experimentEpics.ts | 5 +--- app/reducers/experimentReducer.ts | 2 +- 8 files changed, 38 insertions(+), 42 deletions(-) diff --git a/app/components/DesignComponent/CustomDesignComponent.tsx b/app/components/DesignComponent/CustomDesignComponent.tsx index 3468125d..023c922e 100644 --- a/app/components/DesignComponent/CustomDesignComponent.tsx +++ b/app/components/DesignComponent/CustomDesignComponent.tsx @@ -420,9 +420,9 @@ export default class CustomDesign extends Component { n => this.state.params[`stimulus${n}`].title )} {...e} - onDelete={num => { + onDelete={deletedNum => { const { stimuli } = this.state.params; - stimuli.splice(num, 1); + stimuli.splice(deletedNum, 1); const nbPracticeTrials = stimuli.filter( s => s.phase === 'practice' ).length; @@ -440,7 +440,7 @@ export default class CustomDesign extends Component { }} onChange={(changedNum, key, data) => { const { stimuli } = this.state.params; - stimuli[num][key] = data; + stimuli[changedNum][key] = data; let { nbPracticeTrials } = this.state.params; let { nbTrials } = this.state.params; if (key === 'phase') { diff --git a/app/components/EEGExplorationComponent.tsx b/app/components/EEGExplorationComponent.tsx index 3270f21d..44d003c6 100644 --- a/app/components/EEGExplorationComponent.tsx +++ b/app/components/EEGExplorationComponent.tsx @@ -7,16 +7,19 @@ import { Image, Divider } from 'semantic-ui-react'; +import { HashHistory } from 'history'; import { PLOTTING_INTERVAL, CONNECTION_STATUS, - DEVICE_AVAILABILITY + DEVICE_AVAILABILITY, + DEVICES } from '../constants/constants'; import eegImage from '../assets/common/EEG.png'; import SignalQualityIndicatorComponent from './SignalQualityIndicatorComponent'; import ViewerComponent from './ViewerComponent'; import ConnectModal from './CollectComponent/ConnectModal'; import styles from './styles/common.css'; +import { DeviceActions } from '../actions'; interface Props { history: HashHistory; @@ -25,7 +28,7 @@ interface Props { deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; - DeviceActions: typeof DeviceActions; + DeviceActions: typeof DeviceActions; availableDevices: Array; } @@ -57,15 +60,15 @@ export default class Home extends Component { handleStartConnect() { this.setState({ isConnectModalOpen: true }); - this.props.DeviceActions.setDeviceAvailability( + this.props.DeviceActions.SetDeviceAvailability( DEVICE_AVAILABILITY.SEARCHING ); } handleStopConnect() { - this.props.DeviceActions.disconnectFromDevice(this.props.connectedDevice); + this.props.DeviceActions.DisconnectFromDevice(this.props.connectedDevice); this.setState({ isConnectModalOpen: false }); - this.props.DeviceActions.setDeviceAvailability(DEVICE_AVAILABILITY.NONE); + this.props.DeviceActions.SetDeviceAvailability(DEVICE_AVAILABILITY.NONE); } handleConnectModalClose() { @@ -134,7 +137,6 @@ export default class Home extends Component { connectionStatus={this.props.connectionStatus} DeviceActions={this.props.DeviceActions} availableDevices={this.props.availableDevices} - style={{ marginTop: '100px' }} />
)} diff --git a/app/components/InputModal.tsx b/app/components/InputModal.tsx index 44c88c09..41b92e12 100644 --- a/app/components/InputModal.tsx +++ b/app/components/InputModal.tsx @@ -6,7 +6,7 @@ import styles from './styles/common.css'; interface Props { open: boolean; onClose: (arg0: string) => void; - onExit: (arg0: string) => void; + onExit: () => void; header: string; } @@ -16,9 +16,10 @@ interface State { } export default class InputModal extends Component { - // handleClose: () => void; - // handleExit: () => void; - // handleEnterSubmit: (Object) => void; + static sanitizeTextInput(text: string) { + return text.replace(/[|&;$%@"<>()+,./]/g, ''); + } + constructor(props: Props) { super(props); this.state = { @@ -30,9 +31,6 @@ export default class InputModal extends Component { this.handleEnterSubmit = this.handleEnterSubmit.bind(this); this.handleExit = this.handleExit.bind(this); } - sanitizeTextInput(text: string) { - return text.replace(/[|&;$%@"<>()+,./]/g, ''); - } handleTextEntry(event, data) { this.setState({ enteredText: data.value }); @@ -40,7 +38,7 @@ export default class InputModal extends Component { handleClose() { if (this.state.enteredText.length >= 1) { - this.props.onClose(this.sanitizeTextInput(this.state.enteredText)); + this.props.onClose(InputModal.sanitizeTextInput(this.state.enteredText)); } else { this.setState({ isError: true }); } @@ -51,7 +49,7 @@ export default class InputModal extends Component { } handleEnterSubmit(event: object) { - if (event.key === 'Enter') { + if (event['key'] === 'Enter') { this.handleClose(); } } diff --git a/app/components/SecondaryNavComponent/SecondaryNavSegment.tsx b/app/components/SecondaryNavComponent/SecondaryNavSegment.tsx index 8d2c531c..abc0f34f 100644 --- a/app/components/SecondaryNavComponent/SecondaryNavSegment.tsx +++ b/app/components/SecondaryNavComponent/SecondaryNavSegment.tsx @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React from 'react'; import { Grid } from 'semantic-ui-react'; import styles from '../styles/secondarynav.css'; @@ -8,20 +8,16 @@ interface Props { onClick: () => void; } -export default class SecondaryNavSegment extends Component { - // props: Props; - - render() { - return ( - - {this.props.title} - - ); - } +export default function SecondaryNavSegment(props: Props) { + return ( + + {props.title} + + ); } diff --git a/app/components/TopNavComponent/index.tsx b/app/components/TopNavComponent/index.tsx index 82945b12..a1fe3598 100644 --- a/app/components/TopNavComponent/index.tsx +++ b/app/components/TopNavComponent/index.tsx @@ -10,12 +10,14 @@ import { readWorkspaces } from '../../utils/filesystem/storage'; import BrainwavesIcon from '../../assets/common/Brainwaves_Icon_big.png'; +import { ExperimentActions } from '../../actions'; interface Props { title: string | null | undefined; location: { pathname: string; search: string; hash: string }; isRunning: boolean; - ExperimentActions: typeof ExperimentActions; + ExperimentActions: typeof ExperimentActions; + isEEGEnabled: boolean; type: EXPERIMENTS; } @@ -48,7 +50,7 @@ export default class TopNavComponent extends Component { handleLoadRecentWorkspace(dir: string) { const recentWorkspaceState = readAndParseState(dir); if (!isNil(recentWorkspaceState)) { - this.props.ExperimentActions.setState(recentWorkspaceState); + this.props.ExperimentActions.SetState(recentWorkspaceState); } } diff --git a/app/containers/CleanContainer.ts b/app/containers/CleanContainer.ts index 52215bcc..b1b51bc1 100644 --- a/app/containers/CleanContainer.ts +++ b/app/containers/CleanContainer.ts @@ -2,6 +2,7 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import CleanComponent from '../components/CleanComponent'; import { JupyterActions, ExperimentActions } from '../actions'; + function mapStateToProps(state) { return { type: state.experiment.type, diff --git a/app/epics/experimentEpics.ts b/app/epics/experimentEpics.ts index e2481fd1..da51a4cb 100644 --- a/app/epics/experimentEpics.ts +++ b/app/epics/experimentEpics.ts @@ -12,10 +12,7 @@ import { ignoreElements, tap } from 'rxjs/operators'; -import { - ExperimentActions, - ExperimentActionType -} from '../actions/ExperimentActions'; +import { ExperimentActions, ExperimentActionType } from '../actions'; import { DEVICES, MUSE_CHANNELS, diff --git a/app/reducers/experimentReducer.ts b/app/reducers/experimentReducer.ts index 2b64ee7c..141c3f7b 100644 --- a/app/reducers/experimentReducer.ts +++ b/app/reducers/experimentReducer.ts @@ -1,5 +1,5 @@ import { createReducer } from '@reduxjs/toolkit'; -import { ExperimentActions } from '../actions/ExperimentActions'; +import { ExperimentActions } from '../actions'; import { EXPERIMENTS } from '../constants/constants'; import { MainTimeline, From 13bad5d6d61af06681dc248d0f6b303966edf525 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 9 Aug 2020 13:11:33 -0400 Subject: [PATCH 36/66] updated deps to match v.13 boilerplate --- package.json | 175 +++++++++++++++++++++++++-------------------------- 1 file changed, 86 insertions(+), 89 deletions(-) diff --git a/package.json b/package.json index 89bba5c0..5a3c491c 100644 --- a/package.json +++ b/package.json @@ -27,10 +27,11 @@ "preinstall": "node ./internals/scripts/CheckYarn.js", "prestart": "yarn build", "start": "cross-env NODE_ENV=production electron ./app/main.prod.js", + "start-main-debug": "yarn start-main-dev --inspect=5858 --remote-debugging-port=9223", "start-main-dev": "cross-env START_HOT=1 NODE_ENV=development electron -r ./internals/scripts/BabelRegister ./app/main.dev.ts", "start-renderer-dev": "cross-env NODE_ENV=development webpack-dev-server --config configs/webpack.config.renderer.dev.babel.js", - "test": "cross-env NODE_ENV=test BABEL_DISABLE_CACHE=1 jest", - "test-all": "yarn lint && yarn tsc && yarn build && yarn test && yarn build-e2e && yarn test-e2e", + "test": "cross-env BABEL_DISABLE_CACHE=1 jest", + "test-all": "yarn lint && yarn tsc && yarn build && yarn test", "test-e2e": "node -r @babel/register ./internals/scripts/CheckBuildsExist.js && cross-env NODE_ENV=test testcafe electron:./app ./test/e2e/HomePage.e2e.ts", "test-e2e-live": "node -r @babel/register ./internals/scripts/CheckBuildsExist.js && cross-env NODE_ENV=test testcafe --live electron:./app ./test/e2e/HomePage.e2e.ts", "test-watch": "yarn test --watch" @@ -159,115 +160,110 @@ ] }, "devDependencies": { - "@babel/core": "^7.10.2", - "@babel/plugin-proposal-class-properties": "^7.10.1", - "@babel/plugin-proposal-decorators": "^7.10.1", - "@babel/plugin-proposal-do-expressions": "^7.10.1", - "@babel/plugin-proposal-export-default-from": "^7.10.1", - "@babel/plugin-proposal-export-namespace-from": "^7.10.1", - "@babel/plugin-proposal-function-bind": "^7.10.1", - "@babel/plugin-proposal-function-sent": "^7.10.1", - "@babel/plugin-proposal-json-strings": "^7.10.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.10.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", - "@babel/plugin-proposal-numeric-separator": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.1", - "@babel/plugin-proposal-pipeline-operator": "^7.10.1", - "@babel/plugin-proposal-throw-expressions": "^7.10.1", + "@amilajack/testcafe-browser-provider-electron": "^0.0.15-alpha.1", + "@babel/core": "^7.11.1", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-decorators": "^7.10.5", + "@babel/plugin-proposal-do-expressions": "^7.10.4", + "@babel/plugin-proposal-export-default-from": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-function-bind": "^7.10.5", + "@babel/plugin-proposal-function-sent": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-pipeline-operator": "^7.10.5", + "@babel/plugin-proposal-throw-expressions": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.10.1", - "@babel/plugin-transform-react-constant-elements": "^7.10.1", - "@babel/plugin-transform-react-inline-elements": "^7.10.1", - "@babel/preset-env": "^7.10.2", - "@babel/preset-react": "^7.10.1", - "@babel/preset-typescript": "^7.10.1", - "@babel/register": "^7.10.1", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-react-constant-elements": "^7.10.4", + "@babel/plugin-transform-react-inline-elements": "^7.10.4", + "@babel/preset-env": "^7.11.0", + "@babel/preset-react": "^7.10.4", + "@babel/preset-typescript": "^7.10.4", + "@babel/register": "^7.10.5", "@types/enzyme": "^3.10.5", "@types/enzyme-adapter-react-16": "^1.0.6", - "@types/history": "^4.7.5", - "@types/jest": "^24.9.1", - "@types/node": "^12", - "@types/react": "^16.9.17", - "@types/react-dom": "^16.9.7", - "@types/react-redux": "^7.1.6", - "@types/react-router": "^5.1.7", + "@types/history": "^4.7.6", + "@types/jest": "^26.0.5", + "@types/node": "12", + "@types/react": "^16.9.44", + "@types/react-dom": "^16.9.8", + "@types/react-redux": "^7.1.9", + "@types/react-router": "^5.1.8", "@types/react-router-dom": "^5.1.5", "@types/react-test-renderer": "^16.9.2", - "@types/redux-logger": "^3.0.7", - "@types/sinon": "^7.5.2", - "@types/tapable": "^1.0.5", - "@types/vfile-message": "^2.0.0", - "@types/webpack": "^4.41.3", - "@typescript-eslint/eslint-plugin": "^2.17.0", - "@typescript-eslint/parser": "^2.17.0", - "babel-core": "7.0.0-bridge.0", + "@types/redux-logger": "^3.0.8", + "@types/webpack": "^4.41.21", + "@types/webpack-env": "^1.15.2", + "@typescript-eslint/eslint-plugin": "^3.6.1", + "@typescript-eslint/parser": "^3.6.1", "babel-eslint": "^10.1.0", - "babel-jest": "^25.1.0", + "babel-jest": "^26.1.0", "babel-loader": "^8.1.0", "babel-plugin-dev-expression": "^0.2.2", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "browserslist-config-erb": "^0.0.1", - "chalk": "^3.0.0", + "chalk": "^4.1.0", "concurrently": "^5.2.0", + "core-js": "^3.6.5", "cross-env": "^7.0.0", - "cross-spawn": "^7.0.1", - "css-loader": "^3.4.2", + "css-loader": "^3.6.0", "detect-port": "^1.3.0", - "electron": "7.1.13", + "electron": "^8", "electron-builder": "^22.3.6", "electron-devtools-installer": "^2.2.4", "electron-rebuild": "^1.10.0", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.2", - "enzyme-to-json": "^3.4.4", - "eslint": "7.2.0", - "eslint-config-airbnb-typescript": "^6.3.1", - "eslint-config-erb": "^0.3.0", + "enzyme-to-json": "^3.5.0", + "eslint": "^7.5.0", + "eslint-config-airbnb": "^18.2.0", + "eslint-config-airbnb-typescript": "^9.0.0", + "eslint-config-erb": "^1.0.0", "eslint-config-prettier": "^6.11.0", - "eslint-import-resolver-webpack": "^0.12.1", - "eslint-plugin-compat": "^3.7.0", - "eslint-plugin-import": "^2.21.2", - "eslint-plugin-jest": "^23.13.2", - "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-prettier": "^3.1.3", + "eslint-import-resolver-webpack": "^0.12.2", + "eslint-plugin-compat": "^3.8.0", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-jest": "^23.18.0", + "eslint-plugin-jsx-a11y": "6.3.1", + "eslint-plugin-prettier": "^3.1.4", "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-react": "^7.20.0", - "eslint-plugin-react-hooks": "^4.0.4", + "eslint-plugin-react": "^7.20.3", + "eslint-plugin-react-hooks": "^4.0.8", "eslint-plugin-testcafe": "^0.2.1", - "fbjs-scripts": "^1.2.0", - "file-loader": "^5.0.2", - "husky": "^4.2.0", + "file-loader": "^6.0.0", + "husky": "^4.2.5", "identity-obj-proxy": "^3.0.0", - "jest": "^25.1.0", - "lint-staged": "^10.0.2", + "jest": "^26.1.0", + "lint-staged": "^10.2.11", "mini-css-extract-plugin": "^0.9.0", - "node-sass": "^4.13.1", - "opencollective-postinstall": "^2.0.2", + "opencollective-postinstall": "^2.0.3", "optimize-css-assets-webpack-plugin": "^5.0.3", "patch-package": "6.2.2", - "prettier": "^1.19.1", + "prettier": "^2.0.5", "react-test-renderer": "^16.12.0", "redux-logger": "^3.0.6", "rimraf": "^3.0.0", - "sass-loader": "^8.0.2", - "sinon": "^8.1.1", - "spectron": "^10.0.0", - "style-loader": "^1.1.3", - "stylelint": "^13.0.0", - "stylelint-config-prettier": "^8.0.1", - "stylelint-config-standard": "^19.0.0", - "terser-webpack-plugin": "^2.3.2", - "testcafe": "^1.8.0", - "testcafe-browser-provider-electron": "^0.0.14", + "sass-loader": "^9.0.2", + "style-loader": "^1.2.1", + "stylelint": "^13.6.1", + "stylelint-config-prettier": "^8.0.2", + "stylelint-config-standard": "^20.0.0", + "terser-webpack-plugin": "^3.0.7", + "testcafe": "^1.8.8", + "testcafe-browser-provider-electron": "^0.0.15", "testcafe-react-selectors": "^4.0.0", - "typed-css-modules-webpack-plugin": "^0.1.2", - "typescript": "^3.7.5", - "url-loader": "^3.0.0", - "webpack": "^4.41.5", - "webpack-bundle-analyzer": "^3.6.0", - "webpack-cli": "^3.3.10", - "webpack-dev-server": "^3.10.1", - "webpack-merge": "^4.2.2", + "typescript": "^3.9.7", + "typings-for-css-modules-loader": "^1.7.0", + "url-loader": "^4.1.0", + "webpack": "^4.43.0", + "webpack-bundle-analyzer": "^3.8.0", + "webpack-cli": "^3.3.12", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^5.0.9", "yarn": "^1.21.1" }, "dependencies": { @@ -277,18 +273,18 @@ "@hot-loader/react-dom": "^16.13.0", "@nteract/messaging": "^7.0.7", "@nteract/transforms": "^4.4.7", - "@reduxjs/toolkit": "1.4.0", + "@reduxjs/toolkit": "^1.4.0", "ajv": "^6.12.2", - "connected-react-router": "^6.8.0", + "connected-react-router": "^6.6.1", "core-js": "^3.6.5", "d3": "^5.16.0", "devtron": "^1.4.0", "electron-debug": "^3.1.0", - "electron-log": "^4.0.6", - "electron-updater": "^4.2.0", + "electron-log": "^4.2.2", + "electron-updater": "^4.3.1", "font-awesome": "^4.7.0", "hazardous": "^0.3.0", - "history": "^5.0.0", + "history": "^4.7.2", "kernelspecs": "^2.0.0", "lab.js": "^20.0.1", "lodash": "^4.17.15", @@ -301,8 +297,8 @@ "plotly.js": "^1.54.2", "rc-slider": "^9.2.4", "react": "^16.13.1", - "react-dom": "^16.13.1", - "react-hot-loader": "^4.12.19", + "react-dom": "^16.12.0", + "react-hot-loader": "^4.12.21", "react-plotly.js": "^2.4.0", "react-redux": "^7.2.0", "react-router": "^5.2.0", @@ -313,6 +309,7 @@ "redux": "^4.0.5", "redux-observable": "^1.2.0", "redux-thunk": "^2.3.0", + "regenerator-runtime": "^0.13.5", "rxjs": "^6.5.5", "rxjs-compat": "^6.5.5", "semantic-ui-css": "^2.4.1", From a55e19ec7ee86e2fa70f6fdbb11fe39d04d7748d Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 9 Aug 2020 13:11:47 -0400 Subject: [PATCH 37/66] Removed some files from exclude tsconfig --- tsconfig.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 81533851..30637f1e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -27,14 +27,8 @@ "test", "release", "app/main.prod.js", - "app/main.prod.js.map", "app/renderer.prod.js", - "app/renderer.prod.js.map", - "app/style.css", - "app/style.css.map", "app/dist", - "dll", - "app/main.js", - "app/main.js.map" + "dll" ] } From 5ab998caa6a39c1585dcbdf92c8d9043619b98c2 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 9 Aug 2020 13:16:40 -0400 Subject: [PATCH 38/66] updated internals and webpack configs --- configs/webpack.config.base.js | 20 +-- configs/webpack.config.main.prod.babel.js | 22 +-- configs/webpack.config.renderer.dev.babel.js | 129 +++++++++--------- .../webpack.config.renderer.dev.dll.babel.js | 22 +-- configs/webpack.config.renderer.prod.babel.js | 122 +++++++++-------- internals/scripts/BabelRegister.js | 2 +- internals/scripts/CheckNativeDep.js | 4 +- internals/scripts/ElectronRebuild.js | 2 +- 8 files changed, 162 insertions(+), 161 deletions(-) diff --git a/configs/webpack.config.base.js b/configs/webpack.config.base.js index 856c9363..c4c004a7 100644 --- a/configs/webpack.config.base.js +++ b/configs/webpack.config.base.js @@ -17,17 +17,17 @@ export default { use: { loader: 'babel-loader', options: { - cacheDirectory: true - } - } - } - ] + cacheDirectory: true, + }, + }, + }, + ], }, output: { path: path.join(__dirname, '..', 'app'), // https://github.com/webpack/webpack/issues/1114 - libraryTarget: 'commonjs2' + libraryTarget: 'commonjs2', }, /** @@ -35,14 +35,14 @@ export default { */ resolve: { extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'], - modules: [path.join(__dirname, '..', 'app'), 'node_modules'] + modules: [path.join(__dirname, '..', 'app'), 'node_modules'], }, plugins: [ new webpack.EnvironmentPlugin({ - NODE_ENV: 'production' + NODE_ENV: 'production', }), - new webpack.NamedModulesPlugin() - ] + new webpack.NamedModulesPlugin(), + ], }; diff --git a/configs/webpack.config.main.prod.babel.js b/configs/webpack.config.main.prod.babel.js index 06aed1f5..c50767c3 100644 --- a/configs/webpack.config.main.prod.babel.js +++ b/configs/webpack.config.main.prod.babel.js @@ -4,7 +4,7 @@ import path from 'path'; import webpack from 'webpack'; -import merge from 'webpack-merge'; +import { merge } from 'webpack-merge'; import TerserPlugin from 'terser-webpack-plugin'; import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; import baseConfig from './webpack.config.base'; @@ -14,7 +14,7 @@ import DeleteSourceMaps from '../internals/scripts/DeleteSourceMaps'; CheckNodeEnv('production'); DeleteSourceMaps(); -export default merge.smart(baseConfig, { +export default merge(baseConfig, { devtool: process.env.DEBUG_PROD === 'true' ? 'source-map' : 'none', mode: 'production', @@ -25,7 +25,7 @@ export default merge.smart(baseConfig, { output: { path: path.join(__dirname, '..'), - filename: './app/main.prod.js' + filename: './app/main.prod.js', }, optimization: { @@ -35,16 +35,16 @@ export default merge.smart(baseConfig, { new TerserPlugin({ parallel: true, sourceMap: true, - cache: true - }) - ] + cache: true, + }), + ], }, plugins: [ new BundleAnalyzerPlugin({ analyzerMode: process.env.OPEN_ANALYZER === 'true' ? 'server' : 'disabled', - openAnalyzer: process.env.OPEN_ANALYZER === 'true' + openAnalyzer: process.env.OPEN_ANALYZER === 'true', }), /** @@ -60,8 +60,8 @@ export default merge.smart(baseConfig, { NODE_ENV: 'production', DEBUG_PROD: false, START_MINIMIZED: false, - E2E_BUILD: false - }) + E2E_BUILD: false, + }), ], /** @@ -71,6 +71,6 @@ export default merge.smart(baseConfig, { */ node: { __dirname: false, - __filename: false - } + __filename: false, + }, }); diff --git a/configs/webpack.config.renderer.dev.babel.js b/configs/webpack.config.renderer.dev.babel.js index e2511ea0..093ba545 100644 --- a/configs/webpack.config.renderer.dev.babel.js +++ b/configs/webpack.config.renderer.dev.babel.js @@ -9,9 +9,8 @@ import path from 'path'; import fs from 'fs'; import webpack from 'webpack'; import chalk from 'chalk'; -import merge from 'webpack-merge'; +import { merge } from 'webpack-merge'; import { spawn, execSync } from 'child_process'; -import { TypedCssModulesPlugin } from 'typed-css-modules-webpack-plugin'; import baseConfig from './webpack.config.base'; import CheckNodeEnv from '../internals/scripts/CheckNodeEnv'; @@ -41,7 +40,7 @@ if (!requiredByDLLConfig && !(fs.existsSync(dll) && fs.existsSync(manifest))) { execSync('yarn build-dll'); } -export default merge.smart(baseConfig, { +export default merge(baseConfig, { devtool: 'inline-source-map', mode: 'development', @@ -49,15 +48,17 @@ export default merge.smart(baseConfig, { target: 'electron-renderer', entry: [ + 'core-js', + 'regenerator-runtime/runtime', ...(process.env.PLAIN_HMR ? [] : ['react-hot-loader/patch']), `webpack-dev-server/client?http://localhost:${port}/`, 'webpack/hot/only-dev-server', - require.resolve('../app/index.tsx') + require.resolve('../app/index.tsx'), ], output: { publicPath: `http://localhost:${port}/dist/`, - filename: 'renderer.dev.js' + filename: 'renderer.dev.js', }, module: { @@ -66,73 +67,73 @@ export default merge.smart(baseConfig, { test: /\.global\.css$/, use: [ { - loader: 'style-loader' + loader: 'style-loader', }, { loader: 'css-loader', options: { - sourceMap: true - } - } - ] + sourceMap: true, + }, + }, + ], }, { test: /^((?!\.global).)*\.css$/, use: [ { - loader: 'style-loader' + loader: 'style-loader', }, { loader: 'css-loader', options: { modules: { - localIdentName: '[name]__[local]__[hash:base64:5]' + localIdentName: '[name]__[local]__[hash:base64:5]', }, sourceMap: true, - importLoaders: 1 - } - } - ] + importLoaders: 1, + }, + }, + ], }, // SASS support - compile all .global.scss files and pipe it to style.css { test: /\.global\.(scss|sass)$/, use: [ { - loader: 'style-loader' + loader: 'style-loader', }, { loader: 'css-loader', options: { - sourceMap: true - } + sourceMap: true, + }, }, { - loader: 'sass-loader' - } - ] + loader: 'sass-loader', + }, + ], }, // SASS support - compile all other .scss files and pipe it to style.css { test: /^((?!\.global).)*\.(scss|sass)$/, use: [ { - loader: 'style-loader' + loader: 'typings-for-css-modules-loader', }, { - loader: 'css-loader', + loader: 'typings-for-css-modules-loader', options: { modules: { - localIdentName: '[name]__[local]__[hash:base64:5]' + localIdentName: '[name]__[local]__[hash:base64:5]', }, sourceMap: true, - importLoaders: 1 - } + importLoaders: 1, + }, }, { - loader: 'sass-loader' - } - ] + loader: 'sass-loader', + }, + ], }, // WOFF Font { @@ -141,9 +142,9 @@ export default merge.smart(baseConfig, { loader: 'url-loader', options: { limit: 10000, - mimetype: 'application/font-woff' - } - } + mimetype: 'application/font-woff', + }, + }, }, // WOFF2 Font { @@ -152,9 +153,9 @@ export default merge.smart(baseConfig, { loader: 'url-loader', options: { limit: 10000, - mimetype: 'application/font-woff' - } - } + mimetype: 'application/font-woff', + }, + }, }, // TTF Font { @@ -163,14 +164,14 @@ export default merge.smart(baseConfig, { loader: 'url-loader', options: { limit: 10000, - mimetype: 'application/octet-stream' - } - } + mimetype: 'application/octet-stream', + }, + }, }, // EOT Font { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, - use: 'file-loader' + use: 'file-loader', }, // SVG Font { @@ -179,21 +180,21 @@ export default merge.smart(baseConfig, { loader: 'url-loader', options: { limit: 10000, - mimetype: 'image/svg+xml' - } - } + mimetype: 'image/svg+xml', + }, + }, }, // Common Image Formats { test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, - use: 'url-loader' - } - ] + use: 'url-loader', + }, + ], }, resolve: { alias: { - 'react-dom': '@hot-loader/react-dom' - } + 'react-dom': '@hot-loader/react-dom', + }, }, plugins: [ requiredByDLLConfig @@ -201,15 +202,11 @@ export default merge.smart(baseConfig, { : new webpack.DllReferencePlugin({ context: path.join(__dirname, '..', 'dll'), manifest: require(manifest), - sourceType: 'var' + sourceType: 'var', }), new webpack.HotModuleReplacementPlugin({ - multiStep: true - }), - - new TypedCssModulesPlugin({ - globPattern: 'app/**/*.{css,scss,sass}' + multiStep: true, }), new webpack.NoEmitOnErrorsPlugin(), @@ -227,24 +224,24 @@ export default merge.smart(baseConfig, { * 'staging', for example, by changing the ENV variables in the npm scripts */ new webpack.EnvironmentPlugin({ - NODE_ENV: 'development' + NODE_ENV: 'development', }), new webpack.LoaderOptionsPlugin({ - debug: true - }) + debug: true, + }), ], node: { __dirname: false, - __filename: false + __filename: false, }, devServer: { port, publicPath, compress: true, - noInfo: true, + noInfo: false, stats: 'errors-only', inline: true, lazy: false, @@ -254,11 +251,11 @@ export default merge.smart(baseConfig, { watchOptions: { aggregateTimeout: 300, ignored: /node_modules/, - poll: 100 + poll: 100, }, historyApiFallback: { verbose: true, - disableDotRule: false + disableDotRule: false, }, before() { if (process.env.START_HOT) { @@ -266,11 +263,11 @@ export default merge.smart(baseConfig, { spawn('npm', ['run', 'start-main-dev'], { shell: true, env: process.env, - stdio: 'inherit' + stdio: 'inherit', }) - .on('close', code => process.exit(code)) - .on('error', spawnError => console.error(spawnError)); + .on('close', (code) => process.exit(code)) + .on('error', (spawnError) => console.error(spawnError)); } - } - } + }, + }, }); diff --git a/configs/webpack.config.renderer.dev.dll.babel.js b/configs/webpack.config.renderer.dev.dll.babel.js index 99fc2f30..fa0b172c 100644 --- a/configs/webpack.config.renderer.dev.dll.babel.js +++ b/configs/webpack.config.renderer.dev.dll.babel.js @@ -4,7 +4,7 @@ import webpack from 'webpack'; import path from 'path'; -import merge from 'webpack-merge'; +import { merge } from 'webpack-merge'; import baseConfig from './webpack.config.base'; import { dependencies } from '../package.json'; import CheckNodeEnv from '../internals/scripts/CheckNodeEnv'; @@ -13,7 +13,7 @@ CheckNodeEnv('development'); const dist = path.join(__dirname, '..', 'dll'); -export default merge.smart(baseConfig, { +export default merge(baseConfig, { context: path.join(__dirname, '..'), devtool: 'eval', @@ -30,20 +30,20 @@ export default merge.smart(baseConfig, { module: require('./webpack.config.renderer.dev.babel').default.module, entry: { - renderer: Object.keys(dependencies || {}) + renderer: Object.keys(dependencies || {}), }, output: { library: 'renderer', path: dist, filename: '[name].dev.dll.js', - libraryTarget: 'var' + libraryTarget: 'var', }, plugins: [ new webpack.DllPlugin({ path: path.join(dist, '[name].json'), - name: '[name]' + name: '[name]', }), /** @@ -56,7 +56,7 @@ export default merge.smart(baseConfig, { * development checks */ new webpack.EnvironmentPlugin({ - NODE_ENV: 'development' + NODE_ENV: 'development', }), new webpack.LoaderOptionsPlugin({ @@ -64,9 +64,9 @@ export default merge.smart(baseConfig, { options: { context: path.join(__dirname, '..', 'app'), output: { - path: path.join(__dirname, '..', 'dll') - } - } - }) - ] + path: path.join(__dirname, '..', 'dll'), + }, + }, + }), + ], }); diff --git a/configs/webpack.config.renderer.prod.babel.js b/configs/webpack.config.renderer.prod.babel.js index 602119ce..70d8593b 100644 --- a/configs/webpack.config.renderer.prod.babel.js +++ b/configs/webpack.config.renderer.prod.babel.js @@ -7,7 +7,7 @@ import webpack from 'webpack'; import MiniCssExtractPlugin from 'mini-css-extract-plugin'; import OptimizeCSSAssetsPlugin from 'optimize-css-assets-webpack-plugin'; import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; -import merge from 'webpack-merge'; +import { merge } from 'webpack-merge'; import TerserPlugin from 'terser-webpack-plugin'; import baseConfig from './webpack.config.base'; import CheckNodeEnv from '../internals/scripts/CheckNodeEnv'; @@ -16,19 +16,23 @@ import DeleteSourceMaps from '../internals/scripts/DeleteSourceMaps'; CheckNodeEnv('production'); DeleteSourceMaps(); -export default merge.smart(baseConfig, { +export default merge(baseConfig, { devtool: process.env.DEBUG_PROD === 'true' ? 'source-map' : 'none', mode: 'production', - target: 'electron-preload', + target: process.env.E2E_BUILD ? 'electron-renderer' : 'electron-preload', - entry: path.join(__dirname, '..', 'app/index.tsx'), + entry: [ + 'core-js', + 'regenerator-runtime/runtime', + path.join(__dirname, '..', 'app/index.tsx'), + ], output: { path: path.join(__dirname, '..', 'app/dist'), publicPath: './dist/', - filename: 'renderer.prod.js' + filename: 'renderer.prod.js', }, module: { @@ -40,81 +44,81 @@ export default merge.smart(baseConfig, { { loader: MiniCssExtractPlugin.loader, options: { - publicPath: './' - } + publicPath: './', + }, }, { loader: 'css-loader', options: { - sourceMap: true - } - } - ] + sourceMap: true, + }, + }, + ], }, // Pipe other styles through css modules and append to style.css { test: /^((?!\.global).)*\.css$/, use: [ { - loader: MiniCssExtractPlugin.loader + loader: MiniCssExtractPlugin.loader, }, { loader: 'css-loader', options: { modules: { - localIdentName: '[name]__[local]__[hash:base64:5]' + localIdentName: '[name]__[local]__[hash:base64:5]', }, - sourceMap: true - } - } - ] + sourceMap: true, + }, + }, + ], }, // Add SASS support - compile all .global.scss files and pipe it to style.css { test: /\.global\.(scss|sass)$/, use: [ { - loader: MiniCssExtractPlugin.loader + loader: MiniCssExtractPlugin.loader, }, { loader: 'css-loader', options: { sourceMap: true, - importLoaders: 1 - } + importLoaders: 1, + }, }, { loader: 'sass-loader', options: { - sourceMap: true - } - } - ] + sourceMap: true, + }, + }, + ], }, // Add SASS support - compile all other .scss files and pipe it to style.css { test: /^((?!\.global).)*\.(scss|sass)$/, use: [ { - loader: MiniCssExtractPlugin.loader + loader: MiniCssExtractPlugin.loader, }, { loader: 'css-loader', options: { modules: { - localIdentName: '[name]__[local]__[hash:base64:5]' + localIdentName: '[name]__[local]__[hash:base64:5]', }, importLoaders: 1, - sourceMap: true - } + sourceMap: true, + }, }, { loader: 'sass-loader', options: { - sourceMap: true - } - } - ] + sourceMap: true, + }, + }, + ], }, // WOFF Font { @@ -123,9 +127,9 @@ export default merge.smart(baseConfig, { loader: 'url-loader', options: { limit: 10000, - mimetype: 'application/font-woff' - } - } + mimetype: 'application/font-woff', + }, + }, }, // WOFF2 Font { @@ -134,9 +138,9 @@ export default merge.smart(baseConfig, { loader: 'url-loader', options: { limit: 10000, - mimetype: 'application/font-woff' - } - } + mimetype: 'application/font-woff', + }, + }, }, // TTF Font { @@ -145,14 +149,14 @@ export default merge.smart(baseConfig, { loader: 'url-loader', options: { limit: 10000, - mimetype: 'application/octet-stream' - } - } + mimetype: 'application/octet-stream', + }, + }, }, // EOT Font { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, - use: 'file-loader' + use: 'file-loader', }, // SVG Font { @@ -161,16 +165,16 @@ export default merge.smart(baseConfig, { loader: 'url-loader', options: { limit: 10000, - mimetype: 'image/svg+xml' - } - } + mimetype: 'image/svg+xml', + }, + }, }, // Common Image Formats { test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, - use: 'url-loader' - } - ] + use: 'url-loader', + }, + ], }, optimization: { @@ -180,17 +184,17 @@ export default merge.smart(baseConfig, { new TerserPlugin({ parallel: true, sourceMap: true, - cache: true + cache: true, }), new OptimizeCSSAssetsPlugin({ cssProcessorOptions: { map: { inline: false, - annotation: true - } - } - }) - ] + annotation: true, + }, + }, + }), + ], }, plugins: [ @@ -206,17 +210,17 @@ export default merge.smart(baseConfig, { new webpack.EnvironmentPlugin({ NODE_ENV: 'production', DEBUG_PROD: false, - E2E_BUILD: false + E2E_BUILD: false, }), new MiniCssExtractPlugin({ - filename: 'style.css' + filename: 'style.css', }), new BundleAnalyzerPlugin({ analyzerMode: process.env.OPEN_ANALYZER === 'true' ? 'server' : 'disabled', - openAnalyzer: process.env.OPEN_ANALYZER === 'true' - }) - ] + openAnalyzer: process.env.OPEN_ANALYZER === 'true', + }), + ], }); diff --git a/internals/scripts/BabelRegister.js b/internals/scripts/BabelRegister.js index 9608e76e..bf41c5af 100644 --- a/internals/scripts/BabelRegister.js +++ b/internals/scripts/BabelRegister.js @@ -2,5 +2,5 @@ const path = require('path'); require('@babel/register')({ extensions: ['.es6', '.es', '.jsx', '.js', '.mjs', '.ts', '.tsx'], - cwd: path.join(__dirname, '..', '..') + cwd: path.join(__dirname, '..', '..'), }); diff --git a/internals/scripts/CheckNativeDep.js b/internals/scripts/CheckNativeDep.js index 1acf39ec..1f0c4390 100644 --- a/internals/scripts/CheckNativeDep.js +++ b/internals/scripts/CheckNativeDep.js @@ -7,7 +7,7 @@ if (dependencies) { const dependenciesKeys = Object.keys(dependencies); const nativeDeps = fs .readdirSync('node_modules') - .filter(folder => fs.existsSync(`node_modules/${folder}/binding.gyp`)); + .filter((folder) => fs.existsSync(`node_modules/${folder}/binding.gyp`)); try { // Find the reason for why the dependency is installed. If it is installed // because of a devDependency then that is okay. Warn when it is installed @@ -16,7 +16,7 @@ if (dependencies) { execSync(`npm ls ${nativeDeps.join(' ')} --json`).toString() ); const rootDependencies = Object.keys(dependenciesObject); - const filteredRootDependencies = rootDependencies.filter(rootDependency => + const filteredRootDependencies = rootDependencies.filter((rootDependency) => dependenciesKeys.includes(rootDependency) ); if (filteredRootDependencies.length > 0) { diff --git a/internals/scripts/ElectronRebuild.js b/internals/scripts/ElectronRebuild.js index 2bff677c..e89a4f66 100644 --- a/internals/scripts/ElectronRebuild.js +++ b/internals/scripts/ElectronRebuild.js @@ -17,6 +17,6 @@ if ( : electronRebuildCmd; execSync(cmd, { cwd: path.join(__dirname, '..', '..', 'app'), - stdio: 'inherit' + stdio: 'inherit', }); } From 2eb02a708c2ec4fcf431c4f5f18023e74a2aff51 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 9 Aug 2020 13:21:30 -0400 Subject: [PATCH 39/66] updated app index and main --- app/index.tsx | 8 +++-- app/main.dev.ts | 21 +++++++---- app/menu.ts | 94 ++++++++++++++++++++++++------------------------- 3 files changed, 67 insertions(+), 56 deletions(-) diff --git a/app/index.tsx b/app/index.tsx index 60b2ae7d..91609b27 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -9,11 +9,13 @@ const store = configureStore(); const AppContainer = process.env.PLAIN_HMR ? Fragment : ReactHotAppContainer; -document.addEventListener('DOMContentLoaded', () => +document.addEventListener('DOMContentLoaded', () => { + // eslint-disable-next-line global-require + const Root = require('./containers/Root').default; render( , document.getElementById('root') - ) -); + ); +}); diff --git a/app/main.dev.ts b/app/main.dev.ts index 55f49601..28ce3ced 100644 --- a/app/main.dev.ts +++ b/app/main.dev.ts @@ -8,6 +8,8 @@ * When running `yarn build` or `yarn build-main`, this file is compiled to * `./app/main.prod.js` using webpack. This gives us some performance wins. */ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; import { app, BrowserWindow, ipcMain } from 'electron'; import path from 'path'; import { autoUpdater } from 'electron-updater'; @@ -52,7 +54,7 @@ const installExtensions = async () => { const extensions = ['REACT_DEVELOPER_TOOLS', 'REDUX_DEVTOOLS']; return Promise.all( - extensions.map(name => installer.default(installer[name], forceDownload)) + extensions.map((name) => installer.default(installer[name], forceDownload)) ).catch(console.log); }; @@ -69,13 +71,15 @@ const createWindow = async () => { width: 1280, height: 800, webPreferences: - process.env.NODE_ENV === 'development' || process.env.E2E_BUILD === 'true' + (process.env.NODE_ENV === 'development' || + process.env.E2E_BUILD === 'true') && + process.env.ERB_SECURE !== 'true' ? { - nodeIntegration: true + nodeIntegration: true, } : { - preload: path.join(__dirname, 'dist/renderer.prod.js') - } + preload: path.join(__dirname, 'dist/renderer.prod.js'), + }, }); mainWindow.setMinimumSize(1075, 708); @@ -127,7 +131,12 @@ app.on('window-all-closed', () => { } }); -app.on('ready', createWindow); +if (process.env.E2E_BUILD === 'true') { + // eslint-disable-next-line promise/catch-or-return + app.whenReady().then(createWindow); +} else { + app.on('ready', createWindow); +} app.on('activate', () => { // On macOS it's common to re-create a window in the app when the diff --git a/app/menu.ts b/app/menu.ts index 77a32684..c8b9466b 100644 --- a/app/menu.ts +++ b/app/menu.ts @@ -4,7 +4,7 @@ import { Menu, shell, BrowserWindow, - MenuItemConstructorOptions + MenuItemConstructorOptions, } from 'electron'; interface DarwinMenuItemConstructorOptions extends MenuItemConstructorOptions { @@ -47,8 +47,8 @@ export default class MenuBuilder { label: 'Inspect element', click: () => { this.mainWindow.webContents.inspectElement(x, y); - } - } + }, + }, ]).popup({ window: this.mainWindow }); }); } @@ -59,7 +59,7 @@ export default class MenuBuilder { submenu: [ { label: 'About BrainWaves', - selector: 'orderFrontStandardAboutPanel:' + selector: 'orderFrontStandardAboutPanel:', }, { type: 'separator' }, { label: 'Services', submenu: [] }, @@ -67,12 +67,12 @@ export default class MenuBuilder { { label: 'Hide ElectronReact', accelerator: 'Command+H', - selector: 'hide:' + selector: 'hide:', }, { label: 'Hide Others', accelerator: 'Command+Shift+H', - selector: 'hideOtherApplications:' + selector: 'hideOtherApplications:', }, { label: 'Show All', selector: 'unhideAllApplications:' }, { type: 'separator' }, @@ -81,9 +81,9 @@ export default class MenuBuilder { accelerator: 'Command+Q', click: () => { app.quit(); - } - } - ] + }, + }, + ], }; const subMenuEdit: DarwinMenuItemConstructorOptions = { label: 'Edit', @@ -97,9 +97,9 @@ export default class MenuBuilder { { label: 'Select All', accelerator: 'Command+A', - selector: 'selectAll:' - } - ] + selector: 'selectAll:', + }, + ], }; const subMenuViewDev: MenuItemConstructorOptions = { label: 'View', @@ -109,23 +109,23 @@ export default class MenuBuilder { accelerator: 'Command+R', click: () => { this.mainWindow.webContents.reload(); - } + }, }, { label: 'Toggle Full Screen', accelerator: 'Ctrl+Command+F', click: () => { this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - } + }, }, { label: 'Toggle Developer Tools', accelerator: 'Alt+Command+I', click: () => { this.mainWindow.webContents.toggleDevTools(); - } - } - ] + }, + }, + ], }; const subMenuViewProd: MenuItemConstructorOptions = { label: 'View', @@ -135,9 +135,9 @@ export default class MenuBuilder { accelerator: 'Ctrl+Command+F', click: () => { this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - } - } - ] + }, + }, + ], }; const subMenuWindow: DarwinMenuItemConstructorOptions = { label: 'Window', @@ -145,12 +145,12 @@ export default class MenuBuilder { { label: 'Minimize', accelerator: 'Command+M', - selector: 'performMiniaturize:' + selector: 'performMiniaturize:', }, { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' }, { type: 'separator' }, - { label: 'Bring All to Front', selector: 'arrangeInFront:' } - ] + { label: 'Bring All to Front', selector: 'arrangeInFront:' }, + ], }; const subMenuHelp: MenuItemConstructorOptions = { label: 'Help', @@ -159,7 +159,7 @@ export default class MenuBuilder { label: 'Learn More', click() { shell.openExternal('https://electronjs.org'); - } + }, }, { label: 'Documentation', @@ -167,21 +167,21 @@ export default class MenuBuilder { shell.openExternal( 'https://github.com/electron/electron/tree/master/docs#readme' ); - } + }, }, { label: 'Community Discussions', click() { shell.openExternal('https://www.electronjs.org/community'); - } + }, }, { label: 'Search Issues', click() { shell.openExternal('https://github.com/electron/electron/issues'); - } - } - ] + }, + }, + ], }; const subMenuView = @@ -200,16 +200,16 @@ export default class MenuBuilder { submenu: [ { label: '&Open', - accelerator: 'Ctrl+O' + accelerator: 'Ctrl+O', }, { label: '&Close', accelerator: 'Ctrl+W', click: () => { this.mainWindow.close(); - } - } - ] + }, + }, + ], }, { label: '&View', @@ -222,7 +222,7 @@ export default class MenuBuilder { accelerator: 'Ctrl+R', click: () => { this.mainWindow.webContents.reload(); - } + }, }, { label: 'Toggle &Full Screen', @@ -231,15 +231,15 @@ export default class MenuBuilder { this.mainWindow.setFullScreen( !this.mainWindow.isFullScreen() ); - } + }, }, { label: 'Toggle &Developer Tools', accelerator: 'Alt+Ctrl+I', click: () => { this.mainWindow.webContents.toggleDevTools(); - } - } + }, + }, ] : [ { @@ -249,9 +249,9 @@ export default class MenuBuilder { this.mainWindow.setFullScreen( !this.mainWindow.isFullScreen() ); - } - } - ] + }, + }, + ], }, { label: 'Help', @@ -260,7 +260,7 @@ export default class MenuBuilder { label: 'Learn More', click() { shell.openExternal('https://electronjs.org'); - } + }, }, { label: 'Documentation', @@ -268,22 +268,22 @@ export default class MenuBuilder { shell.openExternal( 'https://github.com/electron/electron/tree/master/docs#readme' ); - } + }, }, { label: 'Community Discussions', click() { shell.openExternal('https://www.electronjs.org/community'); - } + }, }, { label: 'Search Issues', click() { shell.openExternal('https://github.com/electron/electron/issues'); - } - } - ] - } + }, + }, + ], + }, ]; return templateDefault; From 2b3485b047096f4e5957e74c2c14b649c1dac99c Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 9 Aug 2020 13:21:44 -0400 Subject: [PATCH 40/66] other minor updates --- .eslintignore | 1 + .eslintrc.js | 20 +++++++++++++++----- babel.config.js | 14 +++++++------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/.eslintignore b/.eslintignore index efe3eacb..d45a9773 100644 --- a/.eslintignore +++ b/.eslintignore @@ -33,6 +33,7 @@ app/node_modules # App packaged release +app/*.main.prod.js app/main.prod.js app/main.prod.js.map app/renderer.prod.js diff --git a/.eslintrc.js b/.eslintrc.js index 7169cd38..0a08e825 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -27,15 +27,25 @@ module.exports = { 'react/no-will-update-set-state': 'warn', 'react/prop-types': 'off', 'react/static-property-placement': 'off', - 'react/no-array-index-key': 'off' + 'react/no-array-index-key': 'off', + }, + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module', + project: './tsconfig.json', + tsconfigRootDir: __dirname, + createDefaultProgram: true, }, settings: { 'import/resolver': { // See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below node: {}, webpack: { - config: require.resolve('./configs/webpack.config.eslint.js') - } - } - } + config: require.resolve('./configs/webpack.config.eslint.js'), + }, + }, + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + }, }; diff --git a/babel.config.js b/babel.config.js index 51d89736..efad5dcd 100644 --- a/babel.config.js +++ b/babel.config.js @@ -10,10 +10,10 @@ const productionPlugins = [ // babel-preset-react-optimize require('@babel/plugin-transform-react-constant-elements'), require('@babel/plugin-transform-react-inline-elements'), - require('babel-plugin-transform-react-remove-prop-types') + require('babel-plugin-transform-react-remove-prop-types'), ]; -module.exports = api => { +module.exports = (api) => { // See docs about api at https://babeljs.io/docs/en/config-files#apicache const development = api.env(developmentEnvironments); @@ -23,7 +23,7 @@ module.exports = api => { // @babel/preset-env will automatically target our browserslist targets require('@babel/preset-env'), require('@babel/preset-typescript'), - [require('@babel/preset-react'), { development }] + [require('@babel/preset-react'), { development }], ], plugins: [ // Stage 0 @@ -35,11 +35,11 @@ module.exports = api => { [require('@babel/plugin-proposal-optional-chaining'), { loose: false }], [ require('@babel/plugin-proposal-pipeline-operator'), - { proposal: 'minimal' } + { proposal: 'minimal' }, ], [ require('@babel/plugin-proposal-nullish-coalescing-operator'), - { loose: false } + { loose: false }, ], require('@babel/plugin-proposal-do-expressions'), @@ -56,7 +56,7 @@ module.exports = api => { [require('@babel/plugin-proposal-class-properties'), { loose: true }], require('@babel/plugin-proposal-json-strings'), - ...(development ? developmentPlugins : productionPlugins) - ] + ...(development ? developmentPlugins : productionPlugins), + ], }; }; From f8fb6039e8f11ed18c83892c158f13439e6bd72d Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 9 Aug 2020 13:55:04 -0400 Subject: [PATCH 41/66] Fixed some build issues after upgrade and upgraded yarn lock --- app/app.global.css | 5 +- app/main.dev.ts | 8 +- app/main.prod.js.LICENSE.txt | 1 + app/package.json | 2 +- package.json | 5 +- yarn.lock | 4792 +++++++++++++++------------------- 6 files changed, 2153 insertions(+), 2660 deletions(-) create mode 100644 app/main.prod.js.LICENSE.txt diff --git a/app/app.global.css b/app/app.global.css index eaf04f1f..e2ffa968 100644 --- a/app/app.global.css +++ b/app/app.global.css @@ -2,7 +2,6 @@ * @NOTE: Prepend a `~` to css file paths that are in your node_modules * See https://github.com/webpack-contrib/sass-loader#imports */ -@import '~font-awesome/css/font-awesome.css'; @import '~semantic-ui-css/semantic.min.css'; @import '~rc-slider/assets/index.css'; @import '~react-toastify/dist/ReactToastify.css'; @@ -222,11 +221,11 @@ button:active { /* rc-slider-related styles */ .rc-slider-rail { - background-color: #cccccc !important; + background-color: #ccc !important; } .rc-slider-track { - background-color: #cccccc !important; + background-color: #ccc !important; } .rc-slider-dot { diff --git a/app/main.dev.ts b/app/main.dev.ts index 28ce3ced..7264fce4 100644 --- a/app/main.dev.ts +++ b/app/main.dev.ts @@ -101,6 +101,7 @@ const createWindow = async () => { mainWindow.show(); mainWindow.focus(); } + mainWindow.webContents.openDevTools(); }); mainWindow.on('closed', () => { @@ -114,10 +115,9 @@ const createWindow = async () => { new AppUpdater(); mainWindow.setMenu(null); - if (process.env.NODE_ENV === 'development') { - // Devtools don't exist? - mainWindow.webContents.openDevTools(); - } + // if (process.env.NODE_ENV === 'development') { + // mainWindow.webContents.openDevTools(); + // } }; /** diff --git a/app/main.prod.js.LICENSE.txt b/app/main.prod.js.LICENSE.txt new file mode 100644 index 00000000..15036cdc --- /dev/null +++ b/app/main.prod.js.LICENSE.txt @@ -0,0 +1 @@ +/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */ diff --git a/app/package.json b/app/package.json index 4f3f7039..3b825e28 100644 --- a/app/package.json +++ b/app/package.json @@ -18,6 +18,7 @@ "dependencies": { "@neurosity/pipes": "^3.2.3", "@babel/runtime": "7.10.2", + "@babel/runtime-corejs2": "^7.10.2", "bleat": "^0.1.9", "enchannel-zmq-backend": "^9.1.22", "kernelspecs": "^2.0.0", @@ -27,7 +28,6 @@ }, "devDependencies": { "@babel/register": "^7.10.1", - "@babel/runtime-corejs2": "^7.10.2", "patch-package": "^6.2.2" } } diff --git a/package.json b/package.json index 5a3c491c..bc4450e5 100644 --- a/package.json +++ b/package.json @@ -282,7 +282,6 @@ "electron-debug": "^3.1.0", "electron-log": "^4.2.2", "electron-updater": "^4.3.1", - "font-awesome": "^4.7.0", "hazardous": "^0.3.0", "history": "^4.7.2", "kernelspecs": "^2.0.0", @@ -326,9 +325,7 @@ "npm": ">=4.x", "yarn": ">=0.21.3" }, - "browserslist": [ - "extends browserslist-config-erb" - ], + "browserslist": [], "prettier": { "overrides": [ { diff --git a/yarn.lock b/yarn.lock index 1b73d4f2..8ac30878 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21,6 +21,25 @@ resolved "https://registry.yarnpkg.com/7zip/-/7zip-0.0.6.tgz#9cafb171af82329490353b4816f03347aa150a30" integrity sha1-nK+xca+CMpSQNTtIFvAzR6oVCjA= +"@amilajack/testcafe-browser-provider-electron@^0.0.15-alpha.1": + version "0.0.15-alpha.1" + resolved "https://registry.yarnpkg.com/@amilajack/testcafe-browser-provider-electron/-/testcafe-browser-provider-electron-0.0.15-alpha.1.tgz#506080ec623c1509fae489b13cb2a2894ec6fbb9" + integrity sha512-05JwzcV59rxArehDWPM0Lw4YNvVr5c3J/j2ikJeQKHAQSoA0TsRSdqSMjGDaT8LGem0HAATPLh7hRhI481alIQ== + dependencies: + babel-runtime "^6.25.0" + chrome-remote-interface "^0.27.0" + debug "4.1.1" + dedent "^0.7.0" + endpoint-utils "^1.0.2" + lodash "^4.17.4" + mustache "^2.3.0" + node-ipc "^9.1.0" + os-family "^1.0.0" + pify "^2.3.0" + pinkie "^2.0.4" + promisify-event "^1.0.0" + proxyquire "^1.7.10" + "@ant-design/css-animation@^1.7.2": version "1.7.2" resolved "https://registry.yarnpkg.com/@ant-design/css-animation/-/css-animation-1.7.2.tgz#4ee5d2ec0fb7cc0a78b44e1c82628bd4621ac7e3" @@ -33,16 +52,23 @@ dependencies: "@babel/highlight" "^7.10.3" -"@babel/compat-data@^7.10.1", "@babel/compat-data@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.3.tgz#9af3e033f36e8e2d6e47570db91e64a846f5d382" - integrity sha512-BDIfJ9uNZuI0LajPfoYV28lX8kyCPMHY6uY4WH1lJdcicmAfxCK5ASzaeV0D/wsUaRH/cLk+amuxtC37sZ8TUg== +"@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" + integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== dependencies: browserslist "^4.12.0" invariant "^2.2.4" semver "^5.5.0" -"@babel/core@>=7.9.0", "@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.10.2", "@babel/core@^7.7.5": +"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.7.5": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.3.tgz#73b0e8ddeec1e3fdd7a2de587a60e17c440ec77e" integrity sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w== @@ -64,6 +90,28 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.11.1": + version "7.11.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" + integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.0" + "@babel/helper-module-transforms" "^7.11.0" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.11.1" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.11.0" + "@babel/types" "^7.11.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.0.0-beta.44", "@babel/generator@^7.10.3": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.3.tgz#32b9a0d963a71d7a54f5f6c15659c3dbc2a523a5" @@ -74,6 +122,15 @@ lodash "^4.17.13" source-map "^0.5.0" +"@babel/generator@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" + integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== + dependencies: + "@babel/types" "^7.11.0" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" @@ -81,55 +138,62 @@ dependencies: "@babel/types" "^7.10.1" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.3.tgz#4e9012d6701bef0030348d7f9c808209bd3e8687" - integrity sha512-lo4XXRnBlU6eRM92FkiZxpo1xFLmv3VsPFk61zJKMm7XYJfwqXHsYJTY6agoc4a3L8QPw1HqWehO18coZgbT6A== +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== dependencies: - "@babel/helper-explode-assignable-expression" "^7.10.3" - "@babel/types" "^7.10.3" + "@babel/types" "^7.10.4" -"@babel/helper-builder-react-jsx-experimental@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz#9a7d58ad184d3ac3bafb1a452cec2bad7e4a0bc8" - integrity sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-module-imports" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-builder-react-jsx@^7.10.1", "@babel/helper-builder-react-jsx@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.3.tgz#62c4b7bb381153a0a5f8d83189b94b9fb5384fc5" - integrity sha512-vkxmuFvmovtqTZknyMGj9+uQAZzz5Z9mrbnkJnPkaYGfKTaSsYcjQdXP0lgrWLVh8wU6bCjOmXOpx+kqUi+S5Q== +"@babel/helper-builder-react-jsx-experimental@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz#f35e956a19955ff08c1258e44a515a6d6248646b" + integrity sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/types" "^7.10.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/types" "^7.10.5" -"@babel/helper-compilation-targets@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285" - integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA== +"@babel/helper-builder-react-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d" + integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg== dependencies: - "@babel/compat-data" "^7.10.1" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-compilation-targets@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" + integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== + dependencies: + "@babel/compat-data" "^7.10.4" browserslist "^4.12.0" invariant "^2.2.4" levenary "^1.1.1" semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.10.1", "@babel/helper-create-class-features-plugin@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.3.tgz#2783daa6866822e3d5ed119163b50f0fc3ae4b35" - integrity sha512-iRT9VwqtdFmv7UheJWthGc/h2s7MqoweBF9RUj77NFZsg9VfISvBTum3k6coAhJ8RWv2tj3yUjA03HxPd0vfpQ== +"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" + integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== dependencies: - "@babel/helper-function-name" "^7.10.3" - "@babel/helper-member-expression-to-functions" "^7.10.3" - "@babel/helper-optimise-call-expression" "^7.10.3" - "@babel/helper-plugin-utils" "^7.10.3" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.10.5" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" -"@babel/helper-create-regexp-features-plugin@^7.10.1", "@babel/helper-create-regexp-features-plugin@^7.8.3": +"@babel/helper-create-regexp-features-plugin@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd" integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA== @@ -138,24 +202,33 @@ "@babel/helper-regex" "^7.10.1" regexpu-core "^4.7.0" -"@babel/helper-define-map@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.3.tgz#d27120a5e57c84727b30944549b2dfeca62401a8" - integrity sha512-bxRzDi4Sin/k0drWCczppOhov1sBSdBvXJObM1NLHQzjhXhwRtn7aRWGvLJWCYbuu2qUk3EKs6Ci9C9ps8XokQ== +"@babel/helper-create-regexp-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" + integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== dependencies: - "@babel/helper-function-name" "^7.10.3" - "@babel/types" "^7.10.3" - lodash "^4.17.13" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + regexpu-core "^4.7.0" -"@babel/helper-explode-assignable-expression@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.3.tgz#9dc14f0cfa2833ea830a9c8a1c742b6e7461b05e" - integrity sha512-0nKcR64XrOC3lsl+uhD15cwxPvaB6QKUDlD84OT9C3myRbhJqTMYir69/RWItUvHpharv0eJ/wk7fl34ONSwZw== +"@babel/helper-define-map@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== dependencies: - "@babel/traverse" "^7.10.3" - "@babel/types" "^7.10.3" + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" + +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" + integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A== + dependencies: + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.10.3": +"@babel/helper-function-name@^7.10.3": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz#79316cd75a9fa25ba9787ff54544307ed444f197" integrity sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw== @@ -164,34 +237,64 @@ "@babel/template" "^7.10.3" "@babel/types" "^7.10.3" -"@babel/helper-get-function-arity@^7.10.1", "@babel/helper-get-function-arity@^7.10.3": +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.10.3": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz#3a28f7b28ccc7719eacd9223b659fdf162e4c45e" integrity sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg== dependencies: "@babel/types" "^7.10.3" -"@babel/helper-hoist-variables@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.3.tgz#d554f52baf1657ffbd7e5137311abc993bb3f068" - integrity sha512-9JyafKoBt5h20Yv1+BXQMdcXXavozI1vt401KBiRc2qzUepbVnd7ogVNymY1xkQN9fekGwfxtotH2Yf5xsGzgg== +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== dependencies: - "@babel/types" "^7.10.3" + "@babel/types" "^7.10.4" -"@babel/helper-member-expression-to-functions@^7.10.1", "@babel/helper-member-expression-to-functions@^7.10.3": +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.10.1": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz#bc3663ac81ac57c39148fef4c69bf48a77ba8dd6" integrity sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw== dependencies: "@babel/types" "^7.10.3" -"@babel/helper-module-imports@^7.0.0-beta.44", "@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.10.3": +"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" + integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-module-imports@^7.0.0-beta.44", "@babel/helper-module-imports@^7.10.1": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz#766fa1d57608e53e5676f23ae498ec7a95e1b11a" integrity sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w== dependencies: "@babel/types" "^7.10.3" +"@babel/helper-module-imports@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== + dependencies: + "@babel/types" "^7.10.4" + "@babel/helper-module-transforms@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" @@ -205,18 +308,43 @@ "@babel/types" "^7.10.1" lodash "^4.17.13" -"@babel/helper-optimise-call-expression@^7.10.1", "@babel/helper-optimise-call-expression@^7.10.3": +"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" + integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/types" "^7.11.0" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.1": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz#f53c4b6783093195b0f69330439908841660c530" integrity sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg== dependencies: "@babel/types" "^7.10.3" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.10.3", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz#aac45cccf8bc1873b99a85f34bceef3beb5d3244" integrity sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g== +"@babel/helper-plugin-utils@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + "@babel/helper-regex@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96" @@ -224,16 +352,23 @@ dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.10.1", "@babel/helper-remap-async-to-generator@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.3.tgz#18564f8a6748be466970195b876e8bba3bccf442" - integrity sha512-sLB7666ARbJUGDO60ZormmhQOyqMX/shKBXZ7fy937s+3ID8gSrneMvKSSb+8xIM5V7Vn6uNVtOY1vIm26XLtA== +"@babel/helper-regex@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" + integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-wrap-function" "^7.10.1" - "@babel/template" "^7.10.3" - "@babel/traverse" "^7.10.3" - "@babel/types" "^7.10.3" + lodash "^4.17.19" + +"@babel/helper-remap-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5" + integrity sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helper-replace-supers@^7.10.1": version "7.10.1" @@ -245,6 +380,16 @@ "@babel/traverse" "^7.10.1" "@babel/types" "^7.10.1" +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + "@babel/helper-simple-access@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" @@ -253,6 +398,21 @@ "@babel/template" "^7.10.1" "@babel/types" "^7.10.1" +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== + dependencies: + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-skip-transparent-expression-wrappers@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" + integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== + dependencies: + "@babel/types" "^7.11.0" + "@babel/helper-split-export-declaration@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" @@ -260,20 +420,32 @@ dependencies: "@babel/types" "^7.10.1" +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== + dependencies: + "@babel/types" "^7.11.0" + "@babel/helper-validator-identifier@^7.10.3": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz#60d9847f98c4cea1b279e005fdb7c28be5412d15" integrity sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw== -"@babel/helper-wrap-function@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9" - integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ== +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helper-wrap-function@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" + integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helpers@^7.10.1": version "7.10.1" @@ -284,6 +456,15 @@ "@babel/traverse" "^7.10.1" "@babel/types" "^7.10.1" +"@babel/helpers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + "@babel/highlight@^7.10.3": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.3.tgz#c633bb34adf07c5c13156692f5922c81ec53f28d" @@ -293,168 +474,191 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.10.3", "@babel/parser@^7.7.0": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.3.tgz#7e71d892b0d6e7d04a1af4c3c79d72c1f10f5315" integrity sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA== -"@babel/plugin-proposal-async-generator-functions@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.3.tgz#5a02453d46e5362e2073c7278beab2e53ad7d939" - integrity sha512-WUUWM7YTOudF4jZBAJIW9D7aViYC/Fn0Pln4RIHlQALyno3sXSjqmTA4Zy1TKC2D49RCR8Y/Pn4OIUtEypK3CA== +"@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1": + version "7.11.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.3.tgz#9e1eae46738bcd08e23e867bab43e7b95299a8f9" + integrity sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA== + +"@babel/plugin-proposal-async-generator-functions@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" + integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== dependencies: - "@babel/helper-plugin-utils" "^7.10.3" - "@babel/helper-remap-async-to-generator" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01" - integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw== +"@babel/plugin-proposal-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" + integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-decorators@^7.10.1": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.3.tgz#2fc6b5696028adccfcd14bc826c184c578b857f8" - integrity sha512-Rzwn5tcYFTdWWK3IrhMZkMDjzFQLIGYqHvv9XuzNnEB91Y6gHr/JjazYV1Yec9g0yMLhy1p/21eiW1P7f5UN4A== +"@babel/plugin-proposal-decorators@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.5.tgz#42898bba478bc4b1ae242a703a953a7ad350ffb4" + integrity sha512-Sc5TAQSZuLzgY0664mMDn24Vw2P8g/VhyLyGPaWiHahhgLqeZvcGeyBZOrJW0oSKIK2mvQ22a1ENXBIQLhrEiQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.3" - "@babel/helper-plugin-utils" "^7.10.3" - "@babel/plugin-syntax-decorators" "^7.10.1" + "@babel/helper-create-class-features-plugin" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-decorators" "^7.10.4" -"@babel/plugin-proposal-do-expressions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.10.1.tgz#ef99f594320f38c300ed2404d6ca83b00c858905" - integrity sha512-rjAoAQl6YLsY9C60zQBVTBsDP8YUWlgSv7qRdG8rapQYl+WL1LIVq23SHDCPllaNrE8bqO9csBooTL4yXr7FnA== +"@babel/plugin-proposal-do-expressions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.10.4.tgz#9a5190f3bf4818f83e41d673ee517ff76cf8e4ed" + integrity sha512-Gcc2wLVeMceRdP6m9tdDygP01lbUVmaQGBRoIRJZxzPfB5VTiUgmn1jGfORgqbEVgUpG0IQm/z4q5Y/qzG+8JQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-do-expressions" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-do-expressions" "^7.10.4" -"@babel/plugin-proposal-dynamic-import@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0" - integrity sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA== +"@babel/plugin-proposal-dynamic-import@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" + integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-export-default-from@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.10.1.tgz#59ea2a4f09dbb0358c73dab27def3d21a27bd370" - integrity sha512-Xfc1CfHapIkwZ/+AI+j4Ha3g233ol0EEdy6SmnUuQQiZX78SfQXHd8tmntc5zqCkwPnIHoiZa6l6p0OAvxYXHw== +"@babel/plugin-proposal-export-default-from@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.10.4.tgz#08f66eef0067cbf6a7bc036977dcdccecaf0c6c5" + integrity sha512-G1l00VvDZ7Yk2yRlC5D8Ybvu3gmeHS3rCHoUYdjrqGYUtdeOBoRypnvDZ5KQqxyaiiGHWnVDeSEzA5F9ozItig== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-export-default-from" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-export-default-from" "^7.10.4" -"@babel/plugin-proposal-export-namespace-from@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.1.tgz#512ee069cd866256600bdf89639cf7e1b51fbfe9" - integrity sha512-eR4CoYb6mh5y9LWjnb4CyUatuhtZ8pNLXLDi46GkqtF7WPafFqXycHdvF5qWviozZVGRSAmHzdayc8wUReCdjA== +"@babel/plugin-proposal-export-namespace-from@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" + integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-function-bind@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.10.1.tgz#155ec493b2b883fe5f5b8da114396bc54d188a5c" - integrity sha512-NgVBGHC8kpnyPP0LtRRe5ElE/17QoAKf3BoqQY+A7MqBsPK+DorfyeRo27EU4f/i49MDdFAXz2yZvhUnHFOxmQ== +"@babel/plugin-proposal-function-bind@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.10.5.tgz#62acbdde1c43e7dfae6efc9ddd5bc60920cee719" + integrity sha512-1lYbE2ynV9yN0LCEYCdEBD5pR6GaNkRfjn1z1tWDdWMJgunTFcJBZDJUgiMPcTMqAc3D6Vrm8v2khxjjx6FrCg== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-function-bind" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-function-bind" "^7.10.4" -"@babel/plugin-proposal-function-sent@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.10.1.tgz#e9ffe9df5348e2694d6679f8fd0897acf14326d7" - integrity sha512-mpfEbRcwHvDA6k19ZFsGkW4Q+AF7DekafKTTfn2Ihz1cs6/qL+KgAJlcHBY6XnW1OW1zDaNCR0i28Blonl8/Bg== +"@babel/plugin-proposal-function-sent@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.10.4.tgz#05f2daef7b3f09b6c74c9e8a85b430272d206ac4" + integrity sha512-aBtve/DhQsVPAGnSDcgt33gF36rO0TK+KtHp9Hwtj3KwH+o1Cii9vfVVYeB9c6Jo1SXOgTRwRD7ljpTS0qbN8w== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-wrap-function" "^7.10.1" - "@babel/plugin-syntax-function-sent" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/plugin-syntax-function-sent" "^7.10.4" -"@babel/plugin-proposal-json-strings@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz#b1e691ee24c651b5a5e32213222b2379734aff09" - integrity sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg== +"@babel/plugin-proposal-json-strings@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" + integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-logical-assignment-operators@^7.10.1": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.10.3.tgz#efae900a91f76ad07dbd50142108e8cd602fee44" - integrity sha512-9uievCCgqOa7VDyMDXlTp5U+0bXu0ubMQL2ek5M1mrwQIY2T9Fx6PUpx/0Eh/8XZice1hzZZo3CJx0wHcDVqNQ== +"@babel/plugin-proposal-logical-assignment-operators@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" + integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q== dependencies: - "@babel/helper-plugin-utils" "^7.10.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78" - integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" + integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz#a9a38bc34f78bdfd981e791c27c6fdcec478c123" - integrity sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA== +"@babel/plugin-proposal-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" + integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-numeric-separator" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.3.tgz#b8d0d22f70afa34ad84b7a200ff772f9b9fce474" - integrity sha512-ZZh5leCIlH9lni5bU/wB/UcjtcVLgR8gc+FAgW2OOY+m9h1II3ItTO1/cewNUcsIDZSYcSaz/rYVls+Fb0ExVQ== +"@babel/plugin-proposal-object-rest-spread@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" + integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== dependencies: - "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.10.1" + "@babel/plugin-transform-parameters" "^7.10.4" -"@babel/plugin-proposal-optional-catch-binding@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2" - integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA== +"@babel/plugin-proposal-optional-catch-binding@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" + integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.10.1", "@babel/plugin-proposal-optional-chaining@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.3.tgz#9a726f94622b653c0a3a7a59cdce94730f526f7c" - integrity sha512-yyG3n9dJ1vZ6v5sfmIlMMZ8azQoqx/5/nZTSWX1td6L1H1bsjzA8TInDChpafCZiJkeOFzp/PtrfigAQXxI1Ng== +"@babel/plugin-proposal-optional-chaining@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" + integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== dependencies: - "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-pipeline-operator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.10.1.tgz#d7129bf1b170efef250759b82b64ce9a9b29d335" - integrity sha512-P+WKKsi7XBEvvTaregnYZIF+aLoCTNt0T21tbzeGlOdERmR1X0iFXJKqZbxsJooa+a3f/tKYFhbJYqnKt70x2w== +"@babel/plugin-proposal-pipeline-operator@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.10.5.tgz#0fa2871dbfb74efe19eeb17722032056cb5697f3" + integrity sha512-tCpZ46KUAHgFoXsH593k9sX/ZKsNb4NlTGNif8PdlmkGbtYdbTQi6zNv8yibpRf+3sQFElOBLyNo3I5ZwVu90g== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-pipeline-operator" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-pipeline-operator" "^7.10.4" -"@babel/plugin-proposal-private-methods@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz#ed85e8058ab0fe309c3f448e5e1b73ca89cdb598" - integrity sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg== +"@babel/plugin-proposal-private-methods@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" + integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-throw-expressions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.10.1.tgz#89bde971b6081bfecff832c811ad76c2337c6970" - integrity sha512-wyhTn1ebUbbphDJVVUpg1wikUOIW8Lg93ng0aDGv07+MxINPS4d0ju68JVH06W4oMnZTwgELA5AImrah9RULYA== +"@babel/plugin-proposal-throw-expressions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.10.4.tgz#501154a3c1b33cb1ad5b899204481fa2859cd3f3" + integrity sha512-m7K9duXeH/rko36i9G9seLOg2AVdeVTn65k8nnTxgozex0hkDSUr6cktJxTO7jElGEpmMz410pTs0Jn8+empxw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-throw-expressions" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-throw-expressions" "^7.10.4" -"@babel/plugin-proposal-unicode-property-regex@^7.10.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" + integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz#dc04feb25e2dd70c12b05d680190e138fa2c0c6f" integrity sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ== @@ -476,26 +680,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.10.1", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" + integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-class-properties@^7.8.3": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5" integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ== dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-syntax-decorators@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.1.tgz#16b869c4beafc9a442565147bda7ce0967bd4f13" - integrity sha512-a9OAbQhKOwSle1Vr0NJu/ISg1sPfdEkfRKWpgPuzhnWWzForou2gIeUIIwjAMHRekhhpJ7eulZlYs0H14Cbi+g== +"@babel/plugin-syntax-decorators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz#6853085b2c429f9d322d02f5a635018cdeb2360c" + integrity sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-do-expressions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.10.1.tgz#18ad0be2e2808991101c708e56d2ca5e7a9f96d9" - integrity sha512-Me/wISm2f76puo3Heyu01tthw7/8HSTn2aaiDahWD1K9oRPfzygW0eBcLIrTUdhr58MUyrSLduhUM7uZry6vzg== +"@babel/plugin-syntax-do-expressions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.10.4.tgz#0c7ebb749500c6bfa99a9f926db3bfd6cdbaded9" + integrity sha512-HyvaTg1aiwGo2I+Pu0nyurRMjIP7J89GpuZ2mcQ0fhO6Jt3BnyhEPbNJFG1hRE99NAPNfPYh93/7HO+GPVkTKg== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -504,12 +715,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.10.1.tgz#634f58f36b5d6320d80f75441fdc61e1c05c33b0" - integrity sha512-+rcL4S/mN1Ss4zhSCbxzv1Wsf12eauvgTjWi0krXEeX1zd6qSxYnJoniE5Ssr5w2WPt61oUCJyXIFQIqO/29zw== +"@babel/plugin-syntax-export-default-from@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.10.4.tgz#e5494f95006355c10292a0ff1ce42a5746002ec8" + integrity sha512-79V6r6Pgudz0RnuMGp5xidu6Z+bPFugh8/Q9eDHonmLp4wKFAZDwygJwYgCzuDu8lFA/sYyT+mc5y2wkd7bTXA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -518,28 +729,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.1.tgz#cd4bbca62fb402babacb174f64f8734310d742f0" - integrity sha512-b3pWVncLBYoPP60UOTc7NMlbtsHQ6ITim78KQejNHK6WJ2mzV5kCcg4mIWpasAfJEgwVTibwo2e+FU7UEIKQUg== +"@babel/plugin-syntax-function-bind@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.10.4.tgz#8378d94f3185ddd3008310c15fe0991cb0c85151" + integrity sha512-vF/K9yS0dpPNlT7mXSGhbdpb2f4DaLa/AYYbUqlxOggAug/oseIR1+LgAzwci4iJNlqWNmJ7aQ+llUMYjn9uhw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-function-bind@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.10.1.tgz#934b4a2fbc316ec77243957516d93083e8d3ba00" - integrity sha512-eb+muGp2AzVPYnAof+IYuTjyHsbMRKn+hVSEhCzKlPVcGemJPnv9buhDhvgcQGTo1yZnOh6O+YNWMq9g9QAalg== +"@babel/plugin-syntax-function-sent@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.10.4.tgz#b551f38b629e2e20908e53624f96f9ab300f5061" + integrity sha512-dwElaRoDQhlVevbgKOlEUTe08QNJo4ZjWw3rqnMbEvH8NRJM+iPN2tTQtzyfNloXD8f3Jdiyf5Pn400B1U3SVA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-function-sent@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.10.1.tgz#42a03af38dd7f46121c97c67d032da4749792478" - integrity sha512-Ze/5A9mFucmT7UyEA8D60YijmclEZQp3kjzbbEImWnyMLmjE/3S5x7lkCr+W7g2wc00nqk1QLsloa4+1EiHULA== +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-import-meta@^7.10.1", "@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.1.tgz#3e59120ed8b3c2ccc5abb1cfc7aaa3ea01cd36b6" integrity sha512-ypC4jwfIVF72og0dgvEcFRdOM2V9Qm1tu7RGmdZOlhsccyK0wisXmMObGuWEOd5jQ+K9wcIgSNftCpk2vkjUfQ== @@ -553,14 +764,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz#0ae371134a42b91d5418feb3c8c8d43e1565d2da" - integrity sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ== +"@babel/plugin-syntax-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz#39abaae3cbf710c4373d8429484e6ba21340166c" + integrity sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.1", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.1.tgz#fffee77b4934ce77f3b427649ecdddbec1958550" integrity sha512-XyHIFa9kdrgJS91CUH+ccPVTnJShr8nLGc5bG2IhGXv5p1Rd+8BleGE5yzIg2Nc1QZAdHDa0Qp4m6066OL96Iw== @@ -574,14 +792,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.1", "@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99" integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg== dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -602,94 +827,101 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-pipeline-operator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.10.1.tgz#07cd46978b26f21eb8c4231534a64aaa686b3cd3" - integrity sha512-6jvu8KNBnEGuwlRpAQxTHsKcYuGqSf1gAv1c7j+CP7evNU8atjCRW6pK/W1AxeTz1WXWpzciOQTK4hLfPlXKDQ== +"@babel/plugin-syntax-pipeline-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.10.4.tgz#31bf327cf780dd60e0444fd98561119795247a6c" + integrity sha512-QOmXevisZebt9pBkMdDdXWg+fndB8dT/puwSKKu/1K3P4oBwmydN/4dX1hdrNvPHbw4xE+ocIoEus7c4eh7Igg== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-throw-expressions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.10.1.tgz#09a88bacf2ad8af7a465af5e910a61d93136b147" - integrity sha512-1ieYCCX6HCEvBefYt1Njja2XFrbThi2pffdfpPeB7WzVwbX/UlVOrPw9WSPQyVoyo+kqO0l/KGRNZyrTKo0bew== +"@babel/plugin-syntax-throw-expressions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.10.4.tgz#a588df9fa2203207a3ac7e35f0db3b67bf68eca3" + integrity sha512-Yac/4W71+JdAiOV3aLbnUUe2R0NZzNvdy5EqdauFnBQTxIXT58M89lOplIFVELTSus6PxFMjmbi2vXaJDiV/PQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-top-level-await@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz#8b8733f8c57397b3eaa47ddba8841586dcaef362" - integrity sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ== +"@babel/plugin-syntax-top-level-await@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" + integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-typescript@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.1.tgz#5e82bc27bb4202b93b949b029e699db536733810" - integrity sha512-X/d8glkrAtra7CaQGMiGs/OGa6XgUzqPcBXCIGFCpCqnfGlT0Wfbzo/B89xHhnInTaItPK8LALblVXcUOEh95Q== +"@babel/plugin-syntax-typescript@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" + integrity sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b" - integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA== +"@babel/plugin-transform-arrow-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" + integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-async-to-generator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062" - integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg== +"@babel/plugin-transform-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" + integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== dependencies: - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-remap-async-to-generator" "^7.10.1" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" -"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d" - integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q== +"@babel/plugin-transform-block-scoped-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" + integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e" - integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw== +"@babel/plugin-transform-block-scoping@^7.10.4": + version "7.11.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215" + integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - lodash "^4.17.13" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.3.tgz#8d9a656bc3d01f3ff69e1fccb354b0f9d72ac544" - integrity sha512-irEX0ChJLaZVC7FvvRoSIxJlmk0IczFLcwaRXUArBKYHCHbOhe57aG8q3uw/fJsoSXvZhjRX960hyeAGlVBXZw== +"@babel/plugin-transform-classes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" + integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-define-map" "^7.10.3" - "@babel/helper-function-name" "^7.10.3" - "@babel/helper-optimise-call-expression" "^7.10.3" - "@babel/helper-plugin-utils" "^7.10.3" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.3.tgz#d3aa6eef67cb967150f76faff20f0abbf553757b" - integrity sha512-GWzhaBOsdbjVFav96drOz7FzrcEW6AP5nax0gLIpstiFaI3LOb2tAg06TimaWU6YKOfUACK3FVrxPJ4GSc5TgA== +"@babel/plugin-transform-computed-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" + integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== dependencies: - "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" - integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA== +"@babel/plugin-transform-destructuring@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" + integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-dotall-regex@^7.10.1", "@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" + integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-dotall-regex@^7.4.4": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz#920b9fec2d78bb57ebb64a644d5c2ba67cc104ee" integrity sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA== @@ -697,336 +929,333 @@ "@babel/helper-create-regexp-features-plugin" "^7.10.1" "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-duplicate-keys@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz#c900a793beb096bc9d4d0a9d0cde19518ffc83b9" - integrity sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA== +"@babel/plugin-transform-duplicate-keys@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" + integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-exponentiation-operator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3" - integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA== +"@babel/plugin-transform-exponentiation-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" + integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.1.tgz#59eafbff9ae85ec8932d4c16c068654be814ec5e" - integrity sha512-i4o0YwiJBIsIx7/liVCZ3Q2WkWr1/Yu39PksBOnh/khW2SwIFsGa5Ze+MSon5KbDfrEHP9NeyefAgvUSXzaEkw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-flow" "^7.10.1" - -"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5" - integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w== +"@babel/plugin-transform-for-of@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" + integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d" - integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw== +"@babel/plugin-transform-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" + integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a" - integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw== +"@babel/plugin-transform-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" + integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39" - integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA== +"@babel/plugin-transform-member-expression-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" + integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-amd@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a" - integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw== +"@babel/plugin-transform-modules-amd@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" + integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== dependencies: - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301" - integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg== +"@babel/plugin-transform-modules-commonjs@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" + integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== dependencies: - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-simple-access" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.3.tgz#004ae727b122b7b146b150d50cba5ffbff4ac56b" - integrity sha512-GWXWQMmE1GH4ALc7YXW56BTh/AlzvDWhUNn9ArFF0+Cz5G8esYlVbXfdyHa1xaD1j+GnBoCeoQNlwtZTVdiG/A== +"@babel/plugin-transform-modules-systemjs@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" + integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== dependencies: - "@babel/helper-hoist-variables" "^7.10.3" - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz#ea080911ffc6eb21840a5197a39ede4ee67b1595" - integrity sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA== +"@babel/plugin-transform-modules-umd@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" + integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== dependencies: - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-named-capturing-groups-regex@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.3.tgz#a4f8444d1c5a46f35834a410285f2c901c007ca6" - integrity sha512-I3EH+RMFyVi8Iy/LekQm948Z4Lz4yKT7rK+vuCAeRm0kTa6Z5W7xuhRxDNJv0FPya/her6AUgrDITb70YHtTvA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" + integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" -"@babel/plugin-transform-new-target@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz#6ee41a5e648da7632e22b6fb54012e87f612f324" - integrity sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw== +"@babel/plugin-transform-new-target@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" + integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde" - integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw== +"@babel/plugin-transform-object-super@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" + integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd" - integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg== +"@babel/plugin-transform-parameters@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" + integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== dependencies: - "@babel/helper-get-function-arity" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d" - integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA== +"@babel/plugin-transform-property-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" + integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-constant-elements@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.1.tgz#c7f117a54657cba3f9d32012e050fc89982df9e1" - integrity sha512-V4os6bkWt/jbrzfyVcZn2ZpuHZkvj3vyBU0U/dtS8SZuMS7Rfx5oknTrtfyXJ2/QZk8gX7Yls5Z921ItNpE30Q== +"@babel/plugin-transform-react-constant-elements@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz#0f485260bf1c29012bb973e7e404749eaac12c9e" + integrity sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.10.1": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.3.tgz#e3c246e1b4f3e52cc7633e237ad9194c0ec482e7" - integrity sha512-dOV44bnSW5KZ6kYF6xSHBth7TFiHHZReYXH/JH3XnFNV+soEL1F5d8JT7AJ3ZBncd19Qul7SN4YpBnyWOnQ8KA== +"@babel/plugin-transform-react-display-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz#b5795f4e3e3140419c3611b7a2a3832b9aef328d" + integrity sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw== dependencies: - "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-inline-elements@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.10.1.tgz#14c1179cfda904d430109ed27a167e54c7565d68" - integrity sha512-lV/H9X6MaIfyzOVZnC4tZzMUnU9hGujmOuQhlGyDHOZbqAHv7dL24yXG1vOn8kA43CVL4bretUnGfV9IyjgqWA== +"@babel/plugin-transform-react-inline-elements@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.10.4.tgz#9b7ea0051d3d10520bd7e0d5b021eb49fa311674" + integrity sha512-Pu5eO9xGwtsPA7N7Qp36D0BKdfmuh0rmWKBEoJHfzPWICOSkJX/UPwqLr1myCnjccpvkOhBcP2WFbEAPTAkYiA== dependencies: - "@babel/helper-builder-react-jsx" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-builder-react-jsx" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-jsx-development@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.1.tgz#1ac6300d8b28ef381ee48e6fec430cc38047b7f3" - integrity sha512-XwDy/FFoCfw9wGFtdn5Z+dHh6HXKHkC6DwKNWpN74VWinUagZfDcEJc3Y8Dn5B3WMVnAllX8Kviaw7MtC5Epwg== +"@babel/plugin-transform-react-jsx-development@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz#6ec90f244394604623880e15ebc3c34c356258ba" + integrity sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ== dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-jsx" "^7.10.1" + "@babel/helper-builder-react-jsx-experimental" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-self@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.1.tgz#22143e14388d72eb88649606bb9e46f421bc3821" - integrity sha512-4p+RBw9d1qV4S749J42ZooeQaBomFPrSxa9JONLHJ1TxCBo3TzJ79vtmG2S2erUT8PDDrPdw4ZbXGr2/1+dILA== +"@babel/plugin-transform-react-jsx-self@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz#cd301a5fed8988c182ed0b9d55e9bd6db0bd9369" + integrity sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-jsx" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-source@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz#30db3d4ee3cdebbb26a82a9703673714777a4273" - integrity sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA== +"@babel/plugin-transform-react-jsx-source@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz#34f1779117520a779c054f2cdd9680435b9222b4" + integrity sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-jsx" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.10.1": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.3.tgz#c07ad86b7c159287c89b643f201f59536231048e" - integrity sha512-Y21E3rZmWICRJnvbGVmDLDZ8HfNDIwjGF3DXYHx1le0v0mIHCs0Gv5SavyW5Z/jgAHLaAoJPiwt+Dr7/zZKcOQ== +"@babel/plugin-transform-react-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2" + integrity sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A== dependencies: - "@babel/helper-builder-react-jsx" "^7.10.3" - "@babel/helper-builder-react-jsx-experimental" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.3" - "@babel/plugin-syntax-jsx" "^7.10.1" + "@babel/helper-builder-react-jsx" "^7.10.4" + "@babel/helper-builder-react-jsx-experimental" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-pure-annotations@^7.10.1": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.3.tgz#97840981673fcb0df2cc33fb25b56cc421f7deef" - integrity sha512-n/fWYGqvTl7OLZs/QcWaKMFdADPvC3V6jYuEOpPyvz97onsW9TXn196fHnHW1ZgkO20/rxLOgKnEtN1q9jkgqA== +"@babel/plugin-transform-react-pure-annotations@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz#3eefbb73db94afbc075f097523e445354a1c6501" + integrity sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-regenerator@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.3.tgz#6ec680f140a5ceefd291c221cb7131f6d7e8cb6d" - integrity sha512-H5kNeW0u8mbk0qa1jVIVTeJJL6/TJ81ltD4oyPx0P499DhMJrTmmIFCmJ3QloGpQG8K9symccB7S7SJpCKLwtw== +"@babel/plugin-transform-regenerator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" + integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz#0fc1027312b4d1c3276a57890c8ae3bcc0b64a86" - integrity sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - -"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3" - integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - -"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8" - integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - -"@babel/plugin-transform-sticky-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00" - integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-regex" "^7.10.1" - -"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.3.tgz#69d39b3d44b31e7b4864173322565894ce939b25" - integrity sha512-yaBn9OpxQra/bk0/CaA4wr41O0/Whkg6nqjqApcinxM7pro51ojhX6fv1pimAnVjVfDy14K0ULoRL70CA9jWWA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.3" - -"@babel/plugin-transform-typeof-symbol@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz#60c0239b69965d166b80a84de7315c1bc7e0bb0e" - integrity sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - -"@babel/plugin-transform-typescript@^7.10.1": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.3.tgz#b3b35fb34ef0bd628b4b8329b0e5f985369201d4" - integrity sha512-qU9Lu7oQyh3PGMQncNjQm8RWkzw6LqsWZQlZPQMgrGt6s3YiBIaQ+3CQV/FA/icGS5XlSWZGwo/l8ErTyelS0Q== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.3" - "@babel/helper-plugin-utils" "^7.10.3" - "@babel/plugin-syntax-typescript" "^7.10.1" - -"@babel/plugin-transform-unicode-escapes@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940" - integrity sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - -"@babel/plugin-transform-unicode-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f" - integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - -"@babel/preset-env@^7.10.2": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.3.tgz#3e58c9861bbd93b6a679987c7e4bd365c56c80c9" - integrity sha512-jHaSUgiewTmly88bJtMHbOd1bJf2ocYxb5BWKSDQIP5tmgFuS/n0gl+nhSrYDhT33m0vPxp+rP8oYYgPgMNQlg== - dependencies: - "@babel/compat-data" "^7.10.3" - "@babel/helper-compilation-targets" "^7.10.2" - "@babel/helper-module-imports" "^7.10.3" - "@babel/helper-plugin-utils" "^7.10.3" - "@babel/plugin-proposal-async-generator-functions" "^7.10.3" - "@babel/plugin-proposal-class-properties" "^7.10.1" - "@babel/plugin-proposal-dynamic-import" "^7.10.1" - "@babel/plugin-proposal-json-strings" "^7.10.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" - "@babel/plugin-proposal-numeric-separator" "^7.10.1" - "@babel/plugin-proposal-object-rest-spread" "^7.10.3" - "@babel/plugin-proposal-optional-catch-binding" "^7.10.1" - "@babel/plugin-proposal-optional-chaining" "^7.10.3" - "@babel/plugin-proposal-private-methods" "^7.10.1" - "@babel/plugin-proposal-unicode-property-regex" "^7.10.1" +"@babel/plugin-transform-reserved-words@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" + integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-shorthand-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" + integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-spread@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" + integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" + +"@babel/plugin-transform-sticky-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" + integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + +"@babel/plugin-transform-template-literals@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" + integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-typeof-symbol@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" + integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-typescript@^7.10.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz#2b4879676af37342ebb278216dd090ac67f13abb" + integrity sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-typescript" "^7.10.4" + +"@babel/plugin-transform-unicode-escapes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" + integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" + integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/preset-env@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796" + integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg== + dependencies: + "@babel/compat-data" "^7.11.0" + "@babel/helper-compilation-targets" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-proposal-async-generator-functions" "^7.10.4" + "@babel/plugin-proposal-class-properties" "^7.10.4" + "@babel/plugin-proposal-dynamic-import" "^7.10.4" + "@babel/plugin-proposal-export-namespace-from" "^7.10.4" + "@babel/plugin-proposal-json-strings" "^7.10.4" + "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread" "^7.11.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" + "@babel/plugin-proposal-optional-chaining" "^7.11.0" + "@babel/plugin-proposal-private-methods" "^7.10.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.10.1" + "@babel/plugin-syntax-class-properties" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.10.1" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.10.1" - "@babel/plugin-transform-arrow-functions" "^7.10.1" - "@babel/plugin-transform-async-to-generator" "^7.10.1" - "@babel/plugin-transform-block-scoped-functions" "^7.10.1" - "@babel/plugin-transform-block-scoping" "^7.10.1" - "@babel/plugin-transform-classes" "^7.10.3" - "@babel/plugin-transform-computed-properties" "^7.10.3" - "@babel/plugin-transform-destructuring" "^7.10.1" - "@babel/plugin-transform-dotall-regex" "^7.10.1" - "@babel/plugin-transform-duplicate-keys" "^7.10.1" - "@babel/plugin-transform-exponentiation-operator" "^7.10.1" - "@babel/plugin-transform-for-of" "^7.10.1" - "@babel/plugin-transform-function-name" "^7.10.1" - "@babel/plugin-transform-literals" "^7.10.1" - "@babel/plugin-transform-member-expression-literals" "^7.10.1" - "@babel/plugin-transform-modules-amd" "^7.10.1" - "@babel/plugin-transform-modules-commonjs" "^7.10.1" - "@babel/plugin-transform-modules-systemjs" "^7.10.3" - "@babel/plugin-transform-modules-umd" "^7.10.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.3" - "@babel/plugin-transform-new-target" "^7.10.1" - "@babel/plugin-transform-object-super" "^7.10.1" - "@babel/plugin-transform-parameters" "^7.10.1" - "@babel/plugin-transform-property-literals" "^7.10.1" - "@babel/plugin-transform-regenerator" "^7.10.3" - "@babel/plugin-transform-reserved-words" "^7.10.1" - "@babel/plugin-transform-shorthand-properties" "^7.10.1" - "@babel/plugin-transform-spread" "^7.10.1" - "@babel/plugin-transform-sticky-regex" "^7.10.1" - "@babel/plugin-transform-template-literals" "^7.10.3" - "@babel/plugin-transform-typeof-symbol" "^7.10.1" - "@babel/plugin-transform-unicode-escapes" "^7.10.1" - "@babel/plugin-transform-unicode-regex" "^7.10.1" + "@babel/plugin-syntax-top-level-await" "^7.10.4" + "@babel/plugin-transform-arrow-functions" "^7.10.4" + "@babel/plugin-transform-async-to-generator" "^7.10.4" + "@babel/plugin-transform-block-scoped-functions" "^7.10.4" + "@babel/plugin-transform-block-scoping" "^7.10.4" + "@babel/plugin-transform-classes" "^7.10.4" + "@babel/plugin-transform-computed-properties" "^7.10.4" + "@babel/plugin-transform-destructuring" "^7.10.4" + "@babel/plugin-transform-dotall-regex" "^7.10.4" + "@babel/plugin-transform-duplicate-keys" "^7.10.4" + "@babel/plugin-transform-exponentiation-operator" "^7.10.4" + "@babel/plugin-transform-for-of" "^7.10.4" + "@babel/plugin-transform-function-name" "^7.10.4" + "@babel/plugin-transform-literals" "^7.10.4" + "@babel/plugin-transform-member-expression-literals" "^7.10.4" + "@babel/plugin-transform-modules-amd" "^7.10.4" + "@babel/plugin-transform-modules-commonjs" "^7.10.4" + "@babel/plugin-transform-modules-systemjs" "^7.10.4" + "@babel/plugin-transform-modules-umd" "^7.10.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" + "@babel/plugin-transform-new-target" "^7.10.4" + "@babel/plugin-transform-object-super" "^7.10.4" + "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/plugin-transform-property-literals" "^7.10.4" + "@babel/plugin-transform-regenerator" "^7.10.4" + "@babel/plugin-transform-reserved-words" "^7.10.4" + "@babel/plugin-transform-shorthand-properties" "^7.10.4" + "@babel/plugin-transform-spread" "^7.11.0" + "@babel/plugin-transform-sticky-regex" "^7.10.4" + "@babel/plugin-transform-template-literals" "^7.10.4" + "@babel/plugin-transform-typeof-symbol" "^7.10.4" + "@babel/plugin-transform-unicode-escapes" "^7.10.4" + "@babel/plugin-transform-unicode-regex" "^7.10.4" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.10.3" + "@babel/types" "^7.11.0" browserslist "^4.12.0" core-js-compat "^3.6.2" invariant "^2.2.2" @@ -1044,34 +1273,34 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.1.tgz#e2ab8ae9a363ec307b936589f07ed753192de041" - integrity sha512-Rw0SxQ7VKhObmFjD/cUcKhPTtzpeviEFX1E6PgP+cYOhQ98icNqtINNFANlsdbQHrmeWnqdxA4Tmnl1jy5tp3Q== +"@babel/preset-react@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.4.tgz#92e8a66d816f9911d11d4cc935be67adfc82dbcf" + integrity sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-transform-react-display-name" "^7.10.1" - "@babel/plugin-transform-react-jsx" "^7.10.1" - "@babel/plugin-transform-react-jsx-development" "^7.10.1" - "@babel/plugin-transform-react-jsx-self" "^7.10.1" - "@babel/plugin-transform-react-jsx-source" "^7.10.1" - "@babel/plugin-transform-react-pure-annotations" "^7.10.1" - -"@babel/preset-typescript@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.10.1.tgz#a8d8d9035f55b7d99a2461a0bdc506582914d07e" - integrity sha512-m6GV3y1ShiqxnyQj10600ZVOFrSSAa8HQ3qIUk2r+gcGtHTIRw0dJnFLt1WNXpKjtVw7yw1DAPU/6ma2ZvgJuA== + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-display-name" "^7.10.4" + "@babel/plugin-transform-react-jsx" "^7.10.4" + "@babel/plugin-transform-react-jsx-development" "^7.10.4" + "@babel/plugin-transform-react-jsx-self" "^7.10.4" + "@babel/plugin-transform-react-jsx-source" "^7.10.4" + "@babel/plugin-transform-react-pure-annotations" "^7.10.4" + +"@babel/preset-typescript@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz#7d5d052e52a682480d6e2cc5aa31be61c8c25e36" + integrity sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-transform-typescript" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-typescript" "^7.10.4" -"@babel/register@^7.10.1": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.3.tgz#b49b6603fc8d214cd2f77a6ed2256bd198b5994b" - integrity sha512-s1il0vdd02HCGwV1iocGJEzcbTNouZqMolSXKXFAiTNJSudPas9jdLQwyPPyAJxdNL6KGJ8pwWIOpKmgO/JWqg== +"@babel/register@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.5.tgz#354f3574895f1307f79efe37a51525e52fd38d89" + integrity sha512-eYHdLv43nyvmPn9bfNfrcC4+iYNwdQ8Pxk1MFJuU/U5LpSYl/PH4dFMazCYZDFVi8ueG3shvO+AQfLrxpYulQw== dependencies: find-cache-dir "^2.0.0" - lodash "^4.17.13" + lodash "^4.17.19" make-dir "^2.1.0" pirates "^4.0.0" source-map-support "^0.5.16" @@ -1084,10 +1313,10 @@ core-js "^2.6.5" regenerator-runtime "^0.13.4" -"@babel/runtime-corejs3@^7.8.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.3.tgz#931ed6941d3954924a7aa967ee440e60c507b91a" - integrity sha512-HA7RPj5xvJxQl429r5Cxr2trJwOfPjKiqhCXcdQPSqO2G0RHPZpXu4fkYmBaTKCp2c/jRaMK9GB/lN+7zvvFPw== +"@babel/runtime-corejs3@^7.10.2": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz#02c3029743150188edeb66541195f54600278419" + integrity sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A== dependencies: core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" @@ -1099,13 +1328,20 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.0", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.0", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.3.tgz#670d002655a7c366540c67f6fd3342cd09500364" integrity sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw== dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.10.2": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.10.1", "@babel/template@^7.10.3", "@babel/template@^7.3.3": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.3.tgz#4d13bc8e30bf95b0ce9d175d30306f42a2c9a7b8" @@ -1115,6 +1351,15 @@ "@babel/parser" "^7.10.3" "@babel/types" "^7.10.3" +"@babel/template@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.10.3", "@babel/traverse@^7.7.0": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.3.tgz#0b01731794aa7b77b214bcd96661f18281155d7e" @@ -1130,6 +1375,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" + integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.0" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.11.0" + "@babel/types" "^7.11.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + "@babel/types@^7.0.0", "@babel/types@^7.10.1", "@babel/types@^7.10.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.3.tgz#6535e3b79fea86a6b09e012ea8528f935099de8e" @@ -1139,6 +1399,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" + integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1214,173 +1483,166 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@jest/console@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.5.0.tgz#770800799d510f37329c508a9edd0b7b447d9abb" - integrity sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw== +"@jest/console@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.2.0.tgz#d18f2659b90930e7ec3925fb7209f1ba2cf463f0" + integrity sha512-mXQfx3nSLwiHm1i7jbu+uvi+vvpVjNGzIQYLCfsat9rapC+MJkS4zBseNrgJE0vU921b3P67bQzhduphjY3Tig== dependencies: - "@jest/types" "^25.5.0" - chalk "^3.0.0" - jest-message-util "^25.5.0" - jest-util "^25.5.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^26.2.0" + jest-util "^26.2.0" slash "^3.0.0" -"@jest/core@^25.5.4": - version "25.5.4" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.5.4.tgz#3ef7412f7339210f003cdf36646bbca786efe7b4" - integrity sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA== +"@jest/core@^26.2.2": + version "26.2.2" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.2.2.tgz#63de01ffce967618003dd7a0164b05c8041b81a9" + integrity sha512-UwA8gNI8aeV4FHGfGAUfO/DHjrFVvlBravF1Tm9Kt6qFE+6YHR47kFhgdepOFpADEKstyO+MVdPvkV6/dyt9sA== dependencies: - "@jest/console" "^25.5.0" - "@jest/reporters" "^25.5.1" - "@jest/test-result" "^25.5.0" - "@jest/transform" "^25.5.1" - "@jest/types" "^25.5.0" + "@jest/console" "^26.2.0" + "@jest/reporters" "^26.2.2" + "@jest/test-result" "^26.2.0" + "@jest/transform" "^26.2.2" + "@jest/types" "^26.2.0" + "@types/node" "*" ansi-escapes "^4.2.1" - chalk "^3.0.0" + chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" - jest-changed-files "^25.5.0" - jest-config "^25.5.4" - jest-haste-map "^25.5.1" - jest-message-util "^25.5.0" - jest-regex-util "^25.2.6" - jest-resolve "^25.5.1" - jest-resolve-dependencies "^25.5.4" - jest-runner "^25.5.4" - jest-runtime "^25.5.4" - jest-snapshot "^25.5.1" - jest-util "^25.5.0" - jest-validate "^25.5.0" - jest-watcher "^25.5.0" + jest-changed-files "^26.2.0" + jest-config "^26.2.2" + jest-haste-map "^26.2.2" + jest-message-util "^26.2.0" + jest-regex-util "^26.0.0" + jest-resolve "^26.2.2" + jest-resolve-dependencies "^26.2.2" + jest-runner "^26.2.2" + jest-runtime "^26.2.2" + jest-snapshot "^26.2.2" + jest-util "^26.2.0" + jest-validate "^26.2.0" + jest-watcher "^26.2.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" -"@jest/environment@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.5.0.tgz#aa33b0c21a716c65686638e7ef816c0e3a0c7b37" - integrity sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA== +"@jest/environment@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.2.0.tgz#f6faee1630fcc2fad208953164bccb31dbe0e45f" + integrity sha512-oCgp9NmEiJ5rbq9VI/v/yYLDpladAAVvFxZgNsnJxOETuzPZ0ZcKKHYjKYwCtPOP1WCrM5nmyuOhMStXFGHn+g== dependencies: - "@jest/fake-timers" "^25.5.0" - "@jest/types" "^25.5.0" - jest-mock "^25.5.0" + "@jest/fake-timers" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + jest-mock "^26.2.0" -"@jest/fake-timers@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.5.0.tgz#46352e00533c024c90c2bc2ad9f2959f7f114185" - integrity sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ== +"@jest/fake-timers@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.2.0.tgz#b485c57dc4c74d61406a339807a9af4bac74b75a" + integrity sha512-45Gfe7YzYTKqTayBrEdAF0qYyAsNRBzfkV0IyVUm3cx7AsCWlnjilBM4T40w7IXT5VspOgMPikQlV0M6gHwy/g== dependencies: - "@jest/types" "^25.5.0" - jest-message-util "^25.5.0" - jest-mock "^25.5.0" - jest-util "^25.5.0" - lolex "^5.0.0" + "@jest/types" "^26.2.0" + "@sinonjs/fake-timers" "^6.0.1" + "@types/node" "*" + jest-message-util "^26.2.0" + jest-mock "^26.2.0" + jest-util "^26.2.0" -"@jest/globals@^25.5.2": - version "25.5.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-25.5.2.tgz#5e45e9de8d228716af3257eeb3991cc2e162ca88" - integrity sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA== +"@jest/globals@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.2.0.tgz#ad78f1104f250c1a4bf5184a2ba51facc59b23f6" + integrity sha512-Hoc6ScEIPaym7RNytIL2ILSUWIGKlwEv+JNFof9dGYOdvPjb2evEURSslvCMkNuNg1ECEClTE8PH7ULlMJntYA== dependencies: - "@jest/environment" "^25.5.0" - "@jest/types" "^25.5.0" - expect "^25.5.0" + "@jest/environment" "^26.2.0" + "@jest/types" "^26.2.0" + expect "^26.2.0" -"@jest/reporters@^25.5.1": - version "25.5.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.5.1.tgz#cb686bcc680f664c2dbaf7ed873e93aa6811538b" - integrity sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw== +"@jest/reporters@^26.2.2": + version "26.2.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.2.2.tgz#5a8632ab410f4fc57782bc05dcf115e91818e869" + integrity sha512-7854GPbdFTAorWVh+RNHyPO9waRIN6TcvCezKVxI1khvFq9YjINTW7J3WU+tbR038Ynn6WjYred6vtT0YmIWVQ== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^25.5.0" - "@jest/test-result" "^25.5.0" - "@jest/transform" "^25.5.1" - "@jest/types" "^25.5.0" - chalk "^3.0.0" + "@jest/console" "^26.2.0" + "@jest/test-result" "^26.2.0" + "@jest/transform" "^26.2.2" + "@jest/types" "^26.2.0" + chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.2" graceful-fs "^4.2.4" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.0" + istanbul-lib-instrument "^4.0.3" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.0.2" - jest-haste-map "^25.5.1" - jest-resolve "^25.5.1" - jest-util "^25.5.0" - jest-worker "^25.5.0" + jest-haste-map "^26.2.2" + jest-resolve "^26.2.2" + jest-util "^26.2.0" + jest-worker "^26.2.1" slash "^3.0.0" source-map "^0.6.0" - string-length "^3.1.0" + string-length "^4.0.1" terminal-link "^2.0.0" v8-to-istanbul "^4.1.3" optionalDependencies: - node-notifier "^6.0.0" + node-notifier "^7.0.0" -"@jest/source-map@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.5.0.tgz#df5c20d6050aa292c2c6d3f0d2c7606af315bd1b" - integrity sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ== +"@jest/source-map@^26.1.0": + version "26.1.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.1.0.tgz#a6a020d00e7d9478f4b690167c5e8b77e63adb26" + integrity sha512-XYRPYx4eEVX15cMT9mstnO7hkHP3krNtKfxUYd8L7gbtia8JvZZ6bMzSwa6IQJENbudTwKMw5R1BePRD+bkEmA== dependencies: callsites "^3.0.0" graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.5.0.tgz#139a043230cdeffe9ba2d8341b27f2efc77ce87c" - integrity sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A== +"@jest/test-result@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.2.0.tgz#51c9b165c8851cfcf7a3466019114785e154f76b" + integrity sha512-kgPlmcVafpmfyQEu36HClK+CWI6wIaAWDHNxfQtGuKsgoa2uQAYdlxjMDBEa3CvI40+2U3v36gQF6oZBkoKatw== dependencies: - "@jest/console" "^25.5.0" - "@jest/types" "^25.5.0" + "@jest/console" "^26.2.0" + "@jest/types" "^26.2.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^25.5.4": - version "25.5.4" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz#9b4e685b36954c38d0f052e596d28161bdc8b737" - integrity sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA== +"@jest/test-sequencer@^26.2.2": + version "26.2.2" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.2.2.tgz#5e8091f2e6c61fdf242af566cb820a4eadc6c4af" + integrity sha512-SliZWon5LNqV/lVXkeowSU6L8++FGOu3f43T01L1Gv6wnFDP00ER0utV9jyK9dVNdXqfMNCN66sfcyar/o7BNw== dependencies: - "@jest/test-result" "^25.5.0" + "@jest/test-result" "^26.2.0" graceful-fs "^4.2.4" - jest-haste-map "^25.5.1" - jest-runner "^25.5.4" - jest-runtime "^25.5.4" + jest-haste-map "^26.2.2" + jest-runner "^26.2.2" + jest-runtime "^26.2.2" -"@jest/transform@^25.5.1": - version "25.5.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.5.1.tgz#0469ddc17699dd2bf985db55fa0fb9309f5c2db3" - integrity sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg== +"@jest/transform@^26.2.2": + version "26.2.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.2.2.tgz#86c005c8d5d749ac54d8df53ea58675fffe7a97e" + integrity sha512-c1snhvi5wRVre1XyoO3Eef5SEWpuBCH/cEbntBUd9tI5sNYiBDmO0My/lc5IuuGYKp/HFIHV1eZpSx5yjdkhKw== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^25.5.0" + "@jest/types" "^26.2.0" babel-plugin-istanbul "^6.0.0" - chalk "^3.0.0" + chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.2.4" - jest-haste-map "^25.5.1" - jest-regex-util "^25.2.6" - jest-util "^25.5.0" + jest-haste-map "^26.2.2" + jest-regex-util "^26.0.0" + jest-util "^26.2.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" -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - "@jest/types@^25.5.0": version "25.5.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" @@ -1391,6 +1653,17 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" +"@jest/types@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.2.0.tgz#b28ca1fb517a4eb48c0addea7fcd9edc4ab45721" + integrity sha512-lvm3rJvctxd7+wxKSxxbzpDbr4FXDLaC57WEKdUIZ2cjTYuxYSc0zlyD7Z4Uqr5VdKxRUrtwIkiqBuvgf8uKJA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + "@mapbox/geojson-rewind@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.0.tgz#91f0ad56008c120caa19414b644d741249f4f560" @@ -1475,6 +1748,13 @@ "@nodelib/fs.scandir" "2.1.3" fastq "^1.6.0" +"@npmcli/move-file@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464" + integrity sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw== + dependencies: + mkdirp "^1.0.4" + "@nteract/commutable@^7.2.12": version "7.2.12" resolved "https://registry.yarnpkg.com/@nteract/commutable/-/commutable-7.2.12.tgz#a4b6bafd582e0de7a095f57bf537ac18de1691d1" @@ -1563,7 +1843,7 @@ d3-collection "1" d3-shape "^1.2.0" -"@reduxjs/toolkit@1.4.0": +"@reduxjs/toolkit@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.4.0.tgz#ee2e2384cc3d1d76780d844b9c2da3580d32710d" integrity sha512-hkxQwVx4BNVRsYdxjNF6cAseRmtrkpSlcgJRr3kLUcHPIAMZAmMJkXmHh/eUEGTMqPzsYpJLM7NN2w9fxQDuGw== @@ -1586,34 +1866,19 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0": +"@sinonjs/commons@^1.7.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q== dependencies: type-detect "4.0.8" -"@sinonjs/formatio@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-4.0.1.tgz#50ac1da0c3eaea117ca258b06f4f88a471668bdb" - integrity sha512-asIdlLFrla/WZybhm0C8eEzaDNNrzymiTqHMeJl6zPW2881l3uuVRpm0QlRQEjqYWv6CcKMGYME3LbrLJsORBw== - dependencies: - "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^4.2.0" - -"@sinonjs/samsam@^4.2.0", "@sinonjs/samsam@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-4.2.2.tgz#0f6cb40e467865306d8a20a97543a94005204e23" - integrity sha512-z9o4LZUzSD9Hl22zV38aXNykgFeVj8acqfFabCY6FY83n/6s/XwNJyYYldz6/9lBJanpno9h+oL6HTISkviweA== +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== dependencies: - "@sinonjs/commons" "^1.6.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" - -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + "@sinonjs/commons" "^1.7.0" "@stardust-ui/react-component-event-listener@~0.38.0": version "0.38.0" @@ -1695,7 +1960,7 @@ resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== -"@types/babel__core@^7.1.7": +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": version "7.1.9" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== @@ -1740,13 +2005,6 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/css-modules-loader-core@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@types/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#67af15aa16603ac2ffc1d3a7f08547ac809c3005" - integrity sha512-LMbyf7THPqLCPHIXAj79v9Pa193MeOHgp1fBFRR6s6VvEVHUFIcM5bc/WttslOf+lao4TURNN1X1zfW5wr2CHQ== - dependencies: - postcss "7.x.x" - "@types/debug@^4.1.5": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" @@ -1804,11 +2062,16 @@ dependencies: "@types/node" "*" -"@types/history@*", "@types/history@^4.7.5": +"@types/history@*": version "4.7.6" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.6.tgz#ed8fc802c45b8e8f54419c2d054e55c9ea344356" integrity sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w== +"@types/history@^4.7.6": + version "4.7.7" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.7.tgz#613957d900fab9ff84c8dfb24fa3eef0c2a40896" + integrity sha512-2xtoL22/3Mv6a70i4+4RB7VgbDDORoWwjcqeNysojZA0R7NK17RbY5Gof/2QiFfJgX+KkWghbwJ+d/2SB8Ndzg== + "@types/hoist-non-react-statics@^3.3.0": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" @@ -1837,12 +2100,13 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@^24.9.1": - version "24.9.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.9.1.tgz#02baf9573c78f1b9974a5f36778b366aa77bd534" - integrity sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q== +"@types/jest@^26.0.5": + version "26.0.9" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.9.tgz#0543b57da5f0cd949c5f423a00c56c492289c989" + integrity sha512-k4qFfJ5AUKrWok5KYXp2EPm89b0P/KZpl7Vg4XuOTVVQEhLDBDBU3iBFrjjdgd8fLw96aAtmnwhXHl63bWeBQQ== dependencies: - jest-diff "^24.3.0" + jest-diff "^25.2.1" + pretty-format "^25.2.1" "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4": version "7.0.5" @@ -1874,12 +2138,17 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.13.tgz#ee1128e881b874c371374c1f72201893616417c9" integrity sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA== +"@types/node@12": + version "12.12.54" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.54.tgz#a4b58d8df3a4677b6c08bfbc94b7ad7a7a5f82d1" + integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w== + "@types/node@^10.12.19": version "10.17.26" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.26.tgz#a8a119960bff16b823be4c617da028570779bcfd" integrity sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw== -"@types/node@^12", "@types/node@^12.0.12": +"@types/node@^12.0.12": version "12.12.47" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.47.tgz#5007b8866a2f9150de82335ca7e24dd1d59bdfb5" integrity sha512-yzBInQFhdY8kaZmqoL2+3U5dSTMrKaYcb561VU+lDzAYvqt+2lojvBEy+hmpSNuXnPTx7m9+04CzWYOUqWME2A== @@ -1894,10 +2163,10 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/prettier@^1.19.0": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" - integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== +"@types/prettier@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.2.tgz#5bb52ee68d0f8efa9cc0099920e56be6cc4e37f3" + integrity sha512-IkVfat549ggtkZUthUzEX49562eGikhSYeVGX97SkMFn+sTZrgRewXjQ4tPKFPCykZHkX1Zfd9OoELGqKU2jJA== "@types/prop-types@*": version "15.7.3" @@ -1909,14 +2178,14 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== -"@types/react-dom@^16.9.7": +"@types/react-dom@^16.9.8": version "16.9.8" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423" integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA== dependencies: "@types/react" "*" -"@types/react-redux@^7.1.6": +"@types/react-redux@^7.1.9": version "7.1.9" resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.9.tgz#280c13565c9f13ceb727ec21e767abe0e9b4aec3" integrity sha512-mpC0jqxhP4mhmOl3P4ipRsgTgbNofMRXJb08Ms6gekViLj61v1hOZEKWDCyWsdONr6EjEA6ZHXC446wdywDe0w== @@ -1935,7 +2204,7 @@ "@types/react" "*" "@types/react-router" "*" -"@types/react-router@*", "@types/react-router@^5.1.7": +"@types/react-router@*": version "5.1.7" resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.7.tgz#e9d12ed7dcfc79187e4d36667745b69a5aa11556" integrity sha512-2ouP76VQafKjtuc0ShpwUebhHwJo0G6rhahW9Pb8au3tQTjYXd2jta4wv6U2tGLR/I42yuG00+UXjNYY0dTzbg== @@ -1943,6 +2212,14 @@ "@types/history" "*" "@types/react" "*" +"@types/react-router@^5.1.8": + version "5.1.8" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.8.tgz#4614e5ba7559657438e17766bb95ef6ed6acc3fa" + integrity sha512-HzOyJb+wFmyEhyfp4D4NYrumi+LQgQL/68HvJO+q6XtuHSDvw6Aqov7sCAhjbNq3bUPgPqbdvjXC5HeB2oEAPg== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-test-renderer@^16.9.2": version "16.9.2" resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-16.9.2.tgz#e1c408831e8183e5ad748fdece02214a7c2ab6c5" @@ -1950,7 +2227,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.9.17": +"@types/react@*": version "16.9.38" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.38.tgz#868405dace93a4095d3e054f4c4a1de7a1ac0680" integrity sha512-pHAeZbjjNRa/hxyNuLrvbxhhnKyKNiLC6I5fRF2Zr/t/S6zS41MiyzH4+c+1I9vVfvuRt1VS2Lodjr4ZWnxrdA== @@ -1958,25 +2235,28 @@ "@types/prop-types" "*" csstype "^2.2.0" -"@types/redux-logger@^3.0.7": +"@types/react@^16.9.44": + version "16.9.45" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.45.tgz#b43ccf3d8a3d2020e6a48c8c8492e5a4bc10f097" + integrity sha512-vv950slTF5UZ5eDOf13b8qC1SD4rTvkqg3HfaUKzr17U97oeJZAa+dUaIHn0QoOJflNTIt6Pem9MmapULs9dkA== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/redux-logger@^3.0.8": version "3.0.8" resolved "https://registry.yarnpkg.com/@types/redux-logger/-/redux-logger-3.0.8.tgz#1fb6d26917bb198792bb1cf57feb31cae1532c5d" integrity sha512-zM+cxiSw6nZtRbxpVp9SE3x/X77Z7e7YAfHD1NkxJyJbAGSXJGF0E9aqajZfPOa/sTYnuwutmlCldveExuCeLw== dependencies: redux "^4.0.0" -"@types/semver@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.2.0.tgz#0d72066965e910531e1db4621c15d0ca36b8d83b" - integrity sha512-TbB0A8ACUWZt3Y6bQPstW9QNbhNeebdgLX4T/ZfkrswAfUzRiXrgd9seol+X379Wa589Pu4UEx9Uok0D4RjRCQ== +"@types/semver@^7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.1.tgz#7a9a5d595b6d873f338c867dcef64df289468cfa" + integrity sha512-ooD/FJ8EuwlDKOI6D9HWxgIgJjMg2cuziXm/42npDC8y4NjxplBUn9loewZiBNCt44450lHAU0OSb51/UqXeag== dependencies: "@types/node" "*" -"@types/sinon@^7.5.2": - version "7.5.2" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.5.2.tgz#5e2f1d120f07b9cda07e5dedd4f3bf8888fccdb9" - integrity sha512-T+m89VdXj/eidZyejvmoP9jivXgBDdkOSBVQjU9kF349NEx10QdPNGxHeZUaj1IlJ32/ewdyXJjnJxyxJroYwg== - "@types/source-list-map@*": version "0.1.2" resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" @@ -1987,7 +2267,7 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== -"@types/tapable@*", "@types/tapable@^1.0.5": +"@types/tapable@*": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== @@ -2009,24 +2289,15 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.0.0.tgz#165aae4819ad2174a17476dbe66feebd549556c0" integrity sha512-xSQfNcvOiE5f9dyd4Kzxbof1aTrLobL278pGLKOZI6esGfZ7ts9Ka16CzIN6Y8hFHE1C7jIBZokULhK1bOgjRw== -"@types/vfile-message@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-2.0.0.tgz#690e46af0fdfc1f9faae00cd049cc888957927d5" - integrity sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw== - dependencies: - vfile-message "*" - "@types/web-bluetooth@^0.0.2": version "0.0.2" resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.2.tgz#5cf081c320323543712c49c49ed520bf65eead1a" integrity sha1-XPCBwyAyNUNxLEnEntUgv2XurRo= -"@types/webdriverio@^4.8.0": - version "4.13.3" - resolved "https://registry.yarnpkg.com/@types/webdriverio/-/webdriverio-4.13.3.tgz#c1571c4e62724135c0b11e7d7e36b07af5168856" - integrity sha512-AfSQM1xTO9Ax+u9uSQPDuw69DQ0qA2RMoKHn86jCgWNcwKVUjGMSP4sfSl3JOfcZN8X/gWvn7znVPp2/g9zcJA== - dependencies: - "@types/node" "*" +"@types/webpack-env@^1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.2.tgz#927997342bb9f4a5185a86e6579a0a18afc33b0a" + integrity sha512-67ZgZpAlhIICIdfQrB5fnDvaKFcDxpKibxznfYRVAT4mQE41Dido/3Ty+E3xGBmTogc5+0Qb8tWhna+5B8z1iQ== "@types/webpack-sources@*": version "1.4.0" @@ -2037,10 +2308,10 @@ "@types/source-list-map" "*" source-map "^0.7.3" -"@types/webpack@^4.41.3": - version "4.41.17" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.17.tgz#0a69005e644d657c85b7d6ec1c826a71bebd1c93" - integrity sha512-6FfeCidTSHozwKI67gIVQQ5Mp0g4X96c2IXxX75hYEQJwST/i6NyZexP//zzMOBb+wG9jJ7oO8fk9yObP2HWAw== +"@types/webpack@^4.41.21": + version "4.41.21" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.21.tgz#cc685b332c33f153bb2f5fc1fa3ac8adeb592dee" + integrity sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA== dependencies: "@types/anymatch" "*" "@types/node" "*" @@ -2054,13 +2325,6 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== -"@types/yargs@^13.0.0": - version "13.0.9" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.9.tgz#44028e974343c7afcf3960f1a2b1099c39a7b5e1" - integrity sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^15.0.0", "@types/yargs@^15.0.5": version "15.0.5" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" @@ -2068,17 +2332,30 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^2.17.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" - integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== +"@typescript-eslint/eslint-plugin@^3.6.1": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.8.0.tgz#f82947bcdd9a4e42be7ad80dfd61f1dc411dd1df" + integrity sha512-lFb4VCDleFSR+eo4Ew+HvrJ37ZH1Y9ZyE+qyP7EiwBpcCVxwmUc5PAqhShCQ8N8U5vqYydm74nss+a0wrrCErw== dependencies: - "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/experimental-utils" "3.8.0" + debug "^4.1.1" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" + semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.34.0", "@typescript-eslint/experimental-utils@^2.5.0": +"@typescript-eslint/experimental-utils@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.8.0.tgz#ac1f7c88322dcfb7635ece6f0441516dd951099a" + integrity sha512-o8T1blo1lAJE0QDsW7nSyvZHbiDzQDjINJKyB44Z3sSL39qBy5L10ScI/XwDtaiunoyKGLiY9bzRk4YjsUZl8w== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/types" "3.8.0" + "@typescript-eslint/typescript-estree" "3.8.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/experimental-utils@^2.5.0": version "2.34.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== @@ -2088,16 +2365,22 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^2.17.0", "@typescript-eslint/parser@^2.3.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" - integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== +"@typescript-eslint/parser@^3.6.1": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.8.0.tgz#8e1dcd404299bf79492409c81c415fa95a7c622b" + integrity sha512-u5vjOBaCsnMVQOvkKCXAmmOhyyMmFFf5dbkM3TIbg3MZ2pyv5peE4gj81UAbTHwTOXEwf7eCQTUMKrDl/+qGnA== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.34.0" - "@typescript-eslint/typescript-estree" "2.34.0" + "@typescript-eslint/experimental-utils" "3.8.0" + "@typescript-eslint/types" "3.8.0" + "@typescript-eslint/typescript-estree" "3.8.0" eslint-visitor-keys "^1.1.0" +"@typescript-eslint/types@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.8.0.tgz#58581dd863f86e0cd23353d94362bb90b4bea796" + integrity sha512-8kROmEQkv6ss9kdQ44vCN1dTrgu4Qxrd2kXr10kz2NP5T8/7JnEfYNxCpPkArbLIhhkGLZV3aVMplH1RXQRF7Q== + "@typescript-eslint/typescript-estree@2.34.0": version "2.34.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" @@ -2111,6 +2394,27 @@ semver "^7.3.2" tsutils "^3.17.1" +"@typescript-eslint/typescript-estree@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.8.0.tgz#0606d19f629f813dbdd5a34c7a1e895d6191cac6" + integrity sha512-MTv9nPDhlKfclwnplRNDL44mP2SY96YmPGxmMbMy6x12I+pERcxpIUht7DXZaj4mOKKtet53wYYXU0ABaiXrLw== + dependencies: + "@typescript-eslint/types" "3.8.0" + "@typescript-eslint/visitor-keys" "3.8.0" + debug "^4.1.1" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.8.0.tgz#ad35110249fb3fc30a36bfcbfeea93e710cfaab1" + integrity sha512-gfqQWyVPpT9NpLREXNR820AYwgz+Kr1GuF3nf1wxpHD6hdxI62tq03ToomFnDxY0m3pUB39IF7sil7D5TQexLA== + dependencies: + eslint-visitor-keys "^1.1.0" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -2280,10 +2584,10 @@ a-big-triangle@^1.0.3: gl-vao "^1.2.0" weak-map "^1.0.5" -abab@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" - integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== +abab@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.4.tgz#6dfa57b417ca06d21b2478f0e638302f99c2405c" + integrity sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ== abbrev@1: version "1.1.1" @@ -2318,13 +2622,13 @@ acorn-es7-plugin@^1.1.7: resolved "https://registry.yarnpkg.com/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz#f2ee1f3228a90eead1245f9ab1922eb2e71d336b" integrity sha1-8u4fMiipDurRJF+asZIusucdM2s= -acorn-globals@^4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" + acorn "^7.1.1" + acorn-walk "^7.1.1" acorn-hammerhead@^0.3.0: version "0.3.0" @@ -2338,11 +2642,6 @@ acorn-jsx@^5.0.1, acorn-jsx@^5.2.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== - acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" @@ -2353,16 +2652,21 @@ acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.1, acorn@^6.1.1, acorn@^6.4.1: +acorn@^6.1.1, acorn@^6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.1.0, acorn@^7.1.1, acorn@^7.2.0: +acorn@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== +acorn@^7.3.1: + version "7.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" + integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== + add-line-numbers@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/add-line-numbers/-/add-line-numbers-1.0.1.tgz#48dbbdea47dbd234deafeac6c93cea6f70b4b7e3" @@ -2478,35 +2782,16 @@ ansi-align@^3.0.0: dependencies: string-width "^3.0.0" -ansi-colors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" - integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== - dependencies: - ansi-wrap "^0.1.0" - ansi-colors@^3.0.0, ansi-colors@^3.2.1: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= - dependencies: - ansi-wrap "0.1.0" - ansi-escapes@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" integrity sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs= -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" @@ -2514,25 +2799,11 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.11.0" -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= - dependencies: - ansi-wrap "0.1.0" - ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= - dependencies: - ansi-wrap "0.1.0" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -2543,7 +2814,7 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.0.0, ansi-regex@^4.1.0: +ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -2583,11 +2854,6 @@ ansi-to-react@^3.3.5: babel-runtime "^6.26.0" escape-carriage "^1.2.0" -ansi-wrap@0.1.0, ansi-wrap@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -2642,32 +2908,6 @@ aproba@^1.0.3, aproba@^1.1.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -archiver-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" - integrity sha1-5QtMCccL89aA4y/xt5lOn52JUXQ= - dependencies: - glob "^7.0.0" - graceful-fs "^4.1.0" - lazystream "^1.0.0" - lodash "^4.8.0" - normalize-path "^2.0.0" - readable-stream "^2.0.0" - -archiver@~2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-2.1.1.tgz#ff662b4a78201494a3ee544d3a33fe7496509ebc" - integrity sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw= - dependencies: - archiver-utils "^1.3.0" - async "^2.0.0" - buffer-crc32 "^0.2.1" - glob "^7.0.0" - lodash "^4.8.0" - readable-stream "^2.0.0" - tar-stream "^1.5.0" - zip-stream "^1.2.0" - are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" @@ -2683,37 +2923,24 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -aria-query@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" - integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - -arr-diff@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" - integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== dependencies: - arr-flatten "^1.0.1" - array-slice "^0.2.3" + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== -arr-union@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" - integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= - arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" @@ -2724,21 +2951,11 @@ array-bounds@^1.0.0, array-bounds@^1.0.1: resolved "https://registry.yarnpkg.com/array-bounds/-/array-bounds-1.0.1.tgz#da11356b4e18e075a4f0c86e1f179a67b7d7ea31" integrity sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ== -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= - array-filter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - array-find@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8" @@ -2754,7 +2971,7 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.0.3, array-includes@^3.1.1: +array-includes@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== @@ -2780,11 +2997,6 @@ array-rearrange@^2.2.2: resolved "https://registry.yarnpkg.com/array-rearrange/-/array-rearrange-2.2.2.tgz#fa1a2acf8d02e88dd0c9602aa0e06a79158b2283" integrity sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w== -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= - array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -2823,6 +3035,15 @@ array.prototype.flat@^1.2.3: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" +array.prototype.flatmap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" + integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -2887,12 +3108,12 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -ast-metadata-inferer@^0.2.0-0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.2.0.tgz#a470e5d1d7402b18c6f7a1f3d6900723cfa07392" - integrity sha512-6yPph2NeCHNxoI/ZmjklYaLOSZDAx+0L0+wsXnF56FxmjxvUlYZSWcj1KXtXO8IufruQTzVFOjg1+IzdDazSPg== +ast-metadata-inferer@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.4.0.tgz#6be85ceeffcf267bd79db8e1ae731da44880b45f" + integrity sha512-tKHdBe8N/Vq2nLAm4YPBVREVZjMux6KrqyPfNQgIbDl0t7HaNSmy8w4OyVHYg/cvyn5BW7o7pVwpjPte89Zhcg== -ast-types-flow@0.0.7, ast-types-flow@^0.0.7: +ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= @@ -2922,11 +3143,6 @@ async-exit-hook@^2.0.1: resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= - async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -2942,7 +3158,7 @@ async@0.9.x: resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= -async@^2.0.0, async@^2.6.2: +async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -2997,7 +3213,12 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== -axobject-query@^2.0.2: +axe-core@^3.5.4: + version "3.5.5" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-3.5.5.tgz#84315073b53fa3c0c51676c588d59da09a192227" + integrity sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q== + +axobject-query@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== @@ -3011,11 +3232,6 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@7.0.0-bridge.0: - version "7.0.0-bridge.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" - integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== - babel-core@^6.22.1, babel-core@^6.26.0: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" @@ -3041,7 +3257,7 @@ babel-core@^6.22.1, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.7" -babel-eslint@^10.0.3, babel-eslint@^10.1.0: +babel-eslint@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== @@ -3208,17 +3424,17 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@^25.1.0, babel-jest@^25.5.1: - version "25.5.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.5.1.tgz#bc2e6101f849d6f6aec09720ffc7bc5332e62853" - integrity sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ== +babel-jest@^26.1.0, babel-jest@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.2.2.tgz#70f618f2d7016ed71b232241199308985462f812" + integrity sha512-JmLuePHgA+DSOdOL8lPxCgD2LhPPm+rdw1vnxR73PpIrnmKCS2/aBhtkAcxQWuUcW2hBrH8MJ3LKXE7aWpNZyA== dependencies: - "@jest/transform" "^25.5.1" - "@jest/types" "^25.5.0" + "@jest/transform" "^26.2.2" + "@jest/types" "^26.2.0" "@types/babel__core" "^7.1.7" babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^25.5.0" - chalk "^3.0.0" + babel-preset-jest "^26.2.0" + chalk "^4.0.0" graceful-fs "^4.2.4" slash "^3.0.0" @@ -3270,13 +3486,14 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz#129c80ba5c7fc75baf3a45b93e2e372d57ca2677" - integrity sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g== +babel-plugin-jest-hoist@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz#bdd0011df0d3d513e5e95f76bd53b51147aca2dd" + integrity sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" babel-plugin-syntax-async-functions@^6.8.0: @@ -3329,11 +3546,6 @@ babel-plugin-syntax-trailing-function-commas@^6.22.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= -babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: - version "7.0.0-beta.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" - integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== - babel-plugin-transform-async-generator-functions@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" @@ -3705,39 +3917,6 @@ babel-preset-env@^1.1.8: invariant "^2.2.2" semver "^5.3.0" -babel-preset-fbjs@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz#a6024764ea86c8e06a22d794ca8b69534d263541" - integrity sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-member-expression-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-property-literals" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" - babel-preset-flow@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" @@ -3745,12 +3924,12 @@ babel-preset-flow@^6.23.0: dependencies: babel-plugin-transform-flow-strip-types "^6.22.0" -babel-preset-jest@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz#c1d7f191829487a907764c65307faa0e66590b49" - integrity sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw== +babel-preset-jest@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.2.0.tgz#f198201a4e543a43eb40bc481e19736e095fd3e0" + integrity sha512-R1k8kdP3R9phYQugXeNnK/nvCGlBzG4m3EoIIukC80GXb6wCv2XiwPhK6K9MAkQcMszWBYvl2Wm+yigyXFQqXg== dependencies: - babel-plugin-jest-hoist "^25.5.0" + babel-plugin-jest-hoist "^26.2.0" babel-preset-current-node-syntax "^0.1.2" babel-preset-react@^6.24.1: @@ -3931,6 +4110,11 @@ big-rat@^1.0.3: bn.js "^4.11.6" double-bits "^1.1.1" +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -3993,13 +4177,6 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" - bluebird-lst@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" @@ -4147,13 +4324,6 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -4238,6 +4408,16 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.8.5: node-releases "^1.1.53" pkg-up "^2.0.0" +browserslist@^4.12.2: + version "4.14.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.0.tgz#2908951abfe4ec98737b72f34c3bcedc8d43b000" + integrity sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ== + dependencies: + caniuse-lite "^1.0.30001111" + electron-to-chromium "^1.3.523" + escalade "^3.0.2" + node-releases "^1.1.60" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -4266,29 +4446,11 @@ bubleify@^1.1.0, bubleify@^1.2.0: dependencies: buble "^0.19.3" -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-crc32@^0.2.1, buffer-crc32@~0.2.3: +buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= - buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -4313,22 +4475,6 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.1.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -builder-util-runtime@8.7.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.0.tgz#e48ad004835c8284662e8eaf47a53468c66e8e8d" - integrity sha512-G1AqqVM2vYTrSFR982c1NNzwXKrGLQjVjaZaWQdn4O6Z3YKjdMDofw88aD9jpyK9ZXkrCxR0tI3Qe9wNbyTlXg== - dependencies: - debug "^4.1.1" - sax "^1.2.4" - builder-util-runtime@8.7.1: version "8.7.1" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.1.tgz#23c808cddd650d4376a7a1518ec1e80e85c10f00" @@ -4337,6 +4483,14 @@ builder-util-runtime@8.7.1: debug "^4.2.0" sax "^1.2.4" +builder-util-runtime@8.7.2: + version "8.7.2" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.2.tgz#d93afc71428a12789b437e13850e1fa7da956d72" + integrity sha512-xBqv+8bg6cfnzAQK1k3OGpfaHg+QkPgIgpEkXNhouZ0WiUkyZCftuRc2LYzQrLucFywpa14Xbc6+hTbpq83yRA== + dependencies: + debug "^4.1.1" + sax "^1.2.4" + builder-util@22.7.0: version "22.7.0" resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.7.0.tgz#0776a66e6d6e408a78bed7f17a7ad22516d9e7f0" @@ -4404,17 +4558,40 @@ cacache@^13.0.1: glob "^7.1.4" graceful-fs "^4.2.2" infer-owner "^1.0.4" - lru-cache "^5.1.1" - minipass "^3.0.0" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + +cacache@^15.0.5: + version "15.0.5" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" + integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" minipass-collect "^1.0.2" minipass-flush "^1.0.5" minipass-pipeline "^1.2.2" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - p-map "^3.0.0" + mkdirp "^1.0.3" + p-map "^4.0.0" promise-inflight "^1.0.1" - rimraf "^2.7.1" - ssri "^7.0.0" + rimraf "^3.0.2" + ssri "^8.0.0" + tar "^6.0.2" unique-filename "^1.1.1" cache-base@^1.0.1: @@ -4493,14 +4670,6 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" @@ -4515,11 +4684,6 @@ camelcase@^1.0.2: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -4540,16 +4704,21 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-db@^1.0.30001059: - version "1.0.30001085" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001085.tgz#4f6fcf0c10e69fabad8cf237b5990ee09718d7d8" - integrity sha512-+w8XO3jUi79lgiBANacwq/ZY8EnkOcatTyT7z03z/YxL2kysI9h3jUGKafkCkP69F4jpKXSjhJ9BUvsgQrGFpA== +caniuse-db@^1.0.30001090: + version "1.0.30001112" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001112.tgz#89cb249402af2ebf2c23a5585d1bd78cb5e38732" + integrity sha512-Xrn3lVEIsvAAUmFVHKKComfyCRM59NfuV3EwCXqs2XLgOxAqYgrfEs0vDk+Dk7KctlAMh6CH/CSd1srJt503ZA== caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.30001084: version "1.0.30001085" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001085.tgz#bed28bd51ff7425d33ee23e730c7f3b703711db6" integrity sha512-x0YRFRE0pmOD90z+9Xk7jwO58p4feVNXP+U8kWV+Uo/HADyrgESlepzIkUqPgaXkpyceZU6siM1gsK7sHgplqA== +caniuse-lite@^1.0.30001111: + version "1.0.30001112" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001112.tgz#0fffc3b934ff56ff0548c37bc9dad7d882bcf672" + integrity sha512-J05RTQlqsatidif/38aN3PGULCLrg8OYQOlJUKbeYVzC2mGZkZLIztwRlB3MtrfLmawUmjFlNJvy/uhwniIe1Q== + canvas-fit@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/canvas-fit/-/canvas-fit-1.5.0.tgz#ae13be66ade42f5be0e487e345fce30a5e5b5e5f" @@ -4608,7 +4777,7 @@ chai@^4.1.2: pathval "^1.1.0" type-detect "^4.0.5" -chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -4619,7 +4788,7 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -4644,6 +4813,11 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + character-entities-html4@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" @@ -4664,16 +4838,6 @@ character-reference-invalid@^1.0.0: resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" @@ -4715,10 +4879,10 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" - integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== +chokidar@^3.4.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -4735,6 +4899,11 @@ chownr@^1.1.1, chownr@^1.1.2: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + chrome-remote-interface@^0.25.3: version "0.25.7" resolved "https://registry.yarnpkg.com/chrome-remote-interface/-/chrome-remote-interface-0.25.7.tgz#827e85fbef3cc561a9ef2404eb7eee355968c5bc" @@ -4866,11 +5035,6 @@ cli-truncate@2.1.0, cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -5049,11 +5213,6 @@ color-string@^1.5.2: color-name "^1.0.0" simple-swizzle "^0.2.2" -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - color@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" @@ -5074,6 +5233,11 @@ colors@^1.3.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== +colour@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778" + integrity sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g= + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -5081,7 +5245,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@2, commander@^2.11.0, commander@^2.15.1, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@^2.8.1: +commander@2, commander@^2.15.1, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -5140,16 +5304,6 @@ component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -compress-commons@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f" - integrity sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8= - dependencies: - buffer-crc32 "^0.2.1" - crc32-stream "^2.0.0" - normalize-path "^2.0.0" - readable-stream "^2.0.0" - compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -5251,7 +5405,7 @@ connect-history-api-fallback@^1.6.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== -connected-react-router@^6.8.0: +connected-react-router@^6.6.1: version "6.8.0" resolved "https://registry.yarnpkg.com/connected-react-router/-/connected-react-router-6.8.0.tgz#ddc687b31d498322445d235d660798489fa56cae" integrity sha512-E64/6krdJM3Ag3MMmh2nKPtMbH15s3JQDuaYJvOVXzu6MbHbDyIvuwLOyhQIuP4Om9zqEfZYiVyflROibSsONg== @@ -5361,7 +5515,7 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.6.5: +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== @@ -5402,21 +5556,6 @@ country-regex@^1.1.0: resolved "https://registry.yarnpkg.com/country-regex/-/country-regex-1.1.0.tgz#51c333dcdf12927b7e5eeb9c10ac8112a6120896" integrity sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY= -crc32-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" - integrity sha1-483TtN8xaN10494/u8t7KX/pCPQ= - dependencies: - crc "^3.4.4" - readable-stream "^2.0.0" - -crc@^3.4.4: - version "3.8.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" - integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== - dependencies: - buffer "^5.1.0" - create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -5470,23 +5609,6 @@ cross-env@^7.0.0: dependencies: cross-spawn "^7.0.1" -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -5592,7 +5714,7 @@ css-global-keywords@^1.0.1: resolved "https://registry.yarnpkg.com/css-global-keywords/-/css-global-keywords-1.0.1.tgz#72a9aea72796d019b1d2a3252de4e5aaa37e4a69" integrity sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk= -css-loader@^3.4.2: +css-loader@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== @@ -5611,25 +5733,6 @@ css-loader@^3.4.2: schema-utils "^2.7.0" semver "^6.3.0" -css-modules-loader-core@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16" - integrity sha1-WQhmgpShvs0mGuCkziGwtVHyHRY= - dependencies: - icss-replace-symbols "1.1.0" - postcss "6.0.1" - postcss-modules-extract-imports "1.1.0" - postcss-modules-local-by-default "1.2.0" - postcss-modules-scope "1.1.0" - postcss-modules-values "1.3.0" - -css-parse@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" - integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= - dependencies: - css "^2.0.0" - css-select-base-adapter@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" @@ -5655,15 +5758,6 @@ css-select@~1.2.0: domutils "1.5.1" nth-check "~1.0.1" -css-selector-tokenizer@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz#11e5e27c9a48d90284f22d45061c303d7a25ad87" - integrity sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw== - dependencies: - cssesc "^3.0.0" - fastparse "^1.1.2" - regexpu-core "^4.6.0" - css-system-font-keywords@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz#85c6f086aba4eb32c571a3086affc434b84823ed" @@ -5685,11 +5779,6 @@ css-tree@1.0.0-alpha.39: mdn-data "2.0.6" source-map "^0.6.1" -css-value@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/css-value/-/css-value-0.0.1.tgz#5efd6c2eea5ea1fd6b6ac57ec0427b18452424ea" - integrity sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo= - css-what@2.1: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" @@ -5710,16 +5799,6 @@ css@2.2.3: source-map-resolve "^0.5.1" urix "^0.1.0" -css@^2.0.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== - dependencies: - inherits "^2.0.3" - source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" - csscolorparser@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" @@ -5805,7 +5884,7 @@ csso@^4.0.2: dependencies: css-tree "1.0.0-alpha.39" -cssom@^0.4.1: +cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== @@ -5815,7 +5894,7 @@ cssom@~0.3.6: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^2.0.0: +cssstyle@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== @@ -5827,6 +5906,11 @@ csstype@^2.2.0, csstype@^2.6.7: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== +csstype@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz#ee5ff8f208c8cd613b389f7b222c9801ca62b3f7" + integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== + cubic-hermite@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cubic-hermite/-/cubic-hermite-1.0.0.tgz#84e3b2f272b31454e8393b99bb6aed45168c14e5" @@ -5837,13 +5921,6 @@ cuint@^0.2.2: resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - cwise-compiler@^1.0.0, cwise-compiler@^1.1.1, cwise-compiler@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" @@ -6135,7 +6212,7 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" -damerau-levenshtein@^1.0.4: +damerau-levenshtein@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== @@ -6147,21 +6224,21 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" date-fns@^2.0.1: version "2.14.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.14.0.tgz#359a87a265bb34ef2e38f93ecf63ac453f9bc7ba" integrity sha512-1zD+68jhFgDIM0rF05rcwYO8cExdNqxjq4xP1QKM60Q45mnO6zaMWB4tOzrIr4M4GSLntsKeE4c9Bdl2jhL/yw== -debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.5.1, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.5.1, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -6175,7 +6252,7 @@ debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: +debug@^3.1.1, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -6197,11 +6274,16 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decimal.js@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" + integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -6268,11 +6350,6 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -deepmerge@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.0.1.tgz#25c1c24f110fb914f80001b925264dd77f3f4312" - integrity sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ== - default-gateway@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" @@ -6442,11 +6519,6 @@ detect-port@^1.3.0: address "^1.0.1" debug "^2.6.0" -dev-null@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dev-null/-/dev-null-0.1.1.tgz#5a205ce3c2b2ef77b6238d6ba179eb74c6a0e818" - integrity sha1-WiBc48Ky73e2I41roXnrdMag6Bg= - device-specs@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/device-specs/-/device-specs-1.0.0.tgz#47b54577b9b159118bbb0a175177d0aa9c50a9c9" @@ -6461,16 +6533,16 @@ devtron@^1.4.0: highlight.js "^9.3.0" humanize-plus "^1.8.1" -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== - diff-sequences@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== +diff-sequences@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.0.0.tgz#0760059a5c287637b842bd7085311db7060e88a6" + integrity sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg== + diff@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -6607,12 +6679,12 @@ domelementtype@^2.0.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== dependencies: - webidl-conversions "^4.0.2" + webidl-conversions "^5.0.0" domhandler@^2.3.0: version "2.4.2" @@ -6769,11 +6841,6 @@ ejs@^3.1.3: dependencies: jake "^10.6.1" -ejs@~2.5.6: - version "2.5.9" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.9.tgz#7ba254582a560d267437109a68354112475b0ce5" - integrity sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ== - electron-builder@^22.3.6: version "22.7.0" resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.7.0.tgz#a42d08a1654ffc2f7d9e2860829d3cc55d4a0c81" @@ -6794,14 +6861,6 @@ electron-builder@^22.3.6: update-notifier "^4.1.0" yargs "^15.3.1" -electron-chromedriver@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/electron-chromedriver/-/electron-chromedriver-8.0.0.tgz#16f6124d481e9312cc18abc16495ddc2d61f8264" - integrity sha512-d0210ExhkGOwYLXFZHQR6LISZ8UbMqXWLwjTe8Cdh44XlO4z4+6DWQfM0p7aB2Qak/An6tN732Yl98wN1ylZww== - dependencies: - electron-download "^4.1.1" - extract-zip "^1.6.7" - electron-debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/electron-debug/-/electron-debug-3.1.0.tgz#0df17297487fa3c82344d810812853bf67f0bd69" @@ -6820,21 +6879,6 @@ electron-devtools-installer@^2.2.4: rimraf "^2.5.2" semver "^5.3.0" -electron-download@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-4.1.1.tgz#02e69556705cc456e520f9e035556ed5a015ebe8" - integrity sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg== - dependencies: - debug "^3.0.0" - env-paths "^1.0.0" - fs-extra "^4.0.1" - minimist "^1.2.0" - nugget "^2.0.1" - path-exists "^3.0.0" - rc "^1.2.1" - semver "^5.4.1" - sumchecker "^2.0.2" - electron-is-accelerator@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz#509e510c26a56b55e17f863a4b04e111846ab27b" @@ -6855,7 +6899,7 @@ electron-localshortcut@^3.1.0: keyboardevent-from-electron-accelerator "^2.0.0" keyboardevents-areequal "^0.2.1" -electron-log@^4.0.6: +electron-log@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-4.2.2.tgz#b358dc6d1e4772465609ee3d8ad9f594d9e742c8" integrity sha512-lBpLh1Q8qayrTxFIrTPcNjSHsosvUfOYyZ8glhiLcx7zCNPDGuj8+nXlEaaSS6LRiQQbLgLG+wKpuvztNzBIrA== @@ -6894,23 +6938,28 @@ electron-to-chromium@^1.3.413, electron-to-chromium@^1.3.47: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.480.tgz#190ae45074578349a4c4f336fba29e76b20e9ef5" integrity sha512-wnuUfQCBMAdzu5Xe+F4FjaRK+6ToG6WvwG72s8k/3E6b+hoGVYGiQE7JD1NhiCMcqF3+wV+c2vAnaLGRSSWVqA== -electron-updater@^4.2.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.1.tgz#9d485b6262bc56fcf7ee62b1dc1b3b105a3e96a7" - integrity sha512-UDC5AHCgeiHJYDYWZG/rsl1vdAFKqI/Lm7whN57LKAk8EfhTewhcEHzheRcncLgikMcQL8gFo1KeX51tf5a5Wg== +electron-to-chromium@^1.3.523: + version "1.3.526" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.526.tgz#0e004899edf75afc172cce1b8189aac5dca646aa" + integrity sha512-HiroW5ZbGwgT8kCnoEO8qnGjoTPzJxduvV/Vv/wH63eo2N6Zj3xT5fmmaSPAPUM05iN9/5fIEkIg3owTtV6QZg== + +electron-updater@^4.3.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.4.tgz#6003f88be9004d7834e4dd757167033d0fc2d29a" + integrity sha512-ekpgxDrYl+Wi24ktO4qfj2CtCABxrmK1C/oekp0tai6q4VR4ZdPkit4CX8+GenvKMme7uMmfPFnLp/vwhP/ThQ== dependencies: - "@types/semver" "^7.1.0" - builder-util-runtime "8.7.0" - fs-extra "^9.0.0" - js-yaml "^3.13.1" + "@types/semver" "^7.3.1" + builder-util-runtime "8.7.2" + fs-extra "^9.0.1" + js-yaml "^3.14.0" lazy-val "^1.0.4" lodash.isequal "^4.5.0" - semver "^7.1.3" + semver "^7.3.2" -electron@7.1.13: - version "7.1.13" - resolved "https://registry.yarnpkg.com/electron/-/electron-7.1.13.tgz#f98838de70d74890cf639bbbbbe1f3b4b341ae78" - integrity sha512-WFfjhAG/B2iVjZcGoQkwkn/Zf1YN3U5Ux/hTcnANRiM6qPMAX23CINQC+vhlHspcjM9/jbF310fHCSrsXMGlAg== +electron@^8: + version "8.5.0" + resolved "https://registry.yarnpkg.com/electron/-/electron-8.5.0.tgz#a202738672214775fda27450b00ee516a66bffc4" + integrity sha512-ERqSTRlaQ4PqME5a1z9DWQbwQy2LbgSN1Jnau1MJCRRvHgq1FJlqbbb/ij/RGWuQuaxy4Djb2KnTs5rsemR5mQ== dependencies: "@electron/get" "^1.0.1" "@types/node" "^12.0.12" @@ -6951,7 +7000,12 @@ emittery@^0.4.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.4.1.tgz#abe9d3297389ba424ac87e53d1c701962ce7433d" integrity sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ== -emoji-regex@^7.0.1, emoji-regex@^7.0.2: +emittery@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" + integrity sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ== + +emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== @@ -6961,6 +7015,16 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.0.0.tgz#48a2309cc8a1d2e9d23bc6a67c39b63032e76ea4" + integrity sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" @@ -6995,7 +7059,7 @@ enhanced-resolve@^0.9.1: memory-fs "^0.2.0" tapable "^0.1.8" -enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1: +enhanced-resolve@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz#5d43bda4a0fd447cb0ebbe71bef8deff8805ad0d" integrity sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ== @@ -7004,6 +7068,15 @@ enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1: memory-fs "^0.5.0" tapable "^1.0.0" +enhanced-resolve@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + enquirer@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.5.tgz#3ab2b838df0a9d8ab9e7dff235b0e8712ef92381" @@ -7021,11 +7094,6 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== -env-paths@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" - integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA= - env-paths@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" @@ -7066,7 +7134,7 @@ enzyme-shallow-equal@^1.0.1: has "^1.0.3" object-is "^1.0.2" -enzyme-to-json@^3.4.4: +enzyme-to-json@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-3.5.0.tgz#3d536f1e8fb50d972360014fe2bd64e6a672f7dd" integrity sha512-clusXRsiaQhG7+wtyc4t7MU8N3zCOgf4eY9+CeSenYzKlFST4lxerfOvnWd4SNaToKhkuba+w6m242YpQOS7eA== @@ -7200,6 +7268,11 @@ es6-weak-map@^2.0.3: es6-iterator "^2.0.3" es6-symbol "^3.1.1" +escalade@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" + integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== + escape-carriage@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/escape-carriage/-/escape-carriage-1.3.0.tgz#71006b2d4da8cb6828686addafcb094239c742f3" @@ -7220,6 +7293,11 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -7237,6 +7315,18 @@ escodegen@^1.11.1: optionalDependencies: source-map "~0.6.1" +escodegen@^1.14.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + escodegen@~0.0.24: version "0.0.28" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-0.0.28.tgz#0e4ff1715f328775d6cab51ac44a406cd7abffd3" @@ -7258,7 +7348,7 @@ escodegen@~1.3.2: optionalDependencies: source-map "~0.1.33" -eslint-config-airbnb-base@^14.0.0, eslint-config-airbnb-base@^14.2.0: +eslint-config-airbnb-base@^14.2.0: version "14.2.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4" integrity sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q== @@ -7267,16 +7357,16 @@ eslint-config-airbnb-base@^14.0.0, eslint-config-airbnb-base@^14.2.0: object.assign "^4.1.0" object.entries "^1.1.2" -eslint-config-airbnb-typescript@^6.3.1: - version "6.3.2" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-6.3.2.tgz#d63d30f1f6b54fefdf619e0aa1e622d0f8bbccda" - integrity sha512-JdwaDl+0vX223MSKRyY+K8tQzrTcVDc3xCd3BtpQ4wsvu74Nbvvz7Ikuo/9ddFGZ2bNrYkfmXsPPrTdBJIxYug== +eslint-config-airbnb-typescript@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-9.0.0.tgz#2524f3fa6fceb3df4ae191d1e1114a04fe54c6e6" + integrity sha512-BxckAZU4rwfOidZVucAO120fTSGQAugimS8HFp7OoiordpyNkq5bxSlTPZ2XxSY8Q2NWDIygqtJKqupZld/TXA== dependencies: - "@typescript-eslint/parser" "^2.3.0" - eslint-config-airbnb "^18.0.1" - eslint-config-airbnb-base "^14.0.0" + "@typescript-eslint/parser" "^3.6.1" + eslint-config-airbnb "^18.2.0" + eslint-config-airbnb-base "^14.2.0" -eslint-config-airbnb@^18.0.1: +eslint-config-airbnb@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz#8a82168713effce8fc08e10896a63f1235499dcd" integrity sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg== @@ -7285,12 +7375,12 @@ eslint-config-airbnb@^18.0.1: object.assign "^4.1.0" object.entries "^1.1.2" -eslint-config-erb@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/eslint-config-erb/-/eslint-config-erb-0.3.0.tgz#54355f5730bdb0636f2ee77bf01ae2578cd26d05" - integrity sha512-cndLCtBXqS4wPCSJbyUSGiZ6qzgxxevcF/uYxx1EOX7WElii73xhw8PEl1fagRvAS60vF5SMYwkFUlQynWyUAQ== +eslint-config-erb@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-erb/-/eslint-config-erb-1.0.0.tgz#f6dd13de09e3ed805b30576a6f20532e0753bf72" + integrity sha512-UvmtvjCxaPkYzmpDLYDjmvAxoTggpW+NWYT/Dq4QkfMPqx1nAooU+YU3QsTFrme3x3xp8fj1n3cvimO1kwxb1g== dependencies: - babel-eslint "^10.0.3" + babel-eslint "^10.1.0" eslint-config-prettier@^6.11.0: version "6.11.0" @@ -7307,7 +7397,7 @@ eslint-import-resolver-node@^0.3.3: debug "^2.6.9" resolve "^1.13.1" -eslint-import-resolver-webpack@^0.12.1: +eslint-import-resolver-webpack@^0.12.2: version "0.12.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.2.tgz#769e86cd0c752a1536c19855ebd90aa14ce384ee" integrity sha512-7Jnm4YAoNNkvqPaZkKdIHsKGmv8/uNnYC5QsXkiSodvX4XEEfH2AKOna98FK52fCDXm3q4HzuX+7pRMKkJ64EQ== @@ -7331,23 +7421,24 @@ eslint-module-utils@^2.6.0: debug "^2.6.9" pkg-dir "^2.0.0" -eslint-plugin-compat@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-3.7.0.tgz#03f1ebb350a3c7eb93b6f461e200048e6008594b" - integrity sha512-A3uzSYqUjNj6rMyaBuU3l8wSCadZjeZRZ7WF3eU9vUT0JItiqRysjmYELkHHCpH8l7wRprUu4MZPr37lFCw7iA== +eslint-plugin-compat@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-3.8.0.tgz#2348d6105e7e87b823ae3b97b349512a2a45a7f2" + integrity sha512-5CuWUSZXZkXLCQJBriEpndn/YWrvggDSHTpRJq++kR8GVcsWbTdp8Eh+nBA7JlrNi7ZJ/+kniOVXmn3bpnxuRA== dependencies: - ast-metadata-inferer "^0.2.0-0" - browserslist "^4.12.0" - caniuse-db "^1.0.30001059" + ast-metadata-inferer "^0.4.0" + browserslist "^4.12.2" + caniuse-db "^1.0.30001090" core-js "^3.6.5" + find-up "^4.1.0" lodash.memoize "4.1.2" - mdn-browser-compat-data "^1.0.21" + mdn-browser-compat-data "^1.0.28" semver "7.3.2" -eslint-plugin-import@^2.21.2: - version "2.21.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz#8fef77475cc5510801bedc95f84b932f7f334a7c" - integrity sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA== +eslint-plugin-import@^2.22.0: + version "2.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" + integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== dependencies: array-includes "^3.1.1" array.prototype.flat "^1.2.3" @@ -7363,29 +7454,31 @@ eslint-plugin-import@^2.21.2: resolve "^1.17.0" tsconfig-paths "^3.9.0" -eslint-plugin-jest@^23.13.2: - version "23.16.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.16.0.tgz#fada00f765b5e32a1fb10a7490f75ebf673133b3" - integrity sha512-51KcQup31S2NBm+Yqg3rxZIPETd+wZ/gU2rb034RpdXLcZYsa2+uwubqbbDAYIpQw3m+wywF/A56OMEouBY/wA== +eslint-plugin-jest@^23.18.0: + version "23.20.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.20.0.tgz#e1d69c75f639e99d836642453c4e75ed22da4099" + integrity sha512-+6BGQt85OREevBDWCvhqj1yYA4+BFK4XnRZSGJionuEYmcglMZYLNNBBemwzbqUAckURaHdJSBcjHPyrtypZOw== dependencies: "@typescript-eslint/experimental-utils" "^2.5.0" -eslint-plugin-jsx-a11y@6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa" - integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg== +eslint-plugin-jsx-a11y@6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz#99ef7e97f567cc6a5b8dd5ab95a94a67058a2660" + integrity sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g== dependencies: - "@babel/runtime" "^7.4.5" - aria-query "^3.0.0" - array-includes "^3.0.3" + "@babel/runtime" "^7.10.2" + aria-query "^4.2.2" + array-includes "^3.1.1" ast-types-flow "^0.0.7" - axobject-query "^2.0.2" - damerau-levenshtein "^1.0.4" - emoji-regex "^7.0.2" + axe-core "^3.5.4" + axobject-query "^2.1.2" + damerau-levenshtein "^1.0.6" + emoji-regex "^9.0.0" has "^1.0.3" - jsx-ast-utils "^2.2.1" + jsx-ast-utils "^2.4.1" + language-tags "^1.0.5" -eslint-plugin-prettier@^3.1.3: +eslint-plugin-prettier@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== @@ -7397,27 +7490,27 @@ eslint-plugin-promise@^4.2.1: resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== -eslint-plugin-react-hooks@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.4.tgz#aed33b4254a41b045818cacb047b81e6df27fa58" - integrity sha512-equAdEIsUETLFNCmmCkiCGq6rkSK5MoJhXFPFYeUebcjKgBmWWcgVOqZyQC8Bv1BwVCnTq9tBxgJFgAJTWoJtA== +eslint-plugin-react-hooks@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.8.tgz#a9b1e3d57475ccd18276882eff3d6cba00da7a56" + integrity sha512-6SSb5AiMCPd8FDJrzah+Z4F44P2CdOaK026cXFV+o/xSRzfOiV1FNFeLl2z6xm3yqWOQEZ5OfVgiec90qV2xrQ== -eslint-plugin-react@^7.20.0: - version "7.20.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.0.tgz#f98712f0a5e57dfd3e5542ef0604b8739cd47be3" - integrity sha512-rqe1abd0vxMjmbPngo4NaYxTcR3Y4Hrmc/jg4T+sYz63yqlmJRknpEQfmWY+eDWPuMmix6iUIK+mv0zExjeLgA== +eslint-plugin-react@^7.20.3: + version "7.20.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.5.tgz#29480f3071f64a04b2c3d99d9b460ce0f76fb857" + integrity sha512-ajbJfHuFnpVNJjhyrfq+pH1C0gLc2y94OiCbAXT5O0J0YCKaFEHDV8+3+mDOr+w8WguRX+vSs1bM2BDG0VLvCw== dependencies: array-includes "^3.1.1" + array.prototype.flatmap "^1.2.3" doctrine "^2.1.0" has "^1.0.3" - jsx-ast-utils "^2.2.3" - object.entries "^1.1.1" + jsx-ast-utils "^2.4.1" + object.entries "^1.1.2" object.fromentries "^2.0.2" object.values "^1.1.1" prop-types "^15.7.2" - resolve "^1.15.1" + resolve "^1.17.0" string.prototype.matchall "^4.0.2" - xregexp "^4.3.0" eslint-plugin-testcafe@^0.2.1: version "0.2.1" @@ -7440,22 +7533,22 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^2.0.0: +eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.2.0: +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.2.0.tgz#d41b2e47804b30dbabb093a967fb283d560082e6" - integrity sha512-B3BtEyaDKC5MlfDa2Ha8/D6DsS4fju95zs0hjS3HdGazw+LNayai38A25qMppK37wWGWNYSPOR6oYzlz5MHsRQ== +eslint@^7.5.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.6.0.tgz#522d67cfaea09724d96949c70e7a0550614d64d6" + integrity sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -7463,10 +7556,11 @@ eslint@7.2.0: cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" + enquirer "^2.3.5" eslint-scope "^5.1.0" - eslint-utils "^2.0.0" - eslint-visitor-keys "^1.2.0" - espree "^7.1.0" + eslint-utils "^2.1.0" + eslint-visitor-keys "^1.3.0" + espree "^7.2.0" esquery "^1.2.0" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -7476,12 +7570,11 @@ eslint@7.2.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.4.1" - lodash "^4.17.14" + lodash "^4.17.19" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -7494,21 +7587,21 @@ eslint@7.2.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -esotope-hammerhead@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/esotope-hammerhead/-/esotope-hammerhead-0.5.3.tgz#4423efd9ea71e56dfd293d9f9c9eeddb51992842" - integrity sha512-EMZvx+2MXsAZxqa+bOJZp+5qWzKZ6jx/tYung2dOalujGWW5WKb52UhXR8rb60XyW/WbmoVBjOB1WMPkaSjEzw== +esotope-hammerhead@0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/esotope-hammerhead/-/esotope-hammerhead-0.5.5.tgz#dccae8ffe588238c3c3db9b78df45fe95add498a" + integrity sha512-EuSYJDtF8gLMB24lzjHw2KotauPsVJybFrtGfQyMm48oC7sTkspA26DqcqcbnRl4GC6sPVKWEx+ex72eqopX9Q== dependencies: "@types/estree" "^0.0.39" -espree@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c" - integrity sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw== +espree@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz#1c263d5b513dbad0ac30c4991b93ac354e948d69" + integrity sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g== dependencies: - acorn "^7.2.0" + acorn "^7.3.1" acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.2.0" + eslint-visitor-keys "^1.3.0" esprima@^1.0.3: version "1.2.5" @@ -7645,7 +7738,7 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^3.2.0, execa@^3.3.0: +execa@^3.3.0: version "3.4.0" resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== @@ -7661,6 +7754,21 @@ execa@^3.2.0, execa@^3.3.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" + integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + execa@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.2.tgz#ad87fb7b2d9d564f70d2b62d511bee41d5cbb240" @@ -7713,17 +7821,17 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -expect@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-25.5.0.tgz#f07f848712a2813bb59167da3fb828ca21f58bba" - integrity sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA== +expect@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.2.0.tgz#0140dd9cc7376d7833852e9cda88c05414f1efba" + integrity sha512-8AMBQ9UVcoUXt0B7v+5/U5H6yiUR87L6eKCfjE3spx7Ya5lF+ebUo37MCFBML2OiLfkX1sxmQOZhIDonyVTkcw== dependencies: - "@jest/types" "^25.5.0" + "@jest/types" "^26.2.0" ansi-styles "^4.0.0" - jest-get-type "^25.2.6" - jest-matcher-utils "^25.5.0" - jest-message-util "^25.5.0" - jest-regex-util "^25.2.6" + jest-get-type "^26.0.0" + jest-matcher-utils "^26.2.0" + jest-message-util "^26.2.0" + jest-regex-util "^26.0.0" express@^4.16.3, express@^4.17.1: version "4.17.1" @@ -7768,13 +7876,6 @@ ext@^1.1.2: dependencies: type "^2.0.0" -extend-shallow@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" - integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= - dependencies: - kind-of "^1.1.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -7795,24 +7896,6 @@ extend@3.0.2, extend@^3.0.0, extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -7832,7 +7915,7 @@ extract-frustum-planes@^1.0.0: resolved "https://registry.yarnpkg.com/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz#97d5703ff0564c8c3c6838cac45f9e7bc52c9ef5" integrity sha1-l9VwP/BWTIw8aDjKxF+ee8UsnvU= -extract-zip@^1.0.3, extract-zip@^1.6.7: +extract-zip@^1.0.3: version "1.7.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== @@ -7862,16 +7945,6 @@ falafel@^2.1.0: isarray "^2.0.1" object-keys "^1.0.6" -fancy-log@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" - integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - parse-node-version "^1.0.0" - time-stamp "^1.0.0" - fast-async@^7.0.0: version "7.0.6" resolved "https://registry.yarnpkg.com/fast-async/-/fast-async-7.0.6.tgz#a9bcc0b4aa6c7a5b25f0cec1a9b7324d13cb169b" @@ -7934,11 +8007,6 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fastparse@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" - integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== - fastq@^1.6.0: version "1.8.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" @@ -7967,22 +8035,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fbjs-scripts@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz#069a0c0634242d10031c6460ef1fccefcdae8b27" - integrity sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ== - dependencies: - "@babel/core" "^7.0.0" - ansi-colors "^1.0.1" - babel-preset-fbjs "^3.2.0" - core-js "^2.4.1" - cross-spawn "^5.1.0" - fancy-log "^1.3.2" - object-assign "^4.0.1" - plugin-error "^0.1.2" - semver "^5.1.0" - through2 "^2.0.0" - fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -7995,14 +8047,7 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -figures@^3.0.0, figures@^3.2.0: +figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -8016,13 +8061,13 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -file-loader@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-5.1.0.tgz#cb56c070efc0e40666424309bd0d9e45ac6f2bb8" - integrity sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg== +file-loader@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f" + integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== dependencies: - loader-utils "^1.4.0" - schema-utils "^2.5.0" + loader-utils "^2.0.0" + schema-utils "^2.6.5" file-saver@^1.3.8: version "1.3.8" @@ -8115,14 +8160,6 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -8216,11 +8253,6 @@ font-atlas@^2.1.0: dependencies: css-font "^1.0.0" -font-awesome@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" - integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM= - font-measure@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/font-measure/-/font-measure-1.2.2.tgz#41dbdac5d230dbf4db08865f54da28a475e83026" @@ -8284,12 +8316,7 @@ from2@^2.1.0, from2@^2.3.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^4.0.1, fs-extra@^4.0.3: +fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== @@ -8316,7 +8343,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0: +fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== @@ -8368,16 +8395,6 @@ fsevents@^2.1.2, fsevents@~2.1.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== -fstream@^1.0.0, fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - function-bind@^1.1.1, function-bind@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -8421,13 +8438,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gaze@^1.0.0, gaze@~1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" - gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" @@ -8915,7 +8925,7 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1, glob@~7.1.6: +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -9081,15 +9091,6 @@ globjoin@^0.1.4: resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= -globule@^1.0.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" - integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - glsl-inject-defines@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz#dd1aacc2c17fcb2bd3fc32411c6633d0d7b60fd4" @@ -9271,16 +9272,16 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4: +graceful-fs@4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.4.tgz#ef089d2880f033b011823ce5c8fae798da775dbd" + integrity sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0= + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -grapheme-splitter@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - graphlib@^2.1.5: version "2.1.8" resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" @@ -9346,16 +9347,6 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -9488,13 +9479,6 @@ history@^4.7.2, history@^4.9.0: tiny-warning "^1.0.0" value-equal "^1.0.1" -history@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/history/-/history-5.0.0.tgz#0cabbb6c4bbf835addb874f8259f6d25101efd08" - integrity sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg== - dependencies: - "@babel/runtime" "^7.7.6" - hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -9590,12 +9574,12 @@ html-element-map@^1.2.0: dependencies: array-filter "^1.0.0" -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== dependencies: - whatwg-encoding "^1.0.1" + whatwg-encoding "^1.0.5" html-entities@^1.3.1: version "1.3.1" @@ -9734,7 +9718,7 @@ humanize-plus@^1.8.1: resolved "https://registry.yarnpkg.com/humanize-plus/-/humanize-plus-1.8.2.tgz#a65b34459ad6367adbb3707a82a3c9f916167030" integrity sha1-pls0RZrWNnrbs3B6gqPJ+RYWcDA= -husky@^4.2.0: +husky@^4.2.5: version "4.2.5" resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.5.tgz#2b4f7622673a71579f901d9885ed448394b5fa36" integrity sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ== @@ -9750,7 +9734,7 @@ husky@^4.2.0: slash "^3.0.0" which-pm-runs "^1.0.0" -iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24: +iconv-lite@0.4, iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -9771,11 +9755,6 @@ iconv-lite@^0.5.1: dependencies: safer-buffer ">= 2.1.2 < 3" -icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= - icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" @@ -9881,11 +9860,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -in-publish@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" - integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== - incremental-convex-hull@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz#51428c14cb9d9a6144bfe69b2851fb377334be1e" @@ -9903,13 +9877,6 @@ indent-string@^1.2.2: minimist "^1.1.0" repeating "^1.1.0" -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -9933,7 +9900,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -9953,45 +9920,6 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.2.0.tgz#63ce99d823090de7eb420e4bb05e6f3449aa389a" - integrity sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ== - dependencies: - 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" - -inquirer@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -10447,6 +10375,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-potential-custom-element-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" + integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + is-regex@^1.0.4, is-regex@^1.0.5, is-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" @@ -10518,12 +10451,7 @@ is-symbol@^1.0.2: resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== dependencies: - has-symbols "^1.0.1" - -is-there@^4.4.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/is-there/-/is-there-4.5.0.tgz#62e918299660c4549b5388b8dd0c982f268fa30e" - integrity sha512-ko8s1Ll99F0fxKSGil5gdQCGOgkmOLWIC++OWBi3IvhlELNZzqUF/ydlcNnzMH18hau9wGfE77RjDMBxX1Qw+w== + has-symbols "^1.0.1" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" @@ -10555,7 +10483,7 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -is-wsl@^2.1.1: +is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -10614,7 +10542,7 @@ istanbul-lib-coverage@^3.0.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== -istanbul-lib-instrument@^4.0.0: +istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== @@ -10660,71 +10588,59 @@ jake@^10.6.1: filelist "^1.0.1" minimatch "^3.0.4" -jest-changed-files@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.5.0.tgz#141cc23567ceb3f534526f8614ba39421383634c" - integrity sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw== +jest-changed-files@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.2.0.tgz#b4946201defe0c919a2f3d601e9f98cb21dacc15" + integrity sha512-+RyJb+F1K/XBLIYiL449vo5D+CvlHv29QveJUWNPXuUicyZcq+tf1wNxmmFeRvAU1+TzhwqczSjxnCCFt7+8iA== dependencies: - "@jest/types" "^25.5.0" - execa "^3.2.0" + "@jest/types" "^26.2.0" + execa "^4.0.0" throat "^5.0.0" -jest-cli@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.5.4.tgz#b9f1a84d1301a92c5c217684cb79840831db9f0d" - integrity sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw== +jest-cli@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.2.2.tgz#4c273e5474baafac1eb15fd25aaafb4703f5ffbc" + integrity sha512-vVcly0n/ijZvdy6gPQiQt0YANwX2hLTPQZHtW7Vi3gcFdKTtif7YpI85F8R8JYy5DFSWz4x1OW0arnxlziu5Lw== dependencies: - "@jest/core" "^25.5.4" - "@jest/test-result" "^25.5.0" - "@jest/types" "^25.5.0" - chalk "^3.0.0" + "@jest/core" "^26.2.2" + "@jest/test-result" "^26.2.0" + "@jest/types" "^26.2.0" + chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" import-local "^3.0.2" is-ci "^2.0.0" - jest-config "^25.5.4" - jest-util "^25.5.0" - jest-validate "^25.5.0" + jest-config "^26.2.2" + jest-util "^26.2.0" + jest-validate "^26.2.0" prompts "^2.0.1" - realpath-native "^2.0.0" yargs "^15.3.1" -jest-config@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.5.4.tgz#38e2057b3f976ef7309b2b2c8dcd2a708a67f02c" - integrity sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg== +jest-config@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.2.2.tgz#f3ebc7e2bc3f49de8ed3f8007152f345bb111917" + integrity sha512-2lhxH0y4YFOijMJ65usuf78m7+9/8+hAb1PZQtdRdgnQpAb4zP6KcVDDktpHEkspBKnc2lmFu+RQdHukUUbiTg== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^25.5.4" - "@jest/types" "^25.5.0" - babel-jest "^25.5.1" - chalk "^3.0.0" + "@jest/test-sequencer" "^26.2.2" + "@jest/types" "^26.2.0" + babel-jest "^26.2.2" + chalk "^4.0.0" deepmerge "^4.2.2" glob "^7.1.1" graceful-fs "^4.2.4" - jest-environment-jsdom "^25.5.0" - jest-environment-node "^25.5.0" - jest-get-type "^25.2.6" - jest-jasmine2 "^25.5.4" - jest-regex-util "^25.2.6" - jest-resolve "^25.5.1" - jest-util "^25.5.0" - jest-validate "^25.5.0" + jest-environment-jsdom "^26.2.0" + jest-environment-node "^26.2.0" + jest-get-type "^26.0.0" + jest-jasmine2 "^26.2.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.2.2" + jest-util "^26.2.0" + jest-validate "^26.2.0" micromatch "^4.0.2" - pretty-format "^25.5.0" - realpath-native "^2.0.0" - -jest-diff@^24.3.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" + pretty-format "^26.2.0" -jest-diff@^25.5.0: +jest-diff@^25.2.1: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== @@ -10734,295 +10650,312 @@ jest-diff@^25.5.0: jest-get-type "^25.2.6" pretty-format "^25.5.0" -jest-docblock@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.3.0.tgz#8b777a27e3477cd77a168c05290c471a575623ef" - integrity sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg== - dependencies: - detect-newline "^3.0.0" - -jest-each@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.5.0.tgz#0c3c2797e8225cb7bec7e4d249dcd96b934be516" - integrity sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA== +jest-diff@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.2.0.tgz#dee62c771adbb23ae585f3f1bd289a6e8ef4f298" + integrity sha512-Wu4Aopi2nzCsHWLBlD48TgRy3Z7OsxlwvHNd1YSnHc7q1NJfrmyCPoUXrTIrydQOG5ApaYpsAsdfnMbJqV1/wQ== dependencies: - "@jest/types" "^25.5.0" - chalk "^3.0.0" - jest-get-type "^25.2.6" - jest-util "^25.5.0" - pretty-format "^25.5.0" + chalk "^4.0.0" + diff-sequences "^26.0.0" + jest-get-type "^26.0.0" + pretty-format "^26.2.0" -jest-environment-jsdom@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz#dcbe4da2ea997707997040ecf6e2560aec4e9834" - integrity sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A== +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== dependencies: - "@jest/environment" "^25.5.0" - "@jest/fake-timers" "^25.5.0" - "@jest/types" "^25.5.0" - jest-mock "^25.5.0" - jest-util "^25.5.0" - jsdom "^15.2.1" + detect-newline "^3.0.0" -jest-environment-node@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.5.0.tgz#0f55270d94804902988e64adca37c6ce0f7d07a1" - integrity sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA== +jest-each@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.2.0.tgz#aec8efa01d072d7982c900e74940863385fa884e" + integrity sha512-gHPCaho1twWHB5bpcfnozlc6mrMi+VAewVPNgmwf81x2Gzr6XO4dl+eOrwPWxbkYlgjgrYjWK2xgKnixbzH3Ew== dependencies: - "@jest/environment" "^25.5.0" - "@jest/fake-timers" "^25.5.0" - "@jest/types" "^25.5.0" - jest-mock "^25.5.0" - jest-util "^25.5.0" - semver "^6.3.0" - -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + "@jest/types" "^26.2.0" + chalk "^4.0.0" + jest-get-type "^26.0.0" + jest-util "^26.2.0" + pretty-format "^26.2.0" + +jest-environment-jsdom@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.2.0.tgz#6443a6f3569297dcaa4371dddf93acaf167302dc" + integrity sha512-sDG24+5M4NuIGzkI3rJW8XUlrpkvIdE9Zz4jhD8OBnVxAw+Y1jUk9X+lAOD48nlfUTlnt3lbAI3k2Ox+WF3S0g== + dependencies: + "@jest/environment" "^26.2.0" + "@jest/fake-timers" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + jest-mock "^26.2.0" + jest-util "^26.2.0" + jsdom "^16.2.2" + +jest-environment-node@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.2.0.tgz#fee89e06bdd4bed3f75ee2978d73ede9bb57a681" + integrity sha512-4M5ExTYkJ19efBzkiXtBi74JqKLDciEk4CEsp5tTjWGYMrlKFQFtwIVG3tW1OGE0AlXhZjuHPwubuRYY4j4uOw== + dependencies: + "@jest/environment" "^26.2.0" + "@jest/fake-timers" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + jest-mock "^26.2.0" + jest-util "^26.2.0" jest-get-type@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== -jest-haste-map@^25.5.1: - version "25.5.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.5.1.tgz#1df10f716c1d94e60a1ebf7798c9fb3da2620943" - integrity sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ== +jest-get-type@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.0.0.tgz#381e986a718998dbfafcd5ec05934be538db4039" + integrity sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg== + +jest-haste-map@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.2.2.tgz#6d4267b1903854bfdf6a871419f35a82f03ae71e" + integrity sha512-3sJlMSt+NHnzCB+0KhJ1Ut4zKJBiJOlbrqEYNdRQGlXTv8kqzZWjUKQRY3pkjmlf+7rYjAV++MQ4D6g4DhAyOg== dependencies: - "@jest/types" "^25.5.0" + "@jest/types" "^26.2.0" "@types/graceful-fs" "^4.1.2" + "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.4" - jest-serializer "^25.5.0" - jest-util "^25.5.0" - jest-worker "^25.5.0" + jest-regex-util "^26.0.0" + jest-serializer "^26.2.0" + jest-util "^26.2.0" + jest-worker "^26.2.1" micromatch "^4.0.2" sane "^4.0.3" walker "^1.0.7" - which "^2.0.2" optionalDependencies: fsevents "^2.1.2" -jest-jasmine2@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz#66ca8b328fb1a3c5364816f8958f6970a8526968" - integrity sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ== +jest-jasmine2@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.2.2.tgz#d82b1721fac2b153a4f8b3f0c95e81e702812de2" + integrity sha512-Q8AAHpbiZMVMy4Hz9j1j1bg2yUmPa1W9StBvcHqRaKa9PHaDUMwds8LwaDyzP/2fkybcTQE4+pTMDOG9826tEw== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^25.5.0" - "@jest/source-map" "^25.5.0" - "@jest/test-result" "^25.5.0" - "@jest/types" "^25.5.0" - chalk "^3.0.0" + "@jest/environment" "^26.2.0" + "@jest/source-map" "^26.1.0" + "@jest/test-result" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + chalk "^4.0.0" co "^4.6.0" - expect "^25.5.0" + expect "^26.2.0" is-generator-fn "^2.0.0" - jest-each "^25.5.0" - jest-matcher-utils "^25.5.0" - jest-message-util "^25.5.0" - jest-runtime "^25.5.4" - jest-snapshot "^25.5.1" - jest-util "^25.5.0" - pretty-format "^25.5.0" + jest-each "^26.2.0" + jest-matcher-utils "^26.2.0" + jest-message-util "^26.2.0" + jest-runtime "^26.2.2" + jest-snapshot "^26.2.2" + jest-util "^26.2.0" + pretty-format "^26.2.0" throat "^5.0.0" -jest-leak-detector@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz#2291c6294b0ce404241bb56fe60e2d0c3e34f0bb" - integrity sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA== +jest-leak-detector@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.2.0.tgz#073ee6d8db7a9af043e7ce99d8eea17a4fb0cc50" + integrity sha512-aQdzTX1YiufkXA1teXZu5xXOJgy7wZQw6OJ0iH5CtQlOETe6gTSocaYKUNui1SzQ91xmqEUZ/WRavg9FD82rtQ== dependencies: - jest-get-type "^25.2.6" - pretty-format "^25.5.0" + jest-get-type "^26.0.0" + pretty-format "^26.2.0" -jest-matcher-utils@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz#fbc98a12d730e5d2453d7f1ed4a4d948e34b7867" - integrity sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw== +jest-matcher-utils@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.2.0.tgz#b107af98c2b8c557ffd46c1adf06f794aa52d622" + integrity sha512-2cf/LW2VFb3ayPHrH36ZDjp9+CAeAe/pWBAwsV8t3dKcrINzXPVxq8qMWOxwt5BaeBCx4ZupVGH7VIgB8v66vQ== dependencies: - chalk "^3.0.0" - jest-diff "^25.5.0" - jest-get-type "^25.2.6" - pretty-format "^25.5.0" + chalk "^4.0.0" + jest-diff "^26.2.0" + jest-get-type "^26.0.0" + pretty-format "^26.2.0" -jest-message-util@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.5.0.tgz#ea11d93204cc7ae97456e1d8716251185b8880ea" - integrity sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA== +jest-message-util@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.2.0.tgz#757fbc1323992297092bb9016a71a2eb12fd22ea" + integrity sha512-g362RhZaJuqeqG108n1sthz5vNpzTNy926eNDszo4ncRbmmcMRIUAZibnd6s5v2XSBCChAxQtCoN25gnzp7JbQ== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/types" "^25.5.0" + "@jest/types" "^26.2.0" "@types/stack-utils" "^1.0.1" - chalk "^3.0.0" + chalk "^4.0.0" graceful-fs "^4.2.4" micromatch "^4.0.2" slash "^3.0.0" - stack-utils "^1.0.1" + stack-utils "^2.0.2" -jest-mock@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.5.0.tgz#a91a54dabd14e37ecd61665d6b6e06360a55387a" - integrity sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA== +jest-mock@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.2.0.tgz#a1b3303ab38c34aa1dbbc16ab57cdc1a59ed50d1" + integrity sha512-XeC7yWtWmWByoyVOHSsE7NYsbXJLtJNgmhD7z4MKumKm6ET0si81bsSLbQ64L5saK3TgsHo2B/UqG5KNZ1Sp/Q== dependencies: - "@jest/types" "^25.5.0" + "@jest/types" "^26.2.0" + "@types/node" "*" -jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" - integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== -jest-resolve-dependencies@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz#85501f53957c8e3be446e863a74777b5a17397a7" - integrity sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw== +jest-resolve-dependencies@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.2.2.tgz#2ad3cd9281730e9a5c487cd846984c5324e47929" + integrity sha512-S5vufDmVbQXnpP7435gr710xeBGUFcKNpNswke7RmFvDQtmqPjPVU/rCeMlEU0p6vfpnjhwMYeaVjKZAy5QYJA== dependencies: - "@jest/types" "^25.5.0" - jest-regex-util "^25.2.6" - jest-snapshot "^25.5.1" + "@jest/types" "^26.2.0" + jest-regex-util "^26.0.0" + jest-snapshot "^26.2.2" -jest-resolve@^25.5.1: - version "25.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.5.1.tgz#0e6fbcfa7c26d2a5fe8f456088dc332a79266829" - integrity sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ== +jest-resolve@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.2.2.tgz#324a20a516148d61bffa0058ed0c77c510ecfd3e" + integrity sha512-ye9Tj/ILn/0OgFPE/3dGpQPUqt4dHwIocxt5qSBkyzxQD8PbL0bVxBogX2FHxsd3zJA7V2H/cHXnBnNyyT9YoQ== dependencies: - "@jest/types" "^25.5.0" - browser-resolve "^1.11.3" - chalk "^3.0.0" + "@jest/types" "^26.2.0" + chalk "^4.0.0" graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.1" + jest-pnp-resolver "^1.2.2" + jest-util "^26.2.0" read-pkg-up "^7.0.1" - realpath-native "^2.0.0" resolve "^1.17.0" slash "^3.0.0" -jest-runner@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.5.4.tgz#ffec5df3875da5f5c878ae6d0a17b8e4ecd7c71d" - integrity sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg== +jest-runner@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.2.2.tgz#6d03d057886e9c782e10b2cf37443f902fe0e39e" + integrity sha512-/qb6ptgX+KQ+aNMohJf1We695kaAfuu3u3ouh66TWfhTpLd9WbqcF6163d/tMoEY8GqPztXPLuyG0rHRVDLxCA== dependencies: - "@jest/console" "^25.5.0" - "@jest/environment" "^25.5.0" - "@jest/test-result" "^25.5.0" - "@jest/types" "^25.5.0" - chalk "^3.0.0" + "@jest/console" "^26.2.0" + "@jest/environment" "^26.2.0" + "@jest/test-result" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.7.1" exit "^0.1.2" graceful-fs "^4.2.4" - jest-config "^25.5.4" - jest-docblock "^25.3.0" - jest-haste-map "^25.5.1" - jest-jasmine2 "^25.5.4" - jest-leak-detector "^25.5.0" - jest-message-util "^25.5.0" - jest-resolve "^25.5.1" - jest-runtime "^25.5.4" - jest-util "^25.5.0" - jest-worker "^25.5.0" + jest-config "^26.2.2" + jest-docblock "^26.0.0" + jest-haste-map "^26.2.2" + jest-leak-detector "^26.2.0" + jest-message-util "^26.2.0" + jest-resolve "^26.2.2" + jest-runtime "^26.2.2" + jest-util "^26.2.0" + jest-worker "^26.2.1" source-map-support "^0.5.6" throat "^5.0.0" -jest-runtime@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.5.4.tgz#dc981fe2cb2137abcd319e74ccae7f7eeffbfaab" - integrity sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ== - dependencies: - "@jest/console" "^25.5.0" - "@jest/environment" "^25.5.0" - "@jest/globals" "^25.5.2" - "@jest/source-map" "^25.5.0" - "@jest/test-result" "^25.5.0" - "@jest/transform" "^25.5.1" - "@jest/types" "^25.5.0" +jest-runtime@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.2.2.tgz#2480ff79320680a643031dd21998d7c63d83ab68" + integrity sha512-a8VXM3DxCDnCIdl9+QucWFfQ28KdqmyVFqeKLigHdErtsx56O2ZIdQkhFSuP1XtVrG9nTNHbKxjh5XL1UaFDVQ== + dependencies: + "@jest/console" "^26.2.0" + "@jest/environment" "^26.2.0" + "@jest/fake-timers" "^26.2.0" + "@jest/globals" "^26.2.0" + "@jest/source-map" "^26.1.0" + "@jest/test-result" "^26.2.0" + "@jest/transform" "^26.2.2" + "@jest/types" "^26.2.0" "@types/yargs" "^15.0.0" - chalk "^3.0.0" + chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.3" graceful-fs "^4.2.4" - jest-config "^25.5.4" - jest-haste-map "^25.5.1" - jest-message-util "^25.5.0" - jest-mock "^25.5.0" - jest-regex-util "^25.2.6" - jest-resolve "^25.5.1" - jest-snapshot "^25.5.1" - jest-util "^25.5.0" - jest-validate "^25.5.0" - realpath-native "^2.0.0" + jest-config "^26.2.2" + jest-haste-map "^26.2.2" + jest-message-util "^26.2.0" + jest-mock "^26.2.0" + jest-regex-util "^26.0.0" + jest-resolve "^26.2.2" + jest-snapshot "^26.2.2" + jest-util "^26.2.0" + jest-validate "^26.2.0" slash "^3.0.0" strip-bom "^4.0.0" yargs "^15.3.1" -jest-serializer@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.5.0.tgz#a993f484e769b4ed54e70e0efdb74007f503072b" - integrity sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA== +jest-serializer@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.2.0.tgz#92dcae5666322410f4bf50211dd749274959ddac" + integrity sha512-V7snZI9IVmyJEu0Qy0inmuXgnMWDtrsbV2p9CRAcmlmPVwpC2ZM8wXyYpiugDQnwLHx0V4+Pnog9Exb3UO8M6Q== dependencies: + "@types/node" "*" graceful-fs "^4.2.4" -jest-snapshot@^25.5.1: - version "25.5.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.5.1.tgz#1a2a576491f9961eb8d00c2e5fd479bc28e5ff7f" - integrity sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ== +jest-snapshot@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.2.2.tgz#9d2eda083a4a1017b157e351868749bd63211799" + integrity sha512-NdjD8aJS7ePu268Wy/n/aR1TUisG0BOY+QOW4f6h46UHEKOgYmmkvJhh2BqdVZQ0BHSxTMt04WpCf9njzx8KtA== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^25.5.0" - "@types/prettier" "^1.19.0" - chalk "^3.0.0" - expect "^25.5.0" + "@jest/types" "^26.2.0" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.2.0" graceful-fs "^4.2.4" - jest-diff "^25.5.0" - jest-get-type "^25.2.6" - jest-matcher-utils "^25.5.0" - jest-message-util "^25.5.0" - jest-resolve "^25.5.1" - make-dir "^3.0.0" + jest-diff "^26.2.0" + jest-get-type "^26.0.0" + jest-haste-map "^26.2.2" + jest-matcher-utils "^26.2.0" + jest-message-util "^26.2.0" + jest-resolve "^26.2.2" natural-compare "^1.4.0" - pretty-format "^25.5.0" - semver "^6.3.0" + pretty-format "^26.2.0" + semver "^7.3.2" -jest-util@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.5.0.tgz#31c63b5d6e901274d264a4fec849230aa3fa35b0" - integrity sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA== +jest-util@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.2.0.tgz#0597d2a27c559340957609f106c408c17c1d88ac" + integrity sha512-YmDwJxLZ1kFxpxPfhSJ0rIkiZOM0PQbRcfH0TzJOhqCisCAsI1WcmoQqO83My9xeVA2k4n+rzg2UuexVKzPpig== dependencies: - "@jest/types" "^25.5.0" - chalk "^3.0.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + chalk "^4.0.0" graceful-fs "^4.2.4" is-ci "^2.0.0" - make-dir "^3.0.0" + micromatch "^4.0.2" -jest-validate@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.5.0.tgz#fb4c93f332c2e4cf70151a628e58a35e459a413a" - integrity sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ== +jest-validate@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.2.0.tgz#97fedf3e7984b7608854cbf925b9ca6ebcbdb78a" + integrity sha512-8XKn3hM6VIVmLNuyzYLCPsRCT83o8jMZYhbieh4dAyKLc4Ypr36rVKC+c8WMpWkfHHpGnEkvWUjjIAyobEIY/Q== dependencies: - "@jest/types" "^25.5.0" - camelcase "^5.3.1" - chalk "^3.0.0" - jest-get-type "^25.2.6" + "@jest/types" "^26.2.0" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.0.0" leven "^3.1.0" - pretty-format "^25.5.0" + pretty-format "^26.2.0" -jest-watcher@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.5.0.tgz#d6110d101df98badebe435003956fd4a465e8456" - integrity sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q== +jest-watcher@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.2.0.tgz#45bdf2fecadd19c0a501f3b071a474dca636825b" + integrity sha512-674Boco4Joe0CzgKPL6K4Z9LgyLx+ZvW2GilbpYb8rFEUkmDGgsZdv1Hv5rxsRpb1HLgKUOL/JfbttRCuFdZXQ== dependencies: - "@jest/test-result" "^25.5.0" - "@jest/types" "^25.5.0" + "@jest/test-result" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" ansi-escapes "^4.2.1" - chalk "^3.0.0" - jest-util "^25.5.0" - string-length "^3.1.0" + chalk "^4.0.0" + jest-util "^26.2.0" + string-length "^4.0.1" -jest-worker@^25.4.0, jest-worker@^25.5.0: +jest-worker@^25.4.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== @@ -11030,25 +10963,29 @@ jest-worker@^25.4.0, jest-worker@^25.5.0: merge-stream "^2.0.0" supports-color "^7.0.0" -jest@^25.1.0: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest/-/jest-25.5.4.tgz#f21107b6489cfe32b076ce2adcadee3587acb9db" - integrity sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ== +jest-worker@^26.2.1: + version "26.2.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.2.1.tgz#5d630ab93f666b53f911615bc13e662b382bd513" + integrity sha512-+XcGMMJDTeEGncRb5M5Zq9P7K4sQ1sirhjdOxsN1462h6lFo9w59bl2LVQmdGEEeU3m+maZCkS2Tcc9SfCHO4A== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@^26.1.0: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.2.2.tgz#a022303887b145147204c5f66e6a5c832333c7e7" + integrity sha512-EkJNyHiAG1+A8pqSz7cXttoVa34hOEzN/MrnJhYnfp5VHxflVcf2pu3oJSrhiy6LfIutLdWo+n6q63tjcoIeig== dependencies: - "@jest/core" "^25.5.4" + "@jest/core" "^26.2.2" import-local "^3.0.2" - jest-cli "^25.5.4" + jest-cli "^26.2.2" jquery@x.*: version "3.5.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== -js-base64@^2.1.8: - version "2.6.1" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.1.tgz#c328374225d2e65569791ded73c258e2c59334c7" - integrity sha512-G5x2saUTupU9D/xBY9snJs3TxvwX8EkpLFiYlPpDt/VmMHOXprnSU1nxiTmFbijCX4BLF/cMRIfAcC5BiMYgFQ== - js-message@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.5.tgz#2300d24b1af08e89dd095bc1a4c9c9cfcb892d15" @@ -11084,36 +11021,36 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^15.2.1: - version "15.2.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" - integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== - dependencies: - 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" +jsdom@^16.2.2: + version "16.4.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" + integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" 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" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" tough-cookie "^3.0.1" - w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.1.2" - webidl-conversions "^4.0.2" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" - whatwg-url "^7.0.0" - ws "^7.0.0" + whatwg-url "^8.0.0" + ws "^7.2.3" xml-name-validator "^3.0.0" jsesc@^1.3.0: @@ -11166,7 +11103,7 @@ json3@^3.3.2: resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== -json5@^0.5.1: +json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= @@ -11218,7 +11155,7 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: +jsx-ast-utils@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== @@ -11233,11 +11170,6 @@ jupyter-paths@^2.0.0: dependencies: home-dir "^1.0.0" -just-extend@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.0.tgz#7278a4027d889601640ee0ce0e5a00b992467da4" - integrity sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA== - kdbush@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" @@ -11277,11 +11209,6 @@ killable@^1.0.1: resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== -kind-of@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" - integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -11323,6 +11250,11 @@ kleur@^4.0.1: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.0.1.tgz#3d4948534b666e2578f93b6fafb62108e64f05ef" integrity sha512-Qs6SqCLm63rd0kNVh+wO4XsWLU6kgfwwaPYsLiClWf0Tewkzsa6MvB21bespb8cz+ANS+2t3So1ge3gintzhlw== +klona@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/klona/-/klona-1.1.2.tgz#a79e292518a5a5412ec8d097964bff1571a64db0" + integrity sha512-xf88rTeHiXk+XE2Vhi6yj8Wm3gMZrygGdKjJqN8HkV+PwF/t50/LdAKHoHpPcxFAlmQszTZ1CugrK25S7qDRLA== + known-css-properties@^0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.19.0.tgz#5d92b7fa16c72d971bda9b7fe295bdf61836ee5b" @@ -11349,6 +11281,18 @@ lab.js@^20.0.1: ua-parser-js "^0.7.19" whatwg-fetch "^2.0.4" +language-subtag-registry@~0.3.2: + version "0.3.20" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz#a00a37121894f224f763268e431c55556b0c0755" + integrity sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + dependencies: + language-subtag-registry "~0.3.2" + last-call-webpack-plugin@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" @@ -11374,13 +11318,6 @@ lazy-val@^1.0.4: resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65" integrity sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q== -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= - dependencies: - readable-stream "^2.0.5" - left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" @@ -11424,7 +11361,7 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -lint-staged@^10.0.2: +lint-staged@^10.2.11: version "10.2.11" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.11.tgz#713c80877f2dc8b609b05bc59020234e766c9720" integrity sha512-LRRrSogzbixYaZItE2APaS4l2eJMjjf5MbclRZpLJtcQJShcvUzKXsNeZgsLIZ0H0+fg2tL4B59fU9wHIHtFIA== @@ -11466,17 +11403,6 @@ listr2@^2.1.0: rxjs "^6.5.5" through "^2.3.8" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -11492,6 +11418,16 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== +loader-utils@0.2.16: + version "0.2.16" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d" + integrity sha1-8IYyBm7YKCg13/iN+1JwR2Wt7m0= + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" @@ -11568,11 +11504,6 @@ lodash.flow@^3.3.0: resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -11593,11 +11524,16 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -"lodash@4.6.1 || ^4.16.1", lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.10: +"lodash@4.6.1 || ^4.16.1", lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@^4.17.19: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -11637,13 +11573,6 @@ loglevel@^1.6.8: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== -lolex@^5.0.0, lolex@^5.0.1, lolex@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" - integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== - dependencies: - "@sinonjs/commons" "^1.7.0" - longest-streak@^2.0.1: version "2.0.4" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" @@ -11661,14 +11590,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -11684,14 +11605,6 @@ lru-cache@2.6.3: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.6.3.tgz#51ccd0b4fc0c843587d7a5709ce4d3b7629bedc5" integrity sha1-UczQtPwMhDWH16VwnOTTt2Kb7cU= -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -11699,6 +11612,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + magic-string@^0.25.3: version "0.25.7" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" @@ -11740,7 +11660,7 @@ map-limit@0.0.1: dependencies: once "~1.3.0" -map-obj@^1.0.0, map-obj@^1.0.1: +map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= @@ -11893,10 +11813,10 @@ mdast-util-compact@^2.0.0: dependencies: unist-util-visit "^2.0.0" -mdn-browser-compat-data@^1.0.21: - version "1.0.26" - resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.26.tgz#2a0bd34358d6b4e687da6b8c01e439576503db6c" - integrity sha512-fULnPQLDsAH/ert7ZtKCDCPyD3gXCh+M0Qapab15VfDGUrqr3Q25HgIchiS6J/giqrfxPbYfCSnVY9Lp2FRPZQ== +mdn-browser-compat-data@^1.0.28: + version "1.0.34" + resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.34.tgz#6c62df103ebefb68207098f90aaf7d840028d21c" + integrity sha512-bIufENDguhcjV4qAguNEyEBoYuRgS7vIwSNifYt8s3FIBrsRwUd0xWah0P7H1lLIcBCPwwwQWpLgWHx3K7rFFg== dependencies: extend "3.0.2" @@ -11936,22 +11856,6 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.1.0, meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - meow@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/meow/-/meow-7.0.1.tgz#1ed4a0a50b3844b451369c48362eb0515f04c1dc" @@ -12038,7 +11942,7 @@ mime-db@1.44.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.41.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@^2.1.26, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== @@ -12115,7 +12019,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -12136,16 +12040,11 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - minipass-collect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" @@ -12189,6 +12088,14 @@ minizlib@^1.2.1: dependencies: minipass "^2.9.0" +minizlib@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.0.tgz#fd52c645301ef09a63a2c209697c294c6ce02cf3" + integrity sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -12213,14 +12120,14 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.1: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" -mkdirp@^1.0.4: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -12348,17 +12255,7 @@ mustache@^2.1.1, mustache@^2.1.2, mustache@^2.2.1, mustache@^2.3.0: resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nan@^2.12.1, nan@^2.13.2: +nan@^2.12.1: version "2.14.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== @@ -12503,6 +12400,11 @@ neo-async@^2.5.0, neo-async@^2.6.1: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + next-tick@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" @@ -12520,18 +12422,6 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/nise/-/nise-3.0.1.tgz#0659982af515e5aac15592226246243e8da0013d" - integrity sha512-fYcH9y0drBGSoi88kvhpbZEsenX58Yr+wOJ4/Mi1K4cy+iGP/a73gNoyNhu5E9QxPdgTlVChfIaAlnyOy/gHUA== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/formatio" "^4.0.1" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - lolex "^5.0.1" - path-to-regexp "^1.7.0" - node-abi@^2.11.0: version "2.18.0" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.18.0.tgz#1f5486cfd7d38bd4f5392fa44a4ad4d9a0dffbf4" @@ -12544,24 +12434,6 @@ node-forge@0.9.0: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== -node-gyp@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - node-gyp@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-6.1.0.tgz#64e31c61a4695ad304c1d5b82cf6b7c79cc79f3f" @@ -12627,44 +12499,27 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-notifier@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12" - integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw== +node-notifier@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-7.0.2.tgz#3a70b1b70aca5e919d0b1b022530697466d9c675" + integrity sha512-ux+n4hPVETuTL8+daJXTOC6uKLgMsl1RYfFv7DKRzyvzBapqco0rZZ9g72ZN8VS6V+gvNYHYa/ofcCY8fkJWsA== dependencies: growly "^1.3.0" - is-wsl "^2.1.1" - semver "^6.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" shellwords "^0.1.1" - which "^1.3.1" + uuid "^8.2.0" + which "^2.0.2" node-releases@^1.1.53: version "1.1.58" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935" integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg== -node-sass@^4.13.1: - version "4.14.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" - integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash "^4.17.15" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.13.2" - node-gyp "^3.8.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "2.2.5" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" +node-releases@^1.1.60: + version "1.1.60" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084" + integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA== node-version@^1.0.0: version "1.2.0" @@ -12700,13 +12555,6 @@ nodent@^3.2.6: nodent-runtime "^3.2.1" resolve "^1.5.0" -"nopt@2 || 3": - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - nopt@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" @@ -12715,7 +12563,7 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -12725,7 +12573,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.1.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -12792,11 +12640,6 @@ npm-conf@^1.1.3: config-chain "^1.1.11" pify "^3.0.0" -npm-install-package@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/npm-install-package/-/npm-install-package-2.1.0.tgz#d7efe3cfcd7ab00614b896ea53119dc9ab259125" - integrity sha1-1+/jz816sAYUuJbqUxGdyaslkSU= - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -12811,7 +12654,7 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.1.2: +npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -12828,19 +12671,6 @@ nth-check@^1.0.2, nth-check@~1.0.1: dependencies: boolbase "~1.0.0" -nugget@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" - integrity sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA= - dependencies: - debug "^2.1.3" - minimist "^1.1.0" - pretty-bytes "^1.0.2" - progress-stream "^1.1.0" - request "^2.45.0" - single-line-log "^1.1.2" - throttleit "0.0.2" - num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -13026,7 +12856,7 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -opencollective-postinstall@^2.0.2: +opencollective-postinstall@^2.0.2, opencollective-postinstall@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== @@ -13043,14 +12873,6 @@ opn@^5.5.0: dependencies: is-wsl "^1.1.0" -optimist@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - optimize-css-assets-webpack-plugin@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" @@ -13135,7 +12957,7 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.4: +osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -13177,6 +12999,13 @@ p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" + integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -13348,11 +13177,6 @@ parse-json@^5.0.0: json-parse-better-errors "^1.0.1" lines-and-columns "^1.1.6" -parse-node-version@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -13380,10 +13204,10 @@ parse5@2.2.3, parse5@^2.1.5: resolved "https://registry.yarnpkg.com/parse5/-/parse5-2.2.3.tgz#0c4fc41c1000c5e6b93d48b03f8083837834e9f6" integrity sha1-DE/EHBAAxea5PUiwP4CDg3g06fY= -parse5@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== +parse5@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== parse5@^1.5.0: version "1.5.1" @@ -13435,13 +13259,6 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -13489,15 +13306,6 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -13749,22 +13557,6 @@ plotly.js@^1.54.2: webgl-context "^2.2.0" world-calendars "^1.0.3" -plugin-error@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" - integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= - dependencies: - ansi-cyan "^0.1.1" - ansi-red "^0.1.1" - arr-diff "^1.0.1" - arr-union "^2.0.1" - extend-shallow "^1.1.2" - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - pngjs@^3.3.1: version "3.4.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" @@ -13966,13 +13758,6 @@ postcss-minify-selectors@^4.0.2: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -postcss-modules-extract-imports@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" - integrity sha1-thTJcgvmgW6u41+zpfqh26agXds= - dependencies: - postcss "^6.0.1" - postcss-modules-extract-imports@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" @@ -13980,14 +13765,6 @@ postcss-modules-extract-imports@^2.0.0: dependencies: postcss "^7.0.5" -postcss-modules-local-by-default@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" - integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - postcss-modules-local-by-default@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" @@ -13998,14 +13775,6 @@ postcss-modules-local-by-default@^3.0.2: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.0.0" -postcss-modules-scope@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" - integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - postcss-modules-scope@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" @@ -14014,14 +13783,6 @@ postcss-modules-scope@^2.2.0: postcss "^7.0.6" postcss-selector-parser "^6.0.0" -postcss-modules-values@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" - integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= - dependencies: - icss-replace-symbols "^1.1.0" - postcss "^6.0.1" - postcss-modules-values@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" @@ -14229,16 +13990,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== -postcss@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" - integrity sha1-AA29H47vIXqjaLmiEsX8QLKo8/I= - dependencies: - chalk "^1.1.3" - source-map "^0.5.6" - supports-color "^3.2.3" - -postcss@7.x.x, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: version "7.0.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== @@ -14247,15 +13999,6 @@ postcss@7.x.x, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, source-map "^0.6.1" supports-color "^6.1.0" -postcss@^6.0.1: - version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" - integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - potpack@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.1.tgz#d1b1afd89e4c8f7762865ec30bd112ab767e2ebf" @@ -14283,35 +14026,17 @@ prepend-http@^2.0.0: prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -pretty-bytes@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" - integrity sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ= + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: - get-stdin "^4.0.1" - meow "^3.1.0" + fast-diff "^1.1.2" -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" +prettier@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" + integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== -pretty-format@^25.5.0: +pretty-format@^25.2.1, pretty-format@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== @@ -14321,6 +14046,16 @@ pretty-format@^25.5.0: ansi-styles "^4.0.0" react-is "^16.12.0" +pretty-format@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.2.0.tgz#83ecc8d7de676ff224225055e72bd64821cec4f1" + integrity sha512-qi/8IuBu2clY9G7qCXgCdD1Bf9w+sXakdHTRToknzMtVy0g7c4MBWaZy7MfB7ndKZovRO6XRwJiAYqq+MC7SDA== + dependencies: + "@jest/types" "^26.2.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -14336,14 +14071,6 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress-stream@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" - integrity sha1-LNPP6jO6OonJwSHsM0er6asSX3c= - dependencies: - speedometer "~0.1.2" - through2 "~0.2.3" - progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -14419,11 +14146,6 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - psl@^1.1.28: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -14505,7 +14227,7 @@ pxls@^2.0.0: is-buffer "^2.0.3" to-uint8 "^1.4.1" -q@^1.1.2, q@~1.5.0: +q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= @@ -14661,7 +14383,7 @@ rc-animate@^3.0.0: raf "^3.4.0" rc-util "^5.0.1" -rc-slider@^9.3.1: +rc-slider@^9.2.4: version "9.3.1" resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-9.3.1.tgz#444012f3b4847d592b167a9cee6a1a46779a6ef4" integrity sha512-c52PWPyrfJWh28K6dixAm0906L3/4MUIxqrNQA4TLnC/Z+cBNycWJUZoJerpwSOE1HdM3XDwixCsmtFc/7aWlQ== @@ -14699,7 +14421,7 @@ rc-util@^5.0.0, rc-util@^5.0.1: react-is "^16.12.0" shallowequal "^1.1.0" -rc@^1.2.1, rc@^1.2.8: +rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -14719,7 +14441,7 @@ react-base16-styling@^0.5.1: lodash.flow "^3.3.0" pure-color "^1.2.0" -react-dom@^16.13.1: +react-dom@^16.12.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== @@ -14729,7 +14451,7 @@ react-dom@^16.13.1: prop-types "^15.6.2" scheduler "^0.19.1" -react-hot-loader@^4.12.19: +react-hot-loader@^4.12.21: version "4.12.21" resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.12.21.tgz#332e830801fb33024b5a147d6b13417f491eb975" integrity sha512-Ynxa6ROfWUeKWsTHxsrL2KMzujxJVPjs385lmB2t5cHUxdoRPGind9F00tOkdc1l5WBleOF4XEAMILY1KPIIDA== @@ -14743,7 +14465,7 @@ react-hot-loader@^4.12.19: shallowequal "^1.1.0" source-map "^0.7.3" -react-is@^16.12.0, react-is@^16.6.0, react-is@^16.6.3, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: +react-is@^16.12.0, react-is@^16.6.0, react-is@^16.6.3, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6, react-is@^16.9.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -14914,14 +14636,6 @@ read-file-relative@^1.2.0: dependencies: callsite "^1.0.0" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -14939,15 +14653,6 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -14976,7 +14681,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -15034,11 +14739,6 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" -realpath-native@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" - integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== - recursive-readdir@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" @@ -15046,14 +14746,6 @@ recursive-readdir@^2.2.2: dependencies: minimatch "3.0.4" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -15123,6 +14815,11 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== +regenerator-runtime@^0.13.5: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -15175,7 +14872,7 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^4.5.4, regexpu-core@^4.6.0, regexpu-core@^4.7.0: +regexpu-core@^4.5.4, regexpu-core@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== @@ -15413,23 +15110,23 @@ replicator@^1.0.3: resolved "https://registry.yarnpkg.com/replicator/-/replicator-1.0.3.tgz#c0b3ea31e749015bae5d52273f2ae35d541b87ef" integrity sha512-WsKsraaM0x0QHy5CtzdgFXUxyowoBhyNkmPqmZShW6h+rOWnyT6Od3zRdTX9r616rAA6kDC9MKQGnSM/CJKfVQ== -request-promise-core@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" - integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== dependencies: - lodash "^4.17.15" + lodash "^4.17.19" -request-promise-native@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" - integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== +request-promise-native@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== dependencies: - request-promise-core "1.1.3" + request-promise-core "1.1.4" stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.45.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: +request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -15546,23 +15243,23 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.7, resolve@~1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - resolve@^0.6.1: version "0.6.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" integrity sha1-3ZV5gufnNt699TtYpN2RdUV13UY= -resolve@^1.0.0, resolve@^1.1.5, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.5.0, resolve@~1.17.0: +resolve@^1.0.0, resolve@^1.1.5, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.5.0, resolve@~1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" +resolve@~1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -15613,11 +15310,6 @@ rgb-regex@^1.0.1: resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= -rgb2hex@^0.1.9: - version "0.1.10" - resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.10.tgz#4fdd432665273e2d5900434940ceba0a04c8a8a8" - integrity sha512-vKz+kzolWbL3rke/xeTE2+6vHmZnNxGyDnaVW4OckntAIcc7DcZzWkQSfxMDwqHS8vhgySnIFyBUH7lIk6PxvQ== - rgba-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" @@ -15635,13 +15327,6 @@ right-now@^1.0.0: resolved "https://registry.yarnpkg.com/right-now/-/right-now-1.0.0.tgz#6e89609deebd7dcdaf8daecc9aea39cf585a0918" integrity sha1-bolgne69fc2vja7Mmuo5z1haCRg= -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -15649,7 +15334,14 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^3.0.0: +rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -15772,11 +15464,6 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.2.0, run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" @@ -15794,24 +15481,12 @@ rw@1, rw@^1.3.3: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= - rxjs-compat@^6.5.5: version "6.5.5" resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.5.5.tgz#073c40510f29c45a2a5fc02dde87f8c3ad75f2c2" integrity sha512-F42sssVbUyWH4vJswEo6m+Eh02xHv3q93n8S7nUJO58R7sbc3CvJIOts605zdaBhWa1xMB9aVSyqPqhQ5q3eXg== -"rxjs@^6.0.0 || ^5.6.0-forward-compat.4", rxjs@^6.3.1, rxjs@^6.3.3, rxjs@^6.5.2, rxjs@^6.5.3, rxjs@^6.5.5: +"rxjs@^6.0.0 || ^5.6.0-forward-compat.4", rxjs@^6.3.1, rxjs@^6.3.3, rxjs@^6.5.2, rxjs@^6.5.5: version "6.5.5" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== @@ -15867,38 +15542,28 @@ sanitize-filename@^1.6.0, sanitize-filename@^1.6.2, sanitize-filename@^1.6.3: dependencies: truncate-utf8-bytes "^1.0.0" -sass-graph@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" - integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^13.3.2" - -sass-loader@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" - integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== +sass-loader@^9.0.2: + version "9.0.3" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-9.0.3.tgz#086adcf0bfdcc9d920413e2cdc3ba3321373d547" + integrity sha512-fOwsP98ac1VMme+V3+o0HaaMHp8Q/C9P+MUazLFVi3Jl7ORGHQXL1XeRZt3zLSGZQQPC8xE42Y2WptItvGjDQg== dependencies: - clone-deep "^4.0.1" - loader-utils "^1.2.3" - neo-async "^2.6.1" - schema-utils "^2.6.1" - semver "^6.3.0" + klona "^1.1.2" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^2.7.0" + semver "^7.3.2" sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^3.1.9: - version "3.1.11" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" - integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== +saxes@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: - xmlchars "^2.1.1" + xmlchars "^2.2.0" scheduler@^0.19.0, scheduler@^0.19.1: version "0.19.1" @@ -15917,7 +15582,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: +schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== @@ -15926,14 +15591,6 @@ schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6 ajv "^6.12.2" ajv-keywords "^3.4.1" -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - seedrandom@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" @@ -15992,7 +15649,7 @@ semver-regex@^2.0.0: resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -16007,7 +15664,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.2, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2: +semver@7.3.2, semver@^7.2.1, semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== @@ -16017,11 +15674,6 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= - send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -16055,6 +15707,13 @@ serialize-javascript@^3.1.0: dependencies: randombytes "^2.1.0" +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -16249,26 +15908,6 @@ simplify-planar-graph@^2.0.1: robust-orientation "^1.0.1" simplicial-complex "^0.3.3" -single-line-log@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" - integrity sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q= - dependencies: - string-width "^1.0.1" - -sinon@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-8.1.1.tgz#21fffd5ad0a2d072a8aa7f8a3cf7ed2ced497497" - integrity sha512-E+tWr3acRdoe1nXbHMu86SSqA1WGM7Yw3jZRLvlCMnXwTHP8lgFFVn5BnKnF26uc5SfZ3D7pA9sN7S3Y2jG4Ew== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/formatio" "^4.0.1" - "@sinonjs/samsam" "^4.2.2" - diff "^4.0.2" - lolex "^5.1.2" - nise "^3.0.1" - supports-color "^7.1.0" - sisteransi@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -16388,7 +16027,7 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-resolve@^0.5.0, source-map-resolve@^0.5.1, source-map-resolve@^0.5.2: +source-map-resolve@^0.5.0, source-map-resolve@^0.5.1: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== @@ -16431,13 +16070,6 @@ source-map@^0.1.38, source-map@~0.1.33: dependencies: amdefine ">=0.0.4" -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" - source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -16534,23 +16166,6 @@ specificity@^0.4.1: resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== -spectron@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/spectron/-/spectron-10.0.1.tgz#d89fdd3c9625c7dbb5d1f047fda7cb922eda0125" - integrity sha512-eMAOr7ovYf+e6+DhkoxVWAMRfZvLJMjtZKwWYkL56fv3Ij6rxhYLjOxybKj0phgMYZ7o2cX5zu2NoyiUM756CA== - dependencies: - "@types/webdriverio" "^4.8.0" - dev-null "^0.1.1" - electron-chromedriver "^8.0.0" - request "^2.87.0" - split "^1.0.0" - webdriverio "^4.13.0" - -speedometer@~0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" - integrity sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0= - split-polygon@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/split-polygon/-/split-polygon-1.0.0.tgz#0eacc8a136a76b12a3d95256ea7da45db0c2d247" @@ -16566,13 +16181,6 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" - sprintf-js@^1.0.3, sprintf-js@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" @@ -16613,6 +16221,13 @@ ssri@^7.0.0: figgy-pudding "^3.5.1" minipass "^3.1.1" +ssri@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.0.tgz#79ca74e21f8ceaeddfcb4b90143c458b8d988808" + integrity sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA== + dependencies: + minipass "^3.1.1" + stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -16623,10 +16238,12 @@ stack-trace@0.0.9: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= -stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== +stack-utils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" + integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg== + dependencies: + escape-string-regexp "^2.0.0" stackframe@^0.3.1: version "0.3.1" @@ -16687,13 +16304,6 @@ static-module@^1.0.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== - dependencies: - readable-stream "^2.0.1" - stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -16741,13 +16351,13 @@ string-argv@0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -string-length@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" - integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== +string-length@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" + integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== dependencies: - astral-regex "^1.0.0" - strip-ansi "^5.2.0" + char-regex "^1.0.2" + strip-ansi "^6.0.0" string-split-by@^1.0.0: version "1.0.0" @@ -16773,7 +16383,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.0: +"string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -16930,13 +16540,6 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -16959,7 +16562,7 @@ strongly-connected-components@^1.0.1: resolved "https://registry.yarnpkg.com/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz#0920e2b4df67c8eaee96c6b6234fe29e873dba99" integrity sha1-CSDitN9nyOrulsa2I0/inoc9upk= -style-loader@^1.1.3: +style-loader@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== @@ -16981,7 +16584,7 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -stylelint-config-prettier@^8.0.1: +stylelint-config-prettier@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/stylelint-config-prettier/-/stylelint-config-prettier-8.0.2.tgz#da9de33da4c56893cbe7e26df239a7374045e14e" integrity sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A== @@ -16991,14 +16594,14 @@ stylelint-config-recommended@^3.0.0: resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657" integrity sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ== -stylelint-config-standard@^19.0.0: - version "19.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-19.0.0.tgz#66f0cf13f33b8a9e34965881493b38fc1313693a" - integrity sha512-VvcODsL1PryzpYteWZo2YaA5vU/pWfjqBpOvmeA8iB2MteZ/ZhI1O4hnrWMidsS4vmEJpKtjdhLdfGJmmZm6Cg== +stylelint-config-standard@^20.0.0: + version "20.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz#06135090c9e064befee3d594289f50e295b5e20d" + integrity sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA== dependencies: stylelint-config-recommended "^3.0.0" -stylelint@^13.0.0: +stylelint@^13.6.1: version "13.6.1" resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.6.1.tgz#cc1d76338116d55e8ff2be94c4a4386c1239b878" integrity sha512-XyvKyNE7eyrqkuZ85Citd/Uv3ljGiuYHC6UiztTR6sWS9rza8j3UeQv/eGcQS9NZz/imiC4GKdk1EVL3wst5vw== @@ -17059,13 +16662,6 @@ sugarss@^2.0.0: dependencies: postcss "^7.0.2" -sumchecker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e" - integrity sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4= - dependencies: - debug "^2.2.0" - sumchecker@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" @@ -17090,14 +16686,7 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= - dependencies: - has-flag "^1.0.0" - -supports-color@^5.3.0, supports-color@^5.4.0: +supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -17118,13 +16707,6 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@~5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.0.1.tgz#1c5331f22250c84202805b2f17adf16699f3a39a" - integrity sha512-7FQGOlSQ+AQxBNXJpVDj8efTA/FtyB5wcNE1omXXJ0cq6jm1jjDwuROlYDbnzHqdNPqliWFhcioCWSyav+xBnA== - dependencies: - has-flag "^2.0.0" - supports-hyperlinks@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" @@ -17197,7 +16779,7 @@ symbol-observable@^1.2.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -symbol-tree@^3.2.2: +symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== @@ -17243,28 +16825,6 @@ tape@^4.0.0: string.prototype.trim "~1.2.1" through "~2.3.8" -tar-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== - dependencies: - bl "^1.0.0" - buffer-alloc "^1.2.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.3.0" - to-buffer "^1.1.1" - xtend "^4.0.0" - -tar@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" - integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== - dependencies: - block-stream "*" - fstream "^1.0.12" - inherits "2" - tar@^4.4.12: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" @@ -17278,6 +16838,18 @@ tar@^4.4.12: safe-buffer "^5.1.2" yallist "^3.0.3" +tar@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.2.tgz#5df17813468a6264ff14f766886c622b84ae2f39" + integrity sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.0" + mkdirp "^1.0.3" + yallist "^4.0.0" + temp-file@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.3.7.tgz#686885d635f872748e384e871855958470aeb18a" @@ -17314,7 +16886,7 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser-webpack-plugin@^2.3.2, terser-webpack-plugin@^2.3.5: +terser-webpack-plugin@^2.3.5: version "2.3.7" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.7.tgz#4910ff5d1a872168cc7fa6cd3749e2b0d60a8a0b" integrity sha512-xzYyaHUNhzgaAdBsXxk2Yvo/x1NJdslUaussK3fdpBbvttm1iIwU+c26dj9UxJcwk2c5UWt5F55MUTIA8BE7Dg== @@ -17329,7 +16901,22 @@ terser-webpack-plugin@^2.3.2, terser-webpack-plugin@^2.3.5: terser "^4.6.12" webpack-sources "^1.4.3" -terser@^4.1.2, terser@^4.6.12: +terser-webpack-plugin@^3.0.7: + version "3.1.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.1.0.tgz#91e6d39571460ed240c0cf69d295bcf30ebf98cb" + integrity sha512-cjdZte66fYkZ65rQ2oJfrdCAkkhJA7YLYk5eGOcGCSGlq0ieZupRdjedSQXYknMPo2IveQL+tPdrxUkERENCFA== + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + jest-worker "^26.2.1" + p-limit "^3.0.2" + schema-utils "^2.6.6" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.8.0" + webpack-sources "^1.4.3" + +terser@^4.1.2, terser@^4.6.12, terser@^4.8.0: version "4.8.0" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== @@ -17347,10 +16934,10 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -testcafe-browser-provider-electron@^0.0.14: - version "0.0.14" - resolved "https://registry.yarnpkg.com/testcafe-browser-provider-electron/-/testcafe-browser-provider-electron-0.0.14.tgz#093d4173084947858a255114f3442076b582b8a9" - integrity sha512-FcnOm1GMKPC0SWn5IFRitBJ6xSLWuLyzaZopZ+MH+Pp95hy4atVWbImDTJzTr4aHtPqs3GNdF1H7Ff2t7CmuNw== +testcafe-browser-provider-electron@^0.0.15: + version "0.0.15" + resolved "https://registry.yarnpkg.com/testcafe-browser-provider-electron/-/testcafe-browser-provider-electron-0.0.15.tgz#4c0d084222349501cf2eb400ccac50029cb454ae" + integrity sha512-nmsYcaf0HXv+8yDQxHR9b8kWkPwRPDVV5cwrZUCR2bh43pCozkcmgvWCFn9uD2twFo/oead61oBh9eMMxdTdZA== dependencies: babel-runtime "^6.25.0" chrome-remote-interface "^0.27.0" @@ -17366,10 +16953,10 @@ testcafe-browser-provider-electron@^0.0.14: promisify-event "^1.0.0" proxyquire "^1.7.10" -testcafe-browser-tools@2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/testcafe-browser-tools/-/testcafe-browser-tools-2.0.12.tgz#33b0173b5d7cd4c1327a94139f93630e6012ca65" - integrity sha512-5oNNYlcZiDspqJB6L8CfI4vxjzkvARSZv3pa+JrFAoqYmEA3VPiAvzrn+P0zi0D5jEPkKngW2KTpq6r3GfdDNw== +testcafe-browser-tools@2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/testcafe-browser-tools/-/testcafe-browser-tools-2.0.13.tgz#1b185539d64991ad0a4da11992beeb6b4bd5ba9d" + integrity sha512-r0AfCNsOJWXHAR+KADumfCffsH3LYoEbJXfmGOG47uEt1FBEw8cWTSWRBp5As+DaAmh9pi75P+ZF6K09WudM/g== dependencies: array-find "^1.0.0" dedent "^0.7.0" @@ -17387,10 +16974,10 @@ testcafe-browser-tools@2.0.12: read-file-relative "^1.2.0" which-promise "^1.0.0" -testcafe-hammerhead@17.1.2: - version "17.1.2" - resolved "https://registry.yarnpkg.com/testcafe-hammerhead/-/testcafe-hammerhead-17.1.2.tgz#589e9dfe397bb5181725af177e7385a308e8a6f5" - integrity sha512-WkTRrZoMYIZkB0NGiT+xrlD71hcMDX/a34iHNdrUBwcw9o/xi7ym4YzyZO0LXrG5b1pzuLS3ll/o5OqkhfRZnw== +testcafe-hammerhead@17.1.12: + version "17.1.12" + resolved "https://registry.yarnpkg.com/testcafe-hammerhead/-/testcafe-hammerhead-17.1.12.tgz#9628970ba8da0b12c5713c43738544062c45c327" + integrity sha512-Z2DsjiFQ+LWhi1NZN9nasyhWEUNgSprVuu/8NvLGwfb5XSmWHuGGH7xMiowkpb1jyiTcN1qSd6RXoSHqmRIonw== dependencies: acorn-hammerhead "^0.3.0" asar "^2.0.1" @@ -17399,9 +16986,9 @@ testcafe-hammerhead@17.1.2: crypto-md5 "^1.0.0" css "2.2.3" debug "4.1.1" - esotope-hammerhead "0.5.3" + esotope-hammerhead "0.5.5" iconv-lite "0.5.1" - lodash "^4.17.13" + lodash "^4.17.19" lru-cache "2.6.3" match-url-wildcard "0.0.4" merge-stream "^1.0.1" @@ -17466,10 +17053,10 @@ testcafe-reporter-xunit@^2.1.0: resolved "https://registry.yarnpkg.com/testcafe-reporter-xunit/-/testcafe-reporter-xunit-2.1.0.tgz#e6d66c572ce15af266706af0fd610b2a841dd443" integrity sha1-5tZsVyzhWvJmcGrw/WELKoQd1EM= -testcafe@^1.8.0: - version "1.8.6" - resolved "https://registry.yarnpkg.com/testcafe/-/testcafe-1.8.6.tgz#7077964ffce0bdfd7ac590912068665f197703d0" - integrity sha512-h4cpvyBZqBXAxCqjaf3iswWFWJ4ZCtNP64+BniWj+bU0MZbTD64DOsyF92zQg09x+odQhU8Hm2zyCxKgAMCbtg== +testcafe@^1.8.8: + version "1.9.0" + resolved "https://registry.yarnpkg.com/testcafe/-/testcafe-1.9.0.tgz#72529ee0bea20d6558b3201045e148d82c8c0a89" + integrity sha512-ulWCTrpWuKz33n6Nel2TB+7yiiABX8yQF5qvMYvhJ1iMmY3nVqDf6DWrBdY+YS6q3zdP36UGjBMstJFI5GEWeA== dependencies: "@types/node" "^10.12.19" async-exit-hook "^1.1.2" @@ -17495,6 +17082,7 @@ testcafe@^1.8.0: dedent "^0.4.0" del "^3.0.0" device-specs "^1.0.0" + diff "^4.0.2" elegant-spinner "^1.0.1" emittery "^0.4.1" endpoint-utils "^1.0.2" @@ -17533,8 +17121,8 @@ testcafe@^1.8.0: sanitize-filename "^1.6.0" source-map-support "^0.5.16" strip-bom "^2.0.0" - testcafe-browser-tools "2.0.12" - testcafe-hammerhead "17.1.2" + testcafe-browser-tools "2.0.13" + testcafe-hammerhead "17.1.12" testcafe-legacy-api "4.0.0" testcafe-reporter-json "^2.1.0" testcafe-reporter-list "^2.1.0" @@ -17563,11 +17151,6 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -throttleit@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" - integrity sha1-z+34jmDADdlpe2H90qg0OptoDq8= - through2@^0.6.3: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" @@ -17584,14 +17167,6 @@ through2@^2.0.0, through2@^2.0.1: readable-stream "~2.3.6" xtend "~4.0.1" -through2@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" - integrity sha1-6zKE2k6jEbbMis42U3SKUqvyWj8= - dependencies: - readable-stream "~1.1.9" - xtend "~2.1.1" - through2@~0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" @@ -17600,7 +17175,7 @@ through2@~0.4.1: readable-stream "~1.0.17" xtend "~2.1.1" -through@2, through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8: +through@^2.3.8, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -17615,11 +17190,6 @@ time-limit-promise@^1.0.2: resolved "https://registry.yarnpkg.com/time-limit-promise/-/time-limit-promise-1.0.4.tgz#33e928212273c70d52153c28ad2a7e3319b975f9" integrity sha512-FLHDDsIDducw7MBcRWlFtW2Tm50DoKOSFf0Nzx17qwXj8REXCte0eUkHrJl9QU3Bl9arG3XNYX0PcHpZ9xyuLw== -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= - timers-browserify@^2.0.4: version "2.0.11" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" @@ -17700,11 +17270,6 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== - to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -17818,12 +17383,12 @@ tough-cookie@^3.0.1: psl "^1.1.28" punycode "^2.1.1" -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== dependencies: - punycode "^2.1.0" + punycode "^2.1.1" tree-kill@^1.1.0, tree-kill@^1.2.2: version "1.2.2" @@ -17846,11 +17411,6 @@ triangulate-polyline@^1.0.0: dependencies: cdt2d "^1.0.0" -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - trim-newlines@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" @@ -17876,13 +17436,6 @@ trough@^1.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== -"true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== - dependencies: - glob "^7.1.2" - truncate-utf8-bytes@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" @@ -17972,7 +17525,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -18020,31 +17573,6 @@ type@^2.0.0: resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== -typed-css-modules-webpack-plugin@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/typed-css-modules-webpack-plugin/-/typed-css-modules-webpack-plugin-0.1.3.tgz#b63b9e866a704436e8d1fbbafe3fccdec5af302f" - integrity sha512-conAPkJZyrwTXFQlqDWGd16WXuEbCBsIiwgO2/YZQUKsE/Ld+xE2i5d85Dk9brnqc2fh54WaoidLG4TNCjmMqQ== - dependencies: - chalk "^2.4.1" - css-modules-loader-core "^1.1.0" - glob "^7.1.3" - typed-css-modules "^0.6.3" - -typed-css-modules@^0.6.3: - version "0.6.4" - resolved "https://registry.yarnpkg.com/typed-css-modules/-/typed-css-modules-0.6.4.tgz#eb7385b5e9d0e5c654c992ecc8a246d0885c4560" - integrity sha512-2bL0dWY66wLGcz766HAwqJl4mnlUrx7D/dyUD9SPnab2QM1OsE6U842QhZhkEI5EoQdNziSLWqetHskdZ3MCxw== - dependencies: - "@types/css-modules-loader-core" "^1.1.0" - camelcase "^5.3.1" - chalk "^2.1.0" - chokidar "^3.4.0" - css-modules-loader-core "^1.1.0" - glob "^7.1.2" - is-there "^4.4.2" - mkdirp "^0.5.1" - yargs "^15.3.1" - typed-styles@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" @@ -18075,11 +17603,25 @@ typesafe-actions@^5.1.0: resolved "https://registry.yarnpkg.com/typesafe-actions/-/typesafe-actions-5.1.0.tgz#9afe8b1e6a323af1fd59e6a57b11b7dd6623d2f1" integrity sha512-bna6Yi1pRznoo6Bz1cE6btB/Yy8Xywytyfrzu/wc+NFW3ZF0I+2iCGImhBsoYYCOWuICtRO4yHcnDlzgo1AdNg== -typescript@^3.3.3, typescript@^3.7.5: +typescript@^3.3.3: version "3.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== +typescript@^3.9.7: + version "3.9.7" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" + integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== + +typings-for-css-modules-loader@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/typings-for-css-modules-loader/-/typings-for-css-modules-loader-1.7.0.tgz#a9b5c5a0e19b719d616edfc72855ab47dedd00ae" + integrity sha512-Mp7zDrcUmbUKl3JTLamTsMX+lntMotEm5I05j2RHB5EHb0WL1dAXlynpdlGR5Ye/QTvtL5w+RGB2jP32YoUpZw== + dependencies: + colour "0.7.1" + graceful-fs "4.1.4" + loader-utils "0.2.16" + ua-parser-js@^0.7.19: version "0.7.21" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" @@ -18359,14 +17901,14 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-3.0.0.tgz#9f1f11b371acf6e51ed15a50db635e02eec18368" - integrity sha512-a84JJbIA5xTFTWyjjcPdnsu+41o/SNE8SpXMdUvXs6Q+LuhCD9E2+0VCiuDWqgo3GGXVlFHzArDmBpj9PgWn4A== +url-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.0.tgz#c7d6b0d6b0fccd51ab3ffc58a78d32b8d89a7be2" + integrity sha512-IzgAAIC8wRrg6NYkFIJY09vtktQcsvU8V6HhtQj9PTefbYImzLB1hufqo4m+RyM5N3mLx5BqJKccgxJS+W3kqw== dependencies: - loader-utils "^1.2.3" - mime "^2.4.4" - schema-utils "^2.5.0" + loader-utils "^2.0.0" + mime-types "^2.1.26" + schema-utils "^2.6.5" url-parse-lax@^3.0.0: version "3.0.0" @@ -18383,7 +17925,7 @@ url-parse@^1.4.3: querystringify "^2.1.1" requires-port "^1.0.0" -url@^0.11.0, url@~0.11.0: +url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= @@ -18484,6 +18026,11 @@ uuid@^8.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== +uuid@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" + integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ== + v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" @@ -18624,14 +18171,6 @@ vfile-location@^3.0.0: resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.0.1.tgz#d78677c3546de0f7cd977544c367266764d31bb3" integrity sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ== -vfile-message@*, vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1" @@ -18639,6 +18178,14 @@ vfile-message@^1.0.0: dependencies: unist-util-stringify-position "^1.1.1" +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a" @@ -18674,20 +18221,18 @@ vt-pbf@^3.1.1: "@mapbox/vector-tile" "^1.3.1" pbf "^3.0.5" -w3c-hr-time@^1.0.1: +w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" -w3c-xmlserializer@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" - integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== dependencies: - domexception "^1.0.1" - webidl-conversions "^4.0.2" xml-name-validator "^3.0.0" walker@^1.0.7, walker@~1.0.5: @@ -18711,15 +18256,15 @@ watchpack-chokidar2@^2.0.0: dependencies: chokidar "^2.1.8" -watchpack@^1.6.1: - version "1.7.2" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" - integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== +watchpack@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" + integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== dependencies: graceful-fs "^4.1.2" neo-async "^2.5.0" optionalDependencies: - chokidar "^3.4.0" + chokidar "^3.4.1" watchpack-chokidar2 "^2.0.0" wbuf@^1.1.0, wbuf@^1.7.3: @@ -18736,11 +18281,6 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -wdio-dot-reporter@~0.0.8: - version "0.0.10" - resolved "https://registry.yarnpkg.com/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz#facfb7c9c5984149951f59cbc3cd0752101cf0e0" - integrity sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg== - weak-map@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.5.tgz#79691584d98607f5070bd3b70a40e6bb22e401eb" @@ -18756,34 +18296,6 @@ webauth@^1.1.0: resolved "https://registry.yarnpkg.com/webauth/-/webauth-1.1.0.tgz#64704f6b8026986605bc3ca629952e6e26fdd100" integrity sha1-ZHBPa4AmmGYFvDymKZUubib90QA= -webdriverio@^4.13.0: - version "4.14.4" - resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.14.4.tgz#f7a94e9a6530819796088f42b009833d83de0386" - integrity sha512-Knp2vzuzP5c5ybgLu+zTwy/l1Gh0bRP4zAr8NWcrStbuomm9Krn9oRF0rZucT6AyORpXinETzmeowFwIoo7mNA== - dependencies: - archiver "~2.1.0" - babel-runtime "^6.26.0" - css-parse "^2.0.0" - css-value "~0.0.1" - deepmerge "~2.0.1" - ejs "~2.5.6" - gaze "~1.1.2" - glob "~7.1.1" - grapheme-splitter "^1.0.2" - inquirer "~3.3.0" - json-stringify-safe "~5.0.1" - mkdirp "~0.5.1" - npm-install-package "~2.1.0" - optimist "~0.6.1" - q "~1.5.0" - request "^2.83.0" - rgb2hex "^0.1.9" - safe-buffer "~5.1.1" - supports-color "~5.0.0" - url "~0.11.0" - wdio-dot-reporter "~0.0.8" - wgxpath "~1.0.0" - webgl-context@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/webgl-context/-/webgl-context-2.2.0.tgz#8f37d7257cf6df1cd0a49e6a7b1b721b94cc86a0" @@ -18791,12 +18303,17 @@ webgl-context@^2.2.0: dependencies: get-canvas-context "^1.0.1" -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-bundle-analyzer@^3.6.0: +webpack-bundle-analyzer@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz#ce6b3f908daf069fd1f7266f692cbb3bded9ba16" integrity sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw== @@ -18815,7 +18332,7 @@ webpack-bundle-analyzer@^3.6.0: opener "^1.5.1" ws "^6.0.0" -webpack-cli@^3.3.10: +webpack-cli@^3.3.12: version "3.3.12" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== @@ -18843,7 +18360,7 @@ webpack-dev-middleware@^3.7.2: range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-server@^3.10.1: +webpack-dev-server@^3.11.0: version "3.11.0" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== @@ -18890,12 +18407,13 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" -webpack-merge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" - integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== +webpack-merge@^5.0.9: + version "5.1.1" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.1.1.tgz#c79f36b4ad39a597c3bb780f809b514d65d85d01" + integrity sha512-UhIkHAVqeG9EqFfYo7dRELrVfH6HYaOTYM7ssKCwfIIHYnWepGVOFp1E166GwgPGFqV6M68UgRiKOERjVOKIXA== dependencies: - lodash "^4.17.15" + clone-deep "^4.0.1" + wildcard "^2.0.0" webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: version "1.4.3" @@ -18905,10 +18423,10 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack- source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.41.5: - version "4.43.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" - integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== +webpack@^4.43.0: + version "4.44.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.1.tgz#17e69fff9f321b8f117d1fda714edfc0b939cc21" + integrity sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ== dependencies: "@webassemblyjs/ast" "1.9.0" "@webassemblyjs/helper-module-context" "1.9.0" @@ -18918,7 +18436,7 @@ webpack@^4.41.5: ajv "^6.10.2" ajv-keywords "^3.4.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^4.1.0" + enhanced-resolve "^4.3.0" eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" loader-runner "^2.4.0" @@ -18931,7 +18449,7 @@ webpack@^4.41.5: schema-utils "^1.0.0" tapable "^1.1.3" terser-webpack-plugin "^1.4.3" - watchpack "^1.6.1" + watchpack "^1.7.4" webpack-sources "^1.4.1" websocket-driver@0.6.5: @@ -18955,12 +18473,7 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -wgxpath@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wgxpath/-/wgxpath-1.0.0.tgz#eef8a4b9d558cc495ad3a9a2b751597ecd9af690" - integrity sha1-7vikudVYzEla06mit1FZfs2a9pA= - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: +whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== @@ -18972,19 +18485,19 @@ whatwg-fetch@^2.0.4: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== -whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: +whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== +whatwg-url@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.1.0.tgz#c628acdcf45b82274ce7281ee31dd3c839791771" + integrity sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw== dependencies: lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" + tr46 "^2.0.2" + webidl-conversions "^5.0.0" which-module@^2.0.0: version "2.0.0" @@ -19005,7 +18518,7 @@ which-promise@^1.0.0: pinkie-promise "^1.0.0" which "^1.1.2" -which@1, which@^1.1.2, which@^1.2.14, which@^1.2.9, which@^1.3.1: +which@^1.1.2, which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -19033,6 +18546,11 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" @@ -19048,11 +18566,6 @@ wordwrap@0.0.2: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -19131,7 +18644,12 @@ ws@^6.0.0, ws@^6.1.0, ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^7.0.0, ws@^7.3.0: +ws@^7.2.3: + version "7.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" + integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== + +ws@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== @@ -19151,18 +18669,11 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xmlchars@^2.1.1: +xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xregexp@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" - integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== - dependencies: - "@babel/runtime-corejs3" "^7.8.3" - "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -19185,11 +18696,6 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -19308,13 +18814,3 @@ zero-crossings@^1.0.0: integrity sha1-xWK9MRNkPzRDokXRJAa4i2m5qf8= dependencies: cwise-compiler "^1.0.0" - -zip-stream@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" - integrity sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ= - dependencies: - archiver-utils "^1.3.0" - compress-commons "^1.2.0" - lodash "^4.8.0" - readable-stream "^2.0.0" From 1229659b3a98e34c9de823e574713a167c852252 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 9 Aug 2020 13:56:30 -0400 Subject: [PATCH 42/66] removed typescript-eslint rules --- .eslintrc.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 0a08e825..4de8f0a9 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -2,8 +2,6 @@ module.exports = { extends: 'erb/typescript', rules: { // A temporary hack related to IDE not resolving correct package.json - '@typescript-eslint/ban-ts-ignore': 'warn', - '@typescript-eslint/no-use-before-define': 'off', 'consistent-return': 'warn', 'dot-notation': 'off', 'import/no-extraneous-dependencies': 'off', From 12c2fe2515c247e488e42719e1c142ee439f9c0b Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 9 Aug 2020 15:56:25 -0400 Subject: [PATCH 43/66] Updated store --- app/epics/deviceEpics.ts | 109 +++++++++++++------------------ app/epics/experimentEpics.ts | 29 ++++---- app/epics/index.ts | 3 +- app/epics/jupyterEpics.ts | 87 ++++++++++++------------ app/index.tsx | 4 +- app/main.dev.ts | 2 +- app/reducers/index.ts | 21 +++--- app/store.ts | 56 ++++++++++++++++ app/store/configureStore.dev.ts | 78 ---------------------- app/store/configureStore.prod.ts | 21 ------ app/store/configureStore.ts | 11 ---- app/utils/eeg/cortex.ts | 2 +- 12 files changed, 175 insertions(+), 248 deletions(-) create mode 100644 app/store.ts delete mode 100644 app/store/configureStore.dev.ts delete mode 100644 app/store/configureStore.prod.ts delete mode 100644 app/store/configureStore.ts diff --git a/app/epics/deviceEpics.ts b/app/epics/deviceEpics.ts index 928db2dd..1427589c 100644 --- a/app/epics/deviceEpics.ts +++ b/app/epics/deviceEpics.ts @@ -10,20 +10,20 @@ import { connectToEmotiv, createRawEmotivObservable, createEmotivSignalQualityObservable, - disconnectFromEmotiv + disconnectFromEmotiv, } from '../utils/eeg/emotiv'; import { getMuse, connectToMuse, createRawMuseObservable, createMuseSignalQualityObservable, - disconnectFromMuse + disconnectFromMuse, } from '../utils/eeg/muse'; import { CONNECTION_STATUS, DEVICES, DEVICE_AVAILABILITY, - SEARCH_TIMER + SEARCH_TIMER, } from '../constants/constants'; import { Device, DeviceInfo } from '../constants/interfaces'; import { DeviceStateType } from '../reducers/deviceReducer'; @@ -33,45 +33,41 @@ import { RootState } from '../reducers'; // Epics // NOTE: Uses a Promise "then" inside b/c Observable.from leads to loss of user gesture propagation for web bluetooth -const searchMuseEpic: Epic< - DeviceActionType, - DeviceActionType, - RootState -> = action$ => +const searchMuseEpic: Epic = ( + action$ +) => action$.pipe( filter(isActionOf(DeviceActions.SetDeviceAvailability)), pluck('payload'), - filter(status => status === DEVICE_AVAILABILITY.SEARCHING), + filter((status) => status === DEVICE_AVAILABILITY.SEARCHING), map(getMuse), - mergeMap(promise => + mergeMap((promise) => promise.then( - devices => devices, - error => { + (devices) => devices, + (error) => { // This error will fire a bit too promiscuously until we fix windows web bluetooth // toast.error(`"Device Error: " ${error.toString()}`); return []; } ) ), - filter(devices => !isNil(devices) && devices.length >= 1), + filter((devices) => !isNil(devices) && devices.length >= 1), map(DeviceActions.DeviceFound) ); -const searchEmotivEpic: Epic< - DeviceActionType, - DeviceActionType, - RootState -> = action$ => +const searchEmotivEpic: Epic = ( + action$ +) => action$.pipe( filter(isActionOf(DeviceActions.SetDeviceAvailability)), pluck('payload'), - filter(status => status === DEVICE_AVAILABILITY.SEARCHING), + filter((status) => status === DEVICE_AVAILABILITY.SEARCHING), filter(() => process.platform === 'darwin' || process.platform === 'win32'), map(getEmotiv), - mergeMap(promise => + mergeMap((promise) => promise.then( - devices => devices, - error => { + (devices) => devices, + (error) => { if (error.message.includes('client.queryHeadsets')) { toast.error( 'Could not connect to Cortex Service. Please connect to the internet and install Cortex to use Emotiv EEG', @@ -85,7 +81,7 @@ const searchEmotivEpic: Epic< } ) ), - filter(devices => devices.length >= 1), + filter((devices) => devices.length >= 1), map(DeviceActions.DeviceFound) ); @@ -96,15 +92,15 @@ const deviceFoundEpic: Epic = ( action$.pipe( filter(isActionOf(DeviceActions.DeviceFound)), pluck('payload'), - map(foundDevices => + map((foundDevices) => foundDevices.reduce((acc, curr) => { - if (acc.find(device => device.id === curr.id)) { + if (acc.find((device) => device.id === curr.id)) { return acc; } return acc.concat(curr); }, state$.value.device.availableDevices) ), - mergeMap(devices => + mergeMap((devices) => of( DeviceActions.SetAvailableDevices(devices), DeviceActions.SetDeviceAvailability(DEVICE_AVAILABILITY.AVAILABLE) @@ -119,7 +115,7 @@ const searchTimerEpic: Epic = ( action$.pipe( filter(isActionOf(DeviceActions.SetDeviceAvailability)), pluck('payload'), - filter(status => status === DEVICE_AVAILABILITY.SEARCHING), + filter((status) => status === DEVICE_AVAILABILITY.SEARCHING), mergeMap(() => timer(SEARCH_TIMER)), filter( () => @@ -128,21 +124,19 @@ const searchTimerEpic: Epic = ( map(() => DeviceActions.SetDeviceAvailability(DEVICE_AVAILABILITY.NONE)) ); -const connectEpic: Epic< - DeviceActionType, - DeviceActionType, - RootState -> = action$ => +const connectEpic: Epic = ( + action$ +) => action$.pipe( filter(isActionOf(DeviceActions.ConnectToDevice)), pluck('payload'), - map>(device => + map>((device) => isNil(device.name) ? connectToEmotiv(device) : connectToMuse(device) ), - mergeMap, ObservableInput>(promise => - promise.then(deviceInfo => deviceInfo) + mergeMap, ObservableInput>((promise) => + promise.then((deviceInfo) => deviceInfo) ), - mergeMap>(deviceInfo => { + mergeMap>((deviceInfo) => { if (!isNil(deviceInfo) && !isNil(deviceInfo.samplingRate)) { return of( DeviceActions.SetDeviceType( @@ -158,11 +152,9 @@ const connectEpic: Epic< }) ); -const isConnectingEpic: Epic< - DeviceActionType, - DeviceActionType, - RootState -> = action$ => +const isConnectingEpic: Epic = ( + action$ +) => action$.pipe( filter(isActionOf(DeviceActions.ConnectToDevice)), map(() => DeviceActions.SetConnectionStatus(CONNECTION_STATUS.CONNECTING)) @@ -192,7 +184,7 @@ const setSignalQualityObservableEpic: Epic< action$.pipe( filter(isActionOf(DeviceActions.SetRawObservable)), pluck('payload'), - map(rawObservable => { + map((rawObservable) => { if (state$.value.device.deviceType === DEVICES.EMOTIV) { return createEmotivSignalQualityObservable(rawObservable); } @@ -224,25 +216,14 @@ const deviceCleanupEpic: Epic = ( map(DeviceActions.Cleanup) ); -// TODO: Fix this error handling so epics can refire once they error out -const rootEpic = (action$, state$) => - combineEpics( - searchMuseEpic, - searchEmotivEpic, - deviceFoundEpic, - searchTimerEpic, - connectEpic, - isConnectingEpic, - setRawObservableEpic, - setSignalQualityObservableEpic, - deviceCleanupEpic - )(action$, state$, null).pipe( - catchError(error => - of(error).pipe( - tap(err => toast.error(`"Device Error: " ${err.toString()}`)), - map(DeviceActions.Cleanup) - ) - ) - ); - -export default rootEpic; +export default combineEpics( + searchMuseEpic, + searchEmotivEpic, + deviceFoundEpic, + searchTimerEpic, + connectEpic, + isConnectingEpic, + setRawObservableEpic, + setSignalQualityObservableEpic, + deviceCleanupEpic +); diff --git a/app/epics/experimentEpics.ts b/app/epics/experimentEpics.ts index da51a4cb..8b074580 100644 --- a/app/epics/experimentEpics.ts +++ b/app/epics/experimentEpics.ts @@ -10,20 +10,20 @@ import { takeUntil, throttleTime, ignoreElements, - tap + tap, } from 'rxjs/operators'; import { ExperimentActions, ExperimentActionType } from '../actions'; import { DEVICES, MUSE_CHANNELS, EMOTIV_CHANNELS, - CONNECTION_STATUS + CONNECTION_STATUS, } from '../constants/constants'; import { loadProtocol } from '../utils/labjs/functions'; import { createEEGWriteStream, writeHeader, - writeEEGData + writeEEGData, } from '../utils/filesystem/write'; import { getWorkspaceDir, @@ -31,7 +31,7 @@ import { restoreExperimentState, createWorkspaceDir, storeBehaviouralData, - readWorkspaceBehaviorData + readWorkspaceBehaviorData, } from '../utils/filesystem/storage'; import { createEmotivRecord, stopEmotivRecord } from '../utils/eeg/emotiv'; import { RootState } from '../reducers'; @@ -43,12 +43,12 @@ const createNewWorkspaceEpic: Epic< ExperimentActionType, ExperimentActionType, RootState -> = action$ => +> = (action$) => action$.pipe( filter(isActionOf(ExperimentActions.CreateNewWorkspace)), pluck('payload'), - tap(workspaceInfo => createWorkspaceDir(workspaceInfo.title)), - mergeMap(workspaceInfo => + tap((workspaceInfo) => createWorkspaceDir(workspaceInfo.title)), + mergeMap((workspaceInfo) => of( ExperimentActions.SetType(workspaceInfo.type), ExperimentActions.SetParadigm(workspaceInfo.paradigm), @@ -107,7 +107,7 @@ const startEpic = (action$, state$) => ) ) ) - .subscribe(eegData => writeEEGData(writeStream, eegData)); + .subscribe((eegData) => writeEEGData(writeStream, eegData)); } }), mapTo(true), @@ -159,9 +159,9 @@ const updateSessionEpic: Epic< mergeMap(() => from(readWorkspaceBehaviorData(state$.value.experiment.title!)) ), - map(behaviorFiles => { + map((behaviorFiles) => { if (behaviorFiles.length > 0) { - const subjectFiles = behaviorFiles.filter(filepath => + const subjectFiles = behaviorFiles.filter((filepath) => filepath.name.startsWith(state$.value.experiment.subject) ); return subjectFiles.length + 1; @@ -171,10 +171,10 @@ const updateSessionEpic: Epic< map(ExperimentActions.SetSession) ); -const autoSaveEpic: Epic = action$ => +const autoSaveEpic: Epic = (action$) => action$.ofType('@@router/LOCATION_CHANGE').pipe( pluck('payload', 'pathname'), - filter(pathname => pathname !== '/' && pathname !== '/home'), + filter((pathname) => pathname !== '/' && pathname !== '/home'), map(ExperimentActions.SaveWorkspace) ); @@ -202,7 +202,7 @@ const navigationCleanupEpic: Epic = ( ) => action$.ofType('@@router/LOCATION_CHANGE').pipe( pluck('payload', 'pathname'), - filter(pathname => pathname === '/' || pathname === '/home'), + filter((pathname) => pathname === '/' || pathname === '/home'), tap(() => restoreExperimentState(state$.value.experiment)), map(ExperimentActions.ExperimentCleanup) ); @@ -211,7 +211,8 @@ export default combineEpics( loadDefaultTimelineEpic, createNewWorkspaceEpic, startEpic, - experimentStopEpic, // setSubjectEpic, + experimentStopEpic, + // setSubjectEpic, // setGroupEpic, updateSessionEpic, autoSaveEpic, diff --git a/app/epics/index.ts b/app/epics/index.ts index 076d6cbe..5153c1a3 100644 --- a/app/epics/index.ts +++ b/app/epics/index.ts @@ -3,4 +3,5 @@ import jupyter from './jupyterEpics'; import device from './deviceEpics'; import experiment from './experimentEpics'; -export default combineEpics(device, jupyter, experiment); +// TODO: Fix issue: https://github.com/piotrwitek/typesafe-actions/issues/174 +export default combineEpics(jupyter, device, experiment); diff --git a/app/epics/jupyterEpics.ts b/app/epics/jupyterEpics.ts index ed4c751f..244072d4 100644 --- a/app/epics/jupyterEpics.ts +++ b/app/epics/jupyterEpics.ts @@ -7,7 +7,7 @@ import { pluck, ignoreElements, filter, - take + take, } from 'rxjs/operators'; import { find } from 'kernelspecs'; import { launchSpec } from 'spawnteract'; @@ -33,55 +33,53 @@ import { plotPSD, plotERP, plotTopoMap, - saveEpochs + saveEpochs, } from '../utils/jupyter/cells'; import { EMOTIV_CHANNELS, EVENTS, DEVICES, MUSE_CHANNELS, - JUPYTER_VARIABLE_NAMES + JUPYTER_VARIABLE_NAMES, } from '../constants/constants'; import { parseSingleQuoteJSON, parseKernelStatus, - debugParseMessage + debugParseMessage, } from '../utils/jupyter/functions'; // ------------------------------------------------------------------------- // Epics -const launchEpic: Epic< - JupyterActionType, - JupyterActionType, - RootState -> = action$ => +const launchEpic: Epic = ( + action$ +) => action$.pipe( filter(isActionOf(JupyterActions.LaunchKernel)), mergeMap(() => from(find('brainwaves'))), - tap(kernelInfo => { + tap((kernelInfo) => { if (isNil(kernelInfo)) { toast.error( "Could not find 'brainwaves' jupyter kernel. Have you installed Python?" ); } }), - filter(kernelInfo => !isNil(kernelInfo)), - mergeMap>(kernelInfo => + filter((kernelInfo) => !isNil(kernelInfo)), + mergeMap>((kernelInfo) => from( launchSpec(kernelInfo.spec, { // No STDIN, opt in to STDOUT and STDERR as node streams - stdio: ['ignore', 'pipe', 'pipe'] + stdio: ['ignore', 'pipe', 'pipe'], }) ) ), - tap(kernel => { + tap((kernel) => { // Route everything that we won't get in messages to our own stdout - kernel.spawn.stdout.on('data', data => { + kernel.spawn.stdout.on('data', (data) => { const text = data.toString(); console.log('KERNEL STDOUT: ', text); }); - kernel.spawn.stderr.on('data', data => { + kernel.spawn.stderr.on('data', (data) => { const text = data.toString(); console.log('KERNEL STDERR: ', text); toast.error('Jupyter: ', text); @@ -98,13 +96,13 @@ const setUpChannelEpic: Epic< JupyterActionType, JupyterActionType, RootState -> = action$ => +> = (action$) => action$.pipe( filter(isActionOf(JupyterActions.SetKernel)), pluck('payload'), - mergeMap(kernel => from(createMainChannel(kernel.config))), - tap(mainChannel => mainChannel.next(executeRequest(imports()))), - tap(mainChannel => mainChannel.next(executeRequest(utils()))), + mergeMap((kernel) => from(createMainChannel(kernel.config))), + tap((mainChannel) => mainChannel.next(executeRequest(imports()))), + tap((mainChannel) => mainChannel.next(executeRequest(utils()))), map(JupyterActions.SetMainChannel) ); @@ -117,7 +115,7 @@ const receiveChannelMessageEpic: Epic< filter(isActionOf(JupyterActions.SetMainChannel)), mergeMap<{}, ObservableInput>(() => state$.value.jupyter.mainChannel.pipe( - map(msg => { + map((msg) => { console.log(debugParseMessage(msg)); switch (msg['header']['msg_type']) { case 'kernel_info_reply': @@ -134,8 +132,7 @@ const receiveChannelMessageEpic: Epic< default: return JupyterActions.ReceiveDisplayData(msg); } - }), - filter(action => !isNil(action)) + }) ) ) ); @@ -160,8 +157,8 @@ const loadEpochsEpic: Epic = ( action$.pipe( filter(isActionOf(JupyterActions.LoadEpochs)), pluck('payload'), - filter(filePathsArray => filePathsArray.length >= 1), - map(filePathsArray => + filter((filePathsArray) => filePathsArray.length >= 1), + map((filePathsArray) => state$.value.jupyter.mainChannel.next( executeRequest(loadCSV(filePathsArray)) ) @@ -175,16 +172,16 @@ const loadEpochsEpic: Epic = ( [state$.value.experiment.params!.stimulus1!.title]: EVENTS.STIMULUS_1, [state$.value.experiment.params!.stimulus2!.title]: EVENTS.STIMULUS_2, [state$.value.experiment.params!.stimulus3!.title]: EVENTS.STIMULUS_3, - [state$.value.experiment.params!.stimulus4!.title]: EVENTS.STIMULUS_4 + [state$.value.experiment.params!.stimulus4!.title]: EVENTS.STIMULUS_4, }, -0.1, 0.8 ) ), - tap(e => { + tap((e) => { console.log('e', e); }), - map(epochEventsCommand => + map((epochEventsCommand) => state$.value.jupyter.mainChannel.next(executeRequest(epochEventsCommand)) ), awaitOkMessage(action$), @@ -199,8 +196,8 @@ const loadCleanedEpochsEpic: Epic< action$.pipe( filter(isActionOf(JupyterActions.LoadCleanedEpochs)), pluck('payload'), - filter(filePathsArray => filePathsArray.length >= 1), - map(filePathsArray => + filter((filePathsArray) => filePathsArray.length >= 1), + map((filePathsArray) => state$.value.jupyter.mainChannel.next( executeRequest(loadCleanedEpochs(filePathsArray)) ) @@ -226,7 +223,7 @@ const cleanEpochsEpic: Epic = ( action$.ofType(JupyterActions.ReceiveStream.type).pipe( pluck('payload'), filter( - msg => + (msg) => msg.channel === 'iopub' && msg.content.text.includes('Channels marked as bad') ), @@ -255,7 +252,7 @@ const getEpochsInfoEpic: Epic< action$.pipe( filter(isActionOf(JupyterActions.GetEpochsInfo)), pluck('payload'), - map(variableName => + map((variableName) => state$.value.jupyter.mainChannel.next( executeRequest(requestEpochsInfo(variableName)) ) @@ -263,16 +260,16 @@ const getEpochsInfoEpic: Epic< mergeMap(() => action$.ofType(JupyterActions.ReceiveExecuteReply.type).pipe( pluck('payload'), - filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), + filter((msg) => msg.channel === 'iopub' && !isNil(msg.content.data)), pluck('content', 'data', 'text/plain'), - filter(msg => msg.includes('Drop Percentage')), + filter((msg) => msg.includes('Drop Percentage')), take(1) ) ), - map(epochInfoString => - parseSingleQuoteJSON(epochInfoString).map(infoObj => ({ + map((epochInfoString) => + parseSingleQuoteJSON(epochInfoString).map((infoObj) => ({ name: Object.keys(infoObj)[0], - value: infoObj[Object.keys(infoObj)[0]] + value: infoObj[Object.keys(infoObj)[0]], })) ), map(JupyterActions.SetEpochInfo) @@ -289,13 +286,13 @@ const getChannelInfoEpic: Epic< mergeMap(() => action$.ofType(JupyterActions.ReceiveExecuteResult.type).pipe( pluck('payload'), - filter(msg => msg.channel === 'iopub' && !isNil(msg.content.data)), + filter((msg) => msg.channel === 'iopub' && !isNil(msg.content.data)), pluck('content', 'data', 'text/plain'), // Filter to prevent this from reading requestEpochsInfo returns - filter(msg => !msg.includes('Drop Percentage')), + filter((msg) => !msg.includes('Drop Percentage')), take(1) ) ), - map(channelInfoString => + map((channelInfoString) => JupyterActions.SetChannelInfo(parseSingleQuoteJSON(channelInfoString)) ) ); @@ -310,7 +307,7 @@ const loadPSDEpic: Epic = ( mergeMap(() => action$.ofType(JupyterActions.ReceiveDisplayData.type).pipe( pluck('payload'), // PSD graphs should have two axes - filter(msg => msg.content.data['text/plain'].includes('2 Axes')), + filter((msg) => msg.content.data['text/plain'].includes('2 Axes')), pluck('content', 'data'), take(1) ) @@ -330,7 +327,7 @@ const loadTopoEpic: Epic = ( .ofType(JupyterActions.ReceiveDisplayData.type) .pipe(pluck('payload'), pluck('content', 'data'), take(1)) ), - mergeMap(topoPlot => + mergeMap((topoPlot) => of( JupyterActions.SetTopoPlot(topoPlot), JupyterActions.LoadERP( @@ -349,7 +346,7 @@ const loadERPEpic: Epic = ( action$.pipe( filter(isActionOf(JupyterActions.LoadERP)), pluck('payload'), - map(channelName => { + map((channelName) => { if (MUSE_CHANNELS.includes(channelName)) { return MUSE_CHANNELS.indexOf(channelName); } @@ -361,7 +358,7 @@ const loadERPEpic: Epic = ( ); return EMOTIV_CHANNELS[0]; }), - map(channelIndex => + map((channelIndex) => state$.value.jupyter.mainChannel.next( executeRequest(plotERP(channelIndex)) ) @@ -369,7 +366,7 @@ const loadERPEpic: Epic = ( mergeMap(() => action$.ofType(JupyterActions.ReceiveDisplayData.type).pipe( pluck('payload'), // ERP graphs should have 1 axis according to MNE - filter(msg => msg.content.data['text/plain'].includes('1 Axes')), + filter((msg) => msg.content.data['text/plain'].includes('1 Axes')), pluck('content', 'data'), take(1) ) diff --git a/app/index.tsx b/app/index.tsx index 91609b27..518f503e 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -2,10 +2,10 @@ import React, { Fragment } from 'react'; import { render } from 'react-dom'; import { AppContainer as ReactHotAppContainer } from 'react-hot-loader'; import Root from './containers/Root'; -import { configureStore, history } from './store/configureStore'; +import { configuredStore, history } from './store'; import './app.global.css'; -const store = configureStore(); +const store = configuredStore(); const AppContainer = process.env.PLAIN_HMR ? Fragment : ReactHotAppContainer; diff --git a/app/main.dev.ts b/app/main.dev.ts index 7264fce4..39f4b520 100644 --- a/app/main.dev.ts +++ b/app/main.dev.ts @@ -114,7 +114,7 @@ const createWindow = async () => { // eslint-disable-next-line new AppUpdater(); - mainWindow.setMenu(null); + // mainWindow.setMenu(null); // if (process.env.NODE_ENV === 'development') { // mainWindow.webContents.openDevTools(); // } diff --git a/app/reducers/index.ts b/app/reducers/index.ts index db22f379..8539e1d6 100644 --- a/app/reducers/index.ts +++ b/app/reducers/index.ts @@ -1,5 +1,6 @@ import { combineReducers } from 'redux'; -import { routerReducer as router } from 'react-router-redux'; +import { connectRouter } from 'connected-react-router'; +import { History } from 'history'; import jupyter, { JupyterStateType } from './jupyterReducer'; import device, { DeviceStateType } from './deviceReducer'; import experiment, { ExperimentStateType } from './experimentReducer'; @@ -8,14 +9,14 @@ export interface RootState { jupyter: JupyterStateType; device: DeviceStateType; experiment: ExperimentStateType; - router: unknown; + router: any; } -const rootReducer = combineReducers({ - jupyter, - device, - experiment, - router -}); - -export default rootReducer; +export default function createRootReducer(history: History) { + return combineReducers({ + router: connectRouter(history), + jupyter, + device, + experiment, + }); +} diff --git a/app/store.ts b/app/store.ts new file mode 100644 index 00000000..36c0f08f --- /dev/null +++ b/app/store.ts @@ -0,0 +1,56 @@ +import { configureStore, getDefaultMiddleware, Action } from '@reduxjs/toolkit'; +import { createHashHistory } from 'history'; +import { routerMiddleware } from 'connected-react-router'; +import { createEpicMiddleware } from 'redux-observable'; +import { createLogger } from 'redux-logger'; +import { ThunkAction } from 'redux-thunk'; +import createRootReducer from './reducers'; +import rootEpic from './epics'; + +export const history = createHashHistory(); +const rootReducer = createRootReducer(history); + +export type RootState = ReturnType; + +const router = routerMiddleware(history); +const middleware = [...getDefaultMiddleware(), router]; + +// Redux Observable (Epic) Middleware +const epicMiddleware = createEpicMiddleware(); +middleware.push(epicMiddleware); + +const excludeLoggerEnvs = ['test', 'production']; +const shouldIncludeLogger = !excludeLoggerEnvs.includes( + process.env.NODE_ENV || '' +); + +if (shouldIncludeLogger) { + const logger = createLogger({ + level: 'info', + collapsed: true, + }); + middleware.push(logger); +} + +export const configuredStore = (initialState?: RootState) => { + // Create Store + const store = configureStore({ + reducer: rootReducer, + middleware, + preloadedState: initialState, + }); + + if (process.env.NODE_ENV === 'development' && module.hot) { + module.hot.accept( + './reducers', + // eslint-disable-next-line global-require + () => store.replaceReducer(require('./reducers').default) + ); + } + + epicMiddleware.run(rootEpic); + return store; +}; + +export type Store = ReturnType; +export type AppThunk = ThunkAction>; diff --git a/app/store/configureStore.dev.ts b/app/store/configureStore.dev.ts deleted file mode 100644 index 064a4254..00000000 --- a/app/store/configureStore.dev.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { createStore, applyMiddleware, compose } from 'redux'; -import thunk from 'redux-thunk'; -import { createEpicMiddleware } from 'redux-observable'; -import { createHashHistory } from 'history'; -import { routerMiddleware, routerActions } from 'react-router-redux'; -import { createLogger } from 'redux-logger'; -import rootReducer, { RootState } from '../reducers'; -import rootEpic from '../epics'; -import { JupyterActions, DeviceActions } from '../actions'; - -const history = createHashHistory(); - -const configureStore = (initialState?: RootState) => { - // Redux Configuration - const middleware = []; - const enhancers = []; - - // Thunk Middleware - middleware.push(thunk); - - // Redux Observable (Epic) Middleware - const epicMiddleware = createEpicMiddleware(); - middleware.push(epicMiddleware); - - // Logging Middleware - const logger = createLogger({ - level: 'info', - collapsed: true - }); - - // Skip redux logs in console during the tests - if (process.env.NODE_ENV !== 'test') { - middleware.push(logger); - } - - // Router Middleware - const router = routerMiddleware(history); - middleware.push(router); - - // Redux DevTools Configuration - const actionCreators = { - ...DeviceActions, - ...JupyterActions, - ...routerActions - }; - // If Redux DevTools Extension is installed use it, otherwise use Redux compose - - /* eslint-disable no-underscore-dangle */ - const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ - ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ - // Options: http://zalmoxisus.github.io/redux-devtools-extension/API/Arguments.html - actionCreators - }) - : compose; - - /* eslint-enable no-underscore-dangle */ - - // Apply Middleware & Compose Enhancers - enhancers.push(applyMiddleware(...middleware)); - const enhancer = composeEnhancers(...enhancers); - - // Create Store - const store = createStore(rootReducer, initialState, enhancer); - - if (module.hot) { - module.hot.accept( - '../reducers', - () => store.replaceReducer(require('../reducers')) // eslint-disable-line global-require - ); - } - - // Redux Observable - epicMiddleware.run(rootEpic); - - return store; -}; - -export default { configureStore, history }; diff --git a/app/store/configureStore.prod.ts b/app/store/configureStore.prod.ts deleted file mode 100644 index 7dc42a3c..00000000 --- a/app/store/configureStore.prod.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { createStore, applyMiddleware } from 'redux'; -import thunk from 'redux-thunk'; -import { createHashHistory } from 'history'; -import { createEpicMiddleware } from 'redux-observable'; -import { routerMiddleware } from 'react-router-redux'; -import rootEpic from '../epics'; - -import rootReducer from '../reducers'; - -const history = createHashHistory(); -const epicMiddleware = createEpicMiddleware(); -const router = routerMiddleware(history); -const enhancer = applyMiddleware(thunk, router, epicMiddleware); - -function configureStore(initialState?: any) { - const store = createStore(rootReducer, initialState, enhancer); - epicMiddleware.run(rootEpic); - return store; -} - -export default { configureStore, history }; diff --git a/app/store/configureStore.ts b/app/store/configureStore.ts deleted file mode 100644 index e0c7e576..00000000 --- a/app/store/configureStore.ts +++ /dev/null @@ -1,11 +0,0 @@ -import configureStoreDev from './configureStore.dev'; -import configureStoreProd from './configureStore.prod'; - -const selectedConfigureStore = - process.env.NODE_ENV === 'production' - ? configureStoreProd - : configureStoreDev; - -export const { configureStore } = selectedConfigureStore; - -export const { history } = selectedConfigureStore; diff --git a/app/utils/eeg/cortex.ts b/app/utils/eeg/cortex.ts index 43e8dc51..4813c0b1 100644 --- a/app/utils/eeg/cortex.ts +++ b/app/utils/eeg/cortex.ts @@ -18,7 +18,7 @@ * just pass information back and forth without doing much with it, with the * exception of the login/auth flow, which we expose as the init() method. */ -const WebSocket = require('ws'); +// const WebSocket = require('ws'); const EventEmitter = require('events'); const CORTEX_URL = 'wss://localhost:6868'; From 68d919122eac07a98b4605b098e94a3325c512af Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 9 Aug 2020 16:05:36 -0400 Subject: [PATCH 44/66] Ran lint-fix --- app/actions/deviceActions.ts | 2 +- app/actions/experimentActions.ts | 2 +- app/actions/jupyterActions.ts | 2 +- app/components/AnalyzeComponent.tsx | 54 ++++----- .../CleanComponent/CleanSidebar.tsx | 4 +- app/components/CleanComponent/index.tsx | 20 ++-- .../CollectComponent/ConnectModal.tsx | 12 +- .../CollectComponent/HelpSidebar.tsx | 12 +- .../CollectComponent/PreTestComponent.tsx | 18 +-- .../CollectComponent/RunComponent.tsx | 12 +- app/components/CollectComponent/index.tsx | 6 +- .../DesignComponent/CustomDesignComponent.tsx | 113 +++++++++--------- .../DesignComponent/ParamSlider.tsx | 4 +- .../DesignComponent/StimuliDesignColumn.tsx | 13 +- app/components/DesignComponent/StimuliRow.tsx | 8 +- app/components/DesignComponent/index.tsx | 18 +-- app/components/EEGExplorationComponent.tsx | 6 +- .../HomeComponent/OverviewComponent.tsx | 10 +- app/components/HomeComponent/index.tsx | 26 ++-- app/components/InputCollect.tsx | 2 +- app/components/InputModal.tsx | 4 +- app/components/JupyterPlotWidget.tsx | 4 +- app/components/PreviewExperimentComponent.tsx | 6 +- .../SecondaryNavComponent/index.tsx | 4 +- .../SignalQualityIndicatorComponent.tsx | 6 +- .../TopNavComponent/PrimaryNavSegment.tsx | 2 +- app/components/TopNavComponent/index.tsx | 8 +- app/components/ViewerComponent.tsx | 12 +- app/components/d3Classes/EEGViewer.js | 35 +++--- .../svgs/SignalQualityIndicatorSVG.tsx | 2 +- app/constants/constants.ts | 28 ++--- app/containers/AnalyzeContainer.ts | 4 +- app/containers/CleanContainer.ts | 4 +- app/containers/CollectContainer.ts | 4 +- app/containers/ExperimentDesignContainer.ts | 4 +- app/containers/HomeContainer.ts | 4 +- app/containers/TopNavBarContainer.ts | 4 +- app/epics/jupyterEpics.ts | 2 +- app/index.tsx | 1 - app/menu.ts | 2 +- app/reducers/deviceReducer.ts | 22 ++-- app/reducers/experimentReducer.ts | 30 ++--- app/reducers/jupyterReducer.ts | 22 ++-- app/routes.tsx | 2 +- app/utils/eeg/cortex.ts | 37 ++++-- app/utils/eeg/emotiv.ts | 30 ++--- app/utils/eeg/muse.ts | 26 ++-- app/utils/eeg/pipes.ts | 10 +- app/utils/filesystem/dialog.ts | 12 +- app/utils/filesystem/select.ts | 2 +- app/utils/filesystem/storage.ts | 50 ++++---- app/utils/filesystem/write.ts | 2 +- app/utils/jupyter/functions.ts | 2 +- app/utils/jupyter/pipes.ts | 4 +- app/utils/labjs/index.tsx | 12 +- app/utils/labjs/protocols/custom.ts | 32 ++--- app/utils/labjs/protocols/faceshouses.ts | 38 +++--- app/utils/labjs/protocols/multi.ts | 30 ++--- app/utils/labjs/protocols/search.ts | 24 ++-- app/utils/labjs/protocols/stroop.ts | 28 ++--- 60 files changed, 452 insertions(+), 447 deletions(-) diff --git a/app/actions/deviceActions.ts b/app/actions/deviceActions.ts index 97fe77b6..52945a5c 100644 --- a/app/actions/deviceActions.ts +++ b/app/actions/deviceActions.ts @@ -33,7 +33,7 @@ export const DeviceActions = { SetSignalQualityObservable: createAction( 'SET_SIGNAL_OBSERVABLE' ), - Cleanup: createAction('CLEANUP') + Cleanup: createAction('CLEANUP'), } as const; export type DeviceActionType = ActionType< diff --git a/app/actions/experimentActions.ts b/app/actions/experimentActions.ts index 82af4e54..f59d9f6b 100644 --- a/app/actions/experimentActions.ts +++ b/app/actions/experimentActions.ts @@ -29,7 +29,7 @@ export const ExperimentActions = { SaveWorkspace: createAction('SAVE_WORKSPACE'), SetState: createAction('SET_EXPERIMENT_STATE'), SetEEGEnabled: createAction('SET_EEG_ENABLED'), - UpdateSession: createAction('UPDATE_SESSION') + UpdateSession: createAction('UPDATE_SESSION'), } as const; export type ExperimentActionType = ActionType< diff --git a/app/actions/jupyterActions.ts b/app/actions/jupyterActions.ts index a7ba941d..338f3b95 100644 --- a/app/actions/jupyterActions.ts +++ b/app/actions/jupyterActions.ts @@ -42,7 +42,7 @@ export const JupyterActions = { ReceiveDisplayData: createAction( 'RECEIVE_DISPLAY_DATA' ), - ReceiveStream: createAction('RECEIVE_STREAM') + ReceiveStream: createAction('RECEIVE_STREAM'), } as const; export type JupyterActionType = ActionType< diff --git a/app/components/AnalyzeComponent.tsx b/app/components/AnalyzeComponent.tsx index cb4dbbdf..2129dd1a 100644 --- a/app/components/AnalyzeComponent.tsx +++ b/app/components/AnalyzeComponent.tsx @@ -8,7 +8,7 @@ import { Divider, Button, Checkbox, - Sidebar + Sidebar, } from 'semantic-ui-react'; import { isNil } from 'lodash'; import Plot from 'react-plotly.js'; @@ -18,18 +18,18 @@ import { MUSE_CHANNELS, EMOTIV_CHANNELS, KERNEL_STATUS, - EXPERIMENTS + EXPERIMENTS, } from '../constants/constants'; import { readWorkspaceCleanedEEGData, getSubjectNamesFromFiles, readWorkspaceBehaviorData, readBehaviorData, - storeAggregatedBehaviorData + storeAggregatedBehaviorData, } from '../utils/filesystem/storage'; import { aggregateDataForPlot, - aggregateBehaviorDataToSave + aggregateBehaviorDataToSave, } from '../utils/behavior/compute'; import SecondaryNavComponent from './SecondaryNavComponent'; import ClickableHeadDiagramSVG from './svgs/ClickableHeadDiagramSVG'; @@ -41,11 +41,11 @@ import { JupyterActions } from '../actions/jupyterActions'; const ANALYZE_STEPS = { OVERVIEW: 'OVERVIEW', ERP: 'ERP', - BEHAVIOR: 'BEHAVIOR' + BEHAVIOR: 'BEHAVIOR', }; const ANALYZE_STEPS_BEHAVIOR = { - BEHAVIOR: 'BEHAVIOR' + BEHAVIOR: 'BEHAVIOR', }; interface Props { @@ -161,7 +161,7 @@ export default class Analyze extends Component { selectedChannel: props.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS[0] - : MUSE_CHANNELS[0] + : MUSE_CHANNELS[0], }; this.handleChannelSelect = this.handleChannelSelect.bind(this); this.handleDatasetChange = this.handleDatasetChange.bind(this); @@ -191,22 +191,22 @@ export default class Analyze extends Component { } const behavioralData = await readWorkspaceBehaviorData(this.props.title); this.setState({ - eegFilePaths: workspaceCleanData.map(filepath => ({ + eegFilePaths: workspaceCleanData.map((filepath) => ({ key: filepath.name, text: filepath.name, - value: filepath.path + value: filepath.path, })), - behaviorFilePaths: behavioralData.map(filepath => ({ + behaviorFilePaths: behavioralData.map((filepath) => ({ key: filepath.name, text: filepath.name, - value: filepath.path + value: filepath.path, })), - dependentVariables: ['Response Time', 'Accuracy'].map(dv => ({ + dependentVariables: ['Response Time', 'Accuracy'].map((dv) => ({ key: dv, text: dv, - value: dv + value: dv, })), - selectedDependentVariable: 'Response Time' + selectedDependentVariable: 'Response Time', }); } @@ -220,7 +220,7 @@ export default class Analyze extends Component { handleDatasetChange(event: object, data: object) { this.setState({ selectedFilePaths: data.value, - selectedSubjects: getSubjectNamesFromFiles(data.value) + selectedSubjects: getSubjectNamesFromFiles(data.value), }); this.props.JupyterActions.LoadCleanedEpochs(data.value); } @@ -237,7 +237,7 @@ export default class Analyze extends Component { selectedBehaviorFilePaths: data.value, selectedSubjects: getSubjectNamesFromFiles(data.value), dataToPlot, - layout + layout, }); } @@ -245,11 +245,11 @@ export default class Analyze extends Component { const behavioralData = await readWorkspaceBehaviorData(this.props.title); if (behavioralData.length !== this.state.behaviorFilePaths.length) { this.setState({ - behaviorFilePaths: behavioralData.map(filepath => ({ + behaviorFilePaths: behavioralData.map((filepath) => ({ key: filepath.name, text: filepath.name, - value: filepath.path - })) + value: filepath.path, + })), }); } } @@ -265,7 +265,7 @@ export default class Analyze extends Component { this.setState({ selectedDependentVariable: data.value, dataToPlot, - layout + layout, }); } @@ -281,7 +281,7 @@ export default class Analyze extends Component { removeOutliers: !this.state.removeOutliers, dataToPlot, layout, - helpMode: 'outliers' + helpMode: 'outliers', }); } @@ -296,7 +296,7 @@ export default class Analyze extends Component { this.setState({ showDataPoints: !this.state.showDataPoints, dataToPlot, - layout + layout, }); } @@ -316,14 +316,14 @@ export default class Analyze extends Component { dataToPlot, layout, displayMode, - helpMode: displayMode + helpMode: displayMode, }); } } toggleDisplayInfoVisibility() { this.setState({ - isSidebarVisible: !this.state.isSidebarVisible + isSidebarVisible: !this.state.isSidebarVisible, }); } @@ -351,7 +351,7 @@ export default class Analyze extends Component { this.state.selectedFilePaths.length >= 1 ) { const numberConditions = this.props.epochsInfo.filter( - infoObj => + (infoObj) => infoObj.name !== 'Drop Percentage' && infoObj.name !== 'Total Epochs' ).length; let colors; @@ -364,7 +364,7 @@ export default class Analyze extends Component {
{this.props.epochsInfo .filter( - infoObj => + (infoObj) => infoObj.name !== 'Drop Percentage' && infoObj.name !== 'Total Epochs' ) @@ -566,7 +566,7 @@ export default class Analyze extends Component { overflow: 'auto', maxHeight: 650, display: 'grid', - justifyContent: 'center' + justifyContent: 'center', }} > diff --git a/app/components/CleanComponent/CleanSidebar.tsx b/app/components/CleanComponent/CleanSidebar.tsx index 200241a6..534f885d 100644 --- a/app/components/CleanComponent/CleanSidebar.tsx +++ b/app/components/CleanComponent/CleanSidebar.tsx @@ -11,7 +11,7 @@ enum HELP_STEP { LEARN_BRAIN = 5, LEARN_BLINK = 6, LEARN_THOUGHT = 7, - LEARN_ALPHA = 8 + LEARN_ALPHA = 8, } interface Props { @@ -25,7 +25,7 @@ export default class CleanSidebar extends Component { constructor(props) { super(props); this.state = { - helpStep: HELP_STEP.MENU + helpStep: HELP_STEP.MENU, }; this.handleStartLearn = this.handleStartLearn.bind(this); this.handleStartSignal = this.handleStartSignal.bind(this); diff --git a/app/components/CleanComponent/index.tsx b/app/components/CleanComponent/index.tsx index 6404527a..46cc14d5 100644 --- a/app/components/CleanComponent/index.tsx +++ b/app/components/CleanComponent/index.tsx @@ -11,7 +11,7 @@ import { Divider, DropdownProps, DropdownItemProps, - SemanticICONS + SemanticICONS, } from 'semantic-ui-react'; import * as path from 'path'; import { Link } from 'react-router-dom'; @@ -58,7 +58,7 @@ export default class Clean extends Component { eegFilePaths: [{ key: '', text: '', value: '' }], selectedFilePaths: [], selectedSubject: props.subject, - isSidebarVisible: false + isSidebarVisible: false, }; this.handleRecordingChange = this.handleRecordingChange.bind(this); this.handleLoadData = this.handleLoadData.bind(this); @@ -78,26 +78,26 @@ export default class Clean extends Component { this.setState({ subjects: workspaceRawData .map( - filepath => + (filepath) => filepath.path.split(path.sep)[ filepath.path.split(path.sep).length - 3 ] ) .reduce((acc, curr) => { - if (acc.find(subject => subject.key === curr)) { + if (acc.find((subject) => subject.key === curr)) { return acc; } return acc.concat({ key: curr, text: curr, - value: curr + value: curr, }); }, []), - eegFilePaths: workspaceRawData.map(filepath => ({ + eegFilePaths: workspaceRawData.map((filepath) => ({ key: filepath.name, text: filepath.name, - value: filepath.path - })) + value: filepath.path, + })), }); } @@ -147,7 +147,7 @@ export default class Clean extends Component { const { epochsInfo } = this.props; if (!isNil(epochsInfo)) { const drop = epochsInfo.find( - infoObj => infoObj.name === 'Drop Percentage' + (infoObj) => infoObj.name === 'Drop Percentage' )?.value; if (drop && drop >= 2) { @@ -214,7 +214,7 @@ export default class Clean extends Component { selection closeOnChange value={this.state.selectedFilePaths} - options={this.state.eegFilePaths.filter(filepath => { + options={this.state.eegFilePaths.filter((filepath) => { if (isString(filepath.value)) { const subjectFromFilepath = filepath.value.split( path.sep diff --git a/app/components/CollectComponent/ConnectModal.tsx b/app/components/CollectComponent/ConnectModal.tsx index 6cb11ecf..ac258f7f 100644 --- a/app/components/CollectComponent/ConnectModal.tsx +++ b/app/components/CollectComponent/ConnectModal.tsx @@ -6,7 +6,7 @@ import { DEVICES, DEVICE_AVAILABILITY, CONNECTION_STATUS, - SCREENS + SCREENS, } from '../../constants/constants'; import styles from '../styles/collect.css'; import { SignalQualityData } from '../../constants/interfaces'; @@ -33,7 +33,7 @@ interface State { enum INSTRUCTION_PROGRESS { SEARCHING, TURN_ON, - COMPUTER_CONNECTABILITY + COMPUTER_CONNECTABILITY, } export default class ConnectModal extends Component { @@ -51,15 +51,15 @@ export default class ConnectModal extends Component { super(props); this.state = { selectedDevice: null, - instructionProgress: INSTRUCTION_PROGRESS.SEARCHING + instructionProgress: INSTRUCTION_PROGRESS.SEARCHING, }; this.handleSearch = debounce(this.handleSearch.bind(this), 300, { leading: true, - trailing: false + trailing: false, }); this.handleConnect = debounce(this.handleConnect.bind(this), 1000, { leading: true, - trailing: false + trailing: false, }); this.handleinstructionProgress = this.handleinstructionProgress.bind(this); } @@ -100,7 +100,7 @@ export default class ConnectModal extends Component { return ( - {this.props.availableDevices.map(device => ( + {this.props.availableDevices.map((device) => ( { constructor(props) { super(props); this.state = { - helpStep: HELP_STEP.MENU + helpStep: HELP_STEP.MENU, }; this.handleStartLearn = this.handleStartLearn.bind(this); this.handleStartSignal = this.handleStartSignal.bind(this); @@ -53,17 +53,17 @@ export class HelpSidebar extends Component { ) { this.setState({ helpStep: HELP_STEP.MENU }); } else { - this.setState(prevState => ({ + this.setState((prevState) => ({ ...prevState, - helpStep: prevState.helpStep + 1 + helpStep: prevState.helpStep + 1, })); } } handleBack() { - this.setState(prevState => ({ + this.setState((prevState) => ({ ...prevState, - helpStep: prevState.helpStep - 1 + helpStep: prevState.helpStep - 1, })); } diff --git a/app/components/CollectComponent/PreTestComponent.tsx b/app/components/CollectComponent/PreTestComponent.tsx index 0c0a3454..aafc0f56 100644 --- a/app/components/CollectComponent/PreTestComponent.tsx +++ b/app/components/CollectComponent/PreTestComponent.tsx @@ -5,7 +5,7 @@ import { Button, List, Header, - Sidebar + Sidebar, } from 'semantic-ui-react'; import Mousetrap from 'mousetrap'; import ViewerComponent from '../ViewerComponent'; @@ -21,12 +21,12 @@ import { DEVICE_AVAILABILITY, EXPERIMENTS, PLOTTING_INTERVAL, - CONNECTION_STATUS + CONNECTION_STATUS, } from '../../constants/constants'; import { ExperimentParameters, MainTimeline, - Trial + Trial, } from '../../constants/interfaces'; interface Props { @@ -67,7 +67,7 @@ export default class PreTestComponent extends Component { super(props); this.state = { isPreviewing: false, - isSidebarVisible: true + isSidebarVisible: true, }; this.handlePreview = this.handlePreview.bind(this); this.handleSidebarToggle = this.handleSidebarToggle.bind(this); @@ -88,17 +88,17 @@ export default class PreTestComponent extends Component { handlePreview(e) { e.target.blur(); - this.setState(prevState => ({ + this.setState((prevState) => ({ ...prevState, isSidebarVisible: false, - isPreviewing: !prevState.isPreviewing + isPreviewing: !prevState.isPreviewing, })); } handleSidebarToggle() { - this.setState(prevState => ({ + this.setState((prevState) => ({ ...prevState, - isSidebarVisible: !prevState.isSidebarVisible + isSidebarVisible: !prevState.isSidebarVisible, })); } @@ -179,7 +179,7 @@ export default class PreTestComponent extends Component { this.handlePreview(e)} + onClick={(e) => this.handlePreview(e)} />
@@ -199,7 +199,7 @@ export default class Run extends Component { data={{ subject: this.props.subject, group: this.props.group, - session: this.props.session + session: this.props.session, }} /> diff --git a/app/components/CollectComponent/index.tsx b/app/components/CollectComponent/index.tsx index c575da70..cef26966 100644 --- a/app/components/CollectComponent/index.tsx +++ b/app/components/CollectComponent/index.tsx @@ -5,13 +5,13 @@ import { EXPERIMENTS, DEVICES, CONNECTION_STATUS, - DEVICE_AVAILABILITY + DEVICE_AVAILABILITY, } from '../../constants/constants'; import { MainTimeline, Trial, ExperimentParameters, - SignalQualityData + SignalQualityData, } from '../../constants/interfaces'; import PreTestComponent from './PreTestComponent'; import ConnectModal from './ConnectModal'; @@ -57,7 +57,7 @@ export default class Collect extends Component { super(props); this.state = { isConnectModalOpen: false, - isRunComponentOpen: !props.isEEGEnabled + isRunComponentOpen: !props.isEEGEnabled, }; this.handleStartConnect = this.handleStartConnect.bind(this); this.handleConnectModalClose = this.handleConnectModalClose.bind(this); diff --git a/app/components/DesignComponent/CustomDesignComponent.tsx b/app/components/DesignComponent/CustomDesignComponent.tsx index 023c922e..4bbd1ffb 100644 --- a/app/components/DesignComponent/CustomDesignComponent.tsx +++ b/app/components/DesignComponent/CustomDesignComponent.tsx @@ -7,7 +7,7 @@ import { Form, Checkbox, Image, - Table + Table, } from 'semantic-ui-react'; import { isNil } from 'lodash'; import { HashHistory } from 'history'; @@ -19,7 +19,7 @@ import { Trial, ExperimentParameters, ExperimentDescription, - StimuliDesc + StimuliDesc, } from '../../constants/interfaces'; import SecondaryNavComponent from '../SecondaryNavComponent'; import PreviewExperimentComponent from '../PreviewExperimentComponent'; @@ -40,7 +40,7 @@ const CUSTOM_STEPS = { TRIALS: 'TRIALS', PARAMETERS: 'PARAMETERS', INSTRUCTIONS: 'INSTRUCTIONS', - PREVIEW: 'PREVIEW' + PREVIEW: 'PREVIEW', }; const FIELDS = { @@ -48,7 +48,7 @@ const FIELDS = { HYPOTHESIS: 'Hypothesis', METHODS: 'Methods', INTRO: 'Experiment Instructions', - HELP: 'Instructions for the task screen' + HELP: 'Instructions for the task screen', }; interface Props { @@ -87,7 +87,7 @@ export default class CustomDesign extends Component { isPreviewing: true, description: props.description, params: props.params, - saved: false + saved: false, }; this.handleStepClick = this.handleStepClick.bind(this); this.handleStartExperiment = this.handleStartExperiment.bind(this); @@ -112,7 +112,7 @@ export default class CustomDesign extends Component { handleProgressBar(event: object, data: object) { this.setState({ - params: { ...this.state.params, showProgessBar: data.checked } + params: { ...this.state.params, showProgessBar: data.checked }, }); } @@ -141,7 +141,7 @@ export default class CustomDesign extends Component { { name: 'stimulus1', number: 1 }, { name: 'stimulus2', number: 2 }, { name: 'stimulus3', number: 3 }, - { name: 'stimulus4', number: 4 } + { name: 'stimulus4', number: 4 }, ]; switch (this.state.activeStep) { case CUSTOM_STEPS.OVERVIEW: @@ -173,9 +173,9 @@ export default class CustomDesign extends Component { this.setState({ description: { ...this.state.description, - question: data.value + question: data.value, }, - saved: false + saved: false, }) } /> @@ -200,9 +200,9 @@ export default class CustomDesign extends Component { this.setState({ description: { ...this.state.description, - hypothesis: data.value + hypothesis: data.value, }, - saved: false + saved: false, }) } /> @@ -227,9 +227,9 @@ export default class CustomDesign extends Component { this.setState({ description: { ...this.state.description, - methods: data.value + methods: data.value, }, - saved: false + saved: false, }) } /> @@ -272,7 +272,7 @@ export default class CustomDesign extends Component { {...this.state.params[name]} numberImages={ this.state.params.stimuli.filter( - trial => trial.type === number + (trial) => trial.type === number ).length } onChange={async (key, data, changedName) => { @@ -281,23 +281,23 @@ export default class CustomDesign extends Component { ...this.state.params, [changedName]: { ...this.state.params[changedName], - [key]: data - } - } + [key]: data, + }, + }, }); let newStimuli: StimuliDesc[] = []; - await stimi.forEach(stimul => { + await stimi.forEach((stimul) => { let dirStimuli: StimuliDesc[] = []; const { dir } = this.state.params[stimul.name]; if (dir && typeof dir !== 'undefined' && dir !== '') { - dirStimuli = readImages(dir).map(i => ({ + dirStimuli = readImages(dir).map((i) => ({ dir, filename: i, name: i, condition: this.state.params[stimul.name].title, response: this.state.params[stimul.name].response, phase: 'main', - type: stimul.number + type: stimul.number, })); } if (dirStimuli.length) dirStimuli[0].phase = 'practice'; @@ -307,13 +307,13 @@ export default class CustomDesign extends Component { params: { ...this.state.params, stimuli: [...newStimuli], - nbTrials: newStimuli.filter(t => t.phase === 'main') + nbTrials: newStimuli.filter((t) => t.phase === 'main') .length, nbPracticeTrials: newStimuli.filter( - t => t.phase === 'practice' - ).length + (t) => t.phase === 'practice' + ).length, }, - saved: false + saved: false, }); }} /> @@ -348,9 +348,9 @@ export default class CustomDesign extends Component { this.setState({ params: { ...this.state.params, - randomize: data.value + randomize: data.value, }, - saved: false + saved: false, }); } }} @@ -360,8 +360,8 @@ export default class CustomDesign extends Component { { key: 'sequential', text: 'Sequential', - value: 'sequential' - } + value: 'sequential', + }, ]} /> { this.setState({ params: { ...this.state.params, - nbTrials: parseInt(data.value, 10) + nbTrials: parseInt(data.value, 10), }, - saved: false + saved: false, }) } /> @@ -388,9 +388,9 @@ export default class CustomDesign extends Component { this.setState({ params: { ...this.state.params, - nbPracticeTrials: parseInt(data.value, 10) + nbPracticeTrials: parseInt(data.value, 10), }, - saved: false + saved: false, }) } /> @@ -417,25 +417,26 @@ export default class CustomDesign extends Component { key={`stim_row_${num}`} num={num} conditions={[1, 2, 3, 4].map( - n => this.state.params[`stimulus${n}`].title + (n) => this.state.params[`stimulus${n}`].title )} {...e} - onDelete={deletedNum => { + onDelete={(deletedNum) => { const { stimuli } = this.state.params; stimuli.splice(deletedNum, 1); const nbPracticeTrials = stimuli.filter( - s => s.phase === 'practice' + (s) => s.phase === 'practice' + ).length; + const nbTrials = stimuli.filter( + (s) => s.phase === 'main' ).length; - const nbTrials = stimuli.filter(s => s.phase === 'main') - .length; this.setState({ params: { ...this.state.params, stimuli: [...stimuli], nbPracticeTrials, - nbTrials + nbTrials, }, - saved: false + saved: false, }); }} onChange={(changedNum, key, data) => { @@ -445,9 +446,9 @@ export default class CustomDesign extends Component { let { nbTrials } = this.state.params; if (key === 'phase') { nbPracticeTrials = stimuli.filter( - s => s.phase === 'practice' + (s) => s.phase === 'practice' ).length; - nbTrials = stimuli.filter(s => s.phase === 'main') + nbTrials = stimuli.filter((s) => s.phase === 'main') .length; } this.setState({ @@ -455,9 +456,9 @@ export default class CustomDesign extends Component { ...this.state.params, stimuli: [...stimuli], nbPracticeTrials, - nbTrials + nbTrials, }, - saved: false + saved: false, }); }} /> @@ -494,13 +495,13 @@ export default class CustomDesign extends Component { 5: '1.25', 6: '1.5', 7: '1.75', - 8: '2' + 8: '2', }} msConversion="250" - onChange={value => + onChange={(value) => this.setState({ params: { ...this.state.params, iti: value }, - saved: false + saved: false, }) } /> @@ -522,13 +523,13 @@ export default class CustomDesign extends Component { + onChange={(value) => this.setState({ params: { ...this.state.params, - selfPaced: !this.state.params.selfPaced + selfPaced: !this.state.params.selfPaced, }, - saved: false + saved: false, }) } /> @@ -551,16 +552,16 @@ export default class CustomDesign extends Component { 5: '1.25', 6: '1.5', 7: '1.75', - 8: '2' + 8: '2', }} msConversion="250" - onChange={value => + onChange={(value) => this.setState({ params: { ...this.state.params, - presentationTime: value + presentationTime: value, }, - saved: false + saved: false, }) } /> @@ -594,7 +595,7 @@ export default class CustomDesign extends Component { onChange={(event, data) => this.setState({ params: { ...this.state.params, intro: data.value }, - saved: false + saved: false, }) } /> @@ -621,7 +622,7 @@ export default class CustomDesign extends Component { onChange={(event, data) => this.setState({ params: { ...this.state.params, taskHelp: data.value }, - saved: false + saved: false, }) } /> @@ -656,7 +657,7 @@ export default class CustomDesign extends Component { this.handlePreview(e)} + onClick={(e) => this.handlePreview(e)} /> diff --git a/app/components/DesignComponent/ParamSlider.tsx b/app/components/DesignComponent/ParamSlider.tsx index 78dd6821..c68fa233 100644 --- a/app/components/DesignComponent/ParamSlider.tsx +++ b/app/components/DesignComponent/ParamSlider.tsx @@ -16,7 +16,7 @@ export const ParamSlider: React.FC = ({ msConversion, value, label, - onChange + onChange, }) => { return (
@@ -29,7 +29,7 @@ export const ParamSlider: React.FC = ({ min={Math.min(...Object.keys(marks))} max={Math.max(...Object.keys(marks))} value={value / parseInt(msConversion, 10)} - onChange={val => onChange(val * parseInt(msConversion, 10))} + onChange={(val) => onChange(val * parseInt(msConversion, 10))} defaultValue={1} /> ) : ( diff --git a/app/components/DesignComponent/StimuliDesignColumn.tsx b/app/components/DesignComponent/StimuliDesignColumn.tsx index ddb2fb49..331ec218 100644 --- a/app/components/DesignComponent/StimuliDesignColumn.tsx +++ b/app/components/DesignComponent/StimuliDesignColumn.tsx @@ -20,7 +20,7 @@ interface Props { const RESPONSE_OPTIONS = new Array(10).fill(0).map((_, i) => ({ key: i.toString(), text: i.toString(), - value: i.toString() + value: i.toString(), })); export default class StimuliDesignColumn extends Component { @@ -29,7 +29,7 @@ export default class StimuliDesignColumn extends Component { this.handleSelectFolder = this.handleSelectFolder.bind(this); this.handleRemoveFolder = this.handleRemoveFolder.bind(this); this.state = { - numberImages: undefined + numberImages: undefined, }; } @@ -52,7 +52,7 @@ export default class StimuliDesignColumn extends Component { toast.error('No images in folder!'); } this.setState({ - numberImages: images.length + numberImages: images.length, }); this.props.onChange('dir', dir, `stimulus${this.props.num}`); } @@ -60,7 +60,7 @@ export default class StimuliDesignColumn extends Component { handleRemoveFolder() { this.setState({ - numberImages: 0 + numberImages: 0, }); this.props.onChange('dir', '', `stimulus${this.props.num}`); } @@ -108,10 +108,7 @@ export default class StimuliDesignColumn extends Component {
Folder{' '} {this.props.dir && - this.props.dir - .split(path.sep) - .slice(-1) - .join(' / ')} + this.props.dir.split(path.sep).slice(-1).join(' / ')}
( {this.state.numberImages || this.props.numberImages} images ){' '} diff --git a/app/components/DesignComponent/StimuliRow.tsx b/app/components/DesignComponent/StimuliRow.tsx index 2e17e1ea..ea5ea847 100644 --- a/app/components/DesignComponent/StimuliRow.tsx +++ b/app/components/DesignComponent/StimuliRow.tsx @@ -18,10 +18,10 @@ interface Props { const RESPONSE_OPTIONS = new Array(10).fill(0).map((_, i) => ({ key: i.toString(), text: i.toString(), - value: i.toString() + value: i.toString(), })); -export const StimuliRow: React.FC = props => { +export const StimuliRow: React.FC = (props) => { return ( @@ -51,7 +51,7 @@ export const StimuliRow: React.FC = props => {
{props.phase === 'main' ? 'Experimental' : 'Practice'} @@ -61,7 +61,7 @@ export const StimuliRow: React.FC = props => { style={{ display: 'grid', color: '#C4C4C4', - justifyContent: 'end' + justifyContent: 'end', }} > diff --git a/app/components/DesignComponent/index.tsx b/app/components/DesignComponent/index.tsx index e4ba3f32..545cc251 100644 --- a/app/components/DesignComponent/index.tsx +++ b/app/components/DesignComponent/index.tsx @@ -7,7 +7,7 @@ import { Header, Image, Checkbox, - CheckboxProps + CheckboxProps, } from 'semantic-ui-react'; import { isNil } from 'lodash'; import { toast } from 'react-toastify'; @@ -19,7 +19,7 @@ import { MainTimeline, Trial, ExperimentParameters, - ExperimentDescription + ExperimentDescription, } from '../../constants/interfaces'; import SecondaryNavComponent from '../SecondaryNavComponent'; import PreviewExperimentComponent from '../PreviewExperimentComponent'; @@ -50,7 +50,7 @@ const DESIGN_STEPS = { OVERVIEW: 'OVERVIEW', BACKGROUND: 'BACKGROUND', PROTOCOL: 'PROTOCOL', - PREVIEW: 'PREVIEW' + PREVIEW: 'PREVIEW', }; export interface Props { @@ -104,7 +104,7 @@ export default class Design extends Component { activeStep: DESIGN_STEPS.OVERVIEW, isPreviewing: false, isNewExperimentModalOpen: false, - recentWorkspaces: [] + recentWorkspaces: [], }; this.handleStepClick = this.handleStepClick.bind(this); this.handleStartExperiment = this.handleStartExperiment.bind(this); @@ -134,7 +134,7 @@ export default class Design extends Component { handleCustomizeExperiment() { this.setState({ - isNewExperimentModalOpen: true + isNewExperimentModalOpen: true, }); } @@ -152,7 +152,7 @@ export default class Design extends Component { this.props.ExperimentActions.CreateNewWorkspace({ title, type: EXPERIMENTS.CUSTOM, - paradigm: 'Custom' + paradigm: 'Custom', // paradigm: this.props.paradigm }); this.props.ExperimentActions.SaveWorkspace(); @@ -160,8 +160,8 @@ export default class Design extends Component { handlePreview(e) { e.target.blur(); - this.setState(prevState => ({ - isPreviewing: !prevState.isPreviewing + this.setState((prevState) => ({ + isPreviewing: !prevState.isPreviewing, })); } @@ -280,7 +280,7 @@ export default class Design extends Component {
- {this.props.background_links.map(link => ( + {this.props.background_links.map((link) => (
diff --git a/app/components/SecondaryNavComponent/index.tsx b/app/components/SecondaryNavComponent/index.tsx index 39ae01ab..da8f12b6 100644 --- a/app/components/SecondaryNavComponent/index.tsx +++ b/app/components/SecondaryNavComponent/index.tsx @@ -35,7 +35,7 @@ export default class SecondaryNavComponent extends Component { renderSteps() { return ( <> - {Object.values(this.props.steps).map(stepTitle => ( + {Object.values(this.props.steps).map((stepTitle) => ( { e.stopPropagation()} + onClick={(e) => e.stopPropagation()} >
Enable EEG
{this.props.enableEEGToggle} diff --git a/app/components/SignalQualityIndicatorComponent.tsx b/app/components/SignalQualityIndicatorComponent.tsx index d16f0e83..f7e0cabd 100644 --- a/app/components/SignalQualityIndicatorComponent.tsx +++ b/app/components/SignalQualityIndicatorComponent.tsx @@ -44,8 +44,8 @@ class SignalQualityIndicatorComponent extends Component { } this.signalQualitySubscription = observable.subscribe( - epoch => { - Object.keys(epoch.signalQuality).forEach(key => { + (epoch) => { + Object.keys(epoch.signalQuality).forEach((key) => { d3.select(`#${key}`) .attr('visibility', 'show') .attr('stroke', '#000') @@ -55,7 +55,7 @@ class SignalQualityIndicatorComponent extends Component { .attr('fill', epoch.signalQuality[key]); }); }, - error => new Error(`Error in signalQualitySubscription ${error}`) + (error) => new Error(`Error in signalQualitySubscription ${error}`) ); } diff --git a/app/components/TopNavComponent/PrimaryNavSegment.tsx b/app/components/TopNavComponent/PrimaryNavSegment.tsx index 1373404b..8b24d046 100644 --- a/app/components/TopNavComponent/PrimaryNavSegment.tsx +++ b/app/components/TopNavComponent/PrimaryNavSegment.tsx @@ -10,7 +10,7 @@ interface Props { order: number; } -const PrimaryNavSegment = props => { +const PrimaryNavSegment = (props) => { return ( { } const routeOrder = Object.values(SCREENS).find( - screen => screen.route === navSegmentScreen.route + (screen) => screen.route === navSegmentScreen.route )?.order; const currentOrder = Object.values(SCREENS).find( - screen => screen.route === this.props.location.pathname + (screen) => screen.route === this.props.location.pathname )?.order; if (routeOrder && currentOrder && currentOrder > routeOrder) { return styles.visitedNavColumn; @@ -88,7 +88,7 @@ export default class TopNavComponent extends Component { }} > - {this.state.recentWorkspaces.map(workspace => ( + {this.state.recentWorkspaces.map((workspace) => ( this.handleLoadRecentWorkspace(workspace)} diff --git a/app/components/ViewerComponent.tsx b/app/components/ViewerComponent.tsx index ac630f72..869c21c9 100644 --- a/app/components/ViewerComponent.tsx +++ b/app/components/ViewerComponent.tsx @@ -5,7 +5,7 @@ import { MUSE_CHANNELS, EMOTIV_CHANNELS, DEVICES, - VIEWER_DEFAULTS + VIEWER_DEFAULTS, } from '../constants/constants'; const Mousetrap = require('mousetrap'); @@ -30,7 +30,7 @@ class ViewerComponent extends Component { this.state = { ...VIEWER_DEFAULTS, channels: - props.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS : MUSE_CHANNELS + props.deviceType === DEVICES.EMOTIV ? EMOTIV_CHANNELS : MUSE_CHANNELS, }; this.graphView = null; this.signalQualitySubscription = null; @@ -43,7 +43,7 @@ class ViewerComponent extends Component { plottingInterval: this.props.plottingInterval, channels: this.state.channels, domain: this.state.domain, - channelColours: this.state.channels.map(() => '#66B0A9') + channelColours: this.state.channels.map(() => '#66B0A9'), }); this.setKeyListeners(); if (!isNil(this.props.signalQualityObservable)) { @@ -63,7 +63,7 @@ class ViewerComponent extends Component { channels: this.props.deviceType === DEVICES.MUSE ? MUSE_CHANNELS - : EMOTIV_CHANNELS + : EMOTIV_CHANNELS, }); } if (this.state.channels !== prevState.channels) { @@ -98,10 +98,10 @@ class ViewerComponent extends Component { this.signalQualitySubscription.unsubscribe(); } this.signalQualitySubscription = observable.subscribe( - chunk => { + (chunk) => { this.graphView.send('newData', chunk); }, - error => new Error(`Error in epochSubscription ${error}`) + (error) => new Error(`Error in epochSubscription ${error}`) ); } diff --git a/app/components/d3Classes/EEGViewer.js b/app/components/d3Classes/EEGViewer.js index 0d0409c0..a12f03d4 100644 --- a/app/components/d3Classes/EEGViewer.js +++ b/app/components/d3Classes/EEGViewer.js @@ -28,7 +28,7 @@ class EEGViewer { updateData(epoch) { const { - info: { samplingRate, startTime } + info: { samplingRate, startTime }, } = epoch; this.lastTimestamp = startTime + epoch.data[0].length / (samplingRate / 1000); @@ -39,16 +39,16 @@ class EEGViewer { simplify( epoch.data[i].map((dataPoint, index) => ({ x: startTime + index / (samplingRate / 1000), - y: dataPoint + y: dataPoint, })), this.downsampling ) ) - .filter(sample => sample.x >= this.firstTimestamp); + .filter((sample) => sample.x >= this.firstTimestamp); } this.channelColours = this.channels.map( - channelName => epoch.signalQuality[channelName] + (channelName) => epoch.signalQuality[channelName] ); this.redraw(); } @@ -76,10 +76,10 @@ class EEGViewer { } autoScale() { - this.channelMaxs = this.data.map(channelData => + this.channelMaxs = this.data.map((channelData) => EEGViewer.findExtreme(channelData, (a, b) => a > b) ); - this.channelMins = this.data.map(channelData => + this.channelMins = this.data.map((channelData) => EEGViewer.findExtreme(channelData, (a, b) => a < b) ); this.zoom = 1; @@ -88,7 +88,7 @@ class EEGViewer { resetData() { this.data = new Array(this.channels.length).fill([ - { x: this.lastTimestamp, y: 0 } + { x: this.lastTimestamp, y: 0 }, ]); this.channelMaxs = new Array(this.channels.length).fill(100); this.channelMins = new Array(this.channels.length).fill(-100); @@ -133,7 +133,7 @@ class EEGViewer { .range([ (this.channels.length - 1) * (this.height / this.channels.length) + this.height / this.channels.length / 2, - this.height / this.channels.length / 2 + this.height / this.channels.length / 2, ]); } @@ -145,10 +145,7 @@ class EEGViewer { .tickFormat((d, i) => this.channels[i].replace(/\s/g, '')) .tickValues(d3.range(this.channels.length)); - this.axisY = this.graph - .append('g') - .attr('class', 'axis') - .call(this.yAxis); + this.axisY = this.graph.append('g').attr('class', 'axis').call(this.yAxis); } addLines() { @@ -172,10 +169,10 @@ class EEGViewer { .attr('clip-path', 'url(#clip)'); this.line = d3 .line() - .x(d => this.xScale(d.x)) - .y(d => this.yScaleLines(d.y)) + .x((d) => this.xScale(d.x)) + .y((d) => this.yScaleLines(d.y)) .curve(d3.curveLinear) - .defined(d => d.y); + .defined((d) => d.y); for (let i = 0; i < this.channels.length; i++) { const channelData = this.data[i]; @@ -183,7 +180,7 @@ class EEGViewer { this.yScaleLines .domain([ this.channelMins[i] / this.zoom, - this.channelMaxs[i] / this.zoom + this.channelMaxs[i] / this.zoom, ]) .range(EEGViewer.getLineRange(i, this.channels.length, this.height)); @@ -205,7 +202,7 @@ class EEGViewer { this.yScaleLines .domain([ this.channelMins[i] / this.zoom, - this.channelMaxs[i] / this.zoom + this.channelMaxs[i] / this.zoom, ]) .range(EEGViewer.getLineRange(i, this.channels.length, this.height)); @@ -233,7 +230,7 @@ class EEGViewer { this.xScale .domain([ this.lastTimestamp, - this.firstTimestamp + this.plottingInterval + this.firstTimestamp + this.plottingInterval, ]) .range([this.width, 0]); } @@ -253,7 +250,7 @@ class EEGViewer { this.yScaleLabels.range([ (this.channels.length - 1) * (this.height / this.channels.length) + this.height / this.channels.length / 2, - this.height / this.channels.length / 2 + this.height / this.channels.length / 2, ]); this.axisY.call(this.yAxis); this.addLines(); diff --git a/app/components/svgs/SignalQualityIndicatorSVG.tsx b/app/components/svgs/SignalQualityIndicatorSVG.tsx index 1123c73b..9b888f46 100644 --- a/app/components/svgs/SignalQualityIndicatorSVG.tsx +++ b/app/components/svgs/SignalQualityIndicatorSVG.tsx @@ -1,6 +1,6 @@ import React from 'react'; -const SvgComponent = props => ( +const SvgComponent = (props) => ( ((msg) => { console.log(debugParseMessage(msg)); - switch (msg['header']['msg_type']) { + switch (msg.header.msg_type) { case 'kernel_info_reply': return JupyterActions.SetKernelInfo(msg); case 'status': diff --git a/app/index.tsx b/app/index.tsx index 518f503e..4a41fafd 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -1,7 +1,6 @@ import React, { Fragment } from 'react'; import { render } from 'react-dom'; import { AppContainer as ReactHotAppContainer } from 'react-hot-loader'; -import Root from './containers/Root'; import { configuredStore, history } from './store'; import './app.global.css'; diff --git a/app/menu.ts b/app/menu.ts index c8b9466b..573e1e7f 100644 --- a/app/menu.ts +++ b/app/menu.ts @@ -1,4 +1,4 @@ -/* eslint @typescript-eslint/ban-ts-ignore: off */ +/* eslint @typescript-eslint/ban-ts-comment: off */ import { app, Menu, diff --git a/app/reducers/deviceReducer.ts b/app/reducers/deviceReducer.ts index bb418c84..f296b257 100644 --- a/app/reducers/deviceReducer.ts +++ b/app/reducers/deviceReducer.ts @@ -4,13 +4,13 @@ import { DEVICES, CONNECTION_STATUS, DEVICE_AVAILABILITY, - SIGNAL_QUALITY + SIGNAL_QUALITY, } from '../constants/constants'; import { DeviceInfo, Device, EEGData, - SignalQualityData + SignalQualityData, } from '../constants/interfaces'; import { DeviceActions } from '../actions'; @@ -32,54 +32,54 @@ const initialState: DeviceStateType = { deviceAvailability: DEVICE_AVAILABILITY.NONE, rawObservable: null, signalQualityObservable: null, - deviceType: DEVICES.EMOTIV + deviceType: DEVICES.EMOTIV, }; -export default createReducer(initialState, builder => +export default createReducer(initialState, (builder) => builder .addCase(DeviceActions.ConnectToDevice, (state, action) => { return { ...state, - deviceType: action.payload + deviceType: action.payload, }; }) .addCase(DeviceActions.SetDeviceInfo, (state, action) => { return { ...state, - connectedDevice: action.payload + connectedDevice: action.payload, }; }) .addCase(DeviceActions.SetAvailableDevices, (state, action) => { return { ...state, - availableDevices: action.payload + availableDevices: action.payload, }; }) .addCase(DeviceActions.SetConnectionStatus, (state, action) => { return { ...state, - connectionStatus: action.payload + connectionStatus: action.payload, }; }) .addCase(DeviceActions.SetDeviceAvailability, (state, action) => { return { ...state, - deviceAvailability: action.payload + deviceAvailability: action.payload, }; }) .addCase(DeviceActions.SetRawObservable, (state, action) => { return { ...state, - rawObservable: action.payload + rawObservable: action.payload, }; }) .addCase(DeviceActions.SetSignalQualityObservable, (state, action) => { return { ...state, - signalQualityObservable: action.payload + signalQualityObservable: action.payload, }; }) .addCase(DeviceActions.Cleanup, (state, action) => { diff --git a/app/reducers/experimentReducer.ts b/app/reducers/experimentReducer.ts index 141c3f7b..ca90bb72 100644 --- a/app/reducers/experimentReducer.ts +++ b/app/reducers/experimentReducer.ts @@ -5,7 +5,7 @@ import { MainTimeline, Trial, ExperimentDescription, - ExperimentParameters + ExperimentParameters, } from '../constants/interfaces'; export interface ExperimentStateType { @@ -39,91 +39,91 @@ const initialState: ExperimentStateType = { session: 1, isRunning: false, isEEGEnabled: false, - description: { question: '', hypothesis: '', methods: '' } + description: { question: '', hypothesis: '', methods: '' }, }; -export default createReducer(initialState, builder => +export default createReducer(initialState, (builder) => builder .addCase(ExperimentActions.SetType, (state, action) => { return { ...state, - type: action.payload + type: action.payload, }; }) .addCase(ExperimentActions.SetParadigm, (state, action) => { return { ...state, - paradigm: action.payload + paradigm: action.payload, }; }) .addCase(ExperimentActions.SetSubject, (state, action) => { return { ...state, - subject: action.payload + subject: action.payload, }; }) .addCase(ExperimentActions.SetGroup, (state, action) => { return { ...state, - group: action.payload + group: action.payload, }; }) .addCase(ExperimentActions.SetSession, (state, action) => { return { ...state, - session: action.payload + session: action.payload, }; }) .addCase(ExperimentActions.SetParams, (state, action) => { return { ...state, - params: { ...state.params, ...action.payload } + params: { ...state.params, ...action.payload }, }; }) .addCase(ExperimentActions.SetTimeline, (state, action) => { return { ...state, - ...action.payload + ...action.payload, }; }) .addCase(ExperimentActions.SetTitle, (state, action) => { return { ...state, - title: action.payload + title: action.payload, }; }) .addCase(ExperimentActions.SetDescription, (state, action) => { return { ...state, - description: action.payload + description: action.payload, }; }) .addCase(ExperimentActions.SetIsRunning, (state, action) => { return { ...state, - isRunning: action.payload + isRunning: action.payload, }; }) .addCase(ExperimentActions.SetEEGEnabled, (state, action) => { return { ...state, - isEEGEnabled: action.payload + isEEGEnabled: action.payload, }; }) .addCase(ExperimentActions.SetExperimentState, (state, action) => { return { - ...action.payload + ...action.payload, }; }) .addCase( diff --git a/app/reducers/jupyterReducer.ts b/app/reducers/jupyterReducer.ts index 9618476b..d9951c90 100644 --- a/app/reducers/jupyterReducer.ts +++ b/app/reducers/jupyterReducer.ts @@ -39,57 +39,57 @@ const initialState = { channelInfo: [], psdPlot: null, topoPlot: null, - erpPlot: null + erpPlot: null, }; -export default createReducer(initialState, builder => +export default createReducer(initialState, (builder) => builder .addCase(JupyterActions.SetKernel, (state, action) => { return { ...state, - kernel: action.payload + kernel: action.payload, }; }) .addCase(JupyterActions.SetKernelStatus, (state, action) => { return { ...state, - kernelStatus: action.payload + kernelStatus: action.payload, }; }) .addCase(JupyterActions.SetMainChannel, (state, action) => { return { ...state, - mainChannel: action.payload + mainChannel: action.payload, }; }) .addCase(JupyterActions.SetEpochInfo, (state, action) => { return { ...state, - epochsInfo: action.payload + epochsInfo: action.payload, }; }) .addCase(JupyterActions.SetChannelInfo, (state, action) => { return { ...state, - channelInfo: action.payload + channelInfo: action.payload, }; }) .addCase(JupyterActions.SetPSDPlot, (state, action) => { return { ...state, - psdPlot: action.payload + psdPlot: action.payload, }; }) .addCase(JupyterActions.SetTopoPlot, (state, action) => { return { ...state, - topoPlot: action.payload + topoPlot: action.payload, }; }) .addCase(JupyterActions.SetERPPlot, (state, action) => { return { ...state, - erpPlot: action.payload + erpPlot: action.payload, }; }) .addCase(ExperimentActions.ExperimentCleanup, (state, action) => { @@ -97,7 +97,7 @@ export default createReducer(initialState, builder => ...state, epochsInfo: [], psdPlot: null, - erpPlot: null + erpPlot: null, }; }) ); diff --git a/app/routes.tsx b/app/routes.tsx index 4976f59f..1863b565 100644 --- a/app/routes.tsx +++ b/app/routes.tsx @@ -18,7 +18,7 @@ const renderMergedProps = (component, ...rest) => { const PropsRoute = ({ component, ...rest }) => ( renderMergedProps(component, routeProps, rest)} + render={(routeProps) => renderMergedProps(component, routeProps, rest)} /> ); diff --git a/app/utils/eeg/cortex.ts b/app/utils/eeg/cortex.ts index 4813c0b1..4e24d011 100644 --- a/app/utils/eeg/cortex.ts +++ b/app/utils/eeg/cortex.ts @@ -23,7 +23,7 @@ const EventEmitter = require('events'); const CORTEX_URL = 'wss://localhost:6868'; -const safeParse = msg => { +const safeParse = (msg) => { try { return JSON.parse(msg); } catch (_) { @@ -42,6 +42,7 @@ class JSONRPCError extends Error { this.message = err.message; this.code = err.code; } + toString() { return `${super.toString()} (${this.code})`; } @@ -60,24 +61,25 @@ export default class Cortex extends EventEmitter { this._log('ws: Socket closed'); }); this.verbose = options.verbose !== null ? options.verbose : 1; - this.handleError = error => { + this.handleError = (error) => { throw new JSONRPCError(error); }; this.ready = new Promise( - resolve => this.ws.addEventListener('open', resolve), + (resolve) => this.ws.addEventListener('open', resolve), this.handleError ) .then(() => this._log('ws: Socket opened')) .then(() => this.call('inspectApi')) - .then(methods => { - methods.forEach(m => { + .then((methods) => { + methods.forEach((m) => { this.defineMethod(m.methodName, m.params); }); this._log(`rpc: Added ${methods.length} methods from inspectApi`); return methods; }); } + _onmsg(msg) { const data = safeParse(msg.data); if (!data) return this._warn('unparseable message', msg); @@ -97,28 +99,32 @@ export default class Cortex extends EventEmitter { } } else if ('sid' in data) { const dataKeys = Object.keys(data).filter( - k => k !== 'sid' && k !== 'time' && Array.isArray(data[k]) + (k) => k !== 'sid' && k !== 'time' && Array.isArray(data[k]) ); dataKeys.forEach( - k => + (k) => this.emit(k, data) || this._warn('no listeners for stream event', k) ); } else { this._log('rpc: Unrecognised data', data); } } + _warn(...msg) { if (this.verbose > 0) console.warn('[Cortex WARN]', ...msg); } + _log(...msg) { if (this.verbose > 1) console.log('[Cortex LOG]', ...msg); } + _debug(...msg) { if (this.verbose > 2) console.debug('[Cortex DEBUG]', ...msg); } + init({ clientId, clientSecret, license, debit } = {}) { const token = this.getUserLogin() - .then(users => { + .then((users) => { if (users.length === 0) { return Promise.reject(new Error('No logged in user')); } @@ -134,7 +140,7 @@ export default class Cortex extends EventEmitter { clientId, clientSecret, license, - debit + debit, }).then(({ cortexToken }) => { this._log('init: Got auth token'); this._debug('init: Auth token', cortexToken); @@ -145,12 +151,14 @@ export default class Cortex extends EventEmitter { return token; } + close() { - return new Promise(resolve => { + return new Promise((resolve) => { this.ws.close(); this.ws.once('close', resolve); }); } + call(method, params = {}) { const id = this.msgId++; const msg = JSON.stringify({ jsonrpc: '2.0', method, params, id }); @@ -168,16 +176,19 @@ export default class Cortex extends EventEmitter { }; }); } + defineMethod(methodName, paramDefs = []) { if (this[methodName]) return; - const needsAuth = paramDefs.some(p => p.name === 'cortexToken'); - const requiredParams = paramDefs.filter(p => p.required).map(p => p.name); + const needsAuth = paramDefs.some((p) => p.name === 'cortexToken'); + const requiredParams = paramDefs + .filter((p) => p.required) + .map((p) => p.name); this[methodName] = (params = {}) => { if (needsAuth && this.cortexToken && !params.cortexToken) { params = { ...params, cortexToken: this.cortexToken }; } - const missingParams = requiredParams.filter(p => params[p] == null); + const missingParams = requiredParams.filter((p) => params[p] == null); if (missingParams.length > 0) { return this.handleError( new Error( diff --git a/app/utils/eeg/emotiv.ts b/app/utils/eeg/emotiv.ts index 01028528..a435631d 100644 --- a/app/utils/eeg/emotiv.ts +++ b/app/utils/eeg/emotiv.ts @@ -30,7 +30,7 @@ export const getEmotiv = async () => { return devices; }; -export const connectToEmotiv = async device => { +export const connectToEmotiv = async (device) => { await client.ready; // Authenticate @@ -39,7 +39,7 @@ export const connectToEmotiv = async device => { clientId: CLIENT_ID, clientSecret: CLIENT_SECRET, license: LICENSE_ID, - debit: 1 + debit: 1, }); } catch (err) { toast.error(`Authentication failed. ${err.message}`); @@ -56,14 +56,14 @@ export const connectToEmotiv = async device => { try { const newSession = await client.createSession({ status: 'active', - headset: device.id + headset: device.id, }); session = newSession; return { name: session.headset.id, samplingRate: session.headset.settings.eegRate, - channels: EMOTIV_CHANNELS + channels: EMOTIV_CHANNELS, }; } catch (err) { toast.error(`Session creation failed. ${err.message} `); @@ -74,7 +74,7 @@ export const disconnectFromEmotiv = async () => { console.log('disconnecting form emotiv'); const sessionStatus = await client.updateSession({ session: session.id, - status: 'close' + status: 'close', }); return sessionStatus; }; @@ -87,7 +87,7 @@ export const createRawEmotivObservable = async () => { try { await client.subscribe({ session: session.id, - streams: ['eeg', 'dev'] + streams: ['eeg', 'dev'], }); } catch (err) { toast.error(`EEG connection failed. ${err.message}`); @@ -98,7 +98,7 @@ export const createRawEmotivObservable = async () => { }; // Creates an observable that will epoch, filter, and add signal quality to EEG stream -export const createEmotivSignalQualityObservable = rawObservable => { +export const createEmotivSignalQualityObservable = (rawObservable) => { // @ts-ignore const signalQualityObservable = fromEvent(client, 'dev'); const samplingRate = 128; @@ -107,16 +107,16 @@ export const createEmotivSignalQualityObservable = rawObservable => { return rawObservable.pipe( addInfo({ samplingRate, - channels + channels, }), epoch({ duration: intervalSamples, - interval: intervalSamples + interval: intervalSamples, }), bandpassFilter({ nbChannels: channels.length, lowCutoff: 1, - highCutoff: 50 + highCutoff: 50, }), withLatestFrom(signalQualityObservable, integrateSignalQuality), parseEmotivSignalQuality(), @@ -131,7 +131,7 @@ export const injectEmotivMarker = (value, time) => { export const createEmotivRecord = (subjectName, sessionNumber) => { client.createRecord({ session: session.id, - title: `${subjectName}_${sessionNumber}` + title: `${subjectName}_${sessionNumber}`, }); }; @@ -146,7 +146,7 @@ export const stopEmotivRecord = () => { // 14 EEG channels in data // timestamp in ms // Event marker in marker if present -const createEEGSample = eegEvent => { +const createEEGSample = (eegEvent) => { const prunedArray = new Array(EMOTIV_CHANNELS.length); for (let i = 0; i < EMOTIV_CHANNELS.length; i++) { prunedArray[i] = eegEvent.eeg[i + 2]; @@ -165,7 +165,7 @@ const integrateSignalQuality = (newEpoch, devSample) => ({ ...newEpoch, signalQuality: { ...devSample.dev[2].map((signalQuality, index) => ({ - [EMOTIV_CHANNELS[index]]: signalQuality - })) - } + [EMOTIV_CHANNELS[index]]: signalQuality, + })), + }, }); diff --git a/app/utils/eeg/muse.ts b/app/utils/eeg/muse.ts index dfc2bd4a..6240f532 100644 --- a/app/utils/eeg/muse.ts +++ b/app/utils/eeg/muse.ts @@ -4,7 +4,7 @@ import { addInfo, epoch, bandpassFilter, - addSignalQuality + addSignalQuality, } from '@neurosity/pipes'; import { release } from 'os'; import { MUSE_SERVICE, MuseClient, zipSamples } from 'muse-js'; @@ -13,7 +13,7 @@ import { parseMuseSignalQuality } from './pipes'; import { MUSE_SAMPLING_RATE, MUSE_CHANNELS, - PLOTTING_INTERVAL + PLOTTING_INTERVAL, } from '../../constants/constants'; const INTER_SAMPLE_INTERVAL = -(1 / 256) * 1000; @@ -41,18 +41,18 @@ export const getMuse = async () => { } // @ts-ignore device = await bluetooth.requestDevice({ - filters: [{ services: [MUSE_SERVICE] }] + filters: [{ services: [MUSE_SERVICE] }], }); } else { device = await navigator.bluetooth.requestDevice({ - filters: [{ services: [MUSE_SERVICE] }] + filters: [{ services: [MUSE_SERVICE] }], }); } return [device]; }; // Attempts to connect to a muse device. If successful, returns a device info object -export const connectToMuse = async device => { +export const connectToMuse = async (device) => { if (process.platform === 'win32') { const gatt = await device.gatt.connect(); await client.connect(gatt); @@ -62,7 +62,7 @@ export const connectToMuse = async device => { return { name: client.deviceName, samplingRate: MUSE_SAMPLING_RATE, - channels: MUSE_CHANNELS + channels: MUSE_CHANNELS, }; }; @@ -74,7 +74,7 @@ export const createRawMuseObservable = async () => { const eegStream = await client.eegReadings; const markers = await client.eventMarkers.pipe(startWith({ timestamp: 0 })); return from(zipSamples(eegStream)).pipe( - filter(sample => !sample.data.includes(NaN)), + filter((sample) => !sample.data.includes(NaN)), withLatestFrom(markers, synchronizeTimestamp), share() ); @@ -90,16 +90,16 @@ export const createMuseSignalQualityObservable = ( return rawObservable.pipe( addInfo({ samplingRate, - channelNames + channelNames, }), epoch({ duration: intervalSamples, - interval: intervalSamples + interval: intervalSamples, }), bandpassFilter({ nbChannels: channelNames.length, lowCutoff: 1, - highCutoff: 50 + highCutoff: 50, }), addSignalQuality(), parseMuseSignalQuality() @@ -116,10 +116,10 @@ export const injectMuseMarker = (value, time) => { const synchronizeTimestamp = (eegSample, marker) => { if ( - eegSample['timestamp'] - marker['timestamp'] < 0 && - eegSample['timestamp'] - marker['timestamp'] >= INTER_SAMPLE_INTERVAL + eegSample.timestamp - marker.timestamp < 0 && + eegSample.timestamp - marker.timestamp >= INTER_SAMPLE_INTERVAL ) { - return { ...eegSample, marker: marker['value'] }; + return { ...eegSample, marker: marker.value }; } return eegSample; }; diff --git a/app/utils/eeg/pipes.ts b/app/utils/eeg/pipes.ts index 3aa77ef4..480d1115 100644 --- a/app/utils/eeg/pipes.ts +++ b/app/utils/eeg/pipes.ts @@ -2,12 +2,12 @@ import { pipe } from 'rxjs'; import { map } from 'rxjs/operators'; import { SIGNAL_QUALITY, - SIGNAL_QUALITY_THRESHOLDS + SIGNAL_QUALITY_THRESHOLDS, } from '../../constants/constants'; export const parseMuseSignalQuality = () => pipe( - map(epoch => ({ + map((epoch) => ({ ...epoch, signalQuality: object.assign( {}, @@ -25,13 +25,13 @@ export const parseMuseSignalQuality = () => return { [channelName]: SIGNAL_QUALITY.DISCONNECTED }; } ) - ) + ), })) ); export const parseEmotivSignalQuality = () => pipe( - map(epoch => ({ + map((epoch) => ({ ...epoch, signalQuality: object.assign( {}, @@ -49,6 +49,6 @@ export const parseEmotivSignalQuality = () => return { [channelName]: SIGNAL_QUALITY.BAD }; } ) - ) + ), })) ); diff --git a/app/utils/filesystem/dialog.ts b/app/utils/filesystem/dialog.ts index 76889ae6..0005c141 100644 --- a/app/utils/filesystem/dialog.ts +++ b/app/utils/filesystem/dialog.ts @@ -17,13 +17,13 @@ export const loadDialog = (event, arg) => { } }; -const selectTimeline = event => { +const selectTimeline = (event) => { dialog.showOpenDialog( { title: 'Select a jsPsych timeline file', - properties: ['openFile', 'promptToCreate'] + properties: ['openFile', 'promptToCreate'], }, - filePaths => { + (filePaths) => { if (filePaths) { event.sender.send('loadDialogReply', filePaths[0]); } @@ -31,13 +31,13 @@ const selectTimeline = event => { ); }; -const selectStimulusFolder = event => { +const selectStimulusFolder = (event) => { dialog.showOpenDialog( { title: 'Select a folder of images', - properties: ['openDirectory'] + properties: ['openDirectory'], }, - dir => { + (dir) => { if (dir) { event.sender.send('loadDialogReply', dir[0]); } else { diff --git a/app/utils/filesystem/select.ts b/app/utils/filesystem/select.ts index 6a1f0b88..2d4dbcf9 100644 --- a/app/utils/filesystem/select.ts +++ b/app/utils/filesystem/select.ts @@ -6,7 +6,7 @@ import { ipcRenderer } from 'electron'; import { FILE_TYPES } from '../../constants/constants'; export const loadFromSystemDialog = (fileType: FILE_TYPES) => - new Promise(resolve => { + new Promise((resolve) => { ipcRenderer.send('loadDialog', fileType); ipcRenderer.on('loadDialogReply', (_, result) => { resolve(result); diff --git a/app/utils/filesystem/storage.ts b/app/utils/filesystem/storage.ts index e0ecec01..0a4afa0e 100644 --- a/app/utils/filesystem/storage.ts +++ b/app/utils/filesystem/storage.ts @@ -52,7 +52,7 @@ export const restoreExperimentState = (state: ExperimentStateType) => { ...state, subject: '', group: '', - session: 1 + session: 1, }; if (!timestampedState.title) { return; @@ -74,7 +74,7 @@ export const storeBehaviouralData = ( const dir = path.join(getWorkspaceDir(title), 'Data', subject, 'Behavior'); const filename = `${subject}-${group}-${session}-behavior.csv`; mkdirPathSync(dir); - fs.writeFile(path.join(dir, filename), csv, err => { + fs.writeFile(path.join(dir, filename), csv, (err) => { if (err) { console.error(err); } @@ -90,7 +90,7 @@ export const storeJupyterImage = ( const dir = path.join(getWorkspaceDir(title), 'Results', 'Images'); const filename = `${imageTitle}.png`; mkdirPathSync(dir); - fs.writeFile(path.join(dir, filename), rawData, err => { + fs.writeFile(path.join(dir, filename), rawData, (err) => { if (err) { console.error(err); } @@ -105,7 +105,7 @@ export const readWorkspaces = () => { try { return fs .readdirSync(workspaces) - .filter(workspace => workspace !== '.DS_Store'); + .filter((workspace) => workspace !== '.DS_Store'); } catch (e) { if (e.code === 'ENOENT') { mkdirPathSync(workspaces); @@ -120,10 +120,10 @@ export const readWorkspaceRawEEGData = async (title: string) => { try { const files = await recursive(getWorkspaceDir(title)); const rawFiles = files - .filter(filepath => filepath.slice(-7).includes('raw.csv')) - .map(filepath => ({ + .filter((filepath) => filepath.slice(-7).includes('raw.csv')) + .map((filepath) => ({ name: path.basename(filepath), - path: filepath + path: filepath, })); return rawFiles; } catch (e) { @@ -139,10 +139,10 @@ export const readWorkspaceCleanedEEGData = async (title: string) => { try { const files = await recursive(getWorkspaceDir(title)); return files - .filter(filepath => filepath.slice(-7).includes('epo.fif')) - .map(filepath => ({ + .filter((filepath) => filepath.slice(-7).includes('epo.fif')) + .map((filepath) => ({ name: path.basename(filepath), - path: filepath + path: filepath, })); } catch (e) { console.log(e); @@ -155,10 +155,10 @@ export const readWorkspaceBehaviorData = async (title: string) => { try { const files = await recursive(getWorkspaceDir(title)); const behaviorFiles = files - .filter(filepath => filepath.slice(-12).includes('behavior.csv')) - .map(filepath => ({ + .filter((filepath) => filepath.slice(-12).includes('behavior.csv')) + .map((filepath) => ({ name: path.basename(filepath), - path: filepath + path: filepath, })); return behaviorFiles; } catch (e) { @@ -174,7 +174,7 @@ export const readAndParseState = (dir: string) => { try { return JSON.parse( fs.readFileSync(path.join(workspaces, dir, 'appState.json'), { - encoding: 'string' + encoding: 'string', }) ); } catch (e) { @@ -187,7 +187,7 @@ export const readAndParseState = (dir: string) => { // Reads a list of images that are in a directory export const readImages = (dir: string) => - fs.readdirSync(dir).filter(filename => { + fs.readdirSync(dir).filter((filename) => { const extension = filename.slice(-3).toLowerCase(); return ( extension === 'png' || @@ -201,30 +201,30 @@ export const readImages = (dir: string) => export const getImages = (params: ExperimentParameters) => fs .readdirSync(params.stimulus1.dir) - .map(filename => path.join(params.stimulus1.dir, filename)) + .map((filename) => path.join(params.stimulus1.dir, filename)) .concat( fs .readdirSync(params.stimulus2.dir) - .map(filename => path.join(params.stimulus2.dir, filename)) + .map((filename) => path.join(params.stimulus2.dir, filename)) ); // ----------------------------------------------------------------------------------------------- // Util // Creates a directory path if it doesn't exist -export const mkdirPathSync = dirPath => { +export const mkdirPathSync = (dirPath) => { mkdirp.sync(dirPath); }; export const getSubjectNamesFromFiles = (filePaths: Array) => filePaths - .map(filePath => path.basename(filePath)) - .map(fileName => fileName.substring(0, fileName.indexOf('-'))); + .map((filePath) => path.basename(filePath)) + .map((fileName) => fileName.substring(0, fileName.indexOf('-'))); // Read CSV files with behavioral data and return an object export const readBehaviorData = (files: Array) => { try { - return files.map(file => { + return files.map((file) => { const csv = fs.readFileSync(file, 'utf-8'); const obj = convertCSVToObject(csv); obj.meta.datafile = file; @@ -244,20 +244,20 @@ export const storeAggregatedBehaviorData = (data, title) => { const saveFileOnDisk = (data, title) => { dialog.showSaveDialog({ title: 'Select a folder to save the data', - defaultPath: path.join(getWorkspaceDir(title), 'Data', `aggregated.csv`) + defaultPath: path.join(getWorkspaceDir(title), 'Data', `aggregated.csv`), }); }; // convert a csv file to an object with Papaparse -const convertCSVToObject = csv => { +const convertCSVToObject = (csv) => { const data = Papa.parse(csv, { - header: true + header: true, }); return data; }; // convert an object to a csv file with Papaparse -const convertObjectToSCV = data => { +const convertObjectToSCV = (data) => { const csv = Papa.unparse(data); return csv; }; diff --git a/app/utils/filesystem/write.ts b/app/utils/filesystem/write.ts index a9f28f6b..5557175e 100644 --- a/app/utils/filesystem/write.ts +++ b/app/utils/filesystem/write.ts @@ -47,7 +47,7 @@ export const writeEEGData = (writeStream: fs.WriteStream, eegData: EEGData) => { writeStream.write(`${eegData.data[i].toString()},`); // Round data } if (has(eegData, 'marker')) { - writeStream.write(`${eegData['marker']}\n`); + writeStream.write(`${eegData.marker}\n`); } else { writeStream.write(`0\n`); } diff --git a/app/utils/jupyter/functions.ts b/app/utils/jupyter/functions.ts index d6931f0c..d435f623 100644 --- a/app/utils/jupyter/functions.ts +++ b/app/utils/jupyter/functions.ts @@ -4,7 +4,7 @@ export const parseSingleQuoteJSON = (string: string) => JSON.parse(string.replace(/'/g, '"')); export const parseKernelStatus = (msg: object) => { - switch (msg['content']['execution_state']) { + switch (msg.content.execution_state) { case 'busy': return KERNEL_STATUS.BUSY; case 'idle': diff --git a/app/utils/jupyter/pipes.ts b/app/utils/jupyter/pipes.ts index 49b41a86..e74cf285 100644 --- a/app/utils/jupyter/pipes.ts +++ b/app/utils/jupyter/pipes.ts @@ -9,13 +9,13 @@ export const execute = (command, state$) => map(() => state$.value.jupyter.mainChannel.next(executeRequest(command))) ); -export const awaitOkMessage = action$ => +export const awaitOkMessage = (action$) => pipe( mergeMap(() => action$.ofType(JupyterActions.ReceiveExecuteReply.type).pipe( pluck('payload'), filter( - msg => msg.channel === 'shell' && msg.content.status === 'ok' + (msg) => msg.channel === 'shell' && msg.content.status === 'ok' ), take(1) ) diff --git a/app/utils/labjs/index.tsx b/app/utils/labjs/index.tsx index 8cd4a510..607ceaa9 100644 --- a/app/utils/labjs/index.tsx +++ b/app/utils/labjs/index.tsx @@ -32,11 +32,11 @@ class ExperimentWindow extends Component<{ settings: ExperimentSettings }> { faceshouses.parameters = props.settings.params; faceshouses.parameters.title = props.settings.title; faceshouses.files = props.settings.params.stimuli - .map(image => ({ + .map((image) => ({ [path.join(image.dir, image.filename)]: path.join( image.dir, image.filename - ) + ), })) .reduce((obj, item) => { // return { ...obj, item }; ?? @@ -50,11 +50,11 @@ class ExperimentWindow extends Component<{ settings: ExperimentSettings }> { custom.parameters = props.settings.params; custom.parameters.title = props.settings.title; custom.files = props.settings.params.stimuli - .map(image => ({ + .map((image) => ({ [path.join(image.dir, image.filename)]: path.join( image.dir, image.filename - ) + ), })) .reduce((obj, item) => { // return { ...obj, item }; ?? @@ -70,10 +70,10 @@ class ExperimentWindow extends Component<{ settings: ExperimentSettings }> { this.study = undefined; props.settings.on_finish(csv); }); - this.study.parameters.callbackForEEG = e => { + this.study.parameters.callbackForEEG = (e) => { props.settings.eventCallback(e, new Date().getTime()); }; - this.study.options.events['keydown'] = async e => { + this.study.options.events.keydown = async (e) => { if (e.code === 'Escape') { if (this.study) { await this.study.internals.controller.audioContext.close(); diff --git a/app/utils/labjs/protocols/custom.ts b/app/utils/labjs/protocols/custom.ts index fe031555..57ee1a84 100644 --- a/app/utils/labjs/protocols/custom.ts +++ b/app/utils/labjs/protocols/custom.ts @@ -34,8 +34,8 @@ export const buildCustomTimeline = () => ({ { name: 'Link 1', address: - 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn' - } + 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn', + }, ], protocal_links: [], params: { @@ -57,42 +57,42 @@ export const buildCustomTimeline = () => ({ dir: '', title: 'Condition 1', type: EVENTS.STIMULUS_1, - response: '' + response: '', }, stimulus2: { dir: '', title: 'Condition 2', type: EVENTS.STIMULUS_2, - response: '' + response: '', }, stimulus3: { dir: '', title: '', type: 3, - response: '' + response: '', }, stimulus4: { dir: '', title: '', type: 4, - response: '' + response: '', }, - stimuli: [] + stimuli: [], }, mainTimeline: ['intro', 'faceHouseTimeline', 'end'], // array of trial and timeline ids trials: { intro: { type: 'callback-html-display', id: 'intro', - post_trial_gap: 1000 + post_trial_gap: 1000, }, end: { id: 'end', type: 'callback-html-display', stimulus: 'Thanks for participating. Press any key to continue', response_ends_trial: true, - post_trial_gap: 500 - } + post_trial_gap: 500, + }, }, timelines: { faceHouseTimeline: { @@ -102,13 +102,13 @@ export const buildCustomTimeline = () => ({ id: 'interTrial', type: 'callback-image-display', stimulus: fixation, - response_ends_trial: false + response_ends_trial: false, }, { id: 'trial', - response_ends_trial: false - } - ] - } - } + response_ends_trial: false, + }, + ], + }, + }, }); diff --git a/app/utils/labjs/protocols/faceshouses.ts b/app/utils/labjs/protocols/faceshouses.ts index 66f610e3..9829caff 100644 --- a/app/utils/labjs/protocols/faceshouses.ts +++ b/app/utils/labjs/protocols/faceshouses.ts @@ -68,15 +68,15 @@ const stimuli = [ 'House27', 'House28', 'House29', - 'House30' -].map(s => ({ + 'House30', +].map((s) => ({ condition: s.startsWith('Face') ? 'Face' : 'House', dir: s.startsWith('Face') ? facesDir : housesDir, filename: `${s}.jpg`, name: s, response: s.startsWith('Face') ? '1' : '9', phase: 'main', - type: s.startsWith('Face') ? EVENTS.STIMULUS_1 : EVENTS.STIMULUS_2 + type: s.startsWith('Face') ? EVENTS.STIMULUS_1 : EVENTS.STIMULUS_2, })); // phase: ['Face1', 'House1'].includes(s) ? 'practice' : 'main', @@ -109,8 +109,8 @@ export const buildN170Timeline = () => ({ { name: 'Link 1', address: - 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn' - } + 'https://www.cnn.com/videos/health/2011/01/04/sacks.face.blindness.cnn', + }, ], protocal_links: [], params: { @@ -132,42 +132,42 @@ export const buildN170Timeline = () => ({ dir: facesDir, title: 'Face', type: EVENTS.STIMULUS_1, - response: '1' + response: '1', }, stimulus2: { dir: housesDir, title: 'House', type: EVENTS.STIMULUS_2, - response: '9' + response: '9', }, stimulus3: { dir: '', title: '', type: 3, - response: '' + response: '', }, stimulus4: { dir: '', title: '', type: 4, - response: '' + response: '', }, - stimuli + stimuli, }, mainTimeline: ['intro', 'faceHouseTimeline', 'end'], // array of trial and timeline ids trials: { intro: { type: 'callback-html-display', id: 'intro', - post_trial_gap: 1000 + post_trial_gap: 1000, }, end: { id: 'end', type: 'callback-html-display', stimulus: 'Thanks for participating. Press any key to continue', response_ends_trial: true, - post_trial_gap: 500 - } + post_trial_gap: 500, + }, }, timelines: { faceHouseTimeline: { @@ -177,13 +177,13 @@ export const buildN170Timeline = () => ({ id: 'interTrial', type: 'callback-image-display', stimulus: fixation, - response_ends_trial: false + response_ends_trial: false, }, { id: 'trial', - response_ends_trial: false - } - ] - } - } + response_ends_trial: false, + }, + ], + }, + }, }); diff --git a/app/utils/labjs/protocols/multi.ts b/app/utils/labjs/protocols/multi.ts index 47b323da..2090a1ef 100644 --- a/app/utils/labjs/protocols/multi.ts +++ b/app/utils/labjs/protocols/multi.ts @@ -35,13 +35,13 @@ export const buildMultiTimeline = () => ({ { name: 'Link 1', address: - 'https://www.scientificamerican.com/podcast/episode/the-myth-of-multitasking-09-07-15/' + 'https://www.scientificamerican.com/podcast/episode/the-myth-of-multitasking-09-07-15/', }, { name: 'Link 2', address: - 'https://www.scientificamerican.com/article/multitasking-two-tasks/' - } + 'https://www.scientificamerican.com/article/multitasking-two-tasks/', + }, ], protocal_links: [], params: { @@ -56,29 +56,29 @@ export const buildMultiTimeline = () => ({ dir: facesDir, title: 'No switching', type: EVENTS.STIMULUS_1, - response: '1' + response: '1', }, stimulus2: { dir: housesDir, title: 'Switching', type: EVENTS.STIMULUS_2, - response: '9' - } + response: '9', + }, }, mainTimeline: ['intro', 'multiTaskingTimeline', 'end'], // array of trial and timeline ids trials: { intro: { type: 'callback-html-display', id: 'intro', - post_trial_gap: 1000 + post_trial_gap: 1000, }, end: { id: 'end', type: 'callback-html-display', stimulus: 'Thanks for participating. Press any key to continue', response_ends_trial: true, - post_trial_gap: 500 - } + post_trial_gap: 500, + }, }, timelines: { faceHouseTimeline: { @@ -88,13 +88,13 @@ export const buildMultiTimeline = () => ({ id: 'interTrial', type: 'callback-image-display', stimulus: fixation, - response_ends_trial: false + response_ends_trial: false, }, { id: 'trial', - response_ends_trial: false - } - ] - } - } + response_ends_trial: false, + }, + ], + }, + }, }); diff --git a/app/utils/labjs/protocols/search.ts b/app/utils/labjs/protocols/search.ts index eb3af316..710d5d43 100644 --- a/app/utils/labjs/protocols/search.ts +++ b/app/utils/labjs/protocols/search.ts @@ -48,29 +48,29 @@ export const buildSearchTimeline = () => ({ dir: facesDir, title: '5 and 10 letters', type: EVENTS.STIMULUS_1, - response: '1' + response: '1', }, stimulus2: { dir: housesDir, title: '15 and 20 letters', type: EVENTS.STIMULUS_2, - response: '9' - } + response: '9', + }, }, mainTimeline: ['intro', 'visualSearchTimeline', 'end'], // array of trial and timeline ids trials: { intro: { type: 'callback-html-display', id: 'intro', - post_trial_gap: 1000 + post_trial_gap: 1000, }, end: { id: 'end', type: 'callback-html-display', stimulus: 'Thanks for participating. Press any key to continue', response_ends_trial: true, - post_trial_gap: 500 - } + post_trial_gap: 500, + }, }, timelines: { faceHouseTimeline: { @@ -80,13 +80,13 @@ export const buildSearchTimeline = () => ({ id: 'interTrial', type: 'callback-image-display', stimulus: fixation, - response_ends_trial: false + response_ends_trial: false, }, { id: 'trial', - response_ends_trial: false - } - ] - } - } + response_ends_trial: false, + }, + ], + }, + }, }); diff --git a/app/utils/labjs/protocols/stroop.ts b/app/utils/labjs/protocols/stroop.ts index 36117c90..a0173931 100644 --- a/app/utils/labjs/protocols/stroop.ts +++ b/app/utils/labjs/protocols/stroop.ts @@ -38,8 +38,8 @@ export const buildStroopTimeline = () => ({ { name: 'Link 1', address: - 'https://www.psychologytoday.com/us/blog/play-in-mind/201204/when-red-looks-blue-and-yes-means-no' - } + 'https://www.psychologytoday.com/us/blog/play-in-mind/201204/when-red-looks-blue-and-yes-means-no', + }, ], protocal_links: [], params: { @@ -54,29 +54,29 @@ export const buildStroopTimeline = () => ({ dir: facesDir, title: 'Incongruent', type: EVENTS.STIMULUS_1, - response: '1' + response: '1', }, stimulus2: { dir: housesDir, title: 'Congruent', type: EVENTS.STIMULUS_2, - response: '9' - } + response: '9', + }, }, mainTimeline: ['intro', 'stroopTimeline', 'end'], // array of trial and timeline ids trials: { intro: { type: 'callback-html-display', id: 'intro', - post_trial_gap: 1000 + post_trial_gap: 1000, }, end: { id: 'end', type: 'callback-html-display', stimulus: 'Thanks for participating. Press any key to continue', response_ends_trial: true, - post_trial_gap: 500 - } + post_trial_gap: 500, + }, }, timelines: { faceHouseTimeline: { @@ -86,13 +86,13 @@ export const buildStroopTimeline = () => ({ id: 'interTrial', type: 'callback-image-display', stimulus: fixation, - response_ends_trial: false + response_ends_trial: false, }, { id: 'trial', - response_ends_trial: false - } - ] - } - } + response_ends_trial: false, + }, + ], + }, + }, }); From 11d7eb20e7cdceef5e4e29e911e446c3c7dec375 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Sun, 9 Aug 2020 16:06:19 -0400 Subject: [PATCH 45/66] Updated eslint and some configs --- .eslintrc.js | 6 ++++-- package.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 4de8f0a9..55a2b6e7 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,7 +1,9 @@ module.exports = { extends: 'erb/typescript', rules: { - // A temporary hack related to IDE not resolving correct package.json + '@typescript-eslint/ban-ts-comment': 'warn', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/naming-convention': 'off', 'consistent-return': 'warn', 'dot-notation': 'off', 'import/no-extraneous-dependencies': 'off', @@ -21,11 +23,11 @@ module.exports = { 'react/jsx-props-no-spreading': 'off', 'react/jsx-wrap-multilines': 'off', 'react/no-access-state-in-setstate': 'warn', + 'react/no-array-index-key': 'off', 'react/no-did-update-set-state': 'warn', 'react/no-will-update-set-state': 'warn', 'react/prop-types': 'off', 'react/static-property-placement': 'off', - 'react/no-array-index-key': 'off', }, parserOptions: { ecmaVersion: 2020, diff --git a/package.json b/package.json index bc4450e5..7cec115c 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "dev": "cross-env START_HOT=1 node -r @babel/register ./internals/scripts/CheckPortInUse.js && cross-env START_HOT=1 yarn start-renderer-dev", "electron-rebuild": "electron-rebuild --parallel --force --types prod,dev,optional --module-dir app", "lint": "cross-env NODE_ENV=development eslint . --cache --ext .js,.jsx,.ts,.tsx", - "lint-fix": "yarn --silent lint --fix; exit 0", + "lint-fix": "yarn --silent lint --fix", "lint-styles": "stylelint --ignore-path .eslintignore '**/*.*(css|scss)' --syntax scss", "lint-styles-fix": "yarn --silent lint-styles --fix; exit 0", "package": "yarn build && electron-builder build --publish never", From e83d424b5c37b0a9607a7e311697d1d2a64a38c1 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Fri, 14 Aug 2020 14:41:54 -0400 Subject: [PATCH 46/66] Fixed errors with brittle file reading of previous experiments --- app/components/HomeComponent/index.tsx | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/components/HomeComponent/index.tsx b/app/components/HomeComponent/index.tsx index 5f2ca179..54278a52 100644 --- a/app/components/HomeComponent/index.tsx +++ b/app/components/HomeComponent/index.tsx @@ -52,7 +52,7 @@ interface Props { kernelStatus: KERNEL_STATUS; history: HashHistory; JupyterActions: typeof JupyterActions; - connectedDevice: object; + connectedDevice: Record; signalQualityObservable: any | null | undefined; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; @@ -72,10 +72,6 @@ interface State { } export default class Home extends Component { - // handleLoadCustomExperiment: (string) => void; - // handleOpenOverview: (EXPERIMENTS) => void; - // handleCloseOverview: () => void; - // handleDeleteWorkspace: (string) => void; constructor(props: Props) { super(props); this.state = { @@ -203,16 +199,20 @@ export default class Home extends Component { {this.state.recentWorkspaces .sort((a, b) => { - const aTime = - readAndParseState(a).params.dateModified || 0; - const bTime = - readAndParseState(b).params.dateModified || 0; + const aState = readAndParseState(a); + const bState = readAndParseState(b); + + const aTime = aState?.params?.dateModified || 0; + const bTime = bState?.params?.dateModified || 0; + return bTime - aTime; }) .map((dir) => { - const { - params: { dateModified }, - } = readAndParseState(dir); + const workspaceState = readAndParseState(dir); + if (!workspaceState) { + return undefined; + } + const dateModified = workspaceState.params?.dateModified; return ( From f83cf40be9281fc71f07ed6fbcc68e564dcd8e8b Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Fri, 14 Aug 2020 15:30:59 -0400 Subject: [PATCH 47/66] Cleaning things up; Removing jspsych references; unmounted epics --- OVERVIEW.md | 0 app/components/CollectComponent/RunComponent.tsx | 11 ++--------- app/components/CollectComponent/index.tsx | 3 --- .../DesignComponent/CustomDesignComponent.tsx | 2 -- app/components/PreviewExperimentComponent.tsx | 7 +------ app/components/TopNavComponent/index.tsx | 12 +++++++++++- app/constants/interfaces.ts | 6 ++---- app/epics/index.ts | 2 +- app/epics/jupyterEpics.ts | 4 ++-- app/utils/filesystem/storage.ts | 2 +- app/utils/labjs/index.tsx | 6 +++++- app/utils/labjs/protocols/stroop.ts | 1 - 12 files changed, 25 insertions(+), 31 deletions(-) delete mode 100644 OVERVIEW.md diff --git a/OVERVIEW.md b/OVERVIEW.md deleted file mode 100644 index e69de29b..00000000 diff --git a/app/components/CollectComponent/RunComponent.tsx b/app/components/CollectComponent/RunComponent.tsx index 9f8f4ab5..b1728138 100644 --- a/app/components/CollectComponent/RunComponent.tsx +++ b/app/components/CollectComponent/RunComponent.tsx @@ -9,11 +9,7 @@ import { injectMuseMarker } from '../../utils/eeg/muse'; import { EXPERIMENTS, DEVICES } from '../../constants/constants'; import { ExperimentWindow } from '../../utils/labjs'; import { checkFileExists, getImages } from '../../utils/filesystem/storage'; -import { - MainTimeline, - Trial, - ExperimentParameters, -} from '../../constants/interfaces'; +import { Trial, ExperimentParameters } from '../../constants/interfaces'; import { ExperimentActions } from '../../actions'; const { dialog } = remote; @@ -23,7 +19,6 @@ interface Props { title: string; isRunning: boolean; params: ExperimentParameters; - mainTimeline: MainTimeline; trials: { [key: string]: Trial; }; @@ -56,9 +51,7 @@ export default class Run extends Component { } componentDidMount() { - if (this.props.mainTimeline.length <= 0) { - this.props.ExperimentActions.LoadDefaultTimeline(); - } + this.props.ExperimentActions.LoadDefaultTimeline(); } async handleStartExperiment() { diff --git a/app/components/CollectComponent/index.tsx b/app/components/CollectComponent/index.tsx index cef26966..0377c198 100644 --- a/app/components/CollectComponent/index.tsx +++ b/app/components/CollectComponent/index.tsx @@ -8,7 +8,6 @@ import { DEVICE_AVAILABILITY, } from '../../constants/constants'; import { - MainTimeline, Trial, ExperimentParameters, SignalQualityData, @@ -32,7 +31,6 @@ export interface Props { isRunning: boolean; params: ExperimentParameters; paradigm: EXPERIMENTS; - mainTimeline: MainTimeline; trials: { [key: string]: Trial; }; @@ -136,7 +134,6 @@ export default class Collect extends Component { paradigm={this.props.paradigm} isRunning={this.props.isRunning} params={this.props.params} - mainTimeline={this.props.mainTimeline} trials={this.props.trials} timelines={this.props.timelines} subject={this.props.subject} diff --git a/app/components/DesignComponent/CustomDesignComponent.tsx b/app/components/DesignComponent/CustomDesignComponent.tsx index 4bbd1ffb..b371fd2b 100644 --- a/app/components/DesignComponent/CustomDesignComponent.tsx +++ b/app/components/DesignComponent/CustomDesignComponent.tsx @@ -15,7 +15,6 @@ import { HashHistory } from 'history'; import styles from '../styles/common.css'; import { EXPERIMENTS, SCREENS } from '../../constants/constants'; import { - MainTimeline, Trial, ExperimentParameters, ExperimentDescription, @@ -56,7 +55,6 @@ interface Props { type: EXPERIMENTS | null | undefined; title: string; params: ExperimentParameters; - mainTimeline: MainTimeline; trials: { [key: string]: Trial; }; diff --git a/app/components/PreviewExperimentComponent.tsx b/app/components/PreviewExperimentComponent.tsx index 9cb24d28..365e2b92 100644 --- a/app/components/PreviewExperimentComponent.tsx +++ b/app/components/PreviewExperimentComponent.tsx @@ -4,11 +4,7 @@ import { ExperimentWindow } from '../utils/labjs'; import styles from './styles/collect.css'; import { getImages } from '../utils/filesystem/storage'; -import { - MainTimeline, - Trial, - ExperimentParameters, -} from '../constants/interfaces'; +import { Trial, ExperimentParameters } from '../constants/interfaces'; interface Props { title: string; @@ -16,7 +12,6 @@ interface Props { params: ExperimentParameters; previewParams?: ExperimentParameters; isPreviewing: boolean; - mainTimeline: MainTimeline; trials: { [key: string]: Trial; }; diff --git a/app/components/TopNavComponent/index.tsx b/app/components/TopNavComponent/index.tsx index 50cec124..9d9d7258 100644 --- a/app/components/TopNavComponent/index.tsx +++ b/app/components/TopNavComponent/index.tsx @@ -12,7 +12,7 @@ import { import BrainwavesIcon from '../../assets/common/Brainwaves_Icon_big.png'; import { ExperimentActions } from '../../actions'; -interface Props { +export interface Props { title: string | null | undefined; location: { pathname: string; search: string; hash: string }; isRunning: boolean; @@ -26,6 +26,16 @@ interface State { } export default class TopNavComponent extends Component { + constructor(props: Props) { + super(props); + this.state = { + recentWorkspaces: [], + }; + this.getStyleForScreen = this.getStyleForScreen.bind(this); + this.updateWorkspaces = this.updateWorkspaces.bind(this); + this.handleLoadRecentWorkspace = this.handleLoadRecentWorkspace.bind(this); + } + getStyleForScreen(navSegmentScreen: typeof SCREENS[keyof typeof SCREENS]) { if (navSegmentScreen.route === this.props.location.pathname) { return styles.activeNavColumn; diff --git a/app/constants/interfaces.ts b/app/constants/interfaces.ts index e0fd6d5d..c0d52a7b 100644 --- a/app/constants/interfaces.ts +++ b/app/constants/interfaces.ts @@ -1,5 +1,5 @@ /* - * This file contains all the custom types that we use for Flow type checking + * This file contains many of the TypeScript interfaces that are used across the project */ import { ChildProcess } from 'child_process'; @@ -7,9 +7,7 @@ import { EVENTS, SIGNAL_QUALITY } from './constants'; // TODO: Write interfaces for device objects (Observables, Classes, etc) -// ------------------------------------------------------------------ -// lab.js Experiment - +// All mutable aspects of an experiment that can be updated by the DesignComponent export type ExperimentParameters = { dateModified?: number; trialDuration: number; diff --git a/app/epics/index.ts b/app/epics/index.ts index 5153c1a3..649ecdd7 100644 --- a/app/epics/index.ts +++ b/app/epics/index.ts @@ -4,4 +4,4 @@ import device from './deviceEpics'; import experiment from './experimentEpics'; // TODO: Fix issue: https://github.com/piotrwitek/typesafe-actions/issues/174 -export default combineEpics(jupyter, device, experiment); +export default combineEpics(); diff --git a/app/epics/jupyterEpics.ts b/app/epics/jupyterEpics.ts index e8e97e8c..f97c27c4 100644 --- a/app/epics/jupyterEpics.ts +++ b/app/epics/jupyterEpics.ts @@ -113,9 +113,9 @@ const receiveChannelMessageEpic: Epic< > = (action$, state$) => action$.pipe( filter(isActionOf(JupyterActions.SetMainChannel)), - mergeMap<{}, ObservableInput>(() => + mergeMap, ObservableInput>(() => state$.value.jupyter.mainChannel.pipe( - map((msg) => { + map<{ header: { msg_type: string } }, JupyterActionType>((msg) => { console.log(debugParseMessage(msg)); switch (msg.header.msg_type) { case 'kernel_info_reply': diff --git a/app/utils/filesystem/storage.ts b/app/utils/filesystem/storage.ts index 0a4afa0e..4c2030eb 100644 --- a/app/utils/filesystem/storage.ts +++ b/app/utils/filesystem/storage.ts @@ -170,7 +170,7 @@ export const readWorkspaceBehaviorData = async (title: string) => { }; // Reads an experiment state tree from disk and parses it from JSON -export const readAndParseState = (dir: string) => { +export const readAndParseState = (dir: string): ExperimentStateType | null => { try { return JSON.parse( fs.readFileSync(path.join(workspaces, dir, 'appState.json'), { diff --git a/app/utils/labjs/index.tsx b/app/utils/labjs/index.tsx index 607ceaa9..d0e5d1f0 100644 --- a/app/utils/labjs/index.tsx +++ b/app/utils/labjs/index.tsx @@ -3,6 +3,8 @@ import path from 'path'; import clonedeep from 'lodash.clonedeep'; import * as lab from 'lab.js/dist/lab.dev'; import { ExperimentSettings } from '../../constants/interfaces'; + +// TODO: Switch to using .json files to load lab.js studies import visualsearch from './scripts/visualsearch'; import stroop from './scripts/stroop'; import multitasking from './scripts/multitasking'; @@ -64,7 +66,7 @@ class ExperimentWindow extends Component<{ settings: ExperimentSettings }> { this.study = lab.util.fromObject(clonedeep(custom), lab); break; } - this.study.run(); + this.study.on('end', () => { const csv = this.study.options.datastore.exportCsv(); this.study = undefined; @@ -81,6 +83,8 @@ class ExperimentWindow extends Component<{ settings: ExperimentSettings }> { } } }; + + this.study.run(); } componentWillUnmount() { diff --git a/app/utils/labjs/protocols/stroop.ts b/app/utils/labjs/protocols/stroop.ts index a0173931..30ddcb51 100644 --- a/app/utils/labjs/protocols/stroop.ts +++ b/app/utils/labjs/protocols/stroop.ts @@ -63,7 +63,6 @@ export const buildStroopTimeline = () => ({ response: '9', }, }, - mainTimeline: ['intro', 'stroopTimeline', 'end'], // array of trial and timeline ids trials: { intro: { type: 'callback-html-display', From 56e5b47105aa54bf73fab7ec68a6828233e51397 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Fri, 14 Aug 2020 16:28:09 -0400 Subject: [PATCH 48/66] Refactored ExperimentWindow --- .../CollectComponent/PreTestComponent.tsx | 20 +-- .../CollectComponent/RunComponent.tsx | 36 +++--- app/components/CollectComponent/index.tsx | 16 +-- app/components/ExperimentWindow.tsx | 119 ++++++++++++++++++ app/components/PreviewExperimentComponent.tsx | 26 ++-- app/constants/constants.ts | 2 +- app/reducers/experimentReducer.ts | 26 ++-- app/utils/labjs/index.tsx | 115 ----------------- 8 files changed, 166 insertions(+), 194 deletions(-) create mode 100644 app/components/ExperimentWindow.tsx delete mode 100644 app/utils/labjs/index.tsx diff --git a/app/components/CollectComponent/PreTestComponent.tsx b/app/components/CollectComponent/PreTestComponent.tsx index aafc0f56..d55f0957 100644 --- a/app/components/CollectComponent/PreTestComponent.tsx +++ b/app/components/CollectComponent/PreTestComponent.tsx @@ -23,15 +23,11 @@ import { PLOTTING_INTERVAL, CONNECTION_STATUS, } from '../../constants/constants'; -import { - ExperimentParameters, - MainTimeline, - Trial, -} from '../../constants/interfaces'; +import { ExperimentParameters, Trial } from '../../constants/interfaces'; interface Props { ExperimentActions: typeof ExperimentActions; - connectedDevice: object; + connectedDevice: Record; signalQualityObservable: any | null | undefined; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; @@ -39,14 +35,8 @@ interface Props { DeviceActions: typeof DeviceActions; availableDevices: Array; type: EXPERIMENTS; - paradigm: EXPERIMENTS; isRunning: boolean; params: ExperimentParameters; - mainTimeline: MainTimeline; - trials: { - [key: string]: Trial; - }; - timelines: {}; subject: string; group: string; session: number; @@ -60,9 +50,6 @@ interface State { } export default class PreTestComponent extends Component { - // state: State; - - // handlePreview: () => void; constructor(props: Props) { super(props); this.state = { @@ -106,11 +93,10 @@ export default class PreTestComponent extends Component { if (this.state.isPreviewing) { return ( diff --git a/app/components/CollectComponent/RunComponent.tsx b/app/components/CollectComponent/RunComponent.tsx index b1728138..34094a51 100644 --- a/app/components/CollectComponent/RunComponent.tsx +++ b/app/components/CollectComponent/RunComponent.tsx @@ -7,7 +7,7 @@ import InputCollect from '../InputCollect'; import { injectEmotivMarker } from '../../utils/eeg/emotiv'; import { injectMuseMarker } from '../../utils/eeg/muse'; import { EXPERIMENTS, DEVICES } from '../../constants/constants'; -import { ExperimentWindow } from '../../utils/labjs'; +import { ExperimentWindow } from '../ExperimentWindow'; import { checkFileExists, getImages } from '../../utils/filesystem/storage'; import { Trial, ExperimentParameters } from '../../constants/interfaces'; import { ExperimentActions } from '../../actions'; @@ -15,19 +15,15 @@ import { ExperimentActions } from '../../actions'; const { dialog } = remote; interface Props { - type: EXPERIMENTS | null | undefined; + type: EXPERIMENTS; title: string; isRunning: boolean; params: ExperimentParameters; - trials: { - [key: string]: Trial; - }; - timelines: {}; subject: string; + studyObject: any; group: string; session: number; deviceType: DEVICES; - paradigm: EXPERIMENTS; isEEGEnabled: boolean; ExperimentActions: typeof ExperimentActions; } @@ -37,9 +33,6 @@ interface State { } export default class Run extends Component { - // insertLabJsCallback: () => void; - // handleCloseInputCollect: (string, string, number) => void; - // handleClean: () => void; constructor(props: Props) { super(props); this.state = { @@ -55,8 +48,8 @@ export default class Run extends Component { } async handleStartExperiment() { - const filename = `${this.props.subject}-${this.props.group}-${this.props.session}-behavior.csv`; - const { subject, title } = this.props; + const { subject, title, session, group } = this.props; + const filename = `${subject}-${group}-${session}-behavior.csv`; const fileExists = checkFileExists(title, subject, filename); if (fileExists) { const options = { @@ -106,6 +99,7 @@ export default class Run extends Component { ); } + return <>; } renderExperiment() { @@ -156,17 +150,19 @@ export default class Run extends Component {
); } + + const { title, type, studyObject, params } = this.props; + return (
{ - this.props.ExperimentActions.Stop({ data: csv }); - }, + title={title} + type={type} + studyObject={studyObject} + params={params} + eventCallback={this.insertLabJsCallback()} + onFinish={(csv) => { + ExperimentActions.Stop({ data: csv }); }} />
diff --git a/app/components/CollectComponent/index.tsx b/app/components/CollectComponent/index.tsx index 0377c198..0948e163 100644 --- a/app/components/CollectComponent/index.tsx +++ b/app/components/CollectComponent/index.tsx @@ -20,21 +20,17 @@ import { ExperimentActions, DeviceActions } from '../../actions'; export interface Props { history: HashHistory; ExperimentActions: typeof ExperimentActions; - connectedDevice: object; + connectedDevice: Record; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; DeviceActions: typeof DeviceActions; availableDevices: Array; type: EXPERIMENTS; + studyObject: any; signalQualityObservable: Observable; isRunning: boolean; params: ExperimentParameters; - paradigm: EXPERIMENTS; - trials: { - [key: string]: Trial; - }; - timelines: {}; subject: string; group: string; session: number; @@ -48,9 +44,6 @@ interface State { } export default class Collect extends Component { - // handleConnectModalClose: () => void; - // handleRunComponentOpen: () => void; - // handleRunComponentClose: () => void; constructor(props: Props) { super(props); this.state = { @@ -62,6 +55,7 @@ export default class Collect extends Component { this.handleRunComponentOpen = this.handleRunComponentOpen.bind(this); this.handleRunComponentClose = this.handleRunComponentClose.bind(this); if (isNil(props.params)) { + // TODO: Timeline -> Parameters name change? props.ExperimentActions.LoadDefaultTimeline(); } } @@ -131,11 +125,9 @@ export default class Collect extends Component { ExperimentActions={this.props.ExperimentActions} availableDevices={this.props.availableDevices} type={this.props.type} - paradigm={this.props.paradigm} isRunning={this.props.isRunning} params={this.props.params} - trials={this.props.trials} - timelines={this.props.timelines} + title={this.props.title} subject={this.props.subject} group={this.props.group} session={this.props.session} diff --git a/app/components/ExperimentWindow.tsx b/app/components/ExperimentWindow.tsx new file mode 100644 index 00000000..50456c7c --- /dev/null +++ b/app/components/ExperimentWindow.tsx @@ -0,0 +1,119 @@ +import React, { useEffect } from 'react'; +import path from 'path'; +import clonedeep from 'lodash.clonedeep'; +import * as lab from 'lab.js/dist/lab.dev'; +import { ExperimentParameters } from '../constants/interfaces'; + +// TODO: Switch to using .json files to load lab.js studies +import visualsearch from '../utils/labjs/scripts/visualsearch'; +import stroop from '../utils/labjs/scripts/stroop'; +import multitasking from '../utils/labjs/scripts/multitasking'; +import faceshouses from '../utils/labjs/scripts/faceshouses'; +import custom from '../utils/labjs/scripts/custom'; +import { EXPERIMENTS } from '../constants/constants'; + +export interface ExperimentWindowProps { + title: string; + type: EXPERIMENTS; + studyObject: any; + params: ExperimentParameters; + eventCallback: (value: any, time: number) => void; + onFinish: (csv: any) => void; +} + +export const ExperimentWindow: React.FC = ({ + title, + type, + studyObject, + params, + eventCallback, + onFinish, +}) => { + useEffect(() => { + console.log('Experiment Window effect'); + // TODO: move this study mutation into Redux + let studyWithParams = studyObject; + + // TODO: Remove eventually when study updating has been brought into redux + switch (type) { + case 'Multi-tasking': + multitasking.parameters = params; + studyWithParams = lab.util.fromObject(clonedeep(multitasking), lab); + break; + case 'Visual Search': + visualsearch.parameters = params; + studyWithParams = lab.util.fromObject(clonedeep(visualsearch), lab); + break; + case 'Stroop Task': + stroop.parameters = params; + studyWithParams = lab.util.fromObject(clonedeep(stroop), lab); + break; + case 'Faces and Houses': + faceshouses.parameters = params; + studyWithParams = lab.util.fromObject(clonedeep(faceshouses), lab); + break; + case 'Custom': + default: + custom.parameters = params; + studyWithParams = lab.util.fromObject(clonedeep(custom), lab); + break; + } + + if (type === 'Custom' || type === 'Faces and Houses') { + studyWithParams.parameters.title = title; + studyWithParams.files = params.stimuli + .map((image) => ({ + [path.join(image.dir, image.filename)]: path.join( + image.dir, + image.filename + ), + })) + .reduce((obj, item) => { + // return { ...obj, item }; ?? + obj[Object.keys(item)[0]] = Object.values(item)[0]; + return obj; + }, {}); + } + + studyWithParams.on('end', () => { + const csv = studyWithParams.options.datastore.exportCsv(); + studyWithParams = undefined; + onFinish(csv); + }); + studyWithParams.parameters.callbackForEEG = (e) => { + eventCallback(e, new Date().getTime()); + }; + studyWithParams.options.events.keydown = async (e) => { + if (e.code === 'Escape') { + if (studyWithParams) { + await studyWithParams.internals.controller.audioContext.close(); + studyWithParams.end(); + } + } + }; + + studyWithParams.run(); + + return () => { + try { + if (studyWithParams) { + studyWithParams.internals.controller.audioContext.close(); + studyWithParams.end(); + } + } catch (e) { + console.log('Experiment closed before unmount'); + } + }; + }, []); + + return ( +
+
+
+

Loading Experiment

+

The experiment is loading and should start in a few seconds

+
+
+
+ ); +}; diff --git a/app/components/PreviewExperimentComponent.tsx b/app/components/PreviewExperimentComponent.tsx index 365e2b92..6c5937cd 100644 --- a/app/components/PreviewExperimentComponent.tsx +++ b/app/components/PreviewExperimentComponent.tsx @@ -1,21 +1,19 @@ import React, { Component } from 'react'; import { Segment } from 'semantic-ui-react'; -import { ExperimentWindow } from '../utils/labjs'; +import { ExperimentWindow } from './ExperimentWindow'; import styles from './styles/collect.css'; import { getImages } from '../utils/filesystem/storage'; import { Trial, ExperimentParameters } from '../constants/interfaces'; +import { EXPERIMENTS } from '../constants/constants'; interface Props { title: string; - paradigm: string; + type: EXPERIMENTS; + studyObject: any; params: ExperimentParameters; previewParams?: ExperimentParameters; isPreviewing: boolean; - trials: { - [key: string]: Trial; - }; - timelines: {}; onEnd: () => void; } @@ -39,15 +37,13 @@ export default class PreviewExperimentComponent extends Component { return (
{ - this.props.onEnd(); - }, + title={this.props.title} + type={this.props.type} + studyObject={this.props.studyObject} + params={this.props.previewParams || this.props.params} + eventCallback={PreviewExperimentComponent.insertPreviewLabJsCallback} + onFinish={(csv) => { + this.props.onEnd(); }} />
diff --git a/app/constants/constants.ts b/app/constants/constants.ts index d4b348ed..6749905b 100644 --- a/app/constants/constants.ts +++ b/app/constants/constants.ts @@ -5,7 +5,7 @@ export enum EXPERIMENTS { SSVEP = 'Steady-state Visual Evoked Potential', STROOP = 'Stroop Task', MULTI = 'Multi-tasking', - SEARCH = 'Visual search', + SEARCH = 'Visual Search', CUSTOM = 'Custom', } diff --git a/app/reducers/experimentReducer.ts b/app/reducers/experimentReducer.ts index ca90bb72..ac8e3c67 100644 --- a/app/reducers/experimentReducer.ts +++ b/app/reducers/experimentReducer.ts @@ -2,24 +2,24 @@ import { createReducer } from '@reduxjs/toolkit'; import { ExperimentActions } from '../actions'; import { EXPERIMENTS } from '../constants/constants'; import { - MainTimeline, - Trial, ExperimentDescription, ExperimentParameters, } from '../constants/interfaces'; export interface ExperimentStateType { - readonly type: EXPERIMENTS | null | undefined; - readonly title: string | null | undefined; - readonly params: ExperimentParameters | null | undefined; - readonly mainTimeline: MainTimeline; - readonly trials: { - [key: string]: Trial; - }; - readonly timelines: {}; - readonly plugins: object; + readonly type: EXPERIMENTS; + readonly title: string; + // Aspects of a study that can be tweaked within the BrainWaves app + readonly params: ExperimentParameters | null; + // lab.js study object that is executed by lab.js to rendder the study + readonly studyObject: any; + readonly plugins: Record; + // Subject/student name (e.g. Brian) readonly subject: string; + // Classroom group name + // TODO: Should this be optional? readonly group: string; + // Session num. Each complete run through of the experiment is one session readonly session: number; readonly isRunning: boolean; readonly isEEGEnabled: boolean; @@ -30,9 +30,7 @@ const initialState: ExperimentStateType = { type: EXPERIMENTS.NONE, title: '', params: null, - mainTimeline: [], - trials: {}, - timelines: {}, + studyObject: {}, plugins: {}, subject: '', group: '', diff --git a/app/utils/labjs/index.tsx b/app/utils/labjs/index.tsx deleted file mode 100644 index d0e5d1f0..00000000 --- a/app/utils/labjs/index.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import React, { Component } from 'react'; -import path from 'path'; -import clonedeep from 'lodash.clonedeep'; -import * as lab from 'lab.js/dist/lab.dev'; -import { ExperimentSettings } from '../../constants/interfaces'; - -// TODO: Switch to using .json files to load lab.js studies -import visualsearch from './scripts/visualsearch'; -import stroop from './scripts/stroop'; -import multitasking from './scripts/multitasking'; -import faceshouses from './scripts/faceshouses'; -import custom from './scripts/custom'; - -class ExperimentWindow extends Component<{ settings: ExperimentSettings }> { - // TO BE TYPED Lab.js Study - study: any = {}; - - componentDidMount() { - const { props } = this; - switch (props.settings.script) { - case 'Multi-tasking': - multitasking.parameters = props.settings.params; - this.study = lab.util.fromObject(clonedeep(multitasking), lab); - break; - case 'Visual search': - visualsearch.parameters = props.settings.params; - this.study = lab.util.fromObject(clonedeep(visualsearch), lab); - break; - case 'Stroop Task': - stroop.parameters = props.settings.params; - this.study = lab.util.fromObject(clonedeep(stroop), lab); - break; - case 'Faces and Houses': - faceshouses.parameters = props.settings.params; - faceshouses.parameters.title = props.settings.title; - faceshouses.files = props.settings.params.stimuli - .map((image) => ({ - [path.join(image.dir, image.filename)]: path.join( - image.dir, - image.filename - ), - })) - .reduce((obj, item) => { - // return { ...obj, item }; ?? - obj[Object.keys(item)[0]] = Object.values(item)[0]; - return obj; - }, {}); - this.study = lab.util.fromObject(clonedeep(faceshouses), lab); - break; - case 'Custom': - default: - custom.parameters = props.settings.params; - custom.parameters.title = props.settings.title; - custom.files = props.settings.params.stimuli - .map((image) => ({ - [path.join(image.dir, image.filename)]: path.join( - image.dir, - image.filename - ), - })) - .reduce((obj, item) => { - // return { ...obj, item }; ?? - obj[Object.keys(item)[0]] = Object.values(item)[0]; - return obj; - }, {}); - this.study = lab.util.fromObject(clonedeep(custom), lab); - break; - } - - this.study.on('end', () => { - const csv = this.study.options.datastore.exportCsv(); - this.study = undefined; - props.settings.on_finish(csv); - }); - this.study.parameters.callbackForEEG = (e) => { - props.settings.eventCallback(e, new Date().getTime()); - }; - this.study.options.events.keydown = async (e) => { - if (e.code === 'Escape') { - if (this.study) { - await this.study.internals.controller.audioContext.close(); - this.study.end(); - } - } - }; - - this.study.run(); - } - - componentWillUnmount() { - try { - if (this.study) { - this.study.internals.controller.audioContext.close(); - this.study.end(); - } - } catch (e) { - console.log('Experiment closed before unmount'); - } - } - - render() { - return ( -
-
-
-

Loading Experiment

-

The experiment is loading and should start in a few seconds

-
-
-
- ); - } -} - -export { ExperimentWindow }; From d3ef6d0e2c40f4749d99c829e5ded46b2d9d0b20 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Mon, 17 Aug 2020 16:12:29 -0400 Subject: [PATCH 49/66] small left over changes --- .../DesignComponent/CustomDesignComponent.tsx | 25 ++++++++----------- app/components/DesignComponent/index.tsx | 6 ----- app/components/EEGExplorationComponent.tsx | 2 -- app/constants/interfaces.ts | 8 +----- 4 files changed, 12 insertions(+), 29 deletions(-) diff --git a/app/components/DesignComponent/CustomDesignComponent.tsx b/app/components/DesignComponent/CustomDesignComponent.tsx index b371fd2b..57108a01 100644 --- a/app/components/DesignComponent/CustomDesignComponent.tsx +++ b/app/components/DesignComponent/CustomDesignComponent.tsx @@ -73,11 +73,6 @@ interface State { } export default class CustomDesign extends Component { - // handleStartExperiment: (Object) => void; - - // handlePreview: () => void; - // handleSaveParams: () => void; - // handleProgressBar: (Object, Object) => void; constructor(props: Props) { super(props); this.state = { @@ -640,15 +635,17 @@ export default class CustomDesign extends Component { verticalAlign="middle" className={styles.previewWindow} > - + {this.props.type && ( + + )} diff --git a/app/components/DesignComponent/index.tsx b/app/components/DesignComponent/index.tsx index 545cc251..4a43dab6 100644 --- a/app/components/DesignComponent/index.tsx +++ b/app/components/DesignComponent/index.tsx @@ -16,7 +16,6 @@ import styles from '../styles/common.css'; import { EXPERIMENTS, SCREENS } from '../../constants/constants'; import { readWorkspaces } from '../../utils/filesystem/storage'; import { - MainTimeline, Trial, ExperimentParameters, ExperimentDescription, @@ -59,11 +58,6 @@ export interface Props { paradigm: EXPERIMENTS; title: string; params: ExperimentParameters; - mainTimeline: MainTimeline; - trials: { - [key: string]: Trial; - }; - timelines: {}; ExperimentActions: typeof ExperimentActions; description: ExperimentDescription; isEEGEnabled: boolean; diff --git a/app/components/EEGExplorationComponent.tsx b/app/components/EEGExplorationComponent.tsx index c5ab8a33..e23eb364 100644 --- a/app/components/EEGExplorationComponent.tsx +++ b/app/components/EEGExplorationComponent.tsx @@ -37,8 +37,6 @@ interface State { } export default class Home extends Component { - // handleConnectModalClose: () => void; - // handleStartConnect: () => void; constructor(props: Props) { super(props); this.state = { diff --git a/app/constants/interfaces.ts b/app/constants/interfaces.ts index c0d52a7b..a90ea4a9 100644 --- a/app/constants/interfaces.ts +++ b/app/constants/interfaces.ts @@ -47,6 +47,7 @@ export type ExperimentParameters = { randomize?: 'random' | 'sequential'; selfPaced?: boolean; presentationTime?: number; + taskHelp?: string; }; export type ExperimentDescription = { @@ -63,13 +64,6 @@ export interface ExperimentSettings { on_finish: (csv: any) => void; } -// --------------------------------------------------- -// jsPsych -// TODO: figure out if this is still being used - -// Array of timeline and trial ids that will be presented in experiment -export type MainTimeline = Array; - // jsPsych trial presented as part of an experiment export interface Trial { id: string; From ea7e9097ad8d95004662eb49a677d328e2c4947c Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Mon, 17 Aug 2020 16:37:16 -0400 Subject: [PATCH 50/66] object -> Record --- app/components/AnalyzeComponent.tsx | 41 +++++++++++-------- app/components/CleanComponent/index.tsx | 4 +- .../CollectComponent/ConnectModal.tsx | 2 +- .../DesignComponent/CustomDesignComponent.tsx | 8 +--- app/components/EEGExplorationComponent.tsx | 2 +- app/components/InputModal.tsx | 2 +- app/constants/interfaces.ts | 6 +-- app/utils/jupyter/functions.ts | 4 +- 8 files changed, 37 insertions(+), 32 deletions(-) diff --git a/app/components/AnalyzeComponent.tsx b/app/components/AnalyzeComponent.tsx index 2129dd1a..00b07e56 100644 --- a/app/components/AnalyzeComponent.tsx +++ b/app/components/AnalyzeComponent.tsx @@ -112,8 +112,11 @@ interface State { removeOutliers: boolean; showDataPoints: boolean; isSidebarVisible: boolean; - displayOutlierVisible: boolean; + // TODO: implement outlier display toggle + // displayOutlierVisible: boolean; displayMode: string; + dataToPlot: number[]; + layout: Record; helpMode: string; dependentVariables: Array< | { @@ -128,14 +131,6 @@ interface State { // TODO: Add a channel callback from reading epochs so this screen can be aware of which channels are // available in dataset export default class Analyze extends Component { - // handleDependentVariableChange: (Object, Object) => void; - - // handleRemoveOutliers: (Object, Object) => void; - // handleDisplayModeChange: (string) => void; - // handleDataPoints: (Object, Object) => void; - // saveSelectedDatasets: () => void; - // handleStepClick: (Object, Object) => void; - // toggleDisplayInfoVisibility: () => void; constructor(props: Props) { super(props); this.state = { @@ -217,7 +212,7 @@ export default class Analyze extends Component { return subjects.reduce((acc, curr) => `${acc}-${curr}`); }; - handleDatasetChange(event: object, data: object) { + handleDatasetChange(event: Record, data: Record) { this.setState({ selectedFilePaths: data.value, selectedSubjects: getSubjectNamesFromFiles(data.value), @@ -225,14 +220,21 @@ export default class Analyze extends Component { this.props.JupyterActions.LoadCleanedEpochs(data.value); } - handleBehaviorDatasetChange(event: object, data: object) { - const { dataToPlot, layout } = aggregateDataForPlot( + handleBehaviorDatasetChange( + event: Record, + data: Record + ) { + const aggregatedData = aggregateDataForPlot( readBehaviorData(data.value), this.state.selectedDependentVariable, this.state.removeOutliers, this.state.showDataPoints, this.state.displayMode ); + if (!aggregatedData) { + return; + } + const { dataToPlot, layout } = aggregatedData; this.setState({ selectedBehaviorFilePaths: data.value, selectedSubjects: getSubjectNamesFromFiles(data.value), @@ -254,14 +256,21 @@ export default class Analyze extends Component { } } - handleDependentVariableChange(event: object, data: object) { - const { dataToPlot, layout } = aggregateDataForPlot( + handleDependentVariableChange( + event: Record, + data: Record + ) { + const aggregatedData = aggregateDataForPlot( readBehaviorData(this.state.selectedBehaviorFilePaths), data.value, this.state.removeOutliers, this.state.showDataPoints, this.state.displayMode ); + if (!aggregatedData) { + return; + } + const { dataToPlot, layout } = aggregatedData; this.setState({ selectedDependentVariable: data.value, dataToPlot, @@ -269,7 +278,7 @@ export default class Analyze extends Component { }); } - handleRemoveOutliers(event: object, data: object) { + handleRemoveOutliers(event: Record, data: Record) { const { dataToPlot, layout } = aggregateDataForPlot( readBehaviorData(this.state.selectedBehaviorFilePaths), this.state.selectedDependentVariable, @@ -285,7 +294,7 @@ export default class Analyze extends Component { }); } - handleDataPoints(event: object, data: object) { + handleDataPoints(event: Record, data: Record) { const { dataToPlot, layout } = aggregateDataForPlot( readBehaviorData(this.state.selectedBehaviorFilePaths), this.state.selectedDependentVariable, diff --git a/app/components/CleanComponent/index.tsx b/app/components/CleanComponent/index.tsx index 46cc14d5..946b3d30 100644 --- a/app/components/CleanComponent/index.tsx +++ b/app/components/CleanComponent/index.tsx @@ -101,14 +101,14 @@ export default class Clean extends Component { }); } - handleRecordingChange(event: object, data: DropdownProps) { + handleRecordingChange(event: Record, data: DropdownProps) { if (isArray(data.value)) { const filePaths = data.value.filter(isString); this.setState({ selectedFilePaths: filePaths }); } } - handleSubjectChange(event: object, data: DropdownProps) { + handleSubjectChange(event: Record, data: DropdownProps) { if (!isNil(data) && isString(data.value)) { this.setState({ selectedSubject: data.value, selectedFilePaths: [] }); } diff --git a/app/components/CollectComponent/ConnectModal.tsx b/app/components/CollectComponent/ConnectModal.tsx index ac258f7f..b0733f00 100644 --- a/app/components/CollectComponent/ConnectModal.tsx +++ b/app/components/CollectComponent/ConnectModal.tsx @@ -16,7 +16,7 @@ interface Props { history: HashHistory; open: boolean; onClose: () => void; - connectedDevice: object; + connectedDevice: Record; signalQualityObservable?: Observable; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; diff --git a/app/components/DesignComponent/CustomDesignComponent.tsx b/app/components/DesignComponent/CustomDesignComponent.tsx index 57108a01..08530293 100644 --- a/app/components/DesignComponent/CustomDesignComponent.tsx +++ b/app/components/DesignComponent/CustomDesignComponent.tsx @@ -55,10 +55,6 @@ interface Props { type: EXPERIMENTS | null | undefined; title: string; params: ExperimentParameters; - trials: { - [key: string]: Trial; - }; - timelines: {}; ExperimentActions: typeof ExperimentActions; isEEGEnabled: boolean; description: ExperimentDescription; @@ -103,13 +99,13 @@ export default class CustomDesign extends Component { this.setState({ activeStep: step }); } - handleProgressBar(event: object, data: object) { + handleProgressBar(event: Record, data: Record) { this.setState({ params: { ...this.state.params, showProgessBar: data.checked }, }); } - handleEEGEnabled(event: object, data: object) { + handleEEGEnabled(event: Record, data: Record) { this.props.ExperimentActions.SetEEGEnabled(data.checked); } diff --git a/app/components/EEGExplorationComponent.tsx b/app/components/EEGExplorationComponent.tsx index e23eb364..e0237d5f 100644 --- a/app/components/EEGExplorationComponent.tsx +++ b/app/components/EEGExplorationComponent.tsx @@ -23,7 +23,7 @@ import { DeviceActions } from '../actions'; interface Props { history: HashHistory; - connectedDevice: object; + connectedDevice: Record; signalQualityObservable: any | null | undefined; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; diff --git a/app/components/InputModal.tsx b/app/components/InputModal.tsx index f5cb5458..94f31e2e 100644 --- a/app/components/InputModal.tsx +++ b/app/components/InputModal.tsx @@ -48,7 +48,7 @@ export default class InputModal extends Component { this.props.onExit(); } - handleEnterSubmit(event: object) { + handleEnterSubmit(event: Record) { if (event.key === 'Enter') { this.handleClose(); } diff --git a/app/constants/interfaces.ts b/app/constants/interfaces.ts index a90ea4a9..565f3f7d 100644 --- a/app/constants/interfaces.ts +++ b/app/constants/interfaces.ts @@ -80,7 +80,7 @@ export type Timeline = { id: string; timeline: Array; sample?: SampleParameter; - timeline_variables?: Array; + timeline_variables?: Array>; }; export interface SampleParameter { @@ -105,9 +105,9 @@ export interface StimuliDesc { // Jupyter export interface Kernel { - config: object; + config: Record; connectionFile: string; - kernelSpec: object; + kernelSpec: Record; spawn: ChildProcess; } diff --git a/app/utils/jupyter/functions.ts b/app/utils/jupyter/functions.ts index d435f623..f1d08107 100644 --- a/app/utils/jupyter/functions.ts +++ b/app/utils/jupyter/functions.ts @@ -3,7 +3,7 @@ import { KERNEL_STATUS } from '../../constants/constants'; export const parseSingleQuoteJSON = (string: string) => JSON.parse(string.replace(/'/g, '"')); -export const parseKernelStatus = (msg: object) => { +export const parseKernelStatus = (msg: Record) => { switch (msg.content.execution_state) { case 'busy': return KERNEL_STATUS.BUSY; @@ -15,7 +15,7 @@ export const parseKernelStatus = (msg: object) => { } }; -export const debugParseMessage = (msg: object) => { +export const debugParseMessage = (msg: Record) => { let content = ''; switch (msg.channel) { case 'iopub': From 7572f5e67deadba435de50b74ec1985eeb4d51a3 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Mon, 17 Aug 2020 17:16:36 -0400 Subject: [PATCH 51/66] fixed Redux --- app/epics/deviceEpics.ts | 3 +-- app/epics/experimentEpics.ts | 2 +- app/epics/index.ts | 2 +- app/epics/jupyterEpics.ts | 2 +- app/utils/eeg/pipes.ts | 8 ++++---- app/utils/redux/index.ts | 6 ++++++ 6 files changed, 14 insertions(+), 9 deletions(-) create mode 100644 app/utils/redux/index.ts diff --git a/app/epics/deviceEpics.ts b/app/epics/deviceEpics.ts index 1427589c..6e973825 100644 --- a/app/epics/deviceEpics.ts +++ b/app/epics/deviceEpics.ts @@ -3,7 +3,7 @@ import { of, from, timer, ObservableInput } from 'rxjs'; import { map, pluck, mergeMap, tap, filter, catchError } from 'rxjs/operators'; import { isNil } from 'lodash'; import { toast } from 'react-toastify'; -import { isActionOf } from 'typesafe-actions'; +import { isActionOf } from '../utils/redux'; import { DeviceActions, DeviceActionType, ExperimentActions } from '../actions'; import { getEmotiv, @@ -26,7 +26,6 @@ import { SEARCH_TIMER, } from '../constants/constants'; import { Device, DeviceInfo } from '../constants/interfaces'; -import { DeviceStateType } from '../reducers/deviceReducer'; import { RootState } from '../reducers'; // ------------------------------------------------------------------------- diff --git a/app/epics/experimentEpics.ts b/app/epics/experimentEpics.ts index 8b074580..f7c9a75d 100644 --- a/app/epics/experimentEpics.ts +++ b/app/epics/experimentEpics.ts @@ -1,4 +1,3 @@ -import { isActionOf } from 'typesafe-actions'; import { combineEpics, Epic } from 'redux-observable'; import { from, of, ObservableInput } from 'rxjs'; import { @@ -12,6 +11,7 @@ import { ignoreElements, tap, } from 'rxjs/operators'; +import { isActionOf } from '../utils/redux'; import { ExperimentActions, ExperimentActionType } from '../actions'; import { DEVICES, diff --git a/app/epics/index.ts b/app/epics/index.ts index 649ecdd7..bb298118 100644 --- a/app/epics/index.ts +++ b/app/epics/index.ts @@ -4,4 +4,4 @@ import device from './deviceEpics'; import experiment from './experimentEpics'; // TODO: Fix issue: https://github.com/piotrwitek/typesafe-actions/issues/174 -export default combineEpics(); +export default combineEpics(device, experiment, jupyter); diff --git a/app/epics/jupyterEpics.ts b/app/epics/jupyterEpics.ts index f97c27c4..8fa7d1ac 100644 --- a/app/epics/jupyterEpics.ts +++ b/app/epics/jupyterEpics.ts @@ -11,11 +11,11 @@ import { } from 'rxjs/operators'; import { find } from 'kernelspecs'; import { launchSpec } from 'spawnteract'; -import { isActionOf } from 'typesafe-actions'; import { createMainChannel } from 'enchannel-zmq-backend'; import { isNil } from 'lodash'; import { kernelInfoRequest, executeRequest } from '@nteract/messaging'; import { toast } from 'react-toastify'; +import { isActionOf } from '../utils/redux'; import { JupyterActions, JupyterActionType } from '../actions'; import { execute, awaitOkMessage } from '../utils/jupyter/pipes'; import { RootState } from '../reducers'; diff --git a/app/utils/eeg/pipes.ts b/app/utils/eeg/pipes.ts index 480d1115..8a391de8 100644 --- a/app/utils/eeg/pipes.ts +++ b/app/utils/eeg/pipes.ts @@ -7,9 +7,9 @@ import { export const parseMuseSignalQuality = () => pipe( - map((epoch) => ({ + map((epoch: Record) => ({ ...epoch, - signalQuality: object.assign( + signalQuality: Object.assign( {}, ...Object.entries(epoch.signalQuality).map( ([channelName, signalQuality]) => { @@ -31,9 +31,9 @@ export const parseMuseSignalQuality = () => export const parseEmotivSignalQuality = () => pipe( - map((epoch) => ({ + map((epoch: Record) => ({ ...epoch, - signalQuality: object.assign( + signalQuality: Object.assign( {}, ...Object.entries(epoch.signalQuality).map( ([channelName, signalQuality]) => { diff --git a/app/utils/redux/index.ts b/app/utils/redux/index.ts new file mode 100644 index 00000000..ee015196 --- /dev/null +++ b/app/utils/redux/index.ts @@ -0,0 +1,6 @@ +import { ActionCreatorWithPayload } from '@reduxjs/toolkit'; +import { ActionType } from 'typesafe-actions'; + +export function isActionOf(actionCreator: ActionCreatorWithPayload) { + return (action: ActionType) => action.type === actionCreator.type; +} From 35677920b0303f4803019111ec282709b5a79865 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Mon, 17 Aug 2020 18:27:22 -0400 Subject: [PATCH 52/66] fixing last error --- app/actions/jupyterActions.ts | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/actions/jupyterActions.ts b/app/actions/jupyterActions.ts index 338f3b95..d8b1867b 100644 --- a/app/actions/jupyterActions.ts +++ b/app/actions/jupyterActions.ts @@ -11,7 +11,7 @@ export const JupyterActions = { SendExecuteRequest: createAction( 'SEND_EXECUTE_REQUEST' ), - LoadEpochs: createAction('LOAD_EPOCHS'), + LoadEpochs: createAction('LOAD_EPOCHS'), LoadCleanedEpochs: createAction( 'LOAD_CLEANED_EPOCHS' ), diff --git a/package.json b/package.json index 7cec115c..5e358877 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "start-main-debug": "yarn start-main-dev --inspect=5858 --remote-debugging-port=9223", "start-main-dev": "cross-env START_HOT=1 NODE_ENV=development electron -r ./internals/scripts/BabelRegister ./app/main.dev.ts", "start-renderer-dev": "cross-env NODE_ENV=development webpack-dev-server --config configs/webpack.config.renderer.dev.babel.js", - "test": "cross-env BABEL_DISABLE_CACHE=1 jest", + "test": "cross-env BABEL_DISABLE_CACHE=1 jest --passWithNoTests", "test-all": "yarn lint && yarn tsc && yarn build && yarn test", "test-e2e": "node -r @babel/register ./internals/scripts/CheckBuildsExist.js && cross-env NODE_ENV=test testcafe electron:./app ./test/e2e/HomePage.e2e.ts", "test-e2e-live": "node -r @babel/register ./internals/scripts/CheckBuildsExist.js && cross-env NODE_ENV=test testcafe --live electron:./app ./test/e2e/HomePage.e2e.ts", @@ -189,7 +189,7 @@ "@types/history": "^4.7.6", "@types/jest": "^26.0.5", "@types/node": "12", - "@types/react": "^16.9.44", + "@types/react": "^16.9.38", "@types/react-dom": "^16.9.8", "@types/react-redux": "^7.1.9", "@types/react-router": "^5.1.8", From ff64c84af256524cfefdab45407e4fb7a40e8e7c Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Mon, 17 Aug 2020 18:51:03 -0400 Subject: [PATCH 53/66] pinned react types version --- package.json | 2 +- yarn.lock | 15 +-------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 5e358877..4f52d9be 100644 --- a/package.json +++ b/package.json @@ -189,7 +189,7 @@ "@types/history": "^4.7.6", "@types/jest": "^26.0.5", "@types/node": "12", - "@types/react": "^16.9.38", + "@types/react": "16.9.38", "@types/react-dom": "^16.9.8", "@types/react-redux": "^7.1.9", "@types/react-router": "^5.1.8", diff --git a/yarn.lock b/yarn.lock index 8ac30878..2b05e91f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2227,7 +2227,7 @@ dependencies: "@types/react" "*" -"@types/react@*": +"@types/react@*", "@types/react@16.9.38": version "16.9.38" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.38.tgz#868405dace93a4095d3e054f4c4a1de7a1ac0680" integrity sha512-pHAeZbjjNRa/hxyNuLrvbxhhnKyKNiLC6I5fRF2Zr/t/S6zS41MiyzH4+c+1I9vVfvuRt1VS2Lodjr4ZWnxrdA== @@ -2235,14 +2235,6 @@ "@types/prop-types" "*" csstype "^2.2.0" -"@types/react@^16.9.44": - version "16.9.45" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.45.tgz#b43ccf3d8a3d2020e6a48c8c8492e5a4bc10f097" - integrity sha512-vv950slTF5UZ5eDOf13b8qC1SD4rTvkqg3HfaUKzr17U97oeJZAa+dUaIHn0QoOJflNTIt6Pem9MmapULs9dkA== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - "@types/redux-logger@^3.0.8": version "3.0.8" resolved "https://registry.yarnpkg.com/@types/redux-logger/-/redux-logger-3.0.8.tgz#1fb6d26917bb198792bb1cf57feb31cae1532c5d" @@ -5906,11 +5898,6 @@ csstype@^2.2.0, csstype@^2.6.7: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== -csstype@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz#ee5ff8f208c8cd613b389f7b222c9801ca62b3f7" - integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== - cubic-hermite@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cubic-hermite/-/cubic-hermite-1.0.0.tgz#84e3b2f272b31454e8393b99bb6aed45168c14e5" From fb77af6d6637c123986b4b86ad5337e1347cfa16 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Mon, 17 Aug 2020 18:51:15 -0400 Subject: [PATCH 54/66] HashHistory -> History --- app/components/CollectComponent/ConnectModal.tsx | 2 +- app/components/CollectComponent/index.tsx | 2 +- app/components/DesignComponent/CustomDesignComponent.tsx | 4 ++-- app/components/DesignComponent/index.tsx | 4 ++-- app/components/EEGExplorationComponent.tsx | 4 ++-- app/components/HomeComponent/index.tsx | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/components/CollectComponent/ConnectModal.tsx b/app/components/CollectComponent/ConnectModal.tsx index b0733f00..715118d2 100644 --- a/app/components/CollectComponent/ConnectModal.tsx +++ b/app/components/CollectComponent/ConnectModal.tsx @@ -13,7 +13,7 @@ import { SignalQualityData } from '../../constants/interfaces'; import { DeviceActions } from '../../actions'; interface Props { - history: HashHistory; + history: History; open: boolean; onClose: () => void; connectedDevice: Record; diff --git a/app/components/CollectComponent/index.tsx b/app/components/CollectComponent/index.tsx index 0948e163..307cd89d 100644 --- a/app/components/CollectComponent/index.tsx +++ b/app/components/CollectComponent/index.tsx @@ -18,7 +18,7 @@ import RunComponent from './RunComponent'; import { ExperimentActions, DeviceActions } from '../../actions'; export interface Props { - history: HashHistory; + history: History; ExperimentActions: typeof ExperimentActions; connectedDevice: Record; deviceType: DEVICES; diff --git a/app/components/DesignComponent/CustomDesignComponent.tsx b/app/components/DesignComponent/CustomDesignComponent.tsx index 08530293..4c298c30 100644 --- a/app/components/DesignComponent/CustomDesignComponent.tsx +++ b/app/components/DesignComponent/CustomDesignComponent.tsx @@ -10,7 +10,7 @@ import { Table, } from 'semantic-ui-react'; import { isNil } from 'lodash'; -import { HashHistory } from 'history'; +import { History } from 'history'; import styles from '../styles/common.css'; import { EXPERIMENTS, SCREENS } from '../../constants/constants'; @@ -51,7 +51,7 @@ const FIELDS = { }; interface Props { - history: HashHistory; + history: History; type: EXPERIMENTS | null | undefined; title: string; params: ExperimentParameters; diff --git a/app/components/DesignComponent/index.tsx b/app/components/DesignComponent/index.tsx index 4a43dab6..f9835151 100644 --- a/app/components/DesignComponent/index.tsx +++ b/app/components/DesignComponent/index.tsx @@ -1,5 +1,5 @@ import React, { Component } from 'react'; -import { HashHistory } from 'history'; +import { History } from 'history'; import { Grid, Button, @@ -53,7 +53,7 @@ const DESIGN_STEPS = { }; export interface Props { - history: HashHistory; + history: History; type: EXPERIMENTS; paradigm: EXPERIMENTS; title: string; diff --git a/app/components/EEGExplorationComponent.tsx b/app/components/EEGExplorationComponent.tsx index e0237d5f..02f9e1ea 100644 --- a/app/components/EEGExplorationComponent.tsx +++ b/app/components/EEGExplorationComponent.tsx @@ -7,7 +7,7 @@ import { Image, Divider, } from 'semantic-ui-react'; -import { HashHistory } from 'history'; +import { History } from 'history'; import { PLOTTING_INTERVAL, CONNECTION_STATUS, @@ -22,7 +22,7 @@ import styles from './styles/common.css'; import { DeviceActions } from '../actions'; interface Props { - history: HashHistory; + history: History; connectedDevice: Record; signalQualityObservable: any | null | undefined; deviceType: DEVICES; diff --git a/app/components/HomeComponent/index.tsx b/app/components/HomeComponent/index.tsx index 54278a52..957c92cc 100644 --- a/app/components/HomeComponent/index.tsx +++ b/app/components/HomeComponent/index.tsx @@ -3,7 +3,7 @@ import { isNil } from 'lodash'; import { Grid, Button, Header, Segment, Image, Table } from 'semantic-ui-react'; import { toast } from 'react-toastify'; import * as moment from 'moment'; -import { HashHistory } from 'history'; +import { History } from 'history'; import { remote } from 'electron'; import styles from '../styles/common.css'; import { @@ -50,7 +50,7 @@ const HOME_STEPS = { interface Props { kernelStatus: KERNEL_STATUS; - history: HashHistory; + history: History; JupyterActions: typeof JupyterActions; connectedDevice: Record; signalQualityObservable: any | null | undefined; From 318bc7d54b986381c1ca95a71b98b8c93d9dee26 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Wed, 19 Aug 2020 02:02:04 -0400 Subject: [PATCH 55/66] Removed some onerous ts rules --- tsconfig.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 30637f1e..4d374354 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,11 +11,6 @@ "pretty": true, "sourceMap": true, "noImplicitAny": false, - /* Additional Checks */ - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, /* Module Resolution Options */ "moduleResolution": "node", "esModuleInterop": true, From 1e59a256998d6f1dd43fbda4312961c0cb14af42 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Wed, 19 Aug 2020 02:02:26 -0400 Subject: [PATCH 56/66] Fixing things --- app/components/ViewerComponent.tsx | 29 ++++++++++------- app/constants/interfaces.ts | 10 ++++++ app/utils/eeg/{cortex.ts => cortex.js} | 0 app/utils/eeg/emotiv.ts | 2 +- app/utils/eeg/pipes.ts | 5 +-- app/utils/filesystem/dialog.ts | 44 +++++++++++--------------- app/utils/jupyter/functions.ts | 2 +- 7 files changed, 52 insertions(+), 40 deletions(-) rename app/utils/eeg/{cortex.ts => cortex.js} (100%) diff --git a/app/components/ViewerComponent.tsx b/app/components/ViewerComponent.tsx index 869c21c9..c010dee9 100644 --- a/app/components/ViewerComponent.tsx +++ b/app/components/ViewerComponent.tsx @@ -1,17 +1,19 @@ import React, { Component } from 'react'; import { Subscription, Observable } from 'rxjs'; import { isNil } from 'lodash'; +import { WebviewTag } from 'electron'; import { MUSE_CHANNELS, EMOTIV_CHANNELS, DEVICES, VIEWER_DEFAULTS, } from '../constants/constants'; +import { PipesEpoch } from '../constants/interfaces'; const Mousetrap = require('mousetrap'); interface Props { - signalQualityObservable: Observable | null | undefined; + signalQualityObservable: Observable; deviceType: DEVICES; plottingInterval: number; } @@ -23,8 +25,10 @@ interface State { } class ViewerComponent extends Component { - // graphView: ?HTMLElement; - // signalQualitySubscription: Subscription; + graphView: WebviewTag | null; + + signalQualitySubscription: Subscription | null; + constructor(props: Props) { super(props); this.state = { @@ -38,8 +42,8 @@ class ViewerComponent extends Component { componentDidMount() { this.graphView = document.querySelector('webview'); - this.graphView.addEventListener('dom-ready', () => { - this.graphView.send('initGraph', { + this.graphView?.addEventListener('dom-ready', () => { + this.graphView?.send('initGraph', { plottingInterval: this.props.plottingInterval, channels: this.state.channels, domain: this.state.domain, @@ -66,6 +70,9 @@ class ViewerComponent extends Component { : EMOTIV_CHANNELS, }); } + if (!this.graphView) { + return; + } if (this.state.channels !== prevState.channels) { this.graphView.send('updateChannels', this.state.channels); } @@ -89,8 +96,8 @@ class ViewerComponent extends Component { } setKeyListeners() { - Mousetrap.bind('up', () => this.graphView.send('zoomIn')); - Mousetrap.bind('down', () => this.graphView.send('zoomOut')); + Mousetrap.bind('up', () => this.graphView?.send('zoomIn')); + Mousetrap.bind('down', () => this.graphView?.send('zoomOut')); } subscribeToObservable(observable: any) { @@ -99,7 +106,7 @@ class ViewerComponent extends Component { } this.signalQualitySubscription = observable.subscribe( (chunk) => { - this.graphView.send('newData', chunk); + this.graphView?.send('newData', chunk); }, (error) => new Error(`Error in epochSubscription ${error}`) ); @@ -110,9 +117,9 @@ class ViewerComponent extends Component { ); } diff --git a/app/constants/interfaces.ts b/app/constants/interfaces.ts index 565f3f7d..b0a946e1 100644 --- a/app/constants/interfaces.ts +++ b/app/constants/interfaces.ts @@ -136,6 +136,16 @@ export interface DeviceInfo { samplingRate: number; } +export interface PipesEpoch { + data: number[][]; + signalQuality: { [channelName: string]: number }; + info: { + samplingRate: number; + startTime: number; + channelNames?: string[]; + }; +} + // -------------------------------------------------------------------- // General diff --git a/app/utils/eeg/cortex.ts b/app/utils/eeg/cortex.js similarity index 100% rename from app/utils/eeg/cortex.ts rename to app/utils/eeg/cortex.js diff --git a/app/utils/eeg/emotiv.ts b/app/utils/eeg/emotiv.ts index a435631d..878cca56 100644 --- a/app/utils/eeg/emotiv.ts +++ b/app/utils/eeg/emotiv.ts @@ -17,7 +17,7 @@ const verbose = process.env.LOG_LEVEL || 1; const options = { verbose }; // This global client is used in every Cortex API call -const client = new Cortex(options); +const client: any = new Cortex(options); // This global session is how I'm passing data between connectToEmotiv and createRawEmotivObservable // I'm not a fan of doing this but I don't want to refactor the Redux store based on this API change that diff --git a/app/utils/eeg/pipes.ts b/app/utils/eeg/pipes.ts index 8a391de8..9d4bba13 100644 --- a/app/utils/eeg/pipes.ts +++ b/app/utils/eeg/pipes.ts @@ -4,10 +4,11 @@ import { SIGNAL_QUALITY, SIGNAL_QUALITY_THRESHOLDS, } from '../../constants/constants'; +import { PipesEpoch } from '../../constants/interfaces'; export const parseMuseSignalQuality = () => pipe( - map((epoch: Record) => ({ + map((epoch: PipesEpoch) => ({ ...epoch, signalQuality: Object.assign( {}, @@ -31,7 +32,7 @@ export const parseMuseSignalQuality = () => export const parseEmotivSignalQuality = () => pipe( - map((epoch: Record) => ({ + map((epoch: PipesEpoch) => ({ ...epoch, signalQuality: Object.assign( {}, diff --git a/app/utils/filesystem/dialog.ts b/app/utils/filesystem/dialog.ts index 0005c141..b87da0d6 100644 --- a/app/utils/filesystem/dialog.ts +++ b/app/utils/filesystem/dialog.ts @@ -3,9 +3,11 @@ * These functions are all executed in the main process */ -import { dialog } from 'electron'; +import { remote } from 'electron'; import { FILE_TYPES } from '../../constants/constants'; +const { dialog } = remote; + export const loadDialog = (event, arg) => { switch (arg) { case FILE_TYPES.STIMULUS_DIR: @@ -18,31 +20,23 @@ export const loadDialog = (event, arg) => { }; const selectTimeline = (event) => { - dialog.showOpenDialog( - { - title: 'Select a jsPsych timeline file', - properties: ['openFile', 'promptToCreate'], - }, - (filePaths) => { - if (filePaths) { - event.sender.send('loadDialogReply', filePaths[0]); - } - } - ); + const filePaths = dialog.showOpenDialog({ + title: 'Select a jsPsych timeline file', + properties: ['openFile', 'promptToCreate'], + }); + if (filePaths) { + event.sender.send('loadDialogReply', filePaths[0]); + } }; const selectStimulusFolder = (event) => { - dialog.showOpenDialog( - { - title: 'Select a folder of images', - properties: ['openDirectory'], - }, - (dir) => { - if (dir) { - event.sender.send('loadDialogReply', dir[0]); - } else { - event.sender.send('loadDialogReply', ''); - } - } - ); + const dirs = dialog.showOpenDialog({ + title: 'Select a folder of images', + properties: ['openDirectory'], + }); + if (dirs) { + event.sender.send('loadDialogReply', dirs[0]); + } else { + event.sender.send('loadDialogReply', ''); + } }; diff --git a/app/utils/jupyter/functions.ts b/app/utils/jupyter/functions.ts index f1d08107..95f73baa 100644 --- a/app/utils/jupyter/functions.ts +++ b/app/utils/jupyter/functions.ts @@ -32,7 +32,7 @@ export const debugParseMessage = (msg: Record) => { } if (msg.content.data) { - content = Object.keys(msg.content.data); + content = JSON.stringify(Object.keys(msg.content.data)); } break; From 616bd6b970ec17535e6c3b1b7fdc420d692bdbc5 Mon Sep 17 00:00:00 2001 From: Dano Morrison Date: Wed, 19 Aug 2020 02:52:32 -0400 Subject: [PATCH 57/66] Fixed more errors; refactoring becoming clear --- .../CollectComponent/ConnectModal.tsx | 5 ++-- .../DesignComponent/StimuliDesignColumn.tsx | 28 ++++++++++++------- app/components/EEGExplorationComponent.tsx | 4 ++- .../HomeComponent/OverviewComponent.tsx | 28 +++++++++++++------ app/components/HomeComponent/index.tsx | 2 -- app/components/PreviewButtonComponent.tsx | 2 +- .../SignalQualityIndicatorComponent.tsx | 9 +++--- app/epics/deviceEpics.ts | 1 + app/utils/labjs/functions.ts | 1 + 9 files changed, 51 insertions(+), 29 deletions(-) diff --git a/app/components/CollectComponent/ConnectModal.tsx b/app/components/CollectComponent/ConnectModal.tsx index 715118d2..5d2313c6 100644 --- a/app/components/CollectComponent/ConnectModal.tsx +++ b/app/components/CollectComponent/ConnectModal.tsx @@ -1,6 +1,7 @@ import { Observable } from 'rxjs'; import React, { Component } from 'react'; import { isNil, debounce } from 'lodash'; +import { History } from 'history'; import { Modal, Button, Segment, List, Grid, Divider } from 'semantic-ui-react'; import { DEVICES, @@ -9,7 +10,7 @@ import { SCREENS, } from '../../constants/constants'; import styles from '../styles/collect.css'; -import { SignalQualityData } from '../../constants/interfaces'; +import { SignalQualityData, PipesEpoch } from '../../constants/interfaces'; import { DeviceActions } from '../../actions'; interface Props { @@ -17,7 +18,7 @@ interface Props { open: boolean; onClose: () => void; connectedDevice: Record; - signalQualityObservable?: Observable; + signalQualityObservable?: Observable; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; diff --git a/app/components/DesignComponent/StimuliDesignColumn.tsx b/app/components/DesignComponent/StimuliDesignColumn.tsx index 331ec218..f33f8842 100644 --- a/app/components/DesignComponent/StimuliDesignColumn.tsx +++ b/app/components/DesignComponent/StimuliDesignColumn.tsx @@ -4,6 +4,7 @@ import React, { Component } from 'react'; import { Form, Button, Table, Icon } from 'semantic-ui-react'; import { toast } from 'react-toastify'; import * as path from 'path'; +import { isString } from 'lodash'; import { readImages } from '../../utils/filesystem/storage'; import { loadFromSystemDialog } from '../../utils/filesystem/select'; import { FILE_TYPES } from '../../constants/constants'; @@ -14,7 +15,12 @@ interface Props { title: string; response: string; dir: string; - onChange: (arg0: string, arg1: string) => void; + numberImages?: number; + onChange: (arg0: string, arg1: string, arg2: string) => void; +} + +interface State { + numberImages?: number; } const RESPONSE_OPTIONS = new Array(10).fill(0).map((_, i) => ({ @@ -23,7 +29,7 @@ const RESPONSE_OPTIONS = new Array(10).fill(0).map((_, i) => ({ value: i.toString(), })); -export default class StimuliDesignColumn extends Component { +export default class StimuliDesignColumn extends Component { constructor(props: Props) { super(props); this.handleSelectFolder = this.handleSelectFolder.bind(this); @@ -46,7 +52,7 @@ export default class StimuliDesignColumn extends Component { async handleSelectFolder() { const dir = await loadFromSystemDialog(FILE_TYPES.STIMULUS_DIR); - if (dir) { + if (dir && isString(dir)) { const images = readImages(dir); if (images.length < 1) { toast.error('No images in folder!'); @@ -90,13 +96,15 @@ export default class StimuliDesignColumn extends Component { fluid selection value={this.props.response} - onChange={(event, data) => - this.props.onChange( - 'response', - data.value, - `stimulus${this.props.num}` - ) - } + onChange={(event, data) => { + if (data.value && isString(data.value)) { + this.props.onChange( + 'response', + data.value, + `stimulus${this.props.num}` + ); + } + }} placeholder="Select" options={RESPONSE_OPTIONS} /> diff --git a/app/components/EEGExplorationComponent.tsx b/app/components/EEGExplorationComponent.tsx index 02f9e1ea..d427eed7 100644 --- a/app/components/EEGExplorationComponent.tsx +++ b/app/components/EEGExplorationComponent.tsx @@ -7,6 +7,7 @@ import { Image, Divider, } from 'semantic-ui-react'; +import { Observable } from 'rxjs'; import { History } from 'history'; import { PLOTTING_INTERVAL, @@ -20,11 +21,12 @@ import ViewerComponent from './ViewerComponent'; import ConnectModal from './CollectComponent/ConnectModal'; import styles from './styles/common.css'; import { DeviceActions } from '../actions'; +import { SignalQualityData, PipesEpoch } from '../constants/interfaces'; interface Props { history: History; connectedDevice: Record; - signalQualityObservable: any | null | undefined; + signalQualityObservable: Observable; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; diff --git a/app/components/HomeComponent/OverviewComponent.tsx b/app/components/HomeComponent/OverviewComponent.tsx index 2501f9a6..7b4f03d2 100644 --- a/app/components/HomeComponent/OverviewComponent.tsx +++ b/app/components/HomeComponent/OverviewComponent.tsx @@ -8,14 +8,18 @@ import PreviewExperimentComponent from '../PreviewExperimentComponent'; import PreviewButton from '../PreviewButtonComponent'; import { loadProtocol } from '../../utils/labjs/functions'; -const OVERVIEW_STEPS = { - OVERVIEW: 'OVERVIEW', - BACKGROUND: 'BACKGROUND', - PROTOCOL: 'PROTOCOL', -}; +enum OVERVIEW_STEPS { + OVERVIEW = 'OVERVIEW', + BACKGROUND = 'BACKGROUND', + PROTOCOL = 'PROTOCOL', +} interface Props { type: EXPERIMENTS; + protocol: string; + background: string; + background_title: string; + overview: string; onStartExperiment: (arg0: EXPERIMENTS) => void; onCloseOverview: () => void; } @@ -38,7 +42,9 @@ export default class OverviewComponent extends Component { } handleStepClick(step: string) { - this.setState({ activeStep: step }); + if (isEnum(OVERVIEW_STEPS)(step)) { + this.setState({ activeStep: step }); + } } handlePreview(e) { @@ -66,11 +72,10 @@ export default class OverviewComponent extends Component { className={styles.previewWindow} > @@ -141,7 +146,7 @@ export default class OverviewComponent extends Component { steps={OVERVIEW_STEPS} activeStep={this.state.activeStep} onStepClick={this.handleStepClick} - button={ + saveButton={ diff --git a/app/components/CollectComponent/ConnectModal.tsx b/app/components/CollectComponent/ConnectModal.tsx index 5d2313c6..aa18a56a 100644 --- a/app/components/CollectComponent/ConnectModal.tsx +++ b/app/components/CollectComponent/ConnectModal.tsx @@ -10,7 +10,7 @@ import { SCREENS, } from '../../constants/constants'; import styles from '../styles/collect.css'; -import { SignalQualityData, PipesEpoch } from '../../constants/interfaces'; +import { SignalQualityData } from '../../constants/interfaces'; import { DeviceActions } from '../../actions'; interface Props { @@ -18,7 +18,7 @@ interface Props { open: boolean; onClose: () => void; connectedDevice: Record; - signalQualityObservable?: Observable; + signalQualityObservable?: Observable; deviceType: DEVICES; deviceAvailability: DEVICE_AVAILABILITY; connectionStatus: CONNECTION_STATUS; @@ -27,7 +27,7 @@ interface Props { } interface State { - selectedDevice: any | null | undefined; + selectedDevice: any; instructionProgress: INSTRUCTION_PROGRESS; } diff --git a/app/components/CollectComponent/index.tsx b/app/components/CollectComponent/index.tsx index 307cd89d..13b59466 100644 --- a/app/components/CollectComponent/index.tsx +++ b/app/components/CollectComponent/index.tsx @@ -1,6 +1,7 @@ import { Observable } from 'rxjs'; import React, { Component } from 'react'; import { isNil } from 'lodash'; +import { History } from 'history'; import { EXPERIMENTS, DEVICES, @@ -11,6 +12,7 @@ import { Trial, ExperimentParameters, SignalQualityData, + PipesEpoch, } from '../../constants/interfaces'; import PreTestComponent from './PreTestComponent'; import ConnectModal from './ConnectModal'; diff --git a/app/components/DesignComponent/CustomDesignComponent.tsx b/app/components/DesignComponent/CustomDesignComponent.tsx index 4c298c30..152a00e6 100644 --- a/app/components/DesignComponent/CustomDesignComponent.tsx +++ b/app/components/DesignComponent/CustomDesignComponent.tsx @@ -9,7 +9,7 @@ import { Image, Table, } from 'semantic-ui-react'; -import { isNil } from 'lodash'; +import { isNil, isString } from 'lodash'; import { History } from 'history'; import styles from '../styles/common.css'; @@ -158,15 +158,18 @@ export default class CustomDesign extends Component { label={FIELDS.QUESTION} value={this.state.description.question} placeholder="Explain your research question here." - onChange={(event, data) => + onChange={(event, data) => { + if (!isString(data.value)) { + return; + } this.setState({ description: { ...this.state.description, question: data.value, }, saved: false, - }) - } + }); + }} /> @@ -185,15 +188,18 @@ export default class CustomDesign extends Component { label={FIELDS.HYPOTHESIS} value={this.state.description.hypothesis} placeholder="Describe your hypothesis here." - onChange={(event, data) => + onChange={(event, data) => { + if (!isString(data.value)) { + return; + } this.setState({ description: { ...this.state.description, hypothesis: data.value, }, saved: false, - }) - } + }); + }} /> @@ -212,15 +218,18 @@ export default class CustomDesign extends Component { label={FIELDS.METHODS} value={this.state.description.methods} placeholder="Explain how you will design your experiment to answer the question here." - onChange={(event, data) => + onChange={(event, data) => { + if (!isString(data.value)) { + return; + } this.setState({ description: { ...this.state.description, methods: data.value, }, saved: false, - }) - } + }); + }} /> @@ -581,12 +590,15 @@ export default class CustomDesign extends Component { autoHeight value={this.state.params.intro} placeholder="e.g., You will view a series of faces and houses. Press 1 when a face appears and 9 for a house. Press the the space bar on your keyboard to start doing the practice trials. If you want to skip the practice trials and go directly to the task, press the 'q' button on your keyboard." - onChange={(event, data) => + onChange={(event, data) => { + if (!isString(data.value)) { + return; + } this.setState({ params: { ...this.state.params, intro: data.value }, saved: false, - }) - } + }); + }} /> @@ -608,12 +620,15 @@ export default class CustomDesign extends Component { autoHeight value={this.state.params.taskHelp} placeholder="e.g., Press 1 for a face and 9 for a house" - onChange={(event, data) => + onChange={(event, data) => { + if (!isString(data.value)) { + return; + } this.setState({ params: { ...this.state.params, taskHelp: data.value }, saved: false, - }) - } + }); + }} /> diff --git a/app/components/DesignComponent/ParamSlider.tsx b/app/components/DesignComponent/ParamSlider.tsx index c68fa233..30f19671 100644 --- a/app/components/DesignComponent/ParamSlider.tsx +++ b/app/components/DesignComponent/ParamSlider.tsx @@ -1,5 +1,5 @@ import { Segment } from 'semantic-ui-react'; -import React, { PureComponent } from 'react'; +import React from 'react'; import Slider from 'rc-slider'; import styles from '../styles/common.css'; @@ -26,8 +26,8 @@ export const ParamSlider: React.FC = ({ onChange(val * parseInt(msConversion, 10))} defaultValue={1} diff --git a/app/components/DesignComponent/StimuliRow.tsx b/app/components/DesignComponent/StimuliRow.tsx index ea5ea847..a99cc2b2 100644 --- a/app/components/DesignComponent/StimuliRow.tsx +++ b/app/components/DesignComponent/StimuliRow.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { Segment, Form, Button, Table, Dropdown } from 'semantic-ui-react'; +import { isString } from 'lodash'; import styles from '../styles/common.css'; interface Props { @@ -21,25 +22,34 @@ const RESPONSE_OPTIONS = new Array(10).fill(0).map((_, i) => ({ value: i.toString(), })); -export const StimuliRow: React.FC = (props) => { +export const StimuliRow: React.FC = ({ + name, + num, + response, + dir, + condition, + phase, + onChange, + onDelete, +}) => { return ( -
{props.num + 1}.
-
{props.name}
+
{num + 1}.
+
{name}
-
{props.condition}
+
{condition}
- props.onChange(props.num, 'response', data.value) + onChange(num, 'response', isString(data.value) ? data.value : '') } placeholder="Response" options={RESPONSE_OPTIONS} @@ -51,10 +61,10 @@ export const StimuliRow: React.FC = (props) => {
- {props.phase === 'main' ? 'Experimental' : 'Practice'} + {phase === 'main' ? 'Experimental' : 'Practice'}
= (props) => { }} > - props.onChange(props.num, 'phase', 'main')} - > + onChange(num, 'phase', 'main')}>
Experimental
- props.onChange(props.num, 'phase', 'practice')} - > + onChange(num, 'phase', 'practice')}>
Practice
@@ -82,7 +88,7 @@ export const StimuliRow: React.FC = (props) => {