diff --git a/src/.editorconfig b/src/.editorconfig new file mode 100644 index 00000000..874bf8b8 --- /dev/null +++ b/src/.editorconfig @@ -0,0 +1,2 @@ +[*] +end_of_line = lf \ No newline at end of file diff --git a/src/.eslintrc b/src/.eslintrc new file mode 100644 index 00000000..a5a2f9f5 --- /dev/null +++ b/src/.eslintrc @@ -0,0 +1,142 @@ +{ + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } + }, + "extends": [ + "react-app", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "plugin:prettier/recommended", + "plugin:prettier/recommended", + "prettier" + ], + "rules": { + "prettier/prettier": "error", + "react/no-unescaped-entities": 0, + "no-console": "warn", + "quotes": [ + "error", + "single", + { + "avoidEscape": true + } + ], + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn", + "react/react-in-jsx-scope": "off", + "react/display-name": "off", + "import/order": [ + "error", + { + "groups": [ + "builtin", + "external", + "internal", + "parent", + "sibling", + "index", + "unknown" + ], + "pathGroups": [ + { + "pattern": "*.+(css|sass|less|scss|pcss|styl)", + "group": "unknown", + "patternOptions": { + "matchBase": true + }, + "position": "after" + }, + { + "pattern": "*", + "group": "external", + "position": "before" + }, + { + "pattern": "@+/**", + "group": "external", + "position": "before" + }, + { + "pattern": "assets/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "components/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "config/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "fonts/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "hooks/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "modules/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "pages/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "routes/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "services/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "styles/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "tests/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "types/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "utils/**", + "group": "parent", + "position": "before" + } + ], + "pathGroupsExcludedImportTypes": [], + "warnOnUnassignedImports": true, + "newlines-between": "always" + } + ] + }, + "plugins": [ + "react", + "prettier", + "react-hooks", + "@typescript-eslint" + ] +} diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 00000000..79829f37 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,27 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +/public/vs + +# testing +/coverage +.vscode + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +Desktop diff --git a/src/.prettierrc b/src/.prettierrc new file mode 100644 index 00000000..d0f3a4a1 --- /dev/null +++ b/src/.prettierrc @@ -0,0 +1,13 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": true, + "jsxSingleQuote": true, + "quoteProps": "as-needed", + "trailingComma": "all", + "bracketSpacing": true, + "arrowParens": "always", + "endOfLine": "lf" +} diff --git a/src/.storybook/main.js b/src/.storybook/main.js new file mode 100644 index 00000000..059a600e --- /dev/null +++ b/src/.storybook/main.js @@ -0,0 +1,10 @@ +module.exports = { + stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-interactions', + '@storybook/preset-create-react-app', + ], + framework: '@storybook/react', +}; diff --git a/src/.storybook/preview-body.html b/src/.storybook/preview-body.html new file mode 100644 index 00000000..50bdb5b6 --- /dev/null +++ b/src/.storybook/preview-body.html @@ -0,0 +1,10 @@ + diff --git a/src/.storybook/preview-head.html b/src/.storybook/preview-head.html new file mode 100644 index 00000000..6dfff0b4 --- /dev/null +++ b/src/.storybook/preview-head.html @@ -0,0 +1,34 @@ + + + + + + + + + diff --git a/src/.storybook/preview.js b/src/.storybook/preview.js new file mode 100644 index 00000000..d3914580 --- /dev/null +++ b/src/.storybook/preview.js @@ -0,0 +1,9 @@ +export const parameters = { + actions: { argTypesRegex: '^on[A-Z].*' }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, +}; diff --git a/src/aim_ui/VERSION b/src/aim_ui/VERSION new file mode 120000 index 00000000..d62dc733 --- /dev/null +++ b/src/aim_ui/VERSION @@ -0,0 +1 @@ +../../../VERSION \ No newline at end of file diff --git a/src/aim_ui/__init__.py b/src/aim_ui/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/aim_ui/build b/src/aim_ui/build new file mode 120000 index 00000000..ab180172 --- /dev/null +++ b/src/aim_ui/build @@ -0,0 +1 @@ +../build \ No newline at end of file diff --git a/src/config-overrides.js b/src/config-overrides.js new file mode 100644 index 00000000..83e5fdfb --- /dev/null +++ b/src/config-overrides.js @@ -0,0 +1,56 @@ +const webpack = require('webpack'); +const WebpackDynamicPublicPathPlugin = require('webpack-dynamic-public-path'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); + +module.exports = { + webpack: function (config, webpackEnv) { + const isEnvProduction = webpackEnv === 'production'; + + // Optimization Overrides + config.optimization.splitChunks = { + cacheGroups: { + default: false, + }, + }; + config.optimization.runtimeChunk = true; + + // Output Overrides. + if (isEnvProduction) { + // JS static filenames overrides. + config.output.filename = 'static/js/[name].js?version=[contenthash]'; + config.output.chunkFilename = 'static/js/[name].js?version=[contenthash]'; + } + + // Plugins Overrides. + if (isEnvProduction) { + // CSS static filenames overrides. + config.plugins.forEach((plugin, index) => { + if (plugin instanceof MiniCssExtractPlugin) { + // remove the existing MiniCssExtractPlugin and add new one + config.plugins.splice( + index, + 1, + new MiniCssExtractPlugin({ + filename: 'static/css/[name].css?version=[contenthash]', + chunkFilename: 'static/css/[name].css?version=[contenthash]', + }), + ); + } + }); + } + + // Add external variable for base path support. + config.plugins.push( + new WebpackDynamicPublicPathPlugin({ + externalPublicPath: 'window.externalPublicPath', + }), + ); + + config.plugins.push( + new webpack.DefinePlugin({ + __DEV__: !isEnvProduction, + }), + ); + return config; + }, +}; diff --git a/src/package-lock.json b/src/package-lock.json new file mode 100755 index 00000000..5f23879b --- /dev/null +++ b/src/package-lock.json @@ -0,0 +1,66363 @@ +{ + "name": "ui_v2", + "version": "3.17.5", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "ui_v2", + "version": "3.17.5", + "hasInstallScript": true, + "dependencies": { + "@aksel/structjs": "^1.0.0", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^4.0.0-alpha.60", + "@monaco-editor/react": "4.4.4", + "@radix-ui/primitive": "^1.0.0", + "@radix-ui/react-checkbox": "^1.0.1", + "@radix-ui/react-dialog": "^1.0.2", + "@radix-ui/react-popover": "^1.0.2", + "@radix-ui/react-radio-group": "^1.1.0", + "@radix-ui/react-separator": "^1.0.1", + "@radix-ui/react-slider": "^1.1.0", + "@radix-ui/react-slot": "^1.0.1", + "@radix-ui/react-switch": "^1.0.1", + "@radix-ui/react-toast": "^1.1.2", + "@radix-ui/react-tooltip": "^1.0.3", + "@stitches/react": "^1.2.8", + "@storybook/react": "^6.5.12", + "@tabler/icons-react": "^2.2.0", + "@uiw/react-textarea-code-editor": "^1.4.14", + "antd": "^4.23.6", + "bs58check": "^2.1.2", + "classnames": "^2.3.1", + "comlink": "^4.3.1", + "d3": "^7.0.0", + "dot-object": "^2.1.4", + "file-saver": "^2.0.5", + "formik": "^2.2.9", + "highcharts": "^9.3.1", + "highcharts-react-official": "^3.1.0", + "history": "^5.3.0", + "humanize-duration": "^3.27.0", + "immer": "^9.0.16", + "js-cookie": "^3.0.5", + "lodash-es": "^4.17.21", + "marked": "^4.1.1", + "material-ui-audio-player": "^1.7.1", + "md5": "^2.3.0", + "memoize-one": "^5.2.1", + "moment": "^2.29.4", + "monaco-editor": "^0.33.0", + "plotly.js": "^2.7.0", + "prop-types": "^15.7.2", + "prosemirror-tables": "^1.1.1", + "react": "^17.0.2", + "react-accessible-dropdown-menu-hook": "^3.1.0", + "react-beautiful-dnd": "^13.1.0", + "react-dom": "^17.0.2", + "react-plotly.js": "^2.5.1", + "react-router-dom": "^5.3.0", + "react-scripts": "4.0.3", + "react-select": "^5.5.4", + "react-split": "^2.0.14", + "react-virtualized": "^9.22.3", + "react-virtualized-auto-sizer": "^1.0.5", + "react-virtualized-tree": "^3.4.1", + "react-window": "^1.8.6", + "rich-markdown-editor": "^11.21.3", + "styled-components": "^5.3.3", + "typeface-roboto": "^1.1.13", + "web-vitals": "^1.0.1", + "yup": "^0.32.9", + "zustand": "^4.1.1" + }, + "devDependencies": { + "@storybook/addon-actions": "^6.5.12", + "@storybook/addon-essentials": "^6.5.12", + "@storybook/addon-interactions": "^6.5.12", + "@storybook/addon-links": "^6.5.12", + "@storybook/builder-webpack4": "^6.5.12", + "@storybook/manager-webpack4": "^6.5.12", + "@storybook/node-logger": "^6.5.12", + "@storybook/preset-create-react-app": "^3.2.0", + "@storybook/testing-library": "^0.0.13", + "@testing-library/jest-dom": "^5.11.4", + "@testing-library/react": "^11.1.0", + "@testing-library/react-hooks": "^7.0.2", + "@testing-library/user-event": "^12.1.10", + "@types/bs58check": "^2.1.0", + "@types/d3": "^7.0.0", + "@types/dot-object": "^2.1.2", + "@types/file-saver": "^2.0.3", + "@types/history": "^5.0.0", + "@types/humanize-duration": "^3.25.1", + "@types/jest": "^26.0.15", + "@types/js-cookie": "^3.0.6", + "@types/lodash-es": "^4.17.4", + "@types/marked": "^4.0.7", + "@types/md5": "^2.3.1", + "@types/node": "^12.0.0", + "@types/node-sass": "^4.11.2", + "@types/react": "^17.0.0", + "@types/react-beautiful-dnd": "^13.1.1", + "@types/react-dom": "^17.0.0", + "@types/react-plotly.js": "^2.5.0", + "@types/react-router-dom": "^5.1.7", + "@types/react-virtualized-auto-sizer": "^1.0.1", + "@types/react-window": "^1.8.4", + "@types/storybook__react": "^5.2.1", + "@types/styled-components": "^5.1.15", + "@typescript-eslint/eslint-plugin": "^4.28.0", + "@typescript-eslint/parser": "^4.28.0", + "comlink-loader": "^2.0.0", + "eslint": "^7.29.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-react": "^7.24.0", + "eslint-plugin-react-hooks": "^4.2.0", + "gzipper": "^5.0.1", + "husky": "^6.0.0", + "jest-canvas-mock": "^2.3.1", + "jss-plugin-template": "^10.7.1", + "lint-staged": "^11.0.0", + "node-sass": "^6.0.1", + "prettier": "2.3.1", + "prettier-eslint": "^12.0.0", + "progress-bar-webpack-plugin": "^2.1.0", + "react-app-rewired": "^2.1.8", + "sass": "^1.38.1", + "typescript": "^4.3.4", + "webpack-bundle-analyzer": "^4.4.2", + "webpack-dynamic-public-path": "^1.0.8", + "yargs": "^17.2.1" + } + }, + "node_modules/@aksel/structjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aksel/structjs/-/structjs-1.0.0.tgz", + "integrity": "sha512-7BuOlCj7bS09Gr/uJFrKJVWaZqTSOoK2eUuqUebAZq5cALZP6eNz5K5cbprYNX6KBFGMnR+CeSmZk/DjVo3ecg==", + "dependencies": { + "npm-name": "^5.0.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.0.tgz", + "integrity": "sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.9.4" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", + "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + }, + "node_modules/@ant-design/react-slick": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.29.2.tgz", + "integrity": "sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "lodash": "^4.17.21", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "dependencies": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/generator/node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dependencies": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", + "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dependencies": { + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", + "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-decorators": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz", + "integrity": "sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-default-from": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz", + "integrity": "sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz", + "integrity": "sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", + "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", + "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-flow": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", + "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz", + "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz", + "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.5.tgz", + "integrity": "sha512-M/fmDX6n0cfHK/NLTcPmrfVAORKDhK8tyjDhyxlUjYyPYYO8FRWwuxBA3WBx8kWN/uBUuwGa3s/0+hQ9JIN3Tg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", + "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "dependencies": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz", + "integrity": "sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.18.6.tgz", + "integrity": "sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-flow-strip-types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-flow/node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz", + "integrity": "sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-flow": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", + "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz", + "integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.5", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz", + "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==", + "dependencies": { + "core-js-pure": "^3.15.0", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@base2/pretty-print-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", + "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==" + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "node_modules/@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "dependencies": { + "commander": "^2.15.1" + }, + "bin": { + "findup": "bin/findup.js" + } + }, + "node_modules/@choojs/findup/node_modules/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==" + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@csstools/normalize.css": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", + "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", + "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@design-systems/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@design-systems/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-Y/d2Zzr+JJfN6u1gbuBUb1ufBuLMJJRZQk+dRmw8GaTpqKx5uf7cGUYGTwN02dIb3I+Tf+cW8jcGBTRiFxdYFg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.11.2", + "clsx": "^1.0.4", + "focus-lock": "^0.8.0", + "react-merge-refs": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": ">= 16.8.6", + "react-dom": ">= 16.8.6" + } + }, + "node_modules/@devtools-ds/object-inspector": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/object-inspector/-/object-inspector-1.2.0.tgz", + "integrity": "sha512-VztcwqVwScSvYdvJVZBJYsVO/2Pew3JPpFV3T9fuCHQLlHcLYOV3aU/kBS2ScuE2O1JN0ZbobLqFLa3vQF54Fw==", + "dev": true, + "dependencies": { + "@babel/runtime": "7.7.2", + "@devtools-ds/object-parser": "^1.2.0", + "@devtools-ds/themes": "^1.2.0", + "@devtools-ds/tree": "^1.2.0", + "clsx": "1.1.0" + }, + "peerDependencies": { + "react": ">= 16.8.6" + } + }, + "node_modules/@devtools-ds/object-inspector/node_modules/@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/@devtools-ds/object-inspector/node_modules/clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@devtools-ds/object-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/object-parser/-/object-parser-1.2.0.tgz", + "integrity": "sha512-SjGGyiFFY8dtUpiWXAvRSzRT+hE11EAAysrq2PsC/GVLf2ZLyT2nHlQO5kDStywyTz+fjw7S7pyDRj1HG9YTTA==", + "dev": true, + "dependencies": { + "@babel/runtime": "~7.5.4" + } + }, + "node_modules/@devtools-ds/object-parser/node_modules/@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/@devtools-ds/themes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/themes/-/themes-1.2.0.tgz", + "integrity": "sha512-LimEITorE6yWZWWuMc6OiBfLQgPrQqWbyMEmfRUDPa3PHXoAY4SpDxczfg31fgyRDUNWnZhjaJH5bBbu8VEbIw==", + "dev": true, + "dependencies": { + "@babel/runtime": "~7.5.4", + "@design-systems/utils": "2.12.0", + "clsx": "1.1.0" + }, + "peerDependencies": { + "react": ">= 16.8.6" + } + }, + "node_modules/@devtools-ds/themes/node_modules/@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/@devtools-ds/themes/node_modules/clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@devtools-ds/tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/tree/-/tree-1.2.0.tgz", + "integrity": "sha512-hC4g4ocuo2eg7jsnzKdauxH0sDQiPW3KSM2+uK3kRgcmr9PzpBD5Kob+Y/WFSVKswFleftOGKL4BQLuRv0sPxA==", + "dev": true, + "dependencies": { + "@babel/runtime": "7.7.2", + "@devtools-ds/themes": "^1.2.0", + "clsx": "1.1.0" + }, + "peerDependencies": { + "react": ">= 16.8.6" + } + }, + "node_modules/@devtools-ds/tree/node_modules/@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/@devtools-ds/tree/node_modules/clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", + "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "dependencies": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "node_modules/@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/serialize/node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "node_modules/@emotion/serialize/node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, + "node_modules/@emotion/serialize/node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "node_modules/@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@floating-ui/core": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz", + "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==" + }, + "node_modules/@floating-ui/dom": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz", + "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==", + "dependencies": { + "@floating-ui/core": "^0.7.3" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz", + "integrity": "sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==", + "dependencies": { + "@floating-ui/dom": "^0.5.3", + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'" + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" + }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "deprecated": "Switch to 'npm install joi'", + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, + "node_modules/@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==", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dependencies": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dependencies": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "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.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dependencies": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "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.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz", + "integrity": "sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA==", + "dependencies": { + "get-stream": "^6.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "geojson-rewind": "geojson-rewind" + } + }, + "node_modules/@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==" + }, + "node_modules/@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=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@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==", + "peerDependencies": { + "mapbox-gl": ">=0.32.1 <2.0.0" + } + }, + "node_modules/@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=" + }, + "node_modules/@mapbox/rehype-prism": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@mapbox/rehype-prism/-/rehype-prism-0.8.0.tgz", + "integrity": "sha512-bIz4a3oZ8g+pQBHSMMIxNpYOMX4yq4aZdpezoiCl9yJudh1Z9SRmHQqH6f+WtTBNOORzXMEGkvBze4PiH17wtA==", + "dependencies": { + "hast-util-to-string": "^1.0.4", + "mrm": "^3.0.9", + "refractor": "^3.4.0", + "unist-util-visit": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", + "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4=" + }, + "node_modules/@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==", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/@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==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@material-ui/core": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.2.tgz", + "integrity": "sha512-Q1npB8V73IC+eV2X6as+g71MpEGQwqKHUI2iujY62npk35V8nMx/bUXAHjv5kKG1BZ8s8XUWoG6s/VkjYPjjQA==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/icons": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", + "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", + "dependencies": { + "@babel/runtime": "^7.4.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@material-ui/core": "^4.0.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/lab": { + "version": "4.0.0-alpha.60", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.60.tgz", + "integrity": "sha512-fadlYsPJF+0fx2lRuyqAuJj7hAS1tLDdIEEdov5jlrpb5pp4b+mRDUqQTUxi4inRZHS1bEXpU8QWUhO6xX88aA==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@material-ui/core": "^4.12.1", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/styles": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/system": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@mdx-js/mdx/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/@mdx-js/mdx/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@mdx-js/mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/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==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + } + }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@monaco-editor/loader": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.3.2.tgz", + "integrity": "sha512-BTDbpHl3e47r3AAtpfVFTlAi7WXv4UQ/xZmz8atKl4q7epQV5e7+JbigFDViWF71VBi4IIBdcWP57Hj+OWuc9g==", + "dependencies": { + "state-local": "^1.0.6" + }, + "peerDependencies": { + "monaco-editor": ">= 0.21.0 < 1" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.4.4.tgz", + "integrity": "sha512-yQsYnVkgP5RC5ZMoRVCXSBn4D4hLUOgoQK+AZJpVY57NDXmEb57OVaaYKh8/RTzxkpuLV278hKNw5DnuzlgQwg==", + "dependencies": { + "@monaco-editor/loader": "^1.3.1", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@mrmlnc/readdir-enhanced/node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@plotly/d3": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.0.tgz", + "integrity": "sha512-L10iHgzvw3uSic/nQpYehlNzxUQvImwms5U7S95pJAEhrllzkrdQNy1Mc5DW9ab881Yr4fh300gJztKXWZDfkQ==" + }, + "node_modules/@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==", + "dependencies": { + "d3-array": "1", + "d3-collection": "1", + "d3-shape": "^1.2.0" + } + }, + "node_modules/@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==", + "dependencies": { + "d3-array": "^1.2.1", + "d3-collection": "^1.0.4", + "d3-shape": "^1.2.0", + "elementary-circuits-directed-graph": "^1.0.4" + } + }, + "node_modules/@plotly/d3-sankey-circular/node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/@plotly/d3-sankey-circular/node_modules/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==" + }, + "node_modules/@plotly/d3-sankey-circular/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/@plotly/d3-sankey/node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/@plotly/d3-sankey/node_modules/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==" + }, + "node_modules/@plotly/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/@plotly/point-cluster": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", + "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==", + "dependencies": { + "array-bounds": "^1.0.1", + "binary-search-bounds": "^2.0.4", + "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" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", + "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", + "dependencies": { + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.x" + }, + "peerDependencies": { + "@types/webpack": "4.x", + "react-refresh": ">=0.8.3 <0.10.0", + "sockjs-client": "^1.4.0", + "type-fest": "^0.13.1", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.20", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.20.tgz", + "integrity": "sha512-88p7+M0QGxKpmnkfXjS4V26AnoC/eiqZutE8GLdaI5X12NY75bXSdTY9NkmYb2Xyk1O+MmkuO6Frmsj84V6I8Q==", + "dev": true + }, + "node_modules/@radix-ui/number": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", + "integrity": "sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.1.tgz", + "integrity": "sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.0.1.tgz", + "integrity": "sha512-TisH0B8hWmYP3ONRduYCyN04rR9yLPIw/Rwyn1RoC1suSoGCa8Wn+YPdSSSarSszeIbcg3p2lBkDp2XXit4sZw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.1.tgz", + "integrity": "sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", + "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", + "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.2.tgz", + "integrity": "sha512-EKxxp2WNSmUPkx4trtWNmZ4/vAYEg7JkAfa1HKBUnaubw9eHzf1Orr9B472lJYaYz327RHDrd4R95fsw7VR8DA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz", + "integrity": "sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz", + "integrity": "sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.2" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", + "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.1.tgz", + "integrity": "sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", + "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.2.tgz", + "integrity": "sha512-4tqZEl9w95R5mlZ/sFdgBnfhCBOEPepLIurBA5kt/qaAhldJ1tNQd0ngr0ET0AHbPotT4mwxMPr7a+MA/wbK0g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.0.1", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.1.tgz", + "integrity": "sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.1.tgz", + "integrity": "sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.1.0.tgz", + "integrity": "sha512-7rrkZCXu0Q7oC0MxCm497X1DdV/tI78oNIGXA8sDbCkboiTkuLSe728zCCpRYHw+9PifHIx86nsbITPEq5yijg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-roving-focus": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.1.tgz", + "integrity": "sha512-TB76u5TIxKpqMpUAuYH2VqMhHYKa+4Vs1NHygo/llLvlffN6mLVsFhz0AnSFlSBAvTBYVHYAkHAyEt7x1gPJOA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.1.tgz", + "integrity": "sha512-uc6Izot0D8uVz6T2nSb/HI7OaxkeaD50GgKr3W6HORnbfGVrG7LWuy+g6Fd58n8wHbrRblSYJZEfcjgymMlJjw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.1.0.tgz", + "integrity": "sha512-5H/QB4xD3GF9UfoSCVLBx2JjlXamMcmTyL6gr4kkd/MiAGaYB0W7Exi4MQa0tJApBFJe+KmS5InKCI56p2kmjA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.0", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", + "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.0.1.tgz", + "integrity": "sha512-tTxGluMtwrc5ffgAiOSMrYIx0r3vSTcgM4Vl8rqfpXcHt6ryB9B0OlFKUOiDpKASXlhvzfHf4Y0AYKJdpzjL8w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.2.tgz", + "integrity": "sha512-Kpr4BBYoP0O5A1UeDBmao87UnCMNdAKGNioQH5JzEm6OYTUVGhuDRbOwoZxPwOZ6vsjJHeIpdUrwbiHEB65CCw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.3.tgz", + "integrity": "sha512-cmc9qV4KpgqdXVTn1K8KN8MnuSXvw+E719pKwyvpCGrQ+0AA2qTjcIL3uxCj4jc4k3sDR36RF7R3H7N5hPybBQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.1.0", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.0.tgz", + "integrity": "sha512-07U7jpI0dZcLRAxT7L9qs6HecSoPhDSJybF7mEGHJDBDv+ZoGCvIlva0s+WxMXwJEav+ckX3hAlXBtnHmuvlCQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.2.tgz", + "integrity": "sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.0.tgz", + "integrity": "sha512-RG2K8z/K7InnOKpq6YLDmT49HGjNmrK+fr82UCVKT2sW0GYfVnYp4wZWBooT/EYfQ5faA9uIjvsuMMhH61rheg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz", + "integrity": "sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz", + "integrity": "sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.1.tgz", + "integrity": "sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.0.tgz", + "integrity": "sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.0.tgz", + "integrity": "sha512-tbXM9SB1r5FOuZjRCljERFByFiEUcMmCWMXLog/NmgCzlAzreXyf23Vei3ZpSMxSMavzPnhCovfZjZdmxS3d1w==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "dependencies": { + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@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==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@stitches/react": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz", + "integrity": "sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==", + "peerDependencies": { + "react": ">= 16.3.0" + } + }, + "node_modules/@storybook/addon-actions": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.5.13.tgz", + "integrity": "sha512-3Tji0gIy95havhTpSc6CsFl5lNxGn4O5Y1U9fyji+GRkKqDFOrvVLYAHPtLOpYdEI5tF0bDo+akiqfDouY8+eA==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "polished": "^4.2.2", + "prop-types": "^15.7.2", + "react-inspector": "^5.1.0", + "regenerator-runtime": "^0.13.7", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "uuid-browser": "^3.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-backgrounds": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.13.tgz", + "integrity": "sha512-b4JX7JMY7e50y1l6g71D+2XWV3GO0TO2z1ta8J6W4OQt8f44V7sSkRQaJUzXdLjQMrA+Anojuy1ZwPjVeLC6vg==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-controls": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.5.13.tgz", + "integrity": "sha512-lYq3uf2mlVevm0bi6ueL3H6TpUMRYW9s/pTNTVJT225l27kLdFR9wEKxAkCBrlKaTgDLJmzzDRsJE3NLZlR/5Q==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/node-logger": "6.5.13", + "@storybook/store": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-docs": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.5.13.tgz", + "integrity": "sha512-RG/NjsheD9FixZ789RJlNyNccaR2Cuy7CtAwph4oUNi3aDFjtOI8Oe9L+FOT7qtVnZLw/YMjF+pZxoDqJNKLPw==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@jest/transform": "^26.6.2", + "@mdx-js/react": "^1.6.22", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/docs-tools": "6.5.13", + "@storybook/mdx1-csf": "^0.0.1", + "@storybook/node-logger": "6.5.13", + "@storybook/postinstall": "6.5.13", + "@storybook/preview-web": "6.5.13", + "@storybook/source-loader": "6.5.13", + "@storybook/store": "6.5.13", + "@storybook/theming": "6.5.13", + "babel-loader": "^8.0.0", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "regenerator-runtime": "^0.13.7", + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@storybook/mdx2-csf": "^0.0.3", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@storybook/mdx2-csf": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-essentials": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.5.13.tgz", + "integrity": "sha512-G9FVAWV7ixjVLWeLgIX+VT90tcAk6yQxfZQegfg5ucRilGysJCDaNnoab4xuuvm1R40TfFhba3iAGZtQYsddmw==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "6.5.13", + "@storybook/addon-backgrounds": "6.5.13", + "@storybook/addon-controls": "6.5.13", + "@storybook/addon-docs": "6.5.13", + "@storybook/addon-measure": "6.5.13", + "@storybook/addon-outline": "6.5.13", + "@storybook/addon-toolbars": "6.5.13", + "@storybook/addon-viewport": "6.5.13", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/node-logger": "6.5.13", + "core-js": "^3.8.2", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@babel/core": "^7.9.6" + }, + "peerDependenciesMeta": { + "@storybook/angular": { + "optional": true + }, + "@storybook/builder-manager4": { + "optional": true + }, + "@storybook/builder-manager5": { + "optional": true + }, + "@storybook/builder-webpack4": { + "optional": true + }, + "@storybook/builder-webpack5": { + "optional": true + }, + "@storybook/html": { + "optional": true + }, + "@storybook/vue": { + "optional": true + }, + "@storybook/vue3": { + "optional": true + }, + "@storybook/web-components": { + "optional": true + }, + "lit": { + "optional": true + }, + "lit-html": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "svelte": { + "optional": true + }, + "sveltedoc-parser": { + "optional": true + }, + "vue": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-interactions": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-6.5.13.tgz", + "integrity": "sha512-FPOeS7AT/Odxl6z7E0qYI4F0Sh06jFRttRvSgpKC5P2lYUWUstLP5TC8N+F5ijBeLfIdIsf5zBK7l5Y/cluueg==", + "dev": true, + "dependencies": { + "@devtools-ds/object-inspector": "^1.1.2", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/instrumenter": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "jest-mock": "^27.0.6", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-interactions/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@storybook/addon-links": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.5.13.tgz", + "integrity": "sha512-K/LYYu9R/Xoah5h9MNh4mSHOic3q5csqjderLqr2YW/KPYiuNubgvzEbAAbzI5xq5JrtAZqnINrZUv2A4CyYbQ==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.13", + "@types/qs": "^6.9.5", + "core-js": "^3.8.2", + "global": "^4.4.0", + "prop-types": "^15.7.2", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-links/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/addon-measure": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.5.13.tgz", + "integrity": "sha512-pi5RFB9YTnESRFtYHAVRUrgEI5to0TFc4KndtwcCKt1fMJ8OFjXQeznEfdj95PFeUvW5TNUwjL38vK4LhicB+g==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-outline": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.5.13.tgz", + "integrity": "sha512-8d8taPheO/tryflzXbj2QRuxHOIS8CtzRzcaglCcioqHEMhOIDOx9BdXKdheq54gdk/UN94HdGJUoVxYyXwZ4Q==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-toolbars": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.5.13.tgz", + "integrity": "sha512-Qgr4wKRSP+gY1VaN7PYT4TM1um7KY341X3GHTglXLFHd8nDsCweawfV2shaX3WxCfZmVro8g4G+Oest30kLLCw==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-viewport": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.5.13.tgz", + "integrity": "sha512-KSfeuCSIjncwWGnUu6cZBx8WNqYvm5gHyFvkSPKEu0+MJtgncbUy7pl53lrEEr6QmIq0GRXvS3A0XzV8RCnrSA==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "prop-types": "^15.7.2", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addons": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.13.tgz", + "integrity": "sha512-18CqzNnrGMfeZtiKz+R/3rHtSNnfNwz6y6prIQIbWseK16jY8ELTfIFGviwO5V2OqpbHDQi5+xQQ63QAIb89YA==", + "dependencies": { + "@storybook/api": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.13", + "@storybook/theming": "6.5.13", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/api": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.13.tgz", + "integrity": "sha512-xVSmB7/IuFd6G7eiJjbI2MuS7SZunoUM6d+YCWpjiehfMeX47MXt1gZtOwFrgJC1ShZlefXFahq/dvxwtmWs+w==", + "dependencies": { + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/builder-webpack4": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.5.13.tgz", + "integrity": "sha512-Agqy3IKPv3Nl8QqdS7PjtqLp+c0BD8+/3A2ki/YfKqVz+F+J34EpbZlh3uU053avm1EoNQHSmhZok3ZlWH6O7A==", + "dependencies": { + "@babel/core": "^7.12.10", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/preview-web": "6.5.13", + "@storybook/router": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.5.13", + "@storybook/theming": "6.5.13", + "@storybook/ui": "6.5.13", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/webpack": "^4.41.26", + "autoprefixer": "^9.8.6", + "babel-loader": "^8.0.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "core-js": "^3.8.2", + "css-loader": "^3.6.0", + "file-loader": "^6.2.0", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^4.1.6", + "glob": "^7.1.6", + "glob-promise": "^3.4.0", + "global": "^4.4.0", + "html-webpack-plugin": "^4.0.0", + "pnp-webpack-plugin": "1.6.4", + "postcss": "^7.0.36", + "postcss-flexbugs-fixes": "^4.2.1", + "postcss-loader": "^4.2.0", + "raw-loader": "^4.0.2", + "stable": "^0.1.8", + "style-loader": "^1.3.0", + "terser-webpack-plugin": "^4.2.3", + "ts-dedent": "^2.0.0", + "url-loader": "^4.1.1", + "util-deprecate": "^1.0.2", + "webpack": "4", + "webpack-dev-middleware": "^3.7.3", + "webpack-filter-warnings-plugin": "^1.2.1", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.2.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "node_modules/@storybook/builder-webpack4/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/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==", + "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" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/css-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/css-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/postcss-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/postcss-loader/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/channel-postmessage": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.5.13.tgz", + "integrity": "sha512-R79MBs0mQ7TV8M/a6x/SiTRyvZBidDfMEEthG7Cyo9p35JYiKOhj2535zhW4qlVMESBu95pwKYBibTjASoStPw==", + "dependencies": { + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "qs": "^6.10.0", + "telejson": "^6.0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/channel-postmessage/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/channel-websocket": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.5.13.tgz", + "integrity": "sha512-kwh667H+tzCiNvs92GNwYOwVXdj9uHZyieRAN5rJtTBJ7XgLzGkpTEU50mWlbc0nDKhgE0qYvzyr5H393Iy5ug==", + "dependencies": { + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "telejson": "^6.0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/channels": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.13.tgz", + "integrity": "sha512-sGYSilE30bz0jG+HdHnkv0B4XkAv2hP+KRZr4xmnv+MOOQpRnZpJ5Z3HVU16s17cj/83NWihKj6BuKcEVzyilg==", + "dependencies": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/client-api": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.5.13.tgz", + "integrity": "sha512-uH1mAWbidPiuuTdMUVEiuaNOfrYXm+9QLSP1MMYTKULqEOZI5MSOGkEDqRfVWxbYv/iWBOPTQ+OM9TQ6ecYacg==", + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.13", + "@types/qs": "^6.9.5", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/client-api/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/client-logger": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.13.tgz", + "integrity": "sha512-F2SMW3LWFGXLm2ENTwTitrLWJgmMXRf3CWQXdN2EbkNCIBHy5Zcbt+91K4OX8e2e5h9gjGfrdYbyYDYOoUCEfA==", + "dependencies": { + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/components": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.5.13.tgz", + "integrity": "sha512-6Hhx70JK5pGfKCkqMU4yq/BBH+vRTmzj7tZKfPwba+f8VmTMoOr/2ysTQFRtXryiHB6Z15xBYgfq5x2pIwQzLQ==", + "dependencies": { + "@storybook/client-logger": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/components/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/core": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.5.13.tgz", + "integrity": "sha512-kw1lCgbsxzUimGww6t5rmuWJmFPe9kGGyzIqvj4RC4BBcEsP40LEu9XhSfvnb8vTOLIULFZeZpdRFfJs4TYbUw==", + "dependencies": { + "@storybook/core-client": "6.5.13", + "@storybook/core-server": "6.5.13" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "webpack": "*" + }, + "peerDependenciesMeta": { + "@storybook/builder-webpack5": { + "optional": true + }, + "@storybook/manager-webpack5": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/core-client": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.5.13.tgz", + "integrity": "sha512-YuELbRokTBdqjbx/R4/7O4rou9kvbBIOJjlUkor9hdLLuJ3P0yGianERGNkZFfvcfMBAxU0p52o7QvDldSR3kA==", + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/channel-websocket": "6.5.13", + "@storybook/client-api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/preview-web": "6.5.13", + "@storybook/store": "6.5.13", + "@storybook/ui": "6.5.13", + "airbnb-js-shims": "^2.2.1", + "ansi-to-html": "^0.6.11", + "core-js": "^3.8.2", + "global": "^4.4.0", + "lodash": "^4.17.21", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "unfetch": "^4.2.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "webpack": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/core-client/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/core-common": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.5.13.tgz", + "integrity": "sha512-+DVZrRsteE9pw0X5MNffkdBgejQnbnL+UOG3qXkE9xxUamQALnuqS/w1BzpHE9WmOHuf7RWMKflyQEW3OLKAJg==", + "dependencies": { + "@babel/core": "^7.12.10", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-decorators": "^7.12.12", + "@babel/plugin-proposal-export-default-from": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-private-property-in-object": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.12", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/preset-env": "^7.12.11", + "@babel/preset-react": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@babel/register": "^7.12.1", + "@storybook/node-logger": "6.5.13", + "@storybook/semver": "^7.3.2", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/pretty-hrtime": "^1.0.0", + "babel-loader": "^8.0.0", + "babel-plugin-macros": "^3.0.1", + "babel-plugin-polyfill-corejs3": "^0.1.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "express": "^4.17.1", + "file-system-cache": "^1.0.5", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.0.4", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "handlebars": "^4.7.7", + "interpret": "^2.2.0", + "json5": "^2.1.3", + "lazy-universal-dotenv": "^3.0.1", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "webpack": "4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/core-common/node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@storybook/core-common/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/core-common/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", + "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@storybook/core-common/node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/core-common/node_modules/@babel/plugin-proposal-decorators": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.2.tgz", + "integrity": "sha512-nkBH96IBmgKnbHQ5gXFrcmez+Z9S2EIDKDQGp005ROqBigc88Tky4rzCnlP/lnlj245dCEQl4/YyV0V1kYh5dw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/plugin-syntax-decorators": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@storybook/core-common/node_modules/@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@storybook/core-common/node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "node_modules/@storybook/core-common/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@storybook/core-common/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", + "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.1.5", + "core-js-compat": "^3.8.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@storybook/core-common/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/core-common/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-common/node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/@storybook/core-common/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-common/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-common/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-common/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-common/node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/core-common/node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/core-common/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-common/node_modules/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==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@storybook/core-events": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.13.tgz", + "integrity": "sha512-kL745tPpRKejzHToA3/CoBNbI+NPRVk186vGxXBmk95OEg0TlwgQExP8BnqEtLlRZMbW08e4+6kilc1M1M4N5w==", + "dependencies": { + "core-js": "^3.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.5.13.tgz", + "integrity": "sha512-vs7tu3kAnFwuINio1p87WyqDNlFyZESmeh9s7vvrZVbe/xS/ElqDscr9DT5seW+jbtxufAaHsx+JUTver1dheQ==", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.3", + "@storybook/builder-webpack4": "6.5.13", + "@storybook/core-client": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/csf-tools": "6.5.13", + "@storybook/manager-webpack4": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.5.13", + "@storybook/telemetry": "6.5.13", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/node-fetch": "^2.5.7", + "@types/pretty-hrtime": "^1.0.0", + "@types/webpack": "^4.41.26", + "better-opn": "^2.1.1", + "boxen": "^5.1.2", + "chalk": "^4.1.0", + "cli-table3": "^0.6.1", + "commander": "^6.2.1", + "compression": "^1.7.4", + "core-js": "^3.8.2", + "cpy": "^8.1.2", + "detect-port": "^1.3.0", + "express": "^4.17.1", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "globby": "^11.0.2", + "ip": "^2.0.0", + "lodash": "^4.17.21", + "node-fetch": "^2.6.7", + "open": "^8.4.0", + "pretty-hrtime": "^1.0.3", + "prompts": "^2.4.0", + "regenerator-runtime": "^0.13.7", + "serve-favicon": "^2.5.0", + "slash": "^3.0.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "watchpack": "^2.2.0", + "webpack": "4", + "ws": "^8.2.3", + "x-default-browser": "^0.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@storybook/builder-webpack5": { + "optional": true + }, + "@storybook/manager-webpack5": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/core-server/node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "node_modules/@storybook/core-server/node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/@storybook/core-server/node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/core-server/node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-server/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@storybook/core-server/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/@storybook/core-server/node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-server/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-server/node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@storybook/core-server/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-server/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@storybook/csf": { + "version": "0.0.2--canary.4566f4d.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", + "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/@storybook/csf-tools": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.5.13.tgz", + "integrity": "sha512-63Ev+VmBqzwSwfUzbuXOLKBD5dMTK2zBYLQ9anTVw70FuTikwTsGIbPgb098K0vsxRCgxl7KM7NpivHqtZtdjw==", + "dependencies": { + "@babel/core": "^7.12.10", + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@babel/traverse": "^7.12.11", + "@babel/types": "^7.12.11", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/mdx1-csf": "^0.0.1", + "core-js": "^3.8.2", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@storybook/mdx2-csf": "^0.0.3" + }, + "peerDependenciesMeta": { + "@storybook/mdx2-csf": { + "optional": true + } + } + }, + "node_modules/@storybook/csf-tools/node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@storybook/csf-tools/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/docs-tools": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-6.5.13.tgz", + "integrity": "sha512-hB+hk+895ny4SW84j3X5iV55DHs3bCfTOp7cDdcZJdQrlm0wuDb4A6d4ffNC7ZLh9VkUjU6ST4VEV5Bb0Cptow==", + "dependencies": { + "@babel/core": "^7.12.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.13", + "core-js": "^3.8.2", + "doctrine": "^3.0.0", + "lodash": "^4.17.21", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/docs-tools/node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@storybook/docs-tools/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/instrumenter": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-6.5.13.tgz", + "integrity": "sha512-izRF64BU+gGCP7qE1N3kOVLSv5Xk4M0OWcRmFIXoIS46qNDzmd8hmbkkx3M9wrvw0kcQ97kIyADF+UInbcr/dQ==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/manager-webpack4": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.5.13.tgz", + "integrity": "sha512-pURzS5W3XM0F7bCBWzpl7TRsuy+OXFwLXiWLaexuvo0POZe31Ueo2A1R4rx3MT5Iee8O9mYvG2XTmvK9MlLefQ==", + "dependencies": { + "@babel/core": "^7.12.10", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/preset-react": "^7.12.10", + "@storybook/addons": "6.5.13", + "@storybook/core-client": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/theming": "6.5.13", + "@storybook/ui": "6.5.13", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/webpack": "^4.41.26", + "babel-loader": "^8.0.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "css-loader": "^3.6.0", + "express": "^4.17.1", + "file-loader": "^6.2.0", + "find-up": "^5.0.0", + "fs-extra": "^9.0.1", + "html-webpack-plugin": "^4.0.0", + "node-fetch": "^2.6.7", + "pnp-webpack-plugin": "1.6.4", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7", + "resolve-from": "^5.0.0", + "style-loader": "^1.3.0", + "telejson": "^6.0.8", + "terser-webpack-plugin": "^4.2.3", + "ts-dedent": "^2.0.0", + "url-loader": "^4.1.1", + "util-deprecate": "^1.0.2", + "webpack": "4", + "webpack-dev-middleware": "^3.7.3", + "webpack-virtual-modules": "^0.2.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "node_modules/@storybook/manager-webpack4/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/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==", + "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" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/css-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/css-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/mdx1-csf": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@storybook/mdx1-csf/-/mdx1-csf-0.0.1.tgz", + "integrity": "sha512-4biZIWWzoWlCarMZmTpqcJNgo/RBesYZwGFbQeXiGYsswuvfWARZnW9RE9aUEMZ4XPn7B1N3EKkWcdcWe/K2tg==", + "dependencies": { + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/preset-env": "^7.12.11", + "@babel/types": "^7.12.11", + "@mdx-js/mdx": "^1.6.22", + "@types/lodash": "^4.14.167", + "js-string-escape": "^1.0.1", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "ts-dedent": "^2.0.0" + } + }, + "node_modules/@storybook/mdx1-csf/node_modules/prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@storybook/node-logger": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.5.13.tgz", + "integrity": "sha512-/r5aVZAqZRoy5FyNk/G4pj7yKJd3lJfPbAaOHVROv2IF7PJP/vtRaDkcfh0g2U6zwuDxGIqSn80j+qoEli9m5A==", + "dependencies": { + "@types/npmlog": "^4.1.2", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "npmlog": "^5.0.1", + "pretty-hrtime": "^1.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/node-logger/node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/node-logger/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/node-logger/node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/node-logger/node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/@storybook/node-logger/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@storybook/node-logger/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/postinstall": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.5.13.tgz", + "integrity": "sha512-qmqP39FGIP5NdhXC5IpAs9cFoYx9fg1psoQKwb9snYb98eVQU31uHc1W2MBUh3lG4AjAm7pQaXJci7ti4jOh3g==", + "dev": true, + "dependencies": { + "core-js": "^3.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-create-react-app": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@storybook/preset-create-react-app/-/preset-create-react-app-3.2.0.tgz", + "integrity": "sha512-lLoWCGr5cV+JNDRKYHC2gD+P2eyBqdN8qhmBa+PxDgPSNKfgUf9Wnoh+C7WTG5q2DEeR9SvUpQpZomX9DDQa4Q==", + "dev": true, + "dependencies": { + "@pmmmwh/react-refresh-webpack-plugin": "^0.4.3", + "@types/babel__core": "^7.1.7", + "@types/webpack": "^4.41.13", + "babel-plugin-react-docgen": "^4.1.0", + "pnp-webpack-plugin": "^1.6.4", + "react-docgen-typescript-plugin": "^1.0.0", + "semver": "^7.3.5" + }, + "peerDependencies": { + "@babel/core": "*", + "@storybook/node-logger": "*", + "@storybook/react": ">=5.2", + "react-scripts": ">=3.0.0" + } + }, + "node_modules/@storybook/preset-create-react-app/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/preview-web": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.5.13.tgz", + "integrity": "sha512-GNNYVzw4SmRua3dOc52Ye6Us4iQbq5GKQ56U3iwnzZM3TBdJB+Rft94Fn1/pypHujEHS8hl5Xgp9td6C1lLCow==", + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.13", + "ansi-to-html": "^0.6.11", + "core-js": "^3.8.2", + "global": "^4.4.0", + "lodash": "^4.17.21", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "unfetch": "^4.2.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/preview-web/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/react": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-6.5.13.tgz", + "integrity": "sha512-4gO8qihEkVZ8RNm9iQd7G2iZz4rRAHizJ6T5m58Sn21fxfyg9zAMzhgd0JzXuPXR8lTTj4AvRyPv1Qx7b43smg==", + "dependencies": { + "@babel/preset-flow": "^7.12.1", + "@babel/preset-react": "^7.12.10", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/docs-tools": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/react-docgen-typescript-plugin": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.5.13", + "@types/estree": "^0.0.51", + "@types/node": "^14.14.20 || ^16.0.0", + "@types/webpack-env": "^1.16.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "babel-plugin-add-react-displayname": "^0.0.5", + "babel-plugin-react-docgen": "^4.2.1", + "core-js": "^3.8.2", + "escodegen": "^2.0.0", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^14.3.4", + "react-refresh": "^0.11.0", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "webpack": ">=4.43.0 <6.0.0" + }, + "bin": { + "build-storybook": "bin/build.js", + "start-storybook": "bin/index.js", + "storybook-server": "bin/index.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@babel/core": "^7.11.5", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "require-from-string": "^2.0.2" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@storybook/builder-webpack4": { + "optional": true + }, + "@storybook/builder-webpack5": { + "optional": true + }, + "@storybook/manager-webpack4": { + "optional": true + }, + "@storybook/manager-webpack5": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin": { + "version": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", + "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0.tgz", + "integrity": "sha512-eVg3BxlOm2P+chijHBTByr90IZVUtgRW56qEOLX7xlww2NBuKrcavBlcmn+HH7GIUktquWkMPtvy6e0W0NgA5w==", + "dependencies": { + "debug": "^4.1.1", + "endent": "^2.0.1", + "find-cache-dir": "^3.3.1", + "flat-cache": "^3.0.4", + "micromatch": "^4.0.2", + "react-docgen-typescript": "^2.1.1", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "typescript": ">= 3.x", + "webpack": ">= 4" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/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==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/@storybook/react/node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", + "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "dependencies": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <4.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@storybook/react/node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "node_modules/@storybook/react/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react/node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "node_modules/@storybook/react/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@storybook/react/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react/node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@storybook/react/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@storybook/react/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@storybook/router": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.13.tgz", + "integrity": "sha512-sf5aogfirH5ucD0d0hc2mKf2iyWsZsvXhr5kjxUQmgkcoflkGUWhc34sbSQVRQ1i8K5lkLIDH/q2s1Zr2SbzhQ==", + "dependencies": { + "@storybook/client-logger": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/router/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dependencies": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/source-loader": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.5.13.tgz", + "integrity": "sha512-tHuM8PfeB/0m+JigbaFp+Ld0euFH+fgOObH2W9rjEXy5vnwmaeex/JAdCprv4oL+LcDQEERqNULUUNIvbcTPAg==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "estraverse": "^5.2.0", + "global": "^4.4.0", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/source-loader/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@storybook/source-loader/node_modules/prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@storybook/store": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.5.13.tgz", + "integrity": "sha512-GG6lm+8fBX1tNUnX7x3raBOjYhhf14bPWLtYiPlxDTFEMs3sJte7zWKZq6NQ79MoBLL6jjzTeolBfDCBw6fiWQ==", + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "slash": "^3.0.0", + "stable": "^0.1.8", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/telemetry": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-6.5.13.tgz", + "integrity": "sha512-PFJEfGbunmfFWabD3rdCF8EHH+45578OHOkMPpXJjqXl94vPQxUH2XTVKQgEQJbYrgX0Vx9Z4tSkdMHuzYDbWQ==", + "dependencies": { + "@storybook/client-logger": "6.5.13", + "@storybook/core-common": "6.5.13", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "detect-package-manager": "^2.0.1", + "fetch-retry": "^5.0.2", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "isomorphic-unfetch": "^3.1.0", + "nanoid": "^3.3.1", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/testing-library": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@storybook/testing-library/-/testing-library-0.0.13.tgz", + "integrity": "sha512-vRMeIGer4EjJkTgI8sQyK9W431ekPWYCWL//OmSDJ64IT3h7FnW7Xg6p+eqM3oII98/O5pcya5049GxnjaPtxw==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "^6.4.0", + "@storybook/instrumenter": "^6.4.0", + "@testing-library/dom": "^8.3.0", + "@testing-library/user-event": "^13.2.1", + "ts-dedent": "^2.2.0" + } + }, + "node_modules/@storybook/testing-library/node_modules/@testing-library/dom": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz", + "integrity": "sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/testing-library/node_modules/@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@storybook/testing-library/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@storybook/testing-library/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/testing-library/node_modules/deep-equal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.1.0.tgz", + "integrity": "sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/testing-library/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/@storybook/testing-library/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@storybook/testing-library/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/theming": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.13.tgz", + "integrity": "sha512-oif5NGFAUQhizo50r+ctw2hZNLWV4dPHai+L/gFvbaSeRBeHSNkIcMoZ2FlrO566HdGZTDutYXcR+xus8rI28g==", + "dependencies": { + "@storybook/client-logger": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/ui": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.5.13.tgz", + "integrity": "sha512-MklJuSg4Bc+MWjwhZVmZhJaucaeEBUMMa2V9oRWbIgZOdRHqdW72S2vCbaarDAYfBQdnfaoq1GkSQiw+EnWOzA==", + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/router": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "resolve-from": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/ui/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/ui/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", + "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", + "dependencies": { + "ejs": "^2.6.1", + "magic-string": "^0.25.0" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@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==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tabler/icons": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.7.0.tgz", + "integrity": "sha512-mSjUKhwN5fJHI9yITqFn9GXGnsJ4gBAyQDWyP4Ev5fk6hD78G7u6cHEF1KARr5FOOdiIKSZWCzNzUzyLhiNPrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-2.7.0.tgz", + "integrity": "sha512-WV2ZwMUuZN9QcCX4RPg9+G+ycUgoItzOWVCCQYVWbYKV581fH8szM2KVaQHQhMbttL4JYtOgf4ColJIDwsIgdw==", + "dependencies": { + "@tabler/icons": "2.7.0", + "prop-types": "^15.7.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", + "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^4.2.2", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.6", + "lz-string": "^1.4.4", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz", + "integrity": "sha512-dfB7HVIgTNCxH22M1+KU6viG5of2ldoA5ly8Ar8xkezKHKXjRvznCdbMbqjYGgO2xjRbwnR+rR8MLUIqF3kKbQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^4.2.2", + "chalk": "^3.0.0", + "css": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/react": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz", + "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^7.28.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@testing-library/react-hooks": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-7.0.2.tgz", + "integrity": "sha512-dYxpz8u9m4q1TuzfcUApqi8iFfR6R0FaMbr2hjZJy1uC8z+bO/K4v8Gs9eogGKYQop7QsrBTFkv/BCF7MzD2Cg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@types/react": ">=16.9.0", + "@types/react-dom": ">=16.9.0", + "@types/react-test-renderer": ">=16.9.0", + "react-error-boundary": "^3.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0", + "react-test-renderer": ">=16.9.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-test-renderer": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "12.8.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", + "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@turf/area": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", + "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", + "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/centroid": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", + "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/helpers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", + "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/meta": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", + "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@types/aria-query": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz", + "integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/bs58check": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/bs58check/-/bs58check-2.1.0.tgz", + "integrity": "sha512-OxsysnJQh82vy9DRbOcw9m2j/WiyqZLn0YBhKxdQ+aCwoHj+tWzyCgpwAkr79IfDXZKxc6h7k89T9pwS78CqTQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/d3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.0.0.tgz", + "integrity": "sha512-7rMMuS5unvbvFCJXAkQXIxWTo2OUlmVXN5q7sfQFesuVICY55PSP6hhbUhWjTTNpfTTB3iLALsIYDFe7KUNABw==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.1.tgz", + "integrity": "sha512-D/G7oG0czeszALrkdUiV68CDiHDxXf+M2mLVqAyKktGd12VKQQljj1sHJGBKjcK4jRH1biBd6ZPQPHpJ0mNa0w==", + "dev": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.1.tgz", + "integrity": "sha512-zji/iIbdd49g9WN0aIsGcwcTBUkgLsCSwB+uH+LPVDAiKWENMtI3cJEWt+7/YYwelMoZmbBfzA3qCdrZ2XFNnw==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.1.tgz", + "integrity": "sha512-B532DozsiTuQMHu2YChdZU0qsFJSio3Q6jmBYGYNp3gMDzBmuFFgPt9qKA4VYuLZMp4qc6eX7IUFUEsvHiXZAw==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-eQfcxIHrg7V++W8Qxn6QkqBNBokyhdWSAS73AbkbMzvLQmVVBviknoz2SRS/ZJdIOmhcmmdCRE/NFOm28Z1AMw==", + "dev": true + }, + "node_modules/@types/d3-color": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-vcuR/rrvuoX6q0Rqe+gOScvYkTV7i6KZsfQozvThtAZ4CfuEM22OnZfiKP62nXHqRnIHXpBMy3JSha95qdYAxA==", + "dev": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-C3zfBrhHZvrpAAK3YXqLWVAGo87A4SvJ83Q/zVJ8rFWJdKejUnDYaWZPkA8K84kb2vDA/g90LTQAz7etXcgoQQ==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.0.tgz", + "integrity": "sha512-iGm7ZaGLq11RK3e69VeMM6Oqj2SjKUB9Qhcyd1zIcqn2uE8w9GFB445yCY46NOQO3ByaNyktX1DK+Etz7ZaX+w==", + "dev": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-NhxMn3bAkqhjoxabVJWKryhnZXXYYVQxaBnbANu0O94+O/nX9qSjrA1P1jbAQJxJf+VC72TxDX/YJcKue5bRqw==", + "dev": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.1.tgz", + "integrity": "sha512-o1Va7bLwwk6h03+nSM8dpaGEYnoIG19P0lKqlic8Un36ymh9NSkNFX1yiXMKNMx8rJ0Kfnn2eovuFaL6Jvj0zA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.0.tgz", + "integrity": "sha512-o0/7RlMl9p5n6FQDptuJVMxDf/7EDEv2SYEO/CwdG2tr1hTfUVi0Iavkk2ax+VpaQ/1jVhpnj5rq1nj8vwhn2A==", + "dev": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-toZJNOwrOIqz7Oh6Q7l2zkaNfXkfR7mFSJvGvlD/Ciq/+SQ39d5gynHJZ/0fjt83ec3WL7+u3ssqIijQtBISsw==", + "dev": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.1.tgz", + "integrity": "sha512-fY9fXELktloC4MospE1AMYk67p7zxbW1K79rdzZJ6oB2pddltiTelE9bz6YnZf9GboHhe9k0gwVjP7bOc7wjvg==", + "dev": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.0.tgz", + "integrity": "sha512-bbaJJs3Aye+C44aVbWW7qEgWNJQMtFNGsKq2L0OzjID2ewEUwb0Au8WF+b5PUrPkAqRKmtm4znYJadrYJMivYQ==", + "dev": true + }, + "node_modules/@types/d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-EFXzqJH7VFbnx6LJ3PBSYNCrxrjl6tFplmnJ9J4k7ICvL3QXSxG6APfKGe0A29sYkk7UV08avGkmfd/EqS5WbA==", + "dev": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.0.1.tgz", + "integrity": "sha512-bXAS5udAD5RXfM/FsWMP9ggCl9cWXH0417Mwpw6ytSDP+Oez+XP0SLFPG5oPQc3m7ZToKg3/b4UW8hC/F6Qddw==", + "dev": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dev": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-U+OiWUxoH2jFsznlQHLgP48dUgkvtkFpjqW9Y9w8W9z3lo1OyQC1gdbKDfH1CxRUOWMY9fSYEYWc2ErNieyVew==", + "dev": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.1.tgz", + "integrity": "sha512-GDuXcRcR6mKcpUVMhPNttpOzHi2dP6YcDqLZYSZHgwTZ+sfCa8e9q0VEBwZomblAPNMYpVqxojnSyIEb4s/Pwg==", + "dev": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-SZsDWFG1dLV9ivX2wGDPFWgLUf71tF4aupfEMTYMrbArHwEMLhmv3TS1CZECLQgoTttdpM1g5Z6JwRP7zoInWg==", + "dev": true + }, + "node_modules/@types/d3-shape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.0.0.tgz", + "integrity": "sha512-c1Wu/JwJJHSeY/M26pzNfuaybLCcTOkn1xxxVH7riuYObpvI8SfyDD30F8mqG+NHZuZTeIdKj4lej1USZ0V5vQ==", + "dev": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "dev": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "dev": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-Sv4qEI9uq3bnZwlOANvYK853zvpdKEm1yz9rcc8ZTsxvRklcs9Fx4YFuGA3gXoQN/c/1T6QkVNjhaRO/cWj94g==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.1.tgz", + "integrity": "sha512-7s5L9TjfqIYQmQQEUcpMAcBOahem7TRoSO/+Gkz02GbMVuULiZzjF2BOdw291dbO2aNon4m2OdFsRGaCq2caLQ==", + "dev": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/dot-object": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/dot-object/-/dot-object-2.1.2.tgz", + "integrity": "sha512-mARrpJofLNe6yhlukeBcznBe8ssZo5ZJ/CJWc3JKmG9L9151s0OHK+mealnkqSgO6cSn1219vND2wgL67Cuqiw==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", + "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "node_modules/@types/file-saver": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.3.tgz", + "integrity": "sha512-MBIou8pd/41jkff7s97B47bc9+p0BszqqDJsO51yDm49uUxeKzrfuNl5fSLC6BpLEWKA8zlwyqALVmXrFwoBHQ==", + "dev": true + }, + "node_modules/@types/geojson": { + "version": "7946.0.7", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", + "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/history/-/history-5.0.0.tgz", + "integrity": "sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==", + "deprecated": "This is a stub types definition. history provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "history": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" + }, + "node_modules/@types/humanize-duration": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/@types/humanize-duration/-/humanize-duration-3.25.1.tgz", + "integrity": "sha512-WZU/4bb+lvzyDmZzjJtp++9mfKy6B3lH6gGISgkcz6SU8hMILKRM0vi08TxIsb0dQB4Gzo68MWLmctu6xqUi9g==", + "dev": true + }, + "node_modules/@types/is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "26.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz", + "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", + "dev": true, + "dependencies": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "node_modules/@types/js-cookie": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", + "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + }, + "node_modules/@types/lodash": { + "version": "4.14.170", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz", + "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.4.tgz", + "integrity": "sha512-BBz79DCJbD2CVYZH67MBeHZRX++HF+5p8Mo5MzjZi64Wac39S3diedJYHZtScbRVf4DjZyN6LzA0SB0zy+HSSQ==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/marked": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.7.tgz", + "integrity": "sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==", + "dev": true + }, + "node_modules/@types/md5": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.1.tgz", + "integrity": "sha512-OK3oe+ALIoPSo262lnhAYwpqFNXbiwH2a+0+Z5YBnkQEwWD8fk5+PIeRhYA48PzvX9I4SGNpWy+9bLj8qz92RQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "12.20.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.15.tgz", + "integrity": "sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/node-sass": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@types/node-sass/-/node-sass-4.11.2.tgz", + "integrity": "sha512-pOFlTw/OtZda4e+yMjq6/QYuvY0RDMQ+mxXdWj7rfSyf18V8hS4SfgurO+MasAkQsv6Wt6edOGlwh5QqJml9gw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, + "node_modules/@types/npmlog": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.4.tgz", + "integrity": "sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/parse5": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.2.tgz", + "integrity": "sha512-+hQX+WyJAOne7Fh3zF5CxPemILIbuhNcqHHodzK9caYOLnC8pD5efmPleRnw0z++LfKUC/sVNMwk0Gap+B0baA==" + }, + "node_modules/@types/plotly.js": { + "version": "1.54.17", + "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-1.54.17.tgz", + "integrity": "sha512-2nk1jEDQ85Ix6SQsC7M7Otl5M8OoYwTl7V/x2ptyX373slUJAj+vQ3njYGy/h9p/rxTq7W0fn3JvXjuxXuA0Qg==", + "dev": true, + "dependencies": { + "@types/d3": "^3" + } + }, + "node_modules/@types/plotly.js/node_modules/@types/d3": { + "version": "3.5.46", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.46.tgz", + "integrity": "sha512-jNHfiGd41+JUV43LTMzQNidyp4Hn0XfhoSmy8baE0d/N5pGYpD+yX03JacY/MH+smFxYOQGXlz4HxkRZOuRNOQ==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==" + }, + "node_modules/@types/pretty-hrtime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz", + "integrity": "sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + }, + "node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/react": { + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.11.tgz", + "integrity": "sha512-yFRQbD+whVonItSk7ZzP/L+gPTJVBkL/7shLEF+i9GC/1cV3JmUxEQz6+9ylhUpWSDuqo1N9qEvqS6vTj4USUA==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-1lBBxVSutE8CQM37Jq7KvJwuA94qaEEqsx+G0dnwzG6Sfwf6JGcNeFk5jjjhJli1q2naeMZm+D/dvT/zyX4QPw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-dom": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.8.tgz", + "integrity": "sha512-0ohAiJAx1DAUEcY9UopnfwCE9sSMDGnY/oXjWMax6g3RpzmTt2GMyMVAXcbn0mo8XAff0SbQJl2/SBU+hjSZ1A==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-plotly.js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@types/react-plotly.js/-/react-plotly.js-2.5.0.tgz", + "integrity": "sha512-bda7N/Y65d1x0FfwhgUXAugGeG9CRIxmkW/yBL8PVFUMvZGpfEnw4bXKjDozBYlOskVfxj6UQ9IKmZI6CZ7/QQ==", + "dev": true, + "dependencies": { + "@types/plotly.js": "*", + "@types/react": "*" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.18", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.18.tgz", + "integrity": "sha512-9iwAsPyJ9DLTRH+OFeIrm9cAbIj1i2ANL3sKQFATqnPWRbg+jEFXyZOKHiQK/N86pNRXbb4HRxAxo0SIX1XwzQ==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.15.tgz", + "integrity": "sha512-z3UlMG/x91SFEVmmvykk9FLTliDvfdIUky4k2rCfXWQ0NKbrP8o9BTCaCTPuYsB8gDkUnUmkcA2vYlm2DR+HAA==", + "dev": true, + "dependencies": { + "@types/history": "*", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", + "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "dev": true, + "dependencies": { + "@types/history": "*", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react-test-renderer": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz", + "integrity": "sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-window": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.4.tgz", + "integrity": "sha512-rFJ0h1nYffFBNi6N80CFORAQNNr+440RtGCAmKyn81U99pXRoxS2goi/fkYnUJtk+LcvWCp8cmP16M8loJJsjw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react/node_modules/csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + }, + "node_modules/@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" + }, + "node_modules/@types/storybook__react": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@types/storybook__react/-/storybook__react-5.2.1.tgz", + "integrity": "sha512-p4QGO+VjEO3YxyWVHpPylNheA0JhStzoCg6RBTmdobrC0ZqLPEIIWu0pFkHlNkmGIiEKW2yDGFJooBe8M4Df0Q==", + "deprecated": "Deprecated", + "dev": true, + "dependencies": { + "@storybook/react": "*" + } + }, + "node_modules/@types/styled-components": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.15.tgz", + "integrity": "sha512-4evch8BRI3AKgb0GAZ/sn+mSeB+Dq7meYtMi7J/0Mg98Dt1+r8fySOek7Sjw1W+Wskyjc93565o5xWAT/FdY0Q==", + "dev": true, + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/styled-components/node_modules/csstype": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", + "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==", + "dev": true + }, + "node_modules/@types/tapable": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", + "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.0.tgz", + "integrity": "sha512-l2P2GO+hFF4Liye+fAajT1qBqvZOiL79YMpEvgGs1xTK7hECxBI8Wz4J7ntACJNiJ9r0vXQqYovroXRLPDja6A==", + "dev": true, + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/uglify-js": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", + "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@types/webpack": { + "version": "4.41.29", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz", + "integrity": "sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q==", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-env": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz", + "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==" + }, + "node_modules/@types/webpack-sources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/yargs": { + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.0.tgz", + "integrity": "sha512-KcF6p3zWhf1f8xO84tuBailV5cN92vhS+VT7UJsPzGBm9VnQqfI9AsiMUFUCYHTYPg1uCCo+HyiDnpDuvkAMfQ==", + "dependencies": { + "@typescript-eslint/experimental-utils": "4.28.0", + "@typescript-eslint/scope-manager": "4.28.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz", + "integrity": "sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==", + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/typescript-estree": "4.28.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.0.tgz", + "integrity": "sha512-7x4D22oPY8fDaOCvkuXtYYTQ6mTMmkivwEzS+7iml9F9VkHGbbZ3x4fHRwxAb5KeuSkLqfnYjs46tGx2Nour4A==", + "dependencies": { + "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/typescript-estree": "4.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz", + "integrity": "sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==", + "dependencies": { + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/visitor-keys": "4.28.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.0.tgz", + "integrity": "sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz", + "integrity": "sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==", + "dependencies": { + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/visitor-keys": "4.28.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz", + "integrity": "sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==", + "dependencies": { + "@typescript-eslint/types": "4.28.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@uiw/react-textarea-code-editor": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@uiw/react-textarea-code-editor/-/react-textarea-code-editor-1.4.14.tgz", + "integrity": "sha512-OCOyRY48JdA0SooXQWpEls2ZyFXyv+hR61SW4wLH+kdKnAeR72MSgehuU2R3k455+k8QLtsk0MVyctBJ8HLvVw==", + "dependencies": { + "@babel/runtime": "7.15.4", + "@mapbox/rehype-prism": "0.8.0", + "rehype": "12.0.0" + }, + "peerDependencies": { + "@babel/runtime": ">=7.10.0", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@uiw/react-textarea-code-editor/node_modules/@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "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" + } + }, + "node_modules/@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==" + }, + "node_modules/@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==" + }, + "node_modules/@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==" + }, + "node_modules/@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==", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@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==" + }, + "node_modules/@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==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@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==" + }, + "node_modules/@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==", + "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" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "node_modules/@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==", + "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" + } + }, + "node_modules/@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==", + "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" + } + }, + "node_modules/@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==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@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==", + "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" + } + }, + "node_modules/@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==", + "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" + } + }, + "node_modules/@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==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@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==" + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "node_modules/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 + }, + "node_modules/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=" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-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==", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/airbnb-js-shims": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz", + "integrity": "sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==", + "dependencies": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "array.prototype.flatmap": "^1.2.1", + "es5-shim": "^4.5.13", + "es6-shim": "^0.35.5", + "function.prototype.name": "^1.1.0", + "globalthis": "^1.0.0", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0 || ^1.0.0", + "object.getownpropertydescriptors": "^2.0.3", + "object.values": "^1.1.0", + "promise.allsettled": "^1.0.0", + "promise.prototype.finally": "^3.1.0", + "string.prototype.matchall": "^4.0.0 || ^3.0.1", + "string.prototype.padend": "^3.0.0", + "string.prototype.padstart": "^3.0.0", + "symbol.prototype.description": "^1.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/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==", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/almost-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", + "integrity": "sha1-+FHGMROHV5lCdqou++jfowZszN0=" + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dependencies": { + "string-width": "^2.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-to-html": { + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.15.tgz", + "integrity": "sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==", + "dependencies": { + "entities": "^2.0.0" + }, + "bin": { + "ansi-to-html": "bin/ansi-to-html" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/antd": { + "version": "4.24.8", + "resolved": "https://registry.npmjs.org/antd/-/antd-4.24.8.tgz", + "integrity": "sha512-wrNy2Hi27uM3948okG3n2GwzQKBFUn1Qn5mn2I/ALcR28rC6cTjHYOuA248Zl9ECzz3jo4TY2R0SIa+5GZ/zGA==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons": "^4.7.0", + "@ant-design/react-slick": "~0.29.1", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.4.0", + "classnames": "^2.2.6", + "copy-to-clipboard": "^3.2.0", + "lodash": "^4.17.21", + "moment": "^2.29.2", + "rc-cascader": "~3.7.0", + "rc-checkbox": "~2.3.0", + "rc-collapse": "~3.4.2", + "rc-dialog": "~9.0.2", + "rc-drawer": "~6.1.0", + "rc-dropdown": "~4.0.0", + "rc-field-form": "~1.27.0", + "rc-image": "~5.13.0", + "rc-input": "~0.1.4", + "rc-input-number": "~7.3.9", + "rc-mentions": "~1.13.1", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.1", + "rc-notification": "~4.6.0", + "rc-pagination": "~3.2.0", + "rc-picker": "~2.7.0", + "rc-progress": "~3.4.1", + "rc-rate": "~2.9.0", + "rc-resize-observer": "^1.2.0", + "rc-segmented": "~2.1.0", + "rc-select": "~14.1.13", + "rc-slider": "~10.0.0", + "rc-steps": "~5.0.0-alpha.2", + "rc-switch": "~3.2.0", + "rc-table": "~7.26.0", + "rc-tabs": "~12.5.6", + "rc-textarea": "~0.4.5", + "rc-tooltip": "~5.2.0", + "rc-tree": "~5.7.0", + "rc-tree-select": "~5.5.0", + "rc-trigger": "^5.2.10", + "rc-upload": "~4.3.0", + "rc-util": "^5.22.5", + "scroll-into-view-if-needed": "^2.2.25" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-dir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", + "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==" + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/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, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.2.tgz", + "integrity": "sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.9.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/aria-hidden/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-bounds": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", + "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==" + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-normalize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", + "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", + "dependencies": { + "array-bounds": "^1.0.0" + } + }, + "node_modules/array-range": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", + "integrity": "sha1-9W5GWRhDYRxqVvd+8C7afFAIm/w=" + }, + "node_modules/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==" + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", + "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + }, + "node_modules/ast-types/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/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==" + }, + "node_modules/async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/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==" + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/atob-lite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=" + }, + "node_modules/autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/axe-core": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.3.tgz", + "integrity": "sha512-pXnVMfJKSIWU2Ml4JHP7pZEPIrgBO1Fd3WGx+fPBsS+KRGhE4vxooD8XBGWbQOIVSZsVK7pUDBBkCicNu80yzQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">= 4.12.1" + } + }, + "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "dependencies": { + "babylon": "^6.18.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dependencies": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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==", + "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" + }, + "engines": { + "node": ">= 6.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/node_modules/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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/babel-plugin-add-react-displayname": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz", + "integrity": "sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==" + }, + "node_modules/babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@babel/core": "^7.11.6" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/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==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/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==", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", + "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-react-docgen": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz", + "integrity": "sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==", + "dependencies": { + "ast-types": "^0.14.2", + "lodash": "^4.17.15", + "react-docgen": "^5.0.0" + } + }, + "node_modules/babel-plugin-styled-components": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.3.tgz", + "integrity": "sha512-meGStRGv+VuKA/q0/jXxrPNWEm4LPfYIqxooDTdmh8kFsP/Ph7jJG5rUPwUPX3QHUvggwdbgdGpo88P/rRYsVw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-module-imports": "^7.15.4", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "node_modules/babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "node_modules/babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dependencies": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "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/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", + "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", + "dependencies": { + "@babel/core": "7.12.3", + "@babel/plugin-proposal-class-properties": "7.12.1", + "@babel/plugin-proposal-decorators": "7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", + "@babel/plugin-proposal-numeric-separator": "7.12.1", + "@babel/plugin-proposal-optional-chaining": "7.12.1", + "@babel/plugin-transform-flow-strip-types": "7.12.1", + "@babel/plugin-transform-react-display-name": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.12.1", + "@babel/preset-typescript": "7.12.1", + "@babel/runtime": "7.12.1", + "babel-plugin-macros": "2.8.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "dependencies": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@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.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.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/preset-react": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", + "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.1", + "@babel/plugin-transform-react-jsx-development": "^7.12.1", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/babel-preset-react-app/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/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=", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "node_modules/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, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/better-opn": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", + "integrity": "sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==", + "dependencies": { + "open": "^7.0.3" + }, + "engines": { + "node": ">8.0.0" + } + }, + "node_modules/bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "dependencies": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "optional": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/binary-search-bounds": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bit-twiddle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", + "integrity": "sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4=" + }, + "node_modules/bitmap-sdf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz", + "integrity": "sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg==", + "dependencies": { + "clamp": "^1.0.1" + } + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "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" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "node_modules/boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dependencies": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bplist-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", + "integrity": "sha512-2AEM0FXy8ZxVLBuqX0hqt1gDwcnz2zygEkQ6zaD5Wko/sB9paUNwlpawrFtKeHUAQUOzjVy9AO4oeonqIHKA9Q==", + "optional": true, + "dependencies": { + "big-integer": "^1.6.7" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/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==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "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" + } + }, + "node_modules/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==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/browserslist/node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/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==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/buffer/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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=" + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c8": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", + "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/c8/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c8/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c8/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c8/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c8/node_modules/v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/c8/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/c8/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "dependencies": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camel-case/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "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" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001434", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", + "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/canvas-fit": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", + "integrity": "sha1-rhO+Zq3kL1vg5IfjRfzjCl5bXl8=", + "dependencies": { + "element-size": "^1.1.1" + } + }, + "node_modules/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==", + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "engines": { + "node": "*" + } + }, + "node_modules/check-types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/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==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==" + }, + "node_modules/clamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", + "integrity": "sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ=" + }, + "node_modules/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==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/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==" + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "node_modules/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==", + "dependencies": { + "color-parse": "^1.3.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", + "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", + "dependencies": { + "clamp": "^1.0.1" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/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==", + "dependencies": { + "clamp": "^1.0.1", + "color-rgba": "^2.1.1", + "dtype": "^2.0.0" + } + }, + "node_modules/color-parse": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.3.8.tgz", + "integrity": "sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA==", + "dependencies": { + "color-name": "^1.0.0", + "defined": "^1.0.0", + "is-plain-obj": "^1.1.0" + } + }, + "node_modules/color-rgba": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.1.1.tgz", + "integrity": "sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==", + "dependencies": { + "clamp": "^1.0.1", + "color-parse": "^1.3.8", + "color-space": "^1.14.6" + } + }, + "node_modules/color-space": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.16.0.tgz", + "integrity": "sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==", + "dependencies": { + "hsluv": "^0.0.3", + "mumath": "^3.3.4" + } + }, + "node_modules/color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/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==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comlink": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.3.1.tgz", + "integrity": "sha512-+YbhUdNrpBZggBAHWcgQMLPLH1KDF3wJpeqrCKieWQ8RL7atmgsgTQko1XEBK6PsecfopWNntopJ+ByYG1lRaA==" + }, + "node_modules/comlink-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/comlink-loader/-/comlink-loader-2.0.0.tgz", + "integrity": "sha512-106/k0JSssSCo2QO4ucbgbyWsb2zAEOSXFAVH2A+EO8kOz3n2BkvmkToxsoo+SWKUIKy8qubhAOLCS5mpFUvHw==", + "dev": true, + "dependencies": { + "comlink": "^4.2.0", + "loader-utils": "^1.1.0", + "slash": "^3.0.0", + "worker-loader": "^2.0.0" + } + }, + "node_modules/comlink-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/comlink-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/comment-json": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-2.4.2.tgz", + "integrity": "sha512-T+iXox779qsqneMYx/x5BZyz4xjCeQRmuNVzz8tko7qZUs3MlzpA3RAs+O1XsgcKToNBMIvfVzafGOeiU7RggA==", + "dependencies": { + "core-util-is": "^1.0.2", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "node_modules/common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "node_modules/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==" + }, + "node_modules/compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "dependencies": { + "arity-n": "^1.0.4" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/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==", + "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" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", + "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "dependencies": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/configstore/node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/configstore/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/configstore/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" + }, + "node_modules/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==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "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" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.0.tgz", + "integrity": "sha512-GUbtPllXMYRzIgHNZ4dTYTcUemls2cni83Q4Q/TrFONHfhcg9oEGOtaGHfb0cpzec60P96UKPvMkjX1jET8rUw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.0.tgz", + "integrity": "sha512-8X6lWsG+s7IfOKzV93a7fRYfWRZobOfjw5V5rrq43Vh/W+V6qYxl7Akalsvgab4PFT/4L/pjQbdBUEM36NXKrw==", + "dependencies": { + "browserslist": "^4.16.6", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js-pure": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", + "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/country-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", + "integrity": "sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY=" + }, + "node_modules/cp-file": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz", + "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "nested-error-stacks": "^2.0.0", + "p-event": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cp-file/node_modules/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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cp-file/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/cpy": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/cpy/-/cpy-8.1.2.tgz", + "integrity": "sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==", + "dependencies": { + "arrify": "^2.0.1", + "cp-file": "^7.0.0", + "globby": "^9.2.0", + "has-glob": "^1.0.0", + "junk": "^3.1.0", + "nested-error-stacks": "^2.1.0", + "p-all": "^2.1.0", + "p-filter": "^2.1.0", + "p-map": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cpy/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cpy/node_modules/fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "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" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cpy/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/cpy/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cpy/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/cpy/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/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==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cpy/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cpy/node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/cpy/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cpy/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/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==", + "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" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "engines": { + "node": "*" + } + }, + "node_modules/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==", + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "dependencies": { + "postcss": "^7.0.5" + }, + "bin": { + "css-blank-pseudo": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-font": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", + "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" + } + }, + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "bin": { + "css-has-pseudo": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "dependencies": { + "camelcase": "^6.0.0", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "dependencies": { + "postcss": "^7.0.5" + }, + "bin": { + "css-prefers-color-scheme": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "node_modules/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=" + }, + "node_modules/css-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "dependencies": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, + "node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=", + "dev": true + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs=" + }, + "node_modules/cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssfontparser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", + "integrity": "sha1-9AIvyPlwDGgCnVQghK+69CWj8+M=", + "dev": true + }, + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "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.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/csstype": { + "version": "2.6.17", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", + "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "optional": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/d3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.0.0.tgz", + "integrity": "sha512-t+jEKGO2jQiSBLJYYq6RFc500tsCeXBB4x41oQaSnZD3Som95nQrlw9XJGrFTMUOQOkwSMauWy9+8Tz1qm9UZw==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.0.1.tgz", + "integrity": "sha512-l3Bh5o8RSoC3SBm5ix6ogaFW+J6rOUm42yOtZ2sQPCEvCqUMepeX7zgrlLLGIemxgOyo9s2CsWEidnLv5PwwRw==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "node_modules/d3-color": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-hdL7+HBIohpgfolhBxr1KX47VMD6+vVD/oEFrxk5yhmzV2prk99EkFKYpXuhVkFpTgHdJ6/4bYcjdLPPXV4tIA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo-projection": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz", + "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==", + "dependencies": { + "commander": "2", + "d3-array": "1", + "d3-geo": "^1.12.0", + "resolve": "^1.1.10" + }, + "bin": { + "geo2svg": "bin/geo2svg", + "geograticule": "bin/geograticule", + "geoproject": "bin/geoproject", + "geoquantize": "bin/geoquantize", + "geostitch": "bin/geostitch" + } + }, + "node_modules/d3-geo-projection/node_modules/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==" + }, + "node_modules/d3-geo-projection/node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/d3-geo-projection/node_modules/d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "dependencies": { + "d3-array": "1" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.0.1.tgz", + "integrity": "sha512-RlLTaofEoOrMK1JoXYIGhKTkJFI/6rFrYPgxy6QlZo2BcVc4HGTqEU0rPpzuMq5T/5XcMtAzv1XiLA3zRTfygw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.0.tgz", + "integrity": "sha512-foHQYKpWQcyndH1CGoHdUC4PECxTxonzwwBXGT8qu+Drb1FIc6ON6dG2P5f4hRRMkLiIKeWK7iFtdznDUrnuPQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.0.1.tgz", + "integrity": "sha512-HNZNEQoDhuCrDWEc/BMbF/hKtzMZVoe64TvisFLDp2Iyj0UShB/E6/lBsLlJTfBMbYgftHj90cXJ0SEitlE6Xw==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-nzaCwlj+ZVBIlFuVOT1RmU+6xb/7D5IcnhHzHQcBgS/aTa5K9fWZNN5LCXA27LgF5WxoSNJqKBbLcGMtM6Ca6A==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" + }, + "node_modules/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=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "node_modules/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==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/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=" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-1.0.4.tgz", + "integrity": "sha512-qPy925qewwul9Hifs+3sx1ZYn14obHxpkX+mPD369w4Rzg+YkJBgi3SOvwUq81nWSjqGUegIgEPwD8u+HUnxlw==", + "optional": true, + "dependencies": { + "bplist-parser": "^0.1.0", + "meow": "^3.1.0", + "untildify": "^2.0.0" + }, + "bin": { + "default-browser-id": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "optional": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "optional": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "optional": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "optional": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "optional": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "optional": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "optional": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "optional": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "optional": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "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" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/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=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/default-gateway/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/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==" + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/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==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/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==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "dependencies": { + "repeat-string": "^1.5.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/detect-package-manager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", + "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", + "dependencies": { + "execa": "^5.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", + "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", + "dev": true + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-helpers/node_modules/csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/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==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domhandler/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/dot-object": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-2.1.4.tgz", + "integrity": "sha512-7FXnyyCLFawNYJ+NhkqyP9Wd2yzuo+7n9pGiYpkmXCTYa8Ci2U0eUNDVg5OuO5Pm6aFXI2SWN8/N/w7SJWu1WA==", + "dependencies": { + "commander": "^4.0.0", + "glob": "^7.1.5" + }, + "bin": { + "dot-object": "bin/dot-object" + } + }, + "node_modules/dot-object/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==" + }, + "node_modules/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=", + "dependencies": { + "abs-svg-path": "~0.1.1", + "normalize-svg-path": "~0.1.0" + } + }, + "node_modules/dtype": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", + "integrity": "sha1-zQUjI84GFETs0uj1dI9popvihDQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/dup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", + "integrity": "sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk=" + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/earcut": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.3.tgz", + "integrity": "sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug==" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dependencies": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "bin": { + "editorconfig": "bin/editorconfig" + } + }, + "node_modules/editorconfig/node_modules/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==" + }, + "node_modules/editorconfig/node_modules/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==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/editorconfig/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "hasInstallScript": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + }, + "node_modules/element-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", + "integrity": "sha1-ZOXxWdlxIWMYRby67K8nnDm1404=" + }, + "node_modules/elementary-circuits-directed-graph": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz", + "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==", + "dependencies": { + "strongly-connected-components": "^1.0.1" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/endent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", + "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", + "dependencies": { + "dedent": "^0.7.0", + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.5" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/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==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "dependencies": { + "stackframe": "^1.1.1" + } + }, + "node_modules/es-abstract": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "node_modules/es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es5-shim": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.7.tgz", + "integrity": "sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-shim": { + "version": "0.35.6", + "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.6.tgz", + "integrity": "sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==" + }, + "node_modules/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==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/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==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==", + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "dependencies": { + "confusing-browser-globals": "^1.0.10" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0", + "@typescript-eslint/parser": "^4.0.0", + "babel-eslint": "^10.0.0", + "eslint": "^7.5.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-jest": "^24.0.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.20.3", + "eslint-plugin-react-hooks": "^4.0.8", + "eslint-plugin-testing-library": "^3.9.0" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + }, + "eslint-plugin-testing-library": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", + "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "dependencies": { + "debug": "^3.2.7", + "find-up": "^2.1.0", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.7.2.tgz", + "integrity": "sha512-7Oq/N0+3nijBnYWQYzz/Mp/7ZCpwxYvClRyW/PLAmimY9uLCBvoXsNsERcJdkKceyOjgRbFhhxs058KTrne9Mg==", + "dependencies": { + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz", + "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==", + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.0", + "has": "^1.0.3", + "is-core-module": "^2.7.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/eslint-plugin-import/node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-import/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "24.3.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz", + "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==", + "dependencies": { + "@typescript-eslint/experimental-utils": "^4.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": ">= 4", + "eslint": ">=5" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/eslint-plugin-prettier": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", + "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", + "dependencies": { + "@typescript-eslint/experimental-utils": "^3.10.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "dependencies": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "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" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", + "dependencies": { + "@types/eslint": "^7.2.6", + "arrify": "^2.0.1", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-to-babel": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/estree-to-babel/-/estree-to-babel-3.2.1.tgz", + "integrity": "sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==", + "dependencies": { + "@babel/traverse": "^7.1.6", + "@babel/types": "^7.2.0", + "c8": "^7.6.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", + "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/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==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "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" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/express/node_modules/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=" + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/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==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/falafel": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz", + "integrity": "sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==", + "dependencies": { + "acorn": "^7.1.1", + "foreach": "^2.0.5", + "isarray": "^2.0.1", + "object-keys": "^1.0.6" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/falafel/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-isnumeric": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz", + "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==", + "dependencies": { + "is-string-blank": "^1.0.1" + } + }, + "node_modules/fast-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "node_modules/fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fetch-retry": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.3.tgz", + "integrity": "sha512-uJQyMrX5IJZkhoEUBQ3EjxkeiZkppBd5jS/fMTJmfZxLSiaQjv2zD0kTvuvkSH89uFvgSlB6ueGpjD3HWN7Bxw==" + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "node_modules/file-system-cache": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.1.0.tgz", + "integrity": "sha512-IzF5MBq+5CR0jXx5RxPe4BICl/oEhBSXKaL9fLhAXrIfIUS77Hr4vzrYyqYMHN6uTt+BOqi3fDCTjjEBCjERKw==", + "dependencies": { + "fs-extra": "^10.1.0", + "ramda": "^0.28.0" + } + }, + "node_modules/file-system-cache/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "node_modules/filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/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==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" + }, + "node_modules/flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash." + }, + "node_modules/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==", + "dependencies": { + "dtype": "^2.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/focus-lock": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.8.1.tgz", + "integrity": "sha512-/LFZOIo82WDsyyv7h7oc0MJF9ACOvDRdx9rWPZ2pgMfNWu/z8hQDBtOchuB/0BVLmuFOZjV02YwUVzNsWx/EzA==", + "dev": true, + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/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==", + "dependencies": { + "css-font": "^1.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "css-font": "^1.2.0" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "dependencies": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "engines": { + "node": ">=6.11.5", + "yarn": ">=1.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formik": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", + "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==", + "funding": [ + { + "type": "individual", + "url": "https://opencollective.com/formik" + } + ], + "dependencies": { + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "react-fast-compare": "^2.0.1", + "tiny-warning": "^1.0.2", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/formik/node_modules/deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "node_modules/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=", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzy-search": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/fuzzy-search/-/fuzzy-search-3.2.1.tgz", + "integrity": "sha512-vAcPiyomt1ioKAsAL2uxSABHJ4Ju/e4UeDM+g1OlR0vV4YhLGMNsdLNvZTpEDY4JCSt0E4hASCNM5t2ETtsbyg==" + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "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" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/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, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/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, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/gemoji": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-6.1.0.tgz", + "integrity": "sha512-MOlX3doQ1fsfzxQX8Y+u6bC5Ssc1pBUBIPVyrS69EzKt+5LIZAOm0G5XGVNhwXFgkBF3r+Yk88ONyrFHo8iNFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/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=" + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/git-config-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", + "integrity": "sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ=", + "dependencies": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "homedir-polyfill": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-config-path/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-username": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/git-username/-/git-username-1.0.0.tgz", + "integrity": "sha512-xm45KwBR6Eu1jO4umx/o2M84v9TC7tdOBuzLx8ayhdR9H1FBiiG9azz31uC0esDvaWVBTDINpJ5USomk+ja8OQ==", + "dependencies": { + "parse-github-url": "^1.0.2", + "remote-origin-url": "^1.0.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "dev": true + }, + "node_modules/gl-mat4": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", + "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" + }, + "node_modules/gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + }, + "node_modules/gl-text": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.3.1.tgz", + "integrity": "sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w==", + "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": "^2.0.0", + "to-px": "^1.0.1", + "typedarray-pool": "^1.1.0" + } + }, + "node_modules/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==", + "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" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-promise": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", + "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "dependencies": { + "@types/glob": "*" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "glob": "*" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globule": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", + "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", + "dev": true, + "dependencies": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/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=", + "dependencies": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "node_modules/glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha1-iUvvc5ENeSyBtRQxgANdCnivdtM=", + "dependencies": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + } + }, + "node_modules/glsl-resolve/node_modules/resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha1-3ZV5gufnNt699TtYpN2RdUV13UY=" + }, + "node_modules/glsl-resolve/node_modules/xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/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=" + }, + "node_modules/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=", + "dependencies": { + "glsl-tokenizer": "^2.0.0" + } + }, + "node_modules/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=" + }, + "node_modules/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=", + "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" + } + }, + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/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==", + "dependencies": { + "through2": "^0.6.3" + } + }, + "node_modules/glsl-tokenizer/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/glsl-tokenizer/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/glsl-tokenizer/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/glslify": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", + "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", + "dependencies": { + "bl": "^2.2.1", + "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.5", + "resolve": "^1.1.5", + "stack-trace": "0.0.9", + "static-eval": "^2.0.5", + "through2": "^2.0.1", + "xtend": "^4.0.0" + }, + "bin": { + "glslify": "bin.js" + } + }, + "node_modules/glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "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" + } + }, + "node_modules/glslify-deps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "dependencies": { + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "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" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "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" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "node_modules/grid-index": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "optional": true + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/gzipper": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gzipper/-/gzipper-5.0.1.tgz", + "integrity": "sha512-dGrx0KGY3pycpw1ecbQN35zA0SfJERJjwO2rN8F3zgtbNXdlgB1DlbUl4BnmyRrIjioN2g1o91lIDpMzXb95JQ==", + "dev": true, + "dependencies": { + "commander": "^7.2.0", + "deep-equal": "^2.0.5", + "uuid": "^8.3.2" + }, + "bin": { + "gzipper": "bin/index.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gzipper/node_modules/deep-equal": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", + "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "es-get-iterator": "^1.1.1", + "get-intrinsic": "^1.0.1", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.1.1", + "isarray": "^2.0.5", + "object-is": "^1.1.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.3", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gzipper/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/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==" + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", + "integrity": "sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g==", + "dependencies": { + "is-glob": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-glob/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-hover": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", + "integrity": "sha1-PZdDeusZnGK4rAisvcU9O8UsF/c=", + "dependencies": { + "is-browser": "^2.0.1" + } + }, + "node_modules/has-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dependencies": { + "is-browser": "^2.0.1" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-to-hyperscript/node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz", + "integrity": "sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hast-util-parse-selector": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz", + "integrity": "sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hastscript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.0.2.tgz", + "integrity": "sha512-uA8ooUY4ipaBvKcMuPehTAB/YfFLSSzCwFSwT6ltJbocFUKH/GDHLN+tflq7lSRf9H86uOuxOFkh1KgIy3Gg2g==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-from-parse5/node_modules/space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-is-element": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.1.tgz", + "integrity": "sha512-ag0fiZfRWsPiR1udvnSbaazJLGv8qd8E+/e3rW8rUZhbKG4HNJmFL4QkEceN+22BgE+uozXY30z/s+2dL6Z++g==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "node_modules/hast-util-raw/node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-raw/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/hast-util-raw/node_modules/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==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.3.tgz", + "integrity": "sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A==", + "dependencies": { + "@types/hast": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.2", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html/node_modules/property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html/node_modules/space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html/node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz", + "integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", + "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "node_modules/highcharts": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-9.3.2.tgz", + "integrity": "sha512-I/48gNMvs3hZxZnPRUqLbnlrGZJJ7YPPVr1+fYeZ35p4pSZAOwTmAGbptrjBr7JlF52HmJH9zMbt/I4TPLu9Pg==" + }, + "node_modules/highcharts-react-official": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/highcharts-react-official/-/highcharts-react-official-3.1.0.tgz", + "integrity": "sha512-CkWJHrVMOc6CT8KFu1dR+a0w5OxCVKKgZUNWtEi5TmR0xqBDIDe+RyM652MAN/jBYppxMo6TCUVlRObCyWAn0Q==", + "peerDependencies": { + "highcharts": ">=6.0.0", + "react": ">=16.8.0" + } + }, + "node_modules/history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "dependencies": { + "@babel/runtime": "^7.7.6" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/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==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "node_modules/hsluv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", + "integrity": "sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw=" + }, + "node_modules/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==", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/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==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "node_modules/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==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "node_modules/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==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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==", + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/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=" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-duration": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.27.0.tgz", + "integrity": "sha512-qLo/08cNc3Tb0uD7jK0jAcU5cnqCM0n568918E7R2XhMr/+7F37p4EY062W/stg7tmzvknNn9b/1+UhVRzsYrQ==" + }, + "node_modules/husky": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", + "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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=", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-palette": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/image-palette/-/image-palette-2.1.0.tgz", + "integrity": "sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ==", + "dependencies": { + "color-id": "^1.1.0", + "pxls": "^2.0.0", + "quantize": "^1.0.2" + } + }, + "node_modules/immer": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz", + "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/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==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "node_modules/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==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.1.tgz", + "integrity": "sha512-Ujwccrj9FkGqjbY3iVoxD1VV+KdZZeENx0rphrtzmRXbFvkFO88L80BL/zeSIguX/7T+y8k04xqtgWgS5vxwxw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/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==" + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-blob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz", + "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", + "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "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" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-dom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.1.0.tgz", + "integrity": "sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ==", + "dev": true, + "dependencies": { + "is-object": "^1.0.1", + "is-window": "^1.0.2" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-firefox": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", + "integrity": "sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "node_modules/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-iexplorer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", + "integrity": "sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, + "node_modules/is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dependencies": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-installed-globally/node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-mobile": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.2.tgz", + "integrity": "sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg==" + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-scoped": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-2.1.0.tgz", + "integrity": "sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==", + "dependencies": { + "scoped-regex": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-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==" + }, + "node_modules/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=" + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url-superb": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-3.0.0.tgz", + "integrity": "sha512-3faQP+wHCGDQT1qReM5zCPx2mxoal6DzbzquFlCYJLWyy4WPTved33ea2xFbX37z4NoriEwZGIYhFtx8RUB5wQ==", + "dependencies": { + "url-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "optional": true + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-window": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-window/-/is-window-1.0.2.tgz", + "integrity": "sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg==", + "dev": true + }, + "node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==" + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "dependencies": { + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" + } + }, + "node_modules/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 + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/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==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/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==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dependencies": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jest": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "dependencies": { + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-canvas-mock": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.3.1.tgz", + "integrity": "sha512-5FnSZPrX3Q2ZfsbYNE3wqKR3+XorN8qFzDzB5o0golWgt6EOX1+emBnpOc9IAQ+NXFj8Nzm3h7ZdE/9H0ylBcg==", + "dev": true, + "dependencies": { + "cssfontparser": "^1.2.1", + "moo-color": "^1.0.2" + } + }, + "node_modules/jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/jest-circus": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", + "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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==", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/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==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", + "dependencies": { + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dependencies": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", + "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^26.0.0", + "jest-watcher": "^26.3.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "jest": "^26.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dependencies": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dependencies": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "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.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsdom": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", + "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "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": "^8.5.0", + "ws": "^7.4.5", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz", + "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/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==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/jss": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.7.1.tgz", + "integrity": "sha512-5QN8JSVZR6cxpZNeGfzIjqPEP+ZJwJJfZbXmeABNdxiExyO+eJJDy6WDtqTf8SDKnbL5kZllEpAP71E/Lt7PXg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/jss" + } + }, + "node_modules/jss-plugin-camel-case": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.7.1.tgz", + "integrity": "sha512-+ioIyWvmAfgDCWXsQcW1NMnLBvRinOVFkSYJUgewQ6TynOcSj5F1bSU23B7z0p1iqK0PPHIU62xY1iNJD33WGA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.7.1" + } + }, + "node_modules/jss-plugin-default-unit": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.7.1.tgz", + "integrity": "sha512-tW+dfYVNARBQb/ONzBwd8uyImigyzMiAEDai+AbH5rcHg5h3TtqhAkxx06iuZiT/dZUiFdSKlbe3q9jZGAPIwA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "node_modules/jss-plugin-global": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.7.1.tgz", + "integrity": "sha512-FbxCnu44IkK/bw8X3CwZKmcAnJqjAb9LujlAc/aP0bMSdVa3/MugKQRyeQSu00uGL44feJJDoeXXiHOakBr/Zw==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "node_modules/jss-plugin-nested": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.7.1.tgz", + "integrity": "sha512-RNbICk7FlYKaJyv9tkMl7s6FFfeLA3ubNIFKvPqaWtADK0KUaPsPXVYBkAu4x1ItgsWx67xvReMrkcKA0jSXfA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-props-sort": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.7.1.tgz", + "integrity": "sha512-eyd5FhA+J0QrpqXxO7YNF/HMSXXl4pB0EmUdY4vSJI4QG22F59vQ6AHtP6fSwhmBdQ98Qd9gjfO+RMxcE39P1A==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "node_modules/jss-plugin-rule-value-function": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.7.1.tgz", + "integrity": "sha512-fGAAImlbaHD3fXAHI3ooX6aRESOl5iBt3LjpVjxs9II5u9tzam7pqFUmgTcrip9VpRqYHn8J3gA7kCtm8xKwHg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-template": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-template/-/jss-plugin-template-10.7.1.tgz", + "integrity": "sha512-FHQdbo5Yf13XOm9k7A+iJyUisY5yj6LGuLHOt3VR3yWRt6x/AzJ3q/znRKSNqZBaDFpNdxjIFZNAFFaVDd2cjQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-vendor-prefixer": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.7.1.tgz", + "integrity": "sha512-1UHFmBn7hZNsHXTkLLOL8abRl8vi+D1EVzWD4WmLFj55vawHZfnH1oEz6TUf5Y61XHv0smdHabdXds6BgOXe3A==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.7.1" + } + }, + "node_modules/jss/node_modules/csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + }, + "node_modules/jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "dependencies": { + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dependencies": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "node_modules/latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dependencies": { + "package-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lazy-universal-dotenv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz", + "integrity": "sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==", + "dependencies": { + "@babel/runtime": "^7.5.0", + "app-root-dir": "^1.0.2", + "core-js": "^3.0.4", + "dotenv": "^8.0.0", + "dotenv-expand": "^5.1.0" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=6.0.0", + "yarn": ">=1.0.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libnpx": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/libnpx/-/libnpx-10.2.4.tgz", + "integrity": "sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA==", + "dependencies": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^14.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + }, + "node_modules/libnpx/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/libnpx/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/libnpx/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/libnpx/node_modules/dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==", + "engines": { + "node": ">=4.6.0" + } + }, + "node_modules/libnpx/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/libnpx/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/libnpx/node_modules/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/node_modules/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==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/libnpx/node_modules/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==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dependencies": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/libnpx/node_modules/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==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/node_modules/yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "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" + } + }, + "node_modules/libnpx/node_modules/yargs-parser": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", + "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/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=" + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/lint-staged": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", + "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/listify": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/listify/-/listify-1.0.3.tgz", + "integrity": "sha512-083swF7iH7bx8666zdzBColpgEuy46HjN3r1isD4zV6Ix7FuHfb/2/WVnl4CH8hjuoWeFF7P5KkKNXUnJCFEJg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "optional": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "optional": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "optional": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "node_modules/lodash.findindex": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", + "integrity": "sha512-9er6Ccz6sEST3bHFtUrCFWk14nE8cdL/RoW1RRDV1BxqN3qsmsT56L14jhfctAqhVPVcdJw4MRxEaVoAK+JVvw==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha1-akAhj9x64V/HbD0PPmdsRlOIYD4=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/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, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "optional": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lower-case/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/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==", + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/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==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha1-63lhAxwPDo0AG/LVb6toXViCLzg=", + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/map-limit/node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==" + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "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" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-container": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-3.0.0.tgz", + "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==" + }, + "node_modules/markdown-it-emoji": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz", + "integrity": "sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ==" + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/marked": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", + "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/material-icons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-0.1.0.tgz", + "integrity": "sha512-xDTXrjrt03EiA+LL3nHttQs3DTGft/mV+JHSiVhQyl0Nk8SEwnNqB/fyu6REAz9mYoYCdr4vnhQzkTsGbx0BPg==" + }, + "node_modules/material-ui-audio-player": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/material-ui-audio-player/-/material-ui-audio-player-1.7.1.tgz", + "integrity": "sha512-5MGudB9K82Txm6cRoRaXS2AypPS3/kJvwPW5B+Gll8T6WIT6wPkX/NYpoOupasxuJKXXcSR+vNmCLh06QWdHbA==", + "dependencies": { + "classnames": "^2.2.6" + }, + "engines": { + "node": ">=v12.18.2", + "npm": "please-use-yarn", + "yarn": ">=v1.12.0" + }, + "peerDependencies": { + "@material-ui/core": ">=4.3.0", + "@material-ui/icons": ">=4.2.1", + "react": "*", + "react-dom": "*" + } + }, + "node_modules/math-log2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", + "integrity": "sha1-+4lBvl9evol55xjmJzsXjlhpRWU=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/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==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "dependencies": { + "unist-util-remove": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", + "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", + "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "node_modules/memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, + "node_modules/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=", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/middleearth-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/middleearth-names/-/middleearth-names-1.1.0.tgz", + "integrity": "sha1-wdXuSN77NoEo+66/686IR80Y3f8=", + "dependencies": { + "unique-random-array": "1.0.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", + "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/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==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/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==" + }, + "node_modules/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=" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/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, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "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" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/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==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/monaco-editor": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", + "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==" + }, + "node_modules/moo-color": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.2.tgz", + "integrity": "sha512-5iXz5n9LWQzx/C2WesGFfpE6RLamzdHwsn3KpfzShwbfIqs7stnoEpaNErf/7+3mbxwZ4s8Foq7I0tPxw7BWHg==", + "dev": true, + "dependencies": { + "color-name": "^1.1.4" + } + }, + "node_modules/mouse-change": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", + "integrity": "sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8=", + "dependencies": { + "mouse-event": "^1.0.0" + } + }, + "node_modules/mouse-event": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", + "integrity": "sha1-s3ie23EJmX1aky0dAdqhVDpQFzI=" + }, + "node_modules/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=" + }, + "node_modules/mouse-wheel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", + "integrity": "sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w=", + "dependencies": { + "right-now": "^1.0.0", + "signum": "^1.0.0", + "to-px": "^1.0.1" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "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" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/mrm": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/mrm/-/mrm-3.0.10.tgz", + "integrity": "sha512-aRByZsPXMM8W0NHNH9afkKyk5OW4bB5pYNRIN+8iSVfpMAzqeMejmj/yIYcdFNJTksXmdPMfTaucm2NYdh4xIw==", + "dependencies": { + "git-username": "^1.0.0", + "glob": "^7.1.6", + "inquirer": "^7.0.4", + "is-directory": "^0.3.1", + "kleur": "^3.0.3", + "libnpx": "^10.2.4", + "listify": "^1.0.0", + "lodash": "^4.17.15", + "longest": "^2.0.1", + "middleearth-names": "^1.1.0", + "minimist": "^1.2.0", + "mrm-core": "^6.1.7", + "semver-utils": "^1.1.4", + "update-notifier": "^4.1.0", + "user-home": "^2.0.0", + "user-meta": "^1.0.0", + "which": "^2.0.2" + }, + "bin": { + "mrm": "bin/mrm.js" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/mrm-core": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/mrm-core/-/mrm-core-6.1.7.tgz", + "integrity": "sha512-jLGWrkupcgGIsLerrI/xmM/dFHbaoehRsuVbgYBrxYKXNMRBHN3Mgkd8cw+/ZCCoiZEXF8/SaZol0GCp6oBQ9g==", + "dependencies": { + "babel-code-frame": "^6.26.0", + "comment-json": "^2.2.0", + "detect-indent": "^6.0.0", + "editorconfig": "^0.15.3", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "kleur": "^3.0.3", + "listify": "^1.0.0", + "lodash": "^4.17.15", + "minimist": "^1.2.0", + "prop-ini": "^0.0.2", + "rc": "^1.2.8", + "readme-badger": "^0.3.0", + "semver": "^6.3.0", + "smpltmpl": "^1.0.2", + "split-lines": "^2.0.0", + "strip-bom": "^4.0.0", + "validate-npm-package-name": "^3.0.0", + "webpack-merge": "^4.2.2", + "yaml": "^2.0.0-1" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/mrm-core/node_modules/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==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/mrm-core/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/mrm-core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/mrm-core/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/mrm-core/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/mrm-core/node_modules/yaml": { + "version": "2.0.0-9", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-9.tgz", + "integrity": "sha512-Bf2KowHjyVkIIiGMt7+fbhmlvKOaE8DWuD07bnL4+FQ9sPmEl/5IzGpBpoxPqOaHuyasBjJhyXDcISpJWfhCGw==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/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=" + }, + "node_modules/mumath": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/mumath/-/mumath-3.3.4.tgz", + "integrity": "sha1-SNSg8P2MrU57Mglu6JsWGmPTC78=", + "deprecated": "Redundant dependency in your project.", + "dependencies": { + "almost-equal": "^1.1.0" + } + }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "devOptional": true + }, + "node_modules/nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" + }, + "node_modules/native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", + "dependencies": { + "querystring": "^0.2.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nested-error-stacks": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==" + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/no-case/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node_modules/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==", + "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/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" + }, + "node_modules/node-sass": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tgz", + "integrity": "sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "meow": "^9.0.0", + "nan": "^2.13.2", + "node-gyp": "^7.1.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" + }, + "bin": { + "node-sass": "bin/node-sass" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/node-sass/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/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, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=" + }, + "node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-name": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/npm-name/-/npm-name-5.5.0.tgz", + "integrity": "sha512-l7/uyVfEi2e3ho+ovaJZC0xlbwzXNUz3RxkxpfcnLuoGKAuYoo9YoJ/uy18PsTD8IziugGHks4t/mGmBJEZ4Qg==", + "dependencies": { + "got": "^9.6.0", + "is-scoped": "^2.1.0", + "is-url-superb": "^3.0.0", + "lodash.zip": "^4.2.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.1.0", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dependencies": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "node_modules/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=", + "dependencies": { + "is-finite": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "node_modules/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, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/objectorarray": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", + "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==" + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "dependencies": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/orderedmap": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.5.tgz", + "integrity": "sha512-/fzlCGKRmfayGoI9UUXvJfc2nMZlJHW30QqEvwPvlg8tsX7jyiUSomYie6mYqx7Z9bOMGoag0H/q1PS/0PjYkg==" + }, + "node_modules/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==", + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/outline-icons": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/outline-icons/-/outline-icons-1.42.0.tgz", + "integrity": "sha512-px2wNGrzTDCU0pxUO2pKs5dgE3fdz3bQ3lpLA9CgzBpkcadpOQgRxxxyBQ12fyOXyKC0L4evAJeomoAtvMWISQ==", + "funding": { + "url": "https://github.com/sponsors/outline" + }, + "peerDependencies": { + "react": "^17.0.1", + "react-dom": "^17.0.1" + } + }, + "node_modules/p-all": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-all/-/p-all-2.1.0.tgz", + "integrity": "sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-all/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-filter/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dependencies": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dependencies": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json/node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/package-json/node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/package-json/node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/param-case/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parenthesis": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz", + "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==" + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/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==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-git-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz", + "integrity": "sha1-06mYQxcTL1c5hxK7pDjhKVkN34w=", + "dependencies": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "git-config-path": "^1.0.1", + "ini": "^1.3.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-git-config/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "bin": { + "parse-github-url": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", + "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", + "dependencies": { + "pick-by-alias": "^1.2.0" + } + }, + "node_modules/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=" + }, + "node_modules/parse-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", + "integrity": "sha1-fhu21b7zh0wo45JSaiVBFwKR7s8=" + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "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" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/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=" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/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==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/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==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/plotly.js": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.8.0.tgz", + "integrity": "sha512-bYuLdTlQEWMs/u3nNqV/jwERj9tw8qMDKBV8NBP1BucfapLoYIM9w4ARc3W9m93r6OYvP5I6ykUztiDmDcvA9Q==", + "dependencies": { + "@plotly/d3": "3.8.0", + "@plotly/d3-sankey": "0.7.2", + "@plotly/d3-sankey-circular": "0.33.1", + "@turf/area": "^6.4.0", + "@turf/bbox": "^6.4.0", + "@turf/centroid": "^6.0.2", + "canvas-fit": "^1.5.0", + "color-alpha": "1.0.4", + "color-normalize": "1.5.0", + "color-parse": "1.3.8", + "color-rgba": "2.1.1", + "country-regex": "^1.1.0", + "d3-force": "^1.2.1", + "d3-format": "^1.4.5", + "d3-geo": "^1.12.1", + "d3-geo-projection": "^2.9.0", + "d3-hierarchy": "^1.1.9", + "d3-interpolate": "^1.4.0", + "d3-time": "^1.1.0", + "d3-time-format": "^2.2.3", + "fast-isnumeric": "^1.1.4", + "gl-mat4": "^1.2.0", + "gl-text": "^1.3.1", + "glslify": "^7.1.1", + "has-hover": "^1.0.1", + "has-passive-events": "^1.0.0", + "is-mobile": "^2.2.2", + "mapbox-gl": "1.10.1", + "mouse-change": "^1.4.0", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.2.0", + "native-promise-only": "^0.8.1", + "parse-svg-path": "^0.1.2", + "polybooljs": "^1.2.0", + "probe-image-size": "^7.2.2", + "regl": "^2.1.0", + "regl-error2d": "^2.0.12", + "regl-line2d": "^3.1.2", + "regl-scatter2d": "^3.2.8", + "regl-splom": "^1.0.14", + "strongly-connected-components": "^1.0.1", + "superscript-text": "^1.0.0", + "svg-path-sdf": "^1.1.3", + "tinycolor2": "^1.4.2", + "to-px": "1.0.1", + "topojson-client": "^3.1.0", + "webgl-context": "^2.2.0", + "world-calendars": "^1.0.3" + } + }, + "node_modules/plotly.js/node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/plotly.js/node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/plotly.js/node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "node_modules/plotly.js/node_modules/d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "dependencies": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "node_modules/plotly.js/node_modules/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "node_modules/plotly.js/node_modules/d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "dependencies": { + "d3-array": "1" + } + }, + "node_modules/plotly.js/node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "node_modules/plotly.js/node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/plotly.js/node_modules/d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "node_modules/plotly.js/node_modules/d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "node_modules/plotly.js/node_modules/d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "dependencies": { + "d3-time": "1" + } + }, + "node_modules/plotly.js/node_modules/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==" + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/polished": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", + "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/polybooljs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.0.tgz", + "integrity": "sha1-tDkMLgedTCYtOyUExiiNlbp6R1g=" + }, + "node_modules/popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", + "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", + "dependencies": { + "postcss": "^7" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "browserslist": "^4" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dependencies": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/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==" + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/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==" + }, + "node_modules/postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dependencies": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-selectors/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "dependencies": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", + "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", + "dependencies": { + "postcss": "^7.0.26" + } + }, + "node_modules/postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-load-config/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/postcss-loader/node_modules/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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-loader/node_modules/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==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/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==" + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/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==" + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/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==" + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/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==" + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dependencies": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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==", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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==", + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-normalize": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", + "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", + "dependencies": { + "@csstools/normalize.css": "^10.1.0", + "browserslist": "^4.6.2", + "postcss": "^7.0.17", + "postcss-browser-comments": "^3.0.0", + "sanitize.css": "^10.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/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==" + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/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==" + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/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==" + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/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==" + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/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==" + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/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==" + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-url/node_modules/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==" + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/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==" + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/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==" + }, + "node_modules/postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dependencies": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/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==" + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-safe-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", + "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", + "dependencies": { + "postcss": "^8.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-safe-parser/node_modules/postcss": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dependencies": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "dependencies": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/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==" + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/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==" + }, + "node_modules/postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dependencies": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=6.14.4" + } + }, + "node_modules/postcss/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/postcss/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss/node_modules/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-eslint": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-12.0.0.tgz", + "integrity": "sha512-N8SGGQwAosISXTNl1E57sBbtnqUGlyRWjcfIUxyD3HF4ynehA9GZ8IfJgiep/OfYvCof/JEpy9ZqSl250Wia7A==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^3.0.0", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^7.9.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^2.0.0", + "pretty-format": "^23.0.1", + "require-relative": "^0.8.7", + "typescript": "^3.9.3", + "vue-eslint-parser": "~7.1.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", + "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", + "dev": true, + "dependencies": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "3.10.1", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "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" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/prettier-eslint/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier-eslint/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier-eslint/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/prettier-eslint/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/prettier-eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/prettier-eslint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier-eslint/node_modules/pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "node_modules/prettier-eslint/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, + "node_modules/probe-image-size": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.2.tgz", + "integrity": "sha512-QUm+w1S9WTsT5GZB830u0BHExrUmF0J4fyRm5kbLUMEP3fl9UVYXc3xOBVqZNnH9tnvVEJO8vDk3PMtsLqjxug==", + "dependencies": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/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==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/progress-bar-webpack-plugin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-2.1.0.tgz", + "integrity": "sha512-UtlZbnxpYk1wufEWfhIjRn2U52zlY38uvnzFhs8rRxJxC1hSqw88JNR2Mbpqq9Kix8L1nGb3uQ+/1BiUWbigAg==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "progress": "^2.0.3" + }, + "peerDependencies": { + "webpack": "^1.3.0 || ^2 || ^3 || ^4 || ^5" + } + }, + "node_modules/promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "node_modules/promise.allsettled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", + "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", + "dependencies": { + "array.prototype.map": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "iterate-value": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/promise.prototype.finally": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.4.tgz", + "integrity": "sha512-nNc3YbgMfLzqtqvO/q5DP6RR0SiHI9pUPGzyDf1q+usTwCN2kjvAnJkBb7bHe3o+fFSBPpsGMoYtaSi+LTNqng==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-ini": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/prop-ini/-/prop-ini-0.0.2.tgz", + "integrity": "sha1-ZzOny1JCrKsr5C5gdYPYEksXKls=", + "dependencies": { + "extend": "^3.0.0" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/property-expr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz", + "integrity": "sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==" + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.2.2.tgz", + "integrity": "sha512-TX+KpWudMon06frryfpO/u7hsQv2hu8L4VSVbCpi3/7wXHBgl+35mV85qfa3RpT8xD2f3MdeoTqH0vy5JdbXPg==", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.4.0.tgz", + "integrity": "sha512-6+YwTjmqDwlA/Dm+5wK67ezgqgjA/MhSDgaNxKUzH97SmeuWFXyLeDRxxOPZeSo7yTxcDGUCWTEjmQZsVBuMrQ==", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.2.2.tgz", + "integrity": "sha512-7YzuRBbu9W7HGQde84kCHfIjaRLNcAdeijbgqrm/R9dsdTWkV+rrdcmic/sCc+bptiNpvjCEE+R6hrbT8zFQeQ==", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.2.0.tgz", + "integrity": "sha512-B9v9xtf4fYbKxQwIr+3wtTDNLDZcmMMmGiI3TAPShnUzvo+Rmv1GiUrsQChY1meetHl7rhML2cppF3FTs7f7UQ==", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.1.3.tgz", + "integrity": "sha512-ZaHCLyBtvbyIHv0f5p6boQTIJjlD6o2NPZiEaZWT2DA+j591zS29QQEMT4lBqwcLW3qRSf7ZvoKNbf05YrsStw==", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.1.5.tgz", + "integrity": "sha512-8SZgPH3K+GLsHL2wKuwBD9rxhsbnVBTwpHCO4VUO5GmqUQlxd/2GtBVWTsyLq4Dp3N9nGgPd3+lZFKUDuVp+Vw==", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.8.0.tgz", + "integrity": "sha512-RxGyM8dqdmlkYpM3PY/C5JBputv2xeKLNRqFpN04TtFlR9McN9Tmpf8DaP6HblfaZ8RofdUtQW+ghdArjANLvQ==", + "dependencies": { + "markdown-it": "^12.0.0", + "prosemirror-model": "^1.0.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.16.1.tgz", + "integrity": "sha512-r1/w0HDU40TtkXp0DyKBnFPYwd8FSlUSJmGCGFv4DeynfeSlyQF2FD0RQbVEMOe6P3PpUSXM6LZBV7W/YNZ4mA==", + "dependencies": { + "orderedmap": "^1.1.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.1.6.tgz", + "integrity": "sha512-aFGEdaCWmJzouZ8DwedmvSsL50JpRkqhQ6tcpThwJONVVmCgI36LJHtoQ4VGZbusMavaBhXXr33zyD2IVsTlkw==", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-state": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.4.tgz", + "integrity": "sha512-Xkkrpd1y/TQ6HKzN3agsQIGRcLckUMA9u3j207L04mt8ToRgpGeyhbVv0HI7omDORIBHjR29b7AwlATFFf2GLA==", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.1.1.tgz", + "integrity": "sha512-LmCz4jrlqQZRsYRDzCRYf/pQ5CUcSOyqZlAj5kv67ZWBH1SVLP2U9WJEvQfimWgeRlIz0y0PQVqO1arRm1+woA==", + "dependencies": { + "prosemirror-keymap": "^1.1.2", + "prosemirror-model": "^1.8.1", + "prosemirror-state": "^1.3.1", + "prosemirror-transform": "^1.2.1", + "prosemirror-view": "^1.13.3" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.4.2.tgz", + "integrity": "sha512-bcIsf3uRZhfab0xRfyyxOEh6eqSszq/hJbDbmUumFnbHBoWhB/uXbpz6vvUxfk0XiEvrZDJ+5pXRrNDc1Hu3vQ==", + "dependencies": { + "prosemirror-model": "^1.0.0" + } + }, + "node_modules/prosemirror-utils": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/prosemirror-utils/-/prosemirror-utils-0.9.6.tgz", + "integrity": "sha512-UC+j9hQQ1POYfMc5p7UFxBTptRiGPR7Kkmbl3jVvU8VgQbkI89tR/GK+3QYC8n+VvBZrtAoCrJItNhWSxX3slA==", + "peerDependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.1", + "prosemirror-tables": "^0.9.1" + } + }, + "node_modules/prosemirror-view": { + "version": "1.23.12", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.23.12.tgz", + "integrity": "sha512-uvw9ZVz5dNDD9w1bzHkU2r4NWFlpFz85v9rCD8NAhQBau6LYhwM/crjry+C4JgeR8gy6pMXS5eJ1zhNLcK4ctQ==", + "dependencies": { + "prosemirror-model": "^1.16.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "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" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pxls": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/pxls/-/pxls-2.3.2.tgz", + "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" + } + }, + "node_modules/pxls/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/quantize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz", + "integrity": "sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4=", + "engines": { + "node": ">=0.10.21" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, + "node_modules/ramda": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz", + "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/raw-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc-align": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", + "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-cascader": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.7.0.tgz", + "integrity": "sha512-SFtGpwmYN7RaWEAGTS4Rkc62ZV/qmQGg/tajr/7mfIkleuu8ro9Hlk6J+aA0x1YS4zlaZBtTcSaXM01QMiEV/A==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.6.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz", + "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.4.2.tgz", + "integrity": "sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.2.1", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.2.tgz", + "integrity": "sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.1.4.tgz", + "integrity": "sha512-tuRk2Hzecczt4zSH09ZQkAPzvi28HxvTgsTJtqUHgPPezhE+UBypyNls1hLVehD8fpFbsA12flophT2rKT/W8Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-6", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.21.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", + "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-trigger": "^5.3.1", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "1.27.4", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.27.4.tgz", + "integrity": "sha512-PQColQnZimGKArnOh8V2907+VzDCXcqtFvHgevDLtqWc/P7YASb/FqntSmdS8q3VND5SHX3Y1vgMIzY22/f/0Q==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.8.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.13.0.tgz", + "integrity": "sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.0.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.0.6" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.1.4.tgz", + "integrity": "sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "7.3.11", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.3.11.tgz", + "integrity": "sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.23.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.13.1.tgz", + "integrity": "sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-menu": "~9.8.0", + "rc-textarea": "^0.4.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.22.5" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.8.2", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.2.tgz", + "integrity": "sha512-EahOJVjLuEnJsThoPN+mGnVm431RzVzDLZWHRS/YnXTQULa7OsgdJa/Y7qXxc3Z5sz8mgT6xYtgpmBXLxrZFaQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.8", + "rc-trigger": "^5.1.2", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.3.tgz", + "integrity": "sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.6.1.tgz", + "integrity": "sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.2.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.8.tgz", + "integrity": "sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.19.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz", + "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.7.0.tgz", + "integrity": "sha512-oZH6FZ3j4iuBxHB4NvQ6ABRsS2If/Kpty1YFFsji7/aej6ruGmfM7WnJWQ88AoPfpJ++ya5z+nVEA8yCRYGKyw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "date-fns": "2.x", + "dayjs": "1.x", + "moment": "^2.24.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.4.0", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-progress": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.1.tgz", + "integrity": "sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.2.tgz", + "integrity": "sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz", + "integrity": "sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.27.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.1.2.tgz", + "integrity": "sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.1.16", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.1.16.tgz", + "integrity": "sha512-71XLHleuZmufpdV2vis5oituRkhg2WNvLpVMJBGWRar6WGAVOHXaY9DR5HvwWry3EGTn19BqnL6Xbybje6f8YA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.2.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.0.1.tgz", + "integrity": "sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.18.1", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-5.0.0.tgz", + "integrity": "sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz", + "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.0.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.26.0.tgz", + "integrity": "sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.22.5", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "12.5.10", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.5.10.tgz", + "integrity": "sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.0.0", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.16.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.4.7.tgz", + "integrity": "sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.24.4", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.2.2.tgz", + "integrity": "sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.3.1", + "rc-trigger": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.3.tgz", + "integrity": "sha512-Oql2S9+ZmT+mfTp5SNo1XM0QvkENjc0mPRFsHWRFSPuKird0OYMZZKmLznUJ+0aGDeFFWN42wiUZJtMFhrLgLw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.4.8" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.5.5.tgz", + "integrity": "sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-trigger": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz", + "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.19.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-upload": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz", + "integrity": "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.29.2.tgz", + "integrity": "sha512-xHT9Dr3RD6tyvCibnH10l3mudC6TJjWNr9UDy3CrOGZqTY354OfdwP87ahKNe0b3A1dsysDldvx0SBuswhlOeA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/rc-virtual-list": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.4.13.tgz", + "integrity": "sha512-cPOVDmcNM7rH6ANotanMDilW/55XnFPw0Jh/GQYtrzZSy3AmWvCnqVNyNC/pgg3lfVmX2994dlzAhuUrd4jG7w==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.15.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc/node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-accessible-dropdown-menu-hook": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-accessible-dropdown-menu-hook/-/react-accessible-dropdown-menu-hook-3.1.0.tgz", + "integrity": "sha512-XOvct2l9Q1V5u29gdGHZhBYh3hUX3+syIwWC/uqBmmzJDttFMZKPug+Ut/oAsXTCeGn3+HcT1iqzLAFRtVrrJg==" + }, + "node_modules/react-app-polyfill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", + "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", + "dependencies": { + "core-js": "^3.6.5", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "whatwg-fetch": "^3.4.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-app-rewired": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.1.8.tgz", + "integrity": "sha512-wjXPdKPLscA7mn0I1de1NHrbfWdXz4S1ladaGgHVKdn1hTgKK5N6EdGIJM0KrS6bKnJBj7WuqJroDTsPKKr66Q==", + "dev": true, + "dependencies": { + "semver": "^5.6.0" + }, + "bin": { + "react-app-rewired": "bin/index.js" + }, + "peerDependencies": { + "react-scripts": ">=2.1.3" + } + }, + "node_modules/react-app-rewired/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz", + "integrity": "sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA==", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0", + "react-dom": "^16.8.5 || ^17.0.0" + } + }, + "node_modules/react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "dependencies": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-dev-utils/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/react-dev-utils/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "dependencies": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + }, + "node_modules/react-dev-utils/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/react-dev-utils/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/react-dev-utils/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/react-dev-utils/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/node_modules/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==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-docgen": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.3.tgz", + "integrity": "sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA==", + "dependencies": { + "@babel/core": "^7.7.5", + "@babel/generator": "^7.12.11", + "@babel/runtime": "^7.7.6", + "ast-types": "^0.14.2", + "commander": "^2.19.0", + "doctrine": "^3.0.0", + "estree-to-babel": "^3.1.0", + "neo-async": "^2.6.1", + "node-dir": "^0.1.10", + "strip-indent": "^3.0.0" + }, + "bin": { + "react-docgen": "bin/react-docgen.js" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/react-docgen-typescript": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", + "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", + "peerDependencies": { + "typescript": ">= 4.3.x" + } + }, + "node_modules/react-docgen-typescript-plugin": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2.tgz", + "integrity": "sha512-/8OKrPRDTAGDnOkumGvDWixfrNPrRWhEMGLZnJr1NiJtRwdvNRGqGA2J/SeSvWerawqSPxNyXK+EfERCir6mMw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "endent": "^2.0.1", + "find-cache-dir": "^3.3.1", + "flat-cache": "^3.0.4", + "micromatch": "^4.0.2", + "react-docgen-typescript": "^2.2.2", + "tslib": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "peerDependencies": { + "typescript": ">= 4.x", + "webpack": ">= 4" + } + }, + "node_modules/react-docgen-typescript-plugin/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/react-docgen-typescript-plugin/node_modules/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==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-docgen-typescript-plugin/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-docgen-typescript-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/react-docgen-typescript-plugin/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/react-docgen-typescript-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/react-docgen/node_modules/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==" + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-element-to-jsx-string": { + "version": "14.3.4", + "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.4.tgz", + "integrity": "sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg==", + "dependencies": { + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "17.0.2" + }, + "peerDependencies": { + "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1", + "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1" + } + }, + "node_modules/react-element-to-jsx-string/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-error-boundary": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", + "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + }, + "node_modules/react-fast-compare": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", + "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" + }, + "node_modules/react-inspector": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-5.1.1.tgz", + "integrity": "sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.0.0", + "is-dom": "^1.0.0", + "prop-types": "^15.0.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/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==" + }, + "node_modules/react-medium-image-zoom": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/react-medium-image-zoom/-/react-medium-image-zoom-3.1.3.tgz", + "integrity": "sha512-5CoU8whSCz5Xz2xNeGD34dDfZ6jaf/pybdfZh8HNUmA9mbXbLfj0n6bQWfEUwkq9lsNg1sEkyeIJq2tcvZY8bw==", + "peerDependencies": { + "prop-types": "^15.5.8", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/react-merge-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-1.1.0.tgz", + "integrity": "sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/react-plotly.js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.5.1.tgz", + "integrity": "sha512-Oya14whSHvPsYXdI0nHOGs1pZhMzV2edV7HAW1xFHD58Y73m/LbG2Encvyz1tztL0vfjph0JNhiwO8cGBJnlhg==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "plotly.js": ">1.34.0", + "react": ">0.13.0" + } + }, + "node_modules/react-portal": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-4.2.2.tgz", + "integrity": "sha512-vS18idTmevQxyQpnde0Td6ZcUlv+pD8GTyR42n3CHUQq9OHi1C4jDE4ZWEbEsrbrLRhSECYiao58cvocwMtP7Q==", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0", + "react-dom": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/react-redux": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", + "integrity": "sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/react-redux": "^7.1.16", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^16.13.1" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/react-remove-scroll/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/react-router": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "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" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-dom/node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "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" + } + }, + "node_modules/react-router/node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "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" + } + }, + "node_modules/react-router/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-scripts": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", + "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", + "dependencies": { + "@babel/core": "7.12.3", + "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", + "@svgr/webpack": "5.5.0", + "@typescript-eslint/eslint-plugin": "^4.5.0", + "@typescript-eslint/parser": "^4.5.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^26.6.0", + "babel-loader": "8.1.0", + "babel-plugin-named-asset-import": "^0.3.7", + "babel-preset-react-app": "^10.0.0", + "bfj": "^7.0.2", + "camelcase": "^6.1.0", + "case-sensitive-paths-webpack-plugin": "2.3.0", + "css-loader": "4.3.0", + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0", + "eslint": "^7.11.0", + "eslint-config-react-app": "^6.0.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jest": "^24.1.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-testing-library": "^3.9.2", + "eslint-webpack-plugin": "^2.5.2", + "file-loader": "6.1.1", + "fs-extra": "^9.0.1", + "html-webpack-plugin": "4.5.0", + "identity-obj-proxy": "3.0.0", + "jest": "26.6.0", + "jest-circus": "26.6.0", + "jest-resolve": "26.6.0", + "jest-watch-typeahead": "0.6.1", + "mini-css-extract-plugin": "0.11.3", + "optimize-css-assets-webpack-plugin": "5.0.4", + "pnp-webpack-plugin": "1.6.4", + "postcss-flexbugs-fixes": "4.2.1", + "postcss-loader": "3.0.0", + "postcss-normalize": "8.0.1", + "postcss-preset-env": "6.7.0", + "postcss-safe-parser": "5.0.2", + "prompts": "2.4.0", + "react-app-polyfill": "^2.0.0", + "react-dev-utils": "^11.0.3", + "react-refresh": "^0.8.3", + "resolve": "1.18.1", + "resolve-url-loader": "^3.1.2", + "sass-loader": "^10.0.5", + "semver": "7.3.2", + "style-loader": "1.3.0", + "terser-webpack-plugin": "4.2.3", + "ts-pnp": "1.2.0", + "url-loader": "4.1.1", + "webpack": "4.44.2", + "webpack-dev-server": "3.11.1", + "webpack-manifest-plugin": "2.2.0", + "workbox-webpack-plugin": "5.1.4" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.1.3" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/sass-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", + "dependencies": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", + "sass": "^1.3.0", + "webpack": "^4.36.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/react-select": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.1.tgz", + "integrity": "sha512-u/brzm3B6vgI+PtxNyE4/18kXgaf6bn5sOAjKhaQ54EItBfW41SRLH1AJC5fefPnGM4JmMcM51t/HAVCi5GrpQ==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-select/node_modules/@floating-ui/core": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.4.tgz", + "integrity": "sha512-SQOeVbMwb1di+mVWWJLpsUTToKfqVNioXys011beCAhyOIFtS+GQoW4EQSneuxzmQKddExDwQ+X0hLl4lJJaSQ==" + }, + "node_modules/react-select/node_modules/@floating-ui/dom": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.5.tgz", + "integrity": "sha512-+sAUfpQ3Frz+VCbPCqj+cZzvEESy3fjSeT/pDWkYCWOBXYNNKZfuVsHuv8/JO2zze8+Eb/Q7a6hZVgzS81fLbQ==", + "dependencies": { + "@floating-ui/core": "^1.2.4" + } + }, + "node_modules/react-select/node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "node_modules/react-split": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/react-split/-/react-split-2.0.14.tgz", + "integrity": "sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA==", + "dependencies": { + "prop-types": "^15.5.7", + "split.js": "^1.6.0" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-virtualized": { + "version": "9.22.3", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz", + "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha", + "react-dom": "^15.3.0 || ^16.0.0-alpha" + } + }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.5.tgz", + "integrity": "sha512-kivjYVWX15TX2IUrm8F1jaCEX8EXrpy3DD+u41WGqJ1ZqbljWpiwscV+VxOM1l7sSIM1jwi2LADjhhAJkJ9dxA==", + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0" + } + }, + "node_modules/react-virtualized-tree": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/react-virtualized-tree/-/react-virtualized-tree-3.4.1.tgz", + "integrity": "sha512-MolDiG9XgmflPPX9uPzf7iSWLqOHDlCZEiyA4FVYjv2pHfu6zV6/SIEFVyHdurWD80IjUuZ3Er12gq2bQQak2Q==", + "dependencies": { + "classnames": "^2.2.5", + "lodash": "^4.17.4", + "lodash.debounce": "^4.0.8", + "lodash.findindex": "^4.6.0", + "lodash.isequal": "^4.5.0", + "lodash.omit": "^4.5.0", + "material-icons": "^0.1.0", + "react-lifecycles-compat": "^3.0.4", + "reselect": "^3.0.1" + }, + "peerDependencies": { + "react": "16.x", + "react-dom": "^16.2.0", + "react-virtualized": "^9.13.0" + } + }, + "node_modules/react-window": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", + "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "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" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readme-badger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/readme-badger/-/readme-badger-0.3.0.tgz", + "integrity": "sha512-+sMOLSs1imZUISZ2Rhz7qqVd77QtpcAPbGeIraFdgJmijb04YtdlPjGNBvDChTNtLbeQ6JNGQy3pOgslWfaP3g==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redux": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz", + "integrity": "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/refractor": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.5.0.tgz", + "integrity": "sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.25.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/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==", + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + }, + "node_modules/regex-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regex-regex/-/regex-regex-1.0.0.tgz", + "integrity": "sha1-kEih6uuHD01IDavHb8Qs3MC8OnI=" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "node_modules/regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/regl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/regl/-/regl-2.1.0.tgz", + "integrity": "sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==" + }, + "node_modules/regl-error2d": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz", + "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==", + "dependencies": { + "array-bounds": "^1.0.1", + "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.1.0", + "update-diff": "^1.1.0" + } + }, + "node_modules/regl-line2d": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.2.tgz", + "integrity": "sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ==", + "dependencies": { + "array-bounds": "^1.0.1", + "array-find-index": "^1.0.2", + "array-normalize": "^1.1.4", + "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.1.0" + } + }, + "node_modules/regl-scatter2d": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.2.8.tgz", + "integrity": "sha512-bqrqJyeHkGBa9mEfuBnRd7FUtdtZ1l+gsM2C5Ugr1U3vJG5K3mdWdVWtOAllZ5FHHyWJV/vgjVvftgFUg6CDig==", + "dependencies": { + "@plotly/point-cluster": "^3.1.9", + "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", + "to-float32": "^1.1.0", + "update-diff": "^1.1.0" + } + }, + "node_modules/regl-splom": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz", + "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==", + "dependencies": { + "array-bounds": "^1.0.1", + "array-range": "^1.0.1", + "color-alpha": "^1.0.4", + "flatten-vertex-data": "^1.0.2", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "raf": "^3.4.1", + "regl-scatter2d": "^3.2.3" + } + }, + "node_modules/rehype": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.0.tgz", + "integrity": "sha512-gZcttmf9R5IYHb8AlI1rlmWqXS1yX0rSB/S5ZGJs8atfYZy2DobvH3Ic/gSzB+HL/+oOHPtBguw1TprfhxXBgQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "rehype-parse": "^8.0.0", + "rehype-stringify": "^9.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.3.tgz", + "integrity": "sha512-RGw0CVt+0S6KdvpE8bbP2Db9WXclQcIX7A0ufM3QFqAhTo/ddJMQrrI2j3cijlRPZlGK8R3pRgC8U5HyV76IDw==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^6.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.2.tgz", + "integrity": "sha512-BuVA6lAEYtOpXO2xuHLohAzz8UNoQAxAqYRqh4QEEtU39Co+P1JBZhw6wXA9hMWp+JLcmrxWH8+UKcNSr443Fw==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-external-links": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz", + "integrity": "sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "is-absolute-url": "^3.0.0", + "mdast-util-definitions": "^4.0.0", + "space-separated-tokens": "^1.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-external-links/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-mdx/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/remark-mdx/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/remark-mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/remark-mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remark-mdx/node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/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==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse/node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-parse/node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-slug": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", + "integrity": "sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==", + "dev": true, + "dependencies": { + "github-slugger": "^1.0.0", + "mdast-util-to-string": "^1.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "dependencies": { + "mdast-squeeze-paragraphs": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remote-origin-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-1.0.0.tgz", + "integrity": "sha512-xHDM6IBqivpiQ1e4WOuFpM/T6rbzA/WBsu+3WLtgPOhHyjA0nYlijV3NprlTb4FcXlQ5+Q+z174sQ1NnUF5FwA==", + "dependencies": { + "parse-git-config": "^1.1.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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=" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "optional": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/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, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==" + }, + "node_modules/require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "node_modules/reselect": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", + "integrity": "sha512-b/6tFZCmRhtBMa4xGqiiRp9jh9Aqi2A687Lo265cN0/QohJQEBPiQ52f4QB6i0eF3yp3hmLL21LSGBcML2dlxA==" + }, + "node_modules/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==" + }, + "node_modules/resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "dependencies": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/resolve-url-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", + "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", + "dependencies": { + "adjust-sourcemap-loader": "3.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.36", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/resolve-url-loader/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve-url-loader/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/resolve-url-loader/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "dependencies": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + } + }, + "node_modules/rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, + "node_modules/rework/node_modules/convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + }, + "node_modules/rework/node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "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" + } + }, + "node_modules/rework/node_modules/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==", + "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" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "node_modules/rich-markdown-editor": { + "version": "11.21.3", + "resolved": "https://registry.npmjs.org/rich-markdown-editor/-/rich-markdown-editor-11.21.3.tgz", + "integrity": "sha512-XqVDfwDiGMVVtb+HUY35FQvfo97ECAe+Pgo1veFiYiL5f9Jfp9zuF6fOK5eze9h8rApBsgD9iVHEsA8/gyv5Jg==", + "dependencies": { + "copy-to-clipboard": "^3.0.8", + "fuzzy-search": "^3.2.1", + "gemoji": "6.x", + "lodash": "^4.17.11", + "markdown-it": "^12.2.0", + "markdown-it-container": "^3.0.0", + "markdown-it-emoji": "^2.0.0", + "outline-icons": "^1.38.1", + "prosemirror-commands": "^1.1.6", + "prosemirror-dropcursor": "^1.3.3", + "prosemirror-gapcursor": "^1.1.5", + "prosemirror-history": "^1.1.3", + "prosemirror-inputrules": "^1.1.3", + "prosemirror-keymap": "^1.1.4", + "prosemirror-markdown": "^1.5.2", + "prosemirror-model": "^1.13.3", + "prosemirror-schema-list": "^1.1.2", + "prosemirror-state": "^1.3.4", + "prosemirror-tables": "^1.1.1", + "prosemirror-transform": "1.2.5", + "prosemirror-utils": "^0.9.6", + "prosemirror-view": "1.18.1", + "react-medium-image-zoom": "^3.1.3", + "react-portal": "^4.2.1", + "refractor": "^3.3.1", + "resize-observer-polyfill": "^1.5.1", + "slugify": "^1.4.0", + "smooth-scroll-into-view-if-needed": "^1.1.29" + }, + "funding": { + "url": "https://github.com/sponsors/outline" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0", + "react-dom": "^16.0.0 || ^17.0.0", + "styled-components": "^5.0.0" + } + }, + "node_modules/rich-markdown-editor/node_modules/prosemirror-transform": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.2.5.tgz", + "integrity": "sha512-eqeIaxWtUfOnpA1ERrXCuSIMzqIJtL9Qrs5uJMCjY5RMSaH5o4pc390SAjn/IDPeIlw6auh0hCCXs3wRvGnQug==", + "dependencies": { + "prosemirror-model": "^1.0.0" + } + }, + "node_modules/rich-markdown-editor/node_modules/prosemirror-view": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.18.1.tgz", + "integrity": "sha512-TZd8byDRfdopLiokBY7T27msCSfWqqRxWs/LnBbdI030F+iI2kS+tO59/XFnpZxMLFKlJgOgGGhM9SzD1Nwdxw==", + "dependencies": { + "prosemirror-model": "^1.1.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/right-now": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", + "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, + "node_modules/rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "dependencies": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + }, + "bin": { + "rollup": "dist/bin/rollup" + } + }, + "node_modules/rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel.", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" + }, + "peerDependencies": { + "@babel/core": "7 || ^7.0.0-rc.2", + "rollup": ">=0.60.0 <3" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", + "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "dependencies": { + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^4.0.0", + "terser": "^4.6.2" + }, + "peerDependencies": { + "rollup": ">=0.66.0 <3" + } + }, + "node_modules/rollup-plugin-terser/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dependencies": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + }, + "node_modules/rope-sequence": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz", + "integrity": "sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg==" + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", + "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" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "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" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/sane/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sane/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/sanitize.css": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", + "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + }, + "node_modules/sass": { + "version": "1.38.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.38.1.tgz", + "integrity": "sha512-Lj8nPaSYOuRhgqdyShV50fY5jKnvaRmikUNalMPmbH+tKMGgEKVkltI/lP30PEfO2T1t6R9yc2QIBLgOc3uaFw==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/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, + "dependencies": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "bin": { + "sassgraph": "bin/sassgraph" + } + }, + "node_modules/sass-graph/node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sass-graph/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/sass-graph/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/sass-graph/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/sass-graph/node_modules/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 + }, + "node_modules/sass-graph/node_modules/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, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/sass-graph/node_modules/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, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/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, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/sass-graph/node_modules/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, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/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, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "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" + } + }, + "node_modules/sass-graph/node_modules/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, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/scoped-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-2.1.0.tgz", + "integrity": "sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.29", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz", + "integrity": "sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==", + "dependencies": { + "compute-scroll-into-view": "^1.0.17" + } + }, + "node_modules/scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "dependencies": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + } + }, + "node_modules/scss-tokenizer/node_modules/source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "node_modules/selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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 + }, + "node_modules/semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dependencies": { + "semver": "^5.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==" + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/send/node_modules/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==" + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-favicon": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", + "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", + "dependencies": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-favicon/node_modules/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==" + }, + "node_modules/serve-favicon/node_modules/safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/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=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/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==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/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==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/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==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "optional": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/signum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", + "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/sirv": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", + "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sirv/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slugify": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", + "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/smooth-scroll-into-view-if-needed": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/smooth-scroll-into-view-if-needed/-/smooth-scroll-into-view-if-needed-1.1.33.tgz", + "integrity": "sha512-crS8NfAaoPrtVYOCMSAnO2vHRgUp22NiiDgEQ7YiaAy5xe2jmR19Jm+QdL8+97gO8ENd7PUyQIAQojJyIiyRHw==", + "dependencies": { + "scroll-into-view-if-needed": "^2.2.28" + } + }, + "node_modules/smpltmpl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/smpltmpl/-/smpltmpl-1.0.2.tgz", + "integrity": "sha512-Hq23NNgeZigOzIiX1dkb6W3gFn2/XQj43KhPxu65IMieG/gIwf/lQb1IudjYv0c/5LwJeS/mPayYzyo+8WJMxQ==", + "dependencies": { + "babel-code-frame": "^6.26.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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==", + "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" + } + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "node_modules/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==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "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" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/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==", + "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" + } + }, + "node_modules/spdy-transport/node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/split-lines": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-2.1.0.tgz", + "integrity": "sha512-8dv+1zKgTpfTkOy8XZLFyWrfxO0NV/bj/3EaQ+hBrBxGv2DwiroljPjU8NlCr+59nLnsVm9WYT7lXKwe4TC6bw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split.js": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", + "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "node_modules/stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=", + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" + }, + "node_modules/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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/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==", + "dependencies": { + "escodegen": "^1.11.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/store2": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz", + "integrity": "sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==" + }, + "node_modules/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==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/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==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/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==", + "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" + } + }, + "node_modules/stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", + "dependencies": { + "debug": "2" + } + }, + "node_modules/stream-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stream-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "node_modules/string-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==", + "dependencies": { + "parenthesis": "^3.1.5" + } + }, + "node_modules/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==", + "dependencies": { + "atob-lite": "^2.0.0", + "is-base64": "^0.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.padstart": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.1.4.tgz", + "integrity": "sha512-XqOHj8horGsF+zwxraBvMTkBFM28sS/jHBJajh17JtJKA92qazidiQbLosV4UA18azvLOVKYo/E3g3T9Y5826w==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.2.tgz", + "integrity": "sha512-MTxTVcEkorNtBbNpoFJPEh0kKdM6+QbMjLbaxmvaPMmayOXdr/AIVIIJX7FReUVweRBFJfZepK4A4AKgwuFpMQ==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities/node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "dependencies": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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=" + }, + "node_modules/style-loader": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/styled-components": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.3.tgz", + "integrity": "sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^0.8.8", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-components/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, + "node_modules/supercluster": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.4.tgz", + "integrity": "sha512-GhKkRM1jMR6WUwGPw05fs66pOFWhf59lXq+Q3J3SxPvhNcmgOtLRV6aVQPMRsmXdpaeFJGivt+t7QXUPL3ff4g==", + "dependencies": { + "kdbush": "^3.0.0" + } + }, + "node_modules/superscript-text": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", + "integrity": "sha1-58snUlZzYN9QvrBhDOjfPXHY39g=" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==" + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svg-path-bounds": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz", + "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==", + "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" + } + }, + "node_modules/svg-path-bounds/node_modules/normalize-svg-path": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", + "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", + "dependencies": { + "svg-arc-to-cubic-bezier": "^3.0.0" + } + }, + "node_modules/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==", + "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" + } + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "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" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==" + }, + "node_modules/symbol.prototype.description": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz", + "integrity": "sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-symbol-description": "^1.0.0", + "has-symbols": "^1.0.2", + "object.getownpropertydescriptors": "^2.1.2" + }, + "engines": { + "node": ">= 0.11.15" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synchronous-promise": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.16.tgz", + "integrity": "sha512-qImOD23aDfnIDNqlG1NOehdB9IYsn1V9oByPjKY1nakv2MQYCEMyX033/q+aEtYCpmYK1cv2+NTmlH+ra6GA5A==" + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/telejson": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-6.0.8.tgz", + "integrity": "sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==", + "dependencies": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.2", + "is-regex": "^1.1.2", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3" + } + }, + "node_modules/telejson/node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "dependencies": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dependencies": { + "execa": "^0.7.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/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=", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/term-size/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dependencies": { + "cross-spawn": "^5.0.1", + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/node_modules/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==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/term-size/node_modules/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=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/term-size/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "node_modules/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==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "dependencies": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/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==" + }, + "node_modules/terser-webpack-plugin/node_modules/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==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/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==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", + "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/terser/node_modules/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==" + }, + "node_modules/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==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "node_modules/tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "node_modules/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==" + }, + "node_modules/tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", + "engines": { + "node": "*" + } + }, + "node_modules/tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, + "node_modules/tlds": { + "version": "1.221.1", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.221.1.tgz", + "integrity": "sha512-N1Afn/SLeOQRpxMwHBuNFJ3GvGrdtY4XPXKPFcx8he0U9Jg9ZkvTKE1k3jQDtCmlFn44UxjVtouF6PT4rEGd3Q==", + "bin": { + "tlds": "bin.js" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "node_modules/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==", + "dependencies": { + "flatten-vertex-data": "^1.0.2", + "is-blob": "^2.0.1", + "string-to-arraybuffer": "^1.0.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-float32": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz", + "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==" + }, + "node_modules/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=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-px": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", + "integrity": "sha1-W7rtXl1PdkRbzJA8KTojB90yRkY=", + "dependencies": { + "parse-unit": "^1.0.1" + } + }, + "node_modules/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/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==", + "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" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/topojson-client/node_modules/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==" + }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz", + "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/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, + "dependencies": { + "glob": "^7.1.2" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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=" + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typedarray-pool": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", + "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", + "dependencies": { + "bit-twiddle": "^1.0.0", + "dup": "^1.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typeface-roboto": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/typeface-roboto/-/typeface-roboto-1.1.13.tgz", + "integrity": "sha512-YXvbd3a1QTREoD+FJoEkl0VQNJoEjewR2H11IjVv4bp6ahuIcw0yyw/3udC4vJkHw3T3cUh85FTg8eWef3pSaw==" + }, + "node_modules/typescript": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + }, + "node_modules/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==", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.0.tgz", + "integrity": "sha512-4U3ru/BRXYYhKbwXV6lU6bufLikoAavTwev89H5UxY8enDFaAT2VXmIXYNm6hb5oHPng/EXr77PVyDFcptbk5g==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz", + "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-random": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-random/-/unique-random-1.0.0.tgz", + "integrity": "sha1-zj4iTIJCzTOg53sNcYDXfmti0MQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-random-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-random-array/-/unique-random-array-1.0.0.tgz", + "integrity": "sha1-QrNyHFeTiNi2Z8k8Lb3j1dgakTY=", + "dependencies": { + "unique-random": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/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==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz", + "integrity": "sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/untildify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", + "integrity": "sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==", + "optional": true, + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "engines": { + "node": ">=4" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", + "integrity": "sha1-9RAYLYHugZ+4LDprIrYrve2ngI8=" + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/update-notifier/node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + }, + "node_modules/update-notifier/node_modules/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==", + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/update-notifier/node_modules/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==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/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=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url-parse-lax/node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/url-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-5.0.0.tgz", + "integrity": "sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g==", + "dependencies": { + "ip-regex": "^4.1.0", + "tlds": "^1.203.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/url-regex/node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/url/node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-callback-ref/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-memo-one": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.2.tgz", + "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/user-meta": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/user-meta/-/user-meta-1.0.0.tgz", + "integrity": "sha512-Q/opMgFhVbBkdlTs44UKzV7L5Uj2zrJ4MVPXTTzJmrU1bHb2cX6wJzBIqEf1gROTzZIH8u39WmHsa5EvfnMPrw==", + "dependencies": { + "rc": "^1.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "node_modules/utils-copy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/utils-copy/-/utils-copy-1.1.1.tgz", + "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" + } + }, + "node_modules/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=", + "dependencies": { + "object-keys": "^1.0.9", + "utils-copy": "^1.1.0" + } + }, + "node_modules/utils-indexof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-indexof/-/utils-indexof-1.0.0.tgz", + "integrity": "sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w=", + "dependencies": { + "validate.io-array-like": "^1.0.1", + "validate.io-integer-primitive": "^1.0.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/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=", + "dependencies": { + "regex-regex": "^1.0.0", + "validate.io-string-primitive": "^1.0.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "devOptional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uuid-browser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid-browser/-/uuid-browser-3.1.0.tgz", + "integrity": "sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==", + "dev": true + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "node_modules/v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/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==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/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=" + }, + "node_modules/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=", + "dependencies": { + "const-max-uint32": "^1.0.2", + "validate.io-integer-primitive": "^1.0.0" + } + }, + "node_modules/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=" + }, + "node_modules/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=", + "dependencies": { + "validate.io-number": "^1.0.3" + } + }, + "node_modules/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=", + "dependencies": { + "validate.io-number-primitive": "^1.0.0" + } + }, + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/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=", + "dependencies": { + "validate.io-integer": "^1.0.5" + } + }, + "node_modules/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=" + }, + "node_modules/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=" + }, + "node_modules/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=", + "dependencies": { + "validate.io-integer": "^1.0.5" + } + }, + "node_modules/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=" + }, + "node_modules/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==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vfile": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.2.0.tgz", + "integrity": "sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz", + "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/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==" + }, + "node_modules/vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "dependencies": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "node_modules/vue-eslint-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz", + "integrity": "sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "eslint-scope": "^5.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.0.1", + "lodash": "^4.17.15" + }, + "engines": { + "node": ">=8.10" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vue-eslint-parser/node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz", + "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==" + }, + "node_modules/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==", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "optional": true, + "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" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/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=", + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/node_modules/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=", + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-vitals": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", + "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" + }, + "node_modules/webgl-context": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", + "integrity": "sha1-jzfXJXz23xzQpJ5qextyG5TMhqA=", + "dependencies": { + "get-canvas-context": "^1.0.1" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "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.3.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.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz", + "integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^6.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", + "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "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" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/webpack-dev-server/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/webpack-dev-server/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/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=", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "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" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-dynamic-public-path": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/webpack-dynamic-public-path/-/webpack-dynamic-public-path-1.0.8.tgz", + "integrity": "sha512-AF6onorpvmiC+I/dQ19SOi+oN66oEy9h4deam7gPs1Qa1mOQ9i7IRsOahaukohKAciys7NfX+YFboRn4rmpuKw==", + "dev": true + }, + "node_modules/webpack-filter-warnings-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz", + "integrity": "sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==", + "engines": { + "node": ">= 4.3 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/webpack-hot-middleware": { + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.3.tgz", + "integrity": "sha512-IK/0WAHs7MTu1tzLTjio73LjS3Ov+VvBKQmE8WPlJutgG5zT6Urgq/BbAdRrHTRpyzK0dvAvFh1Qg98akxgZpA==", + "dependencies": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/webpack-hot-middleware/node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-log/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "dependencies": { + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.11.5" + }, + "peerDependencies": { + "webpack": "2 || 3 || 4" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz", + "integrity": "sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==", + "dependencies": { + "debug": "^3.0.0" + } + }, + "node_modules/webpack-virtual-modules/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "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" + } + }, + "node_modules/webpack/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/webpack/node_modules/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==", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/node_modules/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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/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==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack/node_modules/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==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/webpack/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/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==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "node_modules/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==" + }, + "node_modules/whatwg-url": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz", + "integrity": "sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dependencies": { + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/workbox-background-sync": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", + "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", + "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-build": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", + "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", + "dependencies": { + "@babel/core": "^7.8.4", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@hapi/joi": "^15.1.0", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.1", + "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.6", + "lodash.template": "^4.5.0", + "pretty-bytes": "^5.3.0", + "rollup": "^1.31.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-terser": "^5.3.1", + "source-map": "^0.7.3", + "source-map-url": "^0.4.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "tempy": "^0.3.0", + "upath": "^1.2.0", + "workbox-background-sync": "^5.1.4", + "workbox-broadcast-update": "^5.1.4", + "workbox-cacheable-response": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-expiration": "^5.1.4", + "workbox-google-analytics": "^5.1.4", + "workbox-navigation-preload": "^5.1.4", + "workbox-precaching": "^5.1.4", + "workbox-range-requests": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4", + "workbox-streams": "^5.1.4", + "workbox-sw": "^5.1.4", + "workbox-window": "^5.1.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/workbox-build/node_modules/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==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/workbox-build/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", + "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-core": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", + "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + }, + "node_modules/workbox-expiration": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", + "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-google-analytics": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", + "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "dependencies": { + "workbox-background-sync": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", + "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-precaching": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", + "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-range-requests": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", + "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-routing": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", + "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-strategies": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", + "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "dependencies": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "node_modules/workbox-streams": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", + "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "dependencies": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "node_modules/workbox-sw": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", + "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" + }, + "node_modules/workbox-webpack-plugin": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "fast-json-stable-stringify": "^2.0.0", + "source-map-url": "^0.4.0", + "upath": "^1.1.2", + "webpack-sources": "^1.3.0", + "workbox-build": "^5.1.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/workbox-window": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", + "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/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==", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/worker-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", + "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + }, + "engines": { + "node": ">= 6.9.0 || >= 8.9.0" + }, + "peerDependencies": { + "webpack": "^3.0.0 || ^4.0.0-alpha.0 || ^4.0.0" + } + }, + "node_modules/worker-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/worker-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/worker-loader/node_modules/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, + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "dependencies": { + "microevent.ts": "~0.1.1" + } + }, + "node_modules/world-calendars": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", + "integrity": "sha1-slxQMrokEo/8QdCfr0pewbnBQzU=", + "dependencies": { + "object-assign": "^4.1.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/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==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", + "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/x-default-browser": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/x-default-browser/-/x-default-browser-0.4.0.tgz", + "integrity": "sha512-7LKo7RtWfoFN/rHx1UELv/2zHGMx8MkZKDq1xENmOCTkfIqZJ0zZ26NEJX8czhnPXVcqS0ARjjfJB+eJ0/5Cvw==", + "bin": { + "x-default-browser": "bin/x-default-browser.js" + }, + "optionalDependencies": { + "default-browser-id": "^1.0.4" + } + }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/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==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yup": { + "version": "0.32.9", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.9.tgz", + "integrity": "sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==", + "dependencies": { + "@babel/runtime": "^7.10.5", + "@types/lodash": "^4.14.165", + "lodash": "^4.17.20", + "lodash-es": "^4.17.15", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/zustand": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.1.1.tgz", + "integrity": "sha512-h4F3WMqsZgvvaE0n3lThx4MM81Ls9xebjvrABNzf5+jb3/03YjNTSgZXeyrvXDArMeV9untvWXRw1tY+ntPYbA==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "immer": ">=9.0", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + }, + "dependencies": { + "@aksel/structjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aksel/structjs/-/structjs-1.0.0.tgz", + "integrity": "sha512-7BuOlCj7bS09Gr/uJFrKJVWaZqTSOoK2eUuqUebAZq5cALZP6eNz5K5cbprYNX6KBFGMnR+CeSmZk/DjVo3ecg==", + "requires": { + "npm-name": "^5.0.1" + } + }, + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "requires": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "@ant-design/icons": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.0.tgz", + "integrity": "sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==", + "requires": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.9.4" + } + }, + "@ant-design/icons-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", + "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + }, + "@ant-design/react-slick": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.29.2.tgz", + "integrity": "sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==", + "requires": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "lodash": "^4.17.21", + "resize-observer-polyfill": "^1.5.1" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==" + }, + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "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" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/generator": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "requires": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "requires": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "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==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", + "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + }, + "@babel/helper-wrap-function": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "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" + } + } + } + }, + "@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", + "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-decorators": "^7.12.1" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-default-from": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz", + "integrity": "sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-default-from": "^7.18.6" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz", + "integrity": "sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-default-from": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz", + "integrity": "sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", + "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", + "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", + "requires": { + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", + "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz", + "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz", + "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.5.tgz", + "integrity": "sha512-M/fmDX6n0cfHK/NLTcPmrfVAORKDhK8tyjDhyxlUjYyPYYO8FRWwuxBA3WBx8kWN/uBUuwGa3s/0+hQ9JIN3Tg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", + "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz", + "integrity": "sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.20.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.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==" + } + } + }, + "@babel/preset-flow": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.18.6.tgz", + "integrity": "sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-flow-strip-types": "^7.18.6" + }, + "dependencies": { + "@babel/plugin-transform-flow-strip-types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz", + "integrity": "sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-flow": "^7.18.6" + } + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "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.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + } + }, + "@babel/preset-typescript": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", + "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.12.1" + } + }, + "@babel/register": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz", + "integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==", + "requires": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.5", + "source-map-support": "^0.5.16" + } + }, + "@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/runtime-corejs3": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz", + "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==", + "requires": { + "core-js-pure": "^3.15.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@base2/pretty-print-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", + "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==" + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@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" + }, + "dependencies": { + "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==" + } + } + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" + }, + "@csstools/normalize.css": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", + "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" + }, + "@ctrl/tinycolor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", + "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==" + }, + "@design-systems/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@design-systems/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-Y/d2Zzr+JJfN6u1gbuBUb1ufBuLMJJRZQk+dRmw8GaTpqKx5uf7cGUYGTwN02dIb3I+Tf+cW8jcGBTRiFxdYFg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.11.2", + "clsx": "^1.0.4", + "focus-lock": "^0.8.0", + "react-merge-refs": "^1.0.0" + } + }, + "@devtools-ds/object-inspector": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/object-inspector/-/object-inspector-1.2.0.tgz", + "integrity": "sha512-VztcwqVwScSvYdvJVZBJYsVO/2Pew3JPpFV3T9fuCHQLlHcLYOV3aU/kBS2ScuE2O1JN0ZbobLqFLa3vQF54Fw==", + "dev": true, + "requires": { + "@babel/runtime": "7.7.2", + "@devtools-ds/object-parser": "^1.2.0", + "@devtools-ds/themes": "^1.2.0", + "@devtools-ds/tree": "^1.2.0", + "clsx": "1.1.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true + } + } + }, + "@devtools-ds/object-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/object-parser/-/object-parser-1.2.0.tgz", + "integrity": "sha512-SjGGyiFFY8dtUpiWXAvRSzRT+hE11EAAysrq2PsC/GVLf2ZLyT2nHlQO5kDStywyTz+fjw7S7pyDRj1HG9YTTA==", + "dev": true, + "requires": { + "@babel/runtime": "~7.5.4" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + } + } + }, + "@devtools-ds/themes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/themes/-/themes-1.2.0.tgz", + "integrity": "sha512-LimEITorE6yWZWWuMc6OiBfLQgPrQqWbyMEmfRUDPa3PHXoAY4SpDxczfg31fgyRDUNWnZhjaJH5bBbu8VEbIw==", + "dev": true, + "requires": { + "@babel/runtime": "~7.5.4", + "@design-systems/utils": "2.12.0", + "clsx": "1.1.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true + } + } + }, + "@devtools-ds/tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/tree/-/tree-1.2.0.tgz", + "integrity": "sha512-hC4g4ocuo2eg7jsnzKdauxH0sDQiPW3KSM2+uK3kRgcmr9PzpBD5Kob+Y/WFSVKswFleftOGKL4BQLuRv0sPxA==", + "dev": true, + "requires": { + "@babel/runtime": "7.7.2", + "@devtools-ds/themes": "^1.2.0", + "clsx": "1.1.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true + } + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" + }, + "@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "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==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } + } + }, + "@emotion/cache": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", + "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "requires": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "requires": { + "@emotion/memoize": "0.7.4" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + } + } + }, + "@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "requires": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + } + } + }, + "@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + }, + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==" + }, + "@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + }, + "@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + }, + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "@floating-ui/core": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz", + "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==" + }, + "@floating-ui/dom": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz", + "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==", + "requires": { + "@floating-ui/core": "^0.7.3" + } + }, + "@floating-ui/react-dom": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz", + "integrity": "sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==", + "requires": { + "@floating-ui/dom": "^0.5.3", + "use-isomorphic-layout-effect": "^1.1.1" + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@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==", + "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==" + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + } + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "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.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "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.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@mapbox/geojson-rewind": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz", + "integrity": "sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA==", + "requires": { + "get-stream": "^6.0.1", + "minimist": "^1.2.5" + } + }, + "@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/rehype-prism": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@mapbox/rehype-prism/-/rehype-prism-0.8.0.tgz", + "integrity": "sha512-bIz4a3oZ8g+pQBHSMMIxNpYOMX4yq4aZdpezoiCl9yJudh1Z9SRmHQqH6f+WtTBNOORzXMEGkvBze4PiH17wtA==", + "requires": { + "hast-util-to-string": "^1.0.4", + "mrm": "^3.0.9", + "refractor": "^3.4.0", + "unist-util-visit": "^2.0.3" + } + }, + "@mapbox/tiny-sdf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", + "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" + }, + "@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==" + }, + "@material-ui/core": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.2.tgz", + "integrity": "sha512-Q1npB8V73IC+eV2X6as+g71MpEGQwqKHUI2iujY62npk35V8nMx/bUXAHjv5kKG1BZ8s8XUWoG6s/VkjYPjjQA==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + } + }, + "@material-ui/icons": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", + "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", + "requires": { + "@babel/runtime": "^7.4.4" + } + }, + "@material-ui/lab": { + "version": "4.0.0-alpha.60", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.60.tgz", + "integrity": "sha512-fadlYsPJF+0fx2lRuyqAuJj7hAS1tLDdIEEdov5jlrpb5pp4b+mRDUqQTUxi4inRZHS1bEXpU8QWUhO6xX88aA==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + }, + "@material-ui/styles": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + } + }, + "@material-ui/system": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + } + }, + "@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==" + }, + "@material-ui/utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + }, + "@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "requires": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "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/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "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==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "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-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==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } + } + }, + "@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "dev": true + }, + "@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" + }, + "@monaco-editor/loader": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.3.2.tgz", + "integrity": "sha512-BTDbpHl3e47r3AAtpfVFTlAi7WXv4UQ/xZmz8atKl4q7epQV5e7+JbigFDViWF71VBi4IIBdcWP57Hj+OWuc9g==", + "requires": { + "state-local": "^1.0.6" + } + }, + "@monaco-editor/react": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.4.4.tgz", + "integrity": "sha512-yQsYnVkgP5RC5ZMoRVCXSBn4D4hLUOgoQK+AZJpVY57NDXmEb57OVaaYKh8/RTzxkpuLV278hKNw5DnuzlgQwg==", + "requires": { + "@monaco-editor/loader": "^1.3.1", + "prop-types": "^15.7.2" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "dependencies": { + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==" + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "@plotly/d3": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.0.tgz", + "integrity": "sha512-L10iHgzvw3uSic/nQpYehlNzxUQvImwms5U7S95pJAEhrllzkrdQNy1Mc5DW9ab881Yr4fh300gJztKXWZDfkQ==" + }, + "@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" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-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-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" + } + } + } + }, + "@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" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-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-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" + } + } + } + }, + "@plotly/point-cluster": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", + "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==", + "requires": { + "array-bounds": "^1.0.1", + "binary-search-bounds": "^2.0.4", + "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" + } + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", + "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", + "requires": { + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5", + "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==" + } + } + }, + "@polka/url": { + "version": "1.0.0-next.20", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.20.tgz", + "integrity": "sha512-88p7+M0QGxKpmnkfXjS4V26AnoC/eiqZutE8GLdaI5X12NY75bXSdTY9NkmYb2Xyk1O+MmkuO6Frmsj84V6I8Q==", + "dev": true + }, + "@radix-ui/number": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", + "integrity": "sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-arrow": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.1.tgz", + "integrity": "sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/react-checkbox": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.0.1.tgz", + "integrity": "sha512-TisH0B8hWmYP3ONRduYCyN04rR9yLPIw/Rwyn1RoC1suSoGCa8Wn+YPdSSSarSszeIbcg3p2lBkDp2XXit4sZw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + } + }, + "@radix-ui/react-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.1.tgz", + "integrity": "sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1" + } + }, + "@radix-ui/react-compose-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", + "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", + "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-dialog": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.2.tgz", + "integrity": "sha512-EKxxp2WNSmUPkx4trtWNmZ4/vAYEg7JkAfa1HKBUnaubw9eHzf1Orr9B472lJYaYz327RHDrd4R95fsw7VR8DA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, + "@radix-ui/react-direction": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz", + "integrity": "sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-dismissable-layer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz", + "integrity": "sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.2" + } + }, + "@radix-ui/react-focus-guards": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", + "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-focus-scope": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.1.tgz", + "integrity": "sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0" + } + }, + "@radix-ui/react-id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", + "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + } + }, + "@radix-ui/react-popover": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.2.tgz", + "integrity": "sha512-4tqZEl9w95R5mlZ/sFdgBnfhCBOEPepLIurBA5kt/qaAhldJ1tNQd0ngr0ET0AHbPotT4mwxMPr7a+MA/wbK0g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.0.1", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, + "@radix-ui/react-popper": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.1.tgz", + "integrity": "sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + } + }, + "@radix-ui/react-portal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.1.tgz", + "integrity": "sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/react-presence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + } + }, + "@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + } + }, + "@radix-ui/react-radio-group": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.1.0.tgz", + "integrity": "sha512-7rrkZCXu0Q7oC0MxCm497X1DdV/tI78oNIGXA8sDbCkboiTkuLSe728zCCpRYHw+9PifHIx86nsbITPEq5yijg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-roving-focus": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + } + }, + "@radix-ui/react-roving-focus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.1.tgz", + "integrity": "sha512-TB76u5TIxKpqMpUAuYH2VqMhHYKa+4Vs1NHygo/llLvlffN6mLVsFhz0AnSFlSBAvTBYVHYAkHAyEt7x1gPJOA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0" + } + }, + "@radix-ui/react-separator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.1.tgz", + "integrity": "sha512-uc6Izot0D8uVz6T2nSb/HI7OaxkeaD50GgKr3W6HORnbfGVrG7LWuy+g6Fd58n8wHbrRblSYJZEfcjgymMlJjw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/react-slider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.1.0.tgz", + "integrity": "sha512-5H/QB4xD3GF9UfoSCVLBx2JjlXamMcmTyL6gr4kkd/MiAGaYB0W7Exi4MQa0tJApBFJe+KmS5InKCI56p2kmjA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.0", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", + "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + } + }, + "@radix-ui/react-switch": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.0.1.tgz", + "integrity": "sha512-tTxGluMtwrc5ffgAiOSMrYIx0r3vSTcgM4Vl8rqfpXcHt6ryB9B0OlFKUOiDpKASXlhvzfHf4Y0AYKJdpzjL8w==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + } + }, + "@radix-ui/react-toast": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.2.tgz", + "integrity": "sha512-Kpr4BBYoP0O5A1UeDBmao87UnCMNdAKGNioQH5JzEm6OYTUVGhuDRbOwoZxPwOZ6vsjJHeIpdUrwbiHEB65CCw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.1" + } + }, + "@radix-ui/react-tooltip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.3.tgz", + "integrity": "sha512-cmc9qV4KpgqdXVTn1K8KN8MnuSXvw+E719pKwyvpCGrQ+0AA2qTjcIL3uxCj4jc4k3sDR36RF7R3H7N5hPybBQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.1.0", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.1" + }, + "dependencies": { + "@radix-ui/react-popper": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.0.tgz", + "integrity": "sha512-07U7jpI0dZcLRAxT7L9qs6HecSoPhDSJybF7mEGHJDBDv+ZoGCvIlva0s+WxMXwJEav+ckX3hAlXBtnHmuvlCQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + } + } + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + } + }, + "@radix-ui/react-use-escape-keydown": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.2.tgz", + "integrity": "sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + } + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-use-previous": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.0.tgz", + "integrity": "sha512-RG2K8z/K7InnOKpq6YLDmT49HGjNmrK+fr82UCVKT2sW0GYfVnYp4wZWBooT/EYfQ5faA9uIjvsuMMhH61rheg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-use-rect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz", + "integrity": "sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.0" + } + }, + "@radix-ui/react-use-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz", + "integrity": "sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + } + }, + "@radix-ui/react-visually-hidden": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.1.tgz", + "integrity": "sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/rect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.0.tgz", + "integrity": "sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@rc-component/portal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.0.tgz", + "integrity": "sha512-tbXM9SB1r5FOuZjRCljERFByFiEUcMmCWMXLog/NmgCzlAzreXyf23Vei3ZpSMxSMavzPnhCovfZjZdmxS3d1w==", + "requires": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + } + }, + "@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "requires": { + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + } + }, + "@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + } + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "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==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@stitches/react": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz", + "integrity": "sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==" + }, + "@storybook/addon-actions": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.5.13.tgz", + "integrity": "sha512-3Tji0gIy95havhTpSc6CsFl5lNxGn4O5Y1U9fyji+GRkKqDFOrvVLYAHPtLOpYdEI5tF0bDo+akiqfDouY8+eA==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "polished": "^4.2.2", + "prop-types": "^15.7.2", + "react-inspector": "^5.1.0", + "regenerator-runtime": "^0.13.7", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "uuid-browser": "^3.1.0" + } + }, + "@storybook/addon-backgrounds": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.13.tgz", + "integrity": "sha512-b4JX7JMY7e50y1l6g71D+2XWV3GO0TO2z1ta8J6W4OQt8f44V7sSkRQaJUzXdLjQMrA+Anojuy1ZwPjVeLC6vg==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/addon-controls": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.5.13.tgz", + "integrity": "sha512-lYq3uf2mlVevm0bi6ueL3H6TpUMRYW9s/pTNTVJT225l27kLdFR9wEKxAkCBrlKaTgDLJmzzDRsJE3NLZlR/5Q==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/node-logger": "6.5.13", + "@storybook/store": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/addon-docs": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.5.13.tgz", + "integrity": "sha512-RG/NjsheD9FixZ789RJlNyNccaR2Cuy7CtAwph4oUNi3aDFjtOI8Oe9L+FOT7qtVnZLw/YMjF+pZxoDqJNKLPw==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@jest/transform": "^26.6.2", + "@mdx-js/react": "^1.6.22", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/docs-tools": "6.5.13", + "@storybook/mdx1-csf": "^0.0.1", + "@storybook/node-logger": "6.5.13", + "@storybook/postinstall": "6.5.13", + "@storybook/preview-web": "6.5.13", + "@storybook/source-loader": "6.5.13", + "@storybook/store": "6.5.13", + "@storybook/theming": "6.5.13", + "babel-loader": "^8.0.0", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "regenerator-runtime": "^0.13.7", + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/addon-essentials": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.5.13.tgz", + "integrity": "sha512-G9FVAWV7ixjVLWeLgIX+VT90tcAk6yQxfZQegfg5ucRilGysJCDaNnoab4xuuvm1R40TfFhba3iAGZtQYsddmw==", + "dev": true, + "requires": { + "@storybook/addon-actions": "6.5.13", + "@storybook/addon-backgrounds": "6.5.13", + "@storybook/addon-controls": "6.5.13", + "@storybook/addon-docs": "6.5.13", + "@storybook/addon-measure": "6.5.13", + "@storybook/addon-outline": "6.5.13", + "@storybook/addon-toolbars": "6.5.13", + "@storybook/addon-viewport": "6.5.13", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/node-logger": "6.5.13", + "core-js": "^3.8.2", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/addon-interactions": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-6.5.13.tgz", + "integrity": "sha512-FPOeS7AT/Odxl6z7E0qYI4F0Sh06jFRttRvSgpKC5P2lYUWUstLP5TC8N+F5ijBeLfIdIsf5zBK7l5Y/cluueg==", + "dev": true, + "requires": { + "@devtools-ds/object-inspector": "^1.1.2", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/instrumenter": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "jest-mock": "^27.0.6", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + } + } + } + }, + "@storybook/addon-links": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.5.13.tgz", + "integrity": "sha512-K/LYYu9R/Xoah5h9MNh4mSHOic3q5csqjderLqr2YW/KPYiuNubgvzEbAAbzI5xq5JrtAZqnINrZUv2A4CyYbQ==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.13", + "@types/qs": "^6.9.5", + "core-js": "^3.8.2", + "global": "^4.4.0", + "prop-types": "^15.7.2", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/addon-measure": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.5.13.tgz", + "integrity": "sha512-pi5RFB9YTnESRFtYHAVRUrgEI5to0TFc4KndtwcCKt1fMJ8OFjXQeznEfdj95PFeUvW5TNUwjL38vK4LhicB+g==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/addon-outline": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.5.13.tgz", + "integrity": "sha512-8d8taPheO/tryflzXbj2QRuxHOIS8CtzRzcaglCcioqHEMhOIDOx9BdXKdheq54gdk/UN94HdGJUoVxYyXwZ4Q==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/addon-toolbars": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.5.13.tgz", + "integrity": "sha512-Qgr4wKRSP+gY1VaN7PYT4TM1um7KY341X3GHTglXLFHd8nDsCweawfV2shaX3WxCfZmVro8g4G+Oest30kLLCw==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/addon-viewport": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.5.13.tgz", + "integrity": "sha512-KSfeuCSIjncwWGnUu6cZBx8WNqYvm5gHyFvkSPKEu0+MJtgncbUy7pl53lrEEr6QmIq0GRXvS3A0XzV8RCnrSA==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "prop-types": "^15.7.2", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/addons": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.13.tgz", + "integrity": "sha512-18CqzNnrGMfeZtiKz+R/3rHtSNnfNwz6y6prIQIbWseK16jY8ELTfIFGviwO5V2OqpbHDQi5+xQQ63QAIb89YA==", + "requires": { + "@storybook/api": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.13", + "@storybook/theming": "6.5.13", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.13.tgz", + "integrity": "sha512-xVSmB7/IuFd6G7eiJjbI2MuS7SZunoUM6d+YCWpjiehfMeX47MXt1gZtOwFrgJC1ShZlefXFahq/dvxwtmWs+w==", + "requires": { + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/builder-webpack4": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.5.13.tgz", + "integrity": "sha512-Agqy3IKPv3Nl8QqdS7PjtqLp+c0BD8+/3A2ki/YfKqVz+F+J34EpbZlh3uU053avm1EoNQHSmhZok3ZlWH6O7A==", + "requires": { + "@babel/core": "^7.12.10", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/preview-web": "6.5.13", + "@storybook/router": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.5.13", + "@storybook/theming": "6.5.13", + "@storybook/ui": "6.5.13", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/webpack": "^4.41.26", + "autoprefixer": "^9.8.6", + "babel-loader": "^8.0.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "core-js": "^3.8.2", + "css-loader": "^3.6.0", + "file-loader": "^6.2.0", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^4.1.6", + "glob": "^7.1.6", + "glob-promise": "^3.4.0", + "global": "^4.4.0", + "html-webpack-plugin": "^4.0.0", + "pnp-webpack-plugin": "1.6.4", + "postcss": "^7.0.36", + "postcss-flexbugs-fixes": "^4.2.1", + "postcss-loader": "^4.2.0", + "raw-loader": "^4.0.2", + "stable": "^0.1.8", + "style-loader": "^1.3.0", + "terser-webpack-plugin": "^4.2.3", + "ts-dedent": "^2.0.0", + "url-loader": "^4.1.1", + "util-deprecate": "^1.0.2", + "webpack": "4", + "webpack-dev-middleware": "^3.7.3", + "webpack-filter-warnings-plugin": "^1.2.1", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.2.2" + }, + "dependencies": { + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "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==", + "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": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@storybook/channel-postmessage": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.5.13.tgz", + "integrity": "sha512-R79MBs0mQ7TV8M/a6x/SiTRyvZBidDfMEEthG7Cyo9p35JYiKOhj2535zhW4qlVMESBu95pwKYBibTjASoStPw==", + "requires": { + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "qs": "^6.10.0", + "telejson": "^6.0.8" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/channel-websocket": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.5.13.tgz", + "integrity": "sha512-kwh667H+tzCiNvs92GNwYOwVXdj9uHZyieRAN5rJtTBJ7XgLzGkpTEU50mWlbc0nDKhgE0qYvzyr5H393Iy5ug==", + "requires": { + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "telejson": "^6.0.8" + } + }, + "@storybook/channels": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.13.tgz", + "integrity": "sha512-sGYSilE30bz0jG+HdHnkv0B4XkAv2hP+KRZr4xmnv+MOOQpRnZpJ5Z3HVU16s17cj/83NWihKj6BuKcEVzyilg==", + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-api": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.5.13.tgz", + "integrity": "sha512-uH1mAWbidPiuuTdMUVEiuaNOfrYXm+9QLSP1MMYTKULqEOZI5MSOGkEDqRfVWxbYv/iWBOPTQ+OM9TQ6ecYacg==", + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.13", + "@types/qs": "^6.9.5", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/client-logger": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.13.tgz", + "integrity": "sha512-F2SMW3LWFGXLm2ENTwTitrLWJgmMXRf3CWQXdN2EbkNCIBHy5Zcbt+91K4OX8e2e5h9gjGfrdYbyYDYOoUCEfA==", + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/components": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.5.13.tgz", + "integrity": "sha512-6Hhx70JK5pGfKCkqMU4yq/BBH+vRTmzj7tZKfPwba+f8VmTMoOr/2ysTQFRtXryiHB6Z15xBYgfq5x2pIwQzLQ==", + "requires": { + "@storybook/client-logger": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/core": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.5.13.tgz", + "integrity": "sha512-kw1lCgbsxzUimGww6t5rmuWJmFPe9kGGyzIqvj4RC4BBcEsP40LEu9XhSfvnb8vTOLIULFZeZpdRFfJs4TYbUw==", + "requires": { + "@storybook/core-client": "6.5.13", + "@storybook/core-server": "6.5.13" + } + }, + "@storybook/core-client": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.5.13.tgz", + "integrity": "sha512-YuELbRokTBdqjbx/R4/7O4rou9kvbBIOJjlUkor9hdLLuJ3P0yGianERGNkZFfvcfMBAxU0p52o7QvDldSR3kA==", + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/channel-websocket": "6.5.13", + "@storybook/client-api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/preview-web": "6.5.13", + "@storybook/store": "6.5.13", + "@storybook/ui": "6.5.13", + "airbnb-js-shims": "^2.2.1", + "ansi-to-html": "^0.6.11", + "core-js": "^3.8.2", + "global": "^4.4.0", + "lodash": "^4.17.21", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "unfetch": "^4.2.0", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/core-common": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.5.13.tgz", + "integrity": "sha512-+DVZrRsteE9pw0X5MNffkdBgejQnbnL+UOG3qXkE9xxUamQALnuqS/w1BzpHE9WmOHuf7RWMKflyQEW3OLKAJg==", + "requires": { + "@babel/core": "^7.12.10", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-decorators": "^7.12.12", + "@babel/plugin-proposal-export-default-from": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-private-property-in-object": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.12", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/preset-env": "^7.12.11", + "@babel/preset-react": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@babel/register": "^7.12.1", + "@storybook/node-logger": "6.5.13", + "@storybook/semver": "^7.3.2", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/pretty-hrtime": "^1.0.0", + "babel-loader": "^8.0.0", + "babel-plugin-macros": "^3.0.1", + "babel-plugin-polyfill-corejs3": "^0.1.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "express": "^4.17.1", + "file-system-cache": "^1.0.5", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.0.4", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "handlebars": "^4.7.7", + "interpret": "^2.2.0", + "json5": "^2.1.3", + "lazy-universal-dotenv": "^3.0.1", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "webpack": "4" + }, + "dependencies": { + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.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==" + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", + "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.2.tgz", + "integrity": "sha512-nkBH96IBmgKnbHQ5gXFrcmez+Z9S2EIDKDQGp005ROqBigc88Tky4rzCnlP/lnlj245dCEQl4/YyV0V1kYh5dw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.20.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/plugin-syntax-decorators": "^7.19.0" + } + }, + "@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + } + }, + "@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", + "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.1.5", + "core-js-compat": "^3.8.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "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" + } + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "requires": { + "find-up": "^5.0.0" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "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" + } + } + } + }, + "@storybook/core-events": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.13.tgz", + "integrity": "sha512-kL745tPpRKejzHToA3/CoBNbI+NPRVk186vGxXBmk95OEg0TlwgQExP8BnqEtLlRZMbW08e4+6kilc1M1M4N5w==", + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/core-server": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.5.13.tgz", + "integrity": "sha512-vs7tu3kAnFwuINio1p87WyqDNlFyZESmeh9s7vvrZVbe/xS/ElqDscr9DT5seW+jbtxufAaHsx+JUTver1dheQ==", + "requires": { + "@discoveryjs/json-ext": "^0.5.3", + "@storybook/builder-webpack4": "6.5.13", + "@storybook/core-client": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/csf-tools": "6.5.13", + "@storybook/manager-webpack4": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.5.13", + "@storybook/telemetry": "6.5.13", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/node-fetch": "^2.5.7", + "@types/pretty-hrtime": "^1.0.0", + "@types/webpack": "^4.41.26", + "better-opn": "^2.1.1", + "boxen": "^5.1.2", + "chalk": "^4.1.0", + "cli-table3": "^0.6.1", + "commander": "^6.2.1", + "compression": "^1.7.4", + "core-js": "^3.8.2", + "cpy": "^8.1.2", + "detect-port": "^1.3.0", + "express": "^4.17.1", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "globby": "^11.0.2", + "ip": "^2.0.0", + "lodash": "^4.17.21", + "node-fetch": "^2.6.7", + "open": "^8.4.0", + "pretty-hrtime": "^1.0.3", + "prompts": "^2.4.0", + "regenerator-runtime": "^0.13.7", + "serve-favicon": "^2.5.0", + "slash": "^3.0.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "watchpack": "^2.2.0", + "webpack": "4", + "ws": "^8.2.3", + "x-default-browser": "^0.4.0" + }, + "dependencies": { + "@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "requires": { + "string-width": "^4.1.0" + } + }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==" + } + } + }, + "@storybook/csf": { + "version": "0.0.2--canary.4566f4d.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", + "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", + "requires": { + "lodash": "^4.17.15" + } + }, + "@storybook/csf-tools": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.5.13.tgz", + "integrity": "sha512-63Ev+VmBqzwSwfUzbuXOLKBD5dMTK2zBYLQ9anTVw70FuTikwTsGIbPgb098K0vsxRCgxl7KM7NpivHqtZtdjw==", + "requires": { + "@babel/core": "^7.12.10", + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@babel/traverse": "^7.12.11", + "@babel/types": "^7.12.11", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/mdx1-csf": "^0.0.1", + "core-js": "^3.8.2", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@storybook/docs-tools": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-6.5.13.tgz", + "integrity": "sha512-hB+hk+895ny4SW84j3X5iV55DHs3bCfTOp7cDdcZJdQrlm0wuDb4A6d4ffNC7ZLh9VkUjU6ST4VEV5Bb0Cptow==", + "requires": { + "@babel/core": "^7.12.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.13", + "core-js": "^3.8.2", + "doctrine": "^3.0.0", + "lodash": "^4.17.21", + "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@storybook/instrumenter": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-6.5.13.tgz", + "integrity": "sha512-izRF64BU+gGCP7qE1N3kOVLSv5Xk4M0OWcRmFIXoIS46qNDzmd8hmbkkx3M9wrvw0kcQ97kIyADF+UInbcr/dQ==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/manager-webpack4": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.5.13.tgz", + "integrity": "sha512-pURzS5W3XM0F7bCBWzpl7TRsuy+OXFwLXiWLaexuvo0POZe31Ueo2A1R4rx3MT5Iee8O9mYvG2XTmvK9MlLefQ==", + "requires": { + "@babel/core": "^7.12.10", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/preset-react": "^7.12.10", + "@storybook/addons": "6.5.13", + "@storybook/core-client": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/theming": "6.5.13", + "@storybook/ui": "6.5.13", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/webpack": "^4.41.26", + "babel-loader": "^8.0.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "css-loader": "^3.6.0", + "express": "^4.17.1", + "file-loader": "^6.2.0", + "find-up": "^5.0.0", + "fs-extra": "^9.0.1", + "html-webpack-plugin": "^4.0.0", + "node-fetch": "^2.6.7", + "pnp-webpack-plugin": "1.6.4", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7", + "resolve-from": "^5.0.0", + "style-loader": "^1.3.0", + "telejson": "^6.0.8", + "terser-webpack-plugin": "^4.2.3", + "ts-dedent": "^2.0.0", + "url-loader": "^4.1.1", + "util-deprecate": "^1.0.2", + "webpack": "4", + "webpack-dev-middleware": "^3.7.3", + "webpack-virtual-modules": "^0.2.2" + }, + "dependencies": { + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "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": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@storybook/mdx1-csf": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@storybook/mdx1-csf/-/mdx1-csf-0.0.1.tgz", + "integrity": "sha512-4biZIWWzoWlCarMZmTpqcJNgo/RBesYZwGFbQeXiGYsswuvfWARZnW9RE9aUEMZ4XPn7B1N3EKkWcdcWe/K2tg==", + "requires": { + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/preset-env": "^7.12.11", + "@babel/types": "^7.12.11", + "@mdx-js/mdx": "^1.6.22", + "@types/lodash": "^4.14.167", + "js-string-escape": "^1.0.1", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==" + } + } + }, + "@storybook/node-logger": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.5.13.tgz", + "integrity": "sha512-/r5aVZAqZRoy5FyNk/G4pj7yKJd3lJfPbAaOHVROv2IF7PJP/vtRaDkcfh0g2U6zwuDxGIqSn80j+qoEli9m5A==", + "requires": { + "@types/npmlog": "^4.1.2", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "npmlog": "^5.0.1", + "pretty-hrtime": "^1.0.3" + }, + "dependencies": { + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "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" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "@storybook/postinstall": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.5.13.tgz", + "integrity": "sha512-qmqP39FGIP5NdhXC5IpAs9cFoYx9fg1psoQKwb9snYb98eVQU31uHc1W2MBUh3lG4AjAm7pQaXJci7ti4jOh3g==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/preset-create-react-app": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@storybook/preset-create-react-app/-/preset-create-react-app-3.2.0.tgz", + "integrity": "sha512-lLoWCGr5cV+JNDRKYHC2gD+P2eyBqdN8qhmBa+PxDgPSNKfgUf9Wnoh+C7WTG5q2DEeR9SvUpQpZomX9DDQa4Q==", + "dev": true, + "requires": { + "@pmmmwh/react-refresh-webpack-plugin": "^0.4.3", + "@types/babel__core": "^7.1.7", + "@types/webpack": "^4.41.13", + "babel-plugin-react-docgen": "^4.1.0", + "pnp-webpack-plugin": "^1.6.4", + "react-docgen-typescript-plugin": "^1.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@storybook/preview-web": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.5.13.tgz", + "integrity": "sha512-GNNYVzw4SmRua3dOc52Ye6Us4iQbq5GKQ56U3iwnzZM3TBdJB+Rft94Fn1/pypHujEHS8hl5Xgp9td6C1lLCow==", + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.13", + "ansi-to-html": "^0.6.11", + "core-js": "^3.8.2", + "global": "^4.4.0", + "lodash": "^4.17.21", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "unfetch": "^4.2.0", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/react": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-6.5.13.tgz", + "integrity": "sha512-4gO8qihEkVZ8RNm9iQd7G2iZz4rRAHizJ6T5m58Sn21fxfyg9zAMzhgd0JzXuPXR8lTTj4AvRyPv1Qx7b43smg==", + "requires": { + "@babel/preset-flow": "^7.12.1", + "@babel/preset-react": "^7.12.10", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/docs-tools": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/react-docgen-typescript-plugin": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.5.13", + "@types/estree": "^0.0.51", + "@types/node": "^14.14.20 || ^16.0.0", + "@types/webpack-env": "^1.16.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "babel-plugin-add-react-displayname": "^0.0.5", + "babel-plugin-react-docgen": "^4.2.1", + "core-js": "^3.8.2", + "escodegen": "^2.0.0", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^14.3.4", + "react-refresh": "^0.11.0", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "webpack": ">=4.43.0 <6.0.0" + }, + "dependencies": { + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", + "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "requires": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + } + }, + "@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + } + } + }, + "@storybook/react-docgen-typescript-plugin": { + "version": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", + "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0.tgz", + "integrity": "sha512-eVg3BxlOm2P+chijHBTByr90IZVUtgRW56qEOLX7xlww2NBuKrcavBlcmn+HH7GIUktquWkMPtvy6e0W0NgA5w==", + "requires": { + "debug": "^4.1.1", + "endent": "^2.0.1", + "find-cache-dir": "^3.3.1", + "flat-cache": "^3.0.4", + "micromatch": "^4.0.2", + "react-docgen-typescript": "^2.1.1", + "tslib": "^2.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "@storybook/router": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.13.tgz", + "integrity": "sha512-sf5aogfirH5ucD0d0hc2mKf2iyWsZsvXhr5kjxUQmgkcoflkGUWhc34sbSQVRQ1i8K5lkLIDH/q2s1Zr2SbzhQ==", + "requires": { + "@storybook/client-logger": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/source-loader": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.5.13.tgz", + "integrity": "sha512-tHuM8PfeB/0m+JigbaFp+Ld0euFH+fgOObH2W9rjEXy5vnwmaeex/JAdCprv4oL+LcDQEERqNULUUNIvbcTPAg==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "estraverse": "^5.2.0", + "global": "^4.4.0", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", + "dev": true + } + } + }, + "@storybook/store": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.5.13.tgz", + "integrity": "sha512-GG6lm+8fBX1tNUnX7x3raBOjYhhf14bPWLtYiPlxDTFEMs3sJte7zWKZq6NQ79MoBLL6jjzTeolBfDCBw6fiWQ==", + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "slash": "^3.0.0", + "stable": "^0.1.8", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/telemetry": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-6.5.13.tgz", + "integrity": "sha512-PFJEfGbunmfFWabD3rdCF8EHH+45578OHOkMPpXJjqXl94vPQxUH2XTVKQgEQJbYrgX0Vx9Z4tSkdMHuzYDbWQ==", + "requires": { + "@storybook/client-logger": "6.5.13", + "@storybook/core-common": "6.5.13", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "detect-package-manager": "^2.0.1", + "fetch-retry": "^5.0.2", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "isomorphic-unfetch": "^3.1.0", + "nanoid": "^3.3.1", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@storybook/testing-library": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@storybook/testing-library/-/testing-library-0.0.13.tgz", + "integrity": "sha512-vRMeIGer4EjJkTgI8sQyK9W431ekPWYCWL//OmSDJ64IT3h7FnW7Xg6p+eqM3oII98/O5pcya5049GxnjaPtxw==", + "dev": true, + "requires": { + "@storybook/client-logger": "^6.4.0", + "@storybook/instrumenter": "^6.4.0", + "@testing-library/dom": "^8.3.0", + "@testing-library/user-event": "^13.2.1", + "ts-dedent": "^2.2.0" + }, + "dependencies": { + "@testing-library/dom": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz", + "integrity": "sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" + } + }, + "@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "deep-equal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.1.0.tgz", + "integrity": "sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.8" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + } + } + }, + "@storybook/theming": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.13.tgz", + "integrity": "sha512-oif5NGFAUQhizo50r+ctw2hZNLWV4dPHai+L/gFvbaSeRBeHSNkIcMoZ2FlrO566HdGZTDutYXcR+xus8rI28g==", + "requires": { + "@storybook/client-logger": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/ui": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.5.13.tgz", + "integrity": "sha512-MklJuSg4Bc+MWjwhZVmZhJaucaeEBUMMa2V9oRWbIgZOdRHqdW72S2vCbaarDAYfBQdnfaoq1GkSQiw+EnWOzA==", + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/router": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", + "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", + "requires": { + "ejs": "^2.6.1", + "magic-string": "^0.25.0" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" + }, + "@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + } + }, + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "requires": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + } + }, + "@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==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@tabler/icons": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.7.0.tgz", + "integrity": "sha512-mSjUKhwN5fJHI9yITqFn9GXGnsJ4gBAyQDWyP4Ev5fk6hD78G7u6cHEF1KARr5FOOdiIKSZWCzNzUzyLhiNPrg==" + }, + "@tabler/icons-react": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-2.7.0.tgz", + "integrity": "sha512-WV2ZwMUuZN9QcCX4RPg9+G+ycUgoItzOWVCCQYVWbYKV581fH8szM2KVaQHQhMbttL4JYtOgf4ColJIDwsIgdw==", + "requires": { + "@tabler/icons": "2.7.0", + "prop-types": "^15.7.2" + } + }, + "@testing-library/dom": { + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", + "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^4.2.2", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.6", + "lz-string": "^1.4.4", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@testing-library/jest-dom": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz", + "integrity": "sha512-dfB7HVIgTNCxH22M1+KU6viG5of2ldoA5ly8Ar8xkezKHKXjRvznCdbMbqjYGgO2xjRbwnR+rR8MLUIqF3kKbQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^4.2.2", + "chalk": "^3.0.0", + "css": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + } + }, + "@testing-library/react": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz", + "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^7.28.1" + } + }, + "@testing-library/react-hooks": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-7.0.2.tgz", + "integrity": "sha512-dYxpz8u9m4q1TuzfcUApqi8iFfR6R0FaMbr2hjZJy1uC8z+bO/K4v8Gs9eogGKYQop7QsrBTFkv/BCF7MzD2Cg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@types/react": ">=16.9.0", + "@types/react-dom": ">=16.9.0", + "@types/react-test-renderer": ">=16.9.0", + "react-error-boundary": "^3.1.0" + } + }, + "@testing-library/user-event": { + "version": "12.8.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", + "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "@turf/area": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", + "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/bbox": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", + "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/centroid": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", + "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/helpers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", + "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==" + }, + "@turf/meta": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", + "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", + "requires": { + "@turf/helpers": "^6.5.0" + } + }, + "@types/aria-query": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz", + "integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "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.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/bs58check": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/bs58check/-/bs58check-2.1.0.tgz", + "integrity": "sha512-OxsysnJQh82vy9DRbOcw9m2j/WiyqZLn0YBhKxdQ+aCwoHj+tWzyCgpwAkr79IfDXZKxc6h7k89T9pwS78CqTQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/d3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.0.0.tgz", + "integrity": "sha512-7rMMuS5unvbvFCJXAkQXIxWTo2OUlmVXN5q7sfQFesuVICY55PSP6hhbUhWjTTNpfTTB3iLALsIYDFe7KUNABw==", + "dev": true, + "requires": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "@types/d3-array": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.1.tgz", + "integrity": "sha512-D/G7oG0czeszALrkdUiV68CDiHDxXf+M2mLVqAyKktGd12VKQQljj1sHJGBKjcK4jRH1biBd6ZPQPHpJ0mNa0w==", + "dev": true + }, + "@types/d3-axis": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.1.tgz", + "integrity": "sha512-zji/iIbdd49g9WN0aIsGcwcTBUkgLsCSwB+uH+LPVDAiKWENMtI3cJEWt+7/YYwelMoZmbBfzA3qCdrZ2XFNnw==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-brush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.1.tgz", + "integrity": "sha512-B532DozsiTuQMHu2YChdZU0qsFJSio3Q6jmBYGYNp3gMDzBmuFFgPt9qKA4VYuLZMp4qc6eX7IUFUEsvHiXZAw==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-eQfcxIHrg7V++W8Qxn6QkqBNBokyhdWSAS73AbkbMzvLQmVVBviknoz2SRS/ZJdIOmhcmmdCRE/NFOm28Z1AMw==", + "dev": true + }, + "@types/d3-color": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-vcuR/rrvuoX6q0Rqe+gOScvYkTV7i6KZsfQozvThtAZ4CfuEM22OnZfiKP62nXHqRnIHXpBMy3JSha95qdYAxA==", + "dev": true + }, + "@types/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-C3zfBrhHZvrpAAK3YXqLWVAGo87A4SvJ83Q/zVJ8rFWJdKejUnDYaWZPkA8K84kb2vDA/g90LTQAz7etXcgoQQ==", + "dev": true, + "requires": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "@types/d3-delaunay": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.0.tgz", + "integrity": "sha512-iGm7ZaGLq11RK3e69VeMM6Oqj2SjKUB9Qhcyd1zIcqn2uE8w9GFB445yCY46NOQO3ByaNyktX1DK+Etz7ZaX+w==", + "dev": true + }, + "@types/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-NhxMn3bAkqhjoxabVJWKryhnZXXYYVQxaBnbANu0O94+O/nX9qSjrA1P1jbAQJxJf+VC72TxDX/YJcKue5bRqw==", + "dev": true + }, + "@types/d3-drag": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.1.tgz", + "integrity": "sha512-o1Va7bLwwk6h03+nSM8dpaGEYnoIG19P0lKqlic8Un36ymh9NSkNFX1yiXMKNMx8rJ0Kfnn2eovuFaL6Jvj0zA==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-dsv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.0.tgz", + "integrity": "sha512-o0/7RlMl9p5n6FQDptuJVMxDf/7EDEv2SYEO/CwdG2tr1hTfUVi0Iavkk2ax+VpaQ/1jVhpnj5rq1nj8vwhn2A==", + "dev": true + }, + "@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true + }, + "@types/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-toZJNOwrOIqz7Oh6Q7l2zkaNfXkfR7mFSJvGvlD/Ciq/+SQ39d5gynHJZ/0fjt83ec3WL7+u3ssqIijQtBISsw==", + "dev": true, + "requires": { + "@types/d3-dsv": "*" + } + }, + "@types/d3-force": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.1.tgz", + "integrity": "sha512-fY9fXELktloC4MospE1AMYk67p7zxbW1K79rdzZJ6oB2pddltiTelE9bz6YnZf9GboHhe9k0gwVjP7bOc7wjvg==", + "dev": true + }, + "@types/d3-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.0.tgz", + "integrity": "sha512-bbaJJs3Aye+C44aVbWW7qEgWNJQMtFNGsKq2L0OzjID2ewEUwb0Au8WF+b5PUrPkAqRKmtm4znYJadrYJMivYQ==", + "dev": true + }, + "@types/d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-EFXzqJH7VFbnx6LJ3PBSYNCrxrjl6tFplmnJ9J4k7ICvL3QXSxG6APfKGe0A29sYkk7UV08avGkmfd/EqS5WbA==", + "dev": true, + "requires": { + "@types/geojson": "*" + } + }, + "@types/d3-hierarchy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.0.1.tgz", + "integrity": "sha512-bXAS5udAD5RXfM/FsWMP9ggCl9cWXH0417Mwpw6ytSDP+Oez+XP0SLFPG5oPQc3m7ZToKg3/b4UW8hC/F6Qddw==", + "dev": true + }, + "@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dev": true, + "requires": { + "@types/d3-color": "*" + } + }, + "@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true + }, + "@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true + }, + "@types/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-U+OiWUxoH2jFsznlQHLgP48dUgkvtkFpjqW9Y9w8W9z3lo1OyQC1gdbKDfH1CxRUOWMY9fSYEYWc2ErNieyVew==", + "dev": true + }, + "@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true + }, + "@types/d3-scale": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.1.tgz", + "integrity": "sha512-GDuXcRcR6mKcpUVMhPNttpOzHi2dP6YcDqLZYSZHgwTZ+sfCa8e9q0VEBwZomblAPNMYpVqxojnSyIEb4s/Pwg==", + "dev": true, + "requires": { + "@types/d3-time": "*" + } + }, + "@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true + }, + "@types/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-SZsDWFG1dLV9ivX2wGDPFWgLUf71tF4aupfEMTYMrbArHwEMLhmv3TS1CZECLQgoTttdpM1g5Z6JwRP7zoInWg==", + "dev": true + }, + "@types/d3-shape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.0.0.tgz", + "integrity": "sha512-c1Wu/JwJJHSeY/M26pzNfuaybLCcTOkn1xxxVH7riuYObpvI8SfyDD30F8mqG+NHZuZTeIdKj4lej1USZ0V5vQ==", + "dev": true, + "requires": { + "@types/d3-path": "*" + } + }, + "@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "dev": true + }, + "@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "dev": true + }, + "@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true + }, + "@types/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-Sv4qEI9uq3bnZwlOANvYK853zvpdKEm1yz9rcc8ZTsxvRklcs9Fx4YFuGA3gXoQN/c/1T6QkVNjhaRO/cWj94g==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-zoom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.1.tgz", + "integrity": "sha512-7s5L9TjfqIYQmQQEUcpMAcBOahem7TRoSO/+Gkz02GbMVuULiZzjF2BOdw291dbO2aNon4m2OdFsRGaCq2caLQ==", + "dev": true, + "requires": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "@types/dot-object": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/dot-object/-/dot-object-2.1.2.tgz", + "integrity": "sha512-mARrpJofLNe6yhlukeBcznBe8ssZo5ZJ/CJWc3JKmG9L9151s0OHK+mealnkqSgO6cSn1219vND2wgL67Cuqiw==", + "dev": true + }, + "@types/eslint": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", + "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "@types/file-saver": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.3.tgz", + "integrity": "sha512-MBIou8pd/41jkff7s97B47bc9+p0BszqqDJsO51yDm49uUxeKzrfuNl5fSLC6BpLEWKA8zlwyqALVmXrFwoBHQ==", + "dev": true + }, + "@types/geojson": { + "version": "7946.0.7", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", + "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==", + "dev": true + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "requires": { + "@types/node": "*" + } + }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, + "@types/history": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/history/-/history-5.0.0.tgz", + "integrity": "sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==", + "dev": true, + "requires": { + "history": "*" + } + }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" + }, + "@types/humanize-duration": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/@types/humanize-duration/-/humanize-duration-3.25.1.tgz", + "integrity": "sha512-WZU/4bb+lvzyDmZzjJtp++9mfKy6B3lH6gGISgkcz6SU8hMILKRM0vi08TxIsb0dQB4Gzo68MWLmctu6xqUi9g==", + "dev": true + }, + "@types/is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==" + }, + "@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==" + }, + "@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==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz", + "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/js-cookie": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", + "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + }, + "@types/lodash": { + "version": "4.14.170", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz", + "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==" + }, + "@types/lodash-es": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.4.tgz", + "integrity": "sha512-BBz79DCJbD2CVYZH67MBeHZRX++HF+5p8Mo5MzjZi64Wac39S3diedJYHZtScbRVf4DjZyN6LzA0SB0zy+HSSQ==", + "dev": true, + "requires": { + "@types/lodash": "*" + } + }, + "@types/marked": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.7.tgz", + "integrity": "sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==", + "dev": true + }, + "@types/md5": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.1.tgz", + "integrity": "sha512-OK3oe+ALIoPSo262lnhAYwpqFNXbiwH2a+0+Z5YBnkQEwWD8fk5+PIeRhYA48PzvX9I4SGNpWy+9bLj8qz92RQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "requires": { + "@types/unist": "*" + } + }, + "@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/node": { + "version": "12.20.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.15.tgz", + "integrity": "sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==" + }, + "@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "@types/node-sass": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@types/node-sass/-/node-sass-4.11.2.tgz", + "integrity": "sha512-pOFlTw/OtZda4e+yMjq6/QYuvY0RDMQ+mxXdWj7rfSyf18V8hS4SfgurO+MasAkQsv6Wt6edOGlwh5QqJml9gw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, + "@types/npmlog": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.4.tgz", + "integrity": "sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==" + }, + "@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==" + }, + "@types/parse5": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.2.tgz", + "integrity": "sha512-+hQX+WyJAOne7Fh3zF5CxPemILIbuhNcqHHodzK9caYOLnC8pD5efmPleRnw0z++LfKUC/sVNMwk0Gap+B0baA==" + }, + "@types/plotly.js": { + "version": "1.54.17", + "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-1.54.17.tgz", + "integrity": "sha512-2nk1jEDQ85Ix6SQsC7M7Otl5M8OoYwTl7V/x2ptyX373slUJAj+vQ3njYGy/h9p/rxTq7W0fn3JvXjuxXuA0Qg==", + "dev": true, + "requires": { + "@types/d3": "^3" + }, + "dependencies": { + "@types/d3": { + "version": "3.5.46", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.46.tgz", + "integrity": "sha512-jNHfiGd41+JUV43LTMzQNidyp4Hn0XfhoSmy8baE0d/N5pGYpD+yX03JacY/MH+smFxYOQGXlz4HxkRZOuRNOQ==", + "dev": true + } + } + }, + "@types/prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==" + }, + "@types/pretty-hrtime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz", + "integrity": "sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==" + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/react": { + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.11.tgz", + "integrity": "sha512-yFRQbD+whVonItSk7ZzP/L+gPTJVBkL/7shLEF+i9GC/1cV3JmUxEQz6+9ylhUpWSDuqo1N9qEvqS6vTj4USUA==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + } + } + }, + "@types/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-1lBBxVSutE8CQM37Jq7KvJwuA94qaEEqsx+G0dnwzG6Sfwf6JGcNeFk5jjjhJli1q2naeMZm+D/dvT/zyX4QPw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-dom": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.8.tgz", + "integrity": "sha512-0ohAiJAx1DAUEcY9UopnfwCE9sSMDGnY/oXjWMax6g3RpzmTt2GMyMVAXcbn0mo8XAff0SbQJl2/SBU+hjSZ1A==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-plotly.js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@types/react-plotly.js/-/react-plotly.js-2.5.0.tgz", + "integrity": "sha512-bda7N/Y65d1x0FfwhgUXAugGeG9CRIxmkW/yBL8PVFUMvZGpfEnw4bXKjDozBYlOskVfxj6UQ9IKmZI6CZ7/QQ==", + "dev": true, + "requires": { + "@types/plotly.js": "*", + "@types/react": "*" + } + }, + "@types/react-redux": { + "version": "7.1.18", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.18.tgz", + "integrity": "sha512-9iwAsPyJ9DLTRH+OFeIrm9cAbIj1i2ANL3sKQFATqnPWRbg+jEFXyZOKHiQK/N86pNRXbb4HRxAxo0SIX1XwzQ==", + "requires": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "@types/react-router": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.15.tgz", + "integrity": "sha512-z3UlMG/x91SFEVmmvykk9FLTliDvfdIUky4k2rCfXWQ0NKbrP8o9BTCaCTPuYsB8gDkUnUmkcA2vYlm2DR+HAA==", + "dev": true, + "requires": { + "@types/history": "*", + "@types/react": "*" + } + }, + "@types/react-router-dom": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", + "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "dev": true, + "requires": { + "@types/history": "*", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "@types/react-test-renderer": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz", + "integrity": "sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-window": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.4.tgz", + "integrity": "sha512-rFJ0h1nYffFBNi6N80CFORAQNNr+440RtGCAmKyn81U99pXRoxS2goi/fkYnUJtk+LcvWCp8cmP16M8loJJsjw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" + }, + "@types/storybook__react": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@types/storybook__react/-/storybook__react-5.2.1.tgz", + "integrity": "sha512-p4QGO+VjEO3YxyWVHpPylNheA0JhStzoCg6RBTmdobrC0ZqLPEIIWu0pFkHlNkmGIiEKW2yDGFJooBe8M4Df0Q==", + "dev": true, + "requires": { + "@storybook/react": "*" + } + }, + "@types/styled-components": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.15.tgz", + "integrity": "sha512-4evch8BRI3AKgb0GAZ/sn+mSeB+Dq7meYtMi7J/0Mg98Dt1+r8fySOek7Sjw1W+Wskyjc93565o5xWAT/FdY0Q==", + "dev": true, + "requires": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", + "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==", + "dev": true + } + } + }, + "@types/tapable": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", + "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==" + }, + "@types/testing-library__jest-dom": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.0.tgz", + "integrity": "sha512-l2P2GO+hFF4Liye+fAajT1qBqvZOiL79YMpEvgGs1xTK7hECxBI8Wz4J7ntACJNiJ9r0vXQqYovroXRLPDja6A==", + "dev": true, + "requires": { + "@types/jest": "*" + } + }, + "@types/uglify-js": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", + "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "requires": { + "source-map": "^0.6.1" + } + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "@types/webpack": { + "version": "4.41.29", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz", + "integrity": "sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q==", + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "@types/webpack-env": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz", + "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==" + }, + "@types/webpack-sources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "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==" + } + } + }, + "@types/yargs": { + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.0.tgz", + "integrity": "sha512-KcF6p3zWhf1f8xO84tuBailV5cN92vhS+VT7UJsPzGBm9VnQqfI9AsiMUFUCYHTYPg1uCCo+HyiDnpDuvkAMfQ==", + "requires": { + "@typescript-eslint/experimental-utils": "4.28.0", + "@typescript-eslint/scope-manager": "4.28.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz", + "integrity": "sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==", + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/typescript-estree": "4.28.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.0.tgz", + "integrity": "sha512-7x4D22oPY8fDaOCvkuXtYYTQ6mTMmkivwEzS+7iml9F9VkHGbbZ3x4fHRwxAb5KeuSkLqfnYjs46tGx2Nour4A==", + "requires": { + "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/typescript-estree": "4.28.0", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz", + "integrity": "sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==", + "requires": { + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/visitor-keys": "4.28.0" + } + }, + "@typescript-eslint/types": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.0.tgz", + "integrity": "sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==" + }, + "@typescript-eslint/typescript-estree": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz", + "integrity": "sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==", + "requires": { + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/visitor-keys": "4.28.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz", + "integrity": "sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==", + "requires": { + "@typescript-eslint/types": "4.28.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@uiw/react-textarea-code-editor": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@uiw/react-textarea-code-editor/-/react-textarea-code-editor-1.4.14.tgz", + "integrity": "sha512-OCOyRY48JdA0SooXQWpEls2ZyFXyv+hR61SW4wLH+kdKnAeR72MSgehuU2R3k455+k8QLtsk0MVyctBJ8HLvVw==", + "requires": { + "@babel/runtime": "7.15.4", + "@mapbox/rehype-prism": "0.8.0", + "rehype": "12.0.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "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==" + }, + "@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==" + }, + "@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==" + }, + "@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==", + "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==" + }, + "@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==", + "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==" + }, + "@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==", + "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==", + "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==", + "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==" + }, + "@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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==" + }, + "@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==" + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "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==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "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==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "adjust-sourcemap-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "airbnb-js-shims": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz", + "integrity": "sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==", + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "array.prototype.flatmap": "^1.2.1", + "es5-shim": "^4.5.13", + "es6-shim": "^0.35.5", + "function.prototype.name": "^1.1.0", + "globalthis": "^1.0.0", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0 || ^1.0.0", + "object.getownpropertydescriptors": "^2.0.3", + "object.values": "^1.1.0", + "promise.allsettled": "^1.0.0", + "promise.prototype.finally": "^3.1.0", + "string.prototype.matchall": "^4.0.0 || ^3.0.1", + "string.prototype.padend": "^3.0.0", + "string.prototype.padstart": "^3.0.0", + "symbol.prototype.description": "^1.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "almost-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", + "integrity": "sha1-+FHGMROHV5lCdqou++jfowZszN0=" + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "^2.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=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "ansi-to-html": { + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.15.tgz", + "integrity": "sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==", + "requires": { + "entities": "^2.0.0" + } + }, + "antd": { + "version": "4.24.8", + "resolved": "https://registry.npmjs.org/antd/-/antd-4.24.8.tgz", + "integrity": "sha512-wrNy2Hi27uM3948okG3n2GwzQKBFUn1Qn5mn2I/ALcR28rC6cTjHYOuA248Zl9ECzz3jo4TY2R0SIa+5GZ/zGA==", + "requires": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons": "^4.7.0", + "@ant-design/react-slick": "~0.29.1", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.4.0", + "classnames": "^2.2.6", + "copy-to-clipboard": "^3.2.0", + "lodash": "^4.17.21", + "moment": "^2.29.2", + "rc-cascader": "~3.7.0", + "rc-checkbox": "~2.3.0", + "rc-collapse": "~3.4.2", + "rc-dialog": "~9.0.2", + "rc-drawer": "~6.1.0", + "rc-dropdown": "~4.0.0", + "rc-field-form": "~1.27.0", + "rc-image": "~5.13.0", + "rc-input": "~0.1.4", + "rc-input-number": "~7.3.9", + "rc-mentions": "~1.13.1", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.1", + "rc-notification": "~4.6.0", + "rc-pagination": "~3.2.0", + "rc-picker": "~2.7.0", + "rc-progress": "~3.4.1", + "rc-rate": "~2.9.0", + "rc-resize-observer": "^1.2.0", + "rc-segmented": "~2.1.0", + "rc-select": "~14.1.13", + "rc-slider": "~10.0.0", + "rc-steps": "~5.0.0-alpha.2", + "rc-switch": "~3.2.0", + "rc-table": "~7.26.0", + "rc-tabs": "~12.5.6", + "rc-textarea": "~0.4.5", + "rc-tooltip": "~5.2.0", + "rc-tree": "~5.7.0", + "rc-tree-select": "~5.5.0", + "rc-trigger": "^5.2.10", + "rc-upload": "~4.3.0", + "rc-util": "^5.22.5", + "scroll-into-view-if-needed": "^2.2.25" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-root-dir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", + "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "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==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-hidden": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.2.tgz", + "integrity": "sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-bounds": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", + "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==" + }, + "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=" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "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-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, + "array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + } + }, + "array.prototype.map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", + "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "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=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "requires": { + "tslib": "^2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "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=" + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "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==" + }, + "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==" + }, + "async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "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==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "atob-lite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=" + }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "axe-core": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.3.tgz", + "integrity": "sha512-pXnVMfJKSIWU2Ml4JHP7pZEPIrgBO1Fd3WGx+fPBsS+KRGhE4vxooD8XBGWbQOIVSZsVK7pUDBBkCicNu80yzQ==" + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "requires": { + "babylon": "^6.18.0" + } + }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "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": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "babel-plugin-add-react-displayname": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz", + "integrity": "sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==" + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "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==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "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==", + "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.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "requires": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "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" + } + } + } + }, + "babel-plugin-named-asset-import": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", + "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, + "babel-plugin-react-docgen": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz", + "integrity": "sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==", + "requires": { + "ast-types": "^0.14.2", + "lodash": "^4.17.15", + "react-docgen": "^5.0.0" + } + }, + "babel-plugin-styled-components": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.3.tgz", + "integrity": "sha512-meGStRGv+VuKA/q0/jXxrPNWEm4LPfYIqxooDTdmh8kFsP/Ph7jJG5rUPwUPX3QHUvggwdbgdGpo88P/rRYsVw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-module-imports": "^7.15.4", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "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/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-preset-react-app": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", + "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", + "requires": { + "@babel/core": "7.12.3", + "@babel/plugin-proposal-class-properties": "7.12.1", + "@babel/plugin-proposal-decorators": "7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", + "@babel/plugin-proposal-numeric-separator": "7.12.1", + "@babel/plugin-proposal-optional-chaining": "7.12.1", + "@babel/plugin-transform-flow-strip-types": "7.12.1", + "@babel/plugin-transform-react-display-name": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.12.1", + "@babel/preset-typescript": "7.12.1", + "@babel/runtime": "7.12.1", + "babel-plugin-macros": "2.8.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + }, + "dependencies": { + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "requires": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@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.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.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" + } + }, + "@babel/preset-react": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", + "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.1", + "@babel/plugin-transform-react-jsx-development": "^7.12.1", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + } + }, + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "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": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "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" + } + }, + "better-opn": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", + "integrity": "sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==", + "requires": { + "open": "^7.0.3" + } + }, + "bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "requires": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "optional": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "binary-search-bounds": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "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": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "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": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "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" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.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=" + }, + "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" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "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" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=", + "requires": { + "ansi-regex": "^3.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==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "bplist-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", + "integrity": "sha512-2AEM0FXy8ZxVLBuqX0hqt1gDwcnz2zygEkQ6zaD5Wko/sB9paUNwlpawrFtKeHUAQUOzjVy9AO4oeonqIHKA9Q==", + "optional": true, + "requires": { + "big-integer": "^1.6.7" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "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==", + "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==" + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "dependencies": { + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + } + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "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==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" + }, + "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=" + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "c8": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", + "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "cacache": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "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.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "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==" + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "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 + } + } + }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001434", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", + "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==" + }, + "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==", + "requires": { + "rsvp": "^4.8.4" + } + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==" + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" + }, + "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==" + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + }, + "check-types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==" + }, + "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==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "requires": { + "source-map": "~0.6.0" + } + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "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" + } + } + } + }, + "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==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-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-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "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==" + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "comlink": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.3.1.tgz", + "integrity": "sha512-+YbhUdNrpBZggBAHWcgQMLPLH1KDF3wJpeqrCKieWQ8RL7atmgsgTQko1XEBK6PsecfopWNntopJ+ByYG1lRaA==" + }, + "comlink-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/comlink-loader/-/comlink-loader-2.0.0.tgz", + "integrity": "sha512-106/k0JSssSCo2QO4ucbgbyWsb2zAEOSXFAVH2A+EO8kOz3n2BkvmkToxsoo+SWKUIKy8qubhAOLCS5mpFUvHw==", + "dev": true, + "requires": { + "comlink": "^4.2.0", + "loader-utils": "^1.1.0", + "slash": "^3.0.0", + "worker-loader": "^2.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "comment-json": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-2.4.2.tgz", + "integrity": "sha512-T+iXox779qsqneMYx/x5BZyz4xjCeQRmuNVzz8tko7qZUs3MlzpA3RAs+O1XsgcKToNBMIvfVzafGOeiU7RggA==", + "requires": { + "core-util-is": "^1.0.2", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + } + }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "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=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "requires": { + "arity-n": "^1.0.4" + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "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" + } + }, + "compute-scroll-into-view": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", + "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==" + }, + "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" + } + }, + "configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "requires": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" + }, + "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==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "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=" + }, + "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=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "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==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "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": { + "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=" + }, + "copy-to-clipboard": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, + "core-js": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.0.tgz", + "integrity": "sha512-GUbtPllXMYRzIgHNZ4dTYTcUemls2cni83Q4Q/TrFONHfhcg9oEGOtaGHfb0cpzec60P96UKPvMkjX1jET8rUw==" + }, + "core-js-compat": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.0.tgz", + "integrity": "sha512-8X6lWsG+s7IfOKzV93a7fRYfWRZobOfjw5V5rrq43Vh/W+V6qYxl7Akalsvgab4PFT/4L/pjQbdBUEM36NXKrw==", + "requires": { + "browserslist": "^4.16.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "core-js-pure": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", + "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==" + }, + "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": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "country-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", + "integrity": "sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY=" + }, + "cp-file": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz", + "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==", + "requires": { + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "nested-error-stacks": "^2.0.0", + "p-event": "^4.1.0" + }, + "dependencies": { + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "cpy": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/cpy/-/cpy-8.1.2.tgz", + "integrity": "sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==", + "requires": { + "arrify": "^2.0.1", + "cp-file": "^7.0.0", + "globby": "^9.2.0", + "has-glob": "^1.0.0", + "junk": "^3.1.0", + "nested-error-stacks": "^2.1.0", + "p-all": "^2.1.0", + "p-filter": "^2.1.0", + "p-map": "^3.0.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "requires": { + "path-type": "^3.0.0" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "requires": { + "@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" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "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": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "requires": { + "@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" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "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" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + } + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "requires": { + "tiny-invariant": "^1.0.6" + } + }, + "css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=" + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "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-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "css-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "requires": { + "camelcase": "^6.0.0", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "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-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "requires": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + } + }, + "css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "requires": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=", + "dev": true + }, + "csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs=" + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssfontparser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", + "integrity": "sha1-9AIvyPlwDGgCnVQghK+69CWj8+M=", + "dev": true + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "requires": { + "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.3", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "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==" + } + } + }, + "csstype": { + "version": "2.6.17", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", + "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "optional": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "d3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.0.0.tgz", + "integrity": "sha512-t+jEKGO2jQiSBLJYYq6RFc500tsCeXBB4x41oQaSnZD3Som95nQrlw9XJGrFTMUOQOkwSMauWy9+8Tz1qm9UZw==", + "requires": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + } + }, + "d3-array": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.0.1.tgz", + "integrity": "sha512-l3Bh5o8RSoC3SBm5ix6ogaFW+J6rOUm42yOtZ2sQPCEvCqUMepeX7zgrlLLGIemxgOyo9s2CsWEidnLv5PwwRw==", + "requires": { + "internmap": "1 - 2" + } + }, + "d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" + }, + "d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + } + }, + "d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "requires": { + "d3-path": "1 - 3" + } + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==" + }, + "d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "requires": { + "delaunator": "5" + } + }, + "d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" + }, + "d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + } + }, + "d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "requires": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" + }, + "d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "requires": { + "d3-dsv": "1 - 3" + } + }, + "d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-hdL7+HBIohpgfolhBxr1KX47VMD6+vVD/oEFrxk5yhmzV2prk99EkFKYpXuhVkFpTgHdJ6/4bYcjdLPPXV4tIA==" + }, + "d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", + "requires": { + "d3-array": "2.5.0 - 3" + } + }, + "d3-geo-projection": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz", + "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==", + "requires": { + "commander": "2", + "d3-array": "1", + "d3-geo": "^1.12.0", + "resolve": "^1.1.10" + }, + "dependencies": { + "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==" + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.0.1.tgz", + "integrity": "sha512-RlLTaofEoOrMK1JoXYIGhKTkJFI/6rFrYPgxy6QlZo2BcVc4HGTqEU0rPpzuMq5T/5XcMtAzv1XiLA3zRTfygw==" + }, + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "1 - 3" + } + }, + "d3-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==" + }, + "d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" + }, + "d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" + }, + "d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" + }, + "d3-scale": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.0.tgz", + "integrity": "sha512-foHQYKpWQcyndH1CGoHdUC4PECxTxonzwwBXGT8qu+Drb1FIc6ON6dG2P5f4hRRMkLiIKeWK7iFtdznDUrnuPQ==", + "requires": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + } + }, + "d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "requires": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + } + }, + "d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + }, + "d3-shape": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.0.1.tgz", + "integrity": "sha512-HNZNEQoDhuCrDWEc/BMbF/hKtzMZVoe64TvisFLDp2Iyj0UShB/E6/lBsLlJTfBMbYgftHj90cXJ0SEitlE6Xw==", + "requires": { + "d3-path": "1 - 3" + } + }, + "d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-nzaCwlj+ZVBIlFuVOT1RmU+6xb/7D5IcnhHzHQcBgS/aTa5K9fWZNN5LCXA27LgF5WxoSNJqKBbLcGMtM6Ca6A==", + "requires": { + "d3-time": "1 - 3" + } + }, + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" + }, + "d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "requires": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + } + }, + "damerau-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" + }, + "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==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + }, + "dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "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" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" + }, + "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=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "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=" + }, + "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==" + }, + "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==" + }, + "default-browser-id": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-1.0.4.tgz", + "integrity": "sha512-qPy925qewwul9Hifs+3sx1ZYn14obHxpkX+mPD369w4Rzg+YkJBgi3SOvwUq81nWSjqGUegIgEPwD8u+HUnxlw==", + "optional": true, + "requires": { + "bplist-parser": "^0.1.0", + "meow": "^3.1.0", + "untildify": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "optional": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "optional": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "optional": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "optional": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "optional": 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" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "optional": 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": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "optional": 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": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "optional": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "optional": 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": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "optional": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "optional": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "optional": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "optional": 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==", + "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==", + "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==", + "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==", + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "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" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "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=" + }, + "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" + } + } + } + }, + "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==" + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "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": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, + "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" + } + } + } + }, + "delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "requires": { + "robust-predicates": "^3.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "requires": { + "repeat-string": "^1.5.4" + } + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" + }, + "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-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "detect-package-manager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", + "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", + "requires": { + "execa": "^5.1.1" + } + }, + "detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "requires": { + "address": "^1.0.1", + "debug": "4" + } + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "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==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "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=" + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "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=", + "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==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-accessibility-api": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", + "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", + "dev": true + }, + "dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + } + } + }, + "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" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + } + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "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==" + } + } + }, + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "requires": { + "domelementtype": "^2.2.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + } + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "dot-object": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-2.1.4.tgz", + "integrity": "sha512-7FXnyyCLFawNYJ+NhkqyP9Wd2yzuo+7n9pGiYpkmXCTYa8Ci2U0eUNDVg5OuO5Pm6aFXI2SWN8/N/w7SJWu1WA==", + "requires": { + "commander": "^4.0.0", + "glob": "^7.1.5" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + } + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "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==" + } + } + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "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==" + }, + "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.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "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.3", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.3.tgz", + "integrity": "sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug==" + }, + "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" + } + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "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==" + }, + "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==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz", + "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==", + "requires": { + "strongly-connected-components": "^1.0.1" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==" + }, + "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==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "endent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", + "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", + "requires": { + "dedent": "^0.7.0", + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.5" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "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" + } + }, + "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" + } + }, + "es5-shim": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.7.tgz", + "integrity": "sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==" + }, + "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-shim": { + "version": "0.35.6", + "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.6.tgz", + "integrity": "sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==" + }, + "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" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "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==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + }, + "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" + } + }, + "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" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "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" + } + } + } + }, + "eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==", + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true + }, + "eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "requires": { + "confusing-browser-globals": "^1.0.10" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", + "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "requires": { + "debug": "^3.2.7", + "find-up": "^2.1.0", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.7.2.tgz", + "integrity": "sha512-7Oq/N0+3nijBnYWQYzz/Mp/7ZCpwxYvClRyW/PLAmimY9uLCBvoXsNsERcJdkKceyOjgRbFhhxs058KTrne9Mg==", + "requires": { + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz", + "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==", + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.0", + "has": "^1.0.3", + "is-core-module": "^2.7.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "dependencies": { + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-jest": { + "version": "24.3.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz", + "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==", + "requires": { + "@typescript-eslint/experimental-utils": "^4.0.1" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "requires": { + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + }, + "dependencies": { + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + } + } + }, + "eslint-plugin-prettier": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==" + }, + "eslint-plugin-testing-library": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", + "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", + "requires": { + "@typescript-eslint/experimental-utils": "^3.10.1" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==" + }, + "@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "requires": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "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": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "eslint-webpack-plugin": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", + "requires": { + "@types/eslint": "^7.2.6", + "arrify": "^2.0.1", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "estree-to-babel": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/estree-to-babel/-/estree-to-babel-3.2.1.tgz", + "integrity": "sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==", + "requires": { + "@babel/traverse": "^7.1.6", + "@babel/types": "^7.2.0", + "c8": "^7.6.0" + } + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "eventsource": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", + "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", + "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==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "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": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "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=" + } + } + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, + "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=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "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": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "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-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==" + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "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==", + "requires": { + "bser": "2.1.1" + } + }, + "fetch-retry": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.3.tgz", + "integrity": "sha512-uJQyMrX5IJZkhoEUBQ3EjxkeiZkppBd5jS/fMTJmfZxLSiaQjv2zD0kTvuvkSH89uFvgSlB6ueGpjD3HWN7Bxw==" + }, + "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==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "file-system-cache": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.1.0.tgz", + "integrity": "sha512-IzF5MBq+5CR0jXx5RxPe4BICl/oEhBSXKaL9fLhAXrIfIUS77Hr4vzrYyqYMHN6uTt+BOqi3fDCTjjEBCjERKw==", + "requires": { + "fs-extra": "^10.1.0", + "ramda": "^0.28.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "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==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "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" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + }, + "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==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "focus-lock": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.8.1.tgz", + "integrity": "sha512-/LFZOIo82WDsyyv7h7oc0MJF9ACOvDRdx9rWPZ2pgMfNWu/z8hQDBtOchuB/0BVLmuFOZjV02YwUVzNsWx/EzA==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + }, + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" + }, + "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-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==", + "dev": true, + "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=" + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "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" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formik": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", + "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==", + "requires": { + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "react-fast-compare": "^2.0.1", + "tiny-warning": "^1.0.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" + } + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "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-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "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.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "fuzzy-search": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/fuzzy-search/-/fuzzy-search-3.2.1.tgz", + "integrity": "sha512-vAcPiyomt1ioKAsAL2uxSABHJ4Ju/e4UeDM+g1OlR0vV4YhLGMNsdLNvZTpEDY4JCSt0E4hASCNM5t2ETtsbyg==" + }, + "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" + } + }, + "gemoji": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-6.1.0.tgz", + "integrity": "sha512-MOlX3doQ1fsfzxQX8Y+u6bC5Ssc1pBUBIPVyrS69EzKt+5LIZAOm0G5XGVNhwXFgkBF3r+Yk88ONyrFHo8iNFA==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "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==" + }, + "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-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" + }, + "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==" + }, + "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==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "devOptional": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-config-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", + "integrity": "sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ=", + "requires": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "homedir-polyfill": "^1.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "git-username": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/git-username/-/git-username-1.0.0.tgz", + "integrity": "sha512-xm45KwBR6Eu1jO4umx/o2M84v9TC7tdOBuzLx8ayhdR9H1FBiiG9azz31uC0esDvaWVBTDINpJ5USomk+ja8OQ==", + "requires": { + "parse-github-url": "^1.0.2", + "remote-origin-url": "^1.0.0" + } + }, + "github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "dev": true + }, + "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.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + }, + "gl-text": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.3.1.tgz", + "integrity": "sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w==", + "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": "^2.0.0", + "to-px": "^1.0.1", + "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" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-promise": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", + "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "requires": { + "@types/glob": "*" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "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-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "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==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "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" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "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" + } + }, + "globule": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", + "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", + "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-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-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" + }, + "dependencies": { + "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.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" + } + } + } + }, + "glslify": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", + "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", + "requires": { + "bl": "^2.2.1", + "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.5", + "resolve": "^1.1.5", + "stack-trace": "0.0.9", + "static-eval": "^2.0.5", + "through2": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "requires": { + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "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" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "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==", + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "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=", + "optional": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "gzipper": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gzipper/-/gzipper-5.0.1.tgz", + "integrity": "sha512-dGrx0KGY3pycpw1ecbQN35zA0SfJERJjwO2rN8F3zgtbNXdlgB1DlbUl4BnmyRrIjioN2g1o91lIDpMzXb95JQ==", + "dev": true, + "requires": { + "commander": "^7.2.0", + "deep-equal": "^2.0.5", + "uuid": "^8.3.2" + }, + "dependencies": { + "deep-equal": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", + "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "es-get-iterator": "^1.1.1", + "get-intrinsic": "^1.0.1", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.1.1", + "isarray": "^2.0.5", + "object-is": "^1.1.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.3", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "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==" + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "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.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", + "integrity": "sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g==", + "requires": { + "is-glob": "^3.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "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-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==" + }, + "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-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "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==", + "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==", + "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==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "requires": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "dependencies": { + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + } + } + }, + "hast-util-from-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz", + "integrity": "sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==", + "requires": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "dependencies": { + "comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==" + }, + "hast-util-parse-selector": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz", + "integrity": "sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==", + "requires": { + "@types/hast": "^2.0.0" + } + }, + "hastscript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.0.2.tgz", + "integrity": "sha512-uA8ooUY4ipaBvKcMuPehTAB/YfFLSSzCwFSwT6ltJbocFUKH/GDHLN+tflq7lSRf9H86uOuxOFkh1KgIy3Gg2g==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + } + }, + "property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==" + }, + "space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==" + } + } + }, + "hast-util-is-element": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.1.tgz", + "integrity": "sha512-ag0fiZfRWsPiR1udvnSbaazJLGv8qd8E+/e3rW8rUZhbKG4HNJmFL4QkEceN+22BgE+uozXY30z/s+2dL6Z++g==", + "requires": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + } + }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + }, + "hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "dependencies": { + "@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "requires": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + } + }, + "html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "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==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + } + } + }, + "hast-util-to-html": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.3.tgz", + "integrity": "sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A==", + "requires": { + "@types/hast": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.2", + "unist-util-is": "^5.0.0" + }, + "dependencies": { + "comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==" + }, + "property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==" + }, + "space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==" + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==" + } + } + }, + "hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "requires": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "dependencies": { + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + } + } + }, + "hast-util-to-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz", + "integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==" + }, + "hast-util-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", + "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==" + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "highcharts": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-9.3.2.tgz", + "integrity": "sha512-I/48gNMvs3hZxZnPRUqLbnlrGZJJ7YPPVr1+fYeZ35p4pSZAOwTmAGbptrjBr7JlF52HmJH9zMbt/I4TPLu9Pg==" + }, + "highcharts-react-official": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/highcharts-react-official/-/highcharts-react-official-3.1.0.tgz", + "integrity": "sha512-CkWJHrVMOc6CT8KFu1dR+a0w5OxCVKKgZUNWtEi5TmR0xqBDIDe+RyM652MAN/jBYppxMo6TCUVlRObCyWAn0Q==" + }, + "history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "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=", + "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" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "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==" + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "hsluv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", + "integrity": "sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw=" + }, + "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==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + } + } + }, + "html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==" + }, + "html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==" + }, + "html-webpack-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + }, + "dependencies": { + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.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==" + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "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==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "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==", + "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==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "humanize-duration": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.27.0.tgz", + "integrity": "sha512-qLo/08cNc3Tb0uD7jK0jAcU5cnqCM0n568918E7R2XhMr/+7F37p4EY062W/stg7tmzvknNn9b/1+UhVRzsYrQ==" + }, + "husky": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", + "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "dev": true + }, + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "requires": { + "postcss": "^7.0.14" + } + }, + "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=", + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + }, + "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" + } + }, + "immer": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz", + "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "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==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "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=" + }, + "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.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "internmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.1.tgz", + "integrity": "sha512-Ujwccrj9FkGqjbY3iVoxD1VV+KdZZeENx0rphrtzmRXbFvkFO88L80BL/zeSIguX/7T+y8k04xqtgWgS5vxwxw==" + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "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==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "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-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-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.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-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==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-dom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.1.0.tgz", + "integrity": "sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ==", + "dev": true, + "requires": { + "is-object": "^1.0.1", + "is-window": "^1.0.2" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-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": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "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==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-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-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "dependencies": { + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "^1.0.1" + } + } + } + }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" + }, + "is-mobile": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.2.tgz", + "integrity": "sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg==" + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true + }, + "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==" + }, + "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==", + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "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==", + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-scoped": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-2.1.0.tgz", + "integrity": "sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==", + "requires": { + "scoped-regex": "^2.0.0" + } + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-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-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.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-url-superb": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-3.0.0.tgz", + "integrity": "sha512-3faQP+wHCGDQT1qReM5zCPx2mxoal6DzbzquFlCYJLWyy4WPTved33ea2xFbX37z4NoriEwZGIYhFtx8RUB5wQ==", + "requires": { + "url-regex": "^5.0.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "optional": true + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "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-window": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-window/-/is-window-1.0.2.tgz", + "integrity": "sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-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==", + "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==" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "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=" + }, + "isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "requires": { + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" + }, + "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==", + "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==" + } + } + }, + "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==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "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==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==" + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, + "jest": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "requires": { + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "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.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + }, + "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==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "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.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "jest-canvas-mock": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.3.1.tgz", + "integrity": "sha512-5FnSZPrX3Q2ZfsbYNE3wqKR3+XorN8qFzDzB5o0golWgt6EOX1+emBnpOc9IAQ+NXFj8Nzm3h7ZdE/9H0ylBcg==", + "dev": true, + "requires": { + "cssfontparser": "^1.2.1", + "moo-color": "^1.0.2" + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + } + } + }, + "jest-circus": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", + "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + } + } + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "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==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } + }, + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "requires": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + }, + "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==" + }, + "jest-resolve": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", + "requires": { + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } + }, + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + } + } + }, + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.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==" + }, + "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==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "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.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + } + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-watch-typeahead": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", + "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", + "requires": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^26.0.0", + "jest-watcher": "^26.3.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==" + }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", + "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "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": "^8.5.0", + "ws": "^7.4.5", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz", + "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==" + } + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "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=" + }, + "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 + }, + "json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "requires": { + "string-convert": "^0.2.0" + } + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jss": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.7.1.tgz", + "integrity": "sha512-5QN8JSVZR6cxpZNeGfzIjqPEP+ZJwJJfZbXmeABNdxiExyO+eJJDy6WDtqTf8SDKnbL5kZllEpAP71E/Lt7PXg==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + } + } + }, + "jss-plugin-camel-case": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.7.1.tgz", + "integrity": "sha512-+ioIyWvmAfgDCWXsQcW1NMnLBvRinOVFkSYJUgewQ6TynOcSj5F1bSU23B7z0p1iqK0PPHIU62xY1iNJD33WGA==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.7.1" + } + }, + "jss-plugin-default-unit": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.7.1.tgz", + "integrity": "sha512-tW+dfYVNARBQb/ONzBwd8uyImigyzMiAEDai+AbH5rcHg5h3TtqhAkxx06iuZiT/dZUiFdSKlbe3q9jZGAPIwA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "jss-plugin-global": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.7.1.tgz", + "integrity": "sha512-FbxCnu44IkK/bw8X3CwZKmcAnJqjAb9LujlAc/aP0bMSdVa3/MugKQRyeQSu00uGL44feJJDoeXXiHOakBr/Zw==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "jss-plugin-nested": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.7.1.tgz", + "integrity": "sha512-RNbICk7FlYKaJyv9tkMl7s6FFfeLA3ubNIFKvPqaWtADK0KUaPsPXVYBkAu4x1ItgsWx67xvReMrkcKA0jSXfA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.7.1.tgz", + "integrity": "sha512-eyd5FhA+J0QrpqXxO7YNF/HMSXXl4pB0EmUdY4vSJI4QG22F59vQ6AHtP6fSwhmBdQ98Qd9gjfO+RMxcE39P1A==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.7.1.tgz", + "integrity": "sha512-fGAAImlbaHD3fXAHI3ooX6aRESOl5iBt3LjpVjxs9II5u9tzam7pqFUmgTcrip9VpRqYHn8J3gA7kCtm8xKwHg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-template": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-template/-/jss-plugin-template-10.7.1.tgz", + "integrity": "sha512-FHQdbo5Yf13XOm9k7A+iJyUisY5yj6LGuLHOt3VR3yWRt6x/AzJ3q/znRKSNqZBaDFpNdxjIFZNAFFaVDd2cjQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.7.1.tgz", + "integrity": "sha512-1UHFmBn7hZNsHXTkLLOL8abRl8vi+D1EVzWD4WmLFj55vawHZfnH1oEz6TUf5Y61XHv0smdHabdXds6BgOXe3A==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.7.1" + } + }, + "jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "requires": { + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" + } + }, + "junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==" + }, + "kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "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==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==" + }, + "language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-universal-dotenv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz", + "integrity": "sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==", + "requires": { + "@babel/runtime": "^7.5.0", + "app-root-dir": "^1.0.2", + "core-js": "^3.0.4", + "dotenv": "^8.0.0", + "dotenv-expand": "^5.1.0" + } + }, + "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==" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "libnpx": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/libnpx/-/libnpx-10.2.4.tgz", + "integrity": "sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA==", + "requires": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^14.2.3" + }, + "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==" + }, + "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" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "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" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "requires": { + "ci-info": "^1.5.0" + } + }, + "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=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "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" + } + }, + "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==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.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==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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" + } + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "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" + } + }, + "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==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "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.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", + "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "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=" + }, + "linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "lint-staged": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", + "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", + "dev": true, + "requires": { + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "listify": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/listify/-/listify-1.0.3.tgz", + "integrity": "sha512-083swF7iH7bx8666zdzBColpgEuy46HjN3r1isD4zV6Ix7FuHfb/2/WVnl4CH8hjuoWeFF7P5KkKNXUnJCFEJg==" + }, + "listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.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": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "optional": 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" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "optional": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "optional": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "optional": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "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.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "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.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.findindex": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", + "integrity": "sha512-9er6Ccz6sEST3bHFtUrCFWk14nE8cdL/RoW1RRDV1BxqN3qsmsT56L14jhfctAqhVPVcdJw4MRxEaVoAK+JVvw==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=" + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" + }, + "loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha1-akAhj9x64V/HbD0PPmdsRlOIYD4=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + }, + "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" + } + }, + "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 + } + } + }, + "longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=" + }, + "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": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "optional": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "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": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", + "dev": true + }, + "map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "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" + } + }, + "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-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "requires": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + } + } + }, + "markdown-it-container": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-3.0.0.tgz", + "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==" + }, + "markdown-it-emoji": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz", + "integrity": "sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ==" + }, + "marked": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", + "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==" + }, + "material-icons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-0.1.0.tgz", + "integrity": "sha512-xDTXrjrt03EiA+LL3nHttQs3DTGft/mV+JHSiVhQyl0Nk8SEwnNqB/fyu6REAz9mYoYCdr4vnhQzkTsGbx0BPg==" + }, + "material-ui-audio-player": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/material-ui-audio-player/-/material-ui-audio-player-1.7.1.tgz", + "integrity": "sha512-5MGudB9K82Txm6cRoRaXS2AypPS3/kJvwPW5B+Gll8T6WIT6wPkX/NYpoOupasxuJKXXcSR+vNmCLh06QWdHbA==", + "requires": { + "classnames": "^2.2.6" + } + }, + "math-log2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", + "integrity": "sha1-+4lBvl9evol55xjmJzsXjlhpRWU=" + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "requires": { + "unist-util-remove": "^2.0.0" + } + }, + "mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", + "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", + "dev": true + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memfs": { + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", + "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "requires": { + "map-or-similar": "^1.5.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=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "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==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "middleearth-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/middleearth-names/-/middleearth-names-1.1.0.tgz", + "integrity": "sha1-wdXuSN77NoEo+66/686IR80Y3f8=", + "requires": { + "unique-random-array": "1.0.0" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "requires": { + "mime-db": "1.48.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "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==" + }, + "mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "requires": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + } + }, + "mini-css-extract-plugin": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", + "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "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": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "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.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.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" + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "monaco-editor": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", + "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==" + }, + "moo-color": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.2.tgz", + "integrity": "sha512-5iXz5n9LWQzx/C2WesGFfpE6RLamzdHwsn3KpfzShwbfIqs7stnoEpaNErf/7+3mbxwZ4s8Foq7I0tPxw7BWHg==", + "dev": true, + "requires": { + "color-name": "^1.1.4" + } + }, + "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" + } + }, + "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": { + "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" + } + } + } + }, + "mrm": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/mrm/-/mrm-3.0.10.tgz", + "integrity": "sha512-aRByZsPXMM8W0NHNH9afkKyk5OW4bB5pYNRIN+8iSVfpMAzqeMejmj/yIYcdFNJTksXmdPMfTaucm2NYdh4xIw==", + "requires": { + "git-username": "^1.0.0", + "glob": "^7.1.6", + "inquirer": "^7.0.4", + "is-directory": "^0.3.1", + "kleur": "^3.0.3", + "libnpx": "^10.2.4", + "listify": "^1.0.0", + "lodash": "^4.17.15", + "longest": "^2.0.1", + "middleearth-names": "^1.1.0", + "minimist": "^1.2.0", + "mrm-core": "^6.1.7", + "semver-utils": "^1.1.4", + "update-notifier": "^4.1.0", + "user-home": "^2.0.0", + "user-meta": "^1.0.0", + "which": "^2.0.2" + } + }, + "mrm-core": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/mrm-core/-/mrm-core-6.1.7.tgz", + "integrity": "sha512-jLGWrkupcgGIsLerrI/xmM/dFHbaoehRsuVbgYBrxYKXNMRBHN3Mgkd8cw+/ZCCoiZEXF8/SaZol0GCp6oBQ9g==", + "requires": { + "babel-code-frame": "^6.26.0", + "comment-json": "^2.2.0", + "detect-indent": "^6.0.0", + "editorconfig": "^0.15.3", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "kleur": "^3.0.3", + "listify": "^1.0.0", + "lodash": "^4.17.15", + "minimist": "^1.2.0", + "prop-ini": "^0.0.2", + "rc": "^1.2.8", + "readme-badger": "^0.3.0", + "semver": "^6.3.0", + "smpltmpl": "^1.0.2", + "split-lines": "^2.0.0", + "strip-bom": "^4.0.0", + "validate-npm-package-name": "^3.0.0", + "webpack-merge": "^4.2.2", + "yaml": "^2.0.0-1" + }, + "dependencies": { + "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==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "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==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "yaml": { + "version": "2.0.0-9", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-9.tgz", + "integrity": "sha512-Bf2KowHjyVkIIiGMt7+fbhmlvKOaE8DWuD07bnL4+FQ9sPmEl/5IzGpBpoxPqOaHuyasBjJhyXDcISpJWfhCGw==" + } + } + }, + "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==", + "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=" + }, + "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=" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "devOptional": true + }, + "nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" + }, + "native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", + "requires": { + "querystring": "^0.2.0" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "nested-error-stacks": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "requires": { + "minimatch": "^3.0.2" + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" + }, + "node-sass": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tgz", + "integrity": "sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "meow": "^9.0.0", + "nan": "^2.13.2", + "node-gyp": "^7.1.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" + } + }, + "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 + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-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": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-name": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/npm-name/-/npm-name-5.5.0.tgz", + "integrity": "sha512-l7/uyVfEi2e3ho+ovaJZC0xlbwzXNUz3RxkxpfcnLuoGKAuYoo9YoJ/uy18PsTD8IziugGHks4t/mGmBJEZ4Qg==", + "requires": { + "got": "^9.6.0", + "is-scoped": "^2.1.0", + "is-url-superb": "^3.0.0", + "lodash.zip": "^4.2.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.1.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "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==", + "requires": { + "path-key": "^3.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==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "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 + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "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=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "objectorarray": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", + "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==" + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "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==", + "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=" + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "orderedmap": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.5.tgz", + "integrity": "sha512-/fzlCGKRmfayGoI9UUXvJfc2nMZlJHW30QqEvwPvlg8tsX7jyiUSomYie6mYqx7Z9bOMGoag0H/q1PS/0PjYkg==" + }, + "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==", + "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=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "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=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "outline-icons": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/outline-icons/-/outline-icons-1.42.0.tgz", + "integrity": "sha512-px2wNGrzTDCU0pxUO2pKs5dgE3fdz3bQ3lpLA9CgzBpkcadpOQgRxxxyBQ12fyOXyKC0L4evAJeomoAtvMWISQ==" + }, + "p-all": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-all/-/p-all-2.1.0.tgz", + "integrity": "sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==", + "requires": { + "p-map": "^2.0.0" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + } + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==" + }, + "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==", + "requires": { + "p-timeout": "^3.1.0" + } + }, + "p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "requires": { + "p-map": "^2.0.0" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + } + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "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==", + "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==", + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "^1.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" + } + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parenthesis": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz", + "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==" + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "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==", + "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-git-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz", + "integrity": "sha1-06mYQxcTL1c5hxK7pDjhKVkN34w=", + "requires": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "git-config-path": "^1.0.1", + "ini": "^1.3.4" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==" + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "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": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "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=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "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" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "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.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "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=" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "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": "2.8.0", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.8.0.tgz", + "integrity": "sha512-bYuLdTlQEWMs/u3nNqV/jwERj9tw8qMDKBV8NBP1BucfapLoYIM9w4ARc3W9m93r6OYvP5I6ykUztiDmDcvA9Q==", + "requires": { + "@plotly/d3": "3.8.0", + "@plotly/d3-sankey": "0.7.2", + "@plotly/d3-sankey-circular": "0.33.1", + "@turf/area": "^6.4.0", + "@turf/bbox": "^6.4.0", + "@turf/centroid": "^6.0.2", + "canvas-fit": "^1.5.0", + "color-alpha": "1.0.4", + "color-normalize": "1.5.0", + "color-parse": "1.3.8", + "color-rgba": "2.1.1", + "country-regex": "^1.1.0", + "d3-force": "^1.2.1", + "d3-format": "^1.4.5", + "d3-geo": "^1.12.1", + "d3-geo-projection": "^2.9.0", + "d3-hierarchy": "^1.1.9", + "d3-interpolate": "^1.4.0", + "d3-time": "^1.1.0", + "d3-time-format": "^2.2.3", + "fast-isnumeric": "^1.1.4", + "gl-mat4": "^1.2.0", + "gl-text": "^1.3.1", + "glslify": "^7.1.1", + "has-hover": "^1.0.1", + "has-passive-events": "^1.0.0", + "is-mobile": "^2.2.2", + "mapbox-gl": "1.10.1", + "mouse-change": "^1.4.0", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.2.0", + "native-promise-only": "^0.8.1", + "parse-svg-path": "^0.1.2", + "polybooljs": "^1.2.0", + "probe-image-size": "^7.2.2", + "regl": "^2.1.0", + "regl-error2d": "^2.0.12", + "regl-line2d": "^3.1.2", + "regl-scatter2d": "^3.2.8", + "regl-splom": "^1.0.14", + "strongly-connected-components": "^1.0.1", + "superscript-text": "^1.0.0", + "svg-path-sdf": "^1.1.3", + "tinycolor2": "^1.4.2", + "to-px": "1.0.1", + "topojson-client": "^3.1.0", + "webgl-context": "^2.2.0", + "world-calendars": "^1.0.3" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "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.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "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-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "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==" + } + } + }, + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "polished": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", + "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.17.8" + } + }, + "polybooljs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.0.tgz", + "integrity": "sha1-tDkMLgedTCYtOyUExiiNlbp6R1g=" + }, + "popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "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==", + "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==", + "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==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "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": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-browser-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", + "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", + "requires": { + "postcss": "^7" + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-flexbugs-fixes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", + "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", + "requires": { + "postcss": "^7.0.26" + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "requires": { + "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" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "requires": { + "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" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-normalize": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", + "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", + "requires": { + "@csstools/normalize.css": "^10.1.0", + "browserslist": "^4.6.2", + "postcss": "^7.0.17", + "postcss-browser-comments": "^3.0.0", + "sanitize.css": "^10.0.0" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + }, + "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==" + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-safe-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", + "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", + "requires": { + "postcss": "^8.1.0" + }, + "dependencies": { + "postcss": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + } + } + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "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==" + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "dev": true + }, + "prettier-eslint": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-12.0.0.tgz", + "integrity": "sha512-N8SGGQwAosISXTNl1E57sBbtnqUGlyRWjcfIUxyD3HF4ynehA9GZ8IfJgiep/OfYvCof/JEpy9ZqSl250Wia7A==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "^3.0.0", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^7.9.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^2.0.0", + "pretty-format": "^23.0.1", + "require-relative": "^0.8.7", + "typescript": "^3.9.3", + "vue-eslint-parser": "~7.1.0" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", + "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "3.10.1", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "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": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "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-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==" + }, + "prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, + "probe-image-size": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.2.tgz", + "integrity": "sha512-QUm+w1S9WTsT5GZB830u0BHExrUmF0J4fyRm5kbLUMEP3fl9UVYXc3xOBVqZNnH9tnvVEJO8vDk3PMtsLqjxug==", + "requires": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, + "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==" + }, + "progress-bar-webpack-plugin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-2.1.0.tgz", + "integrity": "sha512-UtlZbnxpYk1wufEWfhIjRn2U52zlY38uvnzFhs8rRxJxC1hSqw88JNR2Mbpqq9Kix8L1nGb3uQ+/1BiUWbigAg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "progress": "^2.0.3" + } + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "requires": { + "asap": "~2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "promise.allsettled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", + "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", + "requires": { + "array.prototype.map": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "iterate-value": "^1.0.2" + } + }, + "promise.prototype.finally": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.4.tgz", + "integrity": "sha512-nNc3YbgMfLzqtqvO/q5DP6RR0SiHI9pUPGzyDf1q+usTwCN2kjvAnJkBb7bHe3o+fFSBPpsGMoYtaSi+LTNqng==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-ini": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/prop-ini/-/prop-ini-0.0.2.tgz", + "integrity": "sha1-ZzOny1JCrKsr5C5gdYPYEksXKls=", + "requires": { + "extend": "^3.0.0" + } + }, + "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" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "property-expr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz", + "integrity": "sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==" + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "prosemirror-commands": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.2.2.tgz", + "integrity": "sha512-TX+KpWudMon06frryfpO/u7hsQv2hu8L4VSVbCpi3/7wXHBgl+35mV85qfa3RpT8xD2f3MdeoTqH0vy5JdbXPg==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-dropcursor": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.4.0.tgz", + "integrity": "sha512-6+YwTjmqDwlA/Dm+5wK67ezgqgjA/MhSDgaNxKUzH97SmeuWFXyLeDRxxOPZeSo7yTxcDGUCWTEjmQZsVBuMrQ==", + "requires": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "prosemirror-gapcursor": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.2.2.tgz", + "integrity": "sha512-7YzuRBbu9W7HGQde84kCHfIjaRLNcAdeijbgqrm/R9dsdTWkV+rrdcmic/sCc+bptiNpvjCEE+R6hrbT8zFQeQ==", + "requires": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "prosemirror-history": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.2.0.tgz", + "integrity": "sha512-B9v9xtf4fYbKxQwIr+3wtTDNLDZcmMMmGiI3TAPShnUzvo+Rmv1GiUrsQChY1meetHl7rhML2cppF3FTs7f7UQ==", + "requires": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "rope-sequence": "^1.3.0" + } + }, + "prosemirror-inputrules": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.1.3.tgz", + "integrity": "sha512-ZaHCLyBtvbyIHv0f5p6boQTIJjlD6o2NPZiEaZWT2DA+j591zS29QQEMT4lBqwcLW3qRSf7ZvoKNbf05YrsStw==", + "requires": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-keymap": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.1.5.tgz", + "integrity": "sha512-8SZgPH3K+GLsHL2wKuwBD9rxhsbnVBTwpHCO4VUO5GmqUQlxd/2GtBVWTsyLq4Dp3N9nGgPd3+lZFKUDuVp+Vw==", + "requires": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "prosemirror-markdown": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.8.0.tgz", + "integrity": "sha512-RxGyM8dqdmlkYpM3PY/C5JBputv2xeKLNRqFpN04TtFlR9McN9Tmpf8DaP6HblfaZ8RofdUtQW+ghdArjANLvQ==", + "requires": { + "markdown-it": "^12.0.0", + "prosemirror-model": "^1.0.0" + } + }, + "prosemirror-model": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.16.1.tgz", + "integrity": "sha512-r1/w0HDU40TtkXp0DyKBnFPYwd8FSlUSJmGCGFv4DeynfeSlyQF2FD0RQbVEMOe6P3PpUSXM6LZBV7W/YNZ4mA==", + "requires": { + "orderedmap": "^1.1.0" + } + }, + "prosemirror-schema-list": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.1.6.tgz", + "integrity": "sha512-aFGEdaCWmJzouZ8DwedmvSsL50JpRkqhQ6tcpThwJONVVmCgI36LJHtoQ4VGZbusMavaBhXXr33zyD2IVsTlkw==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-state": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.4.tgz", + "integrity": "sha512-Xkkrpd1y/TQ6HKzN3agsQIGRcLckUMA9u3j207L04mt8ToRgpGeyhbVv0HI7omDORIBHjR29b7AwlATFFf2GLA==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-tables": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.1.1.tgz", + "integrity": "sha512-LmCz4jrlqQZRsYRDzCRYf/pQ5CUcSOyqZlAj5kv67ZWBH1SVLP2U9WJEvQfimWgeRlIz0y0PQVqO1arRm1+woA==", + "requires": { + "prosemirror-keymap": "^1.1.2", + "prosemirror-model": "^1.8.1", + "prosemirror-state": "^1.3.1", + "prosemirror-transform": "^1.2.1", + "prosemirror-view": "^1.13.3" + } + }, + "prosemirror-transform": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.4.2.tgz", + "integrity": "sha512-bcIsf3uRZhfab0xRfyyxOEh6eqSszq/hJbDbmUumFnbHBoWhB/uXbpz6vvUxfk0XiEvrZDJ+5pXRrNDc1Hu3vQ==", + "requires": { + "prosemirror-model": "^1.0.0" + } + }, + "prosemirror-utils": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/prosemirror-utils/-/prosemirror-utils-0.9.6.tgz", + "integrity": "sha512-UC+j9hQQ1POYfMc5p7UFxBTptRiGPR7Kkmbl3jVvU8VgQbkI89tR/GK+3QYC8n+VvBZrtAoCrJItNhWSxX3slA==" + }, + "prosemirror-view": { + "version": "1.23.12", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.23.12.tgz", + "integrity": "sha512-uvw9ZVz5dNDD9w1bzHkU2r4NWFlpFz85v9rCD8NAhQBau6LYhwM/crjry+C4JgeR8gy6pMXS5eJ1zhNLcK4ctQ==", + "requires": { + "prosemirror-model": "^1.16.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "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=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + } + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "quantize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz", + "integrity": "sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4=" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "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==" + }, + "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" + } + }, + "raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, + "ramda": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz", + "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + } + } + }, + "raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + } + } + }, + "rc-align": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", + "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-cascader": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.7.0.tgz", + "integrity": "sha512-SFtGpwmYN7RaWEAGTS4Rkc62ZV/qmQGg/tajr/7mfIkleuu8ro9Hlk6J+aA0x1YS4zlaZBtTcSaXM01QMiEV/A==", + "requires": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.6.1" + } + }, + "rc-checkbox": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz", + "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + } + }, + "rc-collapse": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.4.2.tgz", + "integrity": "sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.2.1", + "shallowequal": "^1.1.0" + } + }, + "rc-dialog": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.2.tgz", + "integrity": "sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==", + "requires": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + } + }, + "rc-drawer": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.1.4.tgz", + "integrity": "sha512-tuRk2Hzecczt4zSH09ZQkAPzvi28HxvTgsTJtqUHgPPezhE+UBypyNls1hLVehD8fpFbsA12flophT2rKT/W8Q==", + "requires": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-6", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.21.2" + } + }, + "rc-dropdown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", + "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-trigger": "^5.3.1", + "rc-util": "^5.17.0" + } + }, + "rc-field-form": { + "version": "1.27.4", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.27.4.tgz", + "integrity": "sha512-PQColQnZimGKArnOh8V2907+VzDCXcqtFvHgevDLtqWc/P7YASb/FqntSmdS8q3VND5SHX3Y1vgMIzY22/f/0Q==", + "requires": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.8.0" + } + }, + "rc-image": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.13.0.tgz", + "integrity": "sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==", + "requires": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.0.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.0.6" + } + }, + "rc-input": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.1.4.tgz", + "integrity": "sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + } + }, + "rc-input-number": { + "version": "7.3.11", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.3.11.tgz", + "integrity": "sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.23.0" + } + }, + "rc-mentions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.13.1.tgz", + "integrity": "sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-menu": "~9.8.0", + "rc-textarea": "^0.4.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.22.5" + } + }, + "rc-menu": { + "version": "9.8.2", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.2.tgz", + "integrity": "sha512-EahOJVjLuEnJsThoPN+mGnVm431RzVzDLZWHRS/YnXTQULa7OsgdJa/Y7qXxc3Z5sz8mgT6xYtgpmBXLxrZFaQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.8", + "rc-trigger": "^5.1.2", + "rc-util": "^5.27.0" + } + }, + "rc-motion": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.3.tgz", + "integrity": "sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + } + }, + "rc-notification": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.6.1.tgz", + "integrity": "sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.2.0", + "rc-util": "^5.20.1" + } + }, + "rc-overflow": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.8.tgz", + "integrity": "sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.19.2" + } + }, + "rc-pagination": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz", + "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + } + }, + "rc-picker": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.7.0.tgz", + "integrity": "sha512-oZH6FZ3j4iuBxHB4NvQ6ABRsS2If/Kpty1YFFsji7/aej6ruGmfM7WnJWQ88AoPfpJ++ya5z+nVEA8yCRYGKyw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "date-fns": "2.x", + "dayjs": "1.x", + "moment": "^2.24.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.4.0", + "shallowequal": "^1.1.0" + } + }, + "rc-progress": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.1.tgz", + "integrity": "sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + } + }, + "rc-rate": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.2.tgz", + "integrity": "sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + } + }, + "rc-resize-observer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz", + "integrity": "sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==", + "requires": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.27.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-segmented": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.1.2.tgz", + "integrity": "sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + } + }, + "rc-select": { + "version": "14.1.16", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.1.16.tgz", + "integrity": "sha512-71XLHleuZmufpdV2vis5oituRkhg2WNvLpVMJBGWRar6WGAVOHXaY9DR5HvwWry3EGTn19BqnL6Xbybje6f8YA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.2.0" + } + }, + "rc-slider": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.0.1.tgz", + "integrity": "sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.18.1", + "shallowequal": "^1.1.0" + } + }, + "rc-steps": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-5.0.0.tgz", + "integrity": "sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==", + "requires": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + } + }, + "rc-switch": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz", + "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.0.1" + } + }, + "rc-table": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.26.0.tgz", + "integrity": "sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.22.5", + "shallowequal": "^1.1.0" + } + }, + "rc-tabs": { + "version": "12.5.10", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.5.10.tgz", + "integrity": "sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.0.0", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.16.0" + } + }, + "rc-textarea": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.4.7.tgz", + "integrity": "sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.24.4", + "shallowequal": "^1.1.0" + } + }, + "rc-tooltip": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.2.2.tgz", + "integrity": "sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.3.1", + "rc-trigger": "^5.0.0" + } + }, + "rc-tree": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.3.tgz", + "integrity": "sha512-Oql2S9+ZmT+mfTp5SNo1XM0QvkENjc0mPRFsHWRFSPuKird0OYMZZKmLznUJ+0aGDeFFWN42wiUZJtMFhrLgLw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.4.8" + } + }, + "rc-tree-select": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.5.5.tgz", + "integrity": "sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.16.1" + } + }, + "rc-trigger": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz", + "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.19.2" + } + }, + "rc-upload": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz", + "integrity": "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + } + }, + "rc-util": { + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.29.2.tgz", + "integrity": "sha512-xHT9Dr3RD6tyvCibnH10l3mudC6TJjWNr9UDy3CrOGZqTY354OfdwP87ahKNe0b3A1dsysDldvx0SBuswhlOeA==", + "requires": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "rc-virtual-list": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.4.13.tgz", + "integrity": "sha512-cPOVDmcNM7rH6ANotanMDilW/55XnFPw0Jh/GQYtrzZSy3AmWvCnqVNyNC/pgg3lfVmX2994dlzAhuUrd4jG7w==", + "requires": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.15.0" + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-accessible-dropdown-menu-hook": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-accessible-dropdown-menu-hook/-/react-accessible-dropdown-menu-hook-3.1.0.tgz", + "integrity": "sha512-XOvct2l9Q1V5u29gdGHZhBYh3hUX3+syIwWC/uqBmmzJDttFMZKPug+Ut/oAsXTCeGn3+HcT1iqzLAFRtVrrJg==" + }, + "react-app-polyfill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", + "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", + "requires": { + "core-js": "^3.6.5", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "whatwg-fetch": "^3.4.1" + } + }, + "react-app-rewired": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.1.8.tgz", + "integrity": "sha512-wjXPdKPLscA7mn0I1de1NHrbfWdXz4S1ladaGgHVKdn1hTgKK5N6EdGIJM0KrS6bKnJBj7WuqJroDTsPKKr66Q==", + "dev": true, + "requires": { + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "react-beautiful-dnd": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz", + "integrity": "sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA==", + "requires": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + } + }, + "react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "requires": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "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" + } + }, + "browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "requires": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "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==" + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "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=" + }, + "immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + } + } + }, + "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" + } + } + } + }, + "react-docgen": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.3.tgz", + "integrity": "sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA==", + "requires": { + "@babel/core": "^7.7.5", + "@babel/generator": "^7.12.11", + "@babel/runtime": "^7.7.6", + "ast-types": "^0.14.2", + "commander": "^2.19.0", + "doctrine": "^3.0.0", + "estree-to-babel": "^3.1.0", + "neo-async": "^2.6.1", + "node-dir": "^0.1.10", + "strip-indent": "^3.0.0" + }, + "dependencies": { + "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==" + } + } + }, + "react-docgen-typescript": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", + "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==" + }, + "react-docgen-typescript-plugin": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2.tgz", + "integrity": "sha512-/8OKrPRDTAGDnOkumGvDWixfrNPrRWhEMGLZnJr1NiJtRwdvNRGqGA2J/SeSvWerawqSPxNyXK+EfERCir6mMw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "endent": "^2.0.1", + "find-cache-dir": "^3.3.1", + "flat-cache": "^3.0.4", + "micromatch": "^4.0.2", + "react-docgen-typescript": "^2.2.2", + "tslib": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + } + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-element-to-jsx-string": { + "version": "14.3.4", + "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.4.tgz", + "integrity": "sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg==", + "requires": { + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "17.0.2" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + } + } + }, + "react-error-boundary": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", + "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + }, + "react-fast-compare": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", + "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" + }, + "react-inspector": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-5.1.1.tgz", + "integrity": "sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "is-dom": "^1.0.0", + "prop-types": "^15.0.0" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "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-medium-image-zoom": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/react-medium-image-zoom/-/react-medium-image-zoom-3.1.3.tgz", + "integrity": "sha512-5CoU8whSCz5Xz2xNeGD34dDfZ6jaf/pybdfZh8HNUmA9mbXbLfj0n6bQWfEUwkq9lsNg1sEkyeIJq2tcvZY8bw==" + }, + "react-merge-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-1.1.0.tgz", + "integrity": "sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==", + "dev": true + }, + "react-plotly.js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.5.1.tgz", + "integrity": "sha512-Oya14whSHvPsYXdI0nHOGs1pZhMzV2edV7HAW1xFHD58Y73m/LbG2Encvyz1tztL0vfjph0JNhiwO8cGBJnlhg==", + "requires": { + "prop-types": "^15.7.2" + } + }, + "react-portal": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-4.2.2.tgz", + "integrity": "sha512-vS18idTmevQxyQpnde0Td6ZcUlv+pD8GTyR42n3CHUQq9OHi1C4jDE4ZWEbEsrbrLRhSECYiao58cvocwMtP7Q==", + "requires": { + "prop-types": "^15.5.8" + } + }, + "react-redux": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", + "integrity": "sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA==", + "requires": { + "@babel/runtime": "^7.12.1", + "@types/react-redux": "^7.1.16", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" + }, + "react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "requires": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "requires": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "react-router": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "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-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-router-dom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.1", + "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-scripts": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", + "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", + "requires": { + "@babel/core": "7.12.3", + "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", + "@svgr/webpack": "5.5.0", + "@typescript-eslint/eslint-plugin": "^4.5.0", + "@typescript-eslint/parser": "^4.5.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^26.6.0", + "babel-loader": "8.1.0", + "babel-plugin-named-asset-import": "^0.3.7", + "babel-preset-react-app": "^10.0.0", + "bfj": "^7.0.2", + "camelcase": "^6.1.0", + "case-sensitive-paths-webpack-plugin": "2.3.0", + "css-loader": "4.3.0", + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0", + "eslint": "^7.11.0", + "eslint-config-react-app": "^6.0.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jest": "^24.1.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-testing-library": "^3.9.2", + "eslint-webpack-plugin": "^2.5.2", + "file-loader": "6.1.1", + "fs-extra": "^9.0.1", + "fsevents": "^2.1.3", + "html-webpack-plugin": "4.5.0", + "identity-obj-proxy": "3.0.0", + "jest": "26.6.0", + "jest-circus": "26.6.0", + "jest-resolve": "26.6.0", + "jest-watch-typeahead": "0.6.1", + "mini-css-extract-plugin": "0.11.3", + "optimize-css-assets-webpack-plugin": "5.0.4", + "pnp-webpack-plugin": "1.6.4", + "postcss-flexbugs-fixes": "4.2.1", + "postcss-loader": "3.0.0", + "postcss-normalize": "8.0.1", + "postcss-preset-env": "6.7.0", + "postcss-safe-parser": "5.0.2", + "prompts": "2.4.0", + "react-app-polyfill": "^2.0.0", + "react-dev-utils": "^11.0.3", + "react-refresh": "^0.8.3", + "resolve": "1.18.1", + "resolve-url-loader": "^3.1.2", + "sass-loader": "^10.0.5", + "semver": "7.3.2", + "style-loader": "1.3.0", + "terser-webpack-plugin": "4.2.3", + "ts-pnp": "1.2.0", + "url-loader": "4.1.1", + "webpack": "4.44.2", + "webpack-dev-server": "3.11.1", + "webpack-manifest-plugin": "2.2.0", + "workbox-webpack-plugin": "5.1.4" + }, + "dependencies": { + "sass-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "react-select": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.1.tgz", + "integrity": "sha512-u/brzm3B6vgI+PtxNyE4/18kXgaf6bn5sOAjKhaQ54EItBfW41SRLH1AJC5fefPnGM4JmMcM51t/HAVCi5GrpQ==", + "requires": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "dependencies": { + "@floating-ui/core": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.4.tgz", + "integrity": "sha512-SQOeVbMwb1di+mVWWJLpsUTToKfqVNioXys011beCAhyOIFtS+GQoW4EQSneuxzmQKddExDwQ+X0hLl4lJJaSQ==" + }, + "@floating-ui/dom": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.5.tgz", + "integrity": "sha512-+sAUfpQ3Frz+VCbPCqj+cZzvEESy3fjSeT/pDWkYCWOBXYNNKZfuVsHuv8/JO2zze8+Eb/Q7a6hZVgzS81fLbQ==", + "requires": { + "@floating-ui/core": "^1.2.4" + } + }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + } + } + }, + "react-split": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/react-split/-/react-split-2.0.14.tgz", + "integrity": "sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA==", + "requires": { + "prop-types": "^15.5.7", + "split.js": "^1.6.0" + } + }, + "react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "requires": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "react-virtualized": { + "version": "9.22.3", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz", + "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==", + "requires": { + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + } + }, + "react-virtualized-auto-sizer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.5.tgz", + "integrity": "sha512-kivjYVWX15TX2IUrm8F1jaCEX8EXrpy3DD+u41WGqJ1ZqbljWpiwscV+VxOM1l7sSIM1jwi2LADjhhAJkJ9dxA==" + }, + "react-virtualized-tree": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/react-virtualized-tree/-/react-virtualized-tree-3.4.1.tgz", + "integrity": "sha512-MolDiG9XgmflPPX9uPzf7iSWLqOHDlCZEiyA4FVYjv2pHfu6zV6/SIEFVyHdurWD80IjUuZ3Er12gq2bQQak2Q==", + "requires": { + "classnames": "^2.2.5", + "lodash": "^4.17.4", + "lodash.debounce": "^4.0.8", + "lodash.findindex": "^4.6.0", + "lodash.isequal": "^4.5.0", + "lodash.omit": "^4.5.0", + "material-icons": "^0.1.0", + "react-lifecycles-compat": "^3.0.4", + "reselect": "^3.0.1" + } + }, + "react-window": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", + "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "requires": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.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==", + "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==" + } + } + }, + "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==", + "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==" + } + } + }, + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "readme-badger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/readme-badger/-/readme-badger-0.3.0.tgz", + "integrity": "sha512-+sMOLSs1imZUISZ2Rhz7qqVd77QtpcAPbGeIraFdgJmijb04YtdlPjGNBvDChTNtLbeQ6JNGQy3pOgslWfaP3g==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "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": "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" + } + }, + "redux": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz", + "integrity": "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "refractor": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.5.0.tgz", + "integrity": "sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==", + "requires": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.25.0" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "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.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + }, + "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.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "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.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "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==", + "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.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/regl/-/regl-2.1.0.tgz", + "integrity": "sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==" + }, + "regl-error2d": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz", + "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==", + "requires": { + "array-bounds": "^1.0.1", + "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.1.0", + "update-diff": "^1.1.0" + } + }, + "regl-line2d": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.2.tgz", + "integrity": "sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ==", + "requires": { + "array-bounds": "^1.0.1", + "array-find-index": "^1.0.2", + "array-normalize": "^1.1.4", + "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.1.0" + } + }, + "regl-scatter2d": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.2.8.tgz", + "integrity": "sha512-bqrqJyeHkGBa9mEfuBnRd7FUtdtZ1l+gsM2C5Ugr1U3vJG5K3mdWdVWtOAllZ5FHHyWJV/vgjVvftgFUg6CDig==", + "requires": { + "@plotly/point-cluster": "^3.1.9", + "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", + "to-float32": "^1.1.0", + "update-diff": "^1.1.0" + } + }, + "regl-splom": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz", + "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==", + "requires": { + "array-bounds": "^1.0.1", + "array-range": "^1.0.1", + "color-alpha": "^1.0.4", + "flatten-vertex-data": "^1.0.2", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "raf": "^3.4.1", + "regl-scatter2d": "^3.2.3" + } + }, + "rehype": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.0.tgz", + "integrity": "sha512-gZcttmf9R5IYHb8AlI1rlmWqXS1yX0rSB/S5ZGJs8atfYZy2DobvH3Ic/gSzB+HL/+oOHPtBguw1TprfhxXBgQ==", + "requires": { + "@types/hast": "^2.0.0", + "rehype-parse": "^8.0.0", + "rehype-stringify": "^9.0.0", + "unified": "^10.0.0" + } + }, + "rehype-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.3.tgz", + "integrity": "sha512-RGw0CVt+0S6KdvpE8bbP2Db9WXclQcIX7A0ufM3QFqAhTo/ddJMQrrI2j3cijlRPZlGK8R3pRgC8U5HyV76IDw==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^6.0.0", + "unified": "^10.0.0" + } + }, + "rehype-stringify": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.2.tgz", + "integrity": "sha512-BuVA6lAEYtOpXO2xuHLohAzz8UNoQAxAqYRqh4QEEtU39Co+P1JBZhw6wXA9hMWp+JLcmrxWH8+UKcNSr443Fw==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remark-external-links": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz", + "integrity": "sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "is-absolute-url": "^3.0.0", + "mdast-util-definitions": "^4.0.0", + "space-separated-tokens": "^1.0.0", + "unist-util-visit": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" + }, + "remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "requires": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "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/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "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==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "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-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==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } + } + }, + "remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "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" + }, + "dependencies": { + "ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" + }, + "vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + } + } + }, + "remark-slug": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", + "integrity": "sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==", + "dev": true, + "requires": { + "github-slugger": "^1.0.0", + "mdast-util-to-string": "^1.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "requires": { + "mdast-squeeze-paragraphs": "^4.0.0" + } + }, + "remote-origin-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-1.0.0.tgz", + "integrity": "sha512-xHDM6IBqivpiQ1e4WOuFpM/T6rbzA/WBsu+3WLtgPOhHyjA0nYlijV3NprlTb4FcXlQ5+Q+z174sQ1NnUF5FwA==", + "requires": { + "parse-git-config": "^1.1.1" + } + }, + "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=" + }, + "renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "requires": { + "boolbase": "^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=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + }, + "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": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "optional": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "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 + }, + "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" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "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==" + }, + "require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "reselect": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", + "integrity": "sha512-b/6tFZCmRhtBMa4xGqiiRp9jh9Aqi2A687Lo265cN0/QohJQEBPiQ52f4QB6i0eF3yp3hmLL21LSGBcML2dlxA==" + }, + "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.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "requires": { + "is-core-module": "^2.0.0", + "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==", + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "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==" + }, + "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=" + }, + "resolve-url-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", + "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", + "requires": { + "adjust-sourcemap-loader": "3.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.36", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + } + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.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==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "rich-markdown-editor": { + "version": "11.21.3", + "resolved": "https://registry.npmjs.org/rich-markdown-editor/-/rich-markdown-editor-11.21.3.tgz", + "integrity": "sha512-XqVDfwDiGMVVtb+HUY35FQvfo97ECAe+Pgo1veFiYiL5f9Jfp9zuF6fOK5eze9h8rApBsgD9iVHEsA8/gyv5Jg==", + "requires": { + "copy-to-clipboard": "^3.0.8", + "fuzzy-search": "^3.2.1", + "gemoji": "6.x", + "lodash": "^4.17.11", + "markdown-it": "^12.2.0", + "markdown-it-container": "^3.0.0", + "markdown-it-emoji": "^2.0.0", + "outline-icons": "^1.38.1", + "prosemirror-commands": "^1.1.6", + "prosemirror-dropcursor": "^1.3.3", + "prosemirror-gapcursor": "^1.1.5", + "prosemirror-history": "^1.1.3", + "prosemirror-inputrules": "^1.1.3", + "prosemirror-keymap": "^1.1.4", + "prosemirror-markdown": "^1.5.2", + "prosemirror-model": "^1.13.3", + "prosemirror-schema-list": "^1.1.2", + "prosemirror-state": "^1.3.4", + "prosemirror-tables": "^1.1.1", + "prosemirror-transform": "1.2.5", + "prosemirror-utils": "^0.9.6", + "prosemirror-view": "1.18.1", + "react-medium-image-zoom": "^3.1.3", + "react-portal": "^4.2.1", + "refractor": "^3.3.1", + "resize-observer-polyfill": "^1.5.1", + "slugify": "^1.4.0", + "smooth-scroll-into-view-if-needed": "^1.1.29" + }, + "dependencies": { + "prosemirror-transform": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.2.5.tgz", + "integrity": "sha512-eqeIaxWtUfOnpA1ERrXCuSIMzqIJtL9Qrs5uJMCjY5RMSaH5o4pc390SAjn/IDPeIlw6auh0hCCXs3wRvGnQug==", + "requires": { + "prosemirror-model": "^1.0.0" + } + }, + "prosemirror-view": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.18.1.tgz", + "integrity": "sha512-TZd8byDRfdopLiokBY7T27msCSfWqqRxWs/LnBbdI030F+iI2kS+tO59/XFnpZxMLFKlJgOgGGhM9SzD1Nwdxw==", + "requires": { + "prosemirror-model": "^1.1.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + } + } + }, + "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==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, + "rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "requires": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + } + }, + "rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-terser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", + "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "requires": { + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^4.0.0", + "terser": "^4.6.2" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.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==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + } + } + }, + "rope-sequence": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz", + "integrity": "sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg==" + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "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==", + "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==", + "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==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "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=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "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=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "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" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "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=" + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "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" + } + } + } + }, + "sanitize.css": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", + "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + }, + "sass": { + "version": "1.38.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.38.1.tgz", + "integrity": "sha512-Lj8nPaSYOuRhgqdyShV50fY5jKnvaRmikUNalMPmbH+tKMGgEKVkltI/lP30PEfO2T1t6R9yc2QIBLgOc3uaFw==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.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": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.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": "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" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "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 + }, + "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-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 + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "scoped-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-2.1.0.tgz", + "integrity": "sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==" + }, + "scroll-into-view-if-needed": { + "version": "2.2.29", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz", + "integrity": "sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==", + "requires": { + "compute-scroll-into-view": "^1.0.17" + } + }, + "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" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "^5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-favicon": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", + "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", + "requires": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "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==" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "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==", + "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=", + "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=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "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==", + "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=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "optional": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", + "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "sirv": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", + "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "slugify": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", + "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==" + }, + "smooth-scroll-into-view-if-needed": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/smooth-scroll-into-view-if-needed/-/smooth-scroll-into-view-if-needed-1.1.33.tgz", + "integrity": "sha512-crS8NfAaoPrtVYOCMSAnO2vHRgUp22NiiDgEQ7YiaAy5xe2jmR19Jm+QdL8+97gO8ENd7PUyQIAQojJyIiyRHw==", + "requires": { + "scroll-into-view-if-needed": "^2.2.28" + } + }, + "smpltmpl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/smpltmpl/-/smpltmpl-1.0.2.tgz", + "integrity": "sha512-Hq23NNgeZigOzIiX1dkb6W3gFn2/XQj43KhPxu65IMieG/gIwf/lQb1IudjYv0c/5LwJeS/mPayYzyo+8WJMxQ==", + "requires": { + "babel-code-frame": "^6.26.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==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "sockjs-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + }, + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.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" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "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==" + }, + "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==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "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==", + "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==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-lines": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-2.1.0.tgz", + "integrity": "sha512-8dv+1zKgTpfTkOy8XZLFyWrfxO0NV/bj/3EaQ+hBrBxGv2DwiroljPjU8NlCr+59nLnsVm9WYT7lXKwe4TC6bw==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "split.js": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", + "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "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": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "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.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "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==" + } + } + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + }, + "state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" + }, + "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" + }, + "dependencies": { + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "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" + } + }, + "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" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "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" + } + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "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" + } + }, + "store2": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz", + "integrity": "sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", + "requires": { + "debug": "2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string_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" + } + }, + "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-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.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==" + }, + "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" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.padstart": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.1.4.tgz", + "integrity": "sha512-XqOHj8horGsF+zwxraBvMTkBFM28sS/jHBJajh17JtJKA92qazidiQbLosV4UA18azvLOVKYo/E3g3T9Y5826w==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "stringify-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.2.tgz", + "integrity": "sha512-MTxTVcEkorNtBbNpoFJPEh0kKdM6+QbMjLbaxmvaPMmayOXdr/AIVIIJX7FReUVweRBFJfZepK4A4AKgwuFpMQ==", + "requires": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "dependencies": { + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" + } + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.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==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "requires": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + } + }, + "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==" + }, + "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==", + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" + } + }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, + "styled-components": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.3.tgz", + "integrity": "sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^0.8.8", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "dependencies": { + "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" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, + "supercluster": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.4.tgz", + "integrity": "sha512-GhKkRM1jMR6WUwGPw05fs66pOFWhf59lXq+Q3J3SxPvhNcmgOtLRV6aVQPMRsmXdpaeFJGivt+t7QXUPL3ff4g==", + "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.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "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-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "svg-path-bounds": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz", + "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==", + "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.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", + "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", + "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" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "requires": { + "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" + }, + "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==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "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" + } + } + } + }, + "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==" + }, + "symbol.prototype.description": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz", + "integrity": "sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ==", + "requires": { + "call-bind": "^1.0.2", + "get-symbol-description": "^1.0.0", + "has-symbols": "^1.0.2", + "object.getownpropertydescriptors": "^2.1.2" + } + }, + "synchronous-promise": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.16.tgz", + "integrity": "sha512-qImOD23aDfnIDNqlG1NOehdB9IYsn1V9oByPjKY1nakv2MQYCEMyX033/q+aEtYCpmYK1cv2+NTmlH+ra6GA5A==" + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "telejson": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-6.0.8.tgz", + "integrity": "sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==", + "requires": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.2", + "is-regex": "^1.1.2", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3" + }, + "dependencies": { + "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==" + } + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + }, + "tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "requires": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + } + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "^0.7.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=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "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==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "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" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "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=" + }, + "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" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "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==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "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==" + } + } + }, + "terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "requires": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "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==" + }, + "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" + } + }, + "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" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.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" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "terser": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", + "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "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==" + } + } + } + } + }, + "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==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "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" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "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.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" + }, + "tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, + "tlds": { + "version": "1.221.1", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.221.1.tgz", + "integrity": "sha512-N1Afn/SLeOQRpxMwHBuNFJ3GvGrdtY4XPXKPFcx8he0U9Jg9ZkvTKE1k3jQDtCmlFn44UxjVtouF6PT4rEGd3Q==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "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=" + }, + "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=" + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz", + "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-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==" + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "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" + } + }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "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" + }, + "dependencies": { + "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==" + } + } + }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "dependencies": { + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" + }, + "trough": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz", + "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==" + }, + "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" + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==" + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + }, + "tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "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" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-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==" + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "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=" + }, + "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==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typeface-roboto": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/typeface-roboto/-/typeface-roboto-1.1.13.tgz", + "integrity": "sha512-YXvbd3a1QTREoD+FJoEkl0VQNJoEjewR2H11IjVv4bp6ahuIcw0yyw/3udC4vJkHw3T3cUh85FTg8eWef3pSaw==" + }, + "typescript": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "dev": true + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + }, + "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": "10.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.0.tgz", + "integrity": "sha512-4U3ru/BRXYYhKbwXV6lU6bufLikoAavTwev89H5UxY8enDFaAT2VXmIXYNm6hb5oHPng/EXr77PVyDFcptbk5g==", + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "is-plain-obj": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz", + "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==" + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "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-random": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-random/-/unique-random-1.0.0.tgz", + "integrity": "sha1-zj4iTIJCzTOg53sNcYDXfmti0MQ=" + }, + "unique-random-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-random-array/-/unique-random-array-1.0.0.tgz", + "integrity": "sha1-QrNyHFeTiNi2Z8k8Lb3j1dgakTY=", + "requires": { + "unique-random": "^1.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": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" + }, + "unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + }, + "unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + }, + "unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "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==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz", + "integrity": "sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "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.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "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=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "untildify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", + "integrity": "sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==", + "optional": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "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-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "requires": { + "string-width": "^4.1.0" + } + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "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" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "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" + } + }, + "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==" + }, + "global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "requires": { + "ini": "1.3.7" + } + }, + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + }, + "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==", + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "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" + } + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "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==", + "requires": { + "semver": "^6.3.0" + } + }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.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==", + "requires": { + "string-width": "^4.0.0" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + } + } + }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "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=", + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + } + } + }, + "url-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-5.0.0.tgz", + "integrity": "sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g==", + "requires": { + "ip-regex": "^4.1.0", + "tlds": "^1.203.0" + }, + "dependencies": { + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==" + }, + "use-memo-one": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.2.tgz", + "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==" + }, + "use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "requires": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==" + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "requires": { + "os-homedir": "^1.0.0" + } + }, + "user-meta": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/user-meta/-/user-meta-1.0.0.tgz", + "integrity": "sha512-Q/opMgFhVbBkdlTs44UKzV7L5Uj2zrJ4MVPXTTzJmrU1bHb2cX6wJzBIqEf1gROTzZIH8u39WmHsa5EvfnMPrw==", + "requires": { + "rc": "^1.2.1" + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "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=" + }, + "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.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "devOptional": true + }, + "uuid-browser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid-browser/-/uuid-browser-3.1.0.tgz", + "integrity": "sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "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==" + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "requires": { + "builtins": "^1.0.3" + } + }, + "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=" + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" + }, + "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": "5.2.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.2.0.tgz", + "integrity": "sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + } + } + }, + "vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "requires": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + } + }, + "vfile-message": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz", + "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "requires": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "vue-eslint-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz", + "integrity": "sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.0.1", + "lodash": "^4.17.15" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + } + } + }, + "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==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-keyname": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz", + "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==" + }, + "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==", + "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=", + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "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==", + "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=", + "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==", + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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=", + "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==", + "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=", + "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=", + "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==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "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=", + "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=", + "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=", + "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=", + "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=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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==", + "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=", + "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==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" + }, + "web-vitals": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", + "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" + }, + "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==" + }, + "webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "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.3.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.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "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" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "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" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.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=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "webpack-bundle-analyzer": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz", + "integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==", + "dev": true, + "requires": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^6.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "requires": { + "duplexer": "^0.1.2" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "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": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + } + } + }, + "webpack-dev-server": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", + "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", + "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.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "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==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "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=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "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==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "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==" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-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=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "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=" + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "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==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-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==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "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==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "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==", + "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" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-dynamic-public-path": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/webpack-dynamic-public-path/-/webpack-dynamic-public-path-1.0.8.tgz", + "integrity": "sha512-AF6onorpvmiC+I/dQ19SOi+oN66oEy9h4deam7gPs1Qa1mOQ9i7IRsOahaukohKAciys7NfX+YFboRn4rmpuKw==", + "dev": true + }, + "webpack-filter-warnings-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz", + "integrity": "sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==" + }, + "webpack-hot-middleware": { + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.3.tgz", + "integrity": "sha512-IK/0WAHs7MTu1tzLTjio73LjS3Ov+VvBKQmE8WPlJutgG5zT6Urgq/BbAdRrHTRpyzK0dvAvFh1Qg98akxgZpA==", + "requires": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "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==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "webpack-manifest-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "requires": { + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "webpack-virtual-modules": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz", + "integrity": "sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==", + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "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==" + }, + "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==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "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==" + }, + "whatwg-url": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz", + "integrity": "sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "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=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "requires": { + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=", + "requires": { + "ansi-regex": "^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": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "workbox-background-sync": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", + "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-broadcast-update": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", + "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-build": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", + "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", + "requires": { + "@babel/core": "^7.8.4", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@hapi/joi": "^15.1.0", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.1", + "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.6", + "lodash.template": "^4.5.0", + "pretty-bytes": "^5.3.0", + "rollup": "^1.31.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-terser": "^5.3.1", + "source-map": "^0.7.3", + "source-map-url": "^0.4.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "tempy": "^0.3.0", + "upath": "^1.2.0", + "workbox-background-sync": "^5.1.4", + "workbox-broadcast-update": "^5.1.4", + "workbox-cacheable-response": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-expiration": "^5.1.4", + "workbox-google-analytics": "^5.1.4", + "workbox-navigation-preload": "^5.1.4", + "workbox-precaching": "^5.1.4", + "workbox-range-requests": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4", + "workbox-streams": "^5.1.4", + "workbox-sw": "^5.1.4", + "workbox-window": "^5.1.4" + }, + "dependencies": { + "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==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "workbox-cacheable-response": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", + "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-core": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", + "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + }, + "workbox-expiration": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", + "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-google-analytics": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", + "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "requires": { + "workbox-background-sync": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4" + } + }, + "workbox-navigation-preload": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", + "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-precaching": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", + "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-range-requests": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", + "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-routing": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", + "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-strategies": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", + "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "requires": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "workbox-streams": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", + "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "requires": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "workbox-sw": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", + "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" + }, + "workbox-webpack-plugin": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", + "requires": { + "@babel/runtime": "^7.5.5", + "fast-json-stable-stringify": "^2.0.0", + "source-map-url": "^0.4.0", + "upath": "^1.1.2", + "webpack-sources": "^1.3.0", + "workbox-build": "^5.1.4" + } + }, + "workbox-window": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", + "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "worker-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", + "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", + "dev": true, + "requires": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "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" + } + } + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "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": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", + "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==" + }, + "x-default-browser": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/x-default-browser/-/x-default-browser-0.4.0.tgz", + "integrity": "sha512-7LKo7RtWfoFN/rHx1UELv/2zHGMx8MkZKDq1xENmOCTkfIqZJ0zZ26NEJX8czhnPXVcqS0ARjjfJB+eJ0/5Cvw==", + "requires": { + "default-browser-id": "^1.0.4" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, + "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==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "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.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "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.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "yup": { + "version": "0.32.9", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.9.tgz", + "integrity": "sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==", + "requires": { + "@babel/runtime": "^7.10.5", + "@types/lodash": "^4.14.165", + "lodash": "^4.17.20", + "lodash-es": "^4.17.15", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + } + }, + "zustand": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.1.1.tgz", + "integrity": "sha512-h4F3WMqsZgvvaE0n3lThx4MM81Ls9xebjvrABNzf5+jb3/03YjNTSgZXeyrvXDArMeV9untvWXRw1tY+ntPYbA==", + "requires": { + "use-sync-external-store": "1.2.0" + } + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + } + } +} diff --git a/src/package.json b/src/package.json new file mode 100644 index 00000000..f12efe1a --- /dev/null +++ b/src/package.json @@ -0,0 +1,183 @@ +{ + "name": "ui_v2", + "version": "3.19.3", + "private": true, + "dependencies": { + "@aksel/structjs": "^1.0.0", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^4.0.0-alpha.60", + "@monaco-editor/react": "4.4.4", + "@radix-ui/primitive": "^1.0.0", + "@radix-ui/react-checkbox": "^1.0.1", + "@radix-ui/react-dialog": "^1.0.2", + "@radix-ui/react-popover": "^1.0.2", + "@radix-ui/react-radio-group": "^1.1.0", + "@radix-ui/react-separator": "^1.0.1", + "@radix-ui/react-slider": "^1.1.0", + "@radix-ui/react-slot": "^1.0.1", + "@radix-ui/react-switch": "^1.0.1", + "@radix-ui/react-toast": "^1.1.2", + "@radix-ui/react-tooltip": "^1.0.3", + "@stitches/react": "^1.2.8", + "@storybook/react": "^6.5.12", + "@tabler/icons-react": "^2.2.0", + "@uiw/react-textarea-code-editor": "^1.4.14", + "antd": "^4.23.6", + "bs58check": "^2.1.2", + "classnames": "^2.3.1", + "comlink": "^4.3.1", + "d3": "^7.0.0", + "dot-object": "^2.1.4", + "file-saver": "^2.0.5", + "formik": "^2.2.9", + "highcharts": "^9.3.1", + "highcharts-react-official": "^3.1.0", + "history": "^5.3.0", + "humanize-duration": "^3.27.0", + "immer": "^9.0.16", + "js-cookie": "^3.0.5", + "lodash-es": "^4.17.21", + "marked": "^4.1.1", + "material-ui-audio-player": "^1.7.1", + "md5": "^2.3.0", + "memoize-one": "^5.2.1", + "moment": "^2.29.4", + "monaco-editor": "^0.33.0", + "plotly.js": "^2.7.0", + "prop-types": "^15.7.2", + "prosemirror-tables": "^1.1.1", + "react": "^17.0.2", + "react-accessible-dropdown-menu-hook": "^3.1.0", + "react-beautiful-dnd": "^13.1.0", + "react-dom": "^17.0.2", + "react-plotly.js": "^2.5.1", + "react-router-dom": "^5.3.0", + "react-scripts": "4.0.3", + "react-select": "^5.5.4", + "react-split": "^2.0.14", + "react-virtualized": "^9.22.3", + "react-virtualized-auto-sizer": "^1.0.5", + "react-virtualized-tree": "^3.4.1", + "react-window": "^1.8.6", + "rich-markdown-editor": "^11.21.3", + "styled-components": "^5.3.3", + "typeface-roboto": "^1.1.13", + "web-vitals": "^1.0.1", + "yup": "^0.32.9", + "zustand": "^4.1.1" + }, + "scripts": { + "start": "react-app-rewired --max_old_space_size=4096 start", + "build": "react-app-rewired --max_old_space_size=4096 build && gzipper c -i js,css,html ./build && node tasks/index-html-template-generator.js", + "test": "react-app-rewired test ", + "test:coverage": "react-app-rewired test --collectCoverage", + "test:watch": "react-app-rewired test --watchAll", + "eject": "react-scripts eject", + "lint": "eslint src/. --ext .js,.jsx,.ts,.tsx", + "format:fix": "eslint src/. --ext .js,.jsx,.ts,.tsx --quiet --fix", + "preinstall": "rimraf public/vs", + "postinstall": "cp -R node_modules/monaco-editor/min/vs public/vs", + "analyze-bundles": "node tasks/bundle-analyzer.js", + "crc-kit": "func() { node tasks/cli/index.js create-component --name=\"$1\" --path=./src/components/kit/ --lint; }; func", + "crc": "func() { node tasks/cli/index.js create-component --name=\"$1\" --path=./src/components/ --lint; }; func", + "storybook": "start-storybook -p 6006 -s public", + "build-storybook": "build-storybook -s public" + }, + "homepage": "/static-files/", + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "src/**/*.{js,jsx,ts,tsx,json,css,scss,md}": [ + "prettier --write" + ] + }, + "devDependencies": { + "@storybook/addon-actions": "^6.5.12", + "@storybook/addon-essentials": "^6.5.12", + "@storybook/addon-interactions": "^6.5.12", + "@storybook/addon-links": "^6.5.12", + "@storybook/builder-webpack4": "^6.5.12", + "@storybook/manager-webpack4": "^6.5.12", + "@storybook/node-logger": "^6.5.12", + "@storybook/preset-create-react-app": "^3.2.0", + "@storybook/testing-library": "^0.0.13", + "@testing-library/jest-dom": "^5.11.4", + "@testing-library/react": "^11.1.0", + "@testing-library/react-hooks": "^7.0.2", + "@testing-library/user-event": "^12.1.10", + "@types/bs58check": "^2.1.0", + "@types/d3": "^7.0.0", + "@types/dot-object": "^2.1.2", + "@types/file-saver": "^2.0.3", + "@types/history": "^5.0.0", + "@types/humanize-duration": "^3.25.1", + "@types/jest": "^26.0.15", + "@types/js-cookie": "^3.0.6", + "@types/lodash-es": "^4.17.4", + "@types/marked": "^4.0.7", + "@types/md5": "^2.3.1", + "@types/node": "^12.0.0", + "@types/node-sass": "^4.11.2", + "@types/react": "^17.0.0", + "@types/react-beautiful-dnd": "^13.1.1", + "@types/react-dom": "^17.0.0", + "@types/react-plotly.js": "^2.5.0", + "@types/react-router-dom": "^5.1.7", + "@types/react-virtualized-auto-sizer": "^1.0.1", + "@types/react-window": "^1.8.4", + "@types/storybook__react": "^5.2.1", + "@types/styled-components": "^5.1.15", + "@typescript-eslint/eslint-plugin": "^4.28.0", + "@typescript-eslint/parser": "^4.28.0", + "comlink-loader": "^2.0.0", + "eslint": "^7.29.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-react": "^7.24.0", + "eslint-plugin-react-hooks": "^4.2.0", + "gzipper": "^5.0.1", + "husky": "^6.0.0", + "jest-canvas-mock": "^2.3.1", + "jss-plugin-template": "^10.7.1", + "lint-staged": "^11.0.0", + "node-sass": "^6.0.1", + "prettier": "2.3.1", + "prettier-eslint": "^12.0.0", + "progress-bar-webpack-plugin": "^2.1.0", + "react-app-rewired": "^2.1.8", + "sass": "^1.38.1", + "typescript": "^4.3.4", + "webpack-bundle-analyzer": "^4.4.2", + "webpack-dynamic-public-path": "^1.0.8", + "yargs": "^17.2.1" + }, + "eslintConfig": { + "overrides": [ + { + "files": [ + "**/*.stories.*" + ], + "rules": { + "import/no-anonymous-default-export": "off" + } + } + ] + } +} diff --git a/src/public/assets/icomoon/fonts/icomoon.eot b/src/public/assets/icomoon/fonts/icomoon.eot new file mode 100644 index 00000000..92170283 Binary files /dev/null and b/src/public/assets/icomoon/fonts/icomoon.eot differ diff --git a/src/public/assets/icomoon/fonts/icomoon.svg b/src/public/assets/icomoon/fonts/icomoon.svg new file mode 100644 index 00000000..5b196f09 --- /dev/null +++ b/src/public/assets/icomoon/fonts/icomoon.svg @@ -0,0 +1,150 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/public/assets/icomoon/fonts/icomoon.ttf b/src/public/assets/icomoon/fonts/icomoon.ttf new file mode 100644 index 00000000..b4871d49 Binary files /dev/null and b/src/public/assets/icomoon/fonts/icomoon.ttf differ diff --git a/src/public/assets/icomoon/fonts/icomoon.woff b/src/public/assets/icomoon/fonts/icomoon.woff new file mode 100644 index 00000000..fcaa7e7a Binary files /dev/null and b/src/public/assets/icomoon/fonts/icomoon.woff differ diff --git a/src/public/assets/icomoon/icomoonIcons.css b/src/public/assets/icomoon/icomoonIcons.css new file mode 100644 index 00000000..f538cd16 --- /dev/null +++ b/src/public/assets/icomoon/icomoonIcons.css @@ -0,0 +1,447 @@ +@font-face { + font-family: 'icomoon'; + src: url('./fonts/icomoon.eot?30x89n'); + src: url('./fonts/icomoon.eot?30x89n#iefix') format('embedded-opentype'), + url('./fonts/icomoon.ttf?30x89n') format('truetype'), + url('./fonts/icomoon.woff?30x89n') format('woff'), + url('./fonts/icomoon.svg?30x89n#icomoon') format('svg'); + font-weight: normal; + font-style: normal; + font-display: block; +} + +[class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'icomoon' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-metric-value:before { + content: "\e987"; +} +.icon-audios:before { + content: "\e98b"; +} +.icon-chart-legends:before { + content: "\e98a"; +} +.icon-dashboard:before { + content: "\e989"; +} +.icon-distributions:before { + content: "\e988"; +} +.icon-pin-to-top:before { + content: "\e984"; +} +.icon-pin-to-bottom:before { + content: "\e985"; +} +.icon-flexible:before { + content: "\e986"; +} +.icon-arrow-left-contained:before { + content: "\e980"; +} +.icon-arrow-up-contained:before { + content: "\e981"; +} +.icon-arrow-right-contained:before { + content: "\e982"; +} +.icon-arrow-down-contained:before { + content: "\e983"; +} +.icon-figures:before { + content: "\e97e"; +} +.icon-box-settings:before { + content: "\e97d"; +} +.icon-full-screen:before { + content: "\e97b"; +} +.icon-new-tab:before { + content: "\e97c"; +} +.icon-compare:before { + content: "\e97a"; +} +.icon-axes-props:before { + content: "\e979"; +} +.icon-info-circle-outline:before { + content: "\e978"; +} +.icon-update-time:before { + content: "\e977"; +} +.icon-minus:before { + content: "\e976"; +} +.icon-color-scale-on:before { + content: "\e973"; +} +.icon-color-scale-off:before { + content: "\e974"; +} +.icon-avatar:before { + content: "\e972"; +} +.icon-branch:before { + content: "\e975"; +} +.icon-circle-question:before { + content: "\e96c"; +} +.icon-hide-system-metrics:before { + content: "\e96a"; +} +.icon-show-system-metrics:before { + content: "\e96b"; +} +.icon-images-stacking:before { + content: "\e969"; +} +.icon-case-sensitive:before { + content: "\e966"; +} +.icon-word-match:before { + content: "\e967"; +} +.icon-regex:before { + content: "\e968"; +} +.icon-archive:before { + content: "\e94f"; +} +.icon-unarchive:before { + content: "\e965"; +} +.icon-partially-selected:before { + content: "\e964"; +} +.icon-trendline:before { + content: "\e95f"; +} +.icon-slack:before { + content: "\e960"; +} +.icon-success-icon:before { + content: "\e961"; +} +.icon-circle-info:before { + content: "\e94e"; +} +.icon-warning-outline:before { + content: "\e962"; +} +.icon-warning-contained:before { + content: "\e95e"; +} +.icon-voice-on:before { + content: "\e95a"; +} +.icon-voice-off:before { + content: "\e95b"; +} +.icon-pause:before { + content: "\e95c"; +} +.icon-play:before { + content: "\e95d"; +} +.icon-image-properties:before { + content: "\e959"; +} +.icon-y-axis:before { + content: "\e957"; +} +.icon-image-group:before { + content: "\e958"; +} +.icon-group-column:before { + content: "\e97f"; +} +.icon-scatterplot:before { + content: "\e955"; +} +.icon-image-explorer:before { + content: "\e956"; +} +.icon-full-docs:before { + content: "\e952"; +} +.icon-live-demo:before { + content: "\e953"; +} +.icon-co:before { + content: "\e954"; +} +.icon-sort-arrow-down:before { + content: "\e91b"; +} +.icon-sort-arrow-up:before { + content: "\e951"; +} +.icon-images:before { + content: "\e950"; +} +.icon-link:before { + content: "\e93e"; +} +.icon-close-rectangle:before { + content: "\e900"; +} +.icon-close:before { + content: "\e901"; +} +.icon-close-circle:before { + content: "\e902"; +} +.icon-eye-fill-show:before { + content: "\e903"; +} +.icon-eye-outline-hide:before { + content: "\e904"; +} +.icon-eye-show-outline:before { + content: "\e905"; +} +.icon-eye-fill-hide:before { + content: "\e906"; +} +.icon-row-height-down:before { + content: "\e907"; +} +.icon-reset-width-outside:before { + content: "\e908"; +} +.icon-reset-width-inside:before { + content: "\e909"; +} +.icon-row-height-up:before { + content: "\e90a"; +} +.icon-pin-right:before { + content: "\e90b"; +} +.icon-pin-left:before { + content: "\e90c"; +} +.icon-pin:before { + content: "\e90d"; +} +.icon-expand-horizontal:before { + content: "\e90e"; +} +.icon-expand-vertical:before { + content: "\e90f"; +} +.icon-arrow-up:before { + content: "\e910"; +} +.icon-arrow-left:before { + content: "\e911"; +} +.icon-arrow-down:before { + content: "\e912"; +} +.icon-arrow-right:before { + content: "\e913"; +} +.icon-manage-column:before { + content: "\e914"; +} +.icon-long-arrow-right:before { + content: "\e915"; +} +.icon-long-arrow-left:before { + content: "\e916"; +} +.icon-cursor:before { + content: "\e917"; +} +.icon-delete:before { + content: "\e918"; +} +.icon-sort-inside:before { + content: "\e919"; +} +.icon-sort-outside:before { + content: "\e91a"; +} +.icon-metrics:before { + content: "\e91c"; +} +.icon-tags:before { + content: "\e91d"; +} +.icon-bookmarks:before { + content: "\e91e"; +} +.icon-runs:before { + content: "\e91f"; +} +.icon-back-left:before { + content: "\e920"; +} +.icon-back-down:before { + content: "\e921"; +} +.icon-back-up:before { + content: "\e922"; +} +.icon-back-right:before { + content: "\e923"; +} +.icon-back-up-right:before { + content: "\e924"; +} +.icon-back-up-left:before { + content: "\e925"; +} +.icon-back-down-left:before { + content: "\e926"; +} +.icon-back-down-right:before { + content: "\e927"; +} +.icon-more-horizontal:before { + content: "\e928"; +} +.icon-more-vertical:before { + content: "\e929"; +} +.icon-drag:before { + content: "\e92a"; +} +.icon-move-to-left:before { + content: "\e92b"; +} +.icon-move-to-right:before { + content: "\e92c"; +} +.icon-reset:before { + content: "\e92d"; +} +.icon-line-style:before { + content: "\e92e"; +} +.icon-chart-group:before { + content: "\e92f"; +} +.icon-coloring:before { + content: "\e930"; +} +.icon-zoom-in:before { + content: "\e931"; +} +.icon-ignore-outliers:before { + content: "\e932"; +} +.icon-smoothing:before { + content: "\e933"; +} +.icon-highlight-mode:before { + content: "\e934"; +} +.icon-axes-scale:before { + content: "\e935"; +} +.icon-x-axis:before { + content: "\e936"; +} +.icon-indicator:before { + content: "\e937"; +} +.icon-aggregation:before { + content: "\e938"; +} +.icon-zoom-out:before { + content: "\e939"; +} +.icon-collapse-inside:before { + content: "\e93a"; +} +.icon-collapse-outside:before { + content: "\e93b"; +} +.icon-arrow-bidirectional-close:before { + content: "\e93c"; +} +.icon-arrow-bidirectional-open:before { + content: "\e93d"; +} +.icon-row-height:before { + content: "\e93f"; +} +.icon-copy:before { + content: "\e941"; +} +.icon-menu:before { + content: "\e942"; +} +.icon-download:before { + content: "\e943"; +} +.icon-upload:before { + content: "\e944"; +} +.icon-edit:before { + content: "\e945"; +} +.icon-search-info:before { + content: "\e946"; +} +.icon-search:before { + content: "\e947"; +} +.icon-table-resize-maximize:before { + content: "\e948"; +} +.icon-table-resize-hide:before { + content: "\e949"; +} +.icon-table-resize-resizable:before { + content: "\e94a"; +} +.icon-plus:before { + content: "\e94b"; +} +.icon-circle-with-dot:before { + content: "\e94c"; +} +.icon-check-rectangle:before { + content: "\e94d"; +} +.icon-check:before { + content: "\e963"; +} +.icon-params:before { + content: "\e940"; +} +.icon-time:before { + content: "\e96e"; +} +.icon-duration:before { + content: "\e96f"; +} +.icon-hash:before { + content: "\e970"; +} +.icon-calendar:before { + content: "\e971"; +} +.icon-text:before { + content: "\e96d"; +} diff --git a/src/public/assets/icomoon/selection.json b/src/public/assets/icomoon/selection.json new file mode 100644 index 00000000..c40afeb7 --- /dev/null +++ b/src/public/assets/icomoon/selection.json @@ -0,0 +1 @@ +{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M906.631 942.972h-789.264c-15.613 0-30.149-3.23-44.685-9.152s-26.919-14.536-37.687-25.303-19.382-23.688-25.303-37.687-9.152-29.072-9.152-44.685v-251.423c0-64.067 52.223-116.829 116.829-116.829h789.803c64.606 0 116.829 52.223 116.829 116.829v251.423c0 64.606-52.223 116.829-116.829 116.829zM117.368 566.107c-4.845 0-9.152 4.307-9.152 9.152l2.691 257.346 6.461 2.691h789.803c4.845 0 9.152-4.307 9.152-9.152v-251.423c0-4.845-3.769-9.152-9.152-9.152h-789.803zM502.847 404.593h-412.937c-23.688 0-46.839-9.691-63.529-26.381s-26.381-39.84-26.381-63.529v-143.747c0-49.53 40.378-89.909 89.909-89.909h412.937c49.53 0 89.909 40.378 89.909 89.909v143.747c0 23.688-9.691 46.839-26.381 63.529s-39.84 26.381-63.529 26.381zM108.215 296.917h376.866v-107.675h-376.866v107.675zM502.847 189.241v0 0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["metric-value"]},"attrs":[{}],"properties":{"order":613,"id":139,"name":"metric-value","prevSize":32,"code":59783},"setIdx":0,"setId":1,"iconIdx":0},{"icon":{"paths":["M662.872 425.894c0-32.044-25.977-58.024-58.024-58.024s-58.024 25.977-58.024 58.024v0 172.22c0 32.044 25.977 58.024 58.024 58.024s58.024-25.977 58.024-58.024v0zM848.553 180.468c0-32.044-25.977-58.024-58.024-58.024s-58.024 25.977-58.024 58.024v663.065c0 32.044 25.977 58.024 58.024 58.024s58.024-25.977 58.024-58.024v0zM1013.76 474.482c0-32.044-25.977-58.024-58.024-58.024s-58.024 25.977-58.024 58.024v75.047c0 32.044 25.977 58.024 58.024 58.024s58.024-25.977 58.024-58.024v0zM477.172 333.688c0-32.044-25.977-58.024-58.024-58.024s-58.024 25.977-58.024 58.024v0 356.627c0 32.044 25.977 58.024 58.024 58.024s58.024-25.977 58.024-58.024v0zM291.493 92.402c0-32.044-25.977-58.024-58.024-58.024s-58.024 25.977-58.024 58.024v839.595c0 32.044 25.977 58.024 58.024 58.024s58.024-25.977 58.024-58.024v0zM105.808 400.069c0-32.044-25.977-58.024-58.024-58.024s-58.024 25.977-58.024 58.024v0 223.872c0 32.044 25.977 58.024 58.024 58.024s58.024-25.977 58.024-58.024v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["audios"],"grid":0},"attrs":[],"properties":{"order":606,"id":0,"name":"audios","prevSize":32,"code":59787},"setIdx":0,"setId":1,"iconIdx":1},{"icon":{"paths":["M117.753 36.96c0-0.046 0-0.104 0-0.164 0-28.393-23.013-51.425-51.425-51.425v0c-7.296 0.677-13.985 2.081-20.39 4.129l0.673-0.185c-18.782 7.945-31.713 26.209-31.713 47.491 0 0.058 0 0.119 0 0.178v-0.014 783.867c0.006 104.125 84.416 188.532 188.54 188.535h783.757c28.389 0 51.425-23.012 51.425-51.425s-23.012-51.425-51.425-51.425h-783.757c-0.001 0-0.004 0-0.006 0-47.329 0-85.696-38.369-85.696-85.696 0-0.001 0-0.004 0-0.004v0zM980.124-14.624h-526.624c-32.289 0.034-58.465 26.209-58.524 58.519v409.607c0.034 32.289 26.209 58.465 58.519 58.524h526.624c32.296-0.033 58.473-26.209 58.524-58.519v-409.605c-0.033-32.296-26.209-58.473-58.519-58.524h-0.004zM453.476 43.876h526.624v409.601h-526.624v-409.601h-0.057zM528.932 570.524h96.665l-103.009 223.2c-6.672 14.153-20.257 24.048-36.302 25.371l-0.161 0.016c-0.897 0.064-1.953 0.097-2.998 0.097-15.27 0-28.769-7.67-36.824-19.371l-0.097-0.161-80.516-120.737-80.516 120.737c-7.954 12.075-21.449 19.937-36.77 19.937-24.228 0-43.878-19.648-43.878-43.878 0-9.249 2.849-17.825 7.733-24.887l-0.097 0.156 117.025-175.539c8.41-11.169 21.619-18.297 36.513-18.297s28.12 7.137 36.434 18.185l0.094 0.112 73.546 110.293zM839.812 570.524h90.46l-53.857 215.431c-4.591 17.897-19.745 31.243-38.276 33.064l-0.178 0.021c-1.091 0.097-2.352 0.158-3.634 0.158-17.692 0-32.967-10.274-40.189-25.188l-0.112-0.27-103.010-223.2h96.673l33.837 73.313zM570.524 102.399v0c32.314 0 58.524 26.209 58.524 58.524v0 0c0 32.314-26.209 58.524-58.524 58.524v0 0c-32.314 0-58.524-26.209-58.524-58.524v0 0c0-32.314 26.209-58.524 58.524-58.524v0zM746.063 102.399h117.025c32.314 0 58.524 26.209 58.524 58.524v0 0c0 32.314-26.209 58.524-58.524 58.524v0h-117.025c-32.314 0-58.524-26.209-58.524-58.524v0 0c0-32.314 26.209-58.524 58.524-58.524v0zM570.524 277.937v0c32.314 0 58.524 26.209 58.524 58.524v0 0c0 32.314-26.209 58.524-58.524 58.524v0 0c-32.314 0-58.524-26.209-58.524-58.524v0 0c0-32.314 26.209-58.524 58.524-58.524v0zM746.063 277.937h117.025c32.314 0 58.524 26.209 58.524 58.524v0 0c0 32.314-26.209 58.524-58.524 58.524v0h-117.025c-32.314 0-58.524-26.209-58.524-58.524v0 0c0-32.314 26.209-58.524 58.524-58.524v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["chart-legends"],"grid":0},"attrs":[],"properties":{"order":605,"id":1,"name":"chart-legends","prevSize":32,"code":59786},"setIdx":0,"setId":1,"iconIdx":2},{"icon":{"paths":["M929.246 986.178h-834.371c-52.342-0.057-94.758-42.472-94.815-94.81v-758.521c0.062-52.341 42.474-94.753 94.808-94.818h834.377c52.342 0.057 94.76 42.474 94.815 94.811v758.521c-0.050 52.344-42.471 94.764-94.81 94.815h-0.005zM113.838 872.399h796.444v-720.593h-796.444zM644.801 265.585h151.704c10.472 0 18.963 8.489 18.963 18.963 0 0 0 0 0 0v0 455.111c0 0 0 0 0 0 0 10.472-8.489 18.963-18.963 18.963h-151.704c-10.472 0-18.963-8.489-18.963-18.963 0 0 0 0 0 0v0-455.111c0 0 0 0 0 0 0-10.472 8.489-18.963 18.963-18.963v0zM549.986 663.806v75.851c0 10.472-8.491 18.963-18.963 18.963v0h-303.405c-10.472 0-18.963-8.489-18.963-18.963 0 0 0 0 0 0v0-75.851c0-10.472 8.489-18.963 18.963-18.963v0h303.405c0 0 0 0 0 0 10.472 0 18.963 8.489 18.963 18.963v0zM549.986 474.177v75.851c0 10.472-8.489 18.963-18.963 18.963 0 0 0 0 0 0h-303.405c-10.472 0-18.963-8.489-18.963-18.963v0-75.851c0-10.472 8.489-18.963 18.963-18.963v0h303.405c0 0 0 0 0.002 0 10.472 0 18.963 8.489 18.963 18.963v0zM549.986 284.548v75.851c0 10.472-8.491 18.963-18.963 18.963v0h-303.405c-10.472 0-18.963-8.489-18.963-18.963 0 0 0 0 0 0v0-75.851c0 0 0 0 0 0 0-10.472 8.489-18.963 18.963-18.963h303.405c0 0 0 0 0 0 10.472 0 18.963 8.491 18.963 18.963v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["dashboard"],"grid":0},"attrs":[],"properties":{"order":602,"id":2,"name":"dashboard","prevSize":32,"code":59785},"setIdx":0,"setId":1,"iconIdx":3},{"icon":{"paths":["M776.541 700.114c0-21.644 17.546-39.19 39.19-39.19v0h39.19c21.644 0 39.19 17.546 39.19 39.19v0 195.953c0 21.644-17.546 39.19-39.19 39.19v0h-39.19c-21.644 0-39.19-17.546-39.19-39.19v0zM962.69 964.652h-901.382c-16.233 0-29.392 13.159-29.392 29.392s13.159 29.392 29.392 29.392v0h901.382c16.233 0 29.392-13.159 29.392-29.392s-13.159-29.392-29.392-29.392v0zM972.929 598.579l-49.080-50.77c2.165-7.176 3.468-15.435 3.592-23.982l0.001-0.068c-0.069-50.845-41.275-92.044-92.115-92.1h-0.006c-7.982 0.098-15.663 1.208-22.976 3.206l0.639-0.149-109.028-109.028c4.992-10.9 7.913-23.642 7.937-37.063v-0.008c0-0.073 0-0.16 0-0.247 0-50.872-41.24-92.111-92.111-92.111s-92.111 41.24-92.111 92.111c0 6.445 0.661 12.736 1.922 18.808l-0.103-0.597-86.925 55.316c-11.23-5.39-24.408-8.562-38.319-8.618h-0.019c-2.326 0-4.51 0.517-6.791 0.686l-134.295-207.554c11.224-15.103 17.968-34.117 17.968-54.707 0-50.958-41.309-92.268-92.268-92.268s-92.268 41.309-92.268 92.268c0 16.713 4.443 32.386 12.213 45.907l-0.238-0.449-59.172 71.41c-4.871 5.754-7.831 13.26-7.831 21.458 0 18.398 14.915 33.312 33.312 33.312 10.387 0 19.664-4.753 25.773-12.204l0.047-0.059 59.158-71.395c8.575 3.097 18.472 4.948 28.783 5.080h0.061c6.615-0.001 13.064-0.7 19.282-2.027l-0.603 0.107 129.519 200.167c-15.282 16.389-24.664 38.454-24.664 62.712 0 50.842 41.217 92.059 92.059 92.059s92.059-41.217 92.059-92.059c0-12.524-2.501-24.464-7.031-35.349l0.225 0.609 75.972-48.347c14.938 11.287 33.822 18.078 54.291 18.078 13.422 0 26.163-2.92 37.621-8.159l-0.565 0.231 101.217 101.215c-9.35 14.136-14.917 31.485-14.917 50.135 0 50.648 41.058 91.706 91.706 91.706 18.019 0 34.822-5.197 48.997-14.172l-0.376 0.222 41.556 42.99c6.065 6.269 14.555 10.16 23.953 10.16 18.399 0 33.314-14.915 33.314-33.314 0-9.001-3.57-17.167-9.37-23.162l0.008 0.010zM238.436 108.238c-6.448 21.744-26.248 37.337-49.692 37.337-25.683 0-46.997-18.716-51.043-43.253l-0.041-0.3c-0.856-2.694-1.522-5.868-1.875-9.136l-0.019-0.222c0-29.222 23.69-52.911 52.911-52.911s52.911 23.69 52.911 52.911v0c-0.259 5.659-1.393 10.977-3.271 15.927l0.117-0.353zM404.226 498.29c-29.211-0.029-52.882-23.701-52.911-52.909v-0.003c0.267-10.070 3.392-19.358 8.588-27.148l-0.117 0.187c9.009-15.612 25.616-25.951 44.636-25.951 24.591 0 45.145 17.28 50.182 40.36l0.062 0.339c1.243 3.578 2.12 7.731 2.459 12.035l0.011 0.176c-0.029 29.211-23.701 52.882-52.907 52.911h-0.003zM671.726 293.454c-2.349 25.018-22.103 44.762-46.918 47.081l-0.207 0.015c-1.259 0.343-2.892 0.685-4.552 0.941l-0.274 0.034c-5.945-0.077-11.618-1.135-16.899-3.020l0.365 0.113c-21.248-7.104-36.308-26.784-36.397-49.995v-0.011c0.096-2.277 0.321-4.414 0.671-6.51l-0.043 0.304c3.154-26.421 25.427-46.707 52.44-46.707 29.155 0 52.792 23.636 52.792 52.792 0 0.043 0 0.085 0 0.127v-0.007c-0.293 1.94-0.635 3.577-1.055 5.182l0.076-0.343zM855.182 572.635c-5.863 2.44-12.672 3.856-19.813 3.856-29.172 0-52.82-23.648-52.82-52.82 0-29.155 23.621-52.793 52.769-52.82h0.003c28.599 1.51 51.41 24.315 52.924 52.772l0.006 0.139c-0.054 22.007-13.555 40.849-32.718 48.745l-0.351 0.128zM169.085 269.018c-21.644 0-39.19 17.546-39.19 39.19v0 587.858c0 21.644 17.546 39.19 39.19 39.19v0h39.19c21.644 0 39.19-17.546 39.19-39.19v0-587.858c0-21.644-17.546-39.19-39.19-39.19v0zM384.633 582.543c-21.644 0-39.19 17.546-39.19 39.19v0 274.334c0 21.644 17.546 39.19 39.19 39.19v0h39.19c21.644 0 39.19-17.546 39.19-39.19v0-274.334c0-21.644-17.546-39.19-39.19-39.19v0zM600.182 464.972c-21.644 0-39.19 17.546-39.19 39.19v0 391.905c0 21.644 17.546 39.19 39.19 39.19v0h39.19c21.644 0 39.19-17.546 39.19-39.19v0-391.905c0-21.644-17.546-39.19-39.19-39.19v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["distributions"],"grid":0},"attrs":[{}],"properties":{"order":601,"id":3,"name":"distributions","prevSize":32,"code":59784},"setIdx":0,"setId":1,"iconIdx":4},{"icon":{"paths":["M831.999 1023.999h-640c-105.99-0.12-191.88-86.008-192-191.988v-640.012c0.12-105.99 86.008-191.88 191.988-192h640.011c105.99 0.12 191.88 86.008 192 191.988v640.012c-0.12 105.99-86.008 191.88-191.988 192h-0.012zM192.001 96.001c-52.995 0.060-95.94 43.005-96 95.994v640.006c0.060 52.995 43.005 95.94 95.994 96h640.006c52.995-0.060 95.94-43.005 96-95.994v-640.006c-0.060-52.995-43.005-95.94-95.994-96h-0.006zM256 192.001h511.999c35.346 0 64 28.654 64 64v0 127.999c0 35.346-28.654 64-64 64v0h-511.999c-35.346 0-64-28.654-64-64v0-127.999c0-35.346 28.654-64 64-64v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["pin-to-top"],"grid":0},"attrs":[],"properties":{"order":603,"id":4,"name":"pin-to-top","prevSize":32,"code":59780},"setIdx":0,"setId":1,"iconIdx":5},{"icon":{"paths":["M831.999 1023.999h-640c-105.99-0.12-191.88-86.008-192-191.988v-640.012c0.12-105.99 86.008-191.88 191.988-192h640.011c105.99 0.12 191.88 86.008 192 191.988v640.012c-0.12 105.99-86.008 191.88-191.988 192h-0.012zM192.001 96.001c-52.995 0.060-95.94 43.005-96 95.994v640.006c0.060 52.995 43.005 95.94 95.994 96h640.006c52.995-0.060 95.94-43.005 96-95.994v-640.006c-0.060-52.995-43.005-95.94-95.994-96h-0.006zM256 576h511.999c35.346 0 64 28.654 64 64v0 127.999c0 35.346-28.654 64-64 64v0h-511.999c-35.346 0-64-28.654-64-64v0-127.999c0-35.346 28.654-64 64-64v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["pin-to-bottom"],"grid":0},"attrs":[],"properties":{"order":602,"id":5,"name":"pin-to-bottom","prevSize":32,"code":59781},"setIdx":0,"setId":1,"iconIdx":6},{"icon":{"paths":["M831.999 1023.999h-640c-105.99-0.12-191.88-86.008-192-191.988v-640.012c0.12-105.99 86.008-191.88 191.988-192h640.011c105.99 0.12 191.88 86.008 192 191.988v640.012c-0.12 105.99-86.008 191.88-191.988 192h-0.012zM192.001 96.001c-52.995 0.060-95.94 43.005-96 95.994v640.006c0.060 52.995 43.005 95.94 95.994 96h640.006c52.995-0.060 95.94-43.005 96-95.994v-640.006c-0.060-52.995-43.005-95.94-95.994-96h-0.006zM256 384.001h511.999c35.346 0 64 28.654 64 64v0 127.999c0 35.346-28.654 64-64 64v0h-511.999c-35.346 0-64-28.654-64-64v0-127.999c0-35.346 28.654-64 64-64v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["flexible"],"grid":0},"attrs":[],"properties":{"order":604,"id":6,"name":"flexible","prevSize":32,"code":59782},"setIdx":0,"setId":1,"iconIdx":7},{"icon":{"paths":["M798.952 967.111v-910.222c0-31.419-25.47-56.889-56.889-56.889-12.87 0-24.744 4.274-34.278 11.481l0.144-0.104-606.815 455.111c-13.878 10.489-22.756 26.963-22.756 45.511s8.878 35.022 22.611 45.407l0.144 0.104 606.815 455.111c9.389 7.104 21.263 11.378 34.133 11.378 31.419 0 56.889-25.47 56.889-56.889v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["arrow-left"],"grid":0},"attrs":[{}],"properties":{"order":595,"id":7,"name":"arrow-left-contained","prevSize":32,"code":59776},"setIdx":0,"setId":1,"iconIdx":8},{"icon":{"paths":["M56.889 799.578h910.222c31.419 0 56.889-25.47 56.889-56.889 0-12.87-4.274-24.744-11.481-34.278l0.104 0.144-455.111-606.815c-10.489-13.878-26.963-22.756-45.511-22.756s-35.022 8.878-45.407 22.611l-0.104 0.144-455.111 606.815c-7.104 9.389-11.378 21.263-11.378 34.133 0 31.419 25.47 56.889 56.889 56.889v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["arrow-up-contained"],"grid":0},"attrs":[{}],"properties":{"order":594,"id":8,"name":"arrow-up-contained","prevSize":32,"code":59777},"setIdx":0,"setId":1,"iconIdx":9},{"icon":{"paths":["M239.693 56.889v910.222c0 31.419 25.47 56.889 56.889 56.889 12.87 0 24.744-4.274 34.278-11.481l-0.144 0.104 606.815-455.111c13.878-10.489 22.756-26.963 22.756-45.511s-8.878-35.022-22.611-45.407l-0.144-0.104-606.815-455.111c-9.389-7.104-21.263-11.378-34.133-11.378-31.419 0-56.889 25.47-56.889 56.889v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["arrow-right-contained"],"grid":0},"attrs":[{}],"properties":{"order":593,"id":9,"name":"arrow-right-contained","prevSize":32,"code":59778},"setIdx":0,"setId":1,"iconIdx":10},{"icon":{"paths":["M967.111 224.541h-910.222c-31.419 0-56.889 25.47-56.889 56.889 0 12.87 4.274 24.744 11.481 34.278l-0.104-0.144 455.111 606.815c10.489 13.878 26.963 22.756 45.511 22.756s35.022-8.878 45.407-22.611l0.104-0.144 455.111-606.815c7.104-9.389 11.378-21.263 11.378-34.133 0-31.419-25.47-56.889-56.889-56.889v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["arrow-down-contained"],"grid":0},"attrs":[{}],"properties":{"order":592,"id":10,"name":"arrow-down-contained","prevSize":32,"code":59779},"setIdx":0,"setId":1,"iconIdx":11},{"icon":{"paths":["M967.112 986.074h-872.298c-52.342-0.057-94.759-42.473-94.815-94.809v-796.45c0-31.419 25.469-56.889 56.889-56.889s56.889 25.469 56.889 56.889v0 777.482h853.334c31.419 0 56.889 25.469 56.889 56.889s-25.469 56.889-56.889 56.889v0zM266.666 558.185c266.247-55.286 495.261-188.346 668.625-374.031l0.674-0.729c7.613-8.379 12.272-19.558 12.272-31.826 0-26.179-21.223-47.401-47.401-47.401-14.010 0-26.599 6.078-35.278 15.739l-0.039 0.044c-161.407 172.208-373.614 295.024-612.649 344.529l-7.535 1.305c-21.202 5.022-36.733 23.792-36.733 46.188 0 26.166 21.2 47.382 47.361 47.404h0.002c0.037 0 0.083 0 0.128 0 3.751 0 7.397-0.445 10.89-1.287l-0.316 0.065zM834.372 417.185v379.259c0 10.474 8.49 18.962 18.962 18.962v0h75.851c10.474 0 18.962-8.49 18.962-18.962v0-379.259c0-10.474-8.49-18.962-18.962-18.964h-75.85c0 0-0.002 0-0.002 0-10.474 0-18.964 8.49-18.964 18.964v0zM834.372 417.185v379.259c0 10.474 8.49 18.962 18.962 18.962v0h75.851c10.474 0 18.962-8.49 18.962-18.962v0-379.259c0-10.474-8.49-18.962-18.962-18.964h-75.85c0 0-0.002 0-0.002 0-10.474 0-18.964 8.49-18.964 18.964v0zM625.779 493.034v303.408c0 10.474 8.49 18.962 18.962 18.962v0h75.851c10.474 0 18.962-8.49 18.962-18.962v0-303.408c0-10.474-8.49-18.962-18.962-18.964h-75.85c-0.002 0-0.002 0-0.003 0-10.474 0-18.964 8.49-18.964 18.964 0 0.002 0 0.002 0 0.003v0zM625.779 493.034v303.408c0 10.474 8.49 18.962 18.962 18.962v0h75.851c10.474 0 18.962-8.49 18.962-18.962v0-303.408c0-10.474-8.49-18.962-18.962-18.964h-75.85c-0.002 0-0.002 0-0.003 0-10.474 0-18.964 8.49-18.964 18.964 0 0.002 0 0.002 0 0.003v0zM417.186 606.812v189.63c0 10.474 8.49 18.962 18.962 18.962v0h75.851c10.474 0 18.962-8.49 18.962-18.962v0-189.627c0-10.474-8.49-18.962-18.962-18.962v0h-75.85c0 0-0.002 0-0.002 0-10.474 0-18.962 8.49-18.962 18.962v0zM417.186 606.812v189.63c0 10.474 8.49 18.962 18.962 18.962v0h75.851c10.474 0 18.962-8.49 18.962-18.962v0-189.627c0-10.474-8.49-18.962-18.962-18.962v0h-75.85c0 0-0.002 0-0.002 0-10.474 0-18.962 8.49-18.962 18.962v0zM208.592 682.666v113.778c0 10.474 8.49 18.962 18.962 18.962h75.851c10.474 0 18.962-8.49 18.962-18.962v0-113.778c0-10.474-8.49-18.962-18.962-18.964h-75.85c0 0-0.002 0-0.002 0-10.474 0-18.964 8.49-18.964 18.964v0zM208.592 682.666v113.778c0 10.474 8.49 18.962 18.962 18.962h75.851c10.474 0 18.962-8.49 18.962-18.962v0-113.778c0-10.474-8.49-18.962-18.962-18.964h-75.85c0 0-0.002 0-0.002 0-10.474 0-18.964 8.49-18.964 18.964v0zM208.592 303.407c0 31.419 25.469 56.889 56.889 56.889s56.889-25.469 56.889-56.889c0-31.419-25.469-56.889-56.889-56.889 0 0 0 0 0 0v0c-31.419 0-56.889 25.469-56.889 56.889 0 0 0 0 0 0v0zM303.407 113.778c0 31.418 25.471 56.889 56.889 56.889s56.889-25.469 56.889-56.889c0-31.419-25.469-56.889-56.889-56.889v0c-31.419 0-56.889 25.469-56.889 56.889 0 0 0 0 0 0.002v0zM455.111 265.482c0 31.419 25.471 56.889 56.889 56.889s56.889-25.469 56.889-56.889c0-31.419-25.469-56.889-56.889-56.889v0c-31.419 0-56.889 25.469-56.889 56.889v0zM587.851 113.778c0 31.419 25.469 56.889 56.889 56.889s56.889-25.469 56.889-56.889c0-31.419-25.469-56.889-56.889-56.889v0c-31.419 0-56.889 25.469-56.889 56.889v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["figures"],"grid":0},"attrs":[],"properties":{"order":598,"id":11,"name":"figures","prevSize":32,"code":59774},"setIdx":0,"setId":1,"iconIdx":12},{"icon":{"paths":["M853.333 1024h-682.667c-94.213-0.107-170.56-76.452-170.667-170.656v-682.677c0.107-94.213 76.452-170.56 170.656-170.667h682.677c94.213 0.107 170.56 76.452 170.667 170.656v682.677c-0.107 94.213-76.452 170.56-170.656 170.667h-0.011zM170.667 85.333c-47.107 0.053-85.28 38.227-85.333 85.328v682.672c0.053 47.107 38.227 85.28 85.328 85.333h682.672c47.107-0.053 85.28-38.227 85.333-85.328v-682.672c-0.053-47.107-38.227-85.28-85.328-85.333h-0.005zM801.235 423.117l-38.679-4.904c-2.191-5.797-4.568-11.593-7.133-17.169l23.928-30.839c7.881-9.921 12.644-22.628 12.644-36.447 0-16.423-6.727-31.273-17.573-41.949l-42.112-42.072c-10.671-10.947-25.561-17.737-42.039-17.737-13.823 0-26.529 4.779-36.559 12.775l0.119-0.091-30.84 23.856c-5.649-2.527-11.372-4.905-17.169-7.060l-4.937-38.719c-3.705-29.496-28.628-52.088-58.828-52.096h-60.155c-30.192 0.007-55.103 22.603-58.753 51.805l-0.029 0.291-4.944 38.719c-5.831 2.155-11.555 4.533-17.129 7.060l-30.876-24.004c-9.92-7.773-22.579-12.467-36.333-12.467-16.435 0-31.304 6.699-42.028 17.516l-42.101 42.067c-10.924 10.687-17.696 25.576-17.696 42.048 0 13.813 4.763 26.515 12.736 36.551l-0.092-0.121 23.929 30.839c-2.564 5.575-4.941 11.372-7.097 17.169l-38.793 4.904c-29.432 3.828-51.941 28.701-52.024 58.848v60.208c0.048 30.176 22.623 55.064 51.803 58.753l0.292 0.031 38.681 4.904c2.192 5.797 4.533 11.52 7.097 17.169l-23.893 30.84c-7.879 9.927-12.64 22.639-12.64 36.461 0 16.448 6.741 31.321 17.611 42.008l42.105 42.072c10.711 10.883 25.6 17.627 42.065 17.627 13.797 0 26.488-4.736 36.537-12.669l-0.124 0.095 30.843-24.007q8.473 3.908 17.129 7.14l4.944 38.639c3.657 29.52 28.575 52.148 58.781 52.173h60.163c30.187-0.043 55.088-22.615 58.793-51.8l0.031-0.293 4.904-38.719c5.831-2.156 11.555-4.535 17.203-7.060l30.879 24.001c9.916 7.792 22.58 12.496 36.341 12.496 16.437 0 31.307-6.711 42.017-17.543l42.069-42.069c10.953-10.677 17.747-25.576 17.747-42.063 0-13.811-4.768-26.508-12.748-36.536l0.092 0.12-23.967-30.84q3.848-8.476 7.133-17.169l38.684-4.977c29.468-3.731 52.033-28.612 52.093-58.777v-60.207c-0.048-30.177-22.624-55.067-51.807-58.753l-0.292-0.031zM788.417 537.043l-54.363 6.985c-12.985 1.681-23.455 10.843-27.032 22.959l-0.059 0.229c-4.809 16.628-10.959 31.075-18.589 44.573l0.532-1.024c-2.636 4.576-4.192 10.063-4.192 15.913 0 7.543 2.585 14.481 6.917 19.979l-0.052-0.069 33.553 43.179-35.373 35.3-43.252-33.593c-5.416-4.199-12.307-6.731-19.789-6.731-5.82 0-11.283 1.532-16.007 4.215l0.16-0.084c-12.519 7.116-27.019 13.267-42.249 17.696l-1.447 0.36c-12.333 3.665-21.476 14.143-23.131 26.968l-0.017 0.163-6.952 54.397h-50.159l-6.912-54.397c-1.747-12.988-10.913-23.449-23.031-27.065l-0.231-0.059c-16.595-4.772-31.019-10.897-44.491-18.511l1.016 0.528c-4.58-2.657-10.077-4.225-15.941-4.225-7.549 0-14.491 2.599-19.98 6.949l0.067-0.051-43.14 33.439-35.375-35.368 33.516-43.031c4.281-5.441 6.865-12.393 6.865-19.948 0-5.833-1.54-11.305-4.237-16.033l0.084 0.16c-7.108-12.476-13.257-26.924-17.696-42.101l-0.363-1.447c-3.608-12.379-14.087-21.573-26.928-23.244l-0.163-0.017-54.399-6.985v-50.091l54.584-6.912c12.872-1.864 23.208-10.993 26.804-23.031l0.060-0.232c4.832-16.684 11.007-31.18 18.667-44.724l-0.535 1.027c2.58-4.533 4.101-9.96 4.101-15.743 0-7.552-2.595-14.497-6.94-19.995l0.052 0.068-33.512-43.107 35.411-35.375 43.289 33.665c5.475 4.079 12.372 6.529 19.841 6.529 5.753 0 11.168-1.455 15.895-4.016l-0.176 0.088c12.513-7.155 27-13.331 42.225-17.773l1.437-0.359c12.375-3.621 21.556-14.115 23.205-26.964l0.017-0.161 6.912-54.325h50.164l6.912 54.325c1.615 12.992 10.788 23.476 22.921 26.995l0.227 0.056c16.639 4.824 31.085 10.947 44.603 18.528l-1.055-0.543c4.597 2.757 10.143 4.388 16.069 4.388 7.535 0 14.455-2.636 19.887-7.035l-0.059 0.047 43.139-33.516 35.34 35.375-33.485 43.104c-4.257 5.469-6.825 12.436-6.825 20.003 0 5.805 1.512 11.257 4.163 15.984l-0.085-0.165c7.113 12.496 13.276 26.967 17.731 42.167l0.365 1.455c3.645 12.34 14.109 21.496 26.927 23.171l0.164 0.017 54.403 6.912zM512 358.688c-0.047 0-0.103 0-0.159 0-84.761 0-153.475 68.713-153.475 153.475s68.713 153.475 153.475 153.475c84.761 0 153.475-68.713 153.475-153.475 0-42.381-17.179-80.752-44.953-108.525v0c-27.728-27.749-66.037-44.921-108.356-44.949h-0.005zM512 600.44c-0.036 0-0.079 0-0.12 0-48.888 0-88.519-39.632-88.519-88.519s39.632-88.519 88.519-88.519c48.888 0 88.519 39.632 88.519 88.519 0 24.436-9.901 46.56-25.912 62.579v0c-15.989 16.005-38.079 25.915-62.481 25.941h-0.005z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["box-settings"],"grid":0},"attrs":[],"properties":{"order":597,"id":12,"name":"box-settings","prevSize":32,"code":59773},"setIdx":0,"setId":1,"iconIdx":13},{"icon":{"paths":["M853.334 1024h-170.666c-25.706 0-46.545-20.839-46.545-46.545s20.839-46.545 46.545-46.545v0h170.666c42.828-0.041 77.535-34.748 77.575-77.572v-170.671c0-25.706 20.839-46.545 46.545-46.545s46.545 20.839 46.545 46.545v0 170.666c-0.099 94.217-76.449 170.567-170.657 170.666h-0.010zM341.334 1024h-170.666c-94.217-0.099-170.567-76.449-170.666-170.657v-170.676c0-25.706 20.839-46.545 46.545-46.545s46.545 20.839 46.545 46.545v0 170.666c0.041 42.828 34.748 77.535 77.572 77.575h170.671c25.706 0 46.545 20.839 46.545 46.545s-20.839 46.545-46.545 46.545v0zM977.455 387.879c-25.703-0.007-46.538-20.842-46.545-46.545v0-170.666c-0.041-42.828-34.748-77.535-77.572-77.575h-170.671c-25.706 0-46.545-20.839-46.545-46.545s20.839-46.545 46.545-46.545v0h170.666c94.217 0.099 170.567 76.449 170.666 170.657v170.676c-0.007 25.703-20.842 46.538-46.545 46.545v0zM46.545 387.879c-25.703-0.007-46.538-20.842-46.545-46.545v0-170.666c0.099-94.217 76.449-170.567 170.657-170.666h170.676c25.706 0 46.545 20.839 46.545 46.545s-20.839 46.545-46.545 46.545v0h-170.666c-42.828 0.041-77.535 34.748-77.575 77.572v170.671c-0.007 25.703-20.842 46.538-46.545 46.545v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["full-screen"],"grid":0},"attrs":[],"properties":{"order":596,"id":13,"name":"full-screen","prevSize":32,"code":59771},"setIdx":0,"setId":1,"iconIdx":14},{"icon":{"paths":["M776.258 1024h-528.515c-136.757-0.166-247.576-110.985-247.742-247.726v-528.531c0.153-136.761 110.979-247.587 247.726-247.742h132.144c27.365 0 49.548 22.184 49.548 49.548s-22.184 49.548-49.548 49.548v0h-132.128c-82.057 0.093-148.552 66.588-148.645 148.636v528.524c0.104 82.052 66.593 148.541 148.636 148.645h528.526c82.047-0.116 148.529-66.598 148.645-148.634v-132.139c0-27.365 22.184-49.548 49.548-49.548s49.548 22.184 49.548 49.548v0 132.128c-0.178 136.752-110.988 247.564-247.725 247.742h-0.017zM974.452-0h-330.322c-27.365 0-49.548 22.184-49.548 49.548s22.184 49.548 49.548 49.548v0h210.706l-377.866 377.871c-8.889 8.953-14.383 21.287-14.383 34.904 0 27.362 22.181 49.544 49.544 49.544 13.618 0 25.952-5.494 34.907-14.386l377.868-377.863v210.706c0 27.365 22.184 49.548 49.548 49.548s49.548-22.184 49.548-49.548v0-330.322c0-27.365-22.184-49.548-49.548-49.548v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["new-tab"],"grid":0},"attrs":[],"properties":{"order":595,"id":14,"name":"new-tab","prevSize":32,"code":59772},"setIdx":0,"setId":1,"iconIdx":15},{"icon":{"paths":["M0.002 161.281v480.809c0 48.689 42.604 91.293 91.293 91.293h359.084c42.604 73.034 121.723 115.638 213.016 115.638 54.776 0 109.551-18.259 152.155-48.689l-6.087 6.087 133.896 133.896c18.259 18.259 48.689 18.259 66.947 0s18.259-48.689 0-66.947l-133.896-133.896-6.087 6.087c30.43-42.604 48.689-97.379 48.689-152.155 0-66.947-24.345-121.723-66.947-170.413v-261.706c0-48.689-42.604-91.293-91.293-91.293h-669.479c-48.689 0-91.293 42.604-91.293 91.293zM791.206 161.281v206.931c-30.43-18.259-60.862-30.43-91.293-36.517l60.862-97.379c6.087-12.172 6.087-30.43-12.172-42.604-12.172-6.087-30.43-6.087-42.604 12.172l-73.034 127.81c-42.604 6.087-85.206 24.345-121.723 48.689l-54.776-54.776c-6.087-6.087-18.259-12.172-24.345-6.087-12.172 0-18.259 6.087-24.345 18.259l-60.862 127.81-103.465-225.189c-6.087-12.172-18.259-18.259-30.43-18.259s-24.345 12.172-24.345 24.345l-91.293 304.308c-6.087 18.259 6.087 30.43 18.259 36.517 18.259 6.087 30.43-6.087 36.517-18.259l66.947-225.189 91.293 200.844c6.087 12.172 18.259 18.259 24.345 18.259 12.172 0 24.345-6.087 30.43-18.259l73.034-146.068 24.345 24.345c-42.604 48.689-66.947 103.465-66.947 170.413 0 30.43 6.087 60.862 12.172 85.206h-316.482c-18.259 0-30.43-12.172-30.43-30.43v-486.894c0-18.259 12.172-30.43 30.43-30.43h669.479c18.259 0 30.43 18.259 30.43 30.43zM827.723 593.4c0 91.293-73.034 170.413-170.413 170.413-91.293 0-170.413-73.034-170.413-170.413 0-91.293 73.034-170.413 170.413-170.413s170.413 79.121 170.413 170.413z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["compare"],"grid":0},"attrs":[],"properties":{"order":594,"id":15,"name":"compare","prevSize":32,"code":59770},"setIdx":0,"setId":1,"iconIdx":16},{"icon":{"paths":["M1023.974 961.382c0 0.006 0 0.012 0 0.019 0 34.606-28.053 62.66-62.66 62.66-0.007 0-0.013 0-0.020 0h-764.789c-0.019 0-0.041 0-0.063 0-108.479 0-196.418-87.94-196.418-196.418 0-0.010 0-0.022 0-0.032v0.001-764.669c0-0.095-0.001-0.206-0.001-0.319 0-8.556 1.75-16.704 4.912-24.105l-0.152 0.401c3.29-7.937 7.867-14.712 13.537-20.396l-0.001 0.001c5.681-5.675 12.444-10.268 19.954-13.442l0.413-0.155c6.638-2.294 14.368-3.976 22.37-4.726l0.402-0.031c1.011-0.070 2.192-0.111 3.383-0.111 7.947 0 15.476 1.795 22.203 5.002l-0.312-0.135c15.461 6.484 27.5 18.562 33.779 33.64l0.152 0.411c2.988 6.983 4.726 15.109 4.726 23.641 0 0.135 0 0.268-0.001 0.402v-0.020 764.608c0 0.057 0 0.124 0 0.192 0 9.744 1.984 19.026 5.571 27.462l-0.174-0.459c10.967 26.015 36.25 43.946 65.724 43.961h764.789c17.289 0.056 32.939 7.031 44.334 18.299l-0.006-0.006c11.338 11.342 18.35 27.008 18.35 44.312 0 0.004 0 0.009 0 0.013v0zM295.374 794.931l499.471-499.471c8.669-8.505 14.040-20.341 14.040-33.434 0-25.861-20.965-46.826-46.826-46.826-13.089 0-24.924 5.37-33.422 14.029l-499.486 499.484c-8.666 8.505-14.036 20.34-14.036 33.429 0 25.861 20.965 46.826 46.826 46.826 13.092 0 24.929-5.373 33.426-14.033l0.007-0.007zM758.018 522.087h-1.708c-1.008-0.044-2.189-0.069-3.377-0.069-13.382 0-26.025 3.167-37.219 8.792l0.477-0.218c-8.54 4.116-15.422 10.527-20.002 18.438l-0.117 0.219c-1.888 3.111-3.006 6.87-3.006 10.891 0 0.299 0.006 0.594 0.018 0.89l-0.001-0.042c0.14 5.29 2.074 10.101 5.212 13.878l-0.029-0.037c3.137 3.758 7.28 6.579 12.012 8.060l0.181 0.048c3.813 1.276 8.215 2.088 12.782 2.253l0.083 0.003c4.485-0.146 8.752-0.783 12.841-1.857l-0.401 0.089c2.303-0.776 4.993-1.356 7.773-1.633l0.157-0.013c5.452 0.101 10.411 2.138 14.234 5.451l-0.028-0.023c6.462 5.249 12.052 11.206 16.764 17.83l0.186 0.277c6.159 8.231 15.852 22.011 29.51 42.070l12.742 18.719c-22.864 27.62-41.398 49.324-55.301 64.751-10.117 12.081-21.146 22.781-33.183 32.26l-0.473 0.359c-7 5.954-13.187 12.489-18.618 19.632l-0.222 0.306c-2.726 3.303-5.006 7.11-6.665 11.234l-0.102 0.29-0.549 1.402 0.124 1.463c0.827 8.518 4.485 16.054 10.009 21.778l-0.010-0.010c3.063 3.388 6.775 6.125 10.95 8.025l0.208 0.085c4.015 1.774 8.698 2.805 13.62 2.805 0.078 0 0.154 0 0.231-0.001h-0.012c4.672-0.132 9.134-0.724 13.436-1.735l-0.449 0.089c5.070-1.239 9.504-3.434 13.309-6.399l-0.078 0.059c14.591-13.007 27.934-26.506 40.392-40.8l0.459-0.538c13.536-15.546 30.059-35.179 50.363-59.874 17.763 26.675 35.687 49.849 55.082 71.689l-0.574-0.658c6.529 8.124 14.57 14.743 23.733 19.5l0.411 0.195c8.974 4.728 19.496 7.836 30.655 8.644l0.258 0.015c1.117 0.057 2.425 0.089 3.74 0.089 11.725 0 22.851-2.571 32.842-7.18l-0.487 0.202c5.31-2.337 9.674-5.995 12.798-10.567l0.066-0.102c2.903-4.169 4.637-9.339 4.637-14.915 0-0.158-0.001-0.316-0.004-0.473v0.023c0.018-0.281 0.026-0.61 0.026-0.942 0-3.064-0.824-5.937-2.264-8.405l0.042 0.079c-1.68-2.916-4.034-5.271-6.861-6.902l-0.089-0.048c-5.584-3.011-12.061-5.54-18.861-7.252l-0.588-0.126c-5.663-1.4-10.597-3.219-15.261-5.503l0.445 0.198c-12.968-7.521-23.839-17.187-32.484-28.628l-0.198-0.272c-11.462-14.389-26.339-35.485-44.328-62.559 20.486-24.938 37.559-44.935 52.070-61.214 12.996-14.755 26.477-28.208 40.775-40.755l0.502-0.432 1.523-1.981c4.064-8.127 6.589-17.661 6.948-27.744l0.003-0.12c0.035-0.528 0.056-1.144 0.056-1.766 0-7.35-2.826-14.040-7.45-19.043l0.018 0.019c-2.533-2.839-5.673-5.079-9.223-6.525l-0.167-0.060c-2.911-1.215-6.294-1.921-9.841-1.921-0.442 0-0.881 0.010-1.318 0.032l0.061-0.003c-0.132-0.001-0.288-0.003-0.445-0.003-7.103 0-13.777 1.831-19.578 5.047l0.208-0.105c-8.2 5.256-15.23 11.423-21.228 18.492l-0.111 0.135c-13.963 14.541-37.193 42.131-69.080 82.099-13.718-21.522-24.876-37.863-33.169-48.503-8.535-11.67-18.755-21.503-30.419-29.358l-0.432-0.274c-11.039-7.085-24.509-11.297-38.963-11.303h-0.001zM227.266 52.67c-1.239-2.839-2.085-6.131-2.371-9.582l-0.007-0.113c-0.064-0.729-0.101-1.577-0.101-2.433 0-9.677 4.645-18.268 11.825-23.667l0.076-0.054c7.096-5.070 15.949-8.108 25.51-8.108 0.56 0 1.117 0.010 1.673 0.031l-0.080-0.003c0.423-0.025 0.916-0.040 1.414-0.040 5.732 0 11.026 1.88 15.296 5.059l-0.069-0.048c5.303 4.17 9.709 9.207 13.066 14.933l0.135 0.249c13.868 24.545 26.607 53.178 36.618 83.062l1.030 3.549c7.956 22.072 14.146 38.35 18.779 49.66 3.658 8.475 7.742 16.92 12.195 25.090 7.118-18.038 14.599-41.28 20.816-65.034l1.042-4.687c6.371-21.676 11.494-38.747 15.426-51.46 4.778-14.554 9.67-26.565 15.261-38.175l-0.811 1.866c3.499-7.33 8.219-13.533 13.961-18.603l0.061-0.054c5.761-4.803 13.239-7.725 21.396-7.742h0.004c9.137 0.413 17.451 3.625 24.186 8.794l-0.102-0.075c3.749 1.766 6.825 4.431 9.034 7.725l0.050 0.079c2.491 3.509 4.097 7.804 4.416 12.454l0.004 0.076c-0.236 6.278-1.958 12.103-4.823 17.201l0.098-0.19c-15.091 35.089-28.779 69.080-40.485 100.51-11.341 31.155-22.468 65.91-33.017 103.224l-0.031 0.092c-6.25 20.944-13.048 41.308-20.182 60.423-3.354 9.542-6.25 17.315-8.628 23.169-1.832 4.865-3.791 8.974-6.046 12.89l0.224-0.421c-7.776 11.25-17.023 20.807-27.602 28.672l-0.322 0.228c-9.882 7.617-22.435 12.213-36.062 12.224h-0.003c-0.637 0.041-1.38 0.063-2.129 0.063-0.538 0-1.073-0.012-1.605-0.035l0.076 0.003c-13.424-0.029-26.138-3.050-37.516-8.429l0.537 0.228c-9.746-4.425-17.86-10.947-24.032-19.029l-0.11-0.151c-4.466-5.501-7.387-12.419-8.009-19.989l-0.009-0.132c-0.025-0.416-0.040-0.903-0.040-1.393 0-7.451 3.352-14.118 8.631-18.577l0.037-0.029c5.322-3.985 12.025-6.393 19.289-6.431h0.009c0.284-0.012 0.618-0.019 0.953-0.019 5.136 0 9.886 1.654 13.748 4.456l-0.067-0.047 5.701 3.996c2.189 1.656 4.674 3.134 7.317 4.323l0.243 0.098 1.248 0.639c1.733 0.884 3.774 1.411 5.938 1.433h0.007c2.53 0 10.212 0 17.225-14.695 6.525-15.136 12.018-32.91 15.611-51.363l0.272-1.681c-15.306-22.244-29.876-47.732-42.309-74.416l-1.377-3.291-13.657-31.644q-3.017-7.317-16.524-36.827c-9.141-21.635-17.788-39.124-27.286-56.074l1.465 2.845c-2.085-3.904-4.27-8.717-6.175-13.669l-0.316-0.937zM280.431 331.855l-0.004 0.012z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["axes-props"],"grid":0},"attrs":[],"properties":{"order":240,"id":16,"name":"axes-props","prevSize":32,"code":59769},"setIdx":0,"setId":1,"iconIdx":17},{"icon":{"paths":["M512 1024c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512v0c-0.335 282.636-229.365 511.667-511.968 512h-0.032zM512 96c-229.751 0-416 186.249-416 416s186.249 416 416 416c229.751 0 416-186.249 416-416v0c-0.275-229.641-186.36-415.727-415.974-416h-0.026zM512 432c-26.51 0-48 21.491-48 48v0 256.001c0 26.51 21.491 48 48 48s48-21.491 48-48v0-256.001c0-26.51-21.491-48-48-48v0zM512 224c-35.346 0-64.001 28.655-64.001 64.001s28.655 64.001 64.001 64.001c35.346 0 64.001-28.655 64.001-64.001v0c-0.048-35.327-28.673-63.953-63.996-64.001h-0.005z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["info-circle-outline"],"grid":0},"attrs":[],"properties":{"order":593,"id":17,"name":"info-circle-outline","prevSize":32,"code":59768},"setIdx":0,"setId":1,"iconIdx":18},{"icon":{"paths":["M1023.996 511.989c0 254.891-206.63 461.521-461.521 461.521-125.791 0-239.828-50.326-323.077-131.939l0.076 0.074c-10.886-10.507-17.646-25.229-17.646-41.529 0-31.861 25.829-57.691 57.691-57.691 15.889 0 30.278 6.424 40.711 16.815l-0.001-0.001c62.443 61.366 148.138 99.248 242.679 99.248 191.267 0 346.319-155.052 346.319-346.319s-155.052-346.319-346.319-346.319c-175.952 0-321.255 131.214-343.398 301.13l-0.185 1.744h54.701c0.001 0 0.001 0 0.003 0 23.893 0 43.264 19.37 43.264 43.264 0 11.949-4.843 22.766-12.675 30.596l-115.38 115.408c-7.827 7.831-18.644 12.676-30.592 12.676s-22.764-4.845-30.592-12.676l-115.38-115.408c-7.831-7.83-12.675-18.647-12.675-30.596 0-23.893 19.37-43.264 43.264-43.264 0.001 0 0.001 0 0.003 0h59.877c22.798-235.581 219.774-418.259 459.416-418.259 254.846 0 461.441 206.593 461.441 461.441 0 0.030 0 0.061 0 0.091v-0.005zM531.883 542.585l115.38 115.38c7.827 7.814 18.633 12.648 30.567 12.648 23.895 0 43.264-19.37 43.264-43.264 0-11.936-4.834-22.743-12.649-30.57v0l-102.704-102.704v-212.846c0-23.896-19.372-43.268-43.268-43.268s-43.268 19.372-43.268 43.268v0 230.761c0 0.001 0 0.004 0 0.007 0 11.947 4.845 22.761 12.676 30.589v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["update-time"],"grid":0},"attrs":[],"properties":{"order":494,"id":18,"name":"update-time","prevSize":32,"code":59767},"setIdx":0,"setId":1,"iconIdx":19},{"icon":{"paths":["M1023.964 511.957c0 31.373-25.433 56.807-56.807 56.807v0h-910.387c-31.373 0-56.807-25.433-56.807-56.807s25.433-56.807 56.807-56.807v0h910.387c31.373 0 56.807 25.433 56.807 56.807v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["minus"],"grid":0},"attrs":[],"properties":{"order":591,"id":19,"name":"minus","prevSize":32,"code":59766},"setIdx":0,"setId":1,"iconIdx":20},{"icon":{"paths":["M215.991 50.239c-6.586-4.076-14.574-6.493-23.127-6.493-24.54 0-44.436 19.893-44.436 44.436 0 16.115 8.579 30.227 21.42 38.019l0.196 0.111 90.884 54.887-202.461 350.7c-8.732 14.87-13.888 32.753-13.888 51.839 0 38.174 20.629 71.53 51.352 89.525l0.488 0.264 425.049 245.405c14.87 8.732 32.753 13.89 51.84 13.89 38.177 0 71.533-20.631 89.528-51.355l0.264-0.488 221.29-383.289c4.242-7.225 6.747-15.909 6.747-25.18 0-18.543-10.019-34.741-24.94-43.484l-0.238-0.13-522.17-301.477zM143.637 562.128l193.828-335.744 424.095 244.857zM1015.839 837.74c0.314 2.816 0.494 6.079 0.494 9.385 0 49.353-40.009 89.363-89.363 89.363s-89.363-40.009-89.363-89.363c0-3.307 0.18-6.569 0.53-9.782l-0.034 0.397c0-78.992 88.869-197.487 88.869-197.487s88.869 118.49 88.869 197.483z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["color-scale-on"],"grid":0},"attrs":[],"properties":{"order":522,"id":20,"name":"color-scale-on","prevSize":32,"code":59763},"setIdx":0,"setId":1,"iconIdx":21},{"icon":{"paths":["M57.44 157.954c-0.308-0.007-0.671-0.010-1.034-0.010-28.983 0-52.478 23.495-52.478 52.478 0 28.62 22.91 51.888 51.391 52.468l0.054 0.002 125.368 2.47 0.012 478.251c0 67.626 54.821 122.449 122.449 122.449v0h579.651c67.626 0 122.449-54.821 122.449-122.449v0-522.709c0-32.848-26.627-59.476-59.476-59.476v0h-712.093zM285.704 479.821l-0.005-213.437h614.65v213.434z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["color-scale-off"],"grid":0},"attrs":[],"properties":{"order":523,"id":21,"name":"color-scale-off","prevSize":32,"code":59764},"setIdx":0,"setId":1,"iconIdx":22},{"icon":{"paths":["M512 0c-282.769 0-512 229.231-512 512s229.231 512 512 512c282.769 0 512-229.231 512-512v0c-0.327-282.639-229.362-511.673-511.969-512h-0.031zM512 99.097c0.169 0 0.367 0 0.565 0 227.727 0 412.337 184.609 412.337 412.337 0 83.743-24.965 161.656-67.858 226.701l0.958-1.547c-79.076-106.662-204.554-175.040-346.002-175.040-141.451 0-266.931 68.38-345.186 173.887l-0.819 1.157c-41.935-63.499-66.9-141.412-66.9-225.155 0-227.729 184.611-412.341 412.341-412.341 0.198 0 0.395 0 0.593 0h-0.031zM236.186 818.391c23.633-73.514 147.951-157.746 275.814-157.746 127.835 0 252.178 84.232 275.814 157.746-72.571 66.060-169.469 106.512-275.814 106.512s-203.243-40.452-276.145-106.808l0.33 0.296zM512 545.032c91.215 0 165.162-73.945 165.162-165.162s-73.945-165.162-165.162-165.162c-91.215 0-165.162 73.945-165.162 165.162v0c0.099 91.177 73.985 165.063 165.151 165.162h0.009zM512 313.807c36.486 0 66.065 29.579 66.065 66.065s-29.579 66.065-66.065 66.065c-36.486 0-66.065-29.579-66.065-66.065v0c0.050-36.466 29.597-66.015 66.060-66.065h0.005z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["avatar"],"grid":0},"attrs":[],"properties":{"order":524,"id":22,"name":"avatar","prevSize":32,"code":59762},"setIdx":0,"setId":1,"iconIdx":23},{"icon":{"paths":["M264.802 105.889c-29.255 0-52.971 23.716-52.971 52.971s23.716 52.971 52.971 52.971c29.255 0 52.971-23.716 52.971-52.971v0c0-29.255-23.716-52.971-52.971-52.971v0zM105.889 158.86c0.028-87.745 71.165-158.865 158.913-158.865 87.765 0 158.913 71.149 158.913 158.913 0 68.778-43.693 127.351-104.836 149.475l-1.106 0.349v273.876c43.577-33.054 98.717-52.95 158.505-52.95 0.144 0 0.288 0 0.43 0h-0.022c123.764 0 224.649-97.947 229.373-220.554l0.013-0.43c-62.167-22.519-105.783-81.051-105.783-149.769 0-87.765 71.149-158.913 158.913-158.913s158.913 71.149 158.913 158.913c0 68.818-43.744 127.419-104.944 149.514l-1.107 0.349c-4.837 181.522-153.138 326.829-335.378 326.83v0c-0.012 0-0.026 0-0.041 0-61.496 0-114.833 34.931-141.251 86.035l-0.417 0.887c52.981 26.509 88.72 80.364 88.72 142.565 0 87.762-71.144 158.905-158.905 158.905s-158.905-71.144-158.905-158.905c0-68.776 43.693-127.348 104.836-149.47l1.106-0.349v-406.535c-62.251-22.498-105.941-81.082-105.942-149.874v0zM264.802 812.169c-29.255 0-52.971 23.716-52.971 52.971s23.716 52.971 52.971 52.971c29.255 0 52.971-23.716 52.971-52.971v0c0-29.255-23.716-52.971-52.971-52.971v0zM706.227 158.86c0-29.255 23.716-52.971 52.971-52.971s52.971 23.716 52.971 52.971c0 29.255-23.716 52.971-52.971 52.971v0c-29.255 0-52.971-23.716-52.971-52.971v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Branch_ic-01"],"grid":0},"attrs":[],"properties":{"order":525,"id":23,"name":"branch","prevSize":32,"code":59765},"setIdx":0,"setId":1,"iconIdx":24},{"icon":{"paths":["M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512c282.77 0 512-229.23 512-512v0c0-282.77-229.23-512-512-512v0zM499.2 806.401c-28.277 0-51.2-22.923-51.2-51.2s22.923-51.2 51.2-51.2c28.232 0 51.128 22.85 51.2 51.065v0.008c0 0.024 0 0.051 0 0.080 0 28.287-22.917 51.221-51.198 51.249h-0.003zM597.001 507.188c-37.526 18.093-62.96 55.839-62.96 99.525 0 4.263 0.242 8.471 0.714 12.608l-0.047-0.506c0 19.436-15.756 35.192-35.193 35.192-0.002 0-0.002 0-0.003 0h-3.84c-19.431 0-35.184-15.753-35.184-35.184 0-0.002 0-0.005 0-0.006v0c0.516-102.005 29.063-124.278 77.336-155.618 32.099-18.111 53.721-51.483 55.016-90.006l0.005-0.177c-0.431-44.127-36.303-79.733-80.49-79.733-33.929 0-62.955 20.993-74.799 50.697l-0.191 0.543c-5.328 17.853-20.852 30.947-39.659 32.604l-0.173 0.012c-0.782 0.059-1.694 0.093-2.613 0.093-20.436 0-37.004-16.568-37.004-37.004 0-2.84 0.32-5.604 0.926-8.259l-0.048 0.249c18.845-63.215 76.452-108.516 144.639-108.516 3.335 0 6.644 0.108 9.924 0.321l-0.447-0.024c3.782-0.347 8.178-0.545 12.621-0.545 80.921 0 146.52 65.6 146.52 146.52 0 1.361-0.018 2.717-0.056 4.068l0.005-0.2c0.033 1.163 0.051 2.529 0.051 3.902 0 55.109-29.888 103.238-74.339 129.060l-0.713 0.383z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["question_ic-01"],"grid":0},"attrs":[],"properties":{"order":526,"id":24,"name":"circle-question","prevSize":32,"code":59756},"setIdx":0,"setId":1,"iconIdx":25},{"icon":{"paths":["M468.114 160.914v-117.028c0-24.237 19.648-43.886 43.886-43.886s43.886 19.648 43.886 43.886v117.028h87.771v-117.028c0-24.237 19.648-43.886 43.886-43.886s43.886 19.648 43.886 43.886v122.559l1.227 0.278c60.688 16.144 108.477 63.933 124.9 125.849h122.558c24.237 0 43.886 19.648 43.886 43.886s-19.648 43.886-43.886 43.886h-117.028v87.771h117.028c24.237 0 43.886 19.648 43.886 43.886s-19.648 43.886-43.886 43.886h-117.028v87.771h117.028c24.237 0 43.886 19.648 43.886 43.886s-19.648 43.886-43.886 43.886h-119.539l-85.262-85.262v-309.71c0-48.474-39.297-87.771-87.771-87.771h-309.71l-85.262-85.262v-119.538c0-24.237 19.648-43.886 43.886-43.886s43.886 19.648 43.886 43.886v117.028zM185.219 247.281l0.44-0.793c-8.289 13.827-14.718 28.897-19.215 46.083h-122.559c-24.237 0-43.886 19.648-43.886 43.886s19.648 43.886 43.886 43.886h117.028v87.771h-117.028c-24.237 0-43.886 19.648-43.886 43.886s19.648 43.886 43.886 43.886h117.028v87.771h-117.028c-24.237 0-43.886 19.648-43.886 43.886s19.648 43.886 43.886 43.886h122.559l0.278 1.227c16.144 60.688 63.933 108.477 125.849 124.9v122.558c0 24.237 19.648 43.886 43.886 43.886s43.886-19.648 43.886-43.886v-117.028h87.771v117.028c0 24.237 19.648 43.886 43.886 43.886s43.886-19.648 43.886-43.886v-117.028h87.771v117.028c0 24.237 19.648 43.886 43.886 43.886s43.886-19.648 43.886-43.886v-122.558l1.218-0.274c15.968-4.224 31.037-10.655 44.072-18.503l172.36 172.357c7.915 7.753 18.753 12.532 30.708 12.532 24.237 0 43.886-19.648 43.886-43.886 0-11.955-4.779-22.792-12.525-30.699l-936.229-936.229c-7.941-7.931-18.905-12.837-31.015-12.837-24.237 0-43.886 19.648-43.886 43.886 0 12.11 4.906 23.074 12.837 31.015l172.365 172.364zM710.276 772.342c-6.801 1.887-14.611 2.972-22.674 2.972-0.021 0-0.041 0-0.063 0h-351.083c-48.474 0-87.771-39.297-87.771-87.771v0-351.086c0-0.021 0-0.044 0-0.069 0-8.060 1.085-15.867 3.117-23.283l-0.144 0.617 84.798 84.801v230.505c0 32.316 26.198 58.515 58.515 58.515v0h230.505zM687.543 394.972v163.425l-221.938-221.938h163.425c32.316 0 58.515 26.198 58.515 58.515v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Hide system metrics-01-01"],"grid":0},"attrs":[],"properties":{"order":527,"id":25,"name":"hide-system-metrics","prevSize":32,"code":59754},"setIdx":0,"setId":1,"iconIdx":26},{"icon":{"paths":["M380.343 43.886c0-24.237-19.648-43.886-43.886-43.886s-43.886 19.648-43.886 43.886v0 122.559c-61.916 16.423-109.703 64.212-125.849 124.899l-0.278 1.227h-122.559c-24.237 0-43.886 19.648-43.886 43.886s19.648 43.886 43.886 43.886v0h117.028v87.771h-117.028c-24.237 0-43.886 19.648-43.886 43.886s19.648 43.886 43.886 43.886v0h117.028v87.771h-117.028c-24.237 0-43.886 19.648-43.886 43.886s19.648 43.886 43.886 43.886v0h122.559c16.423 61.916 64.21 109.705 124.899 125.849l1.227 0.278v122.558c0 24.237 19.648 43.886 43.886 43.886s43.886-19.648 43.886-43.886v0-117.028h87.771v117.028c0 24.237 19.648 43.886 43.886 43.886s43.886-19.648 43.886-43.886v0-117.028h87.771v117.028c0 24.237 19.648 43.886 43.886 43.886s43.886-19.648 43.886-43.886v0-122.558c61.917-16.423 109.705-64.21 125.849-124.9l0.278-1.227h122.558c24.237 0 43.886-19.648 43.886-43.886s-19.648-43.886-43.886-43.886v0h-117.028v-87.771h117.028c24.237 0 43.886-19.648 43.886-43.886s-19.648-43.886-43.886-43.886v0h-117.028v-87.771h117.028c24.237 0 43.886-19.648 43.886-43.886s-19.648-43.886-43.886-43.886v0h-122.558c-16.423-61.916-64.212-109.705-124.9-125.849l-1.227-0.278v-122.559c0-24.237-19.648-43.886-43.886-43.886s-43.886 19.648-43.886 43.886v0 117.028h-87.771v-117.028c0-24.237-19.648-43.886-43.886-43.886s-43.886 19.648-43.886 43.886v0 117.028h-87.771zM248.686 336.457c0-48.475 39.297-87.771 87.771-87.771v0h351.086c48.475 0 87.771 39.297 87.771 87.771v0 351.086c0 48.475-39.297 87.771-87.771 87.771v0h-351.086c-48.475 0-87.771-39.297-87.771-87.771v0zM394.972 336.457c-32.316 0-58.515 26.198-58.515 58.515v0 234.058c0 32.316 26.198 58.515 58.515 58.515v0h234.058c32.316 0 58.515-26.198 58.515-58.515v0-234.058c0-32.316-26.198-58.515-58.515-58.515v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Show system metrics-01"],"grid":0},"attrs":[],"properties":{"order":528,"id":26,"name":"show-system-metrics","prevSize":32,"code":59755},"setIdx":0,"setId":1,"iconIdx":27},{"icon":{"paths":["M972.952 52.048c-31.501-31.498-75.001-50.996-123.054-51.050h-522.349c-0.154 0-0.336-0.002-0.517-0.002-88.525 0-161.485 66.645-171.443 152.499l-0.076 0.803c-87.683 8.967-155.511 82.426-155.511 171.726 0 0.186 0 0.373 0.002 0.559v-0.029 522.373c0.673 95.854 78.234 173.369 174.042 173.969l522.406 0.104c0.159 0 0.345 0.002 0.532 0.002 88.522 0 161.478-66.646 171.428-152.499l0.076-0.803c87.683-8.958 155.514-82.412 155.514-171.711 0-0.192 0-0.384-0.002-0.576v0.030-522.335c-0.057-48.062-19.554-91.559-51.047-123.061v0zM760.27 848.892c-0.041 35.232-28.59 63.782-63.817 63.826l-522.354-0.112c-35.203-0.024-63.738-28.534-63.805-63.723v-522.325c0.036-35.232 28.585-63.784 63.814-63.823h522.343c35.232 0.039 63.782 28.59 63.821 63.818v0.005zM913.705 697.445c-0.018 17.619-7.163 33.564-18.71 45.113v0c-6.72 6.462-14.896 11.461-23.986 14.452l-0.446 0.127v-430.582c-0.106-96.116-77.995-174.005-174.102-174.111h-428.204c9.027-24.22 31.958-41.158 58.845-41.158 0.157 0 0.313 0 0.469 0.002h522.311c35.232 0.038 63.782 28.59 63.818 63.818v0.003zM608.258 496.856c-9.769-9.781-16.124-22.974-17.122-37.64l-0.011-0.181c-0.014-0.469-0.023-1.020-0.023-1.574 0-7.567 1.489-14.786 4.189-21.381l-0.136 0.376c2.911-7.136 7.027-13.222 12.15-18.291l0.005-0.005c5.115-5.13 11.228-9.263 18.024-12.083l0.367-0.135c5.487-2.601 11.922-4.121 18.71-4.121 0.996 0 1.983 0.033 2.963 0.097l-0.133-0.008c23.166 0.051 43.025 14.157 51.507 34.24l0.138 0.367c2.709 6.335 4.282 13.705 4.282 21.445s-1.575 15.11-4.42 21.81l0.138-0.366c-5.809 13.775-16.535 24.521-29.926 30.218l-0.367 0.139c-6.299 2.689-13.628 4.252-21.321 4.252-0.054 0-0.109 0-0.163 0h0.009c-15.221-0.803-28.81-7.204-38.867-17.164l0.005 0.005zM736.867 764.15c-0.615 22.055-18.372 39.766-40.386 40.307l-0.051 0.002c-11.053-0.132-21.104-4.311-28.764-11.124l0.045 0.039-103.353-103.415-22.359 21.287 33.254 36.529c7.52 7.541 12.301 17.817 12.72 29.208l0.003 0.079c0.002 0.144 0.003 0.313 0.003 0.482 0 22.725-18.421 41.146-41.146 41.146-10.743 0-20.523-4.116-27.851-10.858l0.029 0.027-3.526-3.842-87.734-96.173v0.503l-65.12-71.799-65.061 71.799v-0.503l-91.258 100.016c-7.299 6.731-17.090 10.859-27.843 10.859-22.713 0-41.127-18.412-41.127-41.127 0-10.377 3.844-19.857 10.185-27.093l-0.041 0.047 166.020-182.426c12.127-13.324 29.515-21.679 48.855-21.761h0.015l3.842-0.030 0.314 0.189c17.998 1.019 33.924 9.127 45.172 21.549l0.050 0.056 74.824 82.346 32.435-30.924c11.826-11.31 27.894-18.27 45.587-18.27 18.294 0 34.849 7.441 46.804 19.464l0.003 0.003 112.108 112.297c8.209 7.851 13.321 18.882 13.352 31.108v0.006z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["z-axis icon-01"],"grid":0},"attrs":[],"properties":{"order":529,"id":27,"name":"images-stacking","prevSize":32,"code":59753},"setIdx":0,"setId":1,"iconIdx":28},{"icon":{"paths":["M998.547 412.341c-11.015-20.783-26.644-37.801-45.599-50.137l-0.516-0.316c-17.213-11.111-37.343-19.494-58.909-23.948l-1.144-0.197c-18.080-4.177-38.888-6.65-60.247-6.809h-0.113c-0.378-0.001-0.824-0.003-1.272-0.003-28.836 0-56.612 4.53-82.66 12.917l1.908-0.531c-26.766 8.32-49.844 21.698-69.184 39.142l0.162-0.144c-20.242 18.734-35.782 42.256-44.845 68.78l-0.349 1.178 86.977 19.809c8.276-18.559 20.852-33.918 36.512-45.283l0.321-0.223c18.733-13.094 41.987-20.924 67.069-20.924 2.32 0 4.627 0.068 6.913 0.199l-0.317-0.014c2.094-0.169 4.532-0.265 6.994-0.265 23.188 0 44.379 8.541 60.602 22.647l-0.113-0.096c14.278 14.975 23.062 35.296 23.062 57.669 0 1.817-0.058 3.621-0.172 5.41l0.013-0.244v2.168c0.051 0.611 0.080 1.323 0.080 2.043 0 9.252-4.8 17.383-12.048 22.037l-0.104 0.062c-11.242 5.857-24.401 9.738-38.346 10.813l-0.348 0.021q-26.616 3.094-69.333 8.046c-25.732 3.085-48.232 7.214-70.244 12.59l4.004-0.827c-22.247 5.209-41.865 13.090-59.863 23.468l1.055-0.561c-17.391 10.040-31.514 23.963-41.502 40.647l-0.289 0.52c-9.805 17.672-15.575 38.755-15.575 61.184 0 1.778 0.037 3.548 0.108 5.309l-0.008-0.252c-0.049 1.385-0.076 3.012-0.076 4.647 0 27.503 7.864 53.169 21.467 74.873l-0.345-0.59c14.354 21.386 33.971 38.218 57.032 48.859l0.854 0.354c23.193 10.577 50.303 16.741 78.853 16.741 1.007 0 2.012-0.007 3.015-0.023l-0.152 0.001c1.293 0.034 2.816 0.052 4.344 0.052 22.686 0 44.385-4.22 64.357-11.918l-1.224 0.414c17.849-6.973 33.163-16.718 46.205-28.87l-0.086 0.079c10.706-9.986 19.692-21.639 26.585-34.576l0.345-0.71h3.712v65.008h90.382v-315.722c0.096-2.156 0.151-4.683 0.151-7.225 0-28.154-6.687-54.746-18.559-78.273l0.456 0.996zM923.947 641.086c0 0.066 0 0.144 0 0.223 0 19.458-5.409 37.654-14.805 53.165l0.258-0.458c-10.148 16.829-24.318 30.304-41.216 39.339l-0.571 0.279c-17.914 9.59-39.189 15.223-61.777 15.223-1.35 0-2.695-0.020-4.035-0.061l0.196 0.004c-1.374 0.061-2.987 0.094-4.607 0.094-22.293 0-43.069-6.495-60.538-17.696l0.448 0.269c-15.477-10.843-25.472-28.595-25.472-48.682 0-1.168 0.034-2.328 0.1-3.477l-0.007 0.159c-0.046-0.875-0.075-1.899-0.075-2.929 0-13.965 4.933-26.779 13.151-36.793l-0.080 0.101c9.42-10.367 21.286-18.342 34.694-23.033l0.592-0.18c14.234-5.209 30.877-9.231 48.11-11.343l1.11-0.111q11.453-1.547 28.475-3.714 17.022-2.475 34.973-5.261c12.731-2.13 23.482-4.604 33.997-7.64l-2.113 0.523c7.371-1.747 13.816-4.971 19.284-9.359l-0.094 0.073z","M220.772 178.644l-228.125 633.92h101.531l58.058-167.765h247.68l57.958 167.765h101.525l-228.125-633.92zM180.087 564.32l93.619-270.527h4.949l93.462 270.527z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Aa-01"],"grid":0},"attrs":[],"properties":{"order":530,"id":28,"name":"case-sensitive","prevSize":32,"code":59750},"setIdx":0,"setId":1,"iconIdx":29},{"icon":{"paths":["M167.915 821.465c-0.793 0.013-1.729 0.021-2.667 0.021-24.453 0-47.709-5.123-68.754-14.353l1.101 0.431c-20.376-9.208-37.073-23.5-48.935-41.293l-0.263-0.419c-11.291-18.144-17.984-40.165-17.984-63.751 0-1.464 0.025-2.922 0.078-4.375l-0.006 0.21c-0.052-1.297-0.082-2.819-0.082-4.348 0-19.409 4.777-37.703 13.22-53.768l-0.304 0.634c8.524-15.062 20.369-27.336 34.598-36.119l0.428-0.246c14.389-8.863 31.059-15.939 48.786-20.334l1.213-0.254c16.328-4.399 36.047-8.071 56.207-10.272l1.816-0.161q36.096-3.741 58.556-6.68c12.095-1.117 23.166-4.549 33.086-9.853l-0.466 0.227c6.339-4.107 10.474-11.144 10.474-19.148 0-0.507-0.017-1.009-0.049-1.508l0.004 0.068v-1.608c0.071-1.097 0.112-2.38 0.112-3.672 0-16.869-6.895-32.129-18.020-43.112l-0.006-0.006c-12.569-10.422-28.865-16.745-46.636-16.745-1.748 0-3.481 0.061-5.198 0.182l0.232-0.013c-1.478-0.085-3.208-0.133-4.948-0.133-19.19 0-37.016 5.845-51.793 15.851l0.326-0.208c-12.627 9.051-22.269 21.539-27.635 36.096l-0.172 0.534-90.374-12.836c6.702-24.484 18.944-45.56 35.339-62.613l-0.045 0.048c16.386-16.751 36.534-29.75 59.084-37.638l1.077-0.328c22.595-8.144 48.669-12.853 75.844-12.853 0.971 0 1.941 0.006 2.911 0.018l-0.147-0.001c20.973 0.014 41.346 2.55 60.844 7.32l-1.753-0.363c20.387 4.807 38.346 12.74 54.356 23.375l-0.613-0.383c16.447 10.88 29.664 25.382 38.735 42.426l0.302 0.624c9.494 18.408 15.061 40.173 15.061 63.239 0 1.738-0.031 3.469-0.095 5.191l0.007-0.25v274.866h-93.047v-56.417h-3.208c-6.661 12.435-14.959 23.036-24.775 32.005l-0.092 0.082c-11.187 10.115-24.435 18.198-39.008 23.527l-0.832 0.265c-15.671 5.613-33.75 8.859-52.587 8.859-1.159 0-2.314-0.013-3.467-0.037l0.172 0.003zM193.048 750.346c0.784 0.021 1.705 0.032 2.632 0.032 17.488 0 33.978-4.264 48.491-11.808l-0.584 0.277c13.69-7.35 24.823-17.881 32.678-30.647l0.21-0.368c7.386-11.797 11.767-26.129 11.767-41.485 0-0.174 0-0.346-0.001-0.52v0.027-48.4c-4.423 3.12-9.607 5.519-15.196 6.887l-0.312 0.065c-6.363 1.982-14.468 3.93-22.732 5.416l-1.331 0.199q-13.372 2.41-26.471 4.283t-22.728 3.205c-14.447 1.851-27.538 5.226-39.925 10.018l1.155-0.392c-10.79 3.987-19.88 10.41-26.932 18.634l-0.072 0.086c-6.182 8.413-9.894 18.976-9.894 30.405 0 16.336 7.581 30.901 19.416 40.369l0.103 0.079c13.050 8.593 29.054 13.708 46.252 13.708 1.223 0 2.44-0.025 3.649-0.078l-0.172 0.006zM486.364 813.176v-547.594h96.792v204.813h4.012c6.335-12.096 13.347-22.525 21.347-32.098l-0.229 0.282c10.026-12.061 22.31-21.867 36.253-28.854l0.648-0.294c15.967-7.818 34.746-12.39 54.593-12.39 1.677 0 3.347 0.032 5.008 0.097l-0.239-0.007c0.594-0.008 1.295-0.013 1.998-0.013 31.104 0 60.088 9.075 84.449 24.721l-0.623-0.374c26.677 17.456 47.591 41.72 60.545 70.355l0.419 1.035c14.435 31.605 22.849 68.554 22.849 107.466 0 2.828-0.044 5.644-0.133 8.451l0.010-0.409c0.069 2.279 0.109 4.961 0.109 7.65 0 38.811-8.207 75.703-22.979 109.039l0.68-1.72c-13.333 29.809-34.033 54.288-59.838 71.814l-0.59 0.378c-23.822 15.604-53.006 24.888-84.359 24.888-0.799 0-1.597-0.006-2.393-0.018l0.12 0.001c-1.343 0.049-2.918 0.079-4.501 0.079-19.608 0-38.195-4.367-54.844-12.182l0.791 0.333c-14.671-7.177-27.1-16.698-37.33-28.218l-0.107-0.123c-7.933-9.315-15.113-19.736-21.175-30.856l-0.479-0.96h-5.615v64.705zM581.282 607.828c-0.024 1.153-0.038 2.512-0.038 3.874 0 23.624 4.128 46.283 11.701 67.297l-0.435-1.384c6.8 18.832 18.13 34.638 32.706 46.645l0.182 0.147c14.692 10.371 32.969 16.577 52.697 16.577 20.054 0 38.61-6.414 53.729-17.3l-0.272 0.186c14.763-12.281 26.027-28.288 32.393-46.587l0.224-0.74c7.121-20.502 11.233-44.132 11.233-68.722 0-24.289-4.012-47.641-11.411-69.429l0.448 1.52c-6.546-18.8-17.825-34.56-32.431-46.369l-0.193-0.151c-14.99-10.542-33.624-16.848-53.73-16.848-19.775 0-38.123 6.099-53.27 16.519l0.318-0.206c-14.863 11.671-26.226 27.169-32.668 45.020l-0.22 0.699c-6.974 19.403-11.006 41.792-11.006 65.123 0 1.451 0.016 2.9 0.047 4.344l-0.004-0.215zM30.118 150.588h963.766c16.633 0 30.117 13.484 30.117 30.117v0 0c0 16.633-13.484 30.117-30.117 30.117v0h-963.766c-16.633 0-30.117-13.484-30.117-30.117v0 0c0-16.633 13.484-30.117 30.117-30.117v0zM1024.001 301.177v481.882c0 16.633-13.484 30.117-30.117 30.117v0 0c-16.633 0-30.117-13.484-30.117-30.117v0-481.882c0-16.633 13.484-30.117 30.117-30.117v0 0c16.633 0 30.117 13.484 30.117 30.117v0zM30.118 873.412h963.766c16.633 0 30.117 13.484 30.117 30.117v0 0c0 16.633-13.484 30.117-30.117 30.117v0h-963.766c-16.633 0-30.117-13.484-30.117-30.117v0 0c0-16.633 13.484-30.117 30.117-30.117v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Match Whole Word_ic-01"],"grid":0},"attrs":[],"properties":{"order":531,"id":29,"name":"word-match","prevSize":32,"code":59751},"setIdx":0,"setId":1,"iconIdx":30},{"icon":{"paths":["M36.571 804.573h146.285c21.943 0 36.571 14.628 36.571 36.571v146.285c0 21.943-14.628 36.571-36.571 36.571h-146.285c-21.943 0-36.571-14.628-36.571-36.571v-146.285c0-21.943 14.628-36.571 36.571-36.571zM746.057 131.656c0-29.258-21.943-58.514-58.514-58.514s-58.514 21.943-58.514 58.514v138.972l-102.4-102.4c-21.943-21.943-58.514-21.943-80.457 0s-21.943 58.514 0 80.457l102.4 102.4h-138.972c-29.258 0-58.514 21.943-58.514 58.514s21.943 58.514 58.514 58.514h138.972l-102.4 102.4c-21.943 21.943-21.943 58.514 0 80.457s58.514 21.943 80.457 0l102.4-102.4v138.972c0 29.258 21.943 58.514 58.514 58.514s58.514-21.943 58.514-58.514v-138.972l102.4 102.4c21.943 21.943 58.514 21.943 80.457 0s21.943-58.514 0-80.457l-102.4-102.4h138.972c29.258 0 58.514-21.943 58.514-58.514s-21.943-58.514-58.514-58.514h-138.972l102.4-102.4c21.943-21.943 21.943-58.514 0-80.457s-58.514-21.943-80.457 0l-102.4 102.4v-138.972z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Use Regular Expression_ic"],"grid":0},"attrs":[],"properties":{"order":532,"id":30,"name":"regex","prevSize":32,"code":59752},"setIdx":0,"setId":1,"iconIdx":31},{"icon":{"paths":["M908.386 132.131v0c9.122 0 16.517 7.395 16.517 16.517v66.065c0 9.122-7.395 16.517-16.517 16.517h-792.772c-9.122 0-16.517-7.395-16.517-16.517v-66.065c0-9.122 7.395-16.517 16.517-16.517zM0.001 214.71v-0.002c0 0.008 0 0.015 0 0.025 0 45.849 26.686 85.466 66.065 104.465v556.156c0 63.851 51.761 115.613 115.613 115.613h660.644c63.851 0 115.613-51.761 115.613-115.613v-556.156l0.691-0.3c38.688-18.698 65.374-58.317 65.374-104.166 0-0.006 0-0.014 0-0.020v-66.065c0-63.851-51.761-115.613-115.613-115.613h-792.772c-63.851 0-115.613 51.761-115.613 115.613zM165.162 330.324h693.676v545.031c0 9.122-7.395 16.517-16.517 16.517v0h-660.644c-9.122 0-16.517-7.395-16.517-16.517v0zM344.835 646.13l0.008 0.008c-8.781-8.94-14.197-21.196-14.197-34.718 0-27.365 22.184-49.548 49.548-49.548 13.522 0 25.779 5.416 34.712 14.191l47.546 47.54v-144.634c0-27.365 22.184-49.548 49.548-49.548s49.548 22.184 49.548 49.548v144.634l47.538-47.532c8.936-8.753 21.173-14.149 34.67-14.149 27.365 0 49.548 22.184 49.548 49.548 0 13.497-5.396 25.733-14.141 34.661l-132.128 132.128c-8.965 8.967-21.352 14.513-35.034 14.513s-26.069-5.546-35.034-14.513z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Archive_ic-01"],"grid":0},"attrs":[],"properties":{"order":533,"id":31,"name":"archive","prevSize":32,"code":59727},"setIdx":0,"setId":1,"iconIdx":32},{"icon":{"paths":["M420.030 381.54l110.147 110.147c7.41 7.463 11.99 17.746 11.99 29.098 0 22.809-18.49 41.301-41.301 41.301-11.353 0-21.634-4.58-29.1-11.993l-39.635-39.624v120.572c0 22.812-18.493 41.305-41.305 41.305s-41.305-18.493-41.305-41.305v0-120.572l-39.635 39.627c-7.444 7.291-17.644 11.79-28.895 11.79-22.812 0-41.305-18.493-41.305-41.305 0-11.251 4.499-21.45 11.794-28.899l-0.007 0.008 110.151-110.147c7.474-7.475 17.799-12.099 29.203-12.099s21.73 4.624 29.203 12.099v0zM949.363 832.079l-49.802 23.609c-12.020 5.87-26.157 9.305-41.094 9.305-0.034 0-0.070 0-0.105 0h0.005c-0.023 0-0.046 0-0.073 0-38.171 0-71.165-22.172-86.803-54.34l-0.252-0.574-10.586-22.256c-9.217 44.387-47.996 77.267-94.457 77.276h-550.737c-53.229 0-96.38-43.15-96.38-96.38v0-468.127c0-53.229 43.15-96.38 96.38-96.38v0h368.622c-3.743-9.827-5.912-21.191-5.912-33.063 0-37.967 22.178-70.755 54.284-86.116l0.575-0.248 49.64-23.638c12.105-5.87 26.328-9.303 41.354-9.303 38.199 0 71.22 22.182 86.881 54.365l0.252 0.574 283.868 596.801c5.863 12.099 9.289 26.315 9.289 41.333 0 38.209-22.186 71.237-54.378 86.903l-0.574 0.252zM679.963 618.207l-157.628-331.377h-406.878c-7.603 0-13.769 6.165-13.769 13.769v0 468.127c0 7.603 6.165 13.769 13.769 13.769v0h550.736c0.001 0 0.003 0 0.004 0 7.602 0 13.765-6.163 13.765-13.765 0-0.001 0-0.003 0-0.004v0zM920.372 739.089l-283.865-596.801c-2.248-4.695-6.96-7.879-12.417-7.879-2.154 0-4.192 0.495-6.005 1.38l0.081-0.036-49.695 23.663c-4.697 2.221-7.887 6.92-7.887 12.365 0 2.175 0.509 4.23 1.414 6.054l-0.036-0.079 283.865 596.828c1.576 3.286 4.331 5.796 7.703 7.015l0.095 0.029c1.363 0.482 2.935 0.762 4.573 0.762 2.146 0 4.18-0.48 6.001-1.337l-0.030-0.019 49.749-23.609c4.666-2.244 7.83-6.934 7.83-12.362 0-2.175-0.507-4.232-1.412-6.058l0.036 0.079z"],"width":1008,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Unarchive_ic-01"],"grid":0},"attrs":[],"properties":{"order":534,"id":32,"name":"unarchive","prevSize":32,"code":59749},"setIdx":0,"setId":1,"iconIdx":33},{"icon":{"paths":["M831.999 1023.999h-640c-108.799 0-192-83.2-192-192v-640c0-108.799 83.2-192 192-192h640c108.799 0 192 83.2 192 192v640c0 108.799-83.2 192-192 192zM192.001 96.001c-51.199 0-96 44.8-96 96v640c0 51.199 44.8 96 96 96h640c51.199 0 96-44.8 96-96v-640c0-51.199-44.8-96-96-96h-640zM819.2 512c0 25.6-19.2 51.199-51.199 51.199h-511.999c-25.6 0-51.199-19.2-51.199-51.199s19.2-51.199 51.199-51.199h511.999c25.6 0 51.199 25.6 51.199 51.199z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Type=Outlined Box with -","State=Default"],"grid":0},"attrs":[],"properties":{"order":535,"id":33,"name":"partially-selected","prevSize":32,"code":59748},"setIdx":0,"setId":1,"iconIdx":34},{"icon":{"paths":["M117.756 36.965c0-0.051 0-0.112 0-0.173 0-28.4-23.022-51.422-51.42-51.422v0c-7.296 0.686-13.994 2.074-20.399 4.118l0.679-0.187c-18.772 7.942-31.703 26.205-31.703 47.49 0 0.060 0 0.122 0 0.182v-0.010 783.867c0.004 104.126 84.416 188.536 188.541 188.538h783.752c28.398 0 51.419-23.021 51.419-51.419s-23.021-51.419-51.419-51.419h-783.752c-0.001 0-0.003 0-0.004 0-47.329 0-85.696-38.368-85.696-85.696 0-0.001 0-0.003 0-0.003v0zM945.574 314.704l-672.914 438.853c-6.813 4.564-15.195 7.285-24.214 7.285-24.237 0-43.886-19.648-43.886-43.886 0-15.42 7.953-28.982 19.98-36.809l0.17-0.103 672.914-438.861c6.761-4.468 15.057-7.127 23.975-7.127 24.239 0 43.887 19.65 43.887 43.887 0 15.32-7.85 28.808-19.749 36.658l-0.165 0.101zM810.41 231.132c35.476-0.092 64.201-28.873 64.201-64.362 0-35.469-28.69-64.236-64.129-64.362h-0.012c-0.285-0.004-0.62-0.007-0.957-0.007-34.726 0-62.938 27.895-63.449 62.499v0.048c-0.005 0.605-0.005 1.212 0 1.82 2.414 34.528 29.822 61.943 64.129 64.353l0.219 0.012zM459.325 465.189c35.476-0.092 64.201-28.873 64.201-64.362 0-35.469-28.69-64.236-64.129-64.362h-0.012c-0.285-0.004-0.62-0.007-0.957-0.007-34.726 0-62.938 27.895-63.449 62.499v0.048c-0.008 0.602-0.008 1.211 0 1.82 2.412 34.528 29.822 61.943 64.129 64.353l0.219 0.012zM225.269 582.217c35.226-0.42 63.622-29.074 63.622-64.361 0-35.549-28.818-64.365-64.365-64.365-8.497 0-16.609 1.647-24.036 4.638l0.432-0.154c-23.362 9.471-39.616 31.819-40.002 58.010v0.048c-0.005 0.602-0.005 1.211 0.001 1.82 2.408 34.53 29.82 61.947 64.129 64.353l0.218 0.012zM488.571 863.086c0.008 0 0.016 0 0.026 0 35.545 0 64.36-28.815 64.36-64.36 0-35.535-28.8-64.345-64.332-64.36h-0.001c-0.288-0.004-0.627-0.007-0.967-0.007-34.72 0-62.928 27.893-63.433 62.495v0.048q-0.018 0.913 0 1.825c2.41 34.528 29.822 61.943 64.129 64.347l0.218 0.012zM664.126 699.245c35.229-0.417 63.627-29.073 63.627-64.361 0-35.549-28.818-64.365-64.365-64.365-8.497 0-16.609 1.647-24.036 4.638l0.432-0.154c-23.362 9.471-39.618 31.819-40.006 58.010v0.048c-0.005 0.602-0.005 1.211 0 1.82 2.412 34.528 29.822 61.943 64.129 64.353l0.219 0.012zM576.354 231.132c35.476-0.092 64.201-28.873 64.201-64.362 0-35.469-28.69-64.236-64.129-64.362h-0.012c-0.285-0.004-0.62-0.007-0.957-0.007-34.726 0-62.938 27.895-63.449 62.499v0.048c-0.005 0.605-0.005 1.212 0 1.82 2.414 34.528 29.822 61.943 64.129 64.353l0.219 0.012zM927.44 640.732c35.229-0.417 63.627-29.073 63.627-64.361 0-35.549-28.818-64.365-64.365-64.365-8.497 0-16.609 1.647-24.036 4.638l0.432-0.154c-23.362 9.471-39.618 31.819-40.006 58.010v0.048c-0.005 0.602-0.005 1.211 0 1.82 2.412 34.528 29.822 61.943 64.129 64.353l0.219 0.012z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Trendline_ic-01"],"grid":0},"attrs":[],"properties":{"order":536,"id":34,"name":"trendline","prevSize":32,"code":59743},"setIdx":0,"setId":1,"iconIdx":35},{"icon":{"paths":["M383.301 538.559c-56.692 0-102.674 45.978-102.674 102.67v256.829c0 56.692 45.981 102.67 102.674 102.67s102.675-45.978 102.675-102.67v-256.829c-0.042-56.692-46.024-102.67-102.675-102.67z","M24.017 641.224c0 56.734 46.022 102.758 102.756 102.758s102.755-46.024 102.755-102.758v-102.754h-102.674c-0.041 0-0.041 0-0.081 0-56.733 0-102.756 46.024-102.756 102.754z","M383.405 23.273c-0.040 0-0.081 0-0.122 0-56.733 0-102.754 46.022-102.754 102.755s46.021 102.755 102.754 102.755h102.675v-102.755c0-0.041 0-0.122 0-0.204-0.042-56.651-45.942-102.551-102.553-102.551z","M126.027 486.377h257.315c56.733 0 102.755-46.020 102.755-102.753s-46.022-102.755-102.755-102.755h-257.315c-56.733 0-102.755 46.022-102.755 102.755s46.022 102.753 102.755 102.753z","M897.098 280.83c-56.655 0-102.554 45.899-102.554 102.551v102.959h102.675c56.734 0 102.754-46.022 102.754-102.755s-46.019-102.755-102.754-102.755c-0.042 0-0.084 0-0.121 0z","M537.982 126.032v257.601c0 56.692 45.982 102.675 102.675 102.675s102.675-45.982 102.675-102.675v-257.601c0-56.692-45.982-102.674-102.675-102.674s-102.675 45.981-102.675 102.674z","M743.331 897.983c0-56.697-45.982-102.675-102.675-102.675h-102.675v102.754c0.042 56.65 45.982 102.591 102.675 102.591s102.675-45.978 102.675-102.67z","M897.955 538.47h-257.313c-56.734 0-102.758 46.024-102.758 102.754 0 56.734 46.024 102.758 102.758 102.758h257.313c56.734 0 102.754-46.024 102.754-102.758 0-56.73-46.019-102.754-102.754-102.754z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Slack"],"grid":0},"attrs":[],"properties":{"order":543,"id":35,"name":"slack","prevSize":32,"code":59744},"setIdx":0,"setId":1,"iconIdx":36},{"icon":{"paths":["M512-0c282.769 0 512 229.231 512 512s-229.231 512-512 512c-282.769 0-512-229.231-512-512s229.231-512 512-512z","M343.716 500.070c-14.444-17.022-39.952-19.113-56.972-4.67-17.022 14.444-19.113 39.952-4.67 56.975l61.642-52.304zM445.636 682.666l-30.822 26.152c7.68 9.051 18.949 14.269 30.822 14.269 11.871 0 23.139-5.217 30.82-14.269l-30.82-26.152zM741.939 395.929c14.441-17.022 12.352-42.531-4.67-56.972-17.022-14.444-42.531-12.352-56.975 4.67l61.645 52.302zM282.075 552.376l132.74 156.443 61.642-52.302-132.74-156.445-61.642 52.304zM476.456 708.818l265.483-312.889-61.645-52.302-265.48 312.889 61.642 52.302z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"25525525516868681":[],"20115230165751091":[]},"tags":["successIcon"],"grid":0},"attrs":[],"properties":{"order":393,"id":36,"name":"success-icon","prevSize":32,"code":59745,"codes":[59745,59746]},"setIdx":0,"setId":1,"iconIdx":37},{"icon":{"paths":["M512 0c-281.6 0-512 230.4-512 512s230.4 512 512 512 512-230.4 512-512-230.4-512-512-512zM563.2 736c0 25.601-19.2 51.2-51.2 51.2s-51.2-19.2-51.2-51.2v-256.001c0-25.601 19.2-51.2 51.2-51.2s51.2 19.2 51.2 51.2v256.001zM512 351.999c-38.4 0-64.001-25.601-64.001-64.001s25.601-64.001 64.001-64.001 64.001 25.601 64.001 64.001-25.601 64.001-64.001 64.001z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Type=Circle","State=Default"],"grid":0},"attrs":[],"properties":{"order":537,"id":37,"name":"circle-info","prevSize":32,"code":59726},"setIdx":0,"setId":1,"iconIdx":38},{"icon":{"paths":["M895.337 1023.115h-766.673c-44.723 0-83.057-25.556-108.612-63.89s-25.556-83.057-6.389-127.778l383.337-741.117c19.167-44.723 63.89-70.278 115.001-70.278 0 0 0 0 0 0 51.111 0 89.445 25.556 115.001 70.278l383.337 741.117c19.167 38.334 19.167 89.445-6.389 127.778-19.167 38.334-63.89 63.89-108.612 63.89zM512 122.274c-6.389 0-19.167 0-25.556 19.167l-383.337 741.117c-6.389 12.777 0 25.556 0 31.944s12.777 12.777 25.556 12.777h766.673c19.167 0 25.556-12.777 25.556-12.777s6.389-19.167 0-31.944l-383.337-741.117c-6.389-19.167-19.167-19.167-25.556-19.167v0zM512 307.554c-25.556 0-51.111 19.167-51.111 51.111v255.558c0 25.556 19.167 51.111 51.111 51.111s51.111-19.167 51.111-51.111v-255.558c0-31.944-25.556-51.111-51.111-51.111zM512 863.393c-38.334 0-63.89-25.556-63.89-63.89s25.556-63.89 63.89-63.89 63.89 25.556 63.89 63.89-25.556 63.89-63.89 63.89z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"25525525516868681":[],"2011523012552552551":[],"20115230165751091":[]},"tags":["Type=Triangle Outline","State=Default"],"grid":0},"attrs":[],"properties":{"order":576,"id":38,"name":"warning-outline","prevSize":32,"code":59746},"setIdx":0,"setId":1,"iconIdx":39},{"icon":{"paths":["M1009.459 837.262l-382.661-739.812c-51.021-95.665-178.576-95.665-229.597-6.378l-382.661 739.812c-44.644 89.287 19.133 191.33 114.798 191.33h765.323c95.665 0 159.443-102.043 114.798-184.952zM460.979 352.557c0-25.511 19.133-51.021 51.021-51.021s51.021 19.133 51.021 51.021v255.108c0 25.511-19.133 51.021-51.021 51.021s-51.021-19.133-51.021-51.021v-255.108zM512 862.773c-38.266 0-63.777-25.511-63.777-63.777s25.511-63.777 63.777-63.777 63.777 25.511 63.777 63.777-25.511 63.777-63.777 63.777z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"25525525516868681":[],"2011523012552552551":[],"20115230165751091":[]},"tags":["Type=Triangle","State=Default"],"grid":0},"attrs":[],"properties":{"order":575,"id":39,"name":"warning-contained","prevSize":32,"code":59742},"setIdx":0,"setId":1,"iconIdx":40},{"icon":{"paths":["M931.57 6.848c-5.078-2.28-11-3.609-17.235-3.609-23.776 0-43.047 19.27-43.047 43.047 0 17.542 10.49 32.625 25.544 39.344l0.269 0.114c165.597 73.647 278.976 236.71 278.976 426.265s-113.38 352.62-276.009 425.079l-2.967 1.187c-15.324 6.814-25.814 21.897-25.814 39.44 0 23.777 19.272 43.047 43.047 43.047 6.234 0 12.155-1.328 17.502-3.704l-0.269 0.114c196.24-87.272 330.581-280.523 330.581-505.144s-134.36-417.871-327.080-503.748l-3.502-1.396zM609.561 975.91v-927.84c-0.002-23.774-19.272-43.043-43.046-43.043-10.877 0-20.806 4.025-28.381 10.687l-334.948 293.086h-117.097c-47.551 0-86.093 38.542-86.093 86.093v0 234.21c0 47.551 38.542 86.093 86.093 86.093v0h117.095l335.001 293.113c7.522 6.612 17.472 10.639 28.348 10.639 23.776 0 43.046-19.27 43.046-43.046v0zM827.84 173.24c7.139-14.445 21.794-24.215 38.71-24.215 6.859 0 13.34 1.599 19.084 4.453l-0.251-0.118c133.917 66.197 224.376 201.844 224.376 358.617s-90.48 292.418-222.061 357.581l-2.336 1.035c-5.491 2.737-11.973 4.335-18.832 4.335-23.776 0-43.047-19.272-43.047-43.047 0-16.918 9.752-31.552 23.963-38.594l0.251-0.118c105.010-51.898 175.969-158.274 175.969-281.212s-70.959-229.314-174.137-280.392l-1.831-0.82c-14.445-7.139-24.215-21.794-24.215-38.712 0-6.859 1.599-13.34 4.453-19.084l-0.118 0.251zM834.306 298.723c-6.185-3.644-13.652-5.804-21.605-5.804-23.776 0-43.046 19.27-43.046 43.046 0 15.849 8.576 29.705 21.326 37.183l0.2 0.116c48.221 28.221 80.113 79.755 80.113 138.751s-31.875 110.529-79.356 138.331l-0.759 0.401c-12.932 7.579-21.494 21.427-21.494 37.264 0 23.777 19.272 43.049 43.049 43.049 7.94 0 15.376-2.152 21.753-5.899l-0.199 0.114c74.1-43.383 123.096-122.607 123.096-213.277s-48.978-169.874-121.92-212.645l-1.155-0.632z"],"width":1280,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Voice_On-01"],"grid":0},"attrs":[],"properties":{"order":574,"id":40,"name":"voice-on","prevSize":32,"code":59738},"setIdx":0,"setId":1,"iconIdx":41},{"icon":{"paths":["M609.086 48.452v927.093c-0.002 23.75-19.256 43.005-43.007 43.005-10.871 0-20.79-4.033-28.366-10.682l-334.685-292.844h-117.012c-47.504 0-86.023-38.511-86.023-86.023v0-234.023c0-47.504 38.511-86.023 86.023-86.023v0h117.011l334.728-292.889c7.524-6.604 17.452-10.637 28.316-10.637 23.75 0 43.005 19.253 43.007 43.003v0zM1159.492 309.554c7.781 7.785 12.593 18.54 12.593 30.412s-4.812 22.625-12.595 30.412l-141.632 141.623 141.632 141.623c7.713 7.774 12.475 18.477 12.475 30.29 0 23.756-19.258 43.012-43.012 43.012-11.821 0-22.524-4.764-30.292-12.479l-141.621-141.63-141.623 141.632c-7.774 7.713-18.477 12.475-30.29 12.475-23.756 0-43.012-19.258-43.012-43.012 0-11.821 4.764-22.524 12.479-30.292l141.63-141.621-141.632-141.623c-7.785-7.785-12.597-18.54-12.597-30.412 0-23.754 19.256-43.010 43.010-43.010 11.882 0 22.629 4.814 30.413 12.6l141.623 141.628 141.623-141.628c7.785-7.785 18.54-12.599 30.413-12.599s22.629 4.814 30.413 12.599v0z"],"width":1184,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Voice_Off-01"],"grid":0},"attrs":[],"properties":{"order":573,"id":41,"name":"voice-off","prevSize":32,"code":59739},"setIdx":0,"setId":1,"iconIdx":42},{"icon":{"paths":["M213.335 938.665c0 47.128 38.206 85.334 85.334 85.334s85.334-38.206 85.334-85.334v0-853.333c0-47.128-38.206-85.334-85.334-85.334s-85.334 38.206-85.334 85.334v0zM640 938.665c0 47.128 38.206 85.334 85.334 85.334s85.334-38.206 85.334-85.334v0-853.333c0-47.128-38.206-85.334-85.334-85.334s-85.334 38.206-85.334 85.334v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Pause-01"],"grid":0},"attrs":[],"properties":{"order":572,"id":42,"name":"pause","prevSize":32,"code":59740},"setIdx":0,"setId":1,"iconIdx":43},{"icon":{"paths":["M258.662 9.858c-9.425-6.18-20.972-9.859-33.379-9.859-33.932 0-61.44 27.508-61.44 61.44 0 0.002 0 0.002 0 0.004v0 901.113c0 0.002 0 0.002 0 0.004 0 33.932 27.508 61.44 61.44 61.44 12.407 0 23.956-3.677 33.613-10.003l-0.234 0.144 696.31-450.558c16.994-11.117 28.064-30.057 28.064-51.584s-11.071-40.469-27.83-51.44l-0.234-0.144z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Play-01"],"grid":0},"attrs":[],"properties":{"order":571,"id":43,"name":"play","prevSize":32,"code":59741},"setIdx":0,"setId":1,"iconIdx":44},{"icon":{"paths":["M782.8 208.116c-0.202-0.003-0.437-0.004-0.673-0.004-25.902 0-46.9 20.999-46.9 46.9 0 0.235 0.001 0.476 0.007 0.712v-0.034c1.787 25.52 22.048 45.786 47.408 47.563l0.159 0.011c26.272 0 47.572-21.297 47.572-47.572s-21.297-47.572-47.572-47.572v0zM520.709 687.833l-30.227-3.832c-1.712-4.528-3.571-9.057-5.576-13.412l18.7-24.097c6.158-7.753 9.882-17.681 9.882-28.477 0-12.832-5.258-24.437-13.733-32.782l-32.903-32.872c-8.34-8.552-19.975-13.858-32.851-13.858-10.8 0-20.729 3.736-28.568 9.981l-24.008 18.57c-4.414-1.974-8.884-3.832-13.412-5.517l-3.864-30.253c-2.897-23.048-22.368-40.699-45.966-40.706h-47.008c-23.589 0.007-43.055 17.662-45.912 40.48l-0.026 0.225-3.864 30.253c-4.56 1.686-9.031 3.545-13.386 5.517l-24.127-18.756c-7.753-6.075-17.641-9.743-28.389-9.743-12.839 0-24.463 5.234-32.842 13.686l-32.899 32.868c-8.537 8.352-13.828 19.987-13.828 32.858 0 10.792 3.722 20.717 9.952 28.563l-0.073-0.095 18.7 24.097c-2.005 4.355-3.864 8.884-5.543 13.412l-30.31 3.832c-22.999 2.991-40.585 22.431-40.649 45.984v47.042c0.034 23.583 17.677 43.032 40.48 45.911l0.227 0.026 30.227 3.832c1.712 4.528 3.545 8.998 5.543 13.412l-18.67 24.097c-6.157 7.758-9.879 17.691-9.879 28.492 0 12.851 5.269 24.476 13.761 32.825l32.904 32.873c8.368 8.503 20.003 13.775 32.868 13.775 10.784 0 20.699-3.699 28.55-9.897l24.001-18.682q6.622 3.047 13.386 5.576l3.864 30.196c2.858 23.067 22.327 40.742 45.929 40.765h47.008c23.586-0.031 43.046-17.671 45.94-40.48l0.026-0.228 3.832-30.253c4.56-1.686 9.031-3.545 13.443-5.517l24.127 18.756c7.749 6.089 17.641 9.761 28.394 9.761 12.842 0 24.464-5.244 32.834-13.709l32.871-32.869c8.555-8.346 13.864-19.987 13.864-32.865 0-10.789-3.726-20.711-9.957-28.549l0.073 0.095-18.725-24.097q3.005-6.622 5.576-13.412l30.227-3.89c23.027-2.911 40.665-22.358 40.706-45.927v-47.039c-0.034-23.583-17.677-43.032-40.48-45.911l-0.227-0.026zM510.69 776.855l-42.477 5.461c-10.145 1.311-18.332 8.471-21.124 17.941l-0.044 0.177c-3.758 12.992-8.562 24.283-14.526 34.829l0.415-0.799c-2.059 3.574-3.273 7.861-3.273 12.433 0 5.895 2.017 11.314 5.405 15.612l-0.038-0.053 26.217 33.74-27.641 27.582-33.798-26.248c-4.232-3.284-9.616-5.264-15.461-5.264-4.548 0-8.815 1.195-12.509 3.295l0.125-0.066c-9.781 5.56-21.113 10.368-33.014 13.83l-1.128 0.284c-9.635 2.862-16.782 11.047-18.078 21.069l-0.015 0.127-5.429 42.508h-39.196l-5.402-42.504c-1.368-10.147-8.527-18.325-17.996-21.152l-0.18-0.044c-12.963-3.726-24.234-8.513-34.762-14.466l0.794 0.413c-3.579-2.077-7.874-3.297-12.455-3.297-5.9 0-11.324 2.030-15.615 5.429l0.052-0.038-33.709 26.133-27.642-27.637 26.191-33.624c3.346-4.254 5.363-9.685 5.363-15.585 0-4.558-1.203-8.833-3.31-12.527l0.066 0.124c-5.551-9.751-10.357-21.036-13.827-32.898l-0.286-1.13c-2.818-9.674-11.007-16.858-21.041-18.161l-0.127-0.015-42.507-5.464v-39.137l42.655-5.402c10.059-1.455 18.136-8.59 20.945-17.996l0.044-0.18c3.775-13.034 8.601-24.362 14.586-34.946l-0.415 0.801c2.015-3.545 3.205-7.782 3.205-12.303 0-5.902-2.026-11.328-5.422-15.625l0.038 0.052-26.187-33.686 27.672-27.641 33.824 26.306c4.278 3.186 9.668 5.101 15.507 5.101 4.497 0 8.729-1.135 12.42-3.137l-0.139 0.068c9.777-5.592 21.094-10.415 32.992-13.888l1.121-0.282c9.668-2.833 16.844-11.032 18.135-21.071l0.015-0.127 5.402-42.451h39.2l5.402 42.451c1.263 10.15 8.431 18.34 17.91 21.091l0.176 0.043c13.004 3.77 24.288 8.552 34.851 14.478l-0.823-0.423c3.592 2.153 7.923 3.426 12.557 3.426 5.887 0 11.296-2.061 15.537-5.496l33.663-26.153 27.616 27.641-26.16 33.683c-3.328 4.272-5.337 9.716-5.337 15.631 0 4.535 1.183 8.797 3.253 12.49l-0.067-0.128c5.557 9.762 10.373 21.072 13.856 32.948l0.287 1.136c2.847 9.641 11.027 16.8 21.041 18.103l0.128 0.015 42.508 5.402zM294.698 637.487c-66.162 0-119.797 53.637-119.797 119.797s53.637 119.797 119.797 119.797c66.162 0 119.797-53.637 119.797-119.797v0c-0.068-66.137-53.664-119.728-119.791-119.797h-0.008zM294.698 826.391c-0.009 0-0.020 0-0.030 0-38.166 0-69.102-30.94-69.102-69.102s30.94-69.102 69.102-69.102c38.166 0 69.102 30.94 69.102 69.102v0c-0.036 38.139-30.94 69.050-69.072 69.102h-0.007zM1024 178.387v535.174c-0.11 98.476-79.91 178.278-178.381 178.393h-303.587c-0.479-13.693-4.572-26.336-11.344-37.128l0.182 0.31c34.656-7.544 60.238-37.944 60.275-74.327v-1.863h254.462c36.098-0.034 65.35-29.287 65.386-65.381v-535.178c-0.033-36.098-29.286-65.353-65.381-65.387h-535.178c-36.098 0.034-65.352 29.289-65.386 65.385v287.115c-24.425 9.077-42.624 29.703-48.134 55.059l-0.093 0.499c-11.426-7.333-25.376-11.691-40.34-11.691-8.75 0-17.153 1.492-24.97 4.232l0.529-0.159v-335.047c0.11-98.476 79.91-178.278 178.381-178.393h535.185c98.476 0.11 178.278 79.91 178.393 178.381v0.012zM640.185 654.93l-196.33-215.285-58.154 64.274c-9.016-18.557-24.91-32.591-44.281-38.95l-0.533-0.153 58.896-65.062c10.912-12 26.567-19.514 43.978-19.569h0.095c17.377 0.008 33.014 7.461 43.889 19.352l0.038 0.043 102.865 112.81 52.882-50.357c10.639-10.194 25.102-16.471 41.032-16.471 16.439 0 31.319 6.686 42.067 17.485l0.003 0.003 136.096 136.291c4.833 5.229 7.799 12.254 7.799 19.964 0 8.165-3.325 15.56-8.694 20.896l-0.001 0.001-0.285 0.273c-5.343 5.362-12.734 8.681-20.9 8.681-7.782 0-14.863-3.016-20.132-7.94l0.018 0.016-135.939-136.111-53.848 51.234 55.072 60.391c4.508 5.096 7.29 11.808 7.394 19.168v0.024c0 16.647-13.494 30.141-30.142 30.142v0c-7.687-0.076-14.664-3.047-19.902-7.881l0.023 0.020z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["image properties_ic-01"],"grid":0},"attrs":[],"properties":{"order":570,"id":44,"name":"image-properties","prevSize":32,"code":59737},"setIdx":0,"setId":1,"iconIdx":45},{"icon":{"paths":["M740.084 12.634l-134.263 167.829c-4.583 5.689-7.356 13.005-7.356 20.968 0 18.536 15.026 33.563 33.563 33.563 0.001 0 0.003 0 0.004 0h83.912v738.451c0 0.072 0 0.157 0 0.24 0 27.807 22.542 50.35 50.35 50.35s50.35-22.542 50.35-50.35c0-0.085 0-0.169 0-0.254v0.014-738.449h83.917c0 0 0.001 0 0.001 0 18.536 0 33.561-15.026 33.561-33.561 0-7.964-2.774-15.28-7.408-21.034l0.050 0.065-134.263-167.831c-6.201-7.709-15.633-12.6-26.207-12.6s-20.006 4.891-26.157 12.535l-0.050 0.065z","M422.252 663.522q26.483-93.142 54.938-170.672l0.004-0.022q29.427-78.47 67.674-166.721l0.063-0.149 0.004 0.004c3.665-6.407 6.031-13.991 6.544-22.078l0.008-0.151c-0.843-11.592-7.993-21.333-18.004-25.868l-0.193-0.078-0.151-0.088 0.007-0.007c-9.276-7.108-20.884-11.609-33.513-12.228l-0.141-0.005c-0.019 0-0.041 0-0.062 0-10.842 0-20.79 3.825-28.569 10.199l0.080-0.063c-8.579 7.541-15.569 16.655-20.564 26.922l-0.223 0.507c-7.749 15.711-15.662 35.040-22.354 54.931l-1.025 3.511q-9.779 31.306-25.444 84.147h0.004c-13.459 52.352-27.919 95.898-44.913 138.154l2.641-7.435-2.266 5.193-2.864-4.891c-9.345-15.444-18.902-33.888-27.314-52.952l-1.283-3.26q-11.794-28.509-31.404-82.43l-0.007-0.024c-17.97-54.207-38.765-100.663-63.552-144.565l2.091 4.029c-4.97-8.52-11.228-15.707-18.598-21.554l-0.157-0.12-0.317-0.211 0.018-0.018c-5.253-3.907-11.867-6.255-19.030-6.255-0.912 0-1.814 0.038-2.706 0.112l0.116-0.008c-0.317-0.005-0.693-0.008-1.070-0.008-13.951 0-26.92 4.204-37.71 11.415l0.247-0.155c-9.473 7.092-15.538 18.286-15.538 30.897 0 1.051 0.042 2.093 0.124 3.122l-0.008-0.135c0.409 4.86 1.567 9.346 3.361 13.493l-0.107-0.278c3.568 9.271 6.985 16.758 10.773 24.021l-0.612-1.29c13.44 23.435 27.888 52.437 40.825 82.247l2.333 6.038q22.524 48.964 27.481 60.851v0l22.503 51.852c22.997 49.631 47.422 91.913 75.117 131.753l-1.867-2.837 0.696 1.027-0.261 1.202c-6.546 35.113-16.126 66.211-28.774 95.679l1.113-2.917c-9.373 19.417-21.912 30.049-37.872 30.049-5.817-0.012-11.268-1.575-15.961-4.298l0.154 0.082-0.028 0.063-0.239-0.138-0.058-0.014 0.007-0.014c-5.343-2.368-9.933-5.035-14.191-8.132l0.22 0.153-0.39-0.281 0.024-0.024-0.669-0.531-1.882-1.355q-2.412-1.683-6.802-4.615c-4.752-3.341-10.647-5.354-17.011-5.396h-0.011c-0.377-0.012-0.819-0.019-1.263-0.019-9.526 0-18.332 3.084-25.475 8.307l0.122-0.085c-6.565 5.5-10.71 13.701-10.71 22.87 0 0.465 0.011 0.927 0.031 1.387l-0.003-0.065c0.927 10.624 5.007 20.15 11.286 27.801l-0.070-0.089c9.425 12.238 21.568 21.926 35.558 28.247l0.585 0.236 0.042 0.022c16.745 7.895 36.371 12.504 57.075 12.504 1.532 0 3.057-0.026 4.577-0.076l-0.222 0.005c0.463 0.008 1.009 0.014 1.558 0.014 20.217 0 38.85-6.783 53.746-18.197l-0.212 0.155 0.058-0.049c16.885-12.465 31.242-27.127 42.995-43.762l0.4-0.596c3.125-5.396 6.161-11.757 8.706-18.362l0.322-0.948q5.849-14.371 14.16-37.846l0.022-0.053q17.605-46.937 33.251-98.789z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Y axis_ic-01"],"grid":0},"attrs":[],"properties":{"order":569,"id":45,"name":"y-axis","prevSize":32,"code":59735},"setIdx":0,"setId":1,"iconIdx":46},{"icon":{"paths":["M93.091 619.055v0c-0.002 0-0.002 0-0.004 0-5.14 0-9.305 4.167-9.305 9.305 0 0.002 0 0.002 0 0.004v302.545c0 0.002 0 0.002 0 0.004 0 5.14 4.167 9.305 9.305 9.305 0.002 0 0.002 0 0.004 0h837.818c0.002 0 0.002 0 0.004 0 5.14 0 9.305-4.167 9.305-9.305 0-0.002 0-0.002 0-0.004v-302.545c0-0.002 0-0.002 0-0.004 0-5.14-4.167-9.305-9.305-9.305-0.002 0-0.002 0-0.004 0h-837.818zM0 628.364c0-51.413 41.678-93.091 93.091-93.091v0h837.818c51.413 0 93.091 41.678 93.091 93.091v0 302.545c0 51.413-41.678 93.091-93.091 93.091v0h-837.818c-51.413 0-93.091-41.678-93.091-93.091v0zM930.909 83.782v0c0.002 0 0.002 0 0.004 0 5.14 0 9.305 4.167 9.305 9.305 0 0.002 0 0.002 0 0.004v302.545c0 0.002 0 0.002 0 0.004 0 5.14-4.167 9.305-9.305 9.305-0.002 0-0.002 0-0.004 0h-837.818c-0.002 0-0.002 0-0.004 0-5.14 0-9.305-4.167-9.305-9.305 0-0.002 0-0.002 0-0.004v-302.545c0-0.002 0-0.002 0-0.004 0-5.14 4.167-9.305 9.305-9.305 0.002 0 0.002 0 0.004 0h837.818zM93.091 0c-51.413 0-93.091 41.678-93.091 93.091v0 302.545c0 51.413 41.678 93.091 93.091 93.091v0h837.818c51.413 0 93.091-41.678 93.091-93.091v0-302.545c0-51.413-41.678-93.091-93.091-93.091v0zM162.909 826.182c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0h-93.091c-25.705 0-46.545 20.84-46.545 46.545v0zM162.909 290.909c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0h-93.091c-25.705 0-46.545 20.84-46.545 46.545v0zM465.455 337.455c-25.705 0-46.545-20.84-46.545-46.545v0-93.091c0-25.705 20.84-46.545 46.545-46.545v0h93.091c25.705 0 46.545 20.84 46.545 46.545v0 93.091c0 25.705-20.84 46.545-46.545 46.545v0zM418.909 826.182c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0h-93.091c-25.705 0-46.545 20.84-46.545 46.545v0zM721.454 337.455c-25.705 0-46.545-20.84-46.545-46.545v0-93.091c0-25.705 20.84-46.545 46.545-46.545v0h93.091c25.705 0 46.545 20.84 46.545 46.545v0 93.091c0 25.705-20.84 46.545-46.545 46.545v0zM674.909 826.182c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0h-93.091c-25.705 0-46.545 20.84-46.545 46.545v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Image group-01"],"grid":0},"attrs":[],"properties":{"order":568,"id":46,"name":"image-group","prevSize":32,"code":59736},"setIdx":0,"setId":1,"iconIdx":47},{"icon":{"paths":["M404.945 93.091v0c0-0.002 0-0.002 0-0.004 0-5.14-4.167-9.305-9.305-9.305-0.002 0-0.002 0-0.004 0h-302.545c-0.002 0-0.002 0-0.004 0-5.14 0-9.305 4.167-9.305 9.305 0 0.002 0 0.002 0 0.004v837.818c0 0.002 0 0.002 0 0.004 0 5.14 4.167 9.305 9.305 9.305 0.002 0 0.002 0 0.004 0h302.545c0.002 0 0.002 0 0.004 0 5.14 0 9.305-4.167 9.305-9.305 0-0.002 0-0.002 0-0.004v-837.818zM395.636 0c51.413 0 93.091 41.678 93.091 93.091v0 837.818c0 51.413-41.678 93.091-93.091 93.091v0h-302.545c-51.413 0-93.091-41.678-93.091-93.091v0-837.818c0-51.413 41.678-93.091 93.091-93.091v0zM940.218 930.909v0c0 0.002 0 0.002 0 0.004 0 5.14-4.167 9.305-9.305 9.305-0.002 0-0.002 0-0.004 0h-302.545c-0.002 0-0.002 0-0.004 0-5.14 0-9.305-4.167-9.305-9.305 0-0.002 0-0.002 0-0.004v-837.818c0-0.002 0-0.002 0-0.004 0-5.14 4.167-9.305 9.305-9.305 0.002 0 0.002 0 0.004 0h302.545c0.002 0 0.002 0 0.004 0 5.14 0 9.305 4.167 9.305 9.305 0 0.002 0 0.002 0 0.004v837.818zM1024 93.091c0-51.413-41.678-93.091-93.091-93.091v0h-302.545c-51.413 0-93.091 41.678-93.091 93.091v0l0 837.818c0 51.413 41.678 93.091 93.091 93.091v0h302.545c51.413 0 93.091-41.678 93.091-93.091v0zM197.818 162.909c-25.705 0-46.545 20.84-46.545 46.545v0 93.091c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0zM733.091 162.909c-25.705 0-46.545 20.84-46.545 46.545v0l0 93.091c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0zM686.545 465.455c0-25.705 20.84-46.545 46.545-46.545v0h93.091c25.705 0 46.545 20.84 46.545 46.545v0 93.091c0 25.705-20.84 46.545-46.545 46.545v0h-93.091c-25.705 0-46.545-20.84-46.545-46.545v0zM197.818 418.909c-25.705 0-46.545 20.84-46.545 46.545v0 93.091c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0zM686.545 721.454c0-25.705 20.84-46.545 46.545-46.545v0h93.091c25.705 0 46.545 20.84 46.545 46.545v0 93.091c0 25.705-20.84 46.545-46.545 46.545v0h-93.091c-25.705 0-46.545-20.84-46.545-46.545v0zM197.818 674.909c-25.705 0-46.545 20.84-46.545 46.545v0 93.091c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["group column"],"grid":0},"attrs":[],"properties":{"order":599,"id":47,"prevSize":32,"code":59775,"name":"group-column"},"setIdx":0,"setId":1,"iconIdx":48},{"icon":{"paths":["M1024 929.185c0 31.419-25.471 56.889-56.889 56.889h-872.296c-52.365 0-94.815-42.45-94.815-94.815v0-796.443c0-31.419 25.469-56.889 56.889-56.889s56.889 25.469 56.889 56.889v0 777.481h853.332c31.419 0 56.889 25.469 56.889 56.889v0zM265.478 640.673c-44.137 0-79.918 35.781-79.918 79.918s35.781 79.918 79.918 79.918c44.137 0 79.918-35.781 79.918-79.918v0c-0.047-44.119-35.799-79.871-79.913-79.918h-0.005zM316.051 299.344c0 0 0 0 0 0-44.139 0-79.918 35.781-79.918 79.918s35.781 79.918 79.918 79.918c44.139 0 79.918-35.781 79.918-79.918v0c-0.042-44.122-35.797-79.879-79.915-79.921h-0.005zM463.966 499.093c-0.006 0-0.015 0-0.023 0-44.137 0-79.918 35.781-79.918 79.918s35.781 79.918 79.918 79.918c44.137 0 79.918-35.781 79.918-79.918v0c-0.047-44.111-35.786-79.86-79.891-79.918h-0.005zM710.917 583.778c-44.137 0-79.918 35.781-79.918 79.918s35.781 79.918 79.918 79.918c44.137 0 79.918-35.779 79.918-79.917v0c-0.045-44.121-35.799-79.874-79.913-79.921h-0.005zM738.577 414.654c0-44.137-35.781-79.918-79.918-79.918s-79.918 35.781-79.918 79.918c0 44.137 35.781 79.918 79.918 79.918v0c44.119-0.045 79.873-35.799 79.92-79.913v-0.005zM919.056 367.613c-44.127 0.006-79.895 35.779-79.895 79.907 0 44.132 35.776 79.907 79.907 79.907 44.127 0 79.9-35.77 79.907-79.895v0c-0.047-44.118-35.799-79.871-79.912-79.918h-0.005zM530.954 307.481c44.137 0 79.918-35.781 79.918-79.918s-35.781-79.918-79.918-79.918c-44.137 0-79.918 35.781-79.918 79.918v0c0.049 44.118 35.801 79.87 79.915 79.918h0.005zM876.376 151.692c0-44.137-35.781-79.918-79.918-79.918s-79.918 35.781-79.918 79.918c0 44.137 35.781 79.918 79.918 79.918v0c44.121-0.042 79.876-35.797 79.92-79.915v-0.005z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Scaterplot_ic-01"],"grid":0},"attrs":[],"properties":{"order":567,"id":48,"name":"scatterplot","prevSize":32,"code":59733},"setIdx":0,"setId":1,"iconIdx":49},{"icon":{"paths":["M1023.99 156.832v641.148c0 25.474-20.651 46.125-46.125 46.125s-46.125-20.651-46.125-46.125v0-641.148c-1.038-14.849-12.827-26.638-27.582-27.673l-0.094-0.005h-714.949c-25.474 0-46.125-20.651-46.125-46.125s20.651-46.125 46.125-46.125v0h714.949c65.745 1.205 118.723 54.184 119.926 119.816l0.002 0.114zM599.635 461.262c0-20.38 16.521-36.901 36.901-36.901s36.901 16.521 36.901 36.901c0 20.38-16.521 36.901-36.901 36.901v0c-19.797-1.386-35.515-17.103-36.893-36.775l-0.006-0.125zM166.053 779.525c-4.32 5.71-6.919 12.931-6.919 20.758s2.599 15.049 6.983 20.846l-0.063-0.088c5.71 4.32 12.929 6.919 20.757 6.919s15.047-2.599 20.844-6.983l-0.088 0.063 147.602-166.053 147.602 166.053c5.312 5.312 12.65 8.598 20.757 8.598 16.213 0 29.356-13.143 29.356-29.356 0-8.106-3.287-15.446-8.599-20.758v0l-32.288-36.896 32.288-32.288 110.702 110.702c5.312 5.312 12.65 8.598 20.757 8.598 16.213 0 29.356-13.143 29.356-29.356 0-8.106-3.287-15.446-8.599-20.758l-119.928-119.923c-8.137-8.533-19.592-13.837-32.288-13.837s-24.151 5.306-32.272 13.819l-0.016 0.018-36.901 36.901-83.026-92.252c-7.973-10.55-20.496-17.298-34.594-17.298s-26.622 6.748-34.516 17.189l-0.079 0.109zM751.849 309.046h-641.148v562.729h641.148v-562.729zM788.75 198.345c0.282-0.003 0.616-0.006 0.95-0.006 40.239 0 72.857 32.619 72.857 72.857 0 0.334-0.002 0.668-0.006 1.001v-0.050 641.148c0.003 0.282 0.006 0.616 0.006 0.95 0 40.235-32.617 72.854-72.854 72.854-0.336 0-0.67-0.002-1.005-0.006h-714.899c-0.284 0.003-0.618 0.006-0.954 0.006-40.235 0-72.854-32.617-72.854-72.854 0-0.334 0.002-0.666 0.006-1.001v0.050-641.148c-0.003-0.282-0.006-0.616-0.006-0.95 0-40.239 32.619-72.857 72.857-72.857 0.334 0 0.668 0.002 1.001 0.006h-0.050z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Image Explorer icon-01"],"grid":0},"attrs":[],"properties":{"order":566,"id":49,"name":"image-explorer","prevSize":32,"code":59734},"setIdx":0,"setId":1,"iconIdx":50},{"icon":{"paths":["M204.799 153.6c0-28.276 22.923-51.199 51.199-51.199v0h307.201v102.4c0 84.831 68.769 153.6 153.6 153.6v0h102.4v512c0 28.276-22.923 51.199-51.199 51.199v0h-512c-28.276 0-51.199-22.923-51.199-51.199v0zM747.008 256l-81.409-81.409v30.208c0 28.276 22.923 51.199 51.199 51.199v0zM256-0c-84.831 0-153.6 68.769-153.6 153.6v0 716.801c0 84.831 68.769 153.6 153.6 153.6v0h512c84.831 0 153.6-68.769 153.6-153.6v0-563.201c0-0.088 0-0.193 0-0.295 0-14.065-5.672-26.806-14.852-36.059l-255.996-255.996c-9.25-9.178-21.991-14.848-36.056-14.848-0.104 0-0.209 0-0.311 0.002h0.016zM307.199 422.399c-21.208 0-38.399 17.192-38.399 38.399s17.192 38.399 38.399 38.399v0h307.201c21.208 0 38.399-17.192 38.399-38.399s-17.192-38.399-38.399-38.399v0zM268.8 614.4c0.284-21.092 17.307-38.115 38.372-38.399h409.628c21.208 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0h-409.601c-21.092-0.284-38.115-17.307-38.399-38.372v-0.027zM307.199 729.601c-21.208 0-38.399 17.192-38.399 38.399s17.192 38.399 38.399 38.399v0h409.601c21.208 0 38.399-17.192 38.399-38.399s-17.192-38.399-38.399-38.399v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Full docs_ic-01"],"grid":0},"attrs":[],"properties":{"order":538,"id":50,"name":"full-docs","prevSize":32,"code":59730},"setIdx":0,"setId":1,"iconIdx":51},{"icon":{"paths":["M93.092 744.727h837.817v-605.090h-837.817zM0.001 139.636c0-51.413 41.678-93.091 93.091-93.091v0h837.817c51.413 0 93.091 41.678 93.091 93.091v0 605.090c0 51.413-41.678 93.091-93.091 93.091v0h-372.364v46.545h93.091c25.706 0 46.545 20.839 46.545 46.545s-20.839 46.545-46.545 46.545v0h-279.273c-25.706 0-46.545-20.839-46.545-46.545s20.839-46.545 46.545-46.545v0h93.091v-46.545h-372.364c-51.413 0-93.091-41.678-93.091-93.091v0zM608.814 535.272l-0.008 0.008c-6.429 6.622-15.426 10.736-25.383 10.736-7.972 0-15.328-2.638-21.153-7.022l-139.636-99.142-165.178 165.189c-6.033 4.976-13.765 7.964-22.197 7.964-19.28 0-34.908-15.629-34.908-34.908 0-8.314 2.906-15.95 7.707-21.88l186.19-186.19c6.429-6.622 15.426-10.736 25.383-10.736 7.972 0 15.328 2.638 21.153 7.022l139.636 99.142 186.049-186.1c5.493-3.603 12.063-5.699 19.124-5.699 19.28 0 34.908 15.629 34.908 34.908 0 6.346-1.694 12.296-4.562 17.254z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Live demo_ic-01"],"grid":0},"attrs":[],"properties":{"order":539,"id":51,"name":"live-demo","prevSize":32,"code":59731},"setIdx":0,"setId":1,"iconIdx":52},{"icon":{"paths":["M720.062 353.574c-42.94 0.212-81.684 18.003-109.436 46.54l-0.035 0.036c-28.404 28.726-45.95 68.239-45.95 111.85s17.547 83.124 45.964 111.866l-0.014-0.014c27.949 28.71 66.97 46.52 110.151 46.52s82.202-17.811 110.117-46.487l0.033-0.035c28.292-28.655 45.767-68.049 45.767-111.525 0-86.922-69.85-157.529-156.482-158.75l-0.115-0.001zM303.938 206.026c0.050 0 0.109 0 0.169 0 68.93 0 132.294 23.825 182.309 63.69l-0.592-0.455-72.414 130.889c-27.949-28.71-66.97-46.52-110.151-46.52s-82.202 17.811-110.117 46.487l-0.033 0.035c-28.404 28.726-45.95 68.239-45.95 111.85s17.547 83.124 45.964 111.866l-0.014-0.014c28.006 28.746 67.096 46.577 110.349 46.577 0.17 0 0.338 0 0.508-0.001h-0.026c41.106-0.372 78.378-16.476 106.154-42.573l-0.082 0.076 73.773 127.829c-49.556 38.793-112.775 62.207-181.464 62.207-83.047 0-158.099-34.226-211.822-89.342l-0.061-0.063c-54.653-55.601-88.393-131.911-88.393-216.1 0-0.163 0-0.325 0-0.486v0.025c-0.005-0.608-0.007-1.327-0.007-2.046 0-167.143 134.92-302.774 301.792-303.926h0.11zM720.062 206.026c168.985 0 305.974 136.989 305.974 305.974s-136.989 305.974-305.974 305.974v0c-83.145-0.524-158.227-34.614-212.457-89.387l-0.024-0.025c-54.339-55.933-87.892-132.313-88.052-216.53v-0.031c-0.006-0.712-0.010-1.553-0.010-2.395 0-166.598 134.19-301.854 300.38-303.577l0.164-0.001z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["CO_ic-01"],"grid":0},"attrs":[],"properties":{"order":540,"id":52,"name":"co","prevSize":32,"code":59732},"setIdx":0,"setId":1,"iconIdx":53},{"icon":{"paths":["M227.538 1009.261l157.573-196.968c5.307-6.746 8.513-15.365 8.513-24.731 0-6.182-1.396-12.038-3.889-17.269l0.103 0.242c-6.559-13.17-19.93-22.061-35.375-22.061-0.028 0-0.055 0-0.083 0h-98.479v-689.384c0-32.634-26.456-59.090-59.090-59.090s-59.090 26.456-59.090 59.090v0 689.384h-98.483c-0.024 0-0.052 0-0.079 0-15.447 0-28.816 8.889-35.271 21.832l-0.103 0.229c-2.389 4.989-3.785 10.845-3.785 17.025 0 9.366 3.206 17.986 8.577 24.818l-0.065-0.087 157.573 196.968c7.279 9.020 18.335 14.741 30.727 14.741s23.448-5.721 30.668-14.667l0.059-0.076z"],"width":400,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Sort_one arrow_down_ic-01"],"grid":0},"attrs":[],"properties":{"order":544,"id":53,"name":"sort-arrow-down","prevSize":32,"code":59675},"setIdx":0,"setId":1,"iconIdx":54},{"icon":{"paths":["M166.086 14.855l-157.573 196.968c-5.307 6.746-8.513 15.365-8.513 24.731 0 6.182 1.396 12.038 3.889 17.269l-0.103-0.242c6.559 13.17 19.93 22.061 35.375 22.061 0.028 0 0.055 0 0.083 0h98.479v689.384c0 32.634 26.456 59.090 59.090 59.090s59.090-26.456 59.090-59.090v0-689.384h98.483c0.024 0 0.052 0 0.079 0 15.447 0 28.816-8.889 35.271-21.832l0.103-0.229c2.389-4.989 3.785-10.845 3.785-17.025 0-9.366-3.206-17.986-8.577-24.818l0.065 0.087-157.573-196.968c-7.279-9.020-18.335-14.741-30.727-14.741s-23.448 5.721-30.668 14.667l-0.059 0.076z"],"width":400,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Sort_one arrow_ic-01"],"grid":0},"attrs":[],"properties":{"order":394,"id":54,"name":"sort-arrow-up","prevSize":32,"code":59729},"setIdx":0,"setId":1,"iconIdx":55},{"icon":{"paths":["M94.868 37.991c-52.358 0-94.805 42.445-94.806 94.803v0 758.575c0 0 0 0.002 0 0.003 0 52.358 42.445 94.805 94.805 94.805 0.002 0 0.002 0 0.003 0h834.386c52.36-0.002 94.806-42.446 94.806-94.806v0-758.575c-0.005-52.358-42.448-94.801-94.806-94.803v0zM910.295 429.921v442.491h-796.466v-720.648h796.466v278.157zM485.357 461.131c-10.557-11.491-25.654-18.667-42.428-18.667s-31.87 7.176-42.39 18.625l-0.037 0.042-236.292 257.768c-5.627 6.124-9.077 14.327-9.077 23.337 0 19.075 15.463 34.537 34.537 34.537 10.064 0 19.125-4.306 25.437-11.175l0.023-0.024 227.801-248.513 227.801 248.513c6.335 6.895 15.395 11.201 25.46 11.201 19.075 0 34.537-15.463 34.537-34.537 0-9.009-3.45-17.213-9.1-23.362l0.023 0.024-122.859-134.029 19.671-21.859 190.71 202.879c6.32 6.749 15.284 10.953 25.231 10.953 19.073 0 34.535-15.462 34.535-34.535 0-9.197-3.595-17.555-9.456-23.744l0.015 0.016-199.279-211.996c-10.524-11.177-25.419-18.138-41.94-18.138-16.959 0-32.204 7.333-42.738 19.002l-0.045 0.050-23.595 26.219zM719.213 419.905c38.147 0 69.071-30.925 69.071-69.071s-30.925-69.071-69.071-69.071c-38.147 0-69.071 30.925-69.071 69.071v0c0 38.147 30.925 69.071 69.071 69.071v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["icon"],"grid":0},"attrs":[],"properties":{"order":541,"id":55,"name":"images","prevSize":32,"code":59728},"setIdx":0,"setId":1,"iconIdx":56},{"icon":{"paths":["M929.206 94.767c-126.362-126.364-331.242-126.364-457.604 0l-94.21 94.212c-22.302 22.3-22.302 58.454 0 80.754s58.449 22.3 80.749 0l94.217-94.212c81.762-81.764 214.329-81.764 296.098 0 81.762 81.764 81.762 214.336 0 296.098l-94.217 94.21c-22.3 22.3-22.3 58.456 0 80.758s58.456 22.3 80.758 0l94.21-94.21c126.362-126.369 126.362-331.244 0-457.608zM269.718 458.157c22.3-22.3 22.3-58.449 0-80.749-22.3-22.302-58.454-22.302-80.754 0l-94.212 94.21c-126.364 126.362-126.364 331.242 0 457.604s331.237 126.362 457.606 0l94.21-94.21c22.3-22.3 22.3-58.456 0-80.758s-58.456-22.3-80.758 0l-94.21 94.21c-81.762 81.769-214.332 81.769-296.096 0-81.764-81.762-81.764-214.329 0-296.091l94.212-94.217zM660.030 444.697c22.3-22.293 22.3-58.449 0-80.749s-58.456-22.3-80.758 0l-215.34 215.34c-22.3 22.3-22.3 58.456 0 80.758s58.456 22.3 80.758 0l215.34-215.349z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Link_ic"],"grid":0},"attrs":[],"properties":{"order":565,"id":56,"name":"link","prevSize":32,"code":59710},"setIdx":0,"setId":1,"iconIdx":57},{"icon":{"paths":["M192.001 0.004c-106.038 0-192 85.962-192 192v0 640c0 106.038 85.962 192 192 192v0h640c0.001 0 0.003 0 0.004 0 106.036 0 191.995-85.959 191.995-191.995 0-0.001 0-0.003 0-0.004v0-640c0-106.038-85.962-192-192-192v0zM737.939 286.063c8.686 8.686 14.059 20.686 14.059 33.94s-5.373 25.255-14.059 33.94l-158.055 158.059 158.055 158.061c8.902 8.721 14.422 20.866 14.422 34.3 0 26.509-21.49 48-48 48-13.434 0-25.579-5.52-34.293-14.413l-158.068-158.062-158.059 158.055c-8.71 8.839-20.814 14.317-34.197 14.317-26.509 0-48-21.49-48-48 0-13.381 5.476-25.485 14.308-34.189l158.062-158.067-158.056-158.059c-8.674-8.685-14.040-20.676-14.040-33.922 0-26.509 21.49-48 48-48 13.245 0 25.237 5.365 33.922 14.040v0l158.059 158.056 158.061-158.056c8.685-8.686 20.685-14.059 33.939-14.059s25.254 5.373 33.939 14.059v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Close_rectangle_ic-01"],"grid":0},"attrs":[],"properties":{"order":564,"id":57,"name":"close-rectangle","prevSize":32,"code":59648},"setIdx":0,"setId":1,"iconIdx":58},{"icon":{"paths":["M130.908 22.246c-13.903-13.886-33.099-22.476-54.304-22.476-42.437 0-76.84 34.403-76.84 76.84 0 21.203 8.589 40.401 22.476 54.304v0l381.047 381.042-381.047 381.054c-13.661 13.862-22.096 32.907-22.096 53.92 0 42.437 34.403 76.84 76.84 76.84 21.016 0 40.060-8.438 53.934-22.108l381.032-381.035 381.054 381.044c13.846 13.562 32.82 21.931 53.752 21.931 42.437 0 76.84-34.403 76.84-76.84 0-20.932-8.368-39.906-21.943-53.766l-381.032-381.042 381.044-381.042c13.663-13.862 22.099-32.909 22.099-53.925 0-42.437-34.403-76.84-76.84-76.84-21.013 0-40.058 8.436-53.93 22.106l-381.044 381.042z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Close_ic-01"],"grid":0},"attrs":[],"properties":{"order":563,"id":58,"name":"close","prevSize":32,"code":59649},"setIdx":0,"setId":1,"iconIdx":59},{"icon":{"paths":["M512 1024.004c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512v0c0 282.77 229.23 512 512 512v0zM737.939 286.062c8.687 8.687 14.060 20.687 14.060 33.941s-5.373 25.256-14.060 33.941l-158.055 158.060 158.055 158.061c8.903 8.721 14.423 20.867 14.423 34.301 0 26.51-21.491 48-48 48-13.434 0-25.58-5.52-34.293-14.414l-158.069-158.063-158.060 158.055c-8.711 8.84-20.814 14.318-34.197 14.318-26.51 0-48-21.491-48-48 0-13.382 5.477-25.485 14.309-34.19l158.063-158.067-158.057-158.060c-8.675-8.685-14.040-20.676-14.040-33.923 0-26.51 21.491-48 48-48 13.245 0 25.238 5.366 33.923 14.040v0l158.060 158.057 158.061-158.057c8.685-8.687 20.685-14.060 33.939-14.060s25.254 5.373 33.939 14.060v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Close_circle_ic-01"],"grid":0},"attrs":[],"properties":{"order":562,"id":59,"name":"close-circle","prevSize":32,"code":59650},"setIdx":0,"setId":1,"iconIdx":60},{"icon":{"paths":["M618.666 512.026c0 58.91-47.756 106.666-106.666 106.666s-106.666-47.756-106.666-106.666c0-58.91 47.756-106.666 106.666-106.666v0c58.888 0.056 106.61 47.778 106.666 106.662v0.006zM1024 512.006c-85.826 202.142-282.658 341.334-512 341.334s-426.176-139.192-510.628-337.706l-1.372-3.628c85.826-202.142 282.658-341.334 512-341.334s426.176 139.192 510.628 337.706l1.372 3.628zM746.666 512.026c0-129.602-105.064-234.666-234.666-234.666s-234.666 105.064-234.666 234.666c0 129.602 105.064 234.666 234.666 234.666v0c129.548-0.136 234.532-105.118 234.666-234.654v-0.014z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Eye_fill_show_ic"],"grid":0},"attrs":[],"properties":{"order":561,"id":60,"name":"eye-fill-show","prevSize":32,"code":59651},"setIdx":0,"setId":1,"iconIdx":61},{"icon":{"paths":["M1020.372 531.977l-0.014 0.060-0.023 0.060-0.060 0.144-0.139 0.37-0.418 1.079-1.38 3.413c-1.172 2.823-2.825 6.713-5.015 11.515-4.37 9.596-10.871 22.907-19.746 38.684-24.898 43.754-52.899 81.566-84.83 115.651l0.308-0.332q-4.444 4.731-9.083 9.468l-80.458-80.458q3.333-3.413 6.532-6.834c25.573-27.303 48.22-57.884 67.111-90.892l1.255-2.38c4.133-7.344 7.57-13.922 10.343-19.518-2.773-5.596-6.208-12.176-10.343-19.518-20.142-35.39-42.791-65.971-68.615-93.543l0.249 0.268c-76.119-82.396-184.719-133.818-305.33-133.818-3.067 0-6.124 0.034-9.175 0.1l0.455-0.007c-0.174 0-0.382 0-0.588 0-19.351 0-38.437 1.132-57.196 3.333l2.277-0.217-96.824-96.828c44.873-12.745 96.407-20.071 149.653-20.071 0.942 0 1.884 0.002 2.827 0.007h-0.146c2.617-0.046 5.703-0.073 8.796-0.073 153.293 0 291.353 65.216 387.95 169.416l0.313 0.341c31.626 33.751 59.628 71.56 82.974 112.376l1.548 2.939c8.875 15.772 15.376 29.088 19.746 38.679 2.19 4.802 3.842 8.695 5.015 11.515l1.38 3.413 0.418 1.074 0.139 0.379 0.060 0.144 0.023 0.060 0.014 0.060c2.295 5.932 3.625 12.796 3.625 19.971s-1.33 14.039-3.756 20.361l0.132-0.389zM492.228 304.339l227.439 227.439q0.924-9.764 0.926-19.772c0-115.201-93.39-208.591-208.591-208.591v0q-10 0-19.772 0.926zM3.644 491.975l0.023-0.060 0.055-0.144 0.139-0.379 0.421-1.074 1.38-3.413c1.163-2.82 2.82-6.713 5.006-11.515 4.37-9.593 10.871-22.907 19.746-38.679 24.896-43.754 52.899-81.566 84.833-115.647l-0.306 0.329c20.185-21.527 41.735-41.191 64.723-59.091l1.248-0.935-164.248-164.244c-10.295-10.295-16.663-24.517-16.663-40.227 0-31.418 25.47-56.889 56.889-56.889 15.71 0 29.932 6.368 40.226 16.663l910.212 910.214c10.219 10.281 16.535 24.451 16.535 40.096 0 31.417-25.468 56.883-56.883 56.883-15.644 0-29.813-6.315-40.098-16.535l-183.907-183.899c-66.238 30.88-143.802 48.898-225.574 48.898-1.899 0-3.796-0.009-5.689-0.028l0.29 0.002c-2.613 0.046-5.694 0.073-8.782 0.073-153.295 0-291.36-65.214-387.964-169.412l-0.311-0.34c-31.623-33.753-59.625-71.564-82.974-112.378l-1.55-2.94c-8.875-15.778-15.376-29.088-19.746-38.684-2.19-4.802-3.847-8.69-5.006-11.515l-1.38-3.413-0.421-1.079-0.139-0.37-0.055-0.144-0.028-0.059zM3.621 531.977c-2.293-5.932-3.621-12.796-3.621-19.971s1.328-14.039 3.753-20.361l-0.132 0.389zM417.183 512.005c0.053 52.377 42.524 94.814 94.908 94.814 4.7 0 9.321-0.341 13.836-1.001l-0.514 0.062-107.292-107.292c-0.597 4.014-0.937 8.645-0.937 13.358 0 0.021 0 0.041 0 0.062v-0.004zM655.487 735.938l-41.783-41.778c-29.28 16.633-64.32 26.435-101.649 26.435-115.235 0-208.65-93.416-208.65-208.65 0-37.33 9.803-72.369 26.976-102.686l-0.54 1.036-67.651-67.648c-23.915 17.333-44.928 35.911-64.010 56.316l-0.229 0.249c-25.573 27.303-48.222 57.884-67.111 90.894l-1.255 2.38c-4.13 7.342-7.564 13.922-10.343 19.518 2.777 5.596 6.213 12.176 10.343 19.518 20.147 35.388 42.794 65.969 68.617 93.543l-0.251-0.27c76.115 82.396 184.714 133.818 305.323 133.818 3.068 0 6.13-0.034 9.182-0.1l-0.455 0.007c0.992 0.007 2.164 0.012 3.337 0.012 50.128 0 98.323-8.27 143.295-23.522l-3.143 0.924z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Eye_outline_hide_ic"],"grid":0},"attrs":[],"properties":{"order":560,"id":61,"name":"eye-outline-hide","prevSize":32,"code":59652},"setIdx":0,"setId":1,"iconIdx":62},{"icon":{"paths":["M512 303.413c-115.201 0-208.591 93.39-208.591 208.591s93.39 208.591 208.591 208.591c115.201 0 208.591-93.39 208.591-208.591v0c0-115.201-93.39-208.591-208.591-208.591v0zM512 606.819c-52.364 0-94.814-42.45-94.814-94.814s42.45-94.814 94.814-94.814c52.364 0 94.814 42.45 94.814 94.814v0c0 0.002 0 0.004 0 0.005 0 52.362-42.448 94.81-94.81 94.81-0.002 0-0.004 0-0.005 0v0zM1020.373 492.032l-0.016-0.057-0.023-0.060-0.060-0.144-0.139-0.379-0.418-1.074-1.38-3.413c-1.172-2.82-2.825-6.713-5.015-11.515-4.37-9.593-10.871-22.907-19.746-38.679-24.894-43.754-52.896-81.564-84.83-115.646l0.306 0.331c-96.908-104.542-234.971-169.759-388.265-169.759-3.092 0-6.176 0.027-9.255 0.080l0.462-0.007c-2.615-0.046-5.7-0.073-8.791-0.073-153.293 0-291.357 65.216-387.955 169.418l-0.311 0.34c-31.627 33.751-59.628 71.561-82.974 112.376l-1.548 2.939c-8.875 15.772-15.376 29.088-19.746 38.679-2.19 4.802-3.847 8.695-5.006 11.515l-1.38 3.413-0.421 1.074-0.139 0.379-0.055 0.144-0.028 0.062-0.023 0.060c-2.293 5.932-3.621 12.796-3.621 19.971s1.328 14.039 3.753 20.361l-0.132-0.389 0.046 0.121 0.055 0.144 0.139 0.37 0.421 1.079 1.38 3.413c1.163 2.823 2.82 6.713 5.006 11.515 4.37 9.596 10.871 22.907 19.746 38.684 24.898 43.754 52.899 81.566 84.83 115.651l-0.308-0.332c96.915 104.536 234.978 169.748 388.272 169.748 3.092 0 6.176-0.027 9.255-0.080l-0.464 0.007c2.613 0.046 5.698 0.073 8.788 0.073 153.295 0 291.359-65.214 387.959-169.412l0.311-0.34c31.623-33.753 59.625-71.564 82.974-112.378l1.55-2.94c8.875-15.778 15.376-29.088 19.746-38.684 2.19-4.802 3.842-8.69 5.015-11.515l1.38-3.413 0.418-1.079 0.139-0.37 0.060-0.144 0.023-0.060 0.014-0.060c2.295-5.932 3.625-12.796 3.625-19.971s-1.33-14.039-3.756-20.361l0.132 0.389zM894.416 531.523c-20.146 35.388-42.793 65.969-68.615 93.543l0.251-0.27c-76.115 82.396-184.714 133.818-305.323 133.818-3.068 0-6.13-0.034-9.182-0.1l0.455 0.007c-2.597 0.059-5.659 0.092-8.727 0.092-120.609 0-229.206-51.422-305.067-133.537l-0.256-0.281c-25.571-27.303-48.218-57.884-67.111-90.892l-1.255-2.38c-4.13-7.344-7.564-13.922-10.343-19.518 2.777-5.596 6.213-12.176 10.343-19.518 20.144-35.388 42.793-65.971 68.615-93.543l-0.249 0.268c76.119-82.396 184.719-133.818 305.33-133.818 3.067 0 6.124 0.034 9.175 0.1l-0.455-0.007c2.596-0.059 5.653-0.092 8.72-0.092 120.611 0 229.211 51.422 305.074 133.537l0.256 0.279c25.575 27.301 48.224 57.884 67.111 90.894l1.253 2.379c4.133 7.342 7.57 13.922 10.343 19.518-2.773 5.596-6.208 12.176-10.343 19.518z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Eye_show_outline_ic"],"grid":0},"attrs":[],"properties":{"order":559,"id":62,"name":"eye-show-outline","prevSize":32,"code":59653},"setIdx":0,"setId":1,"iconIdx":63},{"icon":{"paths":["M1007.398 926.943l-910.336-910.341c-10.296-10.296-24.521-16.665-40.231-16.665-31.423 0-56.896 25.474-56.896 56.896 0 15.712 6.369 29.936 16.665 40.233l205.458 205.458c-71.412 54.212-127.716 124.713-163.9 206.139l-1.326 3.343c76.495 179.549 251.363 303.184 455.137 303.448h0.034c0.715 0.004 1.561 0.005 2.407 0.005 66.466 0 129.82-13.328 187.532-37.459l-3.213 1.191 228.215 228.211c10.282 10.218 24.453 16.535 40.099 16.535 31.421 0 56.891-25.472 56.891-56.891 0-15.648-6.317-29.819-16.541-40.105l0.004 0.004zM512 720.644c-115.169-0.121-208.498-93.45-208.619-208.609v-0.012c0.188-37.162 10.314-71.919 27.851-101.802l-0.519 0.957 88.758 88.753c-0.942 3.378-1.748 7.48-2.255 11.674l-0.041 0.416c0.050 52.352 42.475 94.777 94.823 94.827h0.005c4.609-0.548 8.71-1.355 12.697-2.438l-0.608 0.14 88.758 88.758c-28.926 17.019-63.685 27.145-100.795 27.333h-0.053zM493.219 305.301l-85.913-85.913c31.451-6.836 67.596-10.778 104.655-10.83h0.039c203.808 0.261 378.675 123.897 453.947 300.222l1.223 3.225c-27.047 61.907-63.29 114.822-107.651 159.695l0.048-0.050-140.845-140.847c0.574-6.283 1.897-12.348 1.897-18.779-0.121-115.169-93.45-208.5-208.609-208.619h-0.012c-6.431 0-12.496 1.325-18.781 1.899z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Eye_fill_hide_ic"],"grid":0},"attrs":[],"properties":{"order":558,"id":63,"name":"eye-fill-hide","prevSize":32,"code":59654},"setIdx":0,"setId":1,"iconIdx":64},{"icon":{"paths":["M336.775 700.845l-134.295 167.87c-6.204 7.71-15.64 12.601-26.217 12.601s-20.012-4.891-26.167-12.537l-0.050-0.065-134.295-167.87c-4.583-5.691-7.356-13.007-7.356-20.972 0-18.542 15.031-33.573 33.573-33.573h83.934v-470.034c0-27.813 22.547-50.361 50.361-50.361s50.361 22.547 50.361 50.361v0 470.034h83.934c18.542 0 33.573 15.033 33.573 33.573 0 7.965-2.773 15.28-7.406 21.037l0.050-0.065zM982.034 159.48h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.034 360.923h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.034 562.365h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.034 763.808h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Row height_down_ic-01"],"grid":0},"attrs":[],"properties":{"order":557,"id":64,"name":"row-height-down","prevSize":32,"code":59655},"setIdx":0,"setId":1,"iconIdx":65},{"icon":{"paths":["M1024 512.004c0 0.001 0 0.004 0 0.007 0 9.486-4.389 17.946-11.246 23.462l-0.058 0.045-150.589 120.47c-5.106 4.114-11.671 6.604-18.817 6.604-16.631 0-30.113-13.482-30.113-30.113 0-0.001 0-0.004 0-0.006v0-90.353h-180.706c-16.633 0-30.117-13.484-30.117-30.117s13.484-30.117 30.117-30.117v0h180.706v-90.353c0-16.633 13.485-30.117 30.117-30.117 7.145 0 13.707 2.488 18.871 6.644l-0.058-0.045 150.589 120.474c6.916 5.56 11.305 14.020 11.305 23.504 0 0.003 0 0.007 0 0.010v0zM391.53 481.886h-180.706v-90.353c0 0 0-0.001 0-0.001 0-16.633-13.484-30.117-30.117-30.117-7.146 0-13.711 2.489-18.874 6.647l0.058-0.045-150.589 120.474c-6.915 5.565-11.301 14.027-11.301 23.514s4.388 17.949 11.243 23.469l0.058 0.045 150.589 120.47c5.106 4.112 11.671 6.601 18.816 6.601 16.633 0 30.117-13.484 30.117-30.116v0-90.353h180.706c16.633 0 30.117-13.484 30.117-30.117s-13.484-30.117-30.117-30.117v0zM512 105.416c-24.95 0-45.176 20.226-45.176 45.176v0 722.823c0 24.95 20.226 45.176 45.176 45.176s45.176-20.226 45.176-45.176v0-722.823c0-24.95-20.226-45.176-45.176-45.176v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Reset width_outside_ic"],"grid":0},"attrs":[],"properties":{"order":556,"id":65,"name":"reset-width-outside","prevSize":32,"code":59656},"setIdx":0,"setId":1,"iconIdx":66},{"icon":{"paths":["M1024.001 512.004c0 15.709-12.735 28.444-28.444 28.444v0h-170.667v85.333c0 0.001 0 0.003 0 0.005 0 15.707-12.733 28.44-28.44 28.44-6.749 0-12.951-2.351-17.827-6.28l0.055 0.043-142.223-113.777c-6.532-5.255-10.677-13.248-10.677-22.208s4.145-16.953 10.621-22.165l0.055-0.043 142.223-113.781c4.821-3.883 11.020-6.232 17.768-6.232 15.709 0 28.444 12.735 28.444 28.444v0 85.333h170.667c15.709 0 28.444 12.735 28.444 28.444v0zM387.549 489.795l-142.223-113.781c-4.823-3.884-11.023-6.235-17.771-6.235-15.709 0-28.444 12.735-28.444 28.444 0 0 0 0.001 0 0.001v0 85.333h-170.667c-15.709 0-28.444 12.735-28.444 28.444s12.735 28.444 28.444 28.444v0h170.667v85.333c0.001 15.709 12.736 28.443 28.444 28.443 6.749 0 12.949-2.351 17.825-6.277l-0.055 0.043 142.223-113.777c6.531-5.256 10.673-13.248 10.673-22.208s-4.144-16.952-10.619-22.165l-0.055-0.043zM512 128.004c-23.564 0-42.667 19.103-42.667 42.667v0 682.668c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-682.668c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Reset width_inside_ic"],"grid":0},"attrs":[],"properties":{"order":555,"id":66,"name":"reset-width-inside","prevSize":32,"code":59657},"setIdx":0,"setId":1,"iconIdx":67},{"icon":{"paths":["M340.815 358.68c-5.546 11.35-17.006 19.028-30.257 19.028h-83.934v470.033c0 27.813-22.547 50.361-50.361 50.361s-50.361-22.547-50.361-50.361v0-470.033h-83.934c0 0-0.002 0-0.002 0-18.542 0-33.573-15.031-33.573-33.573 0-7.966 2.775-15.284 7.409-21.040l-0.050 0.065 134.294-167.869c6.205-7.708 15.64-12.598 26.217-12.598s20.012 4.89 26.167 12.534l0.050 0.065 134.294 167.869c4.583 5.691 7.356 13.009 7.356 20.972 0 5.291-1.223 10.294-3.402 14.746l0.088-0.198zM982.033 159.48h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.033 360.923h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.033 562.365h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.033 763.808h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Row height_up_ic-01"],"grid":0},"attrs":[],"properties":{"order":554,"id":67,"name":"row-height-up","prevSize":32,"code":59658},"setIdx":0,"setId":1,"iconIdx":68},{"icon":{"paths":["M16.697 429.262c-9.603 9.619-15.554 22.896-15.554 37.585 0 29.371 23.808 53.18 53.18 53.18 14.673 0 27.959-5.948 37.585-15.554v0l53.557-53.555 189.897 189.901c41.702 41.702 67.499 99.316 67.499 162.947 0 0.909-0.006 1.834-0.020 2.736l0.002-0.142-1.713 151.053c-0.002 0.177-0.004 0.388-0.004 0.594 0 29.371 23.808 53.18 53.18 53.18 14.685 0 27.977-5.949 37.599-15.574l212.328-212.319 169.398 169.398c9.642 8.902 22.58 14.357 36.786 14.357 29.992 0 54.305-24.312 54.305-54.305 0-14.202-5.445-27.144-14.391-36.829l-169.366-169.366 212.319-212.328c9.619-9.622 15.574-22.914 15.574-37.599 0-29.371-23.808-53.18-53.18-53.18-0.214 0-0.417 0.002-0.63 0.004h0.027l-151.053 1.713c-0.779 0.011-1.691 0.017-2.61 0.017-63.636 0-121.25-25.794-162.947-67.497l-189.901-189.901 53.555-53.557c9.781-9.65 15.84-23.046 15.84-37.861 0-29.371-23.808-53.18-53.18-53.18-14.815 0-28.21 6.059-37.853 15.831l-0.006 0.008-319.060 319.060zM410.568 565.6l-189.897-189.897 152.689-152.678 189.896 189.898c60.958 60.958 145.146 98.643 238.153 98.643 1.346 0 2.673-0.009 4.022-0.027l20.376-0.229-316.858 316.858 0.231-20.588c0.016-1.135 0.025-2.479 0.025-3.817 0-93.005-37.701-177.201-98.643-238.153v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Pin_right_ic-01"],"grid":0},"attrs":[],"properties":{"order":553,"id":68,"name":"pin-right","prevSize":32,"code":59659},"setIdx":0,"setId":1,"iconIdx":69},{"icon":{"paths":["M592.958 14.224c-9.779-9.779-23.288-15.828-38.211-15.828-29.844 0-54.039 24.193-54.039 54.039 0 14.923 6.049 28.43 15.826 38.209l54.419 54.421-192.957 192.962c-42.377 42.375-100.92 68.585-165.584 68.585-0.932 0-1.863-0.005-2.793-0.017l-153.347-1.739c-0.182-0.002-0.399-0.003-0.615-0.003-29.844 0-54.037 24.193-54.037 54.037 0 14.923 6.049 28.434 15.83 38.213l215.747 215.745-172.137 172.134c-9.048 9.798-14.597 22.946-14.597 37.389 0 30.475 24.705 55.182 55.182 55.182 14.443 0 27.591-5.549 37.428-14.632l-0.037 0.034 172.137-172.134 215.745 215.745c9.779 9.779 23.288 15.828 38.211 15.828 29.844 0 54.037-24.193 54.037-54.037 0-0.214-0.002-0.431-0.003-0.645v0.032l-1.744-153.488c-0.010-0.789-0.015-1.719-0.015-2.651 0-64.664 26.21-123.207 68.585-165.584l192.964-192.964 54.419 54.426c9.779 9.779 23.288 15.828 38.211 15.828 29.845 0 54.039-24.193 54.039-54.039 0-14.923-6.049-28.432-15.828-38.211l-324.208-324.206zM454.415 414.444l192.964-192.96 155.151 155.159-192.957 192.964c-61.935 61.933-100.242 147.493-100.242 242.002 0 1.363 0.008 2.722 0.024 4.081l-0.002-0.206 0.238 20.916-321.972-321.976 20.921 0.238c1.153 0.014 2.518 0.022 3.882 0.022 94.504 0 180.062-38.307 241.994-100.241v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Pin_left_ic-01"],"grid":0},"attrs":[],"properties":{"order":552,"id":69,"name":"pin-left","prevSize":32,"code":59660},"setIdx":0,"setId":1,"iconIdx":70},{"icon":{"paths":["M223.104 0.014c-29.251 0-52.964 23.713-52.964 52.964s23.713 52.964 52.964 52.964v0h75.435v267.471c-0.002 64.292-26.438 122.411-69.031 164.079l-0.041 0.041-107.586 105.173c-9.838 9.625-15.939 23.036-15.939 37.873 0 29.251 23.712 52.963 52.963 52.964h299.059v238.611c1.228 28.897 24.953 51.859 54.042 51.859s52.814-22.962 54.037-51.748l0.003-0.111-0.007-238.608h299.059c0 0 0 0 0 0 29.251 0 52.964-23.713 52.964-52.964 0-14.837-6.101-28.248-15.929-37.863l-0.010-0.010-107.581-105.173c-42.636-41.708-69.072-99.826-69.072-164.119v0-267.474h75.428c29.251 0 52.964-23.713 52.964-52.964s-23.713-52.964-52.964-52.964v0h-577.793zM404.467 373.414v-267.471h215.070v267.471c0 0 0 0 0 0.002 0 93.966 38.636 178.907 100.889 239.805l0.061 0.060 14.661 14.335h-446.298l14.665-14.335c62.314-60.957 100.952-145.899 100.952-239.866v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Pin_ic-01"],"grid":0},"attrs":[],"properties":{"order":542,"id":70,"name":"pin","prevSize":32,"code":59661},"setIdx":0,"setId":1,"iconIdx":71},{"icon":{"paths":["M875.366 512.005c0 0.002 0 0.005 0 0.006 0 10.402-4.809 19.682-12.327 25.734l-0.063 0.050-165.162 132.128c-5.601 4.512-12.802 7.243-20.642 7.243-18.243 0-33.032-14.789-33.032-33.032 0 0 0-0.002 0-0.002v0-99.097h-264.269v99.097c-0.002 18.243-14.79 33.030-33.032 33.030-7.838 0-15.038-2.73-20.7-7.29l0.063 0.050-165.162-132.128c-7.584-6.104-12.395-15.385-12.395-25.79s4.812-19.686 12.331-25.74l0.063-0.050 165.162-132.133c5.601-4.51 12.801-7.24 20.637-7.24 18.243 0 33.032 14.789 33.032 33.032 0 0 0 0.002 0 0.002v0 99.097h264.269v-99.097c0-0.002 0-0.003 0-0.005 0-18.243 14.789-33.032 33.032-33.032 7.839 0 15.041 2.731 20.705 7.293l-0.063-0.050 165.162 132.133c7.581 6.101 12.392 15.38 12.392 25.781 0 0.003 0 0.006 0 0.009v0zM974.452 66.070c-27.365 0-49.548 22.184-49.548 49.548v0 792.773c0 27.365 22.184 49.548 49.548 49.548s49.548-22.184 49.548-49.548v0-792.773c0-27.365-22.184-49.548-49.548-49.548v0zM49.548 66.070c-27.365 0-49.548 22.184-49.548 49.548v0 792.773c0 27.365 22.184 49.548 49.548 49.548s49.548-22.184 49.548-49.548v0-792.773c0-27.365-22.184-49.548-49.548-49.548v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Expand_horizontal_ic-01"],"grid":0},"attrs":[],"properties":{"order":545,"id":71,"name":"expand-horizontal","prevSize":32,"code":59662},"setIdx":0,"setId":1,"iconIdx":72},{"icon":{"paths":["M354.077 326.206l132.133-165.162c6.104-7.584 15.385-12.395 25.79-12.395s19.686 4.812 25.74 12.331l0.050 0.063 132.129 165.162zM354.077 326.206c-4.51 5.601-7.24 12.801-7.24 20.637 0 18.243 14.789 33.032 33.032 33.032 0 0 0.002 0 0.002 0h99.097v264.259h-99.097c-18.243 0-33.032 14.79-33.032 33.032 0 7.836 2.728 15.033 7.287 20.697l-0.050-0.063 132.133 165.162c6.102 7.586 15.385 12.399 25.79 12.399s19.688-4.814 25.74-12.334l0.050-0.063 132.129-165.162c4.512-5.601 7.243-12.801 7.243-20.638 0-18.24-14.787-33.027-33.027-33.027-0.002 0-0.005 0-0.006 0h-99.097v-264.259h99.097c18.243-0.002 33.030-14.79 33.030-33.032 0-7.838-2.73-15.038-7.29-20.7l0.050 0.063zM908.387 0.004h-792.775c-27.365 0-49.548 22.184-49.548 49.548s22.184 49.548 49.548 49.548v0h792.775c27.365 0 49.548-22.184 49.548-49.548s-22.184-49.548-49.548-49.548v0zM908.387 924.907h-792.775c-27.365 0-49.548 22.184-49.548 49.548s22.184 49.548 49.548 49.548v0h792.775c27.365 0 49.548-22.184 49.548-49.548s-22.184-49.548-49.548-49.548v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Expand_vertical_ic-01"],"grid":0},"attrs":[],"properties":{"order":590,"id":72,"name":"expand-vertical","prevSize":32,"code":59663},"setIdx":0,"setId":1,"iconIdx":73},{"icon":{"paths":["M1004.681 642.934l-445.44-445.44c-12.090-12.092-28.791-19.571-47.241-19.571s-35.152 7.479-47.241 19.571l-445.446 445.44c-11.879 12.054-19.214 28.614-19.214 46.886 0 36.901 29.915 66.816 66.816 66.816 18.274 0 34.834-7.337 46.899-19.224l398.186-398.184 398.199 398.192c12.075 12 28.716 19.418 47.091 19.418 36.899 0 66.81-29.913 66.81-66.81 0-18.377-7.419-35.018-19.425-47.097l0.004 0.004z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Arrow_up_ic-01"],"grid":0},"attrs":[],"properties":{"order":476,"id":73,"name":"arrow-up","prevSize":32,"code":59664},"setIdx":0,"setId":1,"iconIdx":74},{"icon":{"paths":["M197.451 464.753c-12.093 12.091-19.573 28.797-19.573 47.249s7.48 35.158 19.573 47.249l445.502 445.496c12.076 12.001 28.72 19.421 47.097 19.421 36.904 0 66.818-29.916 66.818-66.818 0-18.379-7.42-35.022-19.427-47.103l-398.238-398.241 398.243-398.243c11.809-12.043 19.095-28.555 19.095-46.771 0-36.906-29.919-66.824-66.824-66.824-18.212 0-34.722 7.286-46.775 19.101l-445.492 445.485z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Arrow_left_ic-01"],"grid":0},"attrs":[],"properties":{"order":477,"id":74,"name":"arrow-left","prevSize":32,"code":59665},"setIdx":0,"setId":1,"iconIdx":75},{"icon":{"paths":["M1004.265 286.774c-12.079-12.081-28.767-19.554-47.201-19.554s-35.122 7.473-47.201 19.554l-397.865 397.863-397.859-397.863c-12.115-12.294-28.949-19.913-47.562-19.913-36.87 0-66.76 29.89-66.76 66.76 0 18.611 7.617 35.445 19.901 47.552l445.079 445.072c12.079 12.081 28.767 19.554 47.201 19.554s35.122-7.473 47.201-19.554l445.064-445.064c12.081-12.079 19.554-28.769 19.554-47.203s-7.473-35.124-19.554-47.203v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Arrow_down_ic-01"],"grid":0},"attrs":[],"properties":{"order":478,"id":75,"name":"arrow-down","prevSize":32,"code":59666},"setIdx":0,"setId":1,"iconIdx":76},{"icon":{"paths":["M826.603 464.744l-445.579-445.579c-12.062-11.901-28.64-19.249-46.932-19.249-36.913 0-66.837 29.924-66.837 66.837 0 18.295 7.35 34.874 19.259 46.942l398.317 398.31-398.323 398.319c-11.797 12.043-19.076 28.548-19.076 46.755 0 36.913 29.924 66.837 66.837 66.837 18.207 0 34.711-7.279 46.767-19.086l445.568-445.568c12.095-12.093 19.577-28.803 19.577-47.258s-7.482-35.165-19.577-47.258v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Arrow_right_ic-01"],"grid":0},"attrs":[],"properties":{"order":479,"id":76,"name":"arrow-right","prevSize":32,"code":59667},"setIdx":0,"setId":1,"iconIdx":77},{"icon":{"paths":["M1022.545 156.242c-7.306-68.806-64.963-121.963-135.065-122.104h-751.010c-71.653 0.138-130.297 55.648-135.429 126.011l-0.026 0.443c-0.25 3.37-1.016 6.594-1.016 10.029v682.716c0 0.016 0 0.035 0 0.054 0 75.373 61.099 136.473 136.47 136.478h750.996c0.002 0 0.003 0 0.005 0 75.403 0 136.529-61.126 136.529-136.529 0-0.002 0-0.003 0-0.005v0-682.716c-0.253-5.328-0.773-10.278-1.555-15.142l0.101 0.763zM102.401 170.671c0.213-3.083 0.818-5.955 1.766-8.664l-0.070 0.23c3.696-14.766 16.789-25.552 32.422-25.683h170.681v170.667h-204.8zM409.6 136.556h204.8v170.667h-204.8zM716.8 136.556h170.667c12.899 0.123 24.059 7.445 29.669 18.134l0.090 0.186c0.478 0.896 1.291 1.562 1.691 2.509l0.192 0.955c1.526 3.643 2.437 7.874 2.491 12.31v136.571h-204.8zM136.471 887.47c-18.818-0.006-34.070-15.262-34.070-34.082 0-0.018 0-0.037 0-0.054v0.003-443.716h204.8v477.849zM409.6 887.47v-477.849h204.8v477.849zM921.599 853.337c0 18.851-15.282 34.133-34.133 34.133v0h-170.667v-477.849h204.8z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Manage calumn_ic-01"],"grid":0},"attrs":[],"properties":{"order":480,"id":77,"name":"manage-column","prevSize":32,"code":59668},"setIdx":0,"setId":1,"iconIdx":78},{"icon":{"paths":["M1017.284 495.792l-152.836-152.836c-4.131-4.049-9.795-6.549-16.043-6.549-12.662 0-22.925 10.263-22.925 22.925 0 6.249 2.5 11.914 6.555 16.049l113.697 113.696h-922.807c-12.662 0-22.925 10.263-22.925 22.925s10.263 22.925 22.925 22.925v0h922.804l-113.7 113.7c-4.118 4.144-6.663 9.854-6.663 16.158 0 12.661 10.263 22.924 22.924 22.924 6.304 0 12.014-2.545 16.158-6.664l152.835-152.835c4.149-4.148 6.716-9.879 6.716-16.21s-2.566-12.062-6.716-16.21v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Long arrow_right_ic-01"],"grid":0},"attrs":[],"properties":{"order":481,"id":78,"name":"long-arrow-right","prevSize":32,"code":59669},"setIdx":0,"setId":1,"iconIdx":79},{"icon":{"paths":["M1001.073 489.076h-922.801l113.699-113.699c4.051-4.131 6.551-9.796 6.551-16.045 0-12.662-10.263-22.925-22.925-22.925-6.249 0-11.913 2.499-16.048 6.552l-152.833 152.831c-4.149 4.148-6.716 9.879-6.716 16.21s2.566 12.062 6.716 16.21l152.837 152.836c4.144 4.118 9.854 6.663 16.158 6.663 12.66 0 22.924-10.263 22.924-22.924 0-6.304-2.545-12.016-6.664-16.159l-113.695-113.698h922.799c12.662 0 22.925-10.263 22.925-22.925s-10.263-22.925-22.925-22.925v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Long arrow_left_ic-01"],"grid":0},"attrs":[],"properties":{"order":482,"id":79,"name":"long-arrow-left","prevSize":32,"code":59670},"setIdx":0,"setId":1,"iconIdx":80},{"icon":{"paths":["M1011.186 485.354l-170.667-136.537c-5.786-4.659-13.224-7.478-21.322-7.478-18.851 0-34.133 15.282-34.133 34.133v0 85.333h-221.867v-221.867h85.333c18.851-0.002 34.131-15.283 34.131-34.133 0-8.099-2.821-15.539-7.533-21.39l0.051 0.066-136.532-170.667c-6.307-7.837-15.898-12.808-26.65-12.808s-20.342 4.973-26.598 12.742l-0.051 0.066-136.537 170.667c-4.661 5.787-7.482 13.227-7.482 21.325 0 18.851 15.282 34.133 34.133 34.133 0 0 0.002 0 0.002 0h85.333v221.867h-221.867v-85.333c0 0 0-0.002 0-0.002 0-18.851-15.282-34.133-34.133-34.133-8.099 0-15.539 2.821-21.39 7.533l0.066-0.051-170.667 136.537c-7.837 6.307-12.808 15.898-12.808 26.65s4.973 20.342 12.742 26.598l0.066 0.051 170.667 136.532c5.787 4.661 13.227 7.482 21.325 7.482 18.851 0 34.133-15.282 34.133-34.131v0-85.333h221.867v221.867h-85.333c-18.851 0-34.133 15.283-34.133 34.133 0 8.098 2.819 15.534 7.53 21.387l-0.051-0.066 136.537 170.667c6.306 7.838 15.898 12.813 26.65 12.813s20.344-4.974 26.598-12.746l0.051-0.066 136.532-170.667c4.662-5.787 7.485-13.227 7.485-21.326 0-18.848-15.28-34.128-34.128-34.128-0.002 0-0.005 0-0.006 0h-85.333v-221.867h221.867v85.333c0 0.002 0 0.003 0 0.006 0 18.848 15.28 34.128 34.128 34.128 8.099 0 15.541-2.821 21.392-7.536l-0.066 0.051 170.667-136.532c7.838-6.306 12.813-15.898 12.813-26.65s-4.974-20.344-12.746-26.598l-0.066-0.051z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Cursor_ic-01"],"grid":0},"attrs":[],"properties":{"order":483,"id":80,"name":"cursor","prevSize":32,"code":59671},"setIdx":0,"setId":1,"iconIdx":81},{"icon":{"paths":["M735.495 341.339v568.886h-455.117v-568.886zM650.16 0.004h-284.445l-56.889 56.889h-162.54c-20.197 0-36.572 16.373-36.572 36.572v0 40.634c0 20.197 16.373 36.572 36.572 36.572v0h723.302c20.197 0 36.572-16.373 36.572-36.572v0-40.634c0-20.197-16.373-36.572-36.572-36.572v0h-162.537zM849.269 264.131c0-20.197-16.373-36.572-36.572-36.572v0h-609.523c-20.197 0-36.572 16.373-36.572 36.572v0 646.092c0.194 62.759 51.017 113.585 113.758 113.781h455.135c62.757-0.201 113.577-51.022 113.774-113.761v-0.020z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Delete_ic-01"],"grid":0},"attrs":[],"properties":{"order":484,"id":81,"name":"delete","prevSize":32,"code":59672},"setIdx":0,"setId":1,"iconIdx":82},{"icon":{"paths":["M849.592 642.213c-6.268 12.82-19.214 21.493-34.185 21.495h-94.816v303.407c0 31.419-25.47 56.889-56.889 56.889s-56.889-25.47-56.889-56.889v0-303.407h-94.814c-0.002 0-0.004 0-0.007 0-20.942 0-37.92-16.978-37.92-37.92 0-8.999 3.134-17.268 8.373-23.769l-0.057 0.073 151.703-189.63c7.006-8.709 17.664-14.236 29.611-14.236s22.604 5.527 29.554 14.162l0.057 0.073 151.703 189.63c5.18 6.43 8.315 14.697 8.315 23.696 0 5.972-1.38 11.621-3.84 16.647l0.1-0.224zM330.681 611.546c7.008 8.709 17.666 14.236 29.612 14.236s22.606-5.527 29.556-14.164l0.057-0.073 151.703-189.63c5.18-6.43 8.316-14.697 8.316-23.696 0-20.942-16.978-37.92-37.92-37.92-0.002 0-0.005 0-0.007 0h-94.814v-303.407c0-31.419-25.47-56.889-56.889-56.889s-56.889 25.47-56.889 56.889v0 303.407h-94.814c-20.946 0-37.925 16.981-37.925 37.925 0 8.997 3.132 17.26 8.366 23.764l-0.057-0.073 151.703 189.63z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Sort_inside_ic-01"],"grid":0},"attrs":[],"properties":{"order":485,"id":82,"name":"sort-inside","prevSize":32,"code":59673},"setIdx":0,"setId":1,"iconIdx":83},{"icon":{"paths":["M857.826 812.298l-157.537 196.923c-7.276 9.044-18.343 14.784-30.749 14.784s-23.474-5.74-30.69-14.706l-0.059-0.076-157.537-196.923c-5.38-6.678-8.636-15.262-8.636-24.607 0-21.748 17.631-39.378 39.378-39.378 0.002 0 0.006 0 0.007 0h98.461v-315.077c0-32.627 26.45-59.077 59.077-59.077s59.077 26.45 59.077 59.077v0 315.077h98.461c0.002 0 0.004 0 0.007 0 21.748 0 39.378 17.631 39.378 39.378 0 9.345-3.255 17.932-8.695 24.683l0.059-0.076zM542.749 211.707l-157.537-196.923c-7.278-9.042-18.345-14.778-30.751-14.778s-23.474 5.738-30.692 14.703l-0.059 0.076-157.537 196.923c-5.378 6.678-8.633 15.262-8.633 24.605 0 21.751 17.633 39.384 39.384 39.384 0 0 0.002 0 0.002 0h98.461v315.077c0 32.627 26.45 59.077 59.077 59.077s59.077-26.45 59.077-59.077v0-315.077h98.461c21.751-0.002 39.382-17.634 39.382-39.384 0-9.345-3.255-17.93-8.692-24.681l0.059 0.076z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Sort_outside_ic-01"],"grid":0},"attrs":[],"properties":{"order":486,"id":83,"name":"sort-outside","prevSize":32,"code":59674},"setIdx":0,"setId":1,"iconIdx":84},{"icon":{"paths":["M1024.001 929.189c0 31.419-25.47 56.889-56.889 56.889h-872.296c-52.364 0-94.815-42.451-94.815-94.815v0-796.445c0.094-31.348 25.528-56.722 56.889-56.722s56.795 25.376 56.889 56.714v777.491h853.334c31.419 0 56.889 25.47 56.889 56.889v0zM922.973 116.468c-8.363-7.55-19.498-12.17-31.713-12.17-13.967 0-26.524 6.040-35.199 15.65l-0.037 0.042c-154.983 171.483-360.922 294.267-593.848 344.488l-7.357 1.329c-21.106 5.096-36.539 23.819-36.539 46.146 0 26.184 21.225 47.409 47.409 47.409 3.705 0 7.314-0.426 10.775-1.23l-0.321 0.063c259.922-56.184 482.643-189.188 649.414-373.723l0.939-1.054c7.55-8.363 12.17-19.5 12.17-31.713 0-13.968-6.041-26.524-15.652-35.2l-0.042-0.037zM834.371 417.188v379.26c0 10.473 8.49 18.966 18.966 18.966v0h75.849c10.473 0 18.966-8.49 18.966-18.966v0-379.26c-0.002-10.473-8.492-18.962-18.966-18.962h-75.853c-10.472 0.002-18.961 8.49-18.962 18.962v0zM625.777 493.039v303.407c0 10.473 8.49 18.966 18.966 18.966v0h75.849c10.473-0.002 18.962-8.492 18.962-18.966v-303.407c0-10.473-8.489-18.964-18.962-18.966h-75.853c-10.473 0.002-18.962 8.492-18.962 18.966v0zM417.185 606.818v189.63c0 10.473 8.489 18.964 18.962 18.966h75.853c10.473 0 18.966-8.49 18.966-18.966v0-189.63c0-10.473-8.49-18.966-18.966-18.966h-75.853c-10.473 0.002-18.962 8.492-18.962 18.966v0zM208.593 682.669v113.777c0 10.473 8.489 18.964 18.962 18.966h75.853c10.473-0.002 18.962-8.492 18.962-18.966v0-113.777c0-10.473-8.489-18.964-18.962-18.966h-75.853c-10.473 0.002-18.962 8.492-18.962 18.966v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Metrics_ic-01"],"grid":0},"attrs":[],"properties":{"order":487,"id":84,"name":"metrics","prevSize":32,"code":59676},"setIdx":0,"setId":1,"iconIdx":85},{"icon":{"paths":["M979.838 563.781l-168.62-202.346 168.62-202.342c8.686-10.366 13.961-23.845 13.961-38.557 0-33.26-26.962-60.222-60.222-60.222 0 0-0.002 0-0.002 0h-662.474c0-0.052 0-0.113 0-0.173 0-33.261-26.964-60.226-60.226-60.226s-60.226 26.964-60.226 60.226c0 0.061 0 0.121 0 0.183v-0.010 843.151h-60.226c-33.187 0.098-60.051 27.024-60.051 60.226s26.864 60.126 60.043 60.226h240.91c33.187-0.098 60.051-27.024 60.051-60.226s-26.864-60.126-60.043-60.226h-60.235v-240.9h662.474c33.261 0 60.224-26.964 60.224-60.226 0-14.712-5.275-28.192-14.037-38.651l0.076 0.095zM686.56 322.881c-8.686 10.364-13.961 23.845-13.961 38.557s5.275 28.191 14.037 38.65l-0.076-0.095 118.433 142.12h-533.894v-361.348h533.894l-118.433 142.118z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Tags_ic-01"],"grid":0},"attrs":[],"properties":{"order":488,"id":85,"name":"tags","prevSize":32,"code":59677},"setIdx":0,"setId":1,"iconIdx":86},{"icon":{"paths":["M662.517 1012.462c9.822 7.212 22.15 11.541 35.491 11.541 33.325 0 60.341-27.014 60.341-60.34v0-622.136c0-77.761-63.037-140.798-140.798-140.798v0h-391.123c-77.761 0-140.798 63.037-140.798 140.798v0 622.136c0 0.002 0 0.002 0 0.003 0 33.324 27.014 60.338 60.338 60.338 13.341 0 25.67-4.33 35.66-11.66l-0.168 0.118 240.526-174.927 240.528 174.927zM386.497 714.124l-180.183 131.042v-503.636c0-11.108 9.005-20.114 20.114-20.114h391.123c11.108 0 20.114 9.005 20.114 20.114v0 503.638l-180.186-131.045c-9.82-7.214-22.15-11.544-35.491-11.544s-25.67 4.33-35.66 11.662l0.168-0.118zM933.991 140.801v622.133c0 33.325-27.016 60.341-60.341 60.341s-60.341-27.016-60.341-60.341v0-622.133c0-11.108-9.005-20.114-20.114-20.114v0h-471.578c-33.325 0-60.341-27.016-60.341-60.341s27.016-60.341 60.341-60.341v0h471.58c77.761 0 140.796 63.037 140.796 140.798v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Bookmarks_ic-01"],"grid":0},"attrs":[],"properties":{"order":489,"id":86,"name":"bookmarks","prevSize":32,"code":59678},"setIdx":0,"setId":1,"iconIdx":87},{"icon":{"paths":["M94.867 37.993c-52.359 0-94.805 42.445-94.807 94.803v0 758.577c0 52.36 42.446 94.807 94.807 94.807v0h834.387c52.36 0 94.807-42.446 94.807-94.807v0-758.577c-0.002-52.359-42.446-94.803-94.807-94.803h-834.387zM393.901 594.272v-164.353h516.394v164.353zM113.828 594.272v-164.353h166.305v164.353zM280.133 708.056v164.357h-166.307v-164.357zM393.898 872.414v-164.357h516.395v164.357zM280.136 316.133h-166.307v-164.375h166.305zM393.901 316.133v-164.375h516.394v164.375z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Runs_ic-01"],"grid":0},"attrs":[],"properties":{"order":551,"id":87,"name":"runs","prevSize":32,"code":59679},"setIdx":0,"setId":1,"iconIdx":88},{"icon":{"paths":["M476.372 172.972c10.476-10.324 16.969-24.668 16.969-40.53 0-31.419-25.47-56.889-56.889-56.889-15.86 0-30.204 6.491-40.521 16.958l-0.007 0.007zM56.889 512.005l-40.226-40.224c-10.295 10.293-16.663 24.516-16.663 40.224s6.368 29.931 16.663 40.224v0zM395.924 931.488c10.251 10.041 24.299 16.236 39.796 16.236 31.419 0 56.889-25.47 56.889-56.889 0-15.497-6.196-29.545-16.245-39.806l0.009 0.009zM967.111 568.894c31.419 0 56.889-25.47 56.889-56.889s-25.47-56.889-56.889-56.889v0zM395.924 92.519l-379.259 379.259 80.453 80.448 379.259-379.259zM16.665 552.229l379.259 379.259 80.448-80.448-379.259-379.259zM56.889 568.894h910.222v-113.778h-910.222z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_left_ic"],"grid":0},"attrs":[],"properties":{"order":546,"id":88,"name":"back-left","prevSize":32,"code":59680},"setIdx":0,"setId":1,"iconIdx":89},{"icon":{"paths":["M931.483 547.63c-10.293-10.293-24.514-16.66-40.222-16.66s-29.929 6.366-40.222 16.66l-282.149 282.149v-772.888c0-31.419-25.47-56.889-56.889-56.889s-56.889 25.47-56.889 56.889v0 772.888l-282.145-282.149c-10.324-10.476-24.669-16.969-40.53-16.969-31.419 0-56.889 25.47-56.889 56.889 0 15.86 6.491 30.205 16.958 40.521l379.273 379.268c10.293 10.295 24.514 16.663 40.222 16.663s29.929-6.368 40.222-16.663l379.261-379.261c10.295-10.293 16.663-24.516 16.663-40.224s-6.368-29.931-16.663-40.224v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_down_ic"],"grid":0},"attrs":[],"properties":{"order":589,"id":89,"name":"back-down","prevSize":32,"code":59681},"setIdx":0,"setId":1,"iconIdx":90},{"icon":{"paths":["M931.481 395.925l-379.259-379.259c-10.293-10.295-24.514-16.663-40.222-16.663s-29.929 6.368-40.222 16.663l-379.264 379.259c-10.114 10.263-16.359 24.363-16.359 39.92 0 31.419 25.47 56.889 56.889 56.889 15.559 0 29.659-6.247 39.931-16.368l282.137-282.135v772.883c0 31.419 25.47 56.889 56.889 56.889s56.889-25.47 56.889-56.889v0-772.883l282.147 282.142c10.281 10.217 24.45 16.533 40.094 16.533 31.417 0 56.884-25.468 56.884-56.884 0-15.646-6.316-29.815-16.539-40.1l0.004 0.004z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_up_ic"],"grid":0},"attrs":[],"properties":{"order":588,"id":90,"name":"back-up","prevSize":32,"code":59682},"setIdx":0,"setId":1,"iconIdx":91},{"icon":{"paths":["M1007.336 471.778l-379.261-379.261c-10.252-10.050-24.308-16.253-39.812-16.253-31.419 0-56.889 25.47-56.889 56.889 0 15.506 6.204 29.565 16.265 39.826l282.14 282.135h-772.893c-31.419 0-56.889 25.47-56.889 56.889s25.47 56.889 56.889 56.889v0h772.888l-282.144 282.145c-10.219 10.281-16.535 24.452-16.535 40.096 0 31.417 25.469 56.884 56.884 56.884 15.645 0 29.813-6.315 40.098-16.535l379.257-379.257c10.295-10.293 16.663-24.516 16.663-40.224s-6.368-29.931-16.663-40.224v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_right_ic"],"grid":0},"attrs":[],"properties":{"order":587,"id":91,"name":"back-right","prevSize":32,"code":59683},"setIdx":0,"setId":1,"iconIdx":92},{"icon":{"paths":["M947.231-0.15h-725.372c-42.491 0-76.938 34.447-76.938 76.938s34.447 76.938 76.938 76.938v0h539.624l-739.108 739.117c-13.721 13.89-22.199 32.987-22.199 54.066 0 42.491 34.447 76.938 76.938 76.938 21.079 0 40.178-8.478 54.075-22.209l739.11-739.101v539.629c0 42.491 34.447 76.938 76.938 76.938s76.938-34.447 76.938-76.938v0-725.372c0-0.002 0-0.005 0-0.010 0-42.491-34.447-76.938-76.938-76.938-0.002 0-0.007 0-0.010 0v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_up_right_ic"],"grid":0},"attrs":[],"properties":{"order":586,"id":92,"name":"back-up-right","prevSize":32,"code":59684},"setIdx":0,"setId":1,"iconIdx":93},{"icon":{"paths":["M1001.636 892.824l-739.121-739.121h539.634c42.492 0 76.938-34.447 76.938-76.938s-34.447-76.938-76.938-76.938v0h-725.376c-42.492 0-76.938 34.447-76.938 76.938v0 725.388c0 42.492 34.447 76.938 76.938 76.938s76.938-34.447 76.938-76.938v0-539.642l739.112 739.112c13.89 13.726 32.99 22.204 54.071 22.204 42.492 0 76.938-34.447 76.938-76.938 0-21.076-8.475-40.174-22.204-54.071l0.007 0.007z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_up_left_ic"],"grid":0},"attrs":[],"properties":{"order":585,"id":93,"name":"back-up-left","prevSize":32,"code":59685},"setIdx":0,"setId":1,"iconIdx":94},{"icon":{"paths":["M1001.469 22.525c-13.921-13.917-33.15-22.524-54.389-22.524s-40.469 8.607-54.389 22.524l-738.864 738.877v-539.46c0-42.478-34.435-76.913-76.913-76.913s-76.913 34.435-76.913 76.913v0 725.146c0 42.478 34.435 76.913 76.913 76.913v0h725.145c42.478 0 76.913-34.435 76.913-76.913s-34.435-76.913-76.913-76.913v0h-539.466l738.877-738.877c13.919-13.919 22.528-33.147 22.528-54.387s-8.609-40.468-22.528-54.387v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_down_left"],"grid":0},"attrs":[],"properties":{"order":584,"id":94,"name":"back-down-left","prevSize":32,"code":59686},"setIdx":0,"setId":1,"iconIdx":95},{"icon":{"paths":["M946.947 145.169c-42.464 0-76.888 34.424-76.888 76.888v0 539.29l-738.634-738.634c-13.946-14.114-33.302-22.855-54.701-22.855-42.464 0-76.888 34.424-76.888 76.888 0 21.399 8.741 40.755 22.85 54.696l738.651 738.641h-539.29c-42.464 0-76.888 34.424-76.888 76.888s34.424 76.888 76.888 76.888h724.902c42.464 0 76.888-34.424 76.888-76.888v0-724.912c0-42.464-34.424-76.888-76.888-76.888v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_down_right"],"grid":0},"attrs":[],"properties":{"order":583,"id":95,"name":"back-down-right","prevSize":32,"code":59687},"setIdx":0,"setId":1,"iconIdx":96},{"icon":{"paths":["M118.154 393.852v0c65.254 0 118.154 52.9 118.154 118.154v0 0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0zM512 393.852v0c65.254 0 118.154 52.9 118.154 118.154v0 0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0zM905.846 393.852v0c65.254 0 118.154 52.9 118.154 118.154v0 0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["More_horizontal_ic"],"grid":0},"attrs":[],"properties":{"order":582,"id":96,"name":"more-horizontal","prevSize":32,"code":59688},"setIdx":0,"setId":1,"iconIdx":97},{"icon":{"paths":["M630.154 118.158v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM630.154 512.006v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM630.154 905.851v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["More_vertical_ic"],"grid":0},"attrs":[],"properties":{"order":581,"id":97,"name":"more-vertical","prevSize":32,"code":59689},"setIdx":0,"setId":1,"iconIdx":98},{"icon":{"paths":["M807.384 118.158v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM807.384 512.006v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM807.384 905.851v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM452.923 118.158v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM452.923 512.006v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM452.923 905.851v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Drag_ic-01"],"grid":0},"attrs":[],"properties":{"order":580,"id":98,"name":"drag","prevSize":32,"code":59690},"setIdx":0,"setId":1,"iconIdx":99},{"icon":{"paths":["M939.133 152.637c15.441-16.184 24.944-38.152 24.944-62.339 0-49.911-40.459-90.37-90.37-90.37-25.723 0-48.934 10.748-65.392 27.994l-0.034 0.037-401.759 421.629c-15.444 16.181-24.95 38.152-24.95 62.342s9.505 46.158 24.984 62.376l-0.034-0.034 401.759 421.626c16.492 17.285 39.702 28.031 65.426 28.031 49.908 0 90.367-40.459 90.367-90.367 0-24.184-9.503-46.152-24.975-62.37l0.034 0.037-342.369-359.298zM240.9 90.295c0-49.908-40.459-90.367-90.367-90.367s-90.367 40.459-90.367 90.367v0 843.255c0 49.908 40.459 90.367 90.367 90.367s90.367-40.459 90.367-90.367v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Move to_left_ic"],"grid":0},"attrs":[],"properties":{"order":579,"id":99,"name":"move-to-left","prevSize":32,"code":59691},"setIdx":0,"setId":1,"iconIdx":100},{"icon":{"paths":["M85.108 871.196c-15.444 16.184-24.947 38.154-24.947 62.344 0 49.911 40.462 90.372 90.372 90.372 25.723 0 48.933-10.745 65.392-27.994l0.034-0.037 401.761-421.625c15.444-16.181 24.95-38.152 24.95-62.342s-9.505-46.158-24.984-62.376l0.034 0.034-401.761-421.631c-16.492-17.283-39.702-28.031-65.425-28.031-49.911 0-90.369 40.459-90.369 90.369 0 24.187 9.503 46.155 24.978 62.376l-0.034-0.037 342.365 359.289zM783.34 933.537c0 49.908 40.459 90.367 90.367 90.367s90.367-40.459 90.367-90.367v0-843.247c0-49.908-40.459-90.367-90.367-90.367s-90.367 40.459-90.367 90.367v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Move to_right_ic"],"grid":0},"attrs":[],"properties":{"order":578,"id":100,"name":"move-to-right","prevSize":32,"code":59692},"setIdx":0,"setId":1,"iconIdx":101},{"icon":{"paths":["M512.189 124.86l-0.189 0.012v-100.698c0-0.002 0-0.003 0-0.005 0-10.7-8.675-19.375-19.375-19.375-4.3 0-8.274 1.402-11.487 3.772l0.053-0.038-220.853 161.427c-4.838 3.565-7.941 9.241-7.941 15.641s3.103 12.076 7.888 15.603l0.053 0.038 220.856 161.427c3.161 2.331 7.132 3.731 11.431 3.731 10.7 0 19.375-8.675 19.375-19.375 0 0 0-0.002 0-0.002v0-97.194h0.189c178.487 2.986 322.031 148.379 322.031 327.297 0 180.785-146.555 327.34-327.34 327.34-162.339 0-297.078-118.175-322.882-273.194l-0.262-1.91c-5.034-29.754-30.614-52.132-61.42-52.132-34.378 0-62.247 27.87-62.247 62.247 0 3.058 0.221 6.064 0.646 9.003l-0.039-0.335c35.648 217.067 221.879 380.655 446.318 380.655 249.623 0 451.982-202.359 451.982-451.982 0-247.796-199.409-449.019-446.511-451.951l-0.277-0.003z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["reset_ic-01"],"grid":0},"attrs":[],"properties":{"order":577,"id":101,"name":"reset","prevSize":32,"code":59693},"setIdx":0,"setId":1,"iconIdx":102},{"icon":{"paths":["M73.147 146.287c-40.395 0-73.143 32.748-73.143 73.143s32.748 73.143 73.143 73.143h877.713c40.395 0 73.143-32.748 73.143-73.143s-32.748-73.143-73.143-73.143v0zM73.147 438.862c-40.395 0-73.142 32.746-73.142 73.142s32.746 73.142 73.142 73.142h292.57c40.395 0 73.142-32.746 73.142-73.142s-32.746-73.142-73.142-73.142v0zM0.003 804.572c0.002-40.394 32.748-73.14 73.143-73.14s73.143 32.746 73.143 73.143c0 40.395-32.746 73.142-73.142 73.143v0c-40.395 0-73.143-32.748-73.143-73.145 0 0 0-0.002 0-0.002v0zM292.575 731.43c0 0-0.002 0-0.002 0-40.395 0-73.143 32.748-73.143 73.143s32.748 73.143 73.143 73.143c40.395 0 73.143-32.748 73.143-73.143 0 0 0-0.002 0-0.002v0c-0.003-40.394-32.748-73.138-73.142-73.142v0zM438.858 804.572c0.002-40.395 32.748-73.142 73.143-73.142s73.143 32.748 73.143 73.143c0 40.395-32.746 73.142-73.142 73.143v0c-40.397 0-73.145-32.748-73.145-73.145v0zM731.432 731.43c0 0-0.002 0-0.002 0-40.395 0-73.143 32.748-73.143 73.143s32.748 73.143 73.143 73.143c40.395 0 73.143-32.748 73.143-73.143 0 0 0-0.002 0-0.002v0c-0.003-40.394-32.748-73.138-73.142-73.142v0zM877.715 804.572c0.002-40.395 32.748-73.142 73.143-73.142s73.143 32.748 73.143 73.143c0 40.395-32.746 73.142-73.142 73.143v0c-40.397 0-73.145-32.748-73.145-73.145v0zM658.287 438.862c-40.395 0-73.142 32.746-73.142 73.142s32.746 73.142 73.142 73.142h292.573c40.395 0 73.142-32.746 73.142-73.142s-32.746-73.142-73.142-73.142v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Line style_ic-01"],"grid":0},"attrs":[],"properties":{"order":490,"id":102,"name":"line-style","prevSize":32,"code":59694},"setIdx":0,"setId":1,"iconIdx":103},{"icon":{"paths":["M82.996 931.784v0c0 5.094 4.128 9.221 9.221 9.221h288.18c5.092-0.002 9.22-4.13 9.221-9.221v-209.412c0-5.094-4.128-9.221-9.221-9.221h-288.18c-5.094 0-9.221 4.128-9.221 9.221v209.412zM92.218 1024.003c-50.93-0.002-92.215-41.287-92.217-92.217v0-209.412c0-50.93 41.287-92.217 92.217-92.217 0 0 0.002 0 0.002 0h288.18c50.93 0 92.217 41.287 92.217 92.217v0 209.412c-0.002 50.93-41.287 92.215-92.217 92.217v0zM634.377 301.632v0c0 5.094 4.128 9.221 9.221 9.221h288.18c5.092-0.002 9.22-4.13 9.221-9.221v-209.412c-0.002-5.092-4.13-9.22-9.221-9.221h-288.18c-5.094 0-9.221 4.128-9.221 9.221v209.412zM643.599 393.849c-50.93 0-92.217-41.287-92.217-92.217v0-209.412c0-50.93 41.287-92.217 92.217-92.217v0h288.18c50.93 0 92.217 41.287 92.217 92.217v0 209.412c0 50.93-41.287 92.217-92.217 92.217v0zM380.397 82.998v0c5.092 0.002 9.22 4.13 9.221 9.221v366.951c-0.002 5.092-4.13 9.22-9.221 9.221h-288.18c-5.094 0-9.221-4.128-9.221-9.221v-366.951c0-5.094 4.128-9.221 9.221-9.221h288.18zM92.218 0.003c-50.93 0.002-92.215 41.287-92.217 92.217v0 366.951c0.002 50.93 41.289 92.217 92.219 92.217h288.18c50.93-0.002 92.215-41.287 92.217-92.217v0-366.951c-0.002-50.93-41.287-92.215-92.217-92.217v0zM643.599 555.612v0c-5.094 0-9.221 4.128-9.221 9.221v366.951c0 5.094 4.128 9.221 9.221 9.221h288.18c5.092-0.002 9.22-4.13 9.221-9.221v-366.951c-0.002-5.092-4.13-9.22-9.221-9.221h-288.18zM551.382 564.835c0-50.93 41.287-92.217 92.217-92.217v0h288.18c50.93 0 92.217 41.287 92.217 92.217v0 366.951c0 50.93-41.287 92.217-92.217 92.217v0h-288.18c-50.93 0-92.217-41.287-92.217-92.217v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Chart group_ic-01"],"grid":0},"attrs":[],"properties":{"order":491,"id":103,"name":"chart-group","prevSize":32,"code":59695},"setIdx":0,"setId":1,"iconIdx":104},{"icon":{"paths":["M777.34 289.772c-47.589 1.432-85.619 40.353-85.619 88.155 0 48.707 39.485 88.192 88.192 88.192s88.192-39.485 88.192-88.192c0 0 0-0.002 0-0.002v0c-0.804-48.86-40.602-88.16-89.577-88.16-0.418 0-0.835 0.003-1.251 0.008h0.062zM562.522 146.689c-47.589 1.432-85.619 40.353-85.619 88.155 0 48.707 39.485 88.192 88.192 88.192s88.192-39.485 88.192-88.192c0 0 0-0.002 0-0.002v0c-0.803-48.861-40.6-88.162-89.577-88.162-0.418 0-0.835 0.003-1.251 0.008h0.064zM324.643 390.208c47.589-1.432 85.619-40.353 85.619-88.155 0-48.707-39.485-88.192-88.192-88.192s-88.192 39.483-88.192 88.19v0c0.804 48.861 40.603 88.163 89.581 88.163 0.416 0 0.833-0.003 1.248-0.008h-0.064zM333.299 525.719c0.025-0.791 0.039-1.721 0.039-2.653 0-50.151-40.655-90.806-90.806-90.806s-90.806 40.655-90.806 90.806c0 50.151 40.654 90.805 90.805 90.806v0c0.353 0.005 0.769 0.008 1.185 0.008 48.979 0 88.778-39.3 89.582-88.086l0.002-0.076zM985.15 259.262c-46.611-78.295-110.622-141.736-186.981-186.339l-2.475-1.335c-76.957-44.999-169.437-71.568-268.125-71.568-0.247 0-0.494 0-0.741 0h0.039c-0.781-0.003-1.703-0.007-2.626-0.007-143.822 0-274.296 57.153-369.949 149.988l0.133-0.128c-95.233 91.485-154.399 219.899-154.399 362.131s59.166 270.646 154.231 361.971l0.168 0.161c95.543 92.707 226.038 149.86 369.882 149.86 0.9 0 1.8-0.002 2.7-0.007h-0.138c18.061 0 36.164-0.9 53.815-2.621 46.26-3.877 85.603-30.288 107.359-68.099l0.351-0.663c11.465-18.932 18.251-41.811 18.251-66.271 0-21.673-5.326-42.101-14.74-60.048l0.339 0.71c-25.269-50.907-28.053-94.524-7.618-119.629 15.881-15.996 37.883-25.896 62.195-25.896 0.509 0 1.018 0.005 1.525 0.013l-0.077-0.002c102.733-3.969 191.177-61.522 238.554-145.355l0.742-1.426c22.922-38.904 36.461-85.71 36.461-135.678 0-51.637-14.459-99.896-39.551-140.951l0.675 1.187zM618.973 861.89c3.845 7.059 6.107 15.462 6.107 24.391 0 10.056-2.868 19.444-7.83 27.388l0.128-0.218c-9.103 16.096-25.545 27.12-44.66 28.534l-0.185 0.012c-15.112 1.516-30.512 2.253-45.664 2.253-1.771 0.025-3.862 0.040-5.956 0.040-240.181 0-435.361-192.678-439.4-431.897l-0.005-0.379c4.027-239.605 199.207-432.297 439.395-432.297 2.097 0 4.193 0.015 6.283 0.044l-0.316-0.003c0.532-0.002 1.162-0.003 1.79-0.003 163.161 0 306.002 86.991 384.676 217.122l1.127 2.010c17.717 28.498 28.22 63.084 28.22 100.122 0 35.863-9.846 69.428-26.986 98.136l0.485-0.877c-34.307 61.717-98.24 103.309-172.074 105.553l-0.306 0.007c-48.885 0.099-92.727 21.606-122.665 55.64l-0.158 0.183c-40.874 50.127-41.609 124.582-2.007 204.239z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Coloring_ic-01"],"grid":0},"attrs":[],"properties":{"order":550,"id":104,"name":"coloring","prevSize":32,"code":59696},"setIdx":0,"setId":1,"iconIdx":105},{"icon":{"paths":["M438.868 768.079v0c0 0-0.001 0-0.001 0-181.817 0-329.209-147.393-329.209-329.209 0 0 0-0.001 0-0.001v0c0-181.818 147.393-329.211 329.211-329.211s329.211 147.393 329.211 329.211c0 181.818-147.393 329.211-329.211 329.211 0 0 0 0 0 0zM785.63 708.031c57.475-73.496 92.163-167.232 92.163-269.070 0-242.373-196.481-438.854-438.854-438.854s-438.854 196.481-438.854 438.854c0 242.373 196.481 438.854 438.854 438.854 101.852 0 195.598-34.697 270.068-92.915l-0.967 0.728 222.372 222.381c9.929 9.929 23.648 16.072 38.801 16.072 30.305 0 54.873-24.568 54.873-54.873 0-15.153-6.141-28.87-16.072-38.801v0zM438.868 237.684v0c-30.301 0.001-54.864 24.566-54.866 54.868v91.453h-91.461c-30.213 0.105-54.675 24.63-54.675 54.868s24.46 54.764 54.685 54.868h91.45v91.455c0.105 30.213 24.63 54.675 54.868 54.675s54.764-24.46 54.868-54.685v-91.447h91.455c30.213-0.105 54.675-24.63 54.675-54.868s-24.46-54.764-54.685-54.868h-91.447v-91.45c0-30.302-24.566-54.868-54.868-54.868z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Zoom_ic-1-01"],"grid":0},"attrs":[],"properties":{"order":547,"id":105,"name":"zoom-in","prevSize":32,"code":59697},"setIdx":0,"setId":1,"iconIdx":106},{"icon":{"paths":["M859.341 404.814c-9.37 9.372-22.317 15.169-36.616 15.169s-27.247-5.797-36.616-15.169l-101.482-101.478-101.482 101.478c-9.371 9.371-22.318 15.168-36.618 15.168-28.601 0-51.787-23.186-51.787-51.787 0-14.301 5.797-27.247 15.168-36.619l101.478-101.478-101.478-101.482c-9.433-9.382-15.271-22.37-15.271-36.723 0-28.601 23.186-51.787 51.787-51.787 14.351 0 27.339 5.837 36.719 15.267l101.486 101.486 101.482-101.482c9.371-9.37 22.317-15.165 36.616-15.165 28.601 0 51.786 23.186 51.786 51.786 0 14.301-5.797 27.248-15.169 36.62l-101.478 101.482 101.478 101.478c9.372 9.371 15.169 22.318 15.169 36.618s-5.797 27.248-15.171 36.619v0zM97.684 788.377c-53.946 0.016-97.671 43.752-97.671 97.699 0 53.958 43.742 97.699 97.699 97.699s97.699-43.742 97.699-97.699v0c-0.071-53.938-43.785-97.644-97.721-97.699h-0.005zM304.841 512.157c-53.96 0.008-97.701 43.753-97.701 97.714 0 53.967 43.748 97.714 97.714 97.714 53.961 0 97.706-43.741 97.714-97.699v0c-0.058-53.949-43.777-97.668-97.721-97.727h-0.005zM512 788.377c-53.958 0-97.699 43.742-97.699 97.699s43.742 97.699 97.699 97.699c53.958 0 97.699-43.742 97.699-97.699v0c-0.074-53.928-43.772-97.625-97.693-97.699h-0.007zM926.313 512.157c-0.004 0-0.009 0-0.015 0-53.967 0-97.714 43.748-97.714 97.714s43.748 97.714 97.714 97.714c53.961 0 97.706-43.741 97.714-97.699v-0.001c-0.066-53.937-43.765-97.647-97.693-97.727h-0.008z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Ignore outlines_ic-01"],"grid":0},"attrs":[],"properties":{"order":492,"id":106,"name":"ignore-outliers","prevSize":32,"code":59698},"setIdx":0,"setId":1,"iconIdx":107},{"icon":{"paths":["M881.535 247.71c8.584-10.572 13.782-24.196 13.782-39.032 0-34.331-27.83-62.162-62.162-62.162-19.343 0-36.621 8.834-48.022 22.688l-0.086 0.107c-88.289 120.153-203.262 215.666-336.531 278.884l-5.374 2.294c-98.4 37.148-212.149 58.654-330.921 58.654-17.585 0-35.059-0.472-52.412-1.402l2.421 0.103c-34.33 0-62.161 27.83-62.161 62.161s27.83 62.161 62.161 62.161v0c15.156 0.758 32.91 1.191 50.765 1.191 135.739 0 265.644-24.976 385.37-70.584l-7.433 2.487c158.193-73.673 289.527-181.594 388.694-314.867l1.909-2.683zM1015.582 322.306c5.281-6.295 8.488-14.485 8.488-23.423 0-20.193-16.37-36.563-36.563-36.563-11.255 0-21.321 5.085-28.028 13.082l-0.047 0.056-327.206 392.226-101.576-65.802c-5.611-3.683-12.489-5.875-19.878-5.875-9.764 0-18.636 3.827-25.193 10.065l0.016-0.015-155.357 147.518-112.309-68.765c-5.436-3.38-12.032-5.383-19.095-5.383-10.117 0-19.275 4.109-25.893 10.751l-124.738 125.134c-6.522 6.601-10.55 15.677-10.55 25.695 0 20.194 16.371 36.565 36.565 36.565 10.058 0 19.168-4.061 25.778-10.633l-0.001 0.001 104.363-104.693 111.621 68.347c5.436 3.38 12.032 5.382 19.095 5.382 9.764 0 18.634-3.827 25.193-10.062l-0.016 0.015 154.816-147.014 104.597 67.762c5.612 3.684 12.491 5.878 19.883 5.878 11.255 0 21.323-5.085 28.030-13.082l0.047-0.056z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Smoothing_ic-01"],"grid":0},"attrs":[],"properties":{"order":493,"id":107,"name":"smoothing","prevSize":32,"code":59699},"setIdx":0,"setId":1,"iconIdx":108},{"icon":{"paths":["M106.038 194.289c0-48.737 39.51-88.247 88.247-88.247 0 0 0 0 0 0h121.12c0.054 0 0.116 0 0.178 0 29.242 0 52.948-23.706 52.948-52.948s-23.706-52.948-52.948-52.948c-0.062 0-0.126 0-0.188 0h-121.11c-107.223 0-194.144 86.921-194.144 194.144v0 121.121c0.102 29.166 23.768 52.77 52.948 52.77s52.847-23.605 52.948-52.76v-0.010zM708.879 0.146c-29.166 0.102-52.77 23.768-52.77 52.948s23.605 52.847 52.76 52.948h121.127c0 0 0.001 0 0.003 0 48.737 0 88.246 39.509 88.246 88.246 0 0 0 0.001 0 0.001v0 121.121c0.102 29.166 23.768 52.77 52.948 52.77s52.847-23.605 52.948-52.76v-121.131c0 0 0 0 0 0 0-107.223-86.921-194.144-194.144-194.144 0 0-0.001 0-0.001 0v0zM106.038 708.883c0-0.054 0-0.116 0-0.178 0-29.242-23.706-52.948-52.948-52.948s-52.948 23.706-52.948 52.948c0 0.062 0 0.126 0 0.188v-0.010 121.117c0 0 0 0 0 0 0 107.223 86.921 194.144 194.144 194.144 0 0 0 0 0.001 0h121.12c29.242 0 52.948-23.706 52.948-52.948s-23.706-52.948-52.948-52.948h-121.12c0 0-0.001 0-0.003 0-48.737 0-88.246-39.509-88.246-88.246 0 0 0-0.001 0-0.001v0zM1024.141 708.883c0-0.054 0-0.116 0-0.178 0-29.242-23.706-52.948-52.948-52.948s-52.948 23.706-52.948 52.948c0 0.062 0 0.126 0 0.188v-0.010 121.117c0 0.001 0 0.003 0 0.004 0 48.736-39.507 88.243-88.243 88.243-0.001 0-0.003 0-0.006 0h-121.117c-29.242 0-52.948 23.706-52.948 52.948s23.706 52.948 52.948 52.948h121.117c0 0 0.001 0 0.001 0 107.223 0 194.142-86.921 194.142-194.142 0-0.001 0-0.001 0-0.003v0zM799.888 369.206c7.547-9.085 12.128-20.868 12.128-33.721 0-29.242-23.706-52.948-52.948-52.948-16.39 0-31.038 7.446-40.751 19.139l-0.071 0.088-186.477 225.734-76.485-76.494c-9.582-9.58-22.818-15.506-37.438-15.506-17.090 0-32.289 8.096-41.97 20.663l-0.092 0.124-152.959 200.024c-6.841 8.832-10.966 20.066-10.966 32.264 0 29.243 23.706 52.95 52.95 52.95 17.133 0 32.366-8.137 42.043-20.759l0.093-0.126 116.228-151.99 74.895 74.903c9.583 9.58 22.819 15.507 37.441 15.507 16.39 0 31.041-7.446 40.754-19.141l0.071-0.086z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Highlight mode_ic-01"],"grid":0},"attrs":[],"properties":{"order":494,"id":108,"name":"highlight-mode","prevSize":32,"code":59700},"setIdx":0,"setId":1,"iconIdx":109},{"icon":{"paths":["M36.572 128.004h950.856c20.198 0 36.572 16.374 36.572 36.572v0 146.286c0 20.198-16.374 36.572-36.572 36.572h-950.856c-20.198 0-36.572-16.374-36.572-36.572v0-146.286c0.001-20.198 16.374-36.57 36.572-36.57 0 0 0 0 0 0v0zM29.257 420.577h965.484c0 0 0 0 0 0 16.159 0 29.256 13.099 29.256 29.256v87.769c0 16.159-13.099 29.256-29.256 29.256 0 0 0 0 0 0h-965.484c0 0 0 0 0 0-16.159 0-29.256-13.099-29.256-29.256v0-87.772c0-16.157 13.099-29.255 29.256-29.255 0 0 0 0 0 0v0zM21.943 640.005h980.113c12.118 0 21.943 9.824 21.943 21.943v0 65.828c0 12.118-9.824 21.943-21.943 21.943h-980.113c-12.118 0-21.943-9.824-21.943-21.943v0-65.829c0-12.118 9.824-21.943 21.943-21.943v0zM14.63 822.861h994.742c8.079 0 14.629 6.55 14.629 14.629v0 43.885c0 8.079-6.55 14.629-14.629 14.629h-994.742c-8.079 0-14.629-6.55-14.629-14.629v0-43.885c0 0 0-0.001 0-0.001 0-8.079 6.55-14.629 14.629-14.629v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Axes scale_ic-01"],"grid":0},"attrs":[],"properties":{"order":495,"id":109,"name":"axes-scale","prevSize":32,"code":59701},"setIdx":0,"setId":1,"iconIdx":110},{"icon":{"paths":["M1023.916 783.765c0 0.003 0 0.005 0 0.008 0 10.572-4.891 20.003-12.536 26.151l-0.065 0.050-167.841 134.274c-5.691 4.584-13.006 7.357-20.971 7.357-18.537 0-33.564-15.027-33.564-33.564 0-0.001 0-0.001 0-0.003v0-83.921h-738.501c-0.050 0-0.111 0-0.17 0-27.809 0-50.352-22.543-50.352-50.352s22.543-50.352 50.352-50.352c0.059 0 0.12 0 0.18 0h738.491v-83.921c0-0.001 0-0.001 0-0.003 0-18.537 15.027-33.564 33.564-33.564 7.963 0 15.28 2.774 21.036 7.408l-0.065-0.050 167.841 134.274c7.708 6.198 12.601 15.627 12.601 26.198 0 0.003 0 0.005 0 0.008v0zM174.773 178.732c4.588 2.043 9.943 3.232 15.574 3.232 0.189 0 0.377-0.001 0.565-0.004h-0.028c5.807-0.182 11.332-1.054 16.601-2.533l-0.486 0.116c4.491-1.646 9.696-2.794 15.105-3.216l0.204-0.012c10.644 0.235 20.252 4.488 27.405 11.297l-0.018-0.016c10.44 9.124 19.487 19.451 27.040 30.853l0.351 0.565q14.497 20.948 45.115 69.284l23.368 37.061q-55.592 72.506-88.621 111.981c-15.762 20.413-32.951 38.368-51.853 54.361l-0.516 0.426c-10.169 9.325-19.183 19.618-26.99 30.815l-0.397 0.603c-3.56 4.63-6.552 9.955-8.721 15.684l-0.142 0.428c0.969 11.56 5.692 21.865 12.93 29.846l-0.038-0.042c7.32 8.87 18.31 14.487 30.612 14.503h0.003c6.366-0.162 12.453-1.034 18.285-2.54l-0.562 0.123c6.179-1.685 11.563-4.456 16.207-8.123l-0.095 0.072c21.48-20.74 41.505-42.551 60.165-65.517l1.062-1.348q33.836-41.895 84.596-108.758c28.946 48.312 58.46 89.884 90.814 129.024l-1.392-1.733c17.764 24.004 45.044 40.094 76.157 42.672l0.381 0.026c0.966 0.030 2.101 0.047 3.241 0.047 17.246 0 33.585-3.879 48.192-10.813l-0.682 0.292c12.483-5.921 20.961-18.421 20.961-32.902 0-0.328-0.004-0.654-0.014-0.981l0.001 0.049c0.016-0.295 0.026-0.639 0.026-0.985 0-6.702-3.52-12.58-8.811-15.89l-0.078-0.046c-7.87-4.575-16.971-8.427-26.567-11.086l-0.821-0.195c-9.539-2.556-17.84-5.857-25.637-9.983l0.659 0.319c-20.913-13.167-38.356-29.841-51.983-49.374l-0.382-0.58q-27.393-37.056-71.701-109.563 48.339-63.643 83.783-106.344c20.296-24.892 41.116-47.24 63.303-68.153l0.349-0.326c5.648-12.294 9.157-26.622 9.66-41.712l0.005-0.182c0.039-0.65 0.062-1.409 0.062-2.174 0-9.328-3.375-17.869-8.971-24.466l0.045 0.054c-5.283-6.454-13.25-10.541-22.172-10.541-0.703 0-1.4 0.026-2.089 0.076l0.092-0.005c-0.168-0.003-0.365-0.003-0.563-0.003-8.977 0-17.394 2.393-24.65 6.576l0.239-0.127c-11.778 8.236-21.872 17.819-30.384 28.698l-0.231 0.305q-33.028 37.054-112.786 145.013-36.259-62.035-57.205-91.034c-12.174-18-26.874-33.213-43.794-45.565l-0.515-0.358c-15.346-10.609-34.349-16.946-54.835-16.946-0.831 0-1.659 0.011-2.485 0.031l0.123-0.003c-1.571-0.082-3.412-0.13-5.263-0.13-18.745 0-36.365 4.823-51.686 13.296l0.55-0.278c-11.422 6.052-20.533 15.162-26.418 26.245l-0.165 0.34c-2.040 3.724-3.241 8.158-3.241 12.872 0 0.289 0.004 0.577 0.014 0.863l-0.001-0.042c0.312 12.487 8.599 22.957 19.944 26.531l0.203 0.055z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["X axis_ic-01"],"grid":0},"attrs":[],"properties":{"order":496,"id":110,"name":"x-axis","prevSize":32,"code":59702},"setIdx":0,"setId":1,"iconIdx":111},{"icon":{"paths":["M639.998-0.001h-255.995c-70.692 0-127.998 57.306-127.998 127.998v0 768.004c0 70.692 57.306 127.998 127.998 127.998v0h255.995c70.692 0 127.998-57.306 127.998-127.998v0-768.001c-0.001-70.692-57.306-127.998-127.998-127.999v0zM639.998 928.001h-255.995c0 0 0 0 0 0-17.673 0-32-14.327-32-32 0 0 0 0 0 0v0-47.999h127.998c26.436-0.098 47.829-21.55 47.829-48.001s-21.392-47.901-47.818-48.001h-128.008v-96.001h127.998c26.51 0 48.001-21.491 48.001-48.001s-21.491-48.001-48.001-48.001v0h-127.998v-96h127.998c26.51 0 48.001-21.491 48.001-48.001s-21.491-48.001-48.001-48.001v0h-127.998v-96h127.998c26.436-0.098 47.829-21.55 47.829-48.001s-21.392-47.901-47.818-48.001h-128.007v-48.001c0 0 0 0 0 0 0-17.673 14.327-32 32-32 0.001 0 0.003 0 0.003 0h255.995c17.672 0.003 31.997 14.328 32 32v0 768.001c-0.003 17.672-14.328 31.997-32 32v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Indicator_ic-01"],"grid":0},"attrs":[],"properties":{"order":497,"id":111,"name":"indicator","prevSize":32,"code":59703},"setIdx":0,"setId":1,"iconIdx":112},{"icon":{"paths":["M747.131 616.42c-2.437-1.654-5.233-3.079-8.202-4.141l-0.261-0.081 124.904-277.567 118.378-71.028c11.342-6.841 18.81-19.095 18.81-33.094 0-21.272-17.244-38.516-38.516-38.516-7.365 0-14.246 2.067-20.096 5.651l0.168-0.095-274.672 164.807-276.726-221.382c-6.529-5.258-14.924-8.439-24.060-8.439-10.635 0-20.263 4.311-27.234 11.28l-297.638 297.643c-6.97 6.97-11.281 16.599-11.281 27.235s4.311 20.265 11.281 27.235v0c2.952 2.761 6.375 5.069 10.126 6.782l0.237 0.097-46.425 103.159c-1.071 2.323-1.697 5.041-1.697 7.904 0 10.637 8.623 19.26 19.26 19.26 7.773 0 14.471-4.606 17.514-11.236l0.050-0.12 57.635-128.073 133.301-133.302-193.845 430.759c-3.163 6.286-5.707 13.582-7.262 21.238l-0.097 0.567c-0.609 2.802-0.958 6.021-0.958 9.322 0 9.255 2.742 17.87 7.459 25.075l-0.107-0.174c7.008 10.401 18.741 17.15 32.052 17.15 7.96 0 15.356-2.414 21.497-6.551l-0.137 0.088 161.727-107.823 278.823 111.532c4.234 1.741 9.15 2.751 14.302 2.751 10.637 0 20.267-4.308 27.243-11.276v0l154.962-154.962 211.387 158.536c6.351 4.891 14.419 7.839 23.175 7.839 21.084 0 38.176-17.092 38.176-38.176 0-6.105-1.433-11.876-3.982-16.995l0.1 0.221 30.030-66.735c1.071-2.323 1.697-5.039 1.697-7.904 0-10.636-8.623-19.26-19.26-19.26-7.773 0-14.471 4.606-17.514 11.236l-0.050 0.12-24.439 54.314-54.826-41.121 79.251-176.111c1.072-2.323 1.697-5.041 1.697-7.904 0-10.636-8.621-19.257-19.257-19.257-7.772 0-14.468 4.604-17.511 11.234l-0.050 0.12-75.71 168.237-54.788-41.093 148.413-329.785c1.071-2.323 1.697-5.041 1.697-7.904 0-10.637-8.624-19.261-19.261-19.261-7.774 0-14.474 4.606-17.516 11.238l-0.050 0.12-144.859 321.913-47.060-35.295zM92.627 763.925l216.154-480.331 60.934-60.934 29.263 23.41-201.621 448.035zM262.109 671.002c-3.24-1.011-6.965-1.594-10.827-1.594-0.204 0-0.407 0.001-0.611 0.005h0.031l179.326-398.499 53.918 43.133-169.965 377.704zM349.77 706.065l165.235-367.172 53.895 43.114-157.017 348.905zM509.812 770.084l-62.132-24.855 152.273-338.379 40.481 32.385c4.407 3.026 9.663 5.159 15.337 6.016l0.206 0.025zM556.424 760.366l148.845-330.757 100.437-60.261-115.971 257.708z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Aggrigation_ic-01"],"grid":0},"attrs":[],"properties":{"order":498,"id":112,"name":"aggregation","prevSize":32,"code":59704},"setIdx":0,"setId":1,"iconIdx":113},{"icon":{"paths":["M438.886 768.021v0c0 0-0.001 0-0.001 0-181.775 0-329.134-147.358-329.134-329.134 0 0 0-0.001 0-0.001v0c0-181.777 147.359-329.136 329.136-329.136s329.136 147.359 329.136 329.136c0 181.777-147.359 329.136-329.136 329.136 0 0 0 0 0 0zM785.568 707.985c57.463-73.479 92.142-167.193 92.142-269.007 0-242.317-196.436-438.754-438.754-438.754s-438.754 196.436-438.754 438.754c0 242.317 196.436 438.754 438.754 438.754 101.828 0 195.554-34.688 270.005-92.894l-0.967 0.728 222.321 222.328c9.95 10.071 23.762 16.309 39.029 16.309 30.297 0 54.858-24.56 54.858-54.858 0-15.268-6.237-29.079-16.303-39.025l-0.006-0.006zM237.746 438.886v0c0 30.295 24.56 54.855 54.855 54.855h292.566c30.297 0 54.855-24.56 54.855-54.855s-24.56-54.855-54.855-54.855h-292.566c-30.295 0-54.855 24.56-54.855 54.855z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Zoom_ic-01"],"grid":0},"attrs":[],"properties":{"order":499,"id":113,"name":"zoom-out","prevSize":32,"code":59705},"setIdx":0,"setId":1,"iconIdx":114},{"icon":{"paths":["M655.986 259.756l-120.47 150.589c-5.564 6.916-14.027 11.305-23.514 11.305s-17.951-4.389-23.469-11.246l-0.045-0.058-120.475-150.589c-4.111-5.105-6.599-11.668-6.599-18.813 0-16.633 13.484-30.117 30.117-30.117h90.353v-180.706c0-16.633 13.484-30.117 30.117-30.117s30.117 13.484 30.117 30.117v0 180.706h90.353c0.001 0 0.003 0 0.006 0 16.631 0 30.113 13.482 30.113 30.113 0 7.146-2.489 13.713-6.649 18.875l0.045-0.058zM655.986 764.251l-120.47-150.589c-5.564-6.916-14.027-11.305-23.514-11.305s-17.951 4.389-23.469 11.246l-0.045 0.058-120.475 150.589c-4.111 5.105-6.599 11.668-6.599 18.813 0 16.633 13.484 30.117 30.117 30.117h90.353v180.706c0 16.633 13.484 30.117 30.117 30.117s30.117-13.484 30.117-30.117v0-180.706h90.353c0.001 0 0.003 0 0.006 0 16.631 0 30.113-13.482 30.113-30.113 0-7.146-2.489-13.713-6.649-18.875l0.045 0.058zM873.413 466.828h-722.826c-24.95 0-45.177 20.226-45.177 45.177s20.226 45.177 45.177 45.177v0h722.826c24.95 0 45.177-20.226 45.177-45.177s-20.226-45.177-45.177-45.177v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Collaps_inside_ic-01"],"grid":0},"attrs":[],"properties":{"order":500,"id":114,"name":"collapse-inside","prevSize":32,"code":59706},"setIdx":0,"setId":1,"iconIdx":115},{"icon":{"paths":["M659.617 193.757c-4.978 10.182-15.257 17.070-27.147 17.070h-90.353v180.706c0 16.633-13.484 30.117-30.117 30.117s-30.117-13.484-30.117-30.117v0-180.706h-90.353c0 0-0.001 0-0.001 0-16.633 0-30.117-13.484-30.117-30.117 0-7.146 2.489-13.711 6.647-18.874l-0.045 0.058 120.474-150.589c5.565-6.915 14.027-11.301 23.514-11.301s17.949 4.388 23.469 11.243l0.045 0.058 120.47 150.589c4.114 5.106 6.603 11.672 6.603 18.82 0 4.744-1.096 9.23-3.049 13.221l0.079-0.178zM659.617 830.25c-4.978-10.182-15.257-17.070-27.147-17.070h-90.353v-180.706c0-16.633-13.484-30.117-30.117-30.117s-30.117 13.484-30.117 30.117v0 180.706h-90.353c-16.633 0-30.117 13.485-30.117 30.117 0 7.145 2.488 13.707 6.644 18.871l-0.045-0.058 120.474 150.589c5.564 6.916 14.027 11.305 23.514 11.305s17.951-4.389 23.469-11.246l0.045-0.058 120.47-150.589c4.114-5.106 6.603-11.671 6.603-18.817 0-4.742-1.096-9.229-3.049-13.22l0.079 0.178zM873.411 466.828h-722.823c-24.95 0-45.176 20.226-45.176 45.176s20.226 45.176 45.176 45.176v0h722.823c24.95 0 45.176-20.226 45.176-45.176s-20.226-45.176-45.176-45.176v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Collaps_outside_ic-01"],"grid":0},"attrs":[],"properties":{"order":501,"id":115,"name":"collapse-outside","prevSize":32,"code":59707},"setIdx":0,"setId":1,"iconIdx":116},{"icon":{"paths":["M324.781 16.96c-10.291-10.303-24.513-16.675-40.225-16.675-31.4 0-56.855 25.455-56.855 56.855 0 15.712 6.373 29.934 16.675 40.225v0l227.421 227.421c10.287 10.289 24.501 16.653 40.2 16.653s29.913-6.364 40.2-16.653l227.421-227.421c10.47-10.317 16.959-24.654 16.959-40.506 0-31.4-25.455-56.855-56.855-56.855-15.85 0-30.187 6.487-40.497 16.948l-187.226 187.226zM699.221 1007.047c10.245 10.035 24.284 16.227 39.772 16.227 31.4 0 56.855-25.455 56.855-56.855 0-15.488-6.192-29.527-16.236-39.783l-227.412-227.412c-10.287-10.289-24.501-16.653-40.2-16.653s-29.913 6.364-40.2 16.653l-227.421 227.421c-10.47 10.317-16.955 24.654-16.955 40.504 0 31.4 25.455 56.855 56.855 56.855 15.852 0 30.188-6.487 40.499-16.952l187.222-187.221z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Arrow bidirectional_close_ic-01"],"grid":0},"attrs":[],"properties":{"order":502,"id":116,"name":"arrow-bidirectional-close","prevSize":32,"code":59708},"setIdx":0,"setId":1,"iconIdx":117},{"icon":{"paths":["M699.332 324.675c10.324 10.476 24.668 16.965 40.528 16.965 31.419 0 56.889-25.47 56.889-56.889 0-15.861-6.491-30.206-16.962-40.523l-227.563-227.563c-10.293-10.295-24.516-16.663-40.224-16.663s-29.931 6.368-40.224 16.663l-227.556 227.556c-10.423 10.316-16.878 24.626-16.878 40.441 0 31.419 25.47 56.889 56.889 56.889 15.817 0 30.124-6.455 40.436-16.873l187.335-187.335zM324.67 699.335c-10.263-10.116-24.364-16.361-39.924-16.361-31.419 0-56.889 25.47-56.889 56.889 0 15.557 6.245 29.657 16.366 39.927l227.549 227.549c10.293 10.295 24.516 16.663 40.224 16.663s29.931-6.368 40.224-16.663l227.556-227.556c10.041-10.251 16.236-24.299 16.236-39.796 0-31.419-25.47-56.889-56.889-56.889-15.497 0-29.545 6.196-39.806 16.245l-187.321 187.316z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Arrow bidirectional_open_ic-01"],"grid":0},"attrs":[],"properties":{"order":503,"id":117,"name":"arrow-bidirectional-open","prevSize":32,"code":59709},"setIdx":0,"setId":1,"iconIdx":118},{"icon":{"paths":["M340.815 665.327c2.092 4.252 3.316 9.257 3.316 14.546 0 7.963-2.773 15.28-7.408 21.035l0.050-0.065-134.294 167.869c-6.204 7.71-15.64 12.601-26.217 12.601s-20.012-4.891-26.167-12.537l-0.050-0.065-134.294-167.869c-4.583-5.691-7.356-13.007-7.356-20.972 0-18.542 15.031-33.573 33.573-33.573h83.934v-268.59h-83.934c0 0-0.002 0-0.002 0-18.542 0-33.573-15.031-33.573-33.573 0-7.966 2.775-15.284 7.409-21.040l-0.050 0.065 134.294-167.869c6.205-7.708 15.64-12.598 26.217-12.598s20.012 4.89 26.167 12.533l0.050 0.065 134.294 167.869c4.584 5.692 7.359 13.010 7.359 20.975 0 18.542-15.031 33.573-33.573 33.573 0 0-0.002 0-0.002 0h-83.934v268.59h83.934c13.253 0 24.711 7.68 30.171 18.83l0.088 0.198zM982.032 159.481h-537.179c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361h537.179c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.032 360.923h-537.179c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.179c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.032 562.365h-537.179c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.179c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.032 763.807h-537.179c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.179c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Row height_ic-01"],"grid":0},"attrs":[],"properties":{"order":504,"id":118,"name":"row-height","prevSize":32,"code":59711},"setIdx":0,"setId":1,"iconIdx":119},{"icon":{"paths":["M918.074 194.207v706.217c0 68.255-55.332 123.588-123.588 123.588v0h-564.973c-68.255 0-123.588-55.332-123.588-123.588v0-706.217c0-68.255 55.332-123.588 123.588-123.588v0 105.933c-9.751 0-17.656 7.905-17.656 17.656v0 706.217c0 9.751 7.905 17.656 17.656 17.656v0h564.973c0.002 0 0.003 0 0.005 0 9.749 0 17.651-7.902 17.651-17.651 0-0.002 0-0.003 0-0.005v0-706.217c0-9.751-7.905-17.656-17.656-17.656v0-105.933c68.255 0 123.588 55.332 123.588 123.588v0zM776.831 264.845v-141.243c-0.086-68.221-55.366-123.502-123.58-123.588h-282.496c-68.221 0.086-123.502 55.366-123.588 123.58v141.251c0.086 68.221 55.366 123.502 123.58 123.588h282.496c68.221-0.086 123.502-55.366 123.588-123.58v-0.008zM653.243 105.946c9.742 0.020 17.636 7.912 17.656 17.654v141.244c-0.020 9.742-7.912 17.636-17.654 17.656h-282.489c-9.742-0.020-17.636-7.912-17.656-17.654v-141.244c0.020-9.742 7.912-17.636 17.654-17.656h0.002z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Copy_ic-01"],"grid":0},"attrs":[],"properties":{"order":505,"id":119,"name":"copy","prevSize":32,"code":59713},"setIdx":0,"setId":1,"iconIdx":120},{"icon":{"paths":["M0.091 201.202c0-50.485 40.926-91.412 91.412-91.412v0h841.103c50.485 0 91.412 40.926 91.412 91.412s-40.926 91.412-91.412 91.412h-841.103c-50.485 0-91.412-40.926-91.412-91.412v0zM0.158 512.005c0-50.485 40.926-91.412 91.412-91.412v0h841.11c50.485 0 91.412 40.926 91.412 91.412s-40.926 91.412-91.412 91.412v0h-841.11c-50.485 0-91.412-40.926-91.412-91.412v0zM91.569 731.321c-50.485 0-91.412 40.926-91.412 91.412s40.926 91.412 91.412 91.412h841.11c50.485 0 91.412-40.926 91.412-91.412s-40.926-91.412-91.412-91.412v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Menu_ic-01"],"grid":0},"attrs":[],"properties":{"order":506,"id":120,"name":"menu","prevSize":32,"code":59714},"setIdx":0,"setId":1,"iconIdx":121},{"icon":{"paths":["M-0.001 891.875c0 27.365 22.184 49.548 49.548 49.548v0h924.903c27.365 0 49.548-22.184 49.548-49.548v0-132.129c0-27.365-22.184-49.548-49.548-49.548s-49.548 22.184-49.548 49.548v0 82.58h-825.806v-82.58c0-27.365-22.184-49.548-49.548-49.548s-49.548 22.184-49.548 49.548v0zM314.955 437.523c-8.846-8.337-20.799-13.459-33.95-13.459-27.365 0-49.548 22.184-49.548 49.548 0 13.991 5.799 26.626 15.123 35.636l0.014 0.014 231.179 220.292c8.874 8.465 20.92 13.675 34.182 13.675s25.307-5.209 34.201-13.694l-0.020 0.019 231.179-220.292c9.267-9.013 15.018-21.602 15.018-35.534 0-27.365-22.184-49.548-49.548-49.548-13.090 0-24.996 5.077-33.854 13.369l0.028-0.026-147.456 140.505v-445.895c0-27.365-22.184-49.548-49.548-49.548s-49.548 22.184-49.548 49.548v0 445.895z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Download_ic-01"],"grid":0},"attrs":[],"properties":{"order":549,"id":121,"name":"download","prevSize":32,"code":59715},"setIdx":0,"setId":1,"iconIdx":122},{"icon":{"paths":["M-0.001 891.875c0 27.365 22.184 49.548 49.548 49.548v0h924.903c27.365 0 49.548-22.184 49.548-49.548v0-132.129c0-27.365-22.184-49.548-49.548-49.548s-49.548 22.184-49.548 49.548v0 82.58h-825.806v-82.58c0-27.365-22.184-49.548-49.548-49.548s-49.548 22.184-49.548 49.548v0zM708.958 388.292c8.835 8.287 20.755 13.378 33.863 13.378 27.365 0 49.548-22.184 49.548-49.548 0-13.949-5.765-26.553-15.043-35.559l-0.012-0.012-231.179-220.289c-8.874-8.468-20.919-13.678-34.182-13.678s-25.308 5.21-34.201 13.697l0.020-0.019-231.179 220.289c-9.375 9.029-15.199 21.69-15.199 35.71 0 27.365 22.184 49.548 49.548 49.548 13.18 0 25.16-5.147 34.035-13.539l-0.023 0.022 147.451-140.504v445.894c0 27.365 22.184 49.548 49.548 49.548s49.548-22.184 49.548-49.548v0-445.894z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Upload_ic-01"],"grid":0},"attrs":[],"properties":{"order":548,"id":122,"name":"upload","prevSize":32,"code":59716},"setIdx":0,"setId":1,"iconIdx":123},{"icon":{"paths":["M292.911 894.749c3.955 3.955 6.4 9.419 6.4 15.455 0 9.673-6.284 17.879-14.993 20.758l-0.154 0.044-241.568 77.925c-2.005 0.669-4.314 1.055-6.711 1.055-12.071 0-21.858-9.787-21.858-21.858 0-2.398 0.386-4.706 1.1-6.865l-0.044 0.154 77.925-241.566c2.924-8.864 11.13-15.151 20.806-15.151 6.035 0 11.497 2.445 15.455 6.398v0zM688.763 150.282c-3.955-3.955-9.419-6.4-15.455-6.4s-11.497 2.445-15.455 6.4l-466.765 466.765c-3.955 3.955-6.4 9.419-6.4 15.455s2.445 11.497 6.4 15.455l185.471 185.471c3.955 3.956 9.421 6.403 15.458 6.403s11.502-2.447 15.458-6.403l466.756-466.761c3.958-3.955 6.407-9.419 6.407-15.456s-2.449-11.501-6.407-15.456v0zM1018.032 176.381c-2.766-6.361-6.586-11.774-11.296-16.262l-0.021-0.019-142.805-142.805c-8.994-9.44-21.663-15.309-35.701-15.309s-26.706 5.871-35.683 15.29l-0.019 0.021-30.444 30.444c-3.955 3.955-6.402 9.419-6.402 15.456s2.447 11.501 6.402 15.456l183.292 183.296c3.956 3.955 9.421 6.4 15.458 6.4s11.501-2.445 15.458-6.4l30.444-30.448c9.44-8.99 15.311-21.656 15.311-35.691 0-7.022-1.469-13.701-4.117-19.746l0.123 0.316z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Edit_ic-01"],"grid":0},"attrs":[],"properties":{"order":507,"id":123,"name":"edit","prevSize":32,"code":59717},"setIdx":0,"setId":1,"iconIdx":124},{"icon":{"paths":["M768.018 438.857v0c0-181.794-147.372-329.166-329.166-329.166v0c-181.794 0-329.166 147.372-329.166 329.166s147.372 329.166 329.166 329.166c181.794 0 329.166-147.372 329.166-329.166zM707.986 785.573c-73.507 57.498-167.263 92.199-269.124 92.199-242.386 0-438.878-196.493-438.878-438.878s196.493-438.878 438.878-438.878c242.386 0 438.878 196.493 438.878 438.878 0 101.846-34.691 195.59-92.902 270.059l0.729-0.967 222.348 222.348c9.928 9.928 16.069 23.643 16.069 38.794 0 30.3-24.562 54.863-54.863 54.863-15.15 0-28.865-6.141-38.794-16.069v0zM438.851 383.995v0c-30.299 0-54.861 24.562-54.861 54.861v146.296c0 30.299 24.562 54.861 54.861 54.861s54.861-24.562 54.861-54.861v-146.296c0-30.299-24.562-54.861-54.861-54.861zM438.851 329.134v0c-30.299 0-54.861-24.562-54.861-54.861v0c0-30.299 24.562-54.861 54.861-54.861s54.861 24.562 54.861 54.861c0 30.299-24.562 54.861-54.861 54.861z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Search_info_ic-01"],"grid":0},"attrs":[],"properties":{"order":508,"id":124,"name":"search-info","prevSize":32,"code":59718},"setIdx":0,"setId":1,"iconIdx":125},{"icon":{"paths":["M768.018 438.857v0c0-181.794-147.372-329.166-329.166-329.166v0c-181.794 0-329.166 147.372-329.166 329.166s147.372 329.166 329.166 329.166c181.794 0 329.166-147.372 329.166-329.166zM707.986 785.573c-73.507 57.498-167.263 92.199-269.124 92.199-242.386 0-438.878-196.493-438.878-438.878s196.493-438.878 438.878-438.878c242.386 0 438.878 196.493 438.878 438.878 0 101.846-34.691 195.59-92.902 270.059l0.729-0.967 222.348 222.348c9.928 9.928 16.069 23.643 16.069 38.794 0 30.3-24.562 54.863-54.863 54.863-15.15 0-28.865-6.141-38.794-16.069v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Search_ic-01"],"grid":0},"attrs":[],"properties":{"order":509,"id":125,"name":"search","prevSize":32,"code":59719},"setIdx":0,"setId":1,"iconIdx":126},{"icon":{"paths":["M219.428 73.148v0c-80.791 0-146.285 65.494-146.285 146.285v73.143h877.715v-73.143c0-80.791-65.494-146.285-146.285-146.285h-585.143zM-0.001 292.576v-73.143c0-121.186 98.242-219.429 219.429-219.429v0h585.143c121.186 0 219.429 98.242 219.429 219.429v0 585.143c0 0.002 0 0.003 0 0.005 0 121.185-98.239 219.424-219.424 219.424-0.002 0-0.003 0-0.005 0h-585.143c-121.186 0-219.429-98.242-219.429-219.429v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Table_resize_maximaze_ic-01"],"grid":0},"attrs":[],"properties":{"order":510,"id":126,"name":"table-resize-maximize","prevSize":32,"code":59720},"setIdx":0,"setId":1,"iconIdx":127},{"icon":{"paths":["M219.428 73.148v0c-80.791 0-146.285 65.494-146.285 146.285v512.001h877.715v-512.001c0-80.791-65.494-146.285-146.285-146.285h-585.143zM-0.001 731.434v-512.001c0-121.186 98.242-219.429 219.429-219.429v0h585.143c121.186 0 219.429 98.242 219.429 219.429v0 585.143c0 0.002 0 0.003 0 0.005 0 121.185-98.239 219.424-219.424 219.424-0.002 0-0.003 0-0.005 0h-585.143c-121.186 0-219.429-98.242-219.429-219.429v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Table_resize_hide_ic-01"],"grid":0},"attrs":[],"properties":{"order":511,"id":127,"name":"table-resize-hide","prevSize":32,"code":59721},"setIdx":0,"setId":1,"iconIdx":128},{"icon":{"paths":["M219.428 73.148v0c-80.791 0-146.285 65.494-146.285 146.285v292.572h877.715v-292.572c0-80.791-65.494-146.285-146.285-146.285h-585.143zM-0.001 512.005v-292.572c0-121.186 98.242-219.429 219.429-219.429v0h585.143c121.186 0 219.429 98.242 219.429 219.429v0 585.143c0 0.002 0 0.003 0 0.005 0 121.185-98.239 219.424-219.424 219.424-0.002 0-0.003 0-0.005 0h-585.143c-121.186 0-219.429-98.242-219.429-219.429v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Table_resize_resizable_ic-01"],"grid":0},"attrs":[],"properties":{"order":512,"id":128,"name":"table-resize-resizable","prevSize":32,"code":59722},"setIdx":0,"setId":1,"iconIdx":129},{"icon":{"paths":["M568.769 56.784c0-31.373-25.433-56.807-56.807-56.807s-56.807 25.433-56.807 56.807v0 398.385h-398.383c-31.373 0-56.807 25.433-56.807 56.807s25.433 56.807 56.807 56.807v0h398.383v398.388c0 31.373 25.433 56.807 56.807 56.807s56.807-25.433 56.807-56.807v0-398.388h398.388c31.373 0 56.807-25.433 56.807-56.807s-25.433-56.807-56.807-56.807v0h-398.388z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Plus_ic-01"],"grid":0},"attrs":[],"properties":{"order":513,"id":129,"name":"plus","prevSize":32,"code":59723},"setIdx":0,"setId":1,"iconIdx":130},{"icon":{"paths":["M512 1024.019c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512v0c-0.335 282.636-229.365 511.667-511.968 512h-0.032zM512 128.019c-212.078 0-384 171.923-384 384s171.923 384 384 384c212.078 0 384-171.923 384-384v0c-0.239-211.982-172.019-383.76-383.976-384h-0.024zM512 400.004v0c61.856 0 112.001 50.144 112.001 112.001v0 0c0 61.856-50.144 112.001-112.001 112.001v0 0c-61.856 0-112.001-50.144-112.001-112.001v0 0c0-61.856 50.144-112.001 112.001-112.001v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Runs_ic-01"],"grid":0},"attrs":[],"properties":{"order":514,"id":130,"name":"circle-with-dot","prevSize":32,"code":59724},"setIdx":0,"setId":1,"iconIdx":131},{"icon":{"paths":["M831.999 0.004v0c106.038 0 192 85.962 192 192v640c0 0.001 0 0.003 0 0.004 0 106.036-85.959 191.995-191.995 191.995-0.001 0-0.003 0-0.004 0h-640c-106.038 0-192-85.962-192-192v-640c0-106.038 85.962-192 192-192zM804.717 370.112c7.017-8.292 11.284-19.107 11.284-30.918 0-26.509-21.49-48.001-48.001-48.001-14.698 0-27.853 6.606-36.658 17.011l-0.058 0.070-260.614 309.484-145.984-131.385c-8.5-7.777-19.872-12.544-32.355-12.544-26.509 0-48 21.49-48 48 0 14.257 6.216 27.064 16.087 35.856l0.048 0.042 182.859 164.569c8.467 7.647 19.744 12.325 32.112 12.325 14.697 0 27.85-6.606 36.655-17.010l0.058-0.070z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Check_rectangle_ic-01"],"grid":0},"attrs":[],"properties":{"order":515,"id":131,"name":"check-rectangle","prevSize":32,"code":59725},"setIdx":0,"setId":1,"iconIdx":132},{"icon":{"paths":["M375.392 874.29c10.978 11.519 26.439 18.681 43.572 18.681 18.368 0 34.812-8.233 45.848-21.21l0.071-0.086 542.912-641.631c9.098-10.482 14.644-24.26 14.644-39.335 0-33.221-26.932-60.153-60.153-60.153-18.591 0-35.21 8.433-46.245 21.683l-0.079 0.098-499.636 590.466-293.118-307.924c-10.978-11.515-26.437-18.677-43.568-18.677-33.221 0-60.155 26.932-60.155 60.155 0 16.090 6.317 30.706 16.609 41.501l-0.023-0.024 339.316 356.455z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Check_ic-01"],"grid":0},"attrs":[],"properties":{"order":516,"id":132,"name":"check","prevSize":32,"code":59747},"setIdx":0,"setId":1,"iconIdx":133},{"icon":{"paths":["M996.075 624.001h-33.075c-4.647-13.098-12.476-24.833-22.776-34.142v-267.713c15.113-13.653 24.704-32.384 26.97-52.65l36.621-10.595c7.095-2.078 13.082-6.887 16.644-13.38s4.412-14.139 2.364-21.257c-2.052-7.121-6.831-13.137-13.295-16.73s-14.085-4.467-21.192-2.436l-33.57 9.707c-4.074-6.272-8.964-11.973-14.541-16.952v-115.188c0-4.95-1.962-9.698-5.453-13.199s-8.226-5.468-13.163-5.468h-74.466c-4.941 0-9.672 1.967-13.167 5.468-3.491 3.501-5.453 8.249-5.453 13.199v115.188c-8.661 7.74-15.617 17.211-20.417 27.81-4.8 10.595-7.335 22.080-7.446 33.716l-220.703 63.834c-3.537-4.872-7.583-9.353-12.071-13.359v-227.188c0-4.95-1.962-9.698-5.453-13.199s-8.226-5.468-13.163-5.468h-74.466c-4.937 0-9.672 1.967-13.163 5.468s-5.453 8.249-5.453 13.199v227.18c-4.493 4.011-8.538 8.49-12.075 13.368l-220.699-63.834c-0.111-11.636-2.646-23.121-7.446-33.72-4.796-10.599-11.751-20.070-20.417-27.815v-115.179c0-4.95-1.962-9.699-5.453-13.199-3.495-3.501-8.231-5.468-13.167-5.468h-74.465c-4.938 0-9.672 1.967-13.164 5.468s-5.453 8.249-5.453 13.199v115.179c-5.579 4.979-10.469 10.683-14.54 16.961l-33.569-9.707c-3.528-1.032-7.223-1.358-10.875-0.956-3.653 0.405-7.19 1.523-10.409 3.303-3.219 1.775-6.057 4.169-8.352 7.049-2.294 2.876-3.999 6.183-5.018 9.72-1.019 3.542-1.331 7.25-0.918 10.91s1.542 7.202 3.324 10.424c1.782 3.225 4.179 6.063 7.056 8.354s6.177 3.99 9.711 5.001l36.624 10.595c2.262 20.271 11.856 39.006 26.966 52.659v379.701c-15.108 13.653-24.702 32.384-26.969 52.65l-36.624 10.595c-7.116 2.057-13.125 6.866-16.704 13.368s-4.437 14.162-2.384 21.296c2.054 7.134 6.849 13.158 13.332 16.751 6.483 3.588 14.123 4.446 21.239 2.39l33.57-9.711c4.074 6.276 8.963 11.976 14.54 16.956v115.187c0 4.95 1.962 9.698 5.453 13.197 3.492 3.503 8.226 5.471 13.164 5.471h74.463c4.937 0 9.672-1.967 13.163-5.471 3.495-3.498 5.453-8.247 5.453-13.197v-115.187c8.666-7.745 15.621-17.216 20.421-27.81 4.796-10.595 7.335-22.080 7.442-33.716l220.706-63.834c3.533 4.872 7.583 9.353 12.071 13.359v227.188c0 4.95 1.962 9.698 5.453 13.202 3.491 3.498 8.226 5.466 13.163 5.466h74.466c4.937 0 9.672-1.967 13.163-5.466 3.495-3.503 5.453-8.252 5.453-13.202v-227.192c10.299-9.311 18.129-21.044 22.776-34.142h215.087c4.65 13.098 12.476 24.833 22.776 34.142v227.192c0 4.95 1.959 9.698 5.453 13.197 3.491 3.503 8.226 5.471 13.163 5.471h74.466c4.937 0 9.672-1.967 13.163-5.471 3.491-3.498 5.453-8.247 5.453-13.197v-227.192c10.299-9.311 18.125-21.044 22.776-34.142h33.075c7.407 0 14.511-2.952 19.746-8.201 5.235-5.253 8.18-12.374 8.18-19.802 0-7.424-2.945-14.546-8.18-19.797s-12.339-8.201-19.746-8.201zM139.706 810.667c-9.206 0-18.204-2.739-25.857-7.868-7.655-5.124-13.619-12.416-17.142-20.942-3.522-8.529-4.445-17.912-2.649-26.966 1.796-9.050 6.23-17.366 12.738-23.894 6.509-6.524 14.802-10.97 23.831-12.77s18.387-0.879 26.891 2.654c8.505 3.533 15.773 9.515 20.889 17.19 5.112 7.671 7.842 16.695 7.842 25.925-0.014 12.374-4.92 24.239-13.646 32.985-8.726 8.751-20.558 13.671-32.897 13.683zM139.706 306.666c-9.206 0-18.204-2.739-25.857-7.863-7.655-5.129-13.619-12.42-17.142-20.945-3.522-8.529-4.445-17.912-2.649-26.966 1.796-9.050 6.228-17.366 12.738-23.894 6.509-6.524 14.802-10.97 23.831-12.77s18.387-0.875 26.891 2.654c8.505 3.533 15.773 9.515 20.889 17.19 5.112 7.676 7.842 16.695 7.842 25.925-0.014 12.374-4.92 24.239-13.646 32.985-8.726 8.751-20.558 13.671-32.897 13.683zM456.192 589.855c-16.274 14.669-26.126 35.183-27.417 57.089l-224.014 64.794c-2.799-3.537-5.876-6.843-9.203-9.887v-379.696c3.329-3.042 6.408-6.35 9.207-9.887l224.009 64.79c1.289 21.909 11.141 42.423 27.417 57.096v155.699zM512.039 698.667c-9.203 0-18.201-2.739-25.856-7.863-7.655-5.129-13.619-12.42-17.144-20.945-3.521-8.529-4.442-17.912-2.646-26.966 1.797-9.050 6.23-17.366 12.737-23.894 6.512-6.524 14.801-10.97 23.829-12.77s18.39-0.875 26.894 2.654c8.504 3.533 15.774 9.515 20.886 17.19 5.115 7.671 7.847 16.695 7.847 25.925-0.014 12.374-4.92 24.239-13.646 32.985-8.726 8.751-20.558 13.671-32.901 13.683zM512.039 418.667c-9.203 0-18.201-2.739-25.856-7.863-7.655-5.129-13.619-12.416-17.144-20.945-3.521-8.529-4.442-17.912-2.646-26.961 1.797-9.054 6.23-17.37 12.737-23.898 6.512-6.524 14.801-10.97 23.829-12.77s18.39-0.875 26.894 2.654c8.504 3.533 15.774 9.515 20.886 17.19 5.115 7.676 7.847 16.695 7.847 25.925-0.014 12.374-4.92 24.239-13.646 32.985-8.726 8.751-20.558 13.671-32.901 13.683zM828.523 589.858c-10.296 9.311-18.125 21.044-22.772 34.142h-215.087c-4.647-13.098-12.476-24.833-22.776-34.142v-155.712c16.278-14.673 26.126-35.187 27.417-57.093l224.014-64.79c2.799 3.533 5.88 6.84 9.207 9.882l-0.005 267.713zM884.375 698.667c-9.203 0-18.201-2.739-25.856-7.863-7.655-5.129-13.619-12.42-17.144-20.945-3.521-8.529-4.442-17.912-2.646-26.966 1.793-9.050 6.225-17.366 12.737-23.894 6.507-6.524 14.801-10.97 23.829-12.77s18.386-0.875 26.894 2.654c8.504 3.533 15.77 9.515 20.886 17.19 5.115 7.671 7.842 16.695 7.842 25.925-0.009 12.374-4.916 24.239-13.641 32.985-8.726 8.751-20.561 13.671-32.901 13.683zM884.375 306.666c-9.203 0-18.201-2.739-25.856-7.863-7.655-5.129-13.619-12.42-17.144-20.945-3.521-8.529-4.442-17.912-2.646-26.966 1.793-9.050 6.225-17.366 12.737-23.894 6.507-6.524 14.801-10.97 23.829-12.77s18.386-0.875 26.894 2.654c8.504 3.533 15.77 9.515 20.886 17.19s7.842 16.695 7.842 25.925c-0.009 12.374-4.916 24.239-13.641 32.985-8.73 8.751-20.561 13.671-32.901 13.683z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Params_ic"],"grid":0},"attrs":[],"properties":{"order":517,"id":133,"name":"params","prevSize":32,"code":59712},"setIdx":0,"setId":1,"iconIdx":134},{"icon":{"paths":["M512 0c-282.769 0-512 229.231-512 512s229.231 512 512 512c282.769 0 512-229.231 512-512v0c0-282.769-229.231-512-512-512v0zM99.097 512c0-228.040 184.863-412.903 412.903-412.903s412.903 184.863 412.903 412.903c0 228.040-184.863 412.903-412.903 412.903v0c-228.040 0-412.903-184.863-412.903-412.903v0zM561.548 247.742c0-27.365-22.184-49.548-49.548-49.548s-49.548 22.184-49.548 49.548v0 264.258c0 27.365 22.184 49.548 49.548 49.548v0h198.193c27.365 0 49.548-22.184 49.548-49.548s-22.184-49.548-49.548-49.548v0h-148.645z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Time_ic-01"],"grid":0},"attrs":[],"properties":{"order":518,"id":134,"name":"time","prevSize":32,"code":59758},"setIdx":0,"setId":1,"iconIdx":135},{"icon":{"paths":["M738.883 141.242l-0.084 1.222c-5.293 62.167-27.789 119.427-62.062 166.078l-0.877 1.127c-44.64 55.488-99.241 102.622-163.859 140.177l-2.767-1.491c-61.847-36.065-116.45-83.197-161.965-139.814l0.646 0.922c-34.919-47.573-57.416-104.834-62.792-168.222h453.764zM845.274 141.242h19.831c39.002 0 70.621-31.619 70.621-70.621s-31.619-70.621-70.621-70.621v0h-706.207c-39.002 0-70.621 31.619-70.621 70.621s31.619 70.621 70.621 70.621v0h19.831c5.821 86.996 36.113 165.929 83.972 231.17l-0.859-1.228c42.627 55.122 92.83 101.805 149.583 139.385l2.301 1.432c-59.055 39.014-109.256 85.695-150.826 139.395l-1.058 1.422c-47 64.012-77.292 142.946-83.040 228.602l-0.071 1.337h-19.831c-39.002 0-70.621 31.619-70.621 70.621s31.619 70.621 70.621 70.621v0h706.207c39.002 0 70.621-31.619 70.621-70.621s-31.619-70.621-70.621-70.621v0h-19.831c-5.821-86.996-36.111-165.929-83.972-231.168l0.859 1.228c-42.627-55.124-92.829-101.805-149.583-139.385l-2.301-1.432c59.055-39.012 109.256-85.693 150.826-139.395l1.058-1.422c47.004-64.010 77.295-142.946 83.042-228.604l0.071-1.337zM512 574.153l2.769 1.491c61.849 36.065 116.451 83.197 161.968 139.814l-0.646-0.922c34.919 47.573 57.416 104.834 62.792 168.222h-453.765l0.084-1.222c5.292-62.168 27.789-119.429 62.062-166.080l0.877-1.129c44.64-55.488 99.242-102.622 163.859-140.177z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Duration_ic-01"],"grid":0},"attrs":[],"properties":{"order":519,"id":135,"name":"duration","prevSize":32,"code":59759},"setIdx":0,"setId":1,"iconIdx":136},{"icon":{"paths":["M966.67 606.722h-216.091l15.789-189.446h200.302c31.388 0 56.834-25.446 56.834-56.834s-25.446-56.834-56.834-56.834v0h-190.828l20.13-241.561c0.155-1.568 0.242-3.392 0.242-5.234 0-31.388-25.446-56.834-56.834-56.834-29.911 0-54.424 23.105-56.667 52.44l-0.012 0.192-20.915 250.997h-264.835l20.13-241.561c0.131-1.446 0.204-3.126 0.204-4.824 0-31.388-25.446-56.834-56.834-56.834-29.765 0-54.186 22.881-56.633 52.015l-0.014 0.208-20.915 250.997h-225.559c-31.388 0-56.834 25.446-56.834 56.834s25.446 56.834 56.834 56.834v0h216.087l-15.789 189.446h-200.296c-31.388 0-56.834 25.446-56.834 56.834s25.446 56.834 56.834 56.834v0h190.825l-20.13 241.558c-0.124 1.414-0.197 3.060-0.197 4.723 0 31.39 25.447 56.836 56.836 56.836 29.728 0 54.125-22.822 56.626-51.902l0.014-0.211 20.915-251.003h264.831l-20.13 241.558c-0.151 1.558-0.238 3.367-0.238 5.197 0 31.388 25.446 56.834 56.834 56.834 29.893 0 54.395-23.078 56.663-52.39l0.012-0.194 20.915-251.003h225.563c31.388 0 56.834-25.446 56.834-56.834s-25.446-56.834-56.834-56.834v0zM371.692 606.722l15.786-189.446h264.835l-15.789 189.446z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Hash_ic-01"],"grid":0},"attrs":[],"properties":{"order":520,"id":136,"name":"hash","prevSize":32,"code":59760},"setIdx":0,"setId":1,"iconIdx":137},{"icon":{"paths":["M871.298 80.842h-89.824v-89.824h-107.789v89.824h-323.368v-89.824h-107.789v89.824h-89.824c-69.452 0-125.755 56.301-125.755 125.755v0 682.666c0 69.452 56.301 125.755 125.755 125.755v0h718.597c69.452 0 125.755-56.301 125.755-125.755v0-682.666c0-69.452-56.301-125.755-125.755-125.755v0zM152.702 188.632h718.597c9.922 0 17.965 8.044 17.965 17.965v0 161.684h-754.526v-161.684c0-9.922 8.044-17.965 17.965-17.965v0zM871.298 907.229h-718.597c-9.922 0-17.965-8.044-17.965-17.965v0-413.192h754.526v413.192c0 0.002 0 0.003 0 0.005 0 9.92-8.040 17.96-17.96 17.96-0.002 0-0.003 0-0.005 0v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Calendar_ic-01"],"grid":0},"attrs":[],"properties":{"order":521,"id":137,"name":"calendar","prevSize":32,"code":59761},"setIdx":0,"setId":1,"iconIdx":138},{"icon":{"paths":["M997.161 28.923c-16.026-17.696-39.048-28.801-64.667-28.922h-841.026c-25.611 0.129-48.608 11.215-64.561 28.807l-0.066 0.074-0.066 0.066c-16.61 18.321-26.776 42.75-26.776 69.553 0 0.103 0 0.204 0 0.306v-0.016l-0.009 826.44c-0.002 0.24-0.003 0.523-0.003 0.805 0 26.637 10.184 50.896 26.87 69.095l-0.068-0.076c16.016 17.703 39.032 28.815 64.646 28.944h841.024c25.605-0.099 48.601-11.185 64.537-28.785l0.066-0.074c16.67-18.116 26.888-42.393 26.888-69.059 0-0.3-0.002-0.598-0.003-0.897v0.046l0.011-826.441c0.003-0.264 0.003-0.575 0.003-0.887 0-26.625-10.184-50.87-26.87-69.054l0.068 0.074zM107.796 916.196l0.011-808.391h808.395l1.781 808.391zM756.336 270.027c2.327 4.923 3.687 10.695 3.687 16.785 0 0.033 0 0.066 0 0.101v-0.005 66.288c0 0.033 0 0.073 0 0.112 0 12.208-5.465 23.14-14.081 30.485l-0.057 0.047-0.638 0.556-0.674 0.507c-7.986 5.839-17.999 9.342-28.832 9.342s-20.848-3.504-28.973-9.439l0.139 0.096-1.315-1.064c-8.67-7.388-14.134-18.317-14.134-30.522 0-0.043 0-0.085 0-0.128v0.006-25.24h-115.152v420.544c0 0.013 0 0.028 0 0.043 0 11.952-5.577 22.602-14.268 29.49l-0.077 0.060 0.212 0.242c-0.253 0.219-0.575 0.283-0.835 0.499-0.204 0.161-0.27 0.409-0.477 0.565l-0.142-0.191c-7.722 6.436-17.75 10.342-28.688 10.342s-20.966-3.906-28.761-10.4l0.073 0.058-0.145 0.191c-0.205-0.156-0.27-0.409-0.474-0.565-0.261-0.216-0.584-0.275-0.842-0.499l0.216-0.246c-8.772-6.946-14.351-17.595-14.351-29.547 0-0.014 0-0.028 0-0.043v0.002-420.542h-115.152v25.24c0 0.030 0 0.066 0 0.103 0 12.211-5.465 23.147-14.082 30.493l-0.057 0.047-0.638 0.556-0.674 0.507c-7.986 5.839-18.002 9.342-28.835 9.342s-20.849-3.504-28.974-9.439l0.139 0.096-1.315-1.064c-8.67-7.392-14.133-18.325-14.133-30.534 0-0.038 0-0.077 0-0.115v0.006-66.288c0-0.032 0-0.069 0-0.107 0-12.208 5.463-23.14 14.077-30.487l0.055-0.046c7.741-6.96 18.034-11.216 29.322-11.216 0.006 0 0.011 0 0.017 0h408.236c0.125-0.002 0.272-0.002 0.42-0.002 11.417 0 21.841 4.254 29.773 11.261l-0.049-0.043c4.381 3.728 7.912 8.316 10.354 13.515l0.103 0.245z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["text"],"grid":0},"attrs":[],"properties":{"order":493,"id":138,"name":"text","prevSize":32,"code":59757},"setIdx":0,"setId":1,"iconIdx":139}],"height":1024,"metadata":{"name":"icomoon"},"preferences":{"showGlyphs":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"icon-","metadata":{"fontFamily":"icomoon"},"metrics":{"emSize":1024,"baseline":6.25,"whitespace":50},"embed":false},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"classSelector":".icon","name":"icomoon"},"historySize":50,"showCodes":true,"gridSize":16}} \ No newline at end of file diff --git a/src/public/assets/inconsolata/fonts/Inconsolata.ttf b/src/public/assets/inconsolata/fonts/Inconsolata.ttf new file mode 100644 index 00000000..65324679 Binary files /dev/null and b/src/public/assets/inconsolata/fonts/Inconsolata.ttf differ diff --git a/src/public/assets/inconsolata/inconsolata.css b/src/public/assets/inconsolata/inconsolata.css new file mode 100644 index 00000000..b7d98bff --- /dev/null +++ b/src/public/assets/inconsolata/inconsolata.css @@ -0,0 +1,6 @@ +@font-face { + font-family: 'Inconsolata'; + src: url('./fonts/Inconsolata.ttf') format('truetype'); + font-display: block; + font-weight: 1 999; +} diff --git a/src/public/assets/inter/fonts/Inter.ttf b/src/public/assets/inter/fonts/Inter.ttf new file mode 100644 index 00000000..969a990f Binary files /dev/null and b/src/public/assets/inter/fonts/Inter.ttf differ diff --git a/src/public/assets/inter/inter.css b/src/public/assets/inter/inter.css new file mode 100644 index 00000000..47a79cbd --- /dev/null +++ b/src/public/assets/inter/inter.css @@ -0,0 +1,6 @@ +@font-face { + font-family: 'Inter'; + src: url('./fonts/Inter.ttf') format('truetype'); + font-display: block; + font-weight: 1 999; +} diff --git a/src/public/favicon.ico b/src/public/favicon.ico new file mode 100644 index 00000000..c81a3c0e Binary files /dev/null and b/src/public/favicon.ico differ diff --git a/src/public/index.html b/src/public/index.html new file mode 100644 index 00000000..74776c49 --- /dev/null +++ b/src/public/index.html @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Aim + + + + + + +
+ + + diff --git a/src/public/manifest.json b/src/public/manifest.json new file mode 100644 index 00000000..e866a8da --- /dev/null +++ b/src/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "aimui", + "name": "Aim UI", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} \ No newline at end of file diff --git a/src/public/robots.txt b/src/public/robots.txt new file mode 100644 index 00000000..e9e57dc4 --- /dev/null +++ b/src/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/src/setup.py b/src/setup.py new file mode 100644 index 00000000..d1135d0b --- /dev/null +++ b/src/setup.py @@ -0,0 +1,35 @@ +import os + +from setuptools import setup + +here = os.path.abspath(os.path.dirname(__file__)) + +version_file = os.path.join(here, 'aim_ui/VERSION') +with open(version_file) as vf: + __version__ = vf.read().strip() + +# Package meta-data. +NAME = 'aim-ui' +DESCRIPTION = 'Aim UI' +VERSION = __version__ + + +def package_files(directory): + paths = [] + for (path, _, filenames) in os.walk(directory): + for filename in filenames: + paths.append(os.path.join('..', path, filename)) + return paths + + +# These are symlinks to main files +files = package_files('aim_ui/build') +files.append('../aim_ui/VERSION') + +setup( + name=NAME, + version=__version__, + description=DESCRIPTION, + packages=['aim_ui'], + package_data={'aim_ui': files} +) diff --git a/src/src/App.scss b/src/src/App.scss new file mode 100644 index 00000000..7e1ac126 --- /dev/null +++ b/src/src/App.scss @@ -0,0 +1,27 @@ +@import 'src/styles/base/_reset.scss'; +@import 'src/styles/components/_autocomplete.scss'; +@import 'src/styles/components/_tooltip.scss'; +@import 'src/styles/components/_inputs.scss'; +@import 'src/styles/_global.scss'; + +body { + -webkit-font-smoothing: antialiased; + overscroll-behavior: none; +} + +#root { + background-color: #ffff; +} +.mainContainer { + width: calc(100% - 75px); + height: 100%; +} + +.preloader-fade-out { + transition: 0.5s ease-out; + opacity: 0; +} +.pageContainer { + height: 100%; + display: flex; +} diff --git a/src/src/App.test.tsx b/src/src/App.test.tsx new file mode 100644 index 00000000..f7fd3928 --- /dev/null +++ b/src/src/App.test.tsx @@ -0,0 +1,13 @@ +import React from 'react'; + +import { render } from '@testing-library/react'; + +import App from './App'; + +//@TODO: The next action on this may try to solve the testing issues by going further with the components used here. + +test('renders learn react link', () => { + // render(); + // const linkElement = screen.getByText(/learn react/i); + // expect(linkElement).toBeInTheDocument(); +}); diff --git a/src/src/App.tsx b/src/src/App.tsx new file mode 100644 index 00000000..2572a4b7 --- /dev/null +++ b/src/src/App.tsx @@ -0,0 +1,90 @@ +import React from 'react'; +import { BrowserRouter, Switch, Route, Redirect } from 'react-router-dom'; + +import { loader } from '@monaco-editor/react'; + +import AlertBanner from 'components/kit/AlertBanner'; +import SideBar from 'components/SideBar/SideBar'; +import ProjectWrapper from 'components/ProjectWrapper/ProjectWrapper'; +import Theme from 'components/Theme/Theme'; +import BusyLoaderWrapper from 'components/BusyLoaderWrapper/BusyLoaderWrapper'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { checkIsBasePathInCachedEnv, getBasePath } from 'config/config'; + +import PageWrapper from 'pages/PageWrapper'; + +import routes from 'routes/routes'; + +import { inIframe } from 'utils/helper'; + +import './App.scss'; + +const basePath = getBasePath(false); + +const isVisibleCacheBanner = checkIsBasePathInCachedEnv(basePath) && inIframe(); + +// loading monaco from node modules instead of CDN +loader.config({ + paths: { + vs: `${getBasePath()}/static-files/vs`, + }, +}); + +function App(): React.FunctionComponentElement { + React.useEffect(() => { + let timeoutId: number; + const preloader = document.getElementById('preload-spinner'); + if (preloader) { + preloader.classList.add('preloader-fade-out'); + timeoutId = window.setTimeout(() => { + preloader.remove(); + }, 500); + } + return () => { + window.clearTimeout(timeoutId); + }; + }, []); + + return ( + + + + {isVisibleCacheBanner && ( + + You are using UI from notebook env, please make sure to + keep server running for a better experience + + )} +
+ + + +
+ } + > + + {Object.values(routes).map((route, index) => { + const { component: Component, path, isExact, title } = route; + return ( + + + + + + + + ); + })} + + + +
+
+
+
+ ); +} + +export default App; diff --git a/src/src/assets/experiments.svg b/src/src/assets/experiments.svg new file mode 100644 index 00000000..6b5f7f33 --- /dev/null +++ b/src/src/assets/experiments.svg @@ -0,0 +1,15 @@ + + + + + Experiments + + + + diff --git a/src/src/assets/icons/arrow-up.svg b/src/src/assets/icons/arrow-up.svg new file mode 100644 index 00000000..75103640 --- /dev/null +++ b/src/src/assets/icons/arrow-up.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/src/assets/icons/debug.svg b/src/src/assets/icons/debug.svg new file mode 100644 index 00000000..93d065b8 --- /dev/null +++ b/src/src/assets/icons/debug.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/src/src/assets/icons/discord.svg b/src/src/assets/icons/discord.svg new file mode 100644 index 00000000..20d0506c --- /dev/null +++ b/src/src/assets/icons/discord.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/src/assets/icons/github.svg b/src/src/assets/icons/github.svg new file mode 100644 index 00000000..d3ec91a1 --- /dev/null +++ b/src/src/assets/icons/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/src/assets/icons/notifications/error.svg b/src/src/assets/icons/notifications/error.svg new file mode 100644 index 00000000..c64ee8e0 --- /dev/null +++ b/src/src/assets/icons/notifications/error.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/src/assets/icons/notifications/info.svg b/src/src/assets/icons/notifications/info.svg new file mode 100644 index 00000000..6cc2fda3 --- /dev/null +++ b/src/src/assets/icons/notifications/info.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/src/assets/icons/notifications/success.svg b/src/src/assets/icons/notifications/success.svg new file mode 100644 index 00000000..1b7fe653 --- /dev/null +++ b/src/src/assets/icons/notifications/success.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/src/assets/icons/notifications/warning.svg b/src/src/assets/icons/notifications/warning.svg new file mode 100644 index 00000000..986f40cc --- /dev/null +++ b/src/src/assets/icons/notifications/warning.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/src/assets/icons/slack.svg b/src/src/assets/icons/slack.svg new file mode 100644 index 00000000..867ac3eb --- /dev/null +++ b/src/src/assets/icons/slack.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/src/assets/illustrations/emptyBookmarks.svg b/src/src/assets/illustrations/emptyBookmarks.svg new file mode 100644 index 00000000..79e62c3c --- /dev/null +++ b/src/src/assets/illustrations/emptyBookmarks.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/src/assets/illustrations/emptySearch.svg b/src/src/assets/illustrations/emptySearch.svg new file mode 100644 index 00000000..29e61e81 --- /dev/null +++ b/src/src/assets/illustrations/emptySearch.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/src/assets/illustrations/exploreData.svg b/src/src/assets/illustrations/exploreData.svg new file mode 100644 index 00000000..4df3a3d0 --- /dev/null +++ b/src/src/assets/illustrations/exploreData.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/src/assets/illustrations/wrongSearch.svg b/src/src/assets/illustrations/wrongSearch.svg new file mode 100644 index 00000000..22f41717 --- /dev/null +++ b/src/src/assets/illustrations/wrongSearch.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/src/assets/logo.svg b/src/src/assets/logo.svg new file mode 100644 index 00000000..1e1243af --- /dev/null +++ b/src/src/assets/logo.svg @@ -0,0 +1,29 @@ + + + + + Aim Logo + + diff --git a/src/src/assets/polka-dots.svg b/src/src/assets/polka-dots.svg new file mode 100644 index 00000000..a4c5786a --- /dev/null +++ b/src/src/assets/polka-dots.svg @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/src/src/assets/runs.svg b/src/src/assets/runs.svg new file mode 100644 index 00000000..07b73718 --- /dev/null +++ b/src/src/assets/runs.svg @@ -0,0 +1,15 @@ + + + + + Runs + + + + diff --git a/src/src/components/AggregationPopover/AggregationPopover.scss b/src/src/components/AggregationPopover/AggregationPopover.scss new file mode 100644 index 00000000..90e9f6f6 --- /dev/null +++ b/src/src/components/AggregationPopover/AggregationPopover.scss @@ -0,0 +1,13 @@ +@use 'src/styles/abstracts' as *; + +.AggregationPopover { + width: 16.5rem; + padding: $space-xs; + &__subtitle { + padding: $space-xs; + text-transform: uppercase; + } + &__Divider { + margin: $space-xs 0; + } +} diff --git a/src/src/components/AggregationPopover/AggregationPopover.tsx b/src/src/components/AggregationPopover/AggregationPopover.tsx new file mode 100644 index 00000000..c185bc34 --- /dev/null +++ b/src/src/components/AggregationPopover/AggregationPopover.tsx @@ -0,0 +1,148 @@ +import React from 'react'; + +import { Divider, MenuItem } from '@material-ui/core'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IAggregationPopoverProps } from 'types/components/AggregationPopover/AggregationPopover'; + +import { + AggregationAreaMethods, + AggregationLineMethods, +} from 'utils/aggregateGroupData'; + +import './AggregationPopover.scss'; + +function AggregationPopover({ + aggregationConfig, + onChange, +}: IAggregationPopoverProps): React.FunctionComponentElement { + function handleClick(e: React.ChangeEvent): void { + const methodKey: 'area' | 'line' = e.target?.getAttribute('property'); + const value = e.target?.getAttribute('data-name'); + if ( + methodKey && + value && + aggregationConfig.methods[methodKey] !== parseInt(value) && + typeof onChange === 'function' + ) { + onChange({ + methods: { + ...aggregationConfig.methods, + [methodKey]: parseInt(value), + }, + }); + } + } + + return ( + +
+ + Select Line: + +
+ + Mean + + + Median + + + Min + + + Max + +
+ + + Select Area: + +
+ + None + + + Min/Max + + + Mean ± Standard Deviation + + + Mean ± Standard Error + + + Confidence Interval (95%) + +
+
+
+ ); +} + +export default React.memo(AggregationPopover); diff --git a/src/src/components/AppBar/AppBar.scss b/src/src/components/AppBar/AppBar.scss new file mode 100644 index 00000000..0a60bc20 --- /dev/null +++ b/src/src/components/AppBar/AppBar.scss @@ -0,0 +1,28 @@ +@use 'src/styles/abstracts' as *; + +.AppBar { + display: flex; + align-items: center; + min-height: 2.5rem; + max-height: 2.5rem; + border-bottom: $border-main; + border-left: $border-main; + border-right: $border-main; + padding-left: 1.5rem; + background: $white; + z-index: 1; + &__title { + flex: 1; + text-transform: uppercase; + letter-spacing: 0.07em; + } + + &__content { + display: flex; + align-items: center; + &--disabled { + pointer-events: none; + opacity: 0.5; + } + } +} diff --git a/src/src/components/AppBar/AppBar.tsx b/src/src/components/AppBar/AppBar.tsx new file mode 100644 index 00000000..6d4b667b --- /dev/null +++ b/src/src/components/AppBar/AppBar.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IAppBarProps } from 'types/components/AppBar/AppBar'; + +import './AppBar.scss'; + +function AppBar( + props: IAppBarProps, +): React.FunctionComponentElement { + return ( + +
+ + {props.title} + + {props.children && ( +
+ {props.children} +
+ )} +
+
+ ); +} + +export default AppBar; diff --git a/src/src/components/AttachedTagsList/AttachedTagsList.scss b/src/src/components/AttachedTagsList/AttachedTagsList.scss new file mode 100644 index 00000000..0b4ebc67 --- /dev/null +++ b/src/src/components/AttachedTagsList/AttachedTagsList.scss @@ -0,0 +1,115 @@ +@use 'src/styles/abstracts' as *; + +.AttachedTagsList { + display: flex; + justify-content: space-between; + align-items: baseline; + font-size: $text-sm; + line-height: 15px; + position: relative; + margin-top: $space-xs; + + &__title { + text-transform: uppercase; + color: $pico-50; + font-weight: $font-500; + } + + &__noAttachedTags { + font-weight: $font-500; + font-size: $text-sm; + color: $pico-70; + margin-right: $space-unit; + } + + &__tags { + display: flex; + flex-wrap: wrap; + overflow: hidden; + &__tagWrapper { + max-width: 100%; + } + + .Badge { + margin-bottom: $space-xs; + margin-right: $space-xs; + max-width: 100%; + } + } + + &__ControlPopover__anchor { + max-width: 100%; + .icon-edit { + width: 1.5rem; + height: 1.5rem; + display: flex; + align-items: center; + justify-content: center; + color: $pico-50; + } + + &.active { + .icon-edit { + color: $pico-70; + } + } + } + + &__ControlPopover__attach { + .icon-plus { + margin-right: $space-xs; + } + } + + &__ControlPopover__editPopoverButton { + position: absolute; + top: toRem(-26px); + right: 0; + } +} + +.InlineAttachedTagsList { + margin-top: 0; + align-items: center; + max-width: 100%; + width: 100%; + .AttachedTagsList__ControlPopover__anchor { + max-width: 100%; + width: 100%; + } + .AttachedTagsList__tags { + align-items: center; + flex-wrap: unset; + overflow: hidden; + .Badge { + margin-bottom: 0; + } + } + &__tagsContainer { + max-width: 20rem; + width: 20rem; + &__tags { + padding: $space-xs $space-unit; + overflow: auto; + display: flex; + flex-wrap: wrap; + max-height: 50vh; + + .Badge { + margin: 0; + max-width: unset; + cursor: pointer; + } + + .icon-check { + padding: 0; + } + + &__badge { + display: inline-block; + margin-bottom: $space-xs; + margin-right: $space-xs; + } + } + } +} diff --git a/src/src/components/AttachedTagsList/AttachedTagsList.tsx b/src/src/components/AttachedTagsList/AttachedTagsList.tsx new file mode 100644 index 00000000..a9f2a47b --- /dev/null +++ b/src/src/components/AttachedTagsList/AttachedTagsList.tsx @@ -0,0 +1,160 @@ +import React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import { Box, Tooltip } from '@material-ui/core'; + +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import { Button, Icon, Badge, Text } from 'components/kit'; +import SelectTag from 'components/SelectTag/SelectTag'; +import ErrorBoundary from 'components/ErrorBoundary'; + +import runsService from 'services/api/runs/runsService'; + +import { ITagInfo } from 'types/pages/tags/Tags'; +import { IAttachedTagsListProps } from 'types/components/AttachedTagsList/AttachedTagsList'; + +import './AttachedTagsList.scss'; + +function AttachedTagsList({ + runHash, + initialTags, + tags, + headerRenderer, + addTagButtonSize = 'xSmall', + onTagsChange, + onRunsTagsChange, + inlineAttachedTagsList = false, +}: IAttachedTagsListProps) { + const [attachedTags, setAttachedTags] = React.useState( + tags ?? initialTags ?? [], + ); + const [, setSelectTagPopoverKey] = React.useState(`${Date.now()}`); + const getRunInfoRef = React.useRef(null); + + const getRunInfo = React.useCallback((runHash: string): void => { + getRunInfoRef.current = runsService?.getRunInfo(runHash); + getRunInfoRef.current.call().then((runInfo: any) => { + setAttachedTags(runInfo?.props?.tags || []); + }); + }, []); + + React.useEffect(() => { + if (runHash) { + if (!initialTags && !tags) { + getRunInfo(runHash); + } + } + return () => { + getRunInfoRef.current?.abort(); + }; + }, [runHash, initialTags, getRunInfo, tags]); + + React.useEffect(() => { + if (tags) { + setAttachedTags(tags); + } + }, [tags]); + + React.useEffect(() => { + if (onTagsChange) { + onTagsChange(attachedTags); + } + }, [attachedTags, onTagsChange]); + + const renderTagsBadges = React.useCallback(() => { + if (!_.isEmpty(attachedTags)) { + return ( +
+ {attachedTags.map((tag: ITagInfo) => ( + +
+ +
+
+ ))} +
+ ); + } + + return ( +
+ {inlineAttachedTagsList ? 'Click to edit tags' : 'No attached tags'} +
+ ); + }, [attachedTags, inlineAttachedTagsList]); + + const renderAddTagsButton = React.useCallback(() => { + return ( + + ); + }, [addTagButtonSize]); + + return ( + + <> + {typeof headerRenderer === 'function' ? ( + headerRenderer(attachedTags?.length) + ) : ( + + Tags {!_.isEmpty(attachedTags) ? `(${attachedTags.length})` : null} + + )} + + {!inlineAttachedTagsList && renderTagsBadges()} + + ( +
+ {inlineAttachedTagsList && renderTagsBadges()} + {!inlineAttachedTagsList && renderAddTagsButton()} +
+ )} + component={ + + } + /> +
+ +
+ ); +} + +export default React.memo(AttachedTagsList); diff --git a/src/src/components/AutocompleteInput/AutocompleteInput.d.ts b/src/src/components/AutocompleteInput/AutocompleteInput.d.ts new file mode 100644 index 00000000..1e7c1890 --- /dev/null +++ b/src/src/components/AutocompleteInput/AutocompleteInput.d.ts @@ -0,0 +1,24 @@ +import * as monaco from 'monaco-editor'; +import React from 'react'; + +import { EditorProps } from '@monaco-editor/react'; + +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; + +export interface IAutocompleteInputProps { + context: Record; + className?: string; + editorProps?: EditorProps; + advanced?: boolean; + disabled?: boolean; + value: string | undefined; + refObject?: React.MutableRefObject; + getEditorValue?: (value: string) => string; + onEnter?: () => void; + onChange?: ( + val: string, + ev?: monaco.editor.IModelContentChangedEvent, + ) => void; + error?: ISyntaxErrorDetails; + forceRemoveError?: boolean; +} diff --git a/src/src/components/AutocompleteInput/AutocompleteInput.scss b/src/src/components/AutocompleteInput/AutocompleteInput.scss new file mode 100644 index 00000000..0e66624d --- /dev/null +++ b/src/src/components/AutocompleteInput/AutocompleteInput.scss @@ -0,0 +1,110 @@ +@use 'src/styles/abstracts' as *; + +.AutocompleteInput { + position: relative; + z-index: 5; + &__disabled { + pointer-events: none; + opacity: 0.5; + } + &__errorBar { + top: calc(100% - 4px); + left: 0; + position: absolute; + padding: $space-unit; + z-index: 3; + border: 0.0625rem solid $error-color-25; + width: 100%; + background-color: $error-color-5; + border-bottom-left-radius: $border-radius-main; + border-bottom-right-radius: $border-radius-main; + &__message { + @include monospaceFontFamily(16); + span { + margin-right: $space-sm; + } + } + &__hint { + color: #4a1212; + display: flex; + align-items: center; + padding: $space-sm 1rem $space-sm 0; + border: 0.0625rem solid $error-color-25; + margin-top: $space-sm; + background-color: $white; + border-radius: $radius-main; + .Text { + color: #4a1212; + } + .Icon__container { + margin-left: toRem(10px); + margin-right: $space-xs; + } + a { + text-decoration: none; + color: $primary-color; + } + } + } + + &__container { + height: 2rem; + max-width: 100vw; + border: $border-grey-light; + display: flex; + align-items: center; + border-radius: $border-radius-main; + padding: $space-xs; + position: relative; + z-index: 4; + background-color: $white; + &:hover { + border: 0.0625rem solid $cuddle-110; + } + &__focused { + border: 0.0625rem solid $cuddle-110; + } + &__advanced { + height: 4.5rem; + align-items: flex-start; + padding: $space-xxxs $space-xs; + } + &__placeholder { + position: absolute; + left: $space-xs; + color: $text-color-50; + max-width: 95%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: $text-lg; + @include monospaceFontFamily(); + } + + &__error { + border-color: $error-color-80; + &:hover { + border-color: $error-color-80; + } + } + .details-label { + width: auto !important; + } + .codicon-suggest-more-info { + display: none !important; + } + + .scroll-decoration { + box-shadow: unset !important; + } + .monaco-editor .find-widget.visible { + display: none !important; + } + .monaco-hover { + display: none !important; + } + .monaco-editor .squiggly-error { + background: url('../../assets/icons/arrow-up.svg') repeat-x bottom left; + } + } +} diff --git a/src/src/components/AutocompleteInput/AutocompleteInput.tsx b/src/src/components/AutocompleteInput/AutocompleteInput.tsx new file mode 100644 index 00000000..fd3115ab --- /dev/null +++ b/src/src/components/AutocompleteInput/AutocompleteInput.tsx @@ -0,0 +1,284 @@ +import React from 'react'; +import classNames from 'classnames'; +import * as monacoEditor from 'monaco-editor'; +import _ from 'lodash-es'; + +import Editor, { useMonaco } from '@monaco-editor/react'; + +import { Icon, Text } from 'components/kit'; + +import { getMonacoConfig } from 'config/monacoConfig/monacoConfig'; +import { DOCUMENTATIONS } from 'config/references'; + +import { showAutocompletion } from 'utils/showAutocompletion'; + +import { IAutocompleteInputProps } from './AutocompleteInput.d'; + +import './AutocompleteInput.scss'; + +function AutocompleteInput({ + context, + advanced, + className, + editorProps = {}, + value = '', + refObject, + error, + disabled = false, + forceRemoveError = false, + //callback functions + onEnter, + onChange, +}: IAutocompleteInputProps) { + const [hasSelection, setHasSelection] = React.useState(false); + const [containerWidth, setContainerWidth] = React.useState(0); + const [focused, setFocused] = React.useState(false); + const [mounted, setMounted] = React.useState(false); + const [editorValue, setEditorValue] = React.useState(value); + const [errorMessage, setErrorMessage] = React.useState(''); + const monaco: any = useMonaco(); + const editorRef = React.useRef(); + + React.useEffect(() => { + initializeTheme(); + if (mounted) { + monaco.editor.defineTheme( + monacoConfig.theme.name, + monacoConfig.theme.config, + ); + monaco.editor.setTheme(monacoConfig.theme.name); + } + const onResize = _.debounce(() => { + setContainerWidth(window.innerWidth); + }, 500); + window.addEventListener('resize', onResize); + // inserting given object for autosuggestion + handleBlur(); + const disposable = showAutocompletion(monaco, context); + return () => { + disposable?.dispose(); + window.removeEventListener('resize', onResize); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [monaco, context, mounted]); + + React.useEffect(() => { + setTimeout(() => { + initializeTheme(); + setMarkers(); + }, 100); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [containerWidth]); + + React.useEffect(() => { + setMarkers(); + if (forceRemoveError && !error) { + setErrorMessage(''); + deleteMarkers(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [error, monaco, forceRemoveError]); + + React.useEffect(() => { + if (focused) { + editorRef.current?.focus(); + } + }, [focused, mounted]); + + React.useEffect(() => { + if (value !== editorValue) { + setEditorValue(value); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [value]); + + React.useEffect(() => { + setTimeout(() => { + initializeTheme(); + }, 100); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [containerWidth]); + + const monacoConfig: Record = React.useMemo(() => { + return getMonacoConfig(advanced); + }, [advanced]); + + const handleFocus: () => void = React.useCallback((): void => { + setFocused(true); + }, []); + + const handleBlur: () => void = React.useCallback((): void => { + setFocused(false); + }, []); + + function handleDidMount(editor: monacoEditor.editor.IStandaloneCodeEditor) { + setMounted(true); + editorRef.current = editor; + if (refObject) { + refObject.current = editorRef.current; + } + editorRef.current.onDidFocusEditorWidget(handleFocus); + editorRef.current.onDidBlurEditorWidget(handleBlur); + editorRef.current.onDidChangeCursorSelection(onSelectionChange); + } + + function setMarkers(): void { + if (monaco && error) { + setErrorMessage(error?.message); + monaco.editor.setModelMarkers(monaco.editor.getModels()[0], 'marker', [ + { + startLineNumber: error?.detail.line, + startColumn: error?.detail.offset, + endLineNumber: error?.detail.line, + endColumn: error?.detail?.end_offset || error?.detail.offset, + message: error?.message, + severity: monaco.MarkerSeverity.Error, + }, + ]); + } + } + + function deleteMarkers() { + if (monaco?.editor) { + monaco.editor.setModelMarkers(monaco.editor.getModels()[0], 'marker', []); + } + } + + function onSelectionChange( + e: monacoEditor.editor.ICursorSelectionChangedEvent, + ) { + if (e.selection) { + const { startColumn, endColumn } = e.selection; + const selectionPosition = startColumn !== endColumn; + setHasSelection(selectionPosition); + } + } + + const handleChange = React.useCallback( + ( + val: string | undefined, + ev: monacoEditor.editor.IModelContentChangedEvent, + ) => { + if (disabled) { + editorRef.current!.setValue(editorValue); + return; + } + deleteMarkers(); + setErrorMessage(''); + if (typeof val === 'string') { + // formatting value to avoid the new line + let formattedValue = val.replace(/[\n\r]/g, ''); + if ( + ev.changes[0].text.startsWith('[') && + formattedValue[ev.changes[0].rangeOffset - 1] === '.' + ) { + formattedValue = + formattedValue.slice(0, ev.changes[0].rangeOffset - 1) + + formattedValue.slice( + ev.changes[0].rangeOffset, + formattedValue.length, + ); + } + //@TODO: check why the onCHange function have been called in the if (ev.changes[0].text === '\n') { scope + if (onChange) { + // formattedValue = hasSelection + // ? editorValue.replace(/[\n\r]/g, '') + // : formattedValue; + onChange(formattedValue, ev); + } + if (ev.changes[0].text === '\n') { + formattedValue = hasSelection + ? editorValue.replace(/[\n\r]/g, '') + : formattedValue; + editorRef.current!.setValue(formattedValue); + if (onEnter) { + onEnter(); + } + setEditorValue(formattedValue); + return; + } + setEditorValue(formattedValue); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [hasSelection, onChange, onEnter, disabled], + ); + + function initializeTheme(): void { + if (mounted) { + monaco.editor.defineTheme( + monacoConfig.theme.name, + monacoConfig.theme.config, + ); + monaco.editor.setTheme(monacoConfig.theme.name); + } + } + + return ( +
+
+ } + options={monacoConfig.options} + {...editorProps} + /> + {mounted && + (focused || editorValue ? null : ( +
+ Filter runs, e.g. run.learning_rate {'>'} 0.0001 and + run.batch_size == 32 +
+ ))} +
+ {errorMessage && ( +
+
+ + + Error: + + {errorMessage} + +
+
+ + + Aim Query Language is pythonic and fairly easy to get used to. If + you are having issues, please refer to the{' '} + + docs + {' '} + for detailed usage guide and more examples. + +
+
+ )} +
+ ); +} + +AutocompleteInput.displayName = 'AutocompleteInput'; + +export default React.memo(AutocompleteInput); diff --git a/src/src/components/AutocompleteInput/index.ts b/src/src/components/AutocompleteInput/index.ts new file mode 100644 index 00000000..04935562 --- /dev/null +++ b/src/src/components/AutocompleteInput/index.ts @@ -0,0 +1,5 @@ +import AutocompleteInput from './AutocompleteInput'; + +export * from './AutocompleteInput'; + +export default AutocompleteInput; diff --git a/src/src/components/AxesPropsPopover/AxesPropsPopover.d.ts b/src/src/components/AxesPropsPopover/AxesPropsPopover.d.ts new file mode 100644 index 00000000..753e26e8 --- /dev/null +++ b/src/src/components/AxesPropsPopover/AxesPropsPopover.d.ts @@ -0,0 +1,27 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; +import { IAlignmentConfig } from 'types/services/models/metrics/metricsAppModel'; +import { ISelectOption } from 'types/services/models/explorer/createAppModel'; + +export interface IAxesPropsPopoverProps { + onAlignmentMetricChange: IMetricProps['onAlignmentMetricChange']; + onAlignmentTypeChange: IMetricProps['onAlignmentTypeChange']; + alignmentConfig: IAlignmentConfig; + selectFormOptions: ISelectOption[]; + axesScaleRange: IAxesScaleRange; + onAxesScaleRangeChange: IMetricProps['onAxesScaleRangeChange']; +} + +export interface IAxesScaleRange { + yAxis: { min?: number; max?: number }; + xAxis: { min?: number; max?: number }; +} + +export interface IAxesRangeValue { + min?: number; + max?: number; +} + +export interface IAxesRangeValidation { + min: boolean; + max: boolean; +} diff --git a/src/src/components/AxesPropsPopover/AxesPropsPopover.scss b/src/src/components/AxesPropsPopover/AxesPropsPopover.scss new file mode 100644 index 00000000..14570ea4 --- /dev/null +++ b/src/src/components/AxesPropsPopover/AxesPropsPopover.scss @@ -0,0 +1,49 @@ +@use 'src/styles/abstracts' as *; + +.AxesPropsPopover { + width: 24.375rem; + padding: $space-xs; + &__subtitle { + padding-block: $space-xs; + text-transform: uppercase; + } + &__divider { + margin: $space-xs 0; + } + &__range, &__alignment { + padding: $space-xs; + } + &__range { + &__container { + display: flex; + align-items: center; + &.yAxis { + margin-top: $space-sm; + } + } + } + + .scaleRangeInputs { + &__label { + margin-right: auto; + } + &__min, &__max { + display: inline-block; + width: 6.875rem; + margin-right: $space-xs; + } + + &__resetButton { + color: $pico-80; + border: 0.0625rem solid $cuddle; + &.Mui-disabled { + color: $pico-50; + border-color: $cuddle-50; + } + &.active { + border: $border-main-active; + background-color: $primary-color-5; + } + } + } +} diff --git a/src/src/components/AxesPropsPopover/AxesPropsPopover.tsx b/src/src/components/AxesPropsPopover/AxesPropsPopover.tsx new file mode 100644 index 00000000..40196df0 --- /dev/null +++ b/src/src/components/AxesPropsPopover/AxesPropsPopover.tsx @@ -0,0 +1,310 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { Divider } from '@material-ui/core'; + +import { + Text, + SelectDropdown, + InputWrapper, + Icon, + Button, +} from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { isSystemMetric } from 'utils/isSystemMetric'; +import { AlignmentOptionsEnum } from 'utils/d3'; + +import { ISelectDropdownOption as ISelectOption } from '../kit/SelectDropdown'; + +import { + IAxesPropsPopoverProps, + IAxesRangeValidation, + IAxesRangeValue, + DROPDOWN_LIST_HEIGHT, + METRICS_ALIGNMENT_LIST, + RANGE_DEBOUNCE_DELAY, +} from './'; + +import './AxesPropsPopover.scss'; + +function AxesPropsPopover({ + onAlignmentTypeChange, + onAlignmentMetricChange, + onAxesScaleRangeChange, + alignmentConfig, + selectFormOptions, + axesScaleRange, +}: IAxesPropsPopoverProps): React.FunctionComponentElement { + const [yScaleRange, setYScaleRange] = React.useState({}); + const [isYScaleRangeValid, setIsYScaleRangeValid] = + React.useState({ + min: true, + max: true, + }); + const [xScaleRange, setXScaleRange] = React.useState({}); + const [isXScaleRangeValid, setIsXScaleRangeValid] = + React.useState({ + min: true, + max: true, + }); + + const handleAlignmentChange = React.useCallback( + (option: ISelectOption): void => { + if (option) { + if (option.group === 'METRIC') { + onAlignmentMetricChange(option.value); + } else { + onAlignmentTypeChange(option.value as AlignmentOptionsEnum); + } + } + }, + [onAlignmentMetricChange, onAlignmentTypeChange], + ); + + const alignmentOptions: ISelectOption[] = React.useMemo(() => { + let metricOptions: { value: string; label: string; group: string }[] = []; + if (selectFormOptions) { + for (let option of selectFormOptions) { + if ( + option?.value?.option_name && + option?.value?.context === null && + !isSystemMetric(option.value.option_name) + ) { + metricOptions.push({ + value: option.label, + label: option.label, + group: 'METRIC', + }); + } + } + } + return METRICS_ALIGNMENT_LIST.concat(metricOptions); + }, [selectFormOptions]); + + const selected = React.useMemo(() => { + return alignmentConfig?.type === AlignmentOptionsEnum.CUSTOM_METRIC + ? alignmentConfig.metric + : alignmentConfig.type; + }, [alignmentConfig]); + + const axesProps = React.useMemo( + () => ({ + xAxis: { + scaleRange: xScaleRange, + setScaleRange: setXScaleRange, + setIsScaleRangeValid: setIsXScaleRangeValid, + }, + yAxis: { + scaleRange: yScaleRange, + setScaleRange: setYScaleRange, + setIsScaleRangeValid: setIsYScaleRangeValid, + }, + }), + [xScaleRange, yScaleRange], + ); + + const onScaleRangeChange = React.useCallback( + ( + e: React.ChangeEvent, + value: any, + metadata: any = { isValid: true }, + ) => { + const [axisType, key] = (e.target?.id || '').split('-') as [ + axisType: 'xAxis' | 'yAxis', + key: 'min' | 'max', + ]; + if (axisType && key) { + const { setScaleRange, setIsScaleRangeValid, scaleRange } = + axesProps[axisType]; + setScaleRange((prev) => ({ + ...prev, + [key]: value, + })); + setIsScaleRangeValid({ + min: true, + max: true, + [key]: metadata.isValid, + }); + if (metadata.isValid) { + onAxesScaleRangeChange({ + [axisType]: { ...scaleRange, [key]: value }, + }); + } + } + }, + [onAxesScaleRangeChange, axesProps], + ); + + const onResetRange = React.useCallback( + (axisType: 'xAxis' | 'yAxis') => { + onAxesScaleRangeChange({ + [axisType]: { min: undefined, max: undefined }, + }); + }, + [onAxesScaleRangeChange], + ); + + const validationPatterns = React.useMemo( + () => ({ + min: (max?: number) => [ + { + errorCondition: (value: number) => + max === undefined ? false : value > max, + errorText: `Value should be equal or smaller then ${max}`, + }, + ], + max: (min?: number) => [ + { + errorCondition: (value: number) => + min === undefined ? false : value < min, + errorText: `Value should be equal or greater then ${min}`, + }, + ], + }), + [], + ); + + React.useEffect(() => { + setXScaleRange((prevState) => + _.isEqual(axesScaleRange.xAxis, prevState) + ? prevState + : axesScaleRange.xAxis, + ); + setYScaleRange((prevState) => + _.isEqual(axesScaleRange.yAxis, prevState) + ? prevState + : axesScaleRange.yAxis, + ); + }, [axesScaleRange]); + + const xResetBtnDisabled = React.useMemo( + () => xScaleRange.min === undefined && xScaleRange.max === undefined, + [xScaleRange], + ); + const yResetBtnDisabled = React.useMemo( + () => yScaleRange.min === undefined && yScaleRange.max === undefined, + [yScaleRange], + ); + return ( + +
+
+ + X AXIS ALIGNMENT: + + +
+ +
+ + SET AXES RANGE: + +
+ + X-axis + + + + +
+
+ + Y-axis + + + + +
+
+
+
+ ); +} + +export default React.memo(AxesPropsPopover); diff --git a/src/src/components/AxesPropsPopover/config.ts b/src/src/components/AxesPropsPopover/config.ts new file mode 100644 index 00000000..9a0048d2 --- /dev/null +++ b/src/src/components/AxesPropsPopover/config.ts @@ -0,0 +1,27 @@ +import { AlignmentOptionsEnum } from 'utils/d3'; + +export const METRICS_ALIGNMENT_LIST: { + value: string; + label: string; + group?: string; +}[] = [ + { + value: AlignmentOptionsEnum.STEP, + label: 'Step', + }, + { + value: AlignmentOptionsEnum.EPOCH, + label: 'Epoch', + }, + { + value: AlignmentOptionsEnum.RELATIVE_TIME, + label: 'Relative Time', + }, + { + value: AlignmentOptionsEnum.ABSOLUTE_TIME, + label: 'Absolute Time', + }, +]; + +export const DROPDOWN_LIST_HEIGHT = 253; +export const RANGE_DEBOUNCE_DELAY = 300; diff --git a/src/src/components/AxesPropsPopover/index.ts b/src/src/components/AxesPropsPopover/index.ts new file mode 100644 index 00000000..ffffde46 --- /dev/null +++ b/src/src/components/AxesPropsPopover/index.ts @@ -0,0 +1,7 @@ +import AxesPropsPopover from './AxesPropsPopover'; + +export * from './AxesPropsPopover.d'; + +export * from './config'; + +export default AxesPropsPopover; diff --git a/src/src/components/AxesScalePopover/AxesScalePopover.scss b/src/src/components/AxesScalePopover/AxesScalePopover.scss new file mode 100644 index 00000000..04857074 --- /dev/null +++ b/src/src/components/AxesScalePopover/AxesScalePopover.scss @@ -0,0 +1,17 @@ +@use 'src/styles/abstracts' as *; + +.AxesScalePopover { + width: 21.5rem; + padding: 1rem; + + &__subtitle { + text-transform: uppercase; + } + + &__select { + display: flex; + align-items: center; + justify-content: space-between; + margin-top: $space-xs; + } +} diff --git a/src/src/components/AxesScalePopover/AxesScalePopover.tsx b/src/src/components/AxesScalePopover/AxesScalePopover.tsx new file mode 100644 index 00000000..f5867ca7 --- /dev/null +++ b/src/src/components/AxesScalePopover/AxesScalePopover.tsx @@ -0,0 +1,66 @@ +import React from 'react'; + +import { Text, ToggleButton } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { + IAxesScalePopoverProps, + IAxesScaleState, +} from 'types/components/AxesScalePopover/AxesScalePopover'; + +import { ScaleEnum } from 'utils/d3'; + +import './AxesScalePopover.scss'; + +function AxesScalePopover( + props: IAxesScalePopoverProps, +): React.FunctionComponentElement { + function handleScaleChange(val: string | number, id: any) { + const scaleParams: IAxesScaleState = { + ...props.axesScaleType, + [id]: val, + }; + props.onAxesScaleTypeChange(scaleParams); + } + + return ( + +
+ + Select Axes Scale: + +
+ +
+
+ +
+
+
+ ); +} + +export default React.memo(AxesScalePopover); diff --git a/src/src/components/BookmarkForm/BookmarkForm.tsx b/src/src/components/BookmarkForm/BookmarkForm.tsx new file mode 100644 index 00000000..50c8dd8b --- /dev/null +++ b/src/src/components/BookmarkForm/BookmarkForm.tsx @@ -0,0 +1,105 @@ +import React, { useState } from 'react'; + +import { + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + TextField, +} from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { + IBookmarkFormState, + IBookmarkFormProps, +} from 'types/components/BookmarkForm/BookmarkForm'; + +const initialState: IBookmarkFormState = { name: '', description: '' }; +function BookmarkForm({ + open, + onClose, + onBookmarkCreate, +}: IBookmarkFormProps): React.FunctionComponentElement { + const [state, setState] = useState(initialState); + const [hasError, setHasError] = useState(false); + const [isTouched, setIsTouched] = useState(false); + + function onSubmit(): void { + if (state.name) { + onBookmarkCreate(state); + setHasError(false); + setState({ name: '', description: '' }); + onClose(); + } else { + setHasError(true); + setIsTouched(true); + } + } + + function handleInputChange(e: React.ChangeEvent): void { + const { id, value } = e.target; + const newState = { ...state }; + newState[id as keyof IBookmarkFormState] = value; + setState(newState); + if (id === 'name') { + !isTouched && setIsTouched(true); + setHasError(!value); + } + } + + function handleClose() { + onClose(); + setHasError(false); + setIsTouched(false); + setState(initialState); + } + + return ( + + + Add Bookmark + + + + + + + + + + + ); +} + +export default BookmarkForm; diff --git a/src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.scss b/src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.scss new file mode 100644 index 00000000..a041f4a4 --- /dev/null +++ b/src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.scss @@ -0,0 +1,5 @@ +.BusyLoaderWrapper { + display: flex; + justify-content: center; + align-items: center; +} diff --git a/src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.tsx b/src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.tsx new file mode 100644 index 00000000..6c23c104 --- /dev/null +++ b/src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.tsx @@ -0,0 +1,50 @@ +import React from 'react'; + +import { Skeleton } from '@material-ui/lab'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { Spinner } from 'components/kit'; + +import { IBusyLoaderWrapperProps } from 'types/components/BusyLoaderWrapper/BusyLoaderWrapper'; + +import './BusyLoaderWrapper.scss'; + +function BusyLoaderWrapper({ + isLoading = false, + className = '', + children, + loaderType = 'spinner', + loaderConfig = {}, + width = '100%', + height = 'auto', + loaderComponent, +}: IBusyLoaderWrapperProps): React.FunctionComponentElement | null { + function loaderRender(): React.ReactElement { + switch (loaderType) { + case 'skeleton': { + return ; + } + default: { + return ; + } + } + } + return ( + <> + {isLoading ? ( + +
+ {loaderComponent || loaderRender()} +
+
+ ) : children ? ( + children + ) : null} + + ); +} + +export default React.memo(BusyLoaderWrapper); diff --git a/src/src/components/ChartLoader/ChartLoader.scss b/src/src/components/ChartLoader/ChartLoader.scss new file mode 100644 index 00000000..5ec6a921 --- /dev/null +++ b/src/src/components/ChartLoader/ChartLoader.scss @@ -0,0 +1,34 @@ +@use 'src/styles/abstracts' as *; + +.ChartLoader { + height: 100%; + width: 100%; + display: flex; +} + +.ChartLoader__chart { + flex: 1 100%; + display: flex; + align-items: center; + justify-content: center; + border-right: $border-separator; + span { + margin-left: 3.625rem; + } +} + +.ChartLoader__controls { + width: 3.75rem; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + overflow: auto; + .MuiSkeleton-root { + &:first-child { + margin-top: 0.5rem; + } + border-radius: 0.25rem; + margin-bottom: 0.5rem; + } +} diff --git a/src/src/components/ChartLoader/ChartLoader.tsx b/src/src/components/ChartLoader/ChartLoader.tsx new file mode 100644 index 00000000..3415281c --- /dev/null +++ b/src/src/components/ChartLoader/ChartLoader.tsx @@ -0,0 +1,37 @@ +import React from 'react'; + +import { Skeleton } from '@material-ui/lab'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IChartLoaderProps } from 'types/components/ChartLoader/ChartLoader'; + +import './ChartLoader.scss'; + +function ChartLoader({ + controlsCount = 3, +}: IChartLoaderProps): React.FunctionComponentElement { + return ( + +
+
+ Loading... +
+ {controlsCount ? ( +
+ {[...Array(controlsCount)].map((i, index) => ( + + ))} +
+ ) : null} +
+
+ ); +} + +export default ChartLoader; diff --git a/src/src/components/ChartPanel/ChartGrid/ChartGrid.d.ts b/src/src/components/ChartPanel/ChartGrid/ChartGrid.d.ts new file mode 100644 index 00000000..0273a180 --- /dev/null +++ b/src/src/components/ChartPanel/ChartGrid/ChartGrid.d.ts @@ -0,0 +1,19 @@ +import React from 'react'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { IChartPanelProps } from 'types/components/ChartPanel/ChartPanel'; +import { ISyncHoverStateArgs } from 'types/utils/d3/drawHoverAttributes'; + +export interface IChartGridProps { + data: IChartPanelProps['data']; + chartType: IChartPanelProps['chartType']; + chartProps: IChartPanelProps['chartProps']; + chartRefs?: React.RefObject[]; + chartPanelOffsetHeight?: number; + nameKey?: string; + readOnly?: boolean; + syncHoverState?: (args: ISyncHoverStateArgs) => void; + resizeMode?: ResizeModeEnum; + onMount?: () => void; +} diff --git a/src/src/components/ChartPanel/ChartGrid/ChartGrid.scss b/src/src/components/ChartPanel/ChartGrid/ChartGrid.scss new file mode 100644 index 00000000..2e02b9be --- /dev/null +++ b/src/src/components/ChartPanel/ChartGrid/ChartGrid.scss @@ -0,0 +1,7 @@ +@use 'src/styles/abstracts' as *; + +.ChartGrid { + min-height: 50%; + padding: 4px; + box-shadow: -1px -1px 0 0 $grey-lighter; +} diff --git a/src/src/components/ChartPanel/ChartGrid/ChartGrid.tsx b/src/src/components/ChartPanel/ChartGrid/ChartGrid.tsx new file mode 100644 index 00000000..8cf9ce15 --- /dev/null +++ b/src/src/components/ChartPanel/ChartGrid/ChartGrid.tsx @@ -0,0 +1,63 @@ +import React from 'react'; + +import { Grid, GridSize } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { CHART_TYPES_CONFIG } from 'components/ChartPanel/config'; + +import { GRID_SIZE, CHART_GRID_PATTERN } from 'config/charts'; + +import { IChartGridProps } from '.'; + +import './ChartGrid.scss'; + +function ChartGrid({ + data, + chartType, + chartRefs = [], + nameKey, + chartProps, + readOnly = false, + syncHoverState, + resizeMode, + chartPanelOffsetHeight, + onMount, +}: IChartGridProps): React.FunctionComponentElement { + function getGridSize(dataLength: number, index: number): GridSize { + return ( + dataLength > 9 ? GRID_SIZE.S : CHART_GRID_PATTERN[dataLength][index] + ) as GridSize; + } + return ( + + {data.map((chartData: any, index: number) => { + const Component = CHART_TYPES_CONFIG[chartType]; + const gridSize = getGridSize(data.length, index); + return ( + + + + ); + })} + + ); +} + +ChartGrid.displayName = 'ChartGrid'; + +export default React.memo(ChartGrid); diff --git a/src/src/components/ChartPanel/ChartGrid/index.ts b/src/src/components/ChartPanel/ChartGrid/index.ts new file mode 100644 index 00000000..1f59d17f --- /dev/null +++ b/src/src/components/ChartPanel/ChartGrid/index.ts @@ -0,0 +1,5 @@ +import ChartGrid from './ChartGrid'; + +export * from './ChartGrid.d'; + +export default ChartGrid; diff --git a/src/src/components/ChartPanel/ChartLegends/ChartLegends.d.ts b/src/src/components/ChartPanel/ChartLegends/ChartLegends.d.ts new file mode 100644 index 00000000..4a9a1fd3 --- /dev/null +++ b/src/src/components/ChartPanel/ChartLegends/ChartLegends.d.ts @@ -0,0 +1,9 @@ +import { LegendsDataType } from 'types/services/models/metrics/metricsAppModel'; + +import { LegendsModeEnum } from 'utils/d3'; + +export interface IChartLegendsProps { + data?: LegendsDataType; + mode?: LegendsModeEnum; + readOnly?: boolean; +} diff --git a/src/src/components/ChartPanel/ChartLegends/ChartLegends.scss b/src/src/components/ChartPanel/ChartLegends/ChartLegends.scss new file mode 100644 index 00000000..817714ba --- /dev/null +++ b/src/src/components/ChartPanel/ChartLegends/ChartLegends.scss @@ -0,0 +1,25 @@ +@use 'src/styles/abstracts' as *; + +.ChartLegends { + padding: $space-xs; + background-color: white; + height: 100%; + width: 100%; + &.pinned { + position: relative; + } + &.unpinned { + position: absolute; + right: 0; + opacity: 0.8; + box-shadow: 0 0 0 1px $grey-lighter; + &:hover { + opacity: 1 + } + } + &__container { + height: 100%; + width: 100%; + overflow: auto; + } +} diff --git a/src/src/components/ChartPanel/ChartLegends/ChartLegends.tsx b/src/src/components/ChartPanel/ChartLegends/ChartLegends.tsx new file mode 100644 index 00000000..bce98967 --- /dev/null +++ b/src/src/components/ChartPanel/ChartLegends/ChartLegends.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { drawLegends, LegendsModeEnum } from 'utils/d3'; + +import { IChartLegendsProps } from '.'; + +import './ChartLegends.scss'; + +function ChartLegends(props: IChartLegendsProps) { + const { data = {}, mode = LegendsModeEnum.PINNED, readOnly = false } = props; + const dataRef = React.useRef({}); + const containerRef = React.useRef(null); + + React.useEffect(() => { + if (containerRef.current && !_.isEqual(dataRef.current, data)) { + dataRef.current = data; + drawLegends({ + data, + containerNode: containerRef.current, + readOnly, + }); + } + }, [data, readOnly]); + + return ( + +
+
+
+ + ); +} + +ChartLegends.displayName = 'ChartLegends'; + +export default React.memo(ChartLegends); diff --git a/src/src/components/ChartPanel/ChartLegends/index.ts b/src/src/components/ChartPanel/ChartLegends/index.ts new file mode 100644 index 00000000..8ac3ad00 --- /dev/null +++ b/src/src/components/ChartPanel/ChartLegends/index.ts @@ -0,0 +1,5 @@ +import ChartLegends from './ChartLegends'; + +export * from './ChartLegends.d'; + +export default ChartLegends; diff --git a/src/src/components/ChartPanel/ChartPanel.scss b/src/src/components/ChartPanel/ChartPanel.scss new file mode 100644 index 00000000..15207d1b --- /dev/null +++ b/src/src/components/ChartPanel/ChartPanel.scss @@ -0,0 +1,30 @@ +@use 'src/styles/abstracts' as *; + +.ChartPanel__container { + height: 100%; + width: 100%; + display: flex; + .ChartPanel { + overflow: hidden; + height: 100%; + border-right: $border-separator; + position: relative; + display: flex; + flex-grow: 1; + max-width: 100%; + flex-basis: 0; + &__grid { + display: flex; + height: 100%; + overflow: auto; + margin: 0; + width: 100%; + flex-wrap: wrap; + } + &__controls { + width: 3.75rem; + max-height: 100%; + overflow-y: auto; + } + } +} diff --git a/src/src/components/ChartPanel/ChartPanel.tsx b/src/src/components/ChartPanel/ChartPanel.tsx new file mode 100644 index 00000000..3cfede13 --- /dev/null +++ b/src/src/components/ChartPanel/ChartPanel.tsx @@ -0,0 +1,235 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import SplitPane, { SplitPaneItem } from 'components/SplitPane'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { IChartPanelProps } from 'types/components/ChartPanel/ChartPanel'; +import { + IActivePoint, + ISyncHoverStateArgs, +} from 'types/utils/d3/drawHoverAttributes'; + +import { ChartTypeEnum } from 'utils/d3'; + +import ResizingFallback from '../ResizingFallback'; + +import ChartPopover from './ChartPopover'; +import ChartGrid from './ChartGrid'; +import ChartLegends from './ChartLegends'; + +import './ChartPanel.scss'; + +const ChartPanel = React.forwardRef(function ChartPanel( + props: IChartPanelProps, + ref, +) { + const [chartRefs] = React.useState[]>( + new Array(props.data.length).fill('*').map(() => React.createRef()), + ); + const [activePointRect, setActivePointRect] = React.useState<{ + top: number; + bottom: number; + left: number; + right: number; + } | null>(null); + const [legendsResizing, setLegendsResizing] = React.useState(false); + + const gridRef = React.useRef(null); + const activePointRef = React.useRef(null); + + const setActiveElemPos = React.useCallback(() => { + if ( + activePointRef.current && + gridRef.current && + activePointRef.current?.pointRect !== null + ) { + const { pointRect } = activePointRef.current; + + setActivePointRect({ ...pointRect }); + } else { + setActivePointRect(null); + } + }, [setActivePointRect]); + + const syncHoverState = React.useCallback( + (args: ISyncHoverStateArgs): void => { + const { activePoint, focusedState, dataSelector } = args; + // on MouseHover + activePointRef.current = activePoint; + if (activePoint !== null) { + chartRefs.forEach((chartRef, index) => { + if (focusedState) { + chartRef.current?.setFocusedState?.(focusedState); + } + if (index === activePoint.chartIndex) { + return; + } + switch (props.chartType) { + case ChartTypeEnum.LineChart: + chartRef.current?.updateHoverAttributes?.( + activePoint.xValue, + dataSelector, + ); + break; + case ChartTypeEnum.HighPlot: + chartRef.current?.clearHoverAttributes?.(); + break; + } + }); + + if (props.onActivePointChange) { + props.onActivePointChange(activePoint, focusedState?.active); + } + if (activePoint.pointRect !== null) { + setActiveElemPos(); + } else { + setActivePointRect(null); + } + } + // on MouseLeave + else { + chartRefs.forEach((chartRef) => { + chartRef.current?.clearHoverAttributes?.(); + }); + setActivePointRect(null); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [chartRefs, setActiveElemPos, props.chartType, props.onActivePointChange], + ); + + const displayLegends = React.useMemo( + (): boolean => !!props.legends?.display && !_.isEmpty(props.legendsData), + [props.legends?.display, props.legendsData], + ); + + const onLegendsResizeStart = React.useCallback((): void => { + setLegendsResizing(true); + }, []); + + const onLegendsResizeEnd = React.useCallback((): void => { + setLegendsResizing(false); + }, []); + + const onChartMount = React.useCallback(() => { + if (props.focusedState) { + chartRefs.forEach((chartRef) => { + chartRef.current?.setFocusedState?.(props.focusedState); + }); + } + }, [props.focusedState, chartRefs]); + + React.useImperativeHandle(ref, () => ({ + setActiveLineAndCircle: ( + lineKey?: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => { + chartRefs.forEach((chartRef) => { + chartRef.current?.setActiveLineAndCircle?.( + lineKey, + focusedStateActive, + force, + ); + }); + }, + })); + + React.useEffect(() => { + if (!props.panelResizing && props.focusedState) { + chartRefs.forEach((chartRef) => { + chartRef.current?.setFocusedState?.(props.focusedState); + }); + } + }, [ + chartRefs, + props.focusedState, + props.panelResizing, + props.resizeMode, + legendsResizing, + ]); + + return ( + +
+ {props.panelResizing ? ( + + ) : ( + <> + +
+ + } + > + + + 0 && + !props.zoom?.active && + !!props.tooltip?.display + } + forceOpen={!!props.focusedState?.active} + chartType={props.chartType} + tooltipContent={props?.tooltip?.content || {}} + tooltipAppearance={props?.tooltip?.appearance} + focusedState={props.focusedState} + alignmentConfig={props.alignmentConfig} + selectOptions={props.selectOptions} + onChangeTooltip={props.onChangeTooltip} + /> + + + + + + +
+
+ +
+ {props.controls} +
+
+ + )} +
+
+ ); +}); + +export default ChartPanel; diff --git a/src/src/components/ChartPanel/ChartPopover/ChartPopover.scss b/src/src/components/ChartPanel/ChartPopover/ChartPopover.scss new file mode 100644 index 00000000..6c6589b0 --- /dev/null +++ b/src/src/components/ChartPanel/ChartPopover/ChartPopover.scss @@ -0,0 +1,35 @@ +@use 'src/styles/abstracts' as *; + +.ChartPopover { + pointer-events: none; + z-index: 5 !important; + height: toRem(200px); // To not block table scroll + &.pinnedPopover { + width: 100%; + height: 100%; + } + > *:first-of-type { + height: toRem(200px); // To not block table scroll + } + &__content { + transform: none !important; + width: toRem(230px); + max-height: toRem(250px); + background: rgba(255, 255, 255, 0.78); + box-shadow: 0 1px 1px rgb(34 58 90 / 20%), 0 2px 2px rgb(34 58 90 / 20%), + 0 4px 4px rgb(34 58 90 / 20%), 0 6px 8px rgb(34 58 90 / 20%); + border: $border-main; + backdrop-filter: blur(3px); + overflow: unset; + &__pinned { + width: auto; + max-height: toRem(130px); + } + &__active { + background: $white; + } + &.hide { + visibility: hidden; + } + } +} diff --git a/src/src/components/ChartPanel/ChartPopover/ChartPopover.tsx b/src/src/components/ChartPanel/ChartPopover/ChartPopover.tsx new file mode 100644 index 00000000..c302e2f7 --- /dev/null +++ b/src/src/components/ChartPanel/ChartPopover/ChartPopover.tsx @@ -0,0 +1,179 @@ +import React from 'react'; +import classNames from 'classnames'; +import _ from 'lodash-es'; + +import { Popover, PopoverPosition } from '@material-ui/core'; + +import PopoverContent from 'components/ChartPanel/PopoverContent/PopoverContent'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { IChartPopover } from 'types/components/ChartPanel/ChartPopover'; +import { IActivePointRect } from 'types/utils/d3/drawHoverAttributes'; + +import getPositionBasedOnOverflow from 'utils/getPositionBasedOnOverflow'; + +import './ChartPopover.scss'; + +function ChartPopover(props: IChartPopover): JSX.Element { + let { + id = 'popover', + forceOpen = false, + open = false, + className = '', + containerNode = document.body, + selectOptions, + tooltipAppearance = TooltipAppearanceEnum.Auto, + } = props; + open = forceOpen || open; + + const [openPopover, setOpenPopover] = React.useState( + !!props.activePointRect && open, + ); + const [popoverNode, setPopoverNode] = React.useState(); + const [popoverPos, setPopoverPos] = React.useState({ + top: 10000, + left: 10000, + }); + + const isPopoverPinned = React.useMemo( + () => + tooltipAppearance === TooltipAppearanceEnum.Top || + tooltipAppearance === TooltipAppearanceEnum.Bottom, + [tooltipAppearance], + ); + + const onPopoverPositionChange = React.useCallback( + (activePointRect: IActivePointRect) => { + if (popoverNode && containerNode) { + // Popover viewport need to be overflowed by chart container + const popoverRect = popoverNode.getBoundingClientRect(); + const containerRect = containerNode.getBoundingClientRect(); + + if (containerRect.width && containerRect.height) { + const activePointPos = { + top: activePointRect.top - containerNode.scrollTop, + left: activePointRect.left - containerNode.scrollLeft, + right: activePointRect.right - containerNode.scrollLeft, + bottom: activePointRect.bottom - containerNode.scrollTop, + }; + + const pos = getPositionBasedOnOverflow( + activePointPos, + popoverRect, + containerRect, + isPopoverPinned, + tooltipAppearance, + ); + setPopoverPos(pos); + } + } + }, + [containerNode, popoverNode, isPopoverPinned, tooltipAppearance], + ); + + React.useEffect(() => { + setOpenPopover(!!props.activePointRect && open); + }, [props.activePointRect, open]); + + React.useEffect(() => { + if (!!props.activePointRect && openPopover) { + onPopoverPositionChange(props.activePointRect); + } + }, [ + props.activePointRect, + openPopover, + props.tooltipContent, + props.focusedState.key, + props.focusedState.active, + onPopoverPositionChange, + ]); + + React.useEffect(() => { + if (containerNode) { + const onScrollEnd = _.debounce( + () => setOpenPopover(!!props.activePointRect && open), + 300, + ); + const onScroll = _.debounce(() => setOpenPopover(false), 200, { + leading: true, + trailing: false, + }); + containerNode.addEventListener('scroll', onScroll); + containerNode.addEventListener('scroll', onScrollEnd); + return () => { + containerNode?.removeEventListener('scroll', onScroll); + containerNode?.removeEventListener('scroll', onScrollEnd); + }; + } + }, [props.activePointRect, open, containerNode]); + + React.useEffect(() => { + const onMouseMove = ({ target }: any) => { + if ( + !forceOpen && + !containerNode?.contains(target) && + !popoverNode?.contains(target) + ) { + setOpenPopover(false); + } + }; + document.addEventListener('mousemove', onMouseMove); + return () => { + document.removeEventListener('mousemove', onMouseMove); + }; + }, [containerNode, popoverNode, forceOpen]); + + return ( + + + + ); +} + +export default React.memo(ChartPopover); diff --git a/src/src/components/ChartPanel/ChartPopover/index.ts b/src/src/components/ChartPanel/ChartPopover/index.ts new file mode 100644 index 00000000..eae3ed33 --- /dev/null +++ b/src/src/components/ChartPanel/ChartPopover/index.ts @@ -0,0 +1,3 @@ +import ChartPopover from './ChartPopover'; + +export default ChartPopover; diff --git a/src/src/components/ChartPanel/PopoverContent/PopoverContent.scss b/src/src/components/ChartPanel/PopoverContent/PopoverContent.scss new file mode 100644 index 00000000..13c69543 --- /dev/null +++ b/src/src/components/ChartPanel/PopoverContent/PopoverContent.scss @@ -0,0 +1,170 @@ +@use 'src/styles/abstracts' as *; + +.PopoverContent__container { + position: relative; + max-height: inherit; + font-size: $text-sm; + line-height: 15px; + color: $pico-80; + background-color: transparent; + + .PopoverContent { + max-height: inherit; + overflow: auto; + padding-bottom: toRem(3px); + position: relative; + + &__actionButtons { + display: flex; + padding: $space-xxxxs; + height: 1.875rem; + position: absolute; + top: toRem(-28px); + left: toRem(-1px); + background: #fff; + border: $border-main; + border-bottom: transparent; + border-radius: $space-xxxs $space-xxxs 0 0; + box-shadow: -1px 1px 1px rgb(34 58 90 / 20%); + &::after { + content: ''; + height: $space-xxxs; + width: calc(100% + 2px); + background: #fff; + position: absolute; + bottom: toRem(-2px); + left: toRem(-1px); + border-left: $border-main; + } + &__actionButton { + margin-left: $space-xxxxs; + &__icon { + color: $pico-70; + } + &.active { + .PopoverContent__actionButtons__actionButton__icon { + color: $primary-color; + } + } + } + } + + &__pinned { + display: flex; + padding-bottom: 0; + overflow: unset; + .PopoverContent__boxWrapper { + display: flex; + max-width: 20rem; + flex: 1; + + &.pinned { + flex-direction: column; + overflow-y: auto; + width: toRem(250px); + .PopoverContent__box { + overflow-y: unset; + } + } + .PopoverContent__box { + overflow-y: auto; + } + .PopoverContent__tagBox { + overflow-y: hidden; + max-width: toRem(200px); + } + } + .PopoverContent__tagBox { + overflow: hidden; + .AttachedTagsList { + max-height: calc(100% - 1.25rem); + height: calc(100% - 1.25rem); + position: relative; + &__tags { + max-height: 100%; + } + &__ControlPopover__anchor { + position: absolute; + right: 0; + top: -1.875rem; + } + } + } + } + + &__boxContainer { + display: flex; + flex-direction: column; + &.pinned { + max-height: 100%; + width: toRem(250px); + overflow-y: auto; + margin-bottom: toRem(1px); + } + } + + &__box { + padding: 0.625rem 1rem; + } + + &__valueContainer { + display: flex; + //align-items: center; + margin-top: 0.4rem; + } + + &__valueContainer:first-child { + margin-top: 0; + } + + &__value { + margin-top: 0.25rem; + word-break: break-word; + } + + &__value:first-child { + margin-top: 0; + } + + &__headerValue { + margin-left: 0.4rem; + } + + &__axisValue { + margin-top: $space-xxxxs; + word-break: break-word; + } + + &__contextValue { + margin-left: 0.5rem; + font-weight: $font-400; + } + + &__runDetails { + display: flex; + align-items: center; + + .icon-link { + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + margin-right: 8px; + } + } + + &__subtitle1 { + color: $pico-50; + text-transform: uppercase; + font-weight: $font-500; + } + + &__subtitle2 { + font-weight: $font-600; + text-transform: capitalize; + color: $text-color; + margin-top: 8px; + } + } +} diff --git a/src/src/components/ChartPanel/PopoverContent/PopoverContent.tsx b/src/src/components/ChartPanel/PopoverContent/PopoverContent.tsx new file mode 100644 index 00000000..21cfa1ec --- /dev/null +++ b/src/src/components/ChartPanel/PopoverContent/PopoverContent.tsx @@ -0,0 +1,431 @@ +import React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; +import { Link as RouteLink } from 'react-router-dom'; + +import { Divider, Link, Paper, Tooltip } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; +import AttachedTagsList from 'components/AttachedTagsList/AttachedTagsList'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { PathEnum } from 'config/enums/routesEnum'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { IPopoverContentProps } from 'types/components/ChartPanel/PopoverContent'; + +import contextToString from 'utils/contextToString'; +import { + formatValueByAlignment, + getKeyByAlignment, +} from 'utils/formatByAlignment'; +import { AlignmentOptionsEnum, ChartTypeEnum } from 'utils/d3'; +import { formatValue } from 'utils/formatValue'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import getValueByField from 'utils/getValueByField'; +import { isMetricHash } from 'utils/isMetricHash'; +import { decode } from 'utils/encoder/encoder'; + +import './PopoverContent.scss'; + +const PopoverContent = React.forwardRef(function PopoverContent( + props: IPopoverContentProps, + ref, +): React.FunctionComponentElement { + const { + tooltipContent, + tooltipAppearance = TooltipAppearanceEnum.Auto, + focusedState, + chartType, + alignmentConfig, + selectOptions, + onRunsTagsChange, + onChangeTooltip, + } = props; + const { + selectedProps = {}, + groupConfig = {}, + name = '', + context = {}, + run, + } = tooltipContent || {}; + + const isPopoverPinned = React.useMemo( + () => + tooltipAppearance === TooltipAppearanceEnum.Top || + tooltipAppearance === TooltipAppearanceEnum.Bottom, + [tooltipAppearance], + ); + + function renderPopoverHeader(): React.ReactNode { + switch (chartType) { + case ChartTypeEnum.LineChart: { + return ( + +
+
+ Y: + + + {isSystemMetric(name) ? formatSystemMetricName(name) : name} + + + {contextToString(context)} + + + {focusedState?.yValue} + + +
+
+ X: + + {getKeyByAlignment(alignmentConfig)} + {alignmentConfig?.type === + AlignmentOptionsEnum.CUSTOM_METRIC && ( + + {contextToString(context)} + + )} + + {formatValueByAlignment({ + xAxisTickValue: (focusedState?.xValue as number) ?? null, + type: alignmentConfig?.type, + })} + + +
+
+
+ ); + } + case ChartTypeEnum.HighPlot: { + let metricName: string = ''; + let context: string = ''; + const xValue = `${focusedState?.xValue}`; + + if (isMetricHash(xValue)) { + const metric = JSON.parse(decode(xValue)); + metricName = metric.metricName; + context = metric.contextName; + } else { + metricName = (xValue || '')?.split('-')[0]; + context = (xValue || '')?.split('-')[1]; + } + + return ( + +
+
+ + {isSystemMetric(metricName) + ? formatSystemMetricName(metricName) + : metricName ?? '--'} + {' '} + {context || null} +
+
+ Value: {focusedState?.yValue} +
+
+
+ ); + } + case ChartTypeEnum.ImageSet: { + const { + step = '', + index = '', + caption = '', + images_name = '', + } = tooltipContent; + return ( + +
+ {caption} +
+ {images_name} + + {contextToString(context)} + +
+
+ Step: {step} + + Index: {index} + +
+
+
+ ); + } + case ChartTypeEnum.ScatterPlot: { + return ( + +
+
+ Y: + + + {focusedState?.yValue} + + +
+
+ X: + + + {focusedState?.xValue} + + +
+
+
+ ); + } + default: + return null; + } + } + + function renderActionButtons(): React.ReactNode { + if (focusedState?.active && run?.hash && onChangeTooltip) { + return ( +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+ ); + } + return null; + } + + function renderTags(): React.ReactNode { + return focusedState?.active && run?.hash ? ( + +
+ +
+ + +
Run Details
+ + + +
Experiment Detail
+ +
+
+
+ +
+ + + +
+
+
+ ) : null; + } + + return ( + + + {renderActionButtons()} +
+
+ {renderPopoverHeader()} + {isPopoverPinned && renderTags()} +
+ {!_.isEmpty(selectedProps) || !_.isEmpty(groupConfig) ? ( +
+ {_.isEmpty(selectedProps) ? null : ( + +
+ +
+
+ Selected Fields +
+ {Object.keys(selectedProps).map((paramKey) => ( +
+ + {`${getValueByField(selectOptions, paramKey)}: `} + + + {formatValue(selectedProps[paramKey])} + +
+ ))} +
+
+
+ )} + {_.isEmpty(groupConfig) ? null : ( + +
+ +
+
+ Group Config +
+ {Object.keys(groupConfig).map((groupConfigKey: string) => + _.isEmpty(groupConfig[groupConfigKey]) ? null : ( + +
+ {groupConfigKey} +
+ {Object.keys(groupConfig[groupConfigKey]).map( + (item) => { + let val = isSystemMetric( + groupConfig[groupConfigKey][item], + ) + ? formatSystemMetricName( + groupConfig[groupConfigKey][item], + ) + : groupConfig[groupConfigKey][item]; + return ( +
+ {`${item}: `} + {formatValue(val)} +
+ ); + }, + )} +
+ ), + )} +
+
+
+ )} + {!isPopoverPinned && renderTags()} +
+ ) : null} +
+
+
+ ); +}); + +export default React.memo(PopoverContent); diff --git a/src/src/components/ChartPanel/config.ts b/src/src/components/ChartPanel/config.ts new file mode 100644 index 00000000..15676f48 --- /dev/null +++ b/src/src/components/ChartPanel/config.ts @@ -0,0 +1,11 @@ +import { IChartTypeConfig } from 'types/components/ChartPanel/ChartPanel'; + +import LineChart from '../LineChart/LineChart'; +import HighPlot from '../HighPlot/HighPlot'; +import ScatterPlot from '../ScatterPlot/ScatterPlot'; + +export const CHART_TYPES_CONFIG: IChartTypeConfig = { + LineChart, + HighPlot, + ScatterPlot, +}; diff --git a/src/src/components/Charts/ScatterPlot/Axis/Axis.tsx b/src/src/components/Charts/ScatterPlot/Axis/Axis.tsx new file mode 100644 index 00000000..bf89171d --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/Axis/Axis.tsx @@ -0,0 +1,45 @@ +import React, { useEffect, memo } from 'react'; +import { select } from 'd3'; + +import { IAxisProps } from '../types'; + +/** + * Component Axis + * Usage + * + * @param label - it can be the name of the axis (Y axis) + * @param transform - svg transform (it can be translate()) + * @param scale - svg element scale + * @return React.FunctionComponentElement + */ +const Axis = ({ + label, + transform, + scale, +}: IAxisProps): React.FunctionComponentElement => { + const ref: React.MutableRefObject = React.createRef(); + + useEffect(() => { + select(ref.current).call(scale); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [scale]); + + // Can work width axis's UI easily here + // i.e. paint label as title etc. + return ( + + ); +}; + +Axis.displayName = 'Axis'; + +export default memo(Axis); diff --git a/src/src/components/Charts/ScatterPlot/Circles/Circles.tsx b/src/src/components/Charts/ScatterPlot/Circles/Circles.tsx new file mode 100644 index 00000000..c03f9e14 --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/Circles/Circles.tsx @@ -0,0 +1,44 @@ +import React, { memo } from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { DEFAULT_CIRCLE_COLOR, DEFAULT_CIRCLE_RADIUS } from '../config'; +import { ICircleProps } from '../types'; + +/** + * Circle Component + * @param data - the array of array, present the x, y coordinates of circles + * @param scale - svg scale + * @param color - circle's color + * @param radius - circle's radius + * @return React.FunctionComponentElement + */ +const Circle = ({ + data, + scale, + color = DEFAULT_CIRCLE_COLOR, + radius = DEFAULT_CIRCLE_RADIUS, +}: ICircleProps): React.FunctionComponentElement => { + // can easily handle hover and click, show tooltip, etc.. + // some UI tricks can be possible to move here instead of rendering it inside a single component + return ( + + + {data.map((coords: number[], i: number) => ( + + ))} + + + ); +}; + +Circle.displayName = 'Circle'; + +export default memo(Circle); diff --git a/src/src/components/Charts/ScatterPlot/ScatterPlot.tsx b/src/src/components/Charts/ScatterPlot/ScatterPlot.tsx new file mode 100644 index 00000000..004a71bc --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/ScatterPlot.tsx @@ -0,0 +1,122 @@ +/* eslint-disable react/prop-types */ +import React, { forwardRef, memo } from 'react'; +import { scaleLinear, axisLeft, axisBottom } from 'd3'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { getMaxValue } from './util'; +import Circles from './Circles/Circles'; +import Axis from './Axis/Axis'; +import { IScatterPlotProps } from './types'; +import widthResize from './withResize.jsx'; +import { DEFAULT_CONTAINER_HEIGHT, DEFAULT_CONTAINER_WIDTH } from './config'; + +const margin = { top: 50, right: 50, bottom: 60, left: 60 }; + +/** + * ScatterPlot Component + * @Usage + * const dataSets: DataSet[] = [ + { + label: 'Blue', + data: [ + [20, 30], + [15, 100], + [100, 30], + [80, 1000], + ], + circleRadius: 10, + circleColor: 'blue', + }, + { + label: 'Yellow', + data: [ + [10, 100], + [20, 100], + [12, 70], + [50, 5000], + ], + circleRadius: 5, + circleColor: 'yellow', + }, + ]; + + + // need to use yAxisLabel and xAxisLabel inside module + */ +const ScatterPlot = forwardRef( + (props, ref): React.FunctionComponentElement => { + const { + width = DEFAULT_CONTAINER_WIDTH, + height = DEFAULT_CONTAINER_HEIGHT, + yAxisLabel, + xAxisLabel, + dataSets, + } = props; + + const dataDependency: number[] = []; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + dataSets.forEach(({ data }) => dataDependency.push(...data)); + + const { graphWidth, graphHeight } = { + graphWidth: width - margin.left - margin.right, + graphHeight: height - margin.top - margin.bottom, + }; + + const x_scale = scaleLinear() + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + .domain([0, getMaxValue(dataDependency, 0)]) + .range([0, graphWidth]); + + const y_scale = scaleLinear() + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + .domain([0, getMaxValue(dataDependency, 1)]) + .range([graphHeight, 0]); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return ( + +
+ + + {dataSets?.map((group, i) => { + return ( + group.data && ( + + ) + ); + })} + + + + +
+
+ ); + }, +); + +ScatterPlot.displayName = 'ScatterPlot'; + +export default memo(widthResize(ScatterPlot)); diff --git a/src/src/components/Charts/ScatterPlot/config.ts b/src/src/components/Charts/ScatterPlot/config.ts new file mode 100644 index 00000000..353e6d35 --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/config.ts @@ -0,0 +1,5 @@ +export const DEFAULT_CIRCLE_COLOR = 'yellow'; +export const DEFAULT_CIRCLE_RADIUS = 5; + +export const DEFAULT_CONTAINER_WIDTH = 800; +export const DEFAULT_CONTAINER_HEIGHT = 600; diff --git a/src/src/components/Charts/ScatterPlot/styles.scss b/src/src/components/Charts/ScatterPlot/styles.scss new file mode 100644 index 00000000..bbb8aa61 --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/styles.scss @@ -0,0 +1,4 @@ +.Aim_ScatterPlotWrapper { + position: relative; + display: inline-block; +} \ No newline at end of file diff --git a/src/src/components/Charts/ScatterPlot/types.d.ts b/src/src/components/Charts/ScatterPlot/types.d.ts new file mode 100644 index 00000000..7263c252 --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/types.d.ts @@ -0,0 +1,37 @@ +type Data = Array>; + +export type DataSet = { + circleRadius?: number; + circleColor?: string; + label: string; + data: Data; +}; + +export type SizeState = { + width?: number; + height?: number; +}; + +export interface IScatterPlotProps { + yAxisLabel?: string; + xAxisLabel?: string; + dataSets: DataSet[]; + width?: number; + height?: number; +} + +export interface IAxisProps { + transform: string; + label?: string; + scale: any; +} + +export interface ICircleProps { + data: Data; + scale: { + x_scale: any; + y_scale: any; + }; + color?: string; + radius?: number; +} diff --git a/src/src/components/Charts/ScatterPlot/util.ts b/src/src/components/Charts/ScatterPlot/util.ts new file mode 100644 index 00000000..e96c989f --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/util.ts @@ -0,0 +1,16 @@ +import { max } from 'd3'; + +type NumberValue = number | { valueOf(): number }; + +/** + * getMinValue, using d3.min() + * @param {Iterable>} data - chart dataset + * @param {Number} index - the index of column + * @return - the max value of data set + */ +export const getMaxValue = ( + data: Iterable>, + index: number, +): NumberValue | undefined => { + return max(data, (d) => d[index]); +}; diff --git a/src/src/components/Charts/ScatterPlot/withResize.tsx b/src/src/components/Charts/ScatterPlot/withResize.tsx new file mode 100644 index 00000000..a27dc5fc --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/withResize.tsx @@ -0,0 +1,47 @@ +import React, { useEffect, useRef, useState } from 'react'; + +import { DEFAULT_CONTAINER_HEIGHT, DEFAULT_CONTAINER_WIDTH } from './config'; + +const INEXPLICABLE_SIZE = 6; + +/** + * Higher Order Component + * Listen to Parent's Container changes and pass down new sizes + */ +function widthResize( + Component: React.FunctionComponentElement | any, +) { + return function WidthResizeHOC(props: any) { + const ref = useRef(); + const [sizes, setSizes] = useState({ + width: props.width || DEFAULT_CONTAINER_WIDTH, + height: props.height || DEFAULT_CONTAINER_HEIGHT, + }); + + const measure = (entries: any) => { + const { width, height } = entries[0].contentRect; + setSizes({ + height: Math.round(height) - INEXPLICABLE_SIZE, + width: Math.round(width), + }); + }; + useEffect(() => { + const resizeObserver = new window.ResizeObserver(measure); + resizeObserver.observe(ref.current); + + return () => { + resizeObserver.disconnect(); + }; + }, []); + + const componentProps = { + ...sizes, + ...props, + ref, + }; + + return ; + }; +} + +export default widthResize; diff --git a/src/src/components/CodeBlock/CodeBlock.scss b/src/src/components/CodeBlock/CodeBlock.scss new file mode 100644 index 00000000..23b8fd1d --- /dev/null +++ b/src/src/components/CodeBlock/CodeBlock.scss @@ -0,0 +1,30 @@ +@use 'src/styles/abstracts' as *; +.CodeBlock { + background: #f2f3f4; + border-radius: $border-radius-main; + padding: 1em 3em 1em 1em; + position: relative; + min-height: 3.5rem; + display: flex; + align-items: center; + overflow: auto; + pre { + margin: 0; + font-style: normal; + font-weight: $font-500; + font-size: 15px; + line-height: 1.3125em; + overflow: auto; + @include monospaceFontFamily(15); + } + &__copy__button { + top: 0.75rem; + right: 1rem; + color: $pico-80; + display: inline-block; + cursor: pointer; + position: absolute; + align-items: center; + justify-content: center; + } +} diff --git a/src/src/components/CodeBlock/CodeBlock.tsx b/src/src/components/CodeBlock/CodeBlock.tsx new file mode 100644 index 00000000..1c24655e --- /dev/null +++ b/src/src/components/CodeBlock/CodeBlock.tsx @@ -0,0 +1,40 @@ +import React from 'react'; + +import CopyToClipBoard from 'components/CopyToClipBoard/CopyToClipBoard'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import useCodeHighlighter from 'hooks/useCodeHighlighter'; + +import { ICodeBlockProps } from 'types/components/CodeBlock/CodeBlock'; + +import './CodeBlock.scss'; + +function CodeBlock({ + code = '', + className = '', + language = 'python', +}: ICodeBlockProps): React.FunctionComponentElement { + const { elementRef } = useCodeHighlighter(language); + + return ( + +
+
+          {code}
+        
+ + + +
+
+ ); +} + +export default React.memo(CodeBlock); diff --git a/src/src/components/CommunityPopup/CommunityPopup.d.ts b/src/src/components/CommunityPopup/CommunityPopup.d.ts new file mode 100644 index 00000000..45541ece --- /dev/null +++ b/src/src/components/CommunityPopup/CommunityPopup.d.ts @@ -0,0 +1,5 @@ +import * as React from 'react'; + +export interface ICommunityPopupProps { + children: React.ReactNode; +} diff --git a/src/src/components/CommunityPopup/CommunityPopup.scss b/src/src/components/CommunityPopup/CommunityPopup.scss new file mode 100644 index 00000000..7a86b772 --- /dev/null +++ b/src/src/components/CommunityPopup/CommunityPopup.scss @@ -0,0 +1,60 @@ +@use 'src/styles/abstracts' as *; + +.CommunityPopup { + z-index: 1501; + pointer-events: all; + &__tooltip { + width: toRem(350px); + height: toRem(158px); + max-width: unset; + background-color: white; + padding: $space-unit $space-lg $space-unit; + border: $border-width-main $pico-80; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25), 0 6px 10px rgba(0, 0, 0, 0.14); + border-radius: $border-radius-lg; + display: flex; + flex-direction: column; + overflow: visible !important; + &.MuiTooltip-tooltipPlacementRight { + margin: 0 (-$space-sm) !important; + } + &__title { + white-space: nowrap; + line-height: toRem(17px); + font-style: normal; + font-weight: 750; + @include monospaceFontFamily(4); + } + &__footer { + display: flex; + justify-content: flex-end; + margin-top: auto; + &__skipBtn { + color: $pico-70; + background-color: transparent; + margin-right: $space-sm; + &:hover { + color: $pico-100; + background-color: transparent; + } + } + &__joinBtn { + padding-inline: $space-lg !important; + } + } + &__content { + margin-top: $space-sm; + white-space: nowrap; + line-height: toRem(18px); + font-style: normal; + @include monospaceFontFamily(7.2); + } + .MuiTooltip-arrow { + background-color: transparent; + color: white; + &::before { + border: $border-width-main $pico-80; + } + } + } +} diff --git a/src/src/components/CommunityPopup/CommunityPopup.tsx b/src/src/components/CommunityPopup/CommunityPopup.tsx new file mode 100644 index 00000000..19e3ebad --- /dev/null +++ b/src/src/components/CommunityPopup/CommunityPopup.tsx @@ -0,0 +1,109 @@ +import * as React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import { trackEvent } from 'services/analytics'; + +import { Button, Text } from '../kit'; + +import { ICommunityPopupProps } from './'; + +import './CommunityPopup.scss'; + +const COMMUNITY_POPUP_SEEN = 'communityPopupSeen'; +const COMMUNITY_URL = 'https://community.aimstack.io/'; + +function CommunityPopup(props: ICommunityPopupProps) { + const [open, setOpen] = React.useState(false); + let timeoutIdRef = React.useRef(); + + React.useEffect(() => { + const popupSeenStorage = localStorage.getItem(COMMUNITY_POPUP_SEEN); + + if (popupSeenStorage === 'true') { + setOpen(false); + } else { + window.clearTimeout(timeoutIdRef.current); + timeoutIdRef.current = window.setTimeout(() => { + setOpen(true); + }, 500); + } + }, []); + + const onSkip = React.useCallback(() => { + localStorage.setItem(COMMUNITY_POPUP_SEEN, 'true'); + setOpen(false); + }, []); + + const onJoin = React.useCallback(() => { + localStorage.setItem(COMMUNITY_POPUP_SEEN, 'true'); + window.open(COMMUNITY_URL, '_blank'); + trackEvent(ANALYTICS_EVENT_KEYS.sidebar.discord); + setOpen(false); + }, []); + + return ( + + + 📣 JOIN THE AIM COMMUNITY! + +
+ + - Get early access to upcoming Aim features + + + - Meet other Aim users + + + - Discuss all-things MLOps and ML Research + +
+
+ + +
+ + } + > +
{props.children}
+
+ ); +} + +CommunityPopup.displayName = 'CommunityPopup'; + +export default React.memo(CommunityPopup); diff --git a/src/src/components/CommunityPopup/index.tsx b/src/src/components/CommunityPopup/index.tsx new file mode 100644 index 00000000..5c5af193 --- /dev/null +++ b/src/src/components/CommunityPopup/index.tsx @@ -0,0 +1,5 @@ +import CommunityPopup from './CommunityPopup'; + +export * from './CommunityPopup.d'; + +export default CommunityPopup; diff --git a/src/src/components/ConfirmModal/ConfirmModal.scss b/src/src/components/ConfirmModal/ConfirmModal.scss new file mode 100644 index 00000000..a5e08962 --- /dev/null +++ b/src/src/components/ConfirmModal/ConfirmModal.scss @@ -0,0 +1,90 @@ +@use 'src/styles/abstracts' as *; + +@mixin getStatusTypeColors($color, $cover-color) { + .ConfirmModal__Icon { + background-color: $cover-color; + + .Icon__container { + color: $color; + } + } + + .ConfirmModal__ConfirmButton { + background-color: $color; + } +} + +.ConfirmModal { + .MuiBackdrop-root { + @include backgroundColorOpacity($black, 0.4); + } + + .MuiPaper-rounded { + border-radius: 6px; + } + + .MuiPaper-elevation10 { + box-shadow: 0px 2px 4px #767a80; + } + + &__Body { + min-width: 384px; + padding: 24px; + + .ConfirmModal__Title__Container { + display: flex; + align-items: center; + margin-bottom: 12px; + } + } + + &__Close__Icon { + position: absolute; + right: 10px; + top: 10px; + } + + &__Icon { + display: flex; + justify-content: center; + align-items: center; + width: 32px; + height: 32px; + margin-right: 16px; + border-radius: 50%; + + .Icon__container { + font-size: 14px; + } + } + + &__CancelButton { + margin-right: 10px; + color: $pico; + } + + &__Footer { + padding: 16px; + margin: 0 8px; + border-top: 1px solid $grayish; + display: flex; + justify-content: flex-end; + align-items: center; + } + + &__error { + @include getStatusTypeColors($error-color, $error-color-10); + } + + &__warning { + @include getStatusTypeColors($warning-color, $warning-color-10); + } + + &__success { + @include getStatusTypeColors($success-color, $success-color-10); + } + + &__info { + @include getStatusTypeColors($primary-color, $primary-color-10); + } +} diff --git a/src/src/components/ConfirmModal/ConfirmModal.tsx b/src/src/components/ConfirmModal/ConfirmModal.tsx new file mode 100644 index 00000000..e8c878f9 --- /dev/null +++ b/src/src/components/ConfirmModal/ConfirmModal.tsx @@ -0,0 +1,106 @@ +import React from 'react'; + +import { Dialog } from '@material-ui/core'; + +import { Button, Text, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary'; + +import { IConfirmModalProps } from 'types/components/ConfirmModal/ConfirmModal'; + +import './ConfirmModal.scss'; + +function ConfirmModal( + props: IConfirmModalProps, +): React.FunctionComponentElement { + return ( + + +
+ + +
+
{props.icon}
+ {props.title && ( + + {props.title} + + )} +
+ +
+ {props.description && ( + + {props.description} + + )} + +
+ {props.text && ( + + {props.text || ''} + + )} + {props.children && props.children} +
+
+
+ +
+ + +
+
+
+ ); +} + +ConfirmModal.defaultProps = { + confirmBtnText: 'Confirm', + cancelBtnText: 'Cancel', + statusType: 'info', +}; + +ConfirmModal.displayName = 'ConfirmModal'; + +export default React.memo(ConfirmModal); diff --git a/src/src/components/ContributionsFeed/ContributionsFeed.d.ts b/src/src/components/ContributionsFeed/ContributionsFeed.d.ts new file mode 100644 index 00000000..a29aa0e7 --- /dev/null +++ b/src/src/components/ContributionsFeed/ContributionsFeed.d.ts @@ -0,0 +1,8 @@ +export interface IContributionsFeedProps { + data: Record; + loadMore: () => void; + isLoading: boolean; + totalRunsCount?: number; + fetchedCount?: number; + archivedRunsCount?: number; +} diff --git a/src/src/components/ContributionsFeed/ContributionsFeed.scss b/src/src/components/ContributionsFeed/ContributionsFeed.scss new file mode 100644 index 00000000..26c4d79e --- /dev/null +++ b/src/src/components/ContributionsFeed/ContributionsFeed.scss @@ -0,0 +1,16 @@ +@use 'src/styles/abstracts' as *; + +.ContributionsFeed { + border-top: none; + &__title { + margin-bottom: $space-sm; + padding: 0 $space-sm; + } + &__content { + margin-top: $space-sm; + padding-bottom: $space-xxxxs; + &-title { + margin-bottom: $space-sm; + } + } +} diff --git a/src/src/components/ContributionsFeed/ContributionsFeed.tsx b/src/src/components/ContributionsFeed/ContributionsFeed.tsx new file mode 100644 index 00000000..3cbab491 --- /dev/null +++ b/src/src/components/ContributionsFeed/ContributionsFeed.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { Button, Spinner, Text } from 'components/kit'; + +import FeedItem from './FeedItem'; + +import { IContributionsFeedProps } from '.'; + +import './ContributionsFeed.scss'; + +function ContributionsFeed({ + data, + loadMore, + isLoading, + totalRunsCount = 0, + fetchedCount = 0, + archivedRunsCount = 0, +}: IContributionsFeedProps): React.FunctionComponentElement | null { + return totalRunsCount && totalRunsCount !== archivedRunsCount ? ( +
+ + Activity + + {isLoading && _.isEmpty(data) ? ( +
+ +
+ ) : ( + <> + {Object.keys(data).map((key) => ( +
+ + {key.split('_').join(' ')} + + {Object.keys(data[key]).map((item: string) => ( + + ))} +
+ ))} + + {fetchedCount < totalRunsCount - archivedRunsCount! ? ( + + ) : null} + + )} +
+ ) : null; +} + +export default React.memo(ContributionsFeed); diff --git a/src/src/components/ContributionsFeed/FeedItem/FeedItem.d.ts b/src/src/components/ContributionsFeed/FeedItem/FeedItem.d.ts new file mode 100644 index 00000000..a6e88082 --- /dev/null +++ b/src/src/components/ContributionsFeed/FeedItem/FeedItem.d.ts @@ -0,0 +1,49 @@ +export interface IFeedItemProps { + date: string; + data: Array; +} + +export type ContributionType = { + /** + * The run name of the contribution + * @type {string} + * @example 'My first run' + */ + name: string; + /** + * The date of the contribution + * @type {string} + * @example '2021-01-01 12:00:00' + */ + date: string; + /** + * The run hash of the contribution + * @type {string} + * @example '5e9f1b9b-7c1a-4b5a-8f0c-8c1c1b9b7c1a' + */ + hash: string; + /** + * The run active state of the contribution + * @type {boolean} + * @example true + */ + active: boolean; + /** + * The run creation time of the contribution + * @type {number} + * @example 1610000000 + */ + creation_time: number; + /** + * The run experiment name of the contribution + * @type {string} + * @example 'My first experiment' + */ + experiment: string; + /** + * The run experiment id of the contribution + * @type {string} + * @example '4a4298dd-d144-40d6-9a3c-d5db7a20ee82' + */ + experimentId: string; +}; diff --git a/src/src/components/ContributionsFeed/FeedItem/FeedItem.scss b/src/src/components/ContributionsFeed/FeedItem/FeedItem.scss new file mode 100644 index 00000000..9fd38330 --- /dev/null +++ b/src/src/components/ContributionsFeed/FeedItem/FeedItem.scss @@ -0,0 +1,92 @@ +@use 'src/styles/abstracts' as *; + +.FeedItem { + margin-bottom: $space-xs; + &__title { + align-items: center; + display: flex; + margin-bottom: $space-xxxs; + .Icon__container { + border-radius: $border-radius-circle; + background-color: $primary-color-10; + margin-right: $space-xxxs; + color: $text-color; + } + } + &__content { + position: relative; + padding-left: toRem(28px); + &::before { + content: ''; + position: absolute; + top: -$space-xxxxs; + left: $space-sm; + width: 1px; + height: calc(100% + 8px); + background-color: $primary-color-20; + } + &__item { + white-space: nowrap; + display: flex; + align-items: center; + margin-bottom: $space-xs; + position: relative; + &::before { + content: ''; + position: absolute; + top: $space-xs; + left: -$space-unit; + width: 12px; + height: 1px; + background-color: $primary-color-20; + } + &__leftBox { + display: flex; + align-items: center; + &__label { + margin-right: $space-xxxs; + } + &__date { + margin-right: $space-sm; + @include monospaceFontFamily(12); + } + .Table__status_indicator { + margin-right: 0; + } + } + &__itemBox { + font-size: $text-sm; + display: flex; + align-items: center; + max-width: calc(100% - 156px); + width: 100%; + .ExperimentNameBox { + margin-right: $space-xxxxs; + max-width: 50%; + &__experimentName { + max-width: 100%; + } + a { + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: inherit; + } + } + &__runName { + max-width: 50%; + margin-left: $space-xxxxs; + display: flex; + a { + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: inline-block; + } + } + } + } + } +} diff --git a/src/src/components/ContributionsFeed/FeedItem/FeedItem.tsx b/src/src/components/ContributionsFeed/FeedItem/FeedItem.tsx new file mode 100644 index 00000000..5da85cdc --- /dev/null +++ b/src/src/components/ContributionsFeed/FeedItem/FeedItem.tsx @@ -0,0 +1,78 @@ +import React from 'react'; +import { Link as RouteLink } from 'react-router-dom'; + +import { Link, Tooltip } from '@material-ui/core'; + +import { Icon, Text } from 'components/kit'; +import StatusLabel from 'components/StatusLabel'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import { PathEnum } from 'config/enums/routesEnum'; + +import { IFeedItemProps } from '.'; + +import './FeedItem.scss'; + +function FeedItem( + props: IFeedItemProps, +): React.FunctionComponentElement { + return ( +
+
+ + + {props.date.split('_').join(' ')} + +
+
+ {props.data.map((item) => ( +
+
+ + {item.date} + + + Started a run: + + +
+ +
+
+
+
+ + / + +
+ + {item.name} + +
+
+
+
+ ))} +
+
+ ); +} + +export default React.memo(FeedItem); diff --git a/src/src/components/ContributionsFeed/FeedItem/index.ts b/src/src/components/ContributionsFeed/FeedItem/index.ts new file mode 100644 index 00000000..893e8270 --- /dev/null +++ b/src/src/components/ContributionsFeed/FeedItem/index.ts @@ -0,0 +1,4 @@ +import FeedItem from './FeedItem'; + +export * from './FeedItem.d'; +export default FeedItem; diff --git a/src/src/components/ContributionsFeed/index.ts b/src/src/components/ContributionsFeed/index.ts new file mode 100644 index 00000000..f45894f4 --- /dev/null +++ b/src/src/components/ContributionsFeed/index.ts @@ -0,0 +1,5 @@ +import ContributionsFeed from './ContributionsFeed'; + +export * from './ContributionsFeed.d'; + +export default ContributionsFeed; diff --git a/src/src/components/ControlPopover/ControlPopover.scss b/src/src/components/ControlPopover/ControlPopover.scss new file mode 100644 index 00000000..0c3235fc --- /dev/null +++ b/src/src/components/ControlPopover/ControlPopover.scss @@ -0,0 +1,55 @@ +@use 'src/styles/abstracts' as *; + +.ControlPopover { + box-shadow: 0 0.25rem 0.375rem rgba(144, 175, 218, 0.2); + border: $border-main; +} + +.ControlPopover__container { + .MuiListItem-button { + color: $text-color; + font-size: 0.875rem; + padding: 0.5rem; + border-radius: $border-radius-sm; + &:hover { + background-color: $cuddle-20; + } + } + &-small { + .MuiListItem-button { + height: 28px; + } + } + &-medium { + .MuiListItem-button { + height: 32px; + } + } + &-large { + .MuiListItem-button { + height: 36px; + } + } + .MuiListItem-root.Mui-selected { + background-color: transparent; + color: $primary-color; + &:hover { + background-color: $cuddle-20; + } + &::after { + content: '✓'; + position: absolute; + right: 0.5rem; + } + } + + .subtitle { + text-transform: uppercase; + } +} + +.ControlPopover__title { + padding: 0.5rem 1rem; + border-bottom: $border-main; + background: $primary-color-5; +} diff --git a/src/src/components/ControlPopover/ControlPopover.tsx b/src/src/components/ControlPopover/ControlPopover.tsx new file mode 100644 index 00000000..75986a33 --- /dev/null +++ b/src/src/components/ControlPopover/ControlPopover.tsx @@ -0,0 +1,90 @@ +import React from 'react'; + +import { Popover } from '@material-ui/core'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import IControlPopoverProps from 'types/components/ControlPopover/ControlPopover'; + +import stopPropagation from 'utils/stopPropagation'; + +import './ControlPopover.scss'; + +function ControlPopover({ + component, + title, + titleClassName = '', + anchor, + anchorOrigin = { + vertical: 'top', + horizontal: 'left', + }, + transformOrigin = { + vertical: 'top', + horizontal: 'right', + }, + open = true, + size = 'small', +}: IControlPopoverProps): React.FunctionComponentElement { + const [anchorEl, setAnchorEl] = React.useState(null); + + const onAnchorClick = React.useCallback( + (event: React.MouseEvent) => { + event.stopPropagation(); + setAnchorEl(event.currentTarget); + }, + [], + ); + + const handleClose = React.useCallback(() => { + setAnchorEl(null); + }, []); + + React.useEffect(() => { + if (!open) { + setAnchorEl(null); + } + }, [open]); + + return ( + + {anchor({ onAnchorClick, opened: open && !!anchorEl })} + +
+ {title && ( +
+ + {title} + +
+ )} + +
+ {typeof component === 'function' + ? component({ handleClose, opened: open && !!anchorEl }) + : component} +
+
+
+
+
+ ); +} + +export default React.memo(ControlPopover); diff --git a/src/src/components/ControlPopover/index.ts b/src/src/components/ControlPopover/index.ts new file mode 100644 index 00000000..4f0dda0a --- /dev/null +++ b/src/src/components/ControlPopover/index.ts @@ -0,0 +1,3 @@ +import ControlPopover from './ControlPopover'; + +export default ControlPopover; diff --git a/src/src/components/CopyToClipBoard/CopyToClipBoard.tsx b/src/src/components/CopyToClipBoard/CopyToClipBoard.tsx new file mode 100644 index 00000000..82b0b233 --- /dev/null +++ b/src/src/components/CopyToClipBoard/CopyToClipBoard.tsx @@ -0,0 +1,47 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { useCopy } from 'hooks/useCopy'; + +import { ICopyToClipBoardProps } from 'types/components/CopyToClipBoard/CopyToClipBoard'; + +function CopyToClipboard({ + contentRef, + showSuccessDelay = 1500, + className = '', + copyContent = null, + iconSize = 'medium', + isURL = false, +}: ICopyToClipBoardProps): React.FunctionComponentElement { + const { onCopy, copied, setCopied } = useCopy(copyContent ?? contentRef); + + React.useEffect(() => { + if (copied) { + setTimeout(() => { + setCopied(false); + }, showSuccessDelay); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [copied]); + + const iconName = isURL ? 'link' : 'copy'; + return ( + + + + + + + + ); +} + +CopyToClipboard.displayName = 'CopyToClipBoard'; + +export default React.memo(CopyToClipboard); diff --git a/src/src/components/CustomTable/Table.scss b/src/src/components/CustomTable/Table.scss new file mode 100644 index 00000000..120c6c8d --- /dev/null +++ b/src/src/components/CustomTable/Table.scss @@ -0,0 +1,625 @@ +@use 'src/styles/abstracts' as *; + +$border-color: $cuddle-50; +$box-shadow: 0 3px 9px rgba(0, 0, 0, 0.1); +$border-radius: 0.2rem; + +:root { + --cell-height: 28px; + --group-margin: 4px; + --cell-font-size: 0.875rem; +} + +.Table { + position: relative; + display: flex; + width: max-content; + min-width: 100%; + min-height: 100%; + box-sizing: border-box; + font-weight: $font-500; + &__container { + height: 100%; + width: 100%; + box-sizing: border-box; + background: #fff; + &--small { + --cell-height: 22px; + --group-margin: 2px; + --cell-font-size: 0.875rem; + @include monospaceFontFamily(14); + } + &--medium { + --cell-height: 28px; + --group-margin: 4px; + --cell-font-size: 1rem; + @include monospaceFontFamily(); + } + + &--large { + --cell-height: 32px; + --group-margin: 6px; + --cell-font-size: 0.875rem; + } + } + &__groupsColumn__cell { + span, + div { + display: inline-block; + width: 120px; + min-width: 120px; + justify-content: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-right: 0.5rem; + padding-right: 0.5rem; + border-right: 0.0625rem solid #ccc; + &:last-child { + margin-right: 0; + padding-right: 0; + border-right: unset; + } + } + } +} +.Table__pane { + display: flex; + width: stretch; + width: -webkit-fill-available; + width: -moz-available; + min-height: 100%; + box-sizing: border-box; + z-index: 0; +} +.Table__status_indicator { + width: 8px; + height: 8px; + padding: 0; + background-color: unset !important; + margin-right: 3px; + &::before { + width: 4px; + height: 4px; + top: 2px; + left: 0; + } +} + +.Table__action__icon { + color: $primary-color; +} + +.Table__pane--left, +.Table__pane--right, +.Table__pane--selection { + position: -webkit-sticky; + position: sticky; + width: auto; + z-index: 1; +} + +.Table__pane--left { + left: 0; + box-shadow: 1px 0 3px 0 $cuddle; + &.withSelectionColumn { + left: var(--left-position); + } +} + +.Table__pane--selection { + left: 0; + background: #fff; + z-index: 2; + &.withShadow { + box-shadow: 1px 0 3px 0 $cuddle; + } +} + +.Table__pane--right { + right: 0; + box-shadow: -1px 0 3px 0 $cuddle; +} + +.Table__pane--middle { + position: relative; + + .Table__column { + position: absolute; + } +} + +.Table__column { + display: flex; + flex-direction: column; + background-color: #fff; + z-index: 0; + width: stretch; + width: -webkit-fill-available; + width: -moz-available; + max-width: 500px; + .Table__column__defaultSelectIcon { + border: 1.5px solid $pico-80; + border-radius: $border-radius-xs; + width: 14px; + height: 14px; + } + .Table__column__selectedSelectIcon { + border-radius: $border-radius-xs; + width: 14px; + height: 14px; + background: $primary-color; + color: $white; + display: flex; + justify-content: center; + align-items: center; + } + .Table__column__partiallySelectedSelectIcon { + border-radius: $border-radius-xs; + width: 14px; + height: 14px; + display: flex; + justify-content: center; + align-items: center; + } + .configCheckbox { + margin: 0 $space-xxs 0 toRem(1.5px); + } + &--groups { + max-width: unset !important; + } + + &:last-of-type { + flex: 1; + .Table__cell, + .Table__group__config__cell { + border-right: none; + } + } + + &.Table__column--actions { + .Table__cell { + padding: 0; + justify-content: center; + } + } + &.Table__column--selection { + padding: 0; + .Table__cell--header { + padding: 0; + } + .Table__cell { + padding: 0; + border-right: 1px solid $border-color; + } + .Table__cell--header > *:first-child { + margin-right: 0; + } + } + &__selectCheckbox { + width: 32px; + height: var(--cell-height); + border-radius: unset; + padding: 0.5rem; + } + &__headerCheckbox { + margin-left: 1rem; + } +} + +.Table__action { + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + width: 23px; + height: 23px; + margin: 5px 0 5px 5px; + border-radius: $border-radius-circle; + transition: background-color ease 110ms; + user-select: none; + + &:hover { + background-color: $grey-lighter; + } + + &:active { + background-color: $grey-light-xx; + color: $grey-darker; + } +} + +.Table__action__popup { + background-color: #fff; + border: 1px solid $primary-lighter; + border-radius: $border-radius; + box-shadow: $box-shadow; +} + +.Table__action__popup__body { + min-width: 180px; + padding: 0.5rem; + + &__panelTitle { + text-transform: uppercase; + margin: 0.5rem 0; + } +} + +.Table__action__anchor { + cursor: pointer; +} + +.Table__action__popup__item { + padding: $space-xxs $space-xs !important; + text-transform: capitalize; + cursor: pointer; + display: flex; + align-items: center; + color: $primary-color; + transition: background-color 110ms ease; + user-select: none; + + &:last-of-type { + border-bottom: none; + } + + &:hover { + background-color: $grey-bg; + } + + &:active { + background-color: $primary-lighter; + color: $primary-darker; + } + &_icon { + width: 0.875rem; + display: flex; + margin-right: 1rem; + } +} + +.Table__cell { + display: flex; + align-items: center; + font-size: var(--cell-font-size); + padding: 0 $space-unit; + border-bottom: 1px solid $border-color; + border-right: 1px solid $border-color; + text-align: left; + box-sizing: border-box; + background-color: #fff; + white-space: nowrap; + text-overflow: ellipsis; + height: var(--cell-height); + color: $pico-100; + position: relative; + &.isNumeric { + justify-content: flex-end; + } + &.placeholder { + border-right: unset; + } + + &.colorIndicator { + &::before { + content: ''; + position: absolute; + height: calc(var(--cell-height) - 4px); + width: 0.375rem; + border-radius: 0.375rem; + background: var(--color-indicator); + top: 2px; + left: 8px; + } + } + + &.Table__group__header__cell { + position: relative; + background-color: $cuddle-10; + border-color: $border-color; + z-index: 1; + transition: background-color 0.2s ease-out; + + &.expanded { + position: -webkit-sticky; + position: sticky; + background-color: $cuddle-20; + top: calc(2 * var(--cell-height)); + } + + &.expandable:hover { + background-color: $cuddle-30; + } + } + + &.Table__group__config__column__cell { + padding-left: 2.1875rem; + + .Table__cell__rowMeta { + display: flex; + align-items: flex-start; + height: 100%; + max-width: 25vw; + overflow: auto; + box-sizing: border-box; + margin: 0; + + .Table__group__config__meta { + max-height: 100%; + } + } + } + &.inactive { + background-color: $cuddle-10; + color: $pico-50; + .Table__cell__value { + color: $pico-50; + } + } + + &.selected { + background-color: $primary-color-10; + } + + &.hovered { + background-color: $cuddle-20; + } + + &.focused { + background-color: $cuddle-50; + } + + & > * { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + &.actions { + div { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + } + } +} + +.Table__cell--header { + position: -webkit-sticky; + position: sticky; + top: var(--cell-height); + flex: none; + background-color: $cuddle-20; + padding: $space-xxs $space-unit; + border-color: $border-color; + z-index: 3; + overflow: visible; + font-family: 'Inter', sans-serif; + + & > *:first-child { + flex: 1; + margin-right: 0.25rem; + &.Table__column__selectCheckbox { + flex: unset; + margin-left: calc(20px + var(--group-margin)); + margin-right: toRem(14px); + } + } +} + +.Table__column__resizeHandler { + position: absolute; + right: -3px; + top: 0; + width: 6px; + height: 100%; + background-color: $primary-color; + z-index: 10; + cursor: col-resize; + opacity: 0; + transition: opacity 110ms ease; + + &.leftResize { + right: unset; + left: -1px; + } + + &.isResizing, + &:hover { + opacity: 1; + } +} + +.Table__cell--topHeader { + top: 0; + letter-spacing: 0; + background-color: $cuddle-20; + border-top: 0.0625rem solid $border-color; +} + +.Table__header__action__container { + display: flex; +} + +.Table__GroupedColumnHeader { + color: $pico-50; + span { + font-weight: $font-700; + } +} + +.Table__header__action { + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: 25px; + height: 21px; + margin-left: $space-xxs; + background-color: $primary-bg; + border: 1px solid $primary-lighter; + border-radius: $border-radius; + color: $primary-color; + cursor: pointer; + opacity: 1; + user-select: none; + transition: border-color 110ms ease; + + &:hover, + &.active { + background-color: $primary-color-5; + } + + &.disabled { + opacity: 0.65; + cursor: default; + pointer-events: none; + background-color: $grey-bg; + border-color: $grey-light-xx; + color: $grey; + } +} + +.Table__group { + margin-top: var(--group-margin); + border-top: 1px solid $border-color; + position: relative; + &.colorIndicator { + &::before { + content: ''; + position: absolute; + height: calc(100% + 1px); + width: toRem(6px); + border-radius: toRem(6px) 0 0 toRem(6px); + background: var(--color-indicator); + top: -1px; + left: -1px; + z-index: 2; + } + .expanded { + background: var(--extended-group-background-color); + &:hover { + background: var(--extended-group-background-color); + } + } + } + .Table__cell:last-of-type { + border-bottom: 1px solid $border-color; + } +} + +.Table--grouped { + .Table__pane { + padding-bottom: var(--group-margin); + &:first-of-type { + .Table__column { + &:first-of-type { + .Table__group { + border-left: 1px solid $border-color; + margin-left: var(--group-margin); + border-top-left-radius: $border-radius; + border-bottom-left-radius: $border-radius; + + .Table__group__config__cell { + border-top-left-radius: $border-radius; + padding: 0 0.6rem; + } + + .Table__cell:last-of-type { + border-bottom-left-radius: $border-radius; + } + } + } + } + } + &:last-of-type { + .Table__column { + &:last-of-type { + .Table__group { + margin-right: var(--group-margin); + border-right: 1px solid $border-color; + border-top-right-radius: $border-radius; + border-bottom-right-radius: $border-radius; + + .Table__cell:last-of-type { + border-bottom-right-radius: $border-radius; + } + } + } + } + } + } +} + +.Table__cell__rowMeta { + display: flex; + align-items: center; + margin-right: $space-sm; + flex: none; +} + +.Table__cell__value { + display: flex; + flex: 1; + color: $pico; + .Badge { + margin-right: $space-xxxs; + } + &.hasColorIndicator { + padding-left: 0.5rem; + .Table__column__selectCheckbox { + margin-left: 0.5rem; + } + } + &.isNumeric { + justify-content: flex-end; + } +} + +.Popover__body { + position: fixed; + background-color: #fff; + outline: 0; + overflow-y: auto; + z-index: 999; +} + +.Table__group__config { + display: flex; + flex: 1; + align-items: center; + cursor: pointer; + &__chart { + display: flex; + width: 1.25rem; + height: 1.25rem; + align-items: center; + justify-content: center; + margin-left: 0.5em; + border: $border-grey; + border-radius: $border-radius; + font-size: 0.6rem; + } + &__stroke { + display: block; + background-color: #fff; + width: 2.5rem; + height: 1rem; + margin-left: 0.5rem; + border: 1px solid; + border-radius: $border-radius; + padding: 0 0.3rem; + + & > line { + stroke: #333; + stroke-width: 2; + } + } + &__itemsCount { + flex: 1; + text-align: right; + margin-left: 0.5rem; + } +} diff --git a/src/src/components/CustomTable/Table.tsx b/src/src/components/CustomTable/Table.tsx new file mode 100644 index 00000000..b656b74d --- /dev/null +++ b/src/src/components/CustomTable/Table.tsx @@ -0,0 +1,603 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React, { useRef, useState, useEffect } from 'react'; +import classNames from 'classnames'; +import { isEmpty } from 'lodash-es'; + +import { Checkbox } from '@material-ui/core'; + +import { Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { + ROW_CELL_SIZE_CONFIG, + COLORED_SELECTION_COLUMN_WIDTH, + SELECTION_COLUMN_WIDTH, + RowHeightSize, +} from 'config/table/tableConfigs'; + +import getClosestValue from 'utils/getClosestValue'; + +import Column from './TableColumn'; + +import './Table.scss'; + +function Table(props) { + const columns = props.columns; + let leftCols = columns + .filter((col) => col.pin === 'left') + .map((col) => col.key); + + let midCols = columns + .filter((col) => col.pin !== 'left' && col.pin !== 'right') + .map((col) => col.key); + + let rightCols = columns + .filter((col) => col.pin === 'right') + .map((col) => col.key); + let [expanded, setExpanded] = useState({}); + let [colWidths, setColWidths] = useState({}); + let [colLefts, setColLefts] = useState({}); + let [middlePaneWindow, setMiddlePaneWindow] = useState([]); + + let prevExpanded = useRef(props.expanded ?? {}); + + const leftPane = columns + .filter((col) => leftCols.includes(col.key)) + .sort((a, b) => leftCols.indexOf(a.key) - leftCols.indexOf(b.key)); + const middlePane = columns + .filter((col) => midCols.includes(col.key)) + .sort((a, b) => midCols.indexOf(a.key) - midCols.indexOf(b.key)); + const rightPane = columns + .filter((col) => rightCols.includes(col.key)) + .sort((a, b) => rightCols.indexOf(a.key) - rightCols.indexOf(b.key)); + const sortedColumns = [...leftPane, ...middlePane, ...rightPane]; + + const groups = !Array.isArray(props.data); + + useEffect(() => { + if (props.expanded && groups) { + for (let groupKey in props.expanded) { + if ( + props.expanded[groupKey] && + prevExpanded.current[groupKey] !== props.expanded[groupKey] + ) { + setExpanded((exp) => ({ + ...exp, + [groupKey]: true, + })); + } + } + } + prevExpanded.current = props.expanded ?? {}; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [props.expanded]); + + useEffect(() => { + let rAFRef = window.requestAnimationFrame(() => { + let left = 0; + let lefts = {}; + Object.keys(colWidths) + .sort((a, b) => +a - +b) + .forEach((i) => { + lefts[i] = left; + left += Math.ceil(colWidths[i]); + }); + setColLefts(lefts); + }); + + return () => { + window.cancelAnimationFrame(rAFRef); + }; + }, [colWidths]); + + useEffect( + () => { + let rAFRef = window.requestAnimationFrame(() => { + const lefts = Object.values(colLefts); + + let leftClosest = getClosestValue(lefts, props.listWindow.left).index; + let rightClosest = lefts.length - 1; + + for (let i = leftClosest; i < lefts.length; i++) { + if (lefts[i] > props.listWindow.left + props.listWindow.width) { + rightClosest = i; + break; + } + } + + let left = leftClosest < 6 ? 0 : leftClosest - 5; + let right = rightClosest + 5; + + setMiddlePaneWindow((mPW) => + middlePane + .slice(left, right + (mPW.length === 0 ? 50 : 0)) // calculate first 50 columns widths and lefts on initial render + ?.map((col, i) => ({ + ...col, + colIndex: left + i, + })), + ); + }); + + return () => { + window.cancelAnimationFrame(rAFRef); + }; + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [props.listWindow.left, props.listWindow.width, colLefts, columns], + ); + + const color = React.useMemo( + () => props.data[0]?.rowMeta?.color, + // eslint-disable-next-line react-hooks/exhaustive-deps + [props.data[0]?.rowMeta?.color], + ); + + function expand(groupKey) { + if (groupKey === 'expand_all') { + let groupsForExpansion = {}; + for (let key in props.data) { + groupsForExpansion[key] = true; + prevExpanded.current[key] = true; + } + setExpanded({ + ...expanded, + ...groupsForExpansion, + }); + if (typeof props.onGroupExpandToggle === 'function') { + props.onGroupExpandToggle(Object.keys(props.data)); + } + } else if (groupKey === 'collapse_all') { + for (let key in props.data) { + prevExpanded.current[key] = false; + } + setExpanded({}); + if (typeof props.onGroupExpandToggle === 'function') { + props.onGroupExpandToggle([]); + } + } else { + prevExpanded.current[groupKey] = !expanded[groupKey]; + setExpanded({ + ...expanded, + [groupKey]: !expanded[groupKey], + }); + if (typeof props.onGroupExpandToggle === 'function') { + props.onGroupExpandToggle(groupKey); + } + } + } + + function togglePin(colKey, side) { + const columnsOrderClone = { + left: leftCols, + middle: midCols, + right: rightCols, + }; + if (side === 'left') { + if (columnsOrderClone.left.includes(colKey)) { + columnsOrderClone.left.splice( + columnsOrderClone.left.indexOf(colKey), + 1, + ); + columnsOrderClone.middle.unshift(colKey); + } else { + if (columnsOrderClone.right.includes(colKey)) { + columnsOrderClone.right.splice( + columnsOrderClone.right.indexOf(colKey), + 1, + ); + } else { + columnsOrderClone.middle.splice( + columnsOrderClone.middle.indexOf(colKey), + 1, + ); + } + columnsOrderClone.left.push(colKey); + } + } else if (side === 'right') { + if (columnsOrderClone.right.includes(colKey)) { + columnsOrderClone.right.splice( + columnsOrderClone.right.indexOf(colKey), + 1, + ); + columnsOrderClone.middle.unshift(colKey); + } else { + if (columnsOrderClone.left.includes(colKey)) { + columnsOrderClone.left.splice( + columnsOrderClone.left.indexOf(colKey), + 1, + ); + } else { + columnsOrderClone.middle.splice( + columnsOrderClone.middle.indexOf(colKey), + 1, + ); + } + columnsOrderClone.right.push(colKey); + } + } else { + if (columnsOrderClone.left.includes(colKey)) { + columnsOrderClone.left.splice( + columnsOrderClone.left.indexOf(colKey), + 1, + ); + } + if (columnsOrderClone.right.includes(colKey)) { + columnsOrderClone.right.splice( + columnsOrderClone.right.indexOf(colKey), + 1, + ); + } + columnsOrderClone.middle.unshift(colKey); + } + props.updateColumns(columnsOrderClone); + } + + function moveColumn(colKey, pane, from, direction) { + const columnsOrderClone = { + left: leftCols, + middle: midCols, + right: rightCols, + }; + let to; + switch (direction) { + case 'left': + to = from - 1; + break; + case 'right': + to = from + 1; + break; + case 'start': + to = 0; + break; + case 'end': + to = columnsOrderClone[pane].length - 1; + break; + } + columnsOrderClone[pane].splice(from, 1); + columnsOrderClone[pane].splice(to, 0, colKey); + props.updateColumns(columnsOrderClone); + } + + function showTopHeaderContent(index, colTopHeader, add) { + return ( + props.topHeader && + sortedColumns[add ? index + 1 : index - 1]?.topHeader !== colTopHeader + ); + } + + let midPaneWidth = + colLefts[Object.keys(colLefts).length - 1] + + colWidths[Object.keys(colWidths).length - 1]; + + if (midPaneWidth < props.listWindow.availableSpace) { + midPaneWidth = null; + } + + useEffect( + () => { + if (middlePane.length < Object.keys(colLefts).length) { + let widths = {}; + middlePaneWindow.forEach((col) => { + widths[col.colIndex] = colWidths[col.colIndex]; + }); + setColWidths(widths); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [middlePaneWindow, colLefts], + ); + + return ( + +
+
+ {!groups && props.multiSelect && Array.isArray(props.data) && ( + +
+ + } + checkedIcon={ + props.data.length === + Object.keys(props.selectedRows).length ? ( + + + + ) : ( + + + + ) + } + onClick={() => + props.onRowSelect({ + actionType: isEmpty(props.selectedRows) + ? 'selectAll' + : 'removeAll', + data: props.data, + }) + } + checked={!isEmpty(props.selectedRows)} + /> + ), + }} + data={props.data} + expanded={expanded} + expand={expand} + onRowSelect={props.onRowSelect} + onRowClick={props.onRowClick} + selectedRows={props.selectedRows} + firstColumn={true} + rowHeightMode={props.rowHeightMode} + width={ + color + ? COLORED_SELECTION_COLUMN_WIDTH + : SELECTION_COLUMN_WIDTH + } + isAlwaysVisible={true} + onRowHover={props.onRowHover} + listWindow={props.listWindow} + /> +
+
+ )} + {(groups || leftPane.length > 0) && ( +
+ {leftPane.map((col, index) => ( + + + props.setExcludedFields?.([ + ...(props.excludedFields || []), + col.key, + ]) + } + multiSelect={props.multiSelect} + paneFirstColumn={index === 0} + paneLastColumn={index === leftPane.length - 1} + rowHeightMode={props.rowHeightMode} + moveColumn={(dir) => + moveColumn(col.key, 'left', index, dir) + } + sortable={ + col.sortableKey && + props.sortFields.findIndex( + (f) => f[0] === col.sortableKey, + ) === -1 + } + onRowHover={props.onRowHover} + onRowClick={props.onRowClick} + columnOptions={col.columnOptions} + selectedRows={props.selectedRows} + onRowSelect={props.onRowSelect} + listWindow={props.listWindow} + /> + + ))} +
+ )} +
+ {middlePaneWindow?.map((col) => { + let index = col.colIndex; + return ( + + + props.setExcludedFields?.([ + ...(props.excludedFields || []), + col.key, + ]) + } + paneFirstColumn={index === 0} + paneLastColumn={index === middlePane.length - 1} + moveColumn={(dir) => + moveColumn(col.key, 'middle', index, dir) + } + sortable={ + col.sortableKey && + props.sortFields.findIndex( + (f) => f[0] === col.sortableKey, + ) === -1 + } + rowHeightMode={props.rowHeightMode} + onRowHover={props.onRowHover} + onRowClick={props.onRowClick} + columnOptions={col.columnOptions} + selectedRows={props.selectedRows} + setColWidth={(width) => + setColWidths((cW) => { + return cW?.[index] === width + ? cW + : { ...cW, [index]: width }; + }) + } + colLeft={colLefts[index] ?? null} + listWindow={props.listWindow} + /> + + ); + })} +
+ {rightPane.length > 0 && ( +
+ {rightPane.map((col, index) => ( + + + props.setExcludedFields?.([ + ...(props.excludedFields || []), + col.key, + ]) + } + paneFirstColumn={index === 0} + paneLastColumn={index === rightPane.length - 1} + moveColumn={(dir) => + moveColumn(col.key, 'right', index, dir) + } + sortable={ + col.sortableKey && + props.sortFields.findIndex( + (f) => f[0] === col.sortableKey, + ) === -1 + } + onRowHover={props.onRowHover} + onRowClick={props.onRowClick} + columnOptions={col.columnOptions} + selectedRows={props.selectedRows} + listWindow={props.listWindow} + /> + + ))} +
+ )} +
+
+
+ ); +} + +export default Table; diff --git a/src/src/components/CustomTable/TableCell.tsx b/src/src/components/CustomTable/TableCell.tsx new file mode 100644 index 00000000..0d914cde --- /dev/null +++ b/src/src/components/CustomTable/TableCell.tsx @@ -0,0 +1,97 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import * as React from 'react'; +import classNames from 'classnames'; +import _ from 'lodash-es'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +function Cell({ + index, + item, + className, + isConfigColumn, + metadata, + placeholder, + col, + onRowHover, + onRowClick, + multiSelect = false, + groupColumnColored, + getColumnCelBGColor, + columnsColorScales, + isNumeric, + box, + setColumnWidth, +}) { + let cellRef = React.useRef(); + + React.useEffect(() => { + setColumnWidth(cellRef.current?.offsetWidth ?? 0); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + +
+ {isConfigColumn || placeholder ? ( + <>{multiSelect && item} + ) : ( +
+ {typeof item === 'object' && item?.hasOwnProperty('component') + ? ?? '' + : typeof item === 'object' && item?.hasOwnProperty('content') + ? item?.content ?? '' + : item ?? ''} +
+ )} +
+
+ ); +} + +export default Cell; diff --git a/src/src/components/CustomTable/TableColumn.tsx b/src/src/components/CustomTable/TableColumn.tsx new file mode 100644 index 00000000..e554ee8d --- /dev/null +++ b/src/src/components/CustomTable/TableColumn.tsx @@ -0,0 +1,1057 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import * as React from 'react'; +import classNames from 'classnames'; +import _ from 'lodash-es'; +import { useResizeObserver } from 'hooks'; + +import { MenuItem, Tooltip, Divider, Checkbox } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { Button, Icon, Text } from 'components/kit'; +import GroupConfigPopover from 'components/GroupConfigPopover/GroupConfigPopover'; + +import { BGColorLighten } from 'config/colors/colors'; +import { + TABLE_COLUMN_START_COLOR_SCALE, + TABLE_COLUMN_END_COLOR_SCALE, + RowHeightSize, + ROW_CELL_SIZE_CONFIG, +} from 'config/table/tableConfigs'; + +import getColorFromRange from 'utils/d3/getColorFromRange'; +import changeDasharraySize from 'utils/changeDasharraySize'; + +import ControlPopover from '../ControlPopover/ControlPopover'; + +import Cell from './TableCell'; + +function Column({ + topHeader, + showTopHeaderContent, + showTopHeaderBorder, + col, + data, + expanded, + expand, + togglePin, + pinnedTo, + firstColumn, + width, + updateColumnWidth, + headerMeta, + isAlwaysVisible, + hideColumn, + paneFirstColumn, + paneLastColumn, + moveColumn, + onRowHover, + onRowClick, + columnOptions, + multiSelect, + selectedRows, + onRowSelect, + onToggleColumnsColorScales, + columnsColorScales, + rowHeightMode, + setColWidth, + colLeft, + listWindow, + noColumnActions, +}) { + const [maxWidth, setMaxWidth] = React.useState(width); + const [isResizing, setIsResizing] = React.useState(false); + const widthClone = React.useRef(width); + const columnRef = React.useRef(); + const startingPoint = React.useRef(null); + const groups = !Array.isArray(data); + + const dataLength = React.useMemo(() => { + if (Array.isArray(data)) { + return data.length; + } else { + return Object.values(data).reduce((acc: number, value: any) => { + acc += value.items.length; + return acc; + }, 0); + } + }, [data]); + + const colorScaleRange = React.useMemo(() => { + const columnData = _.isArray(data) + ? data + : _.values(data).reduce((acc, item) => { + return [...acc, ...item.items]; + }, []); + + let range = _.sortBy([ + ...new Set( + columnData + ?.filter((a) => !_.isArray(a[col.key]) && !_.isNaN(+a[col.key])) + .map((a) => +a[col.key]) ?? [], + ), + ]); + + if (_.isEmpty(range)) { + return null; + } else if (range.length === 1) { + return [range[0] - 0.1, range[0]]; + } + return range; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data]); + + // eslint-disable-next-line react-hooks/exhaustive-deps + const getColumnCelBGColor = React.useCallback( + getColorFromRange( + colorScaleRange ? [colorScaleRange[0], _.last(colorScaleRange)] : null, + TABLE_COLUMN_START_COLOR_SCALE, + TABLE_COLUMN_END_COLOR_SCALE, + ), + [data], + ); + + function resizeStart({ target }) { + setIsResizing(true); + if (pinnedTo === 'right') { + startingPoint.current = target.parentNode.getBoundingClientRect().right; + } else { + startingPoint.current = target.parentNode.getBoundingClientRect().left; + } + document.addEventListener('mousemove', resize); + document.addEventListener('mouseup', resizeEnd); + } + + function resize(evt) { + let newWidth; + if (pinnedTo === 'right') { + newWidth = startingPoint.current - evt.pageX; + } else { + newWidth = evt.pageX - startingPoint.current; + } + if (newWidth > 85) { + widthClone.current = newWidth; + setMaxWidth(newWidth); + } + document.body.style.webkitUserSelect = 'none'; + document.body.style.userSelect = 'none'; + document.body.style.cursor = 'col-resize'; + } + + function resizeEnd() { + setIsResizing(false); + document.removeEventListener('mousemove', resize); + document.removeEventListener('mouseup', resizeEnd); + document.body.style.userSelect = 'unset'; + document.body.style.cursor = 'unset'; + setTimeout(() => { + updateColumnWidth(col.key, widthClone.current); + }, 50); + } + + function resetWidth() { + updateColumnWidth(col.key, widthClone.current, true); + setMaxWidth(undefined); + if (columnRef.current) { + columnRef.current.style.width = 'initial'; + } + } + + React.useEffect(() => { + if (setColWidth) { + setColWidth(columnRef.current?.offsetWidth); + } + return () => { + document.removeEventListener('mousemove', resize); + document.removeEventListener('mouseup', resizeEnd); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useEffect(() => { + if (columnRef.current && col.key !== 'selection') { + columnRef.current.style.width = widthClone.current ?? 'initial'; + setMaxWidth(width); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data, expanded, width]); + + const rafIDRef = React.useRef(); + + const resizeObserverCallback = React.useCallback( + (entries: ResizeObserverEntry[]) => { + if (entries?.length) { + rafIDRef.current = window.requestAnimationFrame(() => { + if (setColWidth) { + setColWidth(columnRef.current?.offsetWidth); + } + }); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [data, expanded, width], + ); + + const observerReturnCallback = React.useCallback(() => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }, []); + + useResizeObserver(resizeObserverCallback, columnRef, observerReturnCallback); + + function getColumnHeight() { + if (groups) { + const groupKeys = Object.keys(data); + let expandedGroupKeys = groupKeys.filter((key) => expanded[key]); + let expandedGroupsDataCount = expandedGroupKeys.reduce( + (acc, currKey) => acc + data[currKey].items.length, + 0, + ); + return ( + ((topHeader ? 1 : 0) + 1 + groupKeys.length + expandedGroupsDataCount) * + rowHeightMode + + groupKeys.length * + (ROW_CELL_SIZE_CONFIG[rowHeightMode]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin) + + groupKeys.length + ); + } + + return ((topHeader ? 1 : 0) + 1 + dataLength) * rowHeightMode; + } + + let firstVisibleCellTop = null; + let firstVisibleGroupTop = null; + + function fixColumnWidth(width) { + if (maxWidth === undefined || width > maxWidth) { + setMaxWidth(width); + } + } + + return ( + +
+ {topHeader && ( +
+ {showTopHeaderContent && col.topHeader && ( + + {col.topHeader} + + )} +
+ )} +
+ {multiSelect && col.key === '#' && ( + } + className='Table__column__selectCheckbox' + checkedIcon={ + dataLength === Object.keys(selectedRows)?.length ? ( + + + + ) : ( + + + + ) + } + onClick={() => + onRowSelect({ + actionType: _.isEmpty(selectedRows) + ? 'selectAll' + : 'removeAll', + data: data, + }) + } + checked={!_.isEmpty(selectedRows)} + /> + )} + + {firstColumn ? headerMeta : null} + {col.content} + + {!noColumnActions && + col.key !== 'actions' && + col.key !== '#' && + col.key !== 'selection' && ( + <> + ( + +
+ +
+
+ )} + component={ +
+ {!_.isEmpty(colorScaleRange) && + onToggleColumnsColorScales && ( + onToggleColumnsColorScales(col.key)} + > + {columnsColorScales[col.key] ? ( + <> + + + + Reset color scale + + ) : ( + <> + + + + Apply color scale + + )} + + )} + {columnOptions && ( + <> + {columnOptions?.map((option) => ( + + + + + {option.value} + + ))} + + + )} + {!isAlwaysVisible && ( + + + + + Hide column + + )} + {(pinnedTo === 'left' || pinnedTo === 'right') && ( + togglePin(col.key, null)} + > + + + + Unpin + + )} + {pinnedTo !== 'left' && ( + togglePin(col.key, 'left')} + > + + + + Pin to left + + )} + {pinnedTo !== 'right' && ( + togglePin(col.key, 'right')} + > + + + + Pin to right + + )} + {!paneFirstColumn && ( + moveColumn('left')} + > + + + + Move left + + )} + {!paneLastColumn && ( + moveColumn('right')} + > + + + + Move right + + )} + {pinnedTo === null && !paneFirstColumn && ( + moveColumn('start')} + > + + + + Move to start + + )} + {pinnedTo === null && !paneLastColumn && ( + moveColumn('end')} + > + + + + Move to end + + )} + {width !== undefined && ( + + + + + Reset width + + )} +
+ } + /> +
+ + )} +
+ {groups + ? Object.keys(data).map((groupKey) => { + let top = + ROW_CELL_SIZE_CONFIG[rowHeightMode]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin; + let height = rowHeightMode; + for (let key in data) { + if (key === groupKey) { + if (expanded[key]) { + height += data[key].items.length * rowHeightMode; + } + break; + } + top += + (ROW_CELL_SIZE_CONFIG[rowHeightMode]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin) + + rowHeightMode + + 1; + if (expanded[key]) { + top += data[key].items.length * rowHeightMode; + } + } + const isVisible = + (top >= listWindow.top - rowHeightMode * 20 && + top <= + listWindow.top + listWindow.height + rowHeightMode * 20) || + (top < listWindow.top - rowHeightMode * 20 && + top + height >= listWindow.top); + + if (isVisible && firstVisibleGroupTop === null) { + firstVisibleGroupTop = top; + } else { + top = null; + } + const groupColor = data[groupKey].data.meta.color; + + return ( + isVisible && ( +
+ {col.key === '#' ? ( +
+ +
+ ) : col.key === 'actions' ? ( +
+ +
+ ) : ( + expand(groupKey), + }, + } + : { + content: data[groupKey].data[col.key], + props: { + onClick: (e) => expand(groupKey), + }, + } + } + className={classNames( + 'Table__group__header__cell expandable', + { + expanded: expanded[groupKey], + }, + )} + setColumnWidth={fixColumnWidth} + /> + )} + {expanded[groupKey] && ( + <> + {data[groupKey]?.items?.map((item, i) => { + let absoluteTop = + (ROW_CELL_SIZE_CONFIG[rowHeightMode]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md] + .groupMargin) + rowHeightMode; + let top = 0; + for (let key in data) { + if (key === groupKey) { + break; + } + absoluteTop += + (ROW_CELL_SIZE_CONFIG[rowHeightMode] + ?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md] + .groupMargin) + rowHeightMode; + if (expanded[key]) { + absoluteTop += + data[key].items.length * rowHeightMode; + } + } + absoluteTop += i * rowHeightMode; + top = i * rowHeightMode; + const isVisible = + absoluteTop >= + listWindow.top - rowHeightMode * 20 && + absoluteTop <= + listWindow.top + + listWindow.height + + rowHeightMode * 20; + if (isVisible && firstVisibleCellTop === null) { + firstVisibleCellTop = absoluteTop; + } + + return ( + isVisible && ( + + + + } + checkedIcon={ + + + + } + className='Table__column__selectCheckbox' + checked={ + !!selectedRows[item.selectKey] + } + onClick={(e) => { + e.stopPropagation(); + onRowSelect({ + actionType: 'single', + data: item, + }); + }} + /> + + ) : ( + item[col.key] || + data[groupKey].data[col.key] + ) + } + groupColumnColored={ + !!data[groupKey].data.meta.color + } + className={classNames(`rowKey-${item.key}`, { + inactive: item.isHidden, + selected: !!selectedRows?.[item.selectKey], + })} + isConfigColumn={col.key === '#'} + metadata={firstColumn ? item.rowMeta : null} + box={{ + top: + firstVisibleCellTop === absoluteTop + ? top + : null, + }} + onRowHover={ + onRowHover + ? () => onRowHover(item) + : undefined + } + onRowClick={ + onRowClick + ? () => onRowClick(item) + : undefined + } + setColumnWidth={fixColumnWidth} + /> + + ) + ); + })} + + )} +
+ ) + ); + }) + : data.map((item) => { + const top = item.index * rowHeightMode; + const isVisible = + top >= listWindow.top - rowHeightMode * 20 && + top <= listWindow.top + listWindow.height + rowHeightMode * 20; + if (isVisible && firstVisibleCellTop === null) { + firstVisibleCellTop = top; + } + + return ( + isVisible && ( + + {col.key === 'selection' ? ( + + + } + checkedIcon={ + + + + } + className='Table__column__selectCheckbox' + checked={!!selectedRows[item.selectKey]} + onClick={(e) => { + e.stopPropagation(); + onRowSelect({ + data: item, + actionType: 'single', + }); + }} + /> + + } + className={classNames(`rowKey-${item.key}`, { + inactive: item.isHidden, + selected: !!selectedRows?.[item.selectKey], + })} + metadata={ + firstColumn && + ((multiSelect && col.key === 'selection') || + !multiSelect) + ? item.rowMeta + : null + } + box={{ + top: firstVisibleCellTop === top ? top : null, + }} + onRowHover={ + onRowHover ? () => onRowHover(item) : undefined + } + onRowClick={ + onRowClick ? () => onRowClick(item) : undefined + } + setColumnWidth={fixColumnWidth} + /> + ) : ( + onRowHover(item) : undefined + } + onRowClick={ + onRowClick ? () => onRowClick(item) : undefined + } + setColumnWidth={fixColumnWidth} + /> + )} + + ) + ); + })} +
+ + ); +} + +function GroupConfig({ + config, + expand, + expanded, + groupKey, + multiSelect, + onRowSelect, + selectedRows, + data, +}) { + const configData = React.useMemo(() => { + return Object.keys(config.config).map((key) => { + return { name: key, value: config.config[key] }; + }); + }, [config.config]); + + const groupSelectedRows = React.useMemo(() => { + return data + .map((item) => item.selectKey) + .filter((selectKey: string) => selectedRows[selectKey]); + }, [data, selectedRows]); + + return ( + +
expand(groupKey)}> + + {multiSelect && ( + } + className='Table__column__selectCheckbox configCheckbox' + checkedIcon={ + data.length === groupSelectedRows?.length ? ( + + + + ) : ( + + + + ) + } + onClick={(e) => { + e.stopPropagation(); + onRowSelect({ + actionType: _.isEmpty(groupSelectedRows) + ? 'selectAll' + : 'removeAll', + data: data, + }); + }} + checked={!_.isEmpty(groupSelectedRows)} + /> + )} + {configData?.length > 0 && ( + ( + 1 ? 's' : '' + } in the group, grouped by ${configData.map( + (item) => ` ${item.name}`, + )}`} + > +
+ +
+
+ )} + component={} + /> + )} + {!_.isNil(config.chartIndex) && config.chartIndex !== 0 && ( + + + {config.chartIndex} + + + )} + {config.dasharray !== null && ( + + + + + + )} +
+
+ ); +} + +function GroupActions({ expand, expanded, groupKeys, groupKey }) { + return ( + + ( + +
+ +
+
+ )} + component={({ handleClose }) => ( +
+ { + handleClose(); + expand(groupKey); + }} + > + + + + + {expanded[groupKey] ? 'Collapse group' : 'Expand group'} + + + {(expanded[groupKey] || + groupKeys.some((key) => !!expanded[key])) && ( + { + handleClose(); + expand('collapse_all'); + }} + > + + + + Collapse all + + )} + {(!expanded[groupKey] || + groupKeys.some((key) => !expanded[key])) && ( + { + handleClose(); + expand('expand_all'); + }} + > + + + + Expand all + + )} +
+ )} + /> +
+ ); +} + +export default Column; diff --git a/src/src/components/CustomTable/TablePopover.tsx b/src/src/components/CustomTable/TablePopover.tsx new file mode 100644 index 00000000..17417a48 --- /dev/null +++ b/src/src/components/CustomTable/TablePopover.tsx @@ -0,0 +1,160 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React, { useState, useRef, useEffect } from 'react'; +import ReactDOM from 'react-dom'; +import classNames from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +const margin = 5; +const offset = 30; + +function Popover(props) { + let [opened, setOpened] = useState(false); + let [position, setPosition] = useState({}); + + let containerRectRef = useRef(); + let containerRef = useRef(); + let popupRef = useRef(); + let portalRef = useRef(document.createElement('div')); + let timerRef = useRef(); + + useEffect(() => { + if (opened && !document.body.contains(portalRef.current)) { + document.body.append(portalRef.current); + } else if (!opened && document.body.contains(portalRef.current)) { + document.body.removeChild(portalRef.current); + } + return () => { + if (document.body.contains(portalRef.current)) { + // eslint-disable-next-line react-hooks/exhaustive-deps + document.body.removeChild(portalRef.current); + } + }; + }, [opened]); + + useEffect(() => { + if (opened && popupRef.current) { + popupRef.current.focus(); + containerRectRef.current = containerRef.current.getBoundingClientRect(); + } + }, [opened]); + + useEffect(() => { + if (opened && containerRef.current && popupRef.current) { + calculatePosition(); + timerRef.current = setInterval(() => { + if (containerRef.current && popupRef.current) { + let containerRect = containerRef.current.getBoundingClientRect(); + if ( + Math.abs(containerRectRef.current.x - containerRect.x) > offset || + Math.abs(containerRectRef.current.y - containerRect.y) > offset + ) { + setOpened(false); + } else { + calculatePosition(); + } + } + }, 250); + } + return () => { + clearInterval(timerRef.current); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [opened]); + + function calculatePosition() { + let positions = { + top: null, + left: null, + }; + let containerRect = containerRef.current.getBoundingClientRect(); + let popupRect = popupRef.current.getBoundingClientRect(); + + if (!containerRectRef.current) { + containerRectRef.current = containerRect; + } + + if ( + containerRect.y + containerRect.height + margin + popupRect.height >= + window.innerHeight + ) { + positions.top = containerRect.top - popupRect.height - margin; + } else { + positions.top = containerRect.bottom + margin; + } + + if (props.alignBy === 'left') { + if (window.innerWidth - (containerRect.x + popupRect.width) <= 10) { + positions.left = window.innerWidth - popupRect.width - margin; + } else { + positions.left = containerRect.x; + } + } else { + if (containerRect.x - popupRect.width + containerRect.width <= 10) { + positions.left = margin; + } else { + positions.left = + containerRect.x - popupRect.width + containerRect.width; + } + } + + setPosition((p) => ({ + ...p, + ...positions, + })); + } + + return ( + +
{ + evt.stopPropagation(); + setOpened(!opened); + }} + > + {typeof props.target === 'function' + ? props.target(opened) + : props.target} +
+ {opened && + ReactDOM.createPortal( +
evt.stopPropagation()} + onBlur={(evt) => { + const currentTarget = evt.currentTarget; + if (opened) { + window.setTimeout(() => { + if (!currentTarget.contains(document.activeElement)) { + setOpened(false); + } + }, 200); + } + }} + > + {typeof props.content === 'function' + ? props.content(opened, setOpened) + : props.content} +
, + portalRef.current, + )} +
+ ); +} + +export default Popover; diff --git a/src/src/components/DepthDropdown/DepthDropdown.d.ts b/src/src/components/DepthDropdown/DepthDropdown.d.ts new file mode 100644 index 00000000..f657c699 --- /dev/null +++ b/src/src/components/DepthDropdown/DepthDropdown.d.ts @@ -0,0 +1,6 @@ +export interface IDepthDropdownProps { + index: number; + pathValue: string | string[]; + depth: number; + onDepthChange: (value: number, index: number) => void; +} diff --git a/src/src/components/DepthDropdown/DepthDropdown.scss b/src/src/components/DepthDropdown/DepthDropdown.scss new file mode 100644 index 00000000..2b5af214 --- /dev/null +++ b/src/src/components/DepthDropdown/DepthDropdown.scss @@ -0,0 +1,36 @@ +@use 'src/styles/abstracts' as *; + +.DepthDropdown { + &__button { + display: inline-flex; + align-items: center; + margin-left: $space-xxxs; + } + &__autocomplete { + &__popper{ + width: auto!important; + } + &__select { + width: 100%; + & > input { + padding: $space-xs; + font-size: $text-sm; + border-bottom: $border-main; + } + &__optionIcon { + margin-left: $space-xxxs; + color: $primary-color; + } + &__optionLabel { + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + &.selected { + color: $primary-color; + } + } + } + } +} + \ No newline at end of file diff --git a/src/src/components/DepthDropdown/DepthDropdown.tsx b/src/src/components/DepthDropdown/DepthDropdown.tsx new file mode 100644 index 00000000..e1165bed --- /dev/null +++ b/src/src/components/DepthDropdown/DepthDropdown.tsx @@ -0,0 +1,116 @@ +import React from 'react'; +import classNames from 'classnames'; + +import Autocomplete from '@material-ui/lab/Autocomplete'; +import { InputBase } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; + +import { MEDIA_SET_TITLE_HEIGHT } from 'config/mediaConfigs/mediaConfigs'; + +import { IDepthDropdownProps } from './DepthDropdown.d'; + +import './DepthDropdown.scss'; + +function DepthDropdown({ + index, + pathValue, + depth, + onDepthChange, +}: IDepthDropdownProps): React.FunctionComponentElement { + const depthOptions = React.useMemo(() => { + return (pathValue as string[]).map((v, i) => ({ + depth: i, + label: v, + })); + }, [pathValue]); + return ( + + ( + + )} + component={ + option.label} + getOptionSelected={(option) => option.depth === depth} + onChange={(e, value) => { + onDepthChange?.(value.depth, index); + }} + disableClearable={true} + ListboxProps={{ + style: { + maxHeight: 200, + maxWidth: 241, + }, + }} + classes={{ + popper: 'DepthDropdown__autocomplete__popper', + }} + renderInput={(params) => ( + + )} + renderOption={(option) => ( + <> + + {option.label} + + {depth === option.depth && ( + + )} + + )} + /> + } + /> + + ); +} + +DepthDropdown.displayName = 'DepthDropdown'; + +export default React.memo(DepthDropdown); diff --git a/src/src/components/DepthDropdown/index.tsx b/src/src/components/DepthDropdown/index.tsx new file mode 100644 index 00000000..868a6613 --- /dev/null +++ b/src/src/components/DepthDropdown/index.tsx @@ -0,0 +1,5 @@ +import DepthDropdown from './DepthDropdown'; + +export * from './DepthDropdown.d'; + +export default DepthDropdown; diff --git a/src/src/components/DepthSlider/DepthSlider.d.ts b/src/src/components/DepthSlider/DepthSlider.d.ts new file mode 100644 index 00000000..27f1aeb6 --- /dev/null +++ b/src/src/components/DepthSlider/DepthSlider.d.ts @@ -0,0 +1,12 @@ +import React from 'react'; + +export interface IDepthSliderProps { + index?: number; + items: any[]; + depth: number; + onDepthChange: (value: number, index: number) => void; + style?: React.CSSProperties; + valueLabelDisplay?: 'on' | 'auto' | 'off'; + label?: React.ReactNode; + className?: string; +} diff --git a/src/src/components/DepthSlider/DepthSlider.scss b/src/src/components/DepthSlider/DepthSlider.scss new file mode 100644 index 00000000..c4b51c79 --- /dev/null +++ b/src/src/components/DepthSlider/DepthSlider.scss @@ -0,0 +1,24 @@ +@use 'src/styles/abstracts' as *; + +.DepthSlider { + display: flex; + align-items: center; + padding-top: $space-xxs; + & > .Slider { + width: toRem(407px); + height: 100%; + & .MuiSlider-mark { + top: 50%; + transform: translate(-1px, -50%); + width: toRem(1px); + height: toRem(5px); + } + & .prevIconBtn { + margin-right: $space-xxs; + } + & .nextIconBtn { + margin-left: $space-xxs; + } + } +} + \ No newline at end of file diff --git a/src/src/components/DepthSlider/DepthSlider.tsx b/src/src/components/DepthSlider/DepthSlider.tsx new file mode 100644 index 00000000..e2a4e20f --- /dev/null +++ b/src/src/components/DepthSlider/DepthSlider.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Button, Icon, Slider } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IDepthSliderProps } from '.'; + +import './DepthSlider.scss'; + +function DepthSlider({ + index = 0, + items, + depth, + onDepthChange, + style = {}, + valueLabelDisplay = 'off', + label, + className = '', +}: IDepthSliderProps) { + const sliderMarks = React.useMemo(() => { + return (items as string[]).map((l, i) => ({ value: i })); + }, [items]); + const onChange = React.useCallback( + (value: number, i: number) => { + if (typeof onDepthChange === 'function') { + onDepthChange(value, i); + } + }, + [onDepthChange], + ); + const maxDepthValue = items.length - 1; + return items.length === 0 ? null : ( + +
+ `${items[value]}`} + value={depth} + onChange={(e, value) => onChange(value as number, index)} + step={null} + marks={sliderMarks} + min={0} + max={maxDepthValue} + prevIconNode={ + + } + nextIconNode={ + + } + /> +
+
+ ); +} + +DepthSlider.displayName = 'DepthSlider'; + +export default React.memo(DepthSlider); diff --git a/src/src/components/DepthSlider/index.tsx b/src/src/components/DepthSlider/index.tsx new file mode 100644 index 00000000..0d8d9fc7 --- /dev/null +++ b/src/src/components/DepthSlider/index.tsx @@ -0,0 +1,5 @@ +import DepthSlider from './DepthSlider'; + +export * from './DepthSlider.d'; + +export default DepthSlider; diff --git a/src/src/components/ErrorBoundary/ErrorBoundary.tsx b/src/src/components/ErrorBoundary/ErrorBoundary.tsx new file mode 100644 index 00000000..4f40d5e9 --- /dev/null +++ b/src/src/components/ErrorBoundary/ErrorBoundary.tsx @@ -0,0 +1,40 @@ +import React from 'react'; + +import { + IErrorBoundaryProps, + IErrorBoundaryState, +} from 'types/components/ErrorBoundary/ErrorBoundary'; + +class ErrorBoundary extends React.Component< + IErrorBoundaryProps, + IErrorBoundaryState +> { + private _fallback: React.FunctionComponent; + + constructor(props: IErrorBoundaryProps) { + super(props); + this.state = { + error: null, + }; + + this._fallback = () => props.fallback ??

Something went wrong.

; + } + + static getDerivedStateFromError(error: Error): IErrorBoundaryState { + return { error }; + } + + componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void { + // Log error to reporting servie + } + + render(): React.ReactNode { + if (this.state.error) { + return ; + } + + return this.props.children; + } +} + +export default ErrorBoundary; diff --git a/src/src/components/ErrorBoundary/index.ts b/src/src/components/ErrorBoundary/index.ts new file mode 100644 index 00000000..388e219f --- /dev/null +++ b/src/src/components/ErrorBoundary/index.ts @@ -0,0 +1,3 @@ +import ErrorBoundary from './ErrorBoundary'; + +export default ErrorBoundary; diff --git a/src/src/components/ExperimentNameBox/ExperimentNameBox.d.ts b/src/src/components/ExperimentNameBox/ExperimentNameBox.d.ts new file mode 100644 index 00000000..9d0b4f9b --- /dev/null +++ b/src/src/components/ExperimentNameBox/ExperimentNameBox.d.ts @@ -0,0 +1,5 @@ +export interface IExperimentNameBoxProps { + experimentName: string; + experimentId: string; + hidden?: boolean; +} diff --git a/src/src/components/ExperimentNameBox/ExperimentNameBox.scss b/src/src/components/ExperimentNameBox/ExperimentNameBox.scss new file mode 100644 index 00000000..a8d601d8 --- /dev/null +++ b/src/src/components/ExperimentNameBox/ExperimentNameBox.scss @@ -0,0 +1,11 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentNameBox { + display: flex; + align-items: center; + &.isHidden { + .MuiTypography-root { + color: $primary-color-50; + } + } +} diff --git a/src/src/components/ExperimentNameBox/ExperimentNameBox.tsx b/src/src/components/ExperimentNameBox/ExperimentNameBox.tsx new file mode 100644 index 00000000..ac1e3736 --- /dev/null +++ b/src/src/components/ExperimentNameBox/ExperimentNameBox.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { Link as RouteLink } from 'react-router-dom'; +import classNames from 'classnames'; + +import { Link, Tooltip } from '@material-ui/core'; + +import { PathEnum } from 'config/enums/routesEnum'; + +import { IExperimentNameBoxProps } from '.'; + +import './ExperimentNameBox.scss'; + +const ExperimentNameBox = ({ + experimentId, + experimentName, + hidden = false, +}: IExperimentNameBoxProps) => { + return ( + + ); +}; + +export default ExperimentNameBox; diff --git a/src/src/components/ExperimentNameBox/index.ts b/src/src/components/ExperimentNameBox/index.ts new file mode 100644 index 00000000..312bdb15 --- /dev/null +++ b/src/src/components/ExperimentNameBox/index.ts @@ -0,0 +1,5 @@ +import ExperimentNameBox from './ExperimentNameBox'; + +export * from './ExperimentNameBox.d'; + +export default ExperimentNameBox; diff --git a/src/src/components/ExportPreview/ExportPreview.d.ts b/src/src/components/ExportPreview/ExportPreview.d.ts new file mode 100644 index 00000000..a39845d6 --- /dev/null +++ b/src/src/components/ExportPreview/ExportPreview.d.ts @@ -0,0 +1,21 @@ +import React from 'react'; + +export interface IExportPreviewProps { + openModal: boolean; + onToggleExportPreview: () => void; + withDynamicDimensions?: boolean; + explorerPage?: 'metrics' | 'scatters'; + children?: React.ReactNode; + appendElement?: React.ReactNode; +} + +export interface IPreviewBounds { + max: { + width: number; + height: number; + }; + min: { + width: number; + height: number; + }; +} diff --git a/src/src/components/ExportPreview/ExportPreview.scss b/src/src/components/ExportPreview/ExportPreview.scss new file mode 100644 index 00000000..0c3d742e --- /dev/null +++ b/src/src/components/ExportPreview/ExportPreview.scss @@ -0,0 +1,126 @@ +@use 'src/styles/abstracts' as *; + +.ExportPreview { + .ChartGrid, .ChartLegends { + height: 100%; + margin: 0; + padding: 0; + box-shadow: none; + border: none; + outline: none; + } + .ChartLegends { + &__container { + overflow: visible; + } + } + &__modal { + & > .Modal { + overflow: hidden; + & > .Modal__content { + overflow: hidden; + flex: 1; + display: flex; + flex-direction: column; + margin-top: 1rem; + } + } + & .Modal__header { + justify-content: center; + } + } + &__container { + width: 80vw; + height: 62vh; + overflow: auto; + margin: toRem(1px); + border-radius: $border-radius-sm; + box-shadow: 0 0 0 toRem(1px) $cuddle; + display: flex; + &__grid { + height: 100%; + width: 100%; + margin: 0; + display: flex; + flex-wrap: wrap; + } + &__appendElement { + height: 100%; + width: 100%; + } + } + &__controls { + display: flex; + align-items: center; + margin-top: $space-xs; + flex-direction: column; + @include mq(xl) { + flex-direction: row; + } + &__dimension { + display: flex; + justify-content: center; + align-items: center; + white-space: nowrap; + width: 100%; + margin-top: $space-unit; + &__width { + margin-right: $space-sm; + display: flex; + align-items: center; + flex: 1; + &__slider { + width: 100%; + margin: 0 $space-sm 0 $space-xs; + } + &__input { + & > .MuiInputBase-root { + font-size: 0.75rem; + } + } + .InputWrapper { + width: toRem(85px); + min-width: toRem(85px); + } + } + &__height { + display: flex; + align-items: center; + flex: 1; + &__slider { + width: 100%; + margin: 0 $space-sm 0 $space-xs; + } + &__input { + & > .MuiInputBase-root { + font-size: 0.75rem; + } + } + .InputWrapper { + width: toRem(85px); + min-width: toRem(85px); + } + } + } + &__additional { + display: flex; + align-items: center; + margin-left: auto; + margin-top: $space-unit; + @include mq(xl) { + margin-left: $space-sm; + } + &__formatDropdown { + width: toRem(97px); + display: inline-block; + } + &__nameInput{ + display: inline-block; + margin-right: $space-xs; + & .MuiTextField-root { + width: toRem(224px); + } + } + } + } +} diff --git a/src/src/components/ExportPreview/ExportPreview.tsx b/src/src/components/ExportPreview/ExportPreview.tsx new file mode 100644 index 00000000..2f6abaeb --- /dev/null +++ b/src/src/components/ExportPreview/ExportPreview.tsx @@ -0,0 +1,429 @@ +import React from 'react'; +import moment from 'moment'; + +import { Dropdown, InputWrapper, Modal, Slider, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_EXPORTING_FORMAT } from 'config/dates/dates'; + +import * as analytics from 'services/analytics'; + +import { downloadLink, getSVGString, imgSource2Image } from 'utils/helper'; + +import { FORMAT_ENUM, PREVIEW_BOUNDS, PREVIEW_MODAL_DIMENSION } from './config'; + +import { IExportPreviewProps } from '.'; + +import './ExportPreview.scss'; + +function ExportPreview({ + openModal, + onToggleExportPreview, + withDynamicDimensions = false, + explorerPage = 'metrics', + children, + appendElement = null, +}: IExportPreviewProps): React.FunctionComponentElement { + const gridRef = React.useRef(null); + const previewRef = React.useRef(null); + const appendElRef = React.useRef(null); + + const [processing, setProcessing] = React.useState(false); + const [openFormatDropdown, setOpenFormatDropdown] = + React.useState(false); + const [previewDimension, setPreviewDimension] = React.useState( + PREVIEW_MODAL_DIMENSION, + ); + const [format, setFormat] = React.useState(FORMAT_ENUM.SVG); + const [fileName, setFileName] = React.useState( + `${explorerPage}-${moment().format(DATE_EXPORTING_FORMAT)}`, + ); + const [isImageWidthValid, setIsImageWidthValid] = + React.useState(false); + const [isImageHeightValid, setIsImageHeightValid] = + React.useState(false); + + const clearChart = React.useCallback( + (svgElement: SVGSVGElement): SVGSVGElement => { + // remove hover attributes from chart + const attributes = svgElement.querySelector('.Attributes'); + if (attributes) { + attributes.remove?.(); + } + return svgElement; + }, + [], + ); + + const appendVizNodes = React.useCallback( + ( + wrapper: SVGSVGElement, + chartGrid: HTMLElement, + imgFormat: FORMAT_ENUM, + ) => { + const svgVizNodes = chartGrid.querySelectorAll('svg.Visualization'); + const gridColumns = Math.round( + chartGrid.scrollWidth / svgVizNodes[0].clientWidth, + ); + let gridRows = 0; + svgVizNodes?.forEach((svgVizNode, index) => { + if (index !== 0 && index % gridColumns === 0) { + gridRows++; + } + const clearedSvgElement = clearChart( + svgVizNode.cloneNode(true) as SVGSVGElement, + ); + const columnIndex = index % gridColumns; + clearedSvgElement.setAttribute( + 'x', + columnIndex * svgVizNode.clientWidth + 'px', + ); + if (gridRows) { + clearedSvgElement.setAttribute( + 'y', + gridRows * svgVizNode.clientHeight + 'px', + ); + } + const rect = clearedSvgElement.querySelector('rect'); + if (rect && imgFormat !== FORMAT_ENUM.PNG) { + clearedSvgElement.style.backgroundColor = 'white'; + clearedSvgElement.style.fill = 'white'; + rect.style.fill = 'white'; + } + wrapper.appendChild(clearedSvgElement); + }); + }, + [clearChart], + ); + + const appendLegends = React.useCallback( + ( + wrapper: SVGSVGElement, + chartLegends: HTMLElement | null, + gridWidth: number, + gridHeight: number, + format: FORMAT_ENUM, + ) => { + const svgLegendNode = chartLegends?.querySelector('svg.Legends'); + if (chartLegends && svgLegendNode) { + const { scrollWidth: legendsWidth, scrollHeight: legendsHeight } = + svgLegendNode; + const clonedSVGNode = svgLegendNode.cloneNode(true) as SVGSVGElement; + clonedSVGNode.setAttribute('x', gridWidth + 'px'); + clonedSVGNode.setAttribute('y', '0px'); + + const width = gridWidth + legendsWidth; + const height = legendsHeight > gridHeight ? legendsHeight : gridHeight; + + wrapper.setAttribute('width', width + 'px'); + wrapper.setAttribute('height', height + 'px'); + wrapper.setAttribute('viewBox', `0 0 ${width} ${height}`); + + if (format !== FORMAT_ENUM.PNG) { + clonedSVGNode.style.backgroundColor = 'white'; + clonedSVGNode.style.fill = 'white'; + } + wrapper.appendChild(clonedSVGNode); + return { width, height }; + } + return { width: gridWidth, height: gridHeight }; + }, + [], + ); + + const createSVGWrapper = React.useCallback( + (width: number, height: number, format: FORMAT_ENUM): SVGSVGElement => { + const nameSpace = 'http://www.w3.org/2000/svg'; + let wrapper: SVGSVGElement = document.createElementNS(nameSpace, 'svg'); + wrapper.setAttribute('width', `${width}px`); + wrapper.setAttribute('height', `${height}px`); + wrapper.setAttribute('viewBox', `0 0 ${width} ${height}`); + wrapper.setAttribute('preserveAspectRatio', 'xMidYMid meet'); + if (format !== FORMAT_ENUM.PNG) { + wrapper.style.backgroundColor = 'white'; + wrapper.style.fill = 'white'; + } + return wrapper; + }, + [], + ); + + const getExportFunc = React.useCallback( + ( + svgWrapper: SVGSVGElement, + fileName: string, + width: number, + height: number, + ) => { + const svgString = getSVGString(svgWrapper); + const imgSrc = + 'data:image/svg+xml;base64,' + + btoa(unescape(encodeURIComponent(svgString))); // Convert SVG string to data URL + + const imgSrcExportDict = { + [FORMAT_ENUM.SVG]: () => downloadLink(imgSrc, fileName || 'name'), + [FORMAT_ENUM.PNG]: () => + imgSource2Image({ + imgSrc, + width, + height, + format: FORMAT_ENUM.PNG, + callback: (blob) => { + const src = URL.createObjectURL(blob); + downloadLink(src, fileName || 'name'); + }, + }), + [FORMAT_ENUM.JPEG]: () => + imgSource2Image({ + imgSrc, + width, + height, + format: FORMAT_ENUM.JPEG, + callback: (blob) => { + const src = URL.createObjectURL(blob); + downloadLink(src, fileName || 'name'); + }, + }), + }; + + return imgSrcExportDict; + }, + [], + ); + + const onExportImage = React.useCallback((): void => { + setProcessing(true); + try { + const chartGrid = gridRef.current; + if (chartGrid) { + const { scrollWidth: gridWidth, scrollHeight: gridHeight } = chartGrid; + + const svgWrapper = createSVGWrapper(gridWidth, gridHeight, format); + appendVizNodes(svgWrapper, chartGrid, format); + + const chartLegends = appendElRef.current; + + const { width: imgWidth, height: imgHeight } = appendLegends( + svgWrapper, + chartLegends, + gridWidth, + gridHeight, + format, + ); + + const exportFunc = getExportFunc( + svgWrapper, + fileName, + imgWidth, + imgHeight, + )[format]; + + if (typeof exportFunc === 'function') { + exportFunc(); + } + + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[explorerPage].chart.controls.exportChart, + ); + } + } catch (err) { + // eslint-disable-next-line no-console + console.error(err); + } finally { + setProcessing(false); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [format, createSVGWrapper, fileName, appendLegends, appendVizNodes]); + + const formatOptions = React.useMemo( + () => + Object.entries(FORMAT_ENUM).map(([label, value]) => ({ + value, + label, + })), + [], + ); + + const updateChart = React.useCallback( + (dimensions: { height?: number; width?: number }) => { + if (previewRef.current) { + if (dimensions.hasOwnProperty('height')) { + previewRef.current.style.height = `${dimensions['height']}px`; + previewRef.current.style.minHeight = `${dimensions['height']}px`; + } + if (dimensions.hasOwnProperty('width')) { + previewRef.current.style.width = `${dimensions['width']}px`; + previewRef.current.style.minWidth = `${dimensions['width']}px`; + } + } + }, + [], + ); + + const onDimensionChange = React.useCallback( + (key: string, newValue: number, metadata: any = { isValid: true }) => { + if (metadata.isValid) { + updateChart({ [key]: newValue }); + } + setPreviewDimension((prev) => ({ + ...prev, + [key]: newValue, + })); + }, + [updateChart], + ); + + const validationPatterns = React.useCallback( + (min: number, max: number) => [ + { + errorCondition: (value: number) => value < min, + errorText: `Value should be equal or greater then ${min}`, + }, + { + errorCondition: (value: number) => value > max, + errorText: `Value should be equal or smaller then ${max}`, + }, + ], + [], + ); + + return ( + + +
+
+
+ {children} +
+
+ {!!appendElement && ( +
+ {appendElement} +
+ )} +
+
+ {withDynamicDimensions && ( +
+
+ Chart Width + , + v: number | number[], + ) => { + onDimensionChange('width', v as number); + }} + /> + { + onDimensionChange('width', value, metadata); + setIsImageWidthValid(metadata.isValid); + }} + validationPatterns={validationPatterns( + PREVIEW_BOUNDS.min.width, + PREVIEW_BOUNDS.max.width, + )} + /> +
+
+ Single Chart Height + , + v: number | number[], + ) => { + onDimensionChange('height', v as number); + }} + /> + { + onDimensionChange('height', value, metadata); + setIsImageHeightValid(metadata.isValid); + }} + validationPatterns={validationPatterns( + PREVIEW_BOUNDS.min.height, + PREVIEW_BOUNDS.max.height, + )} + /> +
+
+ )} +
+ { + setFileName(value); + }} + /> + val && setFormat(val.value as FORMAT_ENUM)} + value={format} + options={formatOptions} + onMenuOpen={() => setOpenFormatDropdown(true)} + onMenuClose={() => setOpenFormatDropdown(false)} + open={openFormatDropdown} + /> +
+
+
+
+ ); +} + +ExportPreview.displayName = 'ExportPreview'; + +export default React.memo(ExportPreview); diff --git a/src/src/components/ExportPreview/config.ts b/src/src/components/ExportPreview/config.ts new file mode 100644 index 00000000..e9890b91 --- /dev/null +++ b/src/src/components/ExportPreview/config.ts @@ -0,0 +1,25 @@ +import { IPreviewBounds } from './ExportPreview.d'; + +const PREVIEW_BOUNDS: IPreviewBounds = { + max: { + width: 4000, + height: 2000, + }, + min: { + width: 200, + height: 150, + }, +}; + +const PREVIEW_MODAL_DIMENSION = { + width: 1366, + height: 540, +}; + +enum FORMAT_ENUM { + SVG = 'svg', + JPEG = 'jpeg', + PNG = 'png', +} + +export { PREVIEW_BOUNDS, PREVIEW_MODAL_DIMENSION, FORMAT_ENUM }; diff --git a/src/src/components/ExportPreview/index.tsx b/src/src/components/ExportPreview/index.tsx new file mode 100644 index 00000000..1cb220b2 --- /dev/null +++ b/src/src/components/ExportPreview/index.tsx @@ -0,0 +1,5 @@ +import ExportPreview from './ExportPreview'; + +export * from './ExportPreview.d'; + +export default ExportPreview; diff --git a/src/src/components/GroupConfigPopover/GroupConfigPopover.scss b/src/src/components/GroupConfigPopover/GroupConfigPopover.scss new file mode 100644 index 00000000..7bc36579 --- /dev/null +++ b/src/src/components/GroupConfigPopover/GroupConfigPopover.scss @@ -0,0 +1,15 @@ +@use 'src/styles/abstracts' as *; + +.GroupConfigPopover { + padding: 0.75rem 1rem; + max-width: 500px; + &__item { + margin-bottom: $space-xxxs; + display: flex; + justify-content: space-between; + &_value { + margin-left: $space-xs; + word-break: break-word; + } + } +} diff --git a/src/src/components/GroupConfigPopover/GroupConfigPopover.tsx b/src/src/components/GroupConfigPopover/GroupConfigPopover.tsx new file mode 100644 index 00000000..f737ddf6 --- /dev/null +++ b/src/src/components/GroupConfigPopover/GroupConfigPopover.tsx @@ -0,0 +1,52 @@ +import React from 'react'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IGroupConfigPopoverProps } from 'types/components/GroupConfigPopover/GroupConfigPopover'; + +import stopPropagation from 'utils/stopPropagation'; +import { formatValue } from 'utils/formatValue'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; + +import './GroupConfigPopover.scss'; + +/** + * @property {Array<{name: string, value: string}>} configData - array of applied grouping config of line + */ + +function GroupConfigPopover({ + configData, +}: IGroupConfigPopoverProps): React.FunctionComponentElement { + return ( + +
+ {configData.map((item: any) => { + let value = isSystemMetric(item.value) + ? formatValue(formatSystemMetricName(item.value)) + : formatValue(item.value); + + return ( +
+ + {item.name}: + + + {value} + +
+ ); + })} +
+
+ ); +} + +GroupConfigPopover.displayName = 'GroupConfigPopover'; + +export default React.memo(GroupConfigPopover); diff --git a/src/src/components/Grouping/Grouping.scss b/src/src/components/Grouping/Grouping.scss new file mode 100644 index 00000000..aec435ee --- /dev/null +++ b/src/src/components/Grouping/Grouping.scss @@ -0,0 +1,21 @@ +@use 'src/styles/abstracts' as *; + +.Grouping { + display: flex; + flex-direction: column; + justify-content: space-between; + border-left: $border-main; + padding: 0.725rem $space-lg; + &__title { + display: flex; + .Text { + text-transform: uppercase; + letter-spacing: 0.3px; + } + } + &__content { + display: flex; + align-items: center; + justify-content: center; + } +} diff --git a/src/src/components/Grouping/Grouping.tsx b/src/src/components/Grouping/Grouping.tsx new file mode 100644 index 00000000..6b66295c --- /dev/null +++ b/src/src/components/Grouping/Grouping.tsx @@ -0,0 +1,83 @@ +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { Text } from 'components/kit'; + +import GroupingPopovers, { + GroupNameEnum, +} from 'config/grouping/GroupingPopovers'; + +import { IGroupingProps } from 'types/pages/components/Grouping/Grouping'; + +import GroupingItem from '../GroupingItem/GroupingItem'; + +import './Grouping.scss'; + +function Grouping({ + groupingData, + groupingSelectOptions, + onGroupingSelectChange, + onGroupingModeChange, + onGroupingPaletteChange, + onGroupingReset, + onGroupingPersistenceChange, + onGroupingApplyChange, + onShuffleChange, + groupingPopovers = GroupingPopovers, + isDisabled = false, +}: IGroupingProps): React.FunctionComponentElement { + return ( + +
+
+ + Group by + +
+
+ {groupingPopovers.map( + ({ title, inputLabel, groupName, AdvancedComponent }) => { + return ( + + ) + } + onReset={() => onGroupingReset(groupName as GroupNameEnum)} + onVisibilityChange={() => + onGroupingApplyChange(groupName as GroupNameEnum) + } + /> + ); + }, + )} +
+
+
+ ); +} + +export default React.memo(Grouping); diff --git a/src/src/components/GroupingItem/GroupingItem.scss b/src/src/components/GroupingItem/GroupingItem.scss new file mode 100644 index 00000000..def79ae2 --- /dev/null +++ b/src/src/components/GroupingItem/GroupingItem.scss @@ -0,0 +1,57 @@ +@use 'src/styles/abstracts' as *; + +.GroupingItem { + display: flex; + flex-direction: column; + margin-right: 0.5em; + cursor: pointer; + &.isDisabled { + opacity: 0.5; + cursor: initial; + } + &:last-child { + margin-right: 0; + } + span { + margin-top: 0.4em; + text-align: center; + text-transform: capitalize; + } + &__icon__box { + width: 3.25em; + height: 3.25em; + border: $border-main; + border-radius: 0.375em; + display: flex; + align-items: center; + justify-content: center; + transition: all $popover-opening-duration ease-out; + + &:last-child { + margin-right: 0; + } + + i { + color: #1473e6; + font-size: 24px; + } + + &:hover { + background-color: $pico-5; + } + + &.active { + background-color: $primary-color-10; + } + &.outlined { + background-color: $primary-color-10; + border: $border-main-active; + } + } + &__button_small { + border: 1px solid; + padding: 0px 4px; + border-radius: 4px; + cursor: pointer; + } +} diff --git a/src/src/components/GroupingItem/GroupingItem.tsx b/src/src/components/GroupingItem/GroupingItem.tsx new file mode 100644 index 00000000..3a5b17b3 --- /dev/null +++ b/src/src/components/GroupingItem/GroupingItem.tsx @@ -0,0 +1,79 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import GroupingPopover from 'components/GroupingPopover/GroupingPopover'; +import { Icon } from 'components/kit'; +import { IconName } from 'components/kit/Icon'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IGroupingItemProps } from 'types/pages/components/GroupingItem/GroupingItem'; + +import './GroupingItem.scss'; + +const icons = { + stroke: 'line-style', + chart: 'chart-group', + row: 'image-group', + color: 'coloring', +}; + +function GroupingItem({ + title, + groupName, + groupingData, + inputLabel, + advancedComponent, + onSelect, + onGroupingModeChange, + groupingSelectOptions, + isDisabled, +}: IGroupingItemProps): React.FunctionComponentElement { + return ( + + ( + +
) => { + if (!isDisabled) { + onAnchorClick(e); + } + }} + className={classNames('GroupingItem', { + isDisabled: isDisabled, + })} + > +
+ +
+
+
+ )} + component={ + + } + /> +
+ ); +} + +export default GroupingItem; diff --git a/src/src/components/GroupingPopover/GroupingPopover.scss b/src/src/components/GroupingPopover/GroupingPopover.scss new file mode 100644 index 00000000..2f7e0c03 --- /dev/null +++ b/src/src/components/GroupingPopover/GroupingPopover.scss @@ -0,0 +1,94 @@ +@use 'src/styles/abstracts' as *; + +.GroupingPopover { + width: 25rem; + + h3 { + text-transform: uppercase; + } + + &__container__select { + padding: 1rem; + &__selectedFieldsContainer { + max-height: toRem(110px); + overflow: auto; + width: 100%; + } + } + + &__advanced__component { + border-top: $border-main; + } + &__toggleMode__div { + display: flex; + flex-direction: column; + border-top: $border-main; + border-bottom: $border-main; + padding: 1rem; + } + + &__subtitle { + margin-bottom: 0.75rem; + } + + &__accordion__container { + box-shadow: unset; + margin: 0 !important; + + .GroupingPopover__subtitle { + margin-bottom: unset; + } + + .MuiAccordionSummary-expandIcon { + padding: 0; + transform: unset; + margin: unset; + + &.Mui-expanded { + transform: unset; + } + } + + .Mui-expanded { + margin: 0; + } + } + + .MuiAccordionSummary-root { + min-height: unset; + height: 2.125rem; + border-bottom: $border-main; + padding: 0 1rem; + } + &__option { + display: flex; + width: 100%; + overflow: hidden; + &__label { + margin-left: $space-xs; + max-width: 100%; + overflow: hidden; + word-break: break-all; + } + } +} + +.AdvancedPopover__container { + width: 25rem; +} + +.AdvancedPopover__paletteColors__container { + display: flex; + border-radius: 4px; + width: 10.5rem; + border-top: $border-main; + height: 2rem; + margin-right: 0.5rem; + overflow: hidden; +} + +.AdvancedPopover__paletteColors__colorItem { + display: inline-block; + flex: 1; + height: 100%; +} diff --git a/src/src/components/GroupingPopover/GroupingPopover.tsx b/src/src/components/GroupingPopover/GroupingPopover.tsx new file mode 100644 index 00000000..b4ebf50b --- /dev/null +++ b/src/src/components/GroupingPopover/GroupingPopover.tsx @@ -0,0 +1,227 @@ +import React from 'react'; + +import { Checkbox, TextField } from '@material-ui/core'; +import { + CheckBox as CheckBoxIcon, + CheckBoxOutlineBlank, +} from '@material-ui/icons'; +import Autocomplete from '@material-ui/lab/Autocomplete'; + +import { Badge, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IGroupingPopoverProps } from 'types/components/GroupingPopover/GroupingPopover'; +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; + +import './GroupingPopover.scss'; + +function GroupingPopover({ + groupName, + advancedComponent, + groupingData, + groupingSelectOptions, + onSelect, + onGroupingModeChange, + inputLabel, +}: IGroupingPopoverProps): React.FunctionComponentElement { + const [inputValue, setInputValue] = React.useState(''); + + function onChange(e: any, values: IGroupingSelectOption[]): void { + if (e?.code !== 'Backspace') { + handleSelect(values); + } else { + if (inputValue.length === 0) { + handleSelect(values); + } + } + } + + function handleSelect(values: IGroupingSelectOption[]) { + onSelect({ + groupName, + list: values.map((item: IGroupingSelectOption) => + typeof item === 'string' ? item : item.value, + ), + }); + } + + const values: IGroupingSelectOption[] = React.useMemo(() => { + let data: { value: string; group: string; label: string }[] = []; + groupingSelectOptions.forEach((option) => { + if (groupingData?.[groupName].indexOf(option.value) !== -1) { + data.push(option); + } + }); + + // Sort selected values by the order of their application + return groupingData + ? data.sort( + (a, b) => + groupingData[groupName].indexOf(a.value) - + groupingData[groupName].indexOf(b.value), + ) + : data; + }, [groupName, groupingData, groupingSelectOptions]); + + //ToDo reverse mode + // function handleGroupingMode(val: string | number, id: any) { + // onGroupingModeChange({ + // groupName, + // value: val === 'Reverse', + // options: groupingData?.reverseMode[groupName as GroupNameEnum] + // ? groupingSelectOptions + // : null, + // }); + // } + + const options = React.useMemo(() => { + if (inputValue.trim() !== '') { + const filtered = groupingSelectOptions.filter((item) => { + return item.label.indexOf(inputValue) !== -1; + }); + + return filtered + .slice() + .sort( + (a, b) => a.label.indexOf(inputValue) - b.label.indexOf(inputValue), + ); + } + return groupingSelectOptions; + }, [groupingSelectOptions, inputValue]); + + return ( + +
+
+
+ + {inputLabel ?? `Select fields for grouping by ${groupName}`} + + option.group} + getOptionLabel={(option) => option.label} + getOptionSelected={(option, value) => + option.value === value.value + } + renderInput={(params: any) => ( + { + setInputValue(e.target?.value); + }, + }} + className='TextField__OutLined__Small' + variant='outlined' + placeholder='Select fields' + /> + )} + renderTags={(value, getTagProps) => ( +
+ {value.map((selected, i) => ( + + ))} +
+ )} + renderOption={(option, { selected }) => ( +
+ } + checkedIcon={} + style={{ marginRight: 4 }} + checked={selected} + /> + + {option.label} + +
+ )} + /> +
+ {/* //TODO: reverse mode +
+ + select grouping mode + + +
*/} + {advancedComponent && ( + +
+ {/* //ToDo reverse mode + + + } + id='panel1c-header' + > + + Advanced options + + + */} + {advancedComponent} + {/* + */} +
+
+ )} +
+
+
+ ); +} + +export default GroupingPopover; diff --git a/src/src/components/HeatMap/HeatMap.tsx b/src/src/components/HeatMap/HeatMap.tsx new file mode 100644 index 00000000..f238f679 --- /dev/null +++ b/src/src/components/HeatMap/HeatMap.tsx @@ -0,0 +1,235 @@ +import React from 'react'; +import moment from 'moment'; +import { useHistory } from 'react-router-dom'; + +import { Tooltip } from '@material-ui/core'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_QUERY_FORMAT } from 'config/dates/dates'; + +import * as analytics from 'services/analytics'; + +import { encode } from 'utils/encoder/encoder'; + +import './HeatMapStyle.scss'; + +const cellScales: number[] = [0, 1, 2, 3, 4]; +function HeatMap({ + data, + startDate, + endDate, + cellSize = 12, + cellSpacing = 4, + scaleRange = 4, + onCellClick, + additionalQuery = '', +}: any) { + const oneDay = 24 * 60 * 60 * 1000; + const weekDays = ['S', 'M', 'T', 'W', 'T', 'F', 'S']; + const months = [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec', + ]; + const history = useHistory(); + startDate = new Date( + startDate.getFullYear(), + startDate.getMonth(), + startDate.getDate(), + ); + endDate = new Date( + endDate.getFullYear(), + endDate.getMonth(), + endDate.getDate(), + ); + + let firstDay = startDate; + while (firstDay.getDay() !== 0) { + firstDay = shiftDate(firstDay, -1); + } + + let lastDay = endDate; + + while (lastDay.getDay() !== 0) { + lastDay = shiftDate(lastDay, 1); + } + + if (lastDay.getDay() === 0) { + lastDay = shiftDate(lastDay, 7); + } + + const diffDays = Math.floor(Math.abs((firstDay - lastDay) / oneDay)); + + const maxVal = getMaxVal(); + + // get max run count in data + function getMaxVal() { + let maxValue = 0; + [...Array(diffDays).keys()].forEach((index) => { + let count = getRunCountByDay(index); + maxValue = count > maxValue ? count : maxValue; + }); + return maxValue; + } + + // get runs count by day index + function getRunCountByDay(dayIndex: number): number { + const date = indexToDate(dayIndex); + let count = 0; + for (let s = 0; s < data.length; s++) { + if ( + data[s]?.[0].getFullYear() === date.getFullYear() && + data[s]?.[0].getMonth() === date.getMonth() && + data[s]?.[0].getDate() === date.getDate() + ) { + count += data[s][1]; + } + } + return count; + } + + const orderedMonths = [ + ...months.slice(firstDay.getMonth()), + ...months.slice(0, firstDay.getMonth()), + ]; + + const xAxisStyles = { + width: `${ + (diffDays / 7) * cellSize + (diffDays / 7 - 1) * cellSpacing - 50 + }px`, + }; + + const gridStyles = { + gridTemplateColumns: `repeat(${diffDays / 7}, 1fr)`, + gridTemplateRows: 'repeat(7, 1fr)', + width: `${(diffDays / 7) * cellSize + (diffDays / 7 - 1) * cellSpacing}px`, + height: `${7 * cellSize + 6 * cellSpacing}px`, + gridColumnGap: `${cellSpacing}px`, + gridRowGap: `${cellSpacing}px`, + }; + + function shiftDate(date: any, numDays: any) { + const newDate = new Date(date); + newDate.setDate(newDate.getDate() + numDays); + return newDate; + } + + function indexToDate(index: number) { + const x = Math.floor(index / 7); + const y = index % 7; + + return shiftDate(firstDay, x * 7 + y); + } + + function getScale(value: number) { + return Math.ceil((value / maxVal) * scaleRange); + } + function renderCell(index: number) { + const runsCount = getRunCountByDay(index); + const date = indexToDate(index); + const scale = runsCount ? getScale(runsCount) : 0; + const tooltip = ` ${runsCount} tracked run${ + runsCount !== 1 ? 's' : '' + } on ${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`; + + function onClickCell(e: React.MouseEvent) { + e.stopPropagation(); + onCellClick(); + if (scale) { + const startDate = date.getTime(); + + const search = encode({ + query: `datetime(${moment(startDate).format( + DATE_QUERY_FORMAT, + )}) <= run.created_at < datetime(${moment(startDate) + .add(1, 'day') + .format(DATE_QUERY_FORMAT)}) ${additionalQuery}`, + }); + analytics.trackEvent(ANALYTICS_EVENT_KEYS.dashboard.activityCellClick); + history.push(`/runs?select=${search}`); + } + } + + return ( + +
+ {+endDate < +indexToDate(index) ? ( +
+ ) : ( + +
+ + )} +
+ + ); + } + + return ( +
+
+
+
+ {orderedMonths.slice(0, 10).map((m, i) => ( +
+ {m} +
+ ))} +
+
+ {weekDays.map((d, i) => ( +
+ {d} +
+ ))} +
+
+ {[...Array(diffDays).keys()].map((index) => renderCell(index))} +
+
+
+ + Less + + {cellScales.map((scale) => ( +
+
+
+ ))} + + + More + +
+
+ ); +} + +export default HeatMap; diff --git a/src/src/components/HeatMap/HeatMapStyle.scss b/src/src/components/HeatMap/HeatMapStyle.scss new file mode 100644 index 00000000..5d506f7d --- /dev/null +++ b/src/src/components/HeatMap/HeatMapStyle.scss @@ -0,0 +1,103 @@ +@use 'src/styles/abstracts' as *; + +.CalendarHeatmap__map { + display: grid; + grid-template-columns: 1em 1fr; + grid-template-rows: 20px 1fr; +} + +.CalendarHeatmap__map__axis { + color: var(--grey-light); + + &.CalendarHeatmap__map__axis--x { + font-size: 12px; + font-weight: $font-500; + display: flex; + flex-direction: row; + justify-content: space-between; + } + + &.CalendarHeatmap__map__axis--y { + font-size: 9px; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: space-between; + position: sticky; + left: 0; + background-color: $white; + } +} + +.CalendarHeatmap__map__grid { + display: grid; + grid-auto-flow: column; + user-select: none; +} + +.CalendarHeatmap__cell__wrapper { + width: 100%; + height: 100%; + + .Tooltip__container { + width: 100%; + height: 100%; + } +} + +.CalendarHeatmap__cell { + width: 100%; + height: 100%; + box-sizing: border-box; + border-radius: 3px; + transition: box-shadow 50ms ease; + cursor: pointer; + + &.CalendarHeatmap__cell--dummy { + opacity: 0; + pointer-events: none; + user-select: none; + cursor: auto; + } + + &.CalendarHeatmap__cell--scale-0 { + background: $pico-10; + cursor: default; + } + + &.CalendarHeatmap__cell--scale-1 { + background: #abcaf6; + } + + &.CalendarHeatmap__cell--scale-2 { + background: #77a8ef; + } + + &.CalendarHeatmap__cell--scale-3 { + background: #3578e6; + } + + &.CalendarHeatmap__cell--scale-4 { + background: #225ae0; + } +} + +.CalendarHeatmap__cell__info { + margin-top: 1em; + display: flex; + align-items: center; + justify-content: flex-end; + .CalendarHeatmap__cell { + cursor: default; + &__wrapper { + margin-right: 0.25em; + } + } + span { + line-height: 12px; + margin-right: 0.75em; + &:last-child { + margin-left: 0.5em; + } + } +} diff --git a/src/src/components/HighPlot/HighPlot.scss b/src/src/components/HighPlot/HighPlot.scss new file mode 100644 index 00000000..e24907af --- /dev/null +++ b/src/src/components/HighPlot/HighPlot.scss @@ -0,0 +1,148 @@ +@use 'src/styles/abstracts' as *; + +.HighPlot__container { + background-color: white; + height: 100%; + width: 100%; + position: relative; + overflow: hidden; + user-select: none; + min-width: toRem(150px); + min-height: toRem(150px); + .Axes { + .tick text { + display: none; + } + .yAxisLabel { + text-align: right; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .xAxisLabel__container { + display: flex; + align-items: center; + justify-content: center; + + &.left { + justify-content: flex-start; + } + &.right { + justify-content: flex-end; + } + + .xAxisLabel { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: $text-sm; + } + + &::before { + content: ''; + display: inline-block; + flex-shrink: 0; + width: 6px; + height: 6px; + background-color: #2bc784; + border-radius: $border-radius-circle; + margin: 4px 5px 4px 0; + } + + &__metric { + &::before { + background-color: #1473e6; + } + } + } + .axisBrush { + .handle { + fill: $cuddle-110; + } + .selection { + fill: $pico-50; + stroke: none; + } + } + } + &.backgroundRect { + cursor: crosshair; + } + &.zoomMode rect { + cursor: zoom-in; + } + .HoverCircle { + cursor: pointer; + opacity: 1; + stroke-width: 3; + fill: white; + border-radius: 50%; + paint-order: stroke; + /* on click */ + &.focus { + stroke-width: 4; + clip-path: unset; + &__shadow { + stroke-width: 12; + } + } + /* on hover */ + &.active { + stroke-width: 5; + } + } + .Attributes { + &.highlight > .HoverCircle:not(.active):not(.focus) { + opacity: 0.5; + } + } + .ChartMouseValue { + position: absolute; + box-sizing: border-box; + padding: $space-xxs $space-xs; + background-color: $primary-bg; + border: 1px solid $primary-light; + color: $primary-dark; + font-size: 10px; + font-weight: $font-400; + white-space: nowrap; + } + .ChartMouseValueXAxis { + transform: translateX(-50%); + border-radius: 0 0 6px 6px; + border-top: none; + overflow: hidden; + } + .ChartMouseValueYAxis { + transform: translateY(-50%); + border-radius: 6px 0 0 6px; + border-right: none; + overflow: hidden; + box-shadow: inset -8px 0 5px -6px #3b5896; /* var(--primary);*/ + } + .Lines { + overflow: hidden; + @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { + &.optimizeRendering { + shape-rendering: optimizeSpeed; + } + } + &.highlight > .Line:not(.active):not(.highlighted) { + stroke-width: 1.5; + opacity: 0.2; + } + } + .Line { + stroke-width: 1.5; + opacity: 0.3; + &.active { + opacity: 1; + stroke-width: 3; + } + &.highlighted { + opacity: 1; + stroke-width: 2; + } + } +} diff --git a/src/src/components/HighPlot/HighPlot.tsx b/src/src/components/HighPlot/HighPlot.tsx new file mode 100644 index 00000000..7f5f5dd5 --- /dev/null +++ b/src/src/components/HighPlot/HighPlot.tsx @@ -0,0 +1,275 @@ +import React from 'react'; +import _ from 'lodash-es'; +import { useResizeObserver } from 'hooks'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { RENDER_LINES_OPTIMIZED_LIMIT } from 'config/charts'; + +import { IFocusedState } from 'types/services/models/metrics/metricsAppModel'; +import { IHighPlotProps } from 'types/components/HighPlot/HighPlot'; + +import { + clearArea, + drawParallelAxes, + drawParallelLines, + drawParallelHoverAttributes, + drawParallelAxesBrush, + drawParallelColorIndicator, + drawArea, +} from 'utils/d3'; + +import './HighPlot.scss'; + +const HighPlot = React.forwardRef(function HighPlot( + props: IHighPlotProps, + ref, +): React.FunctionComponentElement { + const { + index, + id = `${index}`, + nameKey = '', + curveInterpolation, + syncHoverState, + data, + isVisibleColorIndicator, + chartTitle, + onAxisBrushExtentChange, + brushExtents, + resizeMode, + onMount, + readOnly = false, + margin = { + top: 64, + right: 60, + bottom: 30, + left: 60, + }, + } = props; + + // boxes + const visBoxRef = React.useRef({ + margin, + height: 0, + width: 0, + }); + const plotBoxRef = React.useRef({ + height: 0, + width: 0, + }); + + // containers + const parentRef = React.useRef(null); + const visAreaRef = React.useRef(null); + + // d3 node elements + const svgNodeRef = React.useRef(null); + const bgRectNodeRef = React.useRef(null); + const plotNodeRef = React.useRef(null); + const axesNodeRef = React.useRef(null); + const linesNodeRef = React.useRef(null); + const attributesNodeRef = React.useRef(null); + const highlightedNodeRef = React.useRef(null); + + // methods and values refs + const attributesRef = React.useRef({}); + const axesRef = React.useRef({}); + const linesRef = React.useRef({}); + const brushRef = React.useRef({}); + const rafIDRef = React.useRef(); + + const updateDeps = [ + data, + curveInterpolation, + index, + isVisibleColorIndicator, + readOnly, + resizeMode, + id, + ]; + + function draw() { + drawArea({ + index, + id, + nameKey, + visBoxRef, + plotBoxRef, + parentRef, + visAreaRef, + svgNodeRef, + bgRectNodeRef, + plotNodeRef, + axesNodeRef, + linesNodeRef, + attributesNodeRef, + chartTitle, + }); + + if (isVisibleColorIndicator) { + drawParallelColorIndicator({ index, plotBoxRef, plotNodeRef }); + } + + drawParallelAxes({ + axesNodeRef, + visBoxRef, + attributesRef, + axesRef, + dimensions: data.dimensions, + plotBoxRef, + }); + + if (attributesRef?.current.xScale && attributesRef.current.yScale) { + drawParallelLines({ + index, + nameKey, + linesNodeRef, + attributesRef, + attributesNodeRef, + curveInterpolation, + isVisibleColorIndicator, + linesRef, + dimensions: data.dimensions, + data: data.data, + }); + + linesRef.current.data = data.data; + + // render lines with low quality if lines count are more than 'RENDER_LINES_OPTIMIZED_LIMIT' + if (!readOnly && linesNodeRef.current) { + const linesCount = linesNodeRef.current.selectChildren().size(); + if (linesCount > RENDER_LINES_OPTIMIZED_LIMIT) { + linesNodeRef.current.classed('optimizeRendering', true); + } + } + + if (!readOnly) { + drawParallelHoverAttributes({ + dimensions: data.dimensions, + index, + id, + nameKey, + visAreaRef, + linesRef, + attributesRef, + visBoxRef, + bgRectNodeRef, + attributesNodeRef, + linesNodeRef, + highlightedNodeRef, + isVisibleColorIndicator, + axesNodeRef, + syncHoverState, + svgNodeRef, + }); + } + drawParallelAxesBrush({ + plotBoxRef, + plotNodeRef, + brushRef, + linesRef, + visBoxRef, + attributesRef, + brushExtents, + onAxisBrushExtentChange, + dimensions: data.dimensions, + data: data.data, + index, + }); + } + } + + function renderChart() { + clearArea({ visAreaRef }); + draw(); + } + + const resizeObserverCallback: ResizeObserverCallback = React.useCallback( + (entries: ResizeObserverEntry[]) => { + if (entries?.length) { + rafIDRef.current = window.requestAnimationFrame(renderChart); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + updateDeps, + ); + + const observerReturnCallback = React.useCallback(() => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }, []); + + useResizeObserver(resizeObserverCallback, parentRef, observerReturnCallback); + + React.useEffect(() => { + rafIDRef.current = window.requestAnimationFrame(renderChart); + return () => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, updateDeps); + + React.useEffect(() => { + if (typeof onMount === 'function') { + onMount(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useImperativeHandle(ref, () => ({ + clearHoverAttributes: () => { + attributesRef.current.clearHoverAttributes?.(); + }, + setFocusedState: (focusedState: IFocusedState) => { + const prevFocusState = { ...attributesRef.current.focusedState }; + attributesRef.current.focusedState = { + ...focusedState, + visId: focusedState.visId ?? `${focusedState.chartIndex}`, + }; + + if ( + !_.isEmpty(brushExtents) && + !_.isNil(focusedState?.yValue) && + (focusedState?.active !== prevFocusState?.active || + (focusedState?.active && + prevFocusState?.active && + (prevFocusState.yValue !== focusedState.yValue || + prevFocusState.xValue !== focusedState.xValue))) + ) { + brushRef?.current?.updateLinesAndHoverAttributes?.({ + mouse: [ + brushRef.current.xScale(focusedState?.xValue), + (brushRef.current.yScale[focusedState?.xValue ?? 0]?.( + focusedState?.yValue, + ) ?? 0) + visBoxRef.current.margin.top, + ], + focusedState, + }); + } + }, + setActiveLineAndCircle: ( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => { + attributesRef.current.setActiveLineAndCircle?.( + lineKey, + focusedStateActive, + force, + ); + }, + })); + + return ( + +
+
+
+ + ); +}); + +export default React.memo(HighPlot); diff --git a/src/src/components/HighlightModesPopover/HighlightModePopover.scss b/src/src/components/HighlightModesPopover/HighlightModePopover.scss new file mode 100644 index 00000000..e036f9e2 --- /dev/null +++ b/src/src/components/HighlightModesPopover/HighlightModePopover.scss @@ -0,0 +1,5 @@ +@use 'src/styles/abstracts' as *; +.HighlightModePopover { + padding: $space-xs; + width: 16.5rem; +} diff --git a/src/src/components/HighlightModesPopover/HighlightModesPopover.tsx b/src/src/components/HighlightModesPopover/HighlightModesPopover.tsx new file mode 100644 index 00000000..d79c5c3b --- /dev/null +++ b/src/src/components/HighlightModesPopover/HighlightModesPopover.tsx @@ -0,0 +1,53 @@ +import React from 'react'; + +import { MenuItem } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IHighlightModesPopoverProps } from 'types/components/HighlightModesPopover/HighlightModesPopover'; + +import { HighlightEnum } from 'utils/d3'; + +import './HighlightModePopover.scss'; + +function HighlightModesPopover({ + mode, + onChange, +}: IHighlightModesPopoverProps): React.FunctionComponentElement { + function handleClick(e: React.ChangeEvent): void { + const value = e.target?.getAttribute('data-name'); + if (value && mode !== parseInt(value) && typeof onChange === 'function') { + onChange(parseInt(value)); + } + } + + return ( + +
+ + Highlight Off + + + Highlight Metric on Hover + + + Highlight Run On Hover + +
+
+ ); +} + +export default React.memo(HighlightModesPopover); diff --git a/src/src/components/Illustration/Illustration.d.ts b/src/src/components/Illustration/Illustration.d.ts new file mode 100644 index 00000000..c9a9faa4 --- /dev/null +++ b/src/src/components/Illustration/Illustration.d.ts @@ -0,0 +1,16 @@ +import * as React from 'react'; + +import { PipelineStatusEnum } from 'modules/core/engine/types'; + +export interface IIllustrationProps { + content?: string | React.ReactNode; + image?: React.FunctionComponentElement | HTMLImageElement; + type?: IllustrationType; + className?: string; + size?: IllustrationSizeType; + showImage?: boolean; +} + +export type IllustrationSizeType = 'small' | 'medium' | 'large' | 'xLarge'; + +export type IllustrationType = string | PipelineStatusEnum; diff --git a/src/src/components/Illustration/Illustration.scss b/src/src/components/Illustration/Illustration.scss new file mode 100644 index 00000000..55942c24 --- /dev/null +++ b/src/src/components/Illustration/Illustration.scss @@ -0,0 +1,65 @@ +@use 'src/styles/abstracts' as *; + +.Illustration { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + overflow: auto; + flex-direction: column; + &__hidden { + display: none; + } + &__container { + height: fit-content; + overflow: hidden; + padding-bottom: 7 * $space-unit; + &__content { + text-align: center; + .qlAnchor { + color: $primary-color; + text-decoration: none; + margin: 0 $space-xxxs; + &:hover { + text-decoration: underline; + } + } + } + &__img { + text-align: center; + & > img, & > svg { + margin: 0 auto; + display: block; + } + &__small { + padding: $space-xs; + & > img, & > svg { + width: 3rem; + height: auto; + } + } + &__medium { + padding: $space-sm; + & > img, & > svg { + width: 7.5rem; + height: auto; + } + } + &__large { + padding: $space-sm; + & > img, & > svg { + width: 14.5rem; + height: auto; + } + } + &__xLarge { + padding: $space-unit; + & > img, & > svg { + width: 19.5rem; + height: auto; + } + } + } + } +} diff --git a/src/src/components/Illustration/Illustration.tsx b/src/src/components/Illustration/Illustration.tsx new file mode 100644 index 00000000..2471f1f3 --- /dev/null +++ b/src/src/components/Illustration/Illustration.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Text } from 'components/kit'; +import { ITextProps } from 'components/kit/Text'; + +import { + IIllustrationProps, + ILLUSTRATION_TYPES, + ILLUSTRATION_LIST, + getDefaultIllustrationContent, + IllustrationSizeType, +} from '.'; + +import './Illustration.scss'; + +const CONTENT_PROPS: Record = { + small: { + size: 12, + }, + medium: { + size: 14, + }, + large: { + size: 16, + }, + xLarge: { + size: 18, + }, +}; + +function Illustration({ + type = ILLUSTRATION_TYPES.Never_Executed, + content = getDefaultIllustrationContent(type), + image, + className = '', + size = 'xLarge', + showImage = true, +}: IIllustrationProps): React.FunctionComponentElement { + return ( +
+
+ {showImage ? ( +
+ {image || ILLUSTRATION_LIST[type]} +
+ ) : null} + + {content} + +
+
+ ); +} + +export default React.memo(Illustration); diff --git a/src/src/components/Illustration/config.tsx b/src/src/components/Illustration/config.tsx new file mode 100644 index 00000000..dbda5bd6 --- /dev/null +++ b/src/src/components/Illustration/config.tsx @@ -0,0 +1,65 @@ +import * as React from 'react'; + +import { ReactComponent as EmptyBookmarks } from 'assets/illustrations/emptyBookmarks.svg'; +import { ReactComponent as EmptySearch } from 'assets/illustrations/emptySearch.svg'; +import { ReactComponent as ExploreData } from 'assets/illustrations/exploreData.svg'; +import { ReactComponent as WrongSearch } from 'assets/illustrations/wrongSearch.svg'; + +import { DOCUMENTATIONS } from 'config/references'; + +import { PipelineStatusEnum } from 'modules/core/engine/types'; + +import { IllustrationType } from '.'; + +const ILLUSTRATION_TYPES: Record = { + Never_Executed: PipelineStatusEnum.Never_Executed, + Insufficient_Resources: PipelineStatusEnum.Insufficient_Resources, + Empty: PipelineStatusEnum.Empty, + Failed: PipelineStatusEnum.Failed, + Empty_Bookmarks: 'emptyBookmarks', +}; + +const ILLUSTRATION_LIST: Record = { + [ILLUSTRATION_TYPES.Never_Executed]: , + [ILLUSTRATION_TYPES.Insufficient_Resources]: , + [ILLUSTRATION_TYPES.Empty]: , + [ILLUSTRATION_TYPES.Failed]: , + [ILLUSTRATION_TYPES.Empty_Bookmarks]: , +}; + +function getDefaultIllustrationContent( + type: IllustrationType = ILLUSTRATION_TYPES.Never_Executed, +): React.ReactNode { + const Never_Executed = ( + <> + It’s super easy to search Aim experiments. Just start typing your query in + the search bar above. +
+ Look up + + search docs + + to learn more. + + ); + const Failed = 'Incorrect Query'; + const Insufficient_Resources = "You don't have any tracked data"; + const Empty = 'No Results'; + const Empty_Bookmarks = "You don't have any saved bookmark"; + + const CONTENT = { + [ILLUSTRATION_TYPES.Never_Executed]: Never_Executed, + [ILLUSTRATION_TYPES.Failed]: Failed, + [ILLUSTRATION_TYPES.Insufficient_Resources]: Insufficient_Resources, + [ILLUSTRATION_TYPES.Empty]: Empty, + [ILLUSTRATION_TYPES.Empty_Bookmarks]: Empty_Bookmarks, + }; + return CONTENT[type] || null; +} + +export { ILLUSTRATION_TYPES, ILLUSTRATION_LIST, getDefaultIllustrationContent }; diff --git a/src/src/components/Illustration/index.ts b/src/src/components/Illustration/index.ts new file mode 100644 index 00000000..5ce4f37c --- /dev/null +++ b/src/src/components/Illustration/index.ts @@ -0,0 +1,6 @@ +import Illustration from './Illustration'; + +export * from './Illustration.d'; +export * from './config'; + +export default Illustration; diff --git a/src/src/components/IllustrationBlock/IllustrationBlock.scss b/src/src/components/IllustrationBlock/IllustrationBlock.scss new file mode 100644 index 00000000..c51c982e --- /dev/null +++ b/src/src/components/IllustrationBlock/IllustrationBlock.scss @@ -0,0 +1,105 @@ +@use 'src/styles/abstracts' as *; + +.IllustrationBlock { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + overflow: auto; + flex-direction: column; + + &__container { + height: fit-content; + overflow: hidden; + padding-bottom: 6 * $space-unit; + } + &__title { + font-size: $text-xl; + text-align: center; + .qlAnchor { + color: $primary-color; + text-decoration: none; + margin: 0 $space-xxxs; + &:hover { + text-decoration: underline; + } + } + } + &__hidden { + display: none; + } + &__content { + font-size: $text-xl; + text-align: center; + } + &__small { + &__title { + font-weight: $font-500; + font-size: $text-md; + } + &__content { + font-weight: $font-500; + font-size: $text-md; + } + &__img { + padding: $space-xs; + img { + width: toRem(50px); + height: toRem(57px); + margin: 0 auto; + display: block; + } + } + } + &__medium { + &__title { + font-weight: $font-500; + font-size: $text-md; + } + &__content { + font-weight: $font-500; + font-size: $text-md; + } + &__img { + padding: $space-sm; + img { + width: toRem(120px); + margin: 0 auto; + display: block; + } + } + } + &__large { + &__title { + font-weight: $font-500; + font-size: $text-lg; + } + &__content { + font-weight: $font-500; + font-size: $text-lg; + } + &__img { + padding: $space-sm; + img { + width: 14.5rem; + margin: 0 auto; + display: block; + } + } + } + &__xLarge { + &__title { + font-weight: $font-500; + margin-bottom: 1rem; + } + &__img { + padding: $space-unit; + img { + width: 19.5rem; + margin: 0 auto; + display: block; + } + } + } +} diff --git a/src/src/components/IllustrationBlock/IllustrationBlock.tsx b/src/src/components/IllustrationBlock/IllustrationBlock.tsx new file mode 100644 index 00000000..fe10847e --- /dev/null +++ b/src/src/components/IllustrationBlock/IllustrationBlock.tsx @@ -0,0 +1,74 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Text } from 'components/kit'; + +import { + IllustrationsEnum, + Illustration_Title_Config, + Illustration_Content_Config, + Illustrations_List, +} from 'config/illustrationConfig/illustrationConfig'; + +import { IIllustrationBlockProps } from 'types/components/IllustrationBlock/IllustrationBlock'; + +import './IllustrationBlock.scss'; + +function IllustrationBlock({ + title, + content, + image, + page = 'metrics', + type = IllustrationsEnum.ExploreData, + className = '', + size = 'small', + showImage = true, +}: IIllustrationBlockProps): React.FunctionComponentElement { + const [imgLoaded, setImgLoaded] = React.useState(false); + + function onImgLoad() { + setImgLoaded(true); + } + + return ( +
+
+ {showImage ? ( +
+ {image || ( + Illustration + )} +
+ ) : null} + + + {title || Illustration_Title_Config[page][type]} + +
+ + {content ? ( + + {content} + + ) : ( + Illustration_Content_Config[page][type] + )} +
+ ); +} + +export default React.memo(IllustrationBlock); diff --git a/src/src/components/ImageFullViewPopover/ImageFullViewPopover.tsx b/src/src/components/ImageFullViewPopover/ImageFullViewPopover.tsx new file mode 100644 index 00000000..cbdb4b90 --- /dev/null +++ b/src/src/components/ImageFullViewPopover/ImageFullViewPopover.tsx @@ -0,0 +1,72 @@ +import React from 'react'; + +import PopoverContent from 'components/ChartPanel/PopoverContent/PopoverContent'; +import { Button, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import blobsURIModel from 'services/models/media/blobsURIModel'; + +import { ChartTypeEnum } from 'utils/d3'; + +import { IImageFullViewPopoverProps } from './types.d'; + +import './styles.scss'; + +function ImageFullViewPopover({ + imageRendering, + imageData, + tooltipContent, + handleClose, + selectOptions, + onRunsTagsChange, +}: IImageFullViewPopoverProps): React.FunctionComponentElement { + const blobData = blobsURIModel.getState()[imageData?.blob_uri]; + + return ( + +
+
+
+ {imageData.caption} +
+
+
+
+ +
+
+ + + +
+
+
+
+ ); +} + +ImageFullViewPopover.displayName = 'ImageFullViewPopover'; + +export default React.memo(ImageFullViewPopover); diff --git a/src/src/components/ImageFullViewPopover/index.ts b/src/src/components/ImageFullViewPopover/index.ts new file mode 100644 index 00000000..7e045a2e --- /dev/null +++ b/src/src/components/ImageFullViewPopover/index.ts @@ -0,0 +1,6 @@ +import ImageFullViewPopover from './ImageFullViewPopover'; + +export * from './types.d'; +export * from './ImageFullViewPopover'; + +export default ImageFullViewPopover; diff --git a/src/src/components/ImageFullViewPopover/styles.scss b/src/src/components/ImageFullViewPopover/styles.scss new file mode 100644 index 00000000..ed0a8d03 --- /dev/null +++ b/src/src/components/ImageFullViewPopover/styles.scss @@ -0,0 +1,64 @@ +@use 'src/styles/abstracts' as *; + +.ImageFullViewPopover { + display: flex; + justify-content: flex-start; + align-items: flex-start; + height: 100%; + width: 100%; + &__imageContainer { + max-width: calc(100% - 20rem); + flex: 1; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + background: $cuddle-10; + &--pixelated { + image-rendering: pixelated; + } + &--smooth { + image-rendering: auto; + } + &__imageBox { + overflow: auto; + max-width: 100%; + max-height: 100%; + } + } + &__detailContainer { + height: 100%; + min-width: 20rem; + max-height: inherit; + position: relative; + width: 20rem; + box-shadow: 0 toRem(4px) toRem(6px) rgba(144, 175, 218, 0.2); + height: 100%; + &__content { + height: calc(100% - 2rem); + max-height: calc(100% - 2rem); + .PopoverContent { + box-shadow: unset; + + &__container { + box-shadow: unset; + max-height: 100%; + overflow-y: scroll; + } + &__imageSetBox { + padding-top: 0; + } + } + } + &__closeButtonContainer { + color: #414b6d; + padding: 0.25rem 0.3125rem 0.25rem 1.125rem; + display: flex; + justify-content: flex-end; + align-items: center; + .Icon__container { + font-size: 0.625rem; + } + } + } +} diff --git a/src/src/components/ImageFullViewPopover/types.d.ts b/src/src/components/ImageFullViewPopover/types.d.ts new file mode 100644 index 00000000..405eacd4 --- /dev/null +++ b/src/src/components/ImageFullViewPopover/types.d.ts @@ -0,0 +1,11 @@ +import { IImageData } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; + +export interface IImageFullViewPopoverProps { + imageData: IImageData; + tooltipContent: ITooltipContent; + handleClose: () => void; + selectOptions: IGroupingSelectOption[]; + imageRendering: string; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; +} diff --git a/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.d.ts b/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.d.ts new file mode 100644 index 00000000..3e220829 --- /dev/null +++ b/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.d.ts @@ -0,0 +1,8 @@ +import { IControlProps } from 'types/pages/imagesExplore/components/Controls/Controls'; + +export interface IImagePropertiesPopoverProps { + additionalProperties: IControlProps['additionalProperties']; + onImageSizeChange: IControlProps['onImageSizeChange']; + onImageRenderingChange: IControlProps['onImageRenderingChange']; + onImageAlignmentChange: IControlProps['onImageAlignmentChange']; +} diff --git a/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.scss b/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.scss new file mode 100644 index 00000000..cd7d9f79 --- /dev/null +++ b/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.scss @@ -0,0 +1,55 @@ +@use 'src/styles/abstracts' as *; + +.ImagePropertiesPopover { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + width: 25rem; + padding: $space-xs; + max-height: 20rem; + &__section { + width: 100%; + display: flex; + flex-direction: column; + padding: 0 $space-xs; + &__mediaItemSize { + display: flex; + align-items: center; + margin-top: $space-xs; + margin-bottom: $space-xxxs; + } + } + &__sizeSlider { + margin-top: $space-unit; + display: flex; + flex-direction: column; + &--disabled { + opacity: 0.2; + pointer-events: none; + } + } + &__subtitle { + text-transform: uppercase; + &__imageRendering { + margin: $space-xs 0; + } + } + &__Radio { + padding-left: 0; + } + &__Slider { + margin: $space-xs 0; + display: flex; + .Slider { + margin: 0 $space-md; + } + } + &__Divider { + width: 100%; + margin: $space-xs 0; + } + &__sizePercent { + margin-left: $space-xs; + } +} diff --git a/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.tsx b/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.tsx new file mode 100644 index 00000000..9773637d --- /dev/null +++ b/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.tsx @@ -0,0 +1,134 @@ +import React from 'react'; + +import { Divider } from '@material-ui/core'; + +import { Dropdown, Slider, Text, ToggleButton } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { + MediaItemAlignmentEnum, + ImageRenderingEnum, +} from 'config/enums/imageEnums'; +import { + IMAGES_SLIDER_PROPS, + IMAGE_ALIGNMENT_OPTIONS, +} from 'config/mediaConfigs/mediaConfigs'; + +import { IImagePropertiesPopoverProps } from './ImagePropertiesPopover.d'; + +import './ImagePropertiesPopover.scss'; + +function ImagePropertiesPopover({ + additionalProperties, + onImageSizeChange, + onImageRenderingChange, + onImageAlignmentChange, +}: IImagePropertiesPopoverProps): React.FunctionComponentElement { + const [open, setOpen] = React.useState(false); + const [sizeValue, setSizeValue] = React.useState( + additionalProperties.mediaItemSize, + ); + + function onSizeValueChange( + event: React.ChangeEvent<{}>, + newValue: number | number[], + ): void & React.FormEventHandler { + onImageSizeChange(newValue as number); + setSizeValue(newValue as number); + } + + const isOriginalAlignment: boolean = React.useMemo((): boolean => { + return ( + additionalProperties.alignmentType === MediaItemAlignmentEnum.Original + ); + }, [additionalProperties.alignmentType]); + + return ( + +
+
+
+ + Align Images by: + +
+
+ setOpen(true)} + onMenuClose={() => setOpen(false)} + open={open} + withPortal + /> +
+
+
+ + Scale (Relative to window size): + + + {`${sizeValue}%`} + +
+
+ {IMAGES_SLIDER_PROPS.min}% + `${val}`} + value={sizeValue} + disabled={isOriginalAlignment} + onChange={onSizeValueChange as any} + step={IMAGES_SLIDER_PROPS.step} + max={IMAGES_SLIDER_PROPS.max} + min={IMAGES_SLIDER_PROPS.min} + /> + {IMAGES_SLIDER_PROPS.max}% +
+
+
+ +
+ + Image Rendering + + +
+
+
+ ); +} + +ImagePropertiesPopover.displayName = 'ImagePropertiesPopover'; + +export default React.memo(ImagePropertiesPopover); diff --git a/src/src/components/ImagePropertiesPopover/index.ts b/src/src/components/ImagePropertiesPopover/index.ts new file mode 100644 index 00000000..287e0d93 --- /dev/null +++ b/src/src/components/ImagePropertiesPopover/index.ts @@ -0,0 +1,5 @@ +import ImagePropertiesPopover from './ImagePropertiesPopover'; + +export * from './ImagePropertiesPopover'; + +export default ImagePropertiesPopover; diff --git a/src/src/components/LineChart/LineChart.scss b/src/src/components/LineChart/LineChart.scss new file mode 100644 index 00000000..0f8a6054 --- /dev/null +++ b/src/src/components/LineChart/LineChart.scss @@ -0,0 +1,160 @@ +@use 'src/styles/abstracts' as *; + +.LineChart { + background-color: white; + height: 100%; + width: 100%; + position: relative; + overflow: hidden; + user-select: none; + min-width: toRem(150px); + min-height: toRem(150px); + .unableToDrawText { + font-size: $text-md; + text-align: center; + fill: $grey; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 80%; + } + &.backgroundRect { + cursor: crosshair; + } + &.zoomMode rect { + cursor: zoom-in; + } + .HoverCircle { + cursor: pointer; + opacity: 1; + stroke-width: 2.4; + fill: white; + border-radius: 50%; + paint-order: stroke; + /* on click */ + &.focus { + stroke-width: 4; + clip-path: unset; + &__shadow { + stroke-width: 12; + } + } + /* on hover */ + &.active { + stroke-width: 5; + } + } + .Attributes { + &.highlight { + .HoverCircle:not(.active):not(.focus) { + opacity: 0.5; + } + .inProgressLineIndicator:not(.active):not(.focus) { + opacity: 0.8; + } + } + + } + .ChartMouseValue { + position: absolute; + box-sizing: border-box; + padding: $space-xxs $space-xs; + background-color: $primary-bg; + border: 1px solid $primary-light; + color: $primary-dark; + font-size: 10px; + font-weight: $font-400; + white-space: nowrap; + } + .ChartMouseValueXAxis { + transform: translateX(-50%); + border-radius: 0 0 6px 6px; + border-top: none; + overflow: hidden; + } + .ChartMouseValueYAxis { + transform: translateY(-50%); + border-radius: 6px 0 0 6px; + border-right: none; + overflow: hidden; + box-shadow: inset -8px 0 5px -6px #3b5896; /* var(--primary);*/ + } + .Lines { + overflow: hidden; + @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { + &.optimizeRendering { + shape-rendering: optimizeSpeed; + } + } + &.highlight { + .AggrLine { + opacity: 0.2; + &.highlighted { + opacity: 1; + } + } + .AggrArea { + &.highlighted { + opacity: 1; + } + } + & > .Line:not(.active):not(.highlighted):not(.aggregated) { + stroke-width: 1.5; + opacity: 0.2; + } + & > .AggrArea:not(.highlighted) { + opacity: 0.2; + } + } + } + .Line { + stroke-width: 1.5; + opacity: 1; + &.active { + opacity: 1; + stroke-width: 3; + } + &.highlighted { + opacity: 1; + stroke-width: 2.8; + } + &.aggregated { + opacity: 0; + stroke-width: 0.4; + &.active { + opacity: 0.8; + stroke-width: 3; + } + &.highlighted { + opacity: 0.5; + stroke-width: 2.8; + } + } + } + .AggrLine { + opacity: 1; + stroke-width: 2.2; + } + + .inProgressLineIndicator { + animation: inProgressIndicator 0.5s cubic-bezier(0.6, -0.03, 0.22, 0.76) + infinite; + opacity: 1; + paint-order: stroke; + cursor: pointer; + filter: drop-shadow(0 0 0.5px #ffffff) drop-shadow(0 0 0.5px #ffffff) drop-shadow(0 0 0.5px #ffffff); + } + + @keyframes inProgressIndicator { + 0% { + stroke-width: 3; + } + 50% { + stroke-width: 5; + } + 100% { + stroke-width: 3; + } + } +} diff --git a/src/src/components/LineChart/LineChart.tsx b/src/src/components/LineChart/LineChart.tsx new file mode 100644 index 00000000..cea56f62 --- /dev/null +++ b/src/src/components/LineChart/LineChart.tsx @@ -0,0 +1,330 @@ +import * as React from 'react'; +import classNames from 'classnames'; +import { useResizeObserver } from 'hooks'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { RENDER_LINES_OPTIMIZED_LIMIT } from 'config/charts'; + +import { + IAttributesRef, + ILineChartProps, + ILineChartRef, +} from 'types/components/LineChart/LineChart'; +import { IFocusedState } from 'types/services/models/metrics/metricsAppModel'; + +import { + drawArea, + clearArea, + drawAxes, + drawLines, + processLineChartData, + drawBrush, + drawHoverAttributes, + drawUnableToRender, + CurveEnum, + HighlightEnum, + ScaleEnum, +} from 'utils/d3'; + +import './LineChart.scss'; + +const LineChart = React.forwardRef(function LineChart( + props: ILineChartProps, + ref: React.ForwardedRef, +): React.FunctionComponentElement { + const { + data, + index, + id = `${index}`, + nameKey = '', + aggregatedData, + aggregationConfig, + syncHoverState, + axesScaleRange, + ignoreOutliers = false, + alignmentConfig, + highlightMode = HighlightEnum.Off, + curveInterpolation = CurveEnum.Linear, + chartTitle, + zoom, + onZoomChange, + resizeMode, + onMount, + axesScaleType = { + xAxis: ScaleEnum.Linear, + yAxis: ScaleEnum.Linear, + }, + readOnly = false, + margin = { + top: 30, + right: 20, + bottom: 30, + left: 60, + }, + } = props; + + // boxes + const visBoxRef = React.useRef({ + margin, + height: 0, + width: 0, + }); + const plotBoxRef = React.useRef({ + height: 0, + width: 0, + }); + + // containers + const parentRef = React.useRef(null); + const visAreaRef = React.useRef(null); + + // d3 node elements + const svgNodeRef = React.useRef(null); + const bgRectNodeRef = React.useRef(null); + const plotNodeRef = React.useRef(null); + const axesNodeRef = React.useRef(null); + const linesNodeRef = React.useRef(null); + const attributesNodeRef = React.useRef(null); + const xAxisLabelNodeRef = React.useRef(null); + const yAxisLabelNodeRef = React.useRef(null); + const highlightedNodeRef = React.useRef(null); + + // methods and values refs + const axesRef = React.useRef({}); + const linesRef = React.useRef({}); + const attributesRef = React.useRef({}); + const humanizerConfigRef = React.useRef({}); + const rafIDRef = React.useRef(); + + const unableToDrawConditions: { condition: boolean; text?: string }[] = []; + const updateDeps = [ + data, + zoom, + ignoreOutliers, + highlightMode, + axesScaleType, + axesScaleRange, + curveInterpolation, + aggregationConfig, + readOnly, + alignmentConfig, + resizeMode, + id, + ]; + + function draw() { + drawArea({ + index, + id, + nameKey, + visBoxRef, + plotBoxRef, + parentRef, + visAreaRef, + svgNodeRef, + bgRectNodeRef, + plotNodeRef, + axesNodeRef, + linesNodeRef, + attributesNodeRef, + chartTitle, + }); + + const { processedData, processedAggrData, min, max } = processLineChartData( + { + data, + ignoreOutliers, + visBoxRef, + axesScaleType, + axesScaleRange, + aggregatedData, + aggregationConfig, + unableToDrawConditions, + attributesRef, + }, + ); + + drawAxes({ + svgNodeRef, + axesNodeRef, + axesRef, + plotBoxRef, + xScale: attributesRef.current.xScale, + yScale: attributesRef.current.yScale, + visBoxRef, + alignmentConfig, + axesScaleType, + humanizerConfigRef, + drawBgTickLines: { y: true, x: false }, + }); + + drawLines({ + id, + processedData, + nameKey, + linesNodeRef, + linesRef, + curveInterpolation, + xScale: attributesRef.current.xScale, + yScale: attributesRef.current.yScale, + highlightMode, + aggregationConfig, + processedAggrData, + readOnly, + }); + + /** + * render lines with low quality if lines count are more than 'RENDER_LINES_OPTIMIZED_LIMIT' + */ + if (!readOnly && linesNodeRef.current) { + const linesCount = linesNodeRef.current.selectChildren().size(); + if (linesCount > RENDER_LINES_OPTIMIZED_LIMIT) { + linesNodeRef.current.classed('optimizeRendering', true); + } + } + + drawBrush({ + id, + plotBoxRef, + plotNodeRef, + visBoxRef, + axesRef, + attributesRef, + linesRef, + svgNodeRef, + axesScaleType, + min, + max, + axesScaleRange, + zoom, + onZoomChange, + readOnly, + unableToDrawConditions, + }); + + if (!readOnly) { + drawHoverAttributes({ + index, + id, + nameKey, + data, + processedData, + axesScaleType, + highlightMode, + syncHoverState, + visAreaRef, + attributesRef, + plotBoxRef, + visBoxRef, + svgNodeRef, + bgRectNodeRef, + attributesNodeRef, + xAxisLabelNodeRef, + yAxisLabelNodeRef, + linesNodeRef, + highlightedNodeRef, + aggregationConfig, + alignmentConfig, + }); + } + + drawUnableToRender({ + renderArr: unableToDrawConditions, + visAreaRef, + attributesRef, + readOnly, + syncHoverState, + }); + } + + function renderChart() { + clearArea({ visAreaRef }); + draw(); + } + + const resizeObserverCallback: ResizeObserverCallback = React.useCallback( + (entries: ResizeObserverEntry[]) => { + if (entries?.length) { + rafIDRef.current = window.requestAnimationFrame(renderChart); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + updateDeps, + ); + + const observerReturnCallback = React.useCallback(() => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }, []); + + useResizeObserver(resizeObserverCallback, parentRef, observerReturnCallback); + + React.useEffect(() => { + attributesRef.current.currentXValue = undefined; + }, [alignmentConfig, data]); + + React.useEffect(() => { + rafIDRef.current = window.requestAnimationFrame(renderChart); + return () => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, updateDeps); + + React.useEffect(() => { + if (typeof onMount === 'function') { + onMount(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useImperativeHandle(ref, () => ({ + setActiveLineAndCircle: ( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => { + attributesRef.current.setActiveLineAndCircle?.( + lineKey, + focusedStateActive, + force, + ); + }, + updateHoverAttributes: (xValue: number, dataSelector?: string) => { + attributesRef.current.updateHoverAttributes?.(xValue, dataSelector); + }, + clearHoverAttributes: () => { + attributesRef.current.clearHoverAttributes?.(); + }, + setFocusedState: (focusedState: IFocusedState) => { + if (focusedState) { + attributesRef.current.focusedState = { + ...focusedState, + visId: focusedState.visId ?? `${focusedState.chartIndex}`, + }; + } + }, + })); + + return ( + +
+
+
+ + ); +}); + +LineChart.displayName = 'LineChart'; + +export default React.memo(LineChart); diff --git a/src/src/components/LiveUpdateSettings/LiveUpdateSettings.scss b/src/src/components/LiveUpdateSettings/LiveUpdateSettings.scss new file mode 100644 index 00000000..8bb255ef --- /dev/null +++ b/src/src/components/LiveUpdateSettings/LiveUpdateSettings.scss @@ -0,0 +1,10 @@ +@use 'src/styles/abstracts' as *; + +.LiveUpdateSettings { + margin-right: 1.5rem; + display: flex; + align-items: flex-end; + &__Text { + margin-right: 0.625em; + } +} diff --git a/src/src/components/LiveUpdateSettings/LiveUpdateSettings.tsx b/src/src/components/LiveUpdateSettings/LiveUpdateSettings.tsx new file mode 100644 index 00000000..fb9591ca --- /dev/null +++ b/src/src/components/LiveUpdateSettings/LiveUpdateSettings.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +import { Switcher, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import './LiveUpdateSettings.scss'; + +export interface ILiveUpdateSettingsProp { + delay: number; + enabled: boolean; + onLiveUpdateConfigChange: ({ enabled }: { enabled: boolean }) => void; +} + +function LiveUpdateSettings( + props: ILiveUpdateSettingsProp, +): React.FunctionComponentElement { + return ( + +
+ + Live Update: + + { + props.onLiveUpdateConfigChange({ enabled: !props.enabled }); + }} + size='small' + color='primary' + /> +
+
+ ); +} + +export default React.memo(LiveUpdateSettings); diff --git a/src/src/components/MediaList/ImageBox.tsx b/src/src/components/MediaList/ImageBox.tsx new file mode 100644 index 00000000..88e35689 --- /dev/null +++ b/src/src/components/MediaList/ImageBox.tsx @@ -0,0 +1,183 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Skeleton } from '@material-ui/lab'; +import { Dialog } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; +import ImageFullViewPopover from 'components/ImageFullViewPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { BATCH_COLLECT_DELAY } from 'config/mediaConfigs/mediaConfigs'; +import { MediaItemAlignmentEnum } from 'config/enums/imageEnums'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import blobsURIModel from 'services/models/media/blobsURIModel'; +import * as analytics from 'services/analytics'; + +import { IImageBoxProps } from './MediaList.d'; + +const ImageBox = ({ + index, + style, + data, + addUriToList, + mediaItemHeight, + focusedState, + tooltip, + additionalProperties, + selectOptions, + onRunsTagsChange, +}: IImageBoxProps): React.FunctionComponentElement => { + const { format, blob_uri } = data; + const [isImageFullViewPopupOpened, setIsImageFullViewPopupOpened] = + React.useState(false); + let [blobData, setBlobData] = React.useState( + blobsURIModel.getState()[blob_uri] ?? null, + ); + + React.useEffect(() => { + let timeoutID: number; + let subscription: any; + + if (blobData === null) { + if (blobsURIModel.getState()[blob_uri]) { + setBlobData(blobsURIModel.getState()[blob_uri]); + } else { + subscription = blobsURIModel.subscribe(blob_uri, (data) => { + setBlobData(data[blob_uri]); + subscription.unsubscribe(); + }); + timeoutID = window.setTimeout(() => { + if (blobsURIModel.getState()[blob_uri]) { + setBlobData(blobsURIModel.getState()[blob_uri]); + subscription.unsubscribe(); + } else { + addUriToList(blob_uri); + } + }, BATCH_COLLECT_DELAY); + } + } + + return () => { + if (timeoutID) { + clearTimeout(timeoutID); + } + if (subscription) { + subscription.unsubscribe(); + } + }; + }, [addUriToList, blobData, blob_uri]); + + function onImageFullSizeModeButtonClick(e: React.ChangeEvent): void { + e.stopPropagation(); + setIsImageFullViewPopupOpened(true); + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.images.imagesPanel.openFullSizeMode, + ); + } + + const skeletonSize = { + width: style.width - 6, // 6px -> 0.375rem gap + height: + additionalProperties.alignmentType !== MediaItemAlignmentEnum.Height + ? style.width / (data.width / data.height) - 6 // 6px -> 0.375rem gap + : mediaItemHeight - 40, + containerWidth: style.width - 4, + containerHeight: + additionalProperties.alignmentType !== MediaItemAlignmentEnum.Height + ? style.width / (data.width / data.height) - 4 + : mediaItemHeight - 40, + }; + + return ( + +
+
+
+
+ {blobData ? ( + {data.caption} + ) : ( +
+ +
+ )} + + {data.caption} + +
+ +
+
+ + setIsImageFullViewPopupOpened(false)} + aria-labelledby='customized-dialog-title' + className='MediaPanel__Container__imageFullViewPopup' + open={isImageFullViewPopupOpened} + > + setIsImageFullViewPopupOpened(false)} + onRunsTagsChange={onRunsTagsChange} + /> + + +
+
+ ); +}; + +export default ImageBox; diff --git a/src/src/components/MediaList/MediaList.d.ts b/src/src/components/MediaList/MediaList.d.ts new file mode 100644 index 00000000..e3ee9b36 --- /dev/null +++ b/src/src/components/MediaList/MediaList.d.ts @@ -0,0 +1,38 @@ +import { IMediaPanelProps } from 'components/MediaPanel'; +import { MediaTypeEnum } from 'components/MediaPanel/config'; + +import { + IGroupingSelectOption, + IImageData, +} from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { + IFocusedState, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; + +export interface IMediaListProps { + data: IImageData[]; + addUriToList: (blobUrl: string) => void; + wrapperOffsetWidth: number; + wrapperOffsetHeight: number; + mediaItemHeight: number; + focusedState: IFocusedState; + additionalProperties?: IMediaPanelProps['additionalProperties']; + tooltip?: ITooltip; + mediaType: MediaTypeEnum; + selectOptions: IGroupingSelectOption[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; +} + +export interface IImageBoxProps { + data: IImageData; + addUriToList: (blobUrl: string) => void; + index: number; + mediaItemHeight: number; + focusedState: IFocusedState; + tooltip?: ITooltip; + additionalProperties?: IMediaPanelProps['additionalProperties']; + style: { [key: string]: any }; + selectOptions: IGroupingSelectOption[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; +} diff --git a/src/src/components/MediaList/MediaList.scss b/src/src/components/MediaList/MediaList.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/src/components/MediaList/MediaList.tsx b/src/src/components/MediaList/MediaList.tsx new file mode 100644 index 00000000..f47c55b5 --- /dev/null +++ b/src/src/components/MediaList/MediaList.tsx @@ -0,0 +1,132 @@ +import React from 'react'; +import { areEqual, VariableSizeList as List } from 'react-window'; + +import { MediaTypeEnum } from 'components/MediaPanel/config'; +import AudioBox from 'components/kit/AudioBox'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { + MEDIA_ITEMS_SIZES, + MEDIA_LIST_HEIGHT, +} from 'config/mediaConfigs/mediaConfigs'; + +import getBiggestImageFromList from 'utils/getBiggestImageFromList'; + +import ImageBox from './ImageBox'; +import { IMediaListProps } from './MediaList.d'; + +const mediaBoxType: any = { + [MediaTypeEnum.IMAGE]: ImageBox, + [MediaTypeEnum.AUDIO]: AudioBox, +}; + +function MediaList({ + data, + wrapperOffsetWidth, + addUriToList, + mediaItemHeight, + focusedState, + additionalProperties, + tooltip, + mediaType, + wrapperOffsetHeight, + selectOptions, + onRunsTagsChange, +}: IMediaListProps): React.FunctionComponentElement { + const itemSize = React.useCallback( + (index: number) => { + if (mediaType === MediaTypeEnum.AUDIO) { + return MEDIA_ITEMS_SIZES[mediaType]().width; + } else { + return MEDIA_ITEMS_SIZES[mediaType]({ + data, + index, + additionalProperties, + wrapperOffsetWidth, + wrapperOffsetHeight, + }).width; + } + }, + [ + additionalProperties, + data, + mediaType, + wrapperOffsetHeight, + wrapperOffsetWidth, + ], + ); + + const listHeight = React.useMemo(() => { + const { maxWidth, maxHeight } = getBiggestImageFromList(data); + const { alignmentType, mediaItemSize } = additionalProperties; + if (mediaType === MediaTypeEnum.IMAGE) { + return MEDIA_LIST_HEIGHT[mediaType]({ + alignmentType, + maxHeight, + maxWidth, + wrapperOffsetWidth, + mediaItemSize, + mediaItemHeight, + }); + } else { + return MEDIA_LIST_HEIGHT[mediaType](mediaItemHeight); + } + }, [ + additionalProperties, + data, + mediaItemHeight, + mediaType, + wrapperOffsetWidth, + ]); + + return ( + + + {MediaBoxMemoized} + + + ); +} + +export default MediaList; + +const MediaBoxMemoized = React.memo(function MediaBoxMemoized(props: any) { + const { index, style, data } = props; + const Component = mediaBoxType[data.mediaType]; + + return ( + + + + ); +}, areEqual); diff --git a/src/src/components/MediaList/index.ts b/src/src/components/MediaList/index.ts new file mode 100644 index 00000000..adb05413 --- /dev/null +++ b/src/src/components/MediaList/index.ts @@ -0,0 +1,4 @@ +import MediaList from './MediaList'; + +export * from './MediaList'; +export default MediaList; diff --git a/src/src/components/MediaPanel/MediaPanel.d.ts b/src/src/components/MediaPanel/MediaPanel.d.ts new file mode 100644 index 00000000..253113ce --- /dev/null +++ b/src/src/components/MediaPanel/MediaPanel.d.ts @@ -0,0 +1,45 @@ +import React from 'react'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { + IFocusedState, + IGroupingSelectOption, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; +import { IImagesExploreAppConfig } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { IIllustrationConfig } from 'types/components/Table/Table'; + +import { ChartTypeEnum } from 'utils/d3'; +import { SortFields } from 'utils/getSortedFields'; + +import { MediaTypeEnum } from './config'; + +export interface IMediaPanelProps { + data: { [key: string]: any }; + orderedMap: { [key: string]: any }; + isLoading: boolean; + panelResizing: boolean; + wrapperOffsetHeight: number; + wrapperOffsetWidth: number; + controls?: React.ReactNode; + resizeMode?: ResizeModeEnum; + tooltip?: ITooltip; + focusedState: IFocusedState; + selectOptions?: IGroupingSelectOption[]; + additionalProperties?: + | IImagesExploreAppConfig['images']['additionalProperties'] + | any; + tableHeight: string; + mediaType: MediaTypeEnum; + actionPanel?: React.ReactNode; + actionPanelSize?: number; + tooltipType?: ChartTypeEnum; + onActivePointChange?: (activePoint: any, focusedStateActive: boolean) => void; + getBlobsData: (uris: string[]) => Promise; + sortFieldsDict?: { [key: string]: SortField }; + sortFields?: SortFields; + illustrationConfig?: IIllustrationConfig; + onRunsTagsChange?: (runHash: string, tags: ITagInfo[]) => void; + onChangeTooltip?: (tooltip: ITooltip) => void; +} diff --git a/src/src/components/MediaPanel/MediaPanel.scss b/src/src/components/MediaPanel/MediaPanel.scss new file mode 100644 index 00000000..e1323bd9 --- /dev/null +++ b/src/src/components/MediaPanel/MediaPanel.scss @@ -0,0 +1,51 @@ +@use 'src/styles/abstracts' as *; + +.MediaPanel__Container { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + overflow: hidden; + &__imageFullViewPopup { + .MuiDialog-paperWidthSm { + max-width: unset; + width: 100%; + height: 100%; + } + } + &__resizing { + display: flex; + width: 100%; + height: 100%; + flex-direction: column; + align-items: center; + justify-content: center; + background-color: $primary-color-5; + user-select: none; + } + + .MediaPanel { + display: flex; + flex: 1; + height: calc(100% - 3rem); + &__loader { + .ChartLoader { + span { + margin-left: 0; + } + } + } + &__mediaSetContainer { + overflow-x: auto; + padding-left: 1.25rem; + padding-top: 0.25rem; + flex: 1; + } + &__controls { + border-left: 0.0625rem solid #dceafb; + width: 3.75rem; + max-height: 100%; + overflow-y: auto; + } + } +} diff --git a/src/src/components/MediaPanel/MediaPanel.tsx b/src/src/components/MediaPanel/MediaPanel.tsx new file mode 100644 index 00000000..2b270d7e --- /dev/null +++ b/src/src/components/MediaPanel/MediaPanel.tsx @@ -0,0 +1,360 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import MediaSet from 'components/MediaSet/MediaSet'; +import BusyLoaderWrapper from 'components/BusyLoaderWrapper/BusyLoaderWrapper'; +import ChartLoader from 'components/ChartLoader/ChartLoader'; +import { Text } from 'components/kit'; +import ChartPopover from 'components/ChartPanel/ChartPopover/ChartPopover'; +import { throttle } from 'components/Table/utils'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import IllustrationBlock from 'components/IllustrationBlock/IllustrationBlock'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { BATCH_SEND_DELAY } from 'config/mediaConfigs/mediaConfigs'; +import { IllustrationsEnum } from 'config/illustrationConfig/illustrationConfig'; + +import blobsURIModel from 'services/models/media/blobsURIModel'; + +import { IMediaPanelProps } from './MediaPanel.d'; + +import './MediaPanel.scss'; + +function MediaPanel({ + data, + isLoading, + panelResizing, + wrapperOffsetHeight, + wrapperOffsetWidth, + orderedMap, + resizeMode, + tooltip, + focusedState, + additionalProperties, + tableHeight, + mediaType, + controls, + actionPanel, + actionPanelSize, + tooltipType, + onActivePointChange, + getBlobsData, + sortFieldsDict, + sortFields, + illustrationConfig, + onChangeTooltip = () => {}, + selectOptions = [], + onRunsTagsChange = () => {}, +}: IMediaPanelProps): React.FunctionComponentElement { + const [activePointRect, setActivePointRect] = React.useState<{ + top: number; + bottom: number; + left: number; + right: number; + } | null>(null); + const [encodedDataKey, setEncodedDataKey] = React.useState(''); + const [encodedSortFieldsDictKey, setEncodedSortFieldsDictKey] = + React.useState(''); + let processedBlobUriArray = React.useRef([]); + let blobUriArray = React.useRef([]); + let timeoutID = React.useRef(0); + const containerRef = React.useRef(null); + const activePointRef = React.useRef(null); + const requestRef = React.useRef(); + const scrollTopOffset = React.useRef(0); + const rafMouseOverId = React.useRef(0); + + const setActiveElemPos = React.useCallback(() => { + if (activePointRef.current && containerRef.current) { + const { pointRect } = activePointRef.current; + setActivePointRect({ + bottom: pointRect.bottom, + right: pointRect.right, + top: pointRect.top, + left: pointRect.left, + }); + } else { + setActivePointRect(null); + } + }, [setActivePointRect]); + + const syncHoverState = React.useCallback( + (args: { + activePoint: object | null; + focusedStateActive?: boolean; + }): void => { + const { activePoint, focusedStateActive = false } = args; + activePointRef.current = activePoint; + // on MouseEnter + if (activePoint !== null) { + if (onActivePointChange) { + onActivePointChange(activePoint, focusedStateActive); + } + setActiveElemPos(); + } + // on MouseLeave + else { + setActivePointRect(null); + // TODO remove after implementing active focusedState logic + if (onActivePointChange) { + onActivePointChange({ key: null }, focusedStateActive); + } + } + }, + [onActivePointChange, setActivePointRect, setActiveElemPos], + ); + + const closePopover = React.useCallback((): void => { + if (focusedState?.key || activePointRect) { + if (rafMouseOverId.current) { + window.cancelAnimationFrame(rafMouseOverId.current); + } + syncHoverState({ activePoint: null }); + } + }, [focusedState?.key, activePointRect, syncHoverState]); + + const onMouseOver = React.useCallback( + (e: React.MouseEvent): void => { + if (e) { + e.stopPropagation(); + if (e.target) { + rafMouseOverId.current = window.requestAnimationFrame(() => { + const targetElem = e.target as Element; + const closestNode = targetElem.closest( + '[data-mediasetitem="mediaSetItem"]', + ); + if (closestNode) { + const key = closestNode.getAttribute('data-key'); + const seqKey = closestNode.getAttribute('data-seqkey'); + const pointRect = closestNode.getBoundingClientRect(); + if ( + pointRect && + (focusedState.key !== key || activePointRect === null) && + !focusedState?.active + ) { + syncHoverState({ + activePoint: { pointRect, key, seqKey }, + }); + } + } else { + closePopover(); + } + }); + } + } + }, + [ + focusedState?.key, + focusedState?.active, + activePointRect, + syncHoverState, + closePopover, + ], + ); + + function omitRunPropertyFromData(data: any) { + if (_.isArray(data)) { + return data.map((item: any) => _.omit(item, 'run')); + } else { + return Object.keys(data ?? []).reduce((acc: any, key: any) => { + acc[key] = omitRunPropertyFromData(data[key]); + return acc; + }, {}); + } + } + + React.useEffect(() => { + const resultEncodedDataKey = JSON.stringify(omitRunPropertyFromData(data)); + if (encodedDataKey !== resultEncodedDataKey) { + setEncodedDataKey(resultEncodedDataKey); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data]); + + React.useEffect(() => { + const resultEncodedSortFieldsDictKey = JSON.stringify(sortFieldsDict); + if (encodedSortFieldsDictKey !== resultEncodedSortFieldsDictKey) { + setEncodedSortFieldsDictKey(resultEncodedSortFieldsDictKey); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [sortFieldsDict]); + + const mediaSetKey = React.useMemo( + () => { + return Date.now(); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [ + encodedDataKey, + wrapperOffsetHeight, + wrapperOffsetWidth, + additionalProperties, + encodedSortFieldsDictKey, + ], + ); + + function addUriToList(blobUrl: string) { + if (blobsURIModel.getState()[blobUrl]) { + return; + } + if (blobUriArray.current.includes(blobUrl)) { + return; + } + if (processedBlobUriArray.current.includes(blobUrl)) { + return; + } + + blobUriArray.current.push(blobUrl); + getBatch(); + } + + const getBatch = throttle(() => { + if (timeoutID.current) { + window.clearTimeout(timeoutID.current); + } + timeoutID.current = window.setTimeout(() => { + if (!_.isEmpty(blobUriArray.current)) { + const processingBlobUriArray = Object.assign([], blobUriArray.current); + blobUriArray.current = []; + processedBlobUriArray.current = [ + ...new Set([ + ...processedBlobUriArray.current, + ...processingBlobUriArray, + ]), + ]; + requestRef.current = getBlobsData(processingBlobUriArray); + requestRef.current.call().catch((err: any) => { + processedBlobUriArray.current = processedBlobUriArray.current.filter( + (uri: string) => !processingBlobUriArray.includes(uri), + ); + }); + } + }, BATCH_SEND_DELAY); + }, BATCH_SEND_DELAY); + + function onListScroll({ scrollOffset }: { scrollOffset: number }): void { + if (Math.abs(scrollOffset - scrollTopOffset.current) > window.innerHeight) { + if (requestRef.current) { + requestRef.current.abort(); + } + } + scrollTopOffset.current = scrollOffset; + closePopover(); + } + + React.useEffect(() => { + document.addEventListener('mouseover', closePopover); + return () => { + document.removeEventListener('mouseover', closePopover); + }; + }, [closePopover]); + + React.useEffect(() => { + return () => { + if (timeoutID.current) { + window.clearTimeout(timeoutID.current); + } + if (requestRef.current) { + requestRef.current.abort(); + } + blobsURIModel.init(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + + } + > + {panelResizing ? ( +
+ + Release to resize + +
+ ) : ( + <> +
+ {!_.isEmpty(data) ? ( +
+
+ + + +
+ {tooltipType && ( + + + + )} + {controls && ( + +
+ {controls} +
+
+ )} +
+ ) : ( + + )} + {actionPanel} +
+ + )} +
+
+ ); +} + +export default React.memo(MediaPanel); diff --git a/src/src/components/MediaPanel/config.ts b/src/src/components/MediaPanel/config.ts new file mode 100644 index 00000000..a61eeb62 --- /dev/null +++ b/src/src/components/MediaPanel/config.ts @@ -0,0 +1,6 @@ +enum MediaTypeEnum { + IMAGE = 'image', + AUDIO = 'audio', +} + +export { MediaTypeEnum }; diff --git a/src/src/components/MediaPanel/index.ts b/src/src/components/MediaPanel/index.ts new file mode 100644 index 00000000..fecaa725 --- /dev/null +++ b/src/src/components/MediaPanel/index.ts @@ -0,0 +1,4 @@ +import MediaPanel from './MediaPanel'; + +export * from './MediaPanel.d'; +export default MediaPanel; diff --git a/src/src/components/MediaSet/MediaSet.d.ts b/src/src/components/MediaSet/MediaSet.d.ts new file mode 100644 index 00000000..f19246ec --- /dev/null +++ b/src/src/components/MediaSet/MediaSet.d.ts @@ -0,0 +1,30 @@ +import { IMediaPanelProps } from 'components/MediaPanel'; +import { MediaTypeEnum } from 'components/MediaPanel/config'; + +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { + IFocusedState, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; + +import { SortFields } from 'utils/getSortedFields'; + +export interface IMediaSetProps { + data: { [key: string]: any }; + orderedMap: { [key: string]: any }; + onListScroll: ({ scrollOffset: number }) => void; + addUriToList: (blobUrl: string) => void; + index?: number; + mediaSetKey: number; + wrapperOffsetHeight: number; + wrapperOffsetWidth: number; + focusedState: IFocusedState; + additionalProperties?: IMediaPanelProps['additionalProperties']; + tableHeight: IMediaPanelProps['tableHeight']; + tooltip?: ITooltip; + mediaType: MediaTypeEnum; + sortFieldsDict?: { [key: string]: SortField }; + sortFields?: SortFields; + selectOptions: IGroupingSelectOption[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; +} diff --git a/src/src/components/MediaSet/MediaSet.scss b/src/src/components/MediaSet/MediaSet.scss new file mode 100644 index 00000000..90364919 --- /dev/null +++ b/src/src/components/MediaSet/MediaSet.scss @@ -0,0 +1,152 @@ +@use 'src/styles/abstracts' as *; + +.MediaSet { + width: 100%; + background-color: #ffffff; + &__connectorLine { + position: absolute; + top: -0.375rem; + height: 100%; + width: 1px; + background: $cuddle-70; + } + &__container { + display: flex; + flex-direction: column; + &.withDash { + position: relative; + &::before { + content: ''; + position: absolute; + top: 0.375rem; + left: -0.625rem; + width: 0.375rem; + height: 0.0625rem; + background: $cuddle-70; + } + } + &__path { + display: inline-flex; + &__title { + padding-bottom: $space-xxxxs; + font-size: $text-sm; + position: relative; + display: inline-flex; + align-items: center; + &__pointer { + cursor: pointer; + } + &__key, + &__value { + &.stacked { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: inline-block; + } + } + &__key { + margin-right: $space-xxxs; + &.stacked { + max-width: toRem(137px); + } + } + &__value { + margin-left: $space-xxxs; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + &.stacked { + max-width: toRem(227px); + } + } + } + } + &__mediaItemsList { + padding-bottom: $space-xxxs; + padding-top: $space-xxs; + display: flex; + } + } +} + +.ImageBox { + height: 100%; + position: absolute; + &__imageWrapper { + height: 100%; + width: 100%; + position: relative; + &-item { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + width: calc(100% - 0.25rem); + & > span { + height: 1rem; + margin-top: $space-xxxxs; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; + } + & > img { + margin-top: toRem(5px); + padding: toRem(1px); + width: 100%; + height: 100%; + } + &-heightAlign { + img { + height: calc(100% - 0.375rem); + } + } + } + &__zoomIconWrapper { + position: absolute; + top: toRem(14px); + right: toRem(16px); + color: $white; + display: flex; + align-items: center; + justify-content: center; + background: $primary-color-10; + color: $primary-color; + &:hover { + background: $primary-color-20; + color: $primary-color; + } + &.isHidden { + display: none; + } + } + } + .skeletonContainer { + margin-top: toRem(5px); + display: flex; + justify-content: center; + align-items: center; + padding: toRem(1px); + } + .focus img { + box-shadow: 0 0 0 toRem(1.5px) $primary-color, + inset 0 0 0px toRem(0.5px) $primary-color; + } + .active { + & img, + & .skeletonContainer { + box-shadow: 0 0 0 toRem(1.5px) #b9d5f8, inset 0 0 0px toRem(0.5px) #b9d5f8; + } + } + &__image { + &--pixelated { + image-rendering: pixelated; + } + &--smooth { + image-rendering: auto; + } + } +} diff --git a/src/src/components/MediaSet/MediaSet.tsx b/src/src/components/MediaSet/MediaSet.tsx new file mode 100644 index 00000000..9d45abe7 --- /dev/null +++ b/src/src/components/MediaSet/MediaSet.tsx @@ -0,0 +1,437 @@ +import React from 'react'; +import _ from 'lodash-es'; +import { VariableSizeList as List, areEqual } from 'react-window'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import MediaList from 'components/MediaList'; +import { JsonViewPopover } from 'components/kit'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import { MediaTypeEnum } from 'components/MediaPanel/config'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import DepthDropdown from 'components/DepthDropdown/DepthDropdown'; +import DepthSlider from 'components/DepthSlider/DepthSlider'; + +import { + MEDIA_ITEMS_SIZES, + MEDIA_SET_SIZE, + MEDIA_SET_SLIDER_HEIGHT, + MEDIA_SET_TITLE_HEIGHT, + MEDIA_SET_WRAPPER_PADDING_HEIGHT, +} from 'config/mediaConfigs/mediaConfigs'; + +import { formatValue } from 'utils/formatValue'; +import { jsonParse } from 'utils/jsonParse'; +import { SortField } from 'utils/getSortedFields'; +import getBiggestImageFromList from 'utils/getBiggestImageFromList'; + +import { IMediaSetProps } from './MediaSet.d'; + +import './MediaSet.scss'; + +const MediaSet = ({ + data, + onListScroll, + addUriToList, + index = 0, + mediaSetKey, + wrapperOffsetHeight, + wrapperOffsetWidth, + orderedMap, + focusedState, + additionalProperties, + tableHeight, + tooltip, + mediaType, + sortFieldsDict, + sortFields, + selectOptions, + onRunsTagsChange, +}: IMediaSetProps): React.FunctionComponentElement => { + const [depthMap, setDepthMap] = React.useState([]); + let content: [(string | {})[], [] | [][]][] = []; // the actual items list to be passed to virtualized list component + let keysMap: { [key: string]: number } = {}; // cache for checking whether the group title is already added to list + + fillContent(data, [''], orderedMap); + + function setStackedList(list: [], stackedList: [][]): void { + for (let j = 0; j < list.length; j++) { + if (!stackedList[j]) { + stackedList[j] = []; + } + stackedList[j].push(list[j]); + } + } + + function setStackedContent(list: [], path: (string | {})[]): void { + const [lastContentPath, lastContentList] = content[content.length - 1]; + const [orderedMapKey, value] = (path[path.length - 1] as string).split( + ' = ', + ); + if (path.length === lastContentPath.length) { + (lastContentPath[lastContentPath.length - 1] as any)[orderedMapKey].push( + value, + ); + setStackedList(list, lastContentList); + } else { + let stackedList: [][] = []; + setStackedList(list, stackedList); + path[path.length - 1] = { [orderedMapKey]: [value] }; + content.push([path, stackedList]); + } + } + + function getOrderedContentList(list: []): [] { + const listKeys: string[] = []; + const listOrderTypes: any[] = []; + sortFields?.forEach((sortField: SortField) => { + listKeys.push(sortField.value); + listOrderTypes.push(sortField.order); + }); + return _.orderBy(list, listKeys, listOrderTypes) as []; + } + + function fillContent( + list: [] | { [key: string]: [] | {} }, + path: (string | {})[] = [''], + orderedMap: { [key: string]: any }, + ) { + if (Array.isArray(list)) { + const orderedContentList = getOrderedContentList(list); + if (additionalProperties.stacking && content.length) { + setStackedContent(orderedContentList, path); + } else { + content.push([path, orderedContentList]); + } + } else { + const fieldSortedValues = _.orderBy( + [...(orderedMap?.ordering || [])].reduce((acc: any, value: any) => { + acc.push({ [orderedMap.key]: value }); + return acc; + }, []), + [orderedMap?.key || ''], + [sortFieldsDict?.[orderedMap?.orderKey]?.order || 'asc'], + ).map((value: any) => value[orderedMap?.key]); + fieldSortedValues.forEach((val: any) => { + const fieldName = `${orderedMap.key} = ${formatValue(val)}`; + if (!keysMap.hasOwnProperty(path.join(''))) { + content.push([path, []]); + keysMap[path.join('')] = 1; + } + fillContent( + list[fieldName], + path.concat([fieldName]), + orderedMap[fieldName], + ); + }); + } + } + + function getItemSize(index: number): number { + let [path, items] = content[index]; + const { maxHeight, maxWidth } = getBiggestImageFromList(items.flat()); + const { mediaItemSize, alignmentType, stacking } = additionalProperties; + const lastPath = path[path.length - 1]; + const isStackedPath = stacking && typeof lastPath === 'object'; + const { pathValue } = getPathDetails({ + isStackedPath, + lastPath, + }); + if (path.length === 1) { + return 0; + } + if (items.length > 0) { + if (mediaType === MediaTypeEnum.IMAGE) { + return MEDIA_SET_SIZE[mediaType]({ + maxHeight, + maxWidth, + mediaItemHeight, + alignmentType, + wrapperOffsetWidth, + mediaItemSize, + stacking: isStackedPath && pathValue.length > 1, + }); + } + if (mediaType === MediaTypeEnum.AUDIO) { + return MEDIA_SET_SIZE[mediaType](); + } + } + return MEDIA_SET_TITLE_HEIGHT + MEDIA_SET_WRAPPER_PADDING_HEIGHT; + } + + const onDepthChange = React.useCallback( + (value: number, index: number): void => { + if (value !== depthMap[index]) { + let tmpDepthMap = [...depthMap]; + tmpDepthMap[index] = value; + setDepthMap(tmpDepthMap); + } + }, + [depthMap, setDepthMap], + ); + + const mediaItemHeight = React.useMemo(() => { + if (mediaType === MediaTypeEnum.AUDIO) { + return MEDIA_ITEMS_SIZES[mediaType]()?.height; + } else { + return MEDIA_ITEMS_SIZES[mediaType]({ + data, + additionalProperties, + wrapperOffsetWidth, + wrapperOffsetHeight, + })?.height; + } + }, [ + additionalProperties, + data, + mediaType, + wrapperOffsetHeight, + wrapperOffsetWidth, + ]); + + React.useEffect(() => { + if (additionalProperties.stacking && content.length) { + setDepthMap(Array(content.length).fill(0)); + } + }, [additionalProperties.stacking, data, content.length]); + + return ( + + + {MediaGroupedList} + + + ); +}; + +function propsComparator( + prevProps: IMediaSetProps, + nextProps: IMediaSetProps, +): boolean { + if ( + prevProps.mediaSetKey !== nextProps.mediaSetKey || + prevProps.focusedState !== nextProps.focusedState || + prevProps.sortFieldsDict !== nextProps.sortFieldsDict + ) { + return false; + } + return true; +} + +export default React.memo(MediaSet, propsComparator); + +const MediaGroupedList = React.memo(function MediaGroupedList({ + index, + style, + data, +}: { + index: number; + style: React.CSSProperties; + data: { [key: string]: any }; +}) { + const [path, items] = data.data[index]; + const lastPath = path[path.length - 1]; + const depth = data.depthMap[index] || 0; + const isStackedPath = + data.additionalProperties.stacking && typeof lastPath === 'object'; + const { pathKey, pathValue } = getPathDetails({ + isStackedPath, + lastPath, + }); + const { currentValue, currentItems } = getCurrentContent({ + isStackedPath, + pathValue, + depth, + items, + }); + const json: string | object = jsonParse(currentValue); + const isJson: boolean = typeof json === 'object'; + const renderStacking = + currentItems.length > 0 && isStackedPath && pathValue.length > 1; + return ( + +
+ {path.slice(2).map((key: string, i: number) => ( + +
+ + ))} +
2 ? 'withDash' : ''}`} + > + {path.length > 1 && ( + + ( + + + + + {pathKey} + + = + + {currentValue} + + + + {renderStacking && ( + + )} + + )} + component={} + /> + + )} + {renderStacking && ( + + )} + {currentItems.length > 0 && ( +
+ +
+ )} +
+
+
+ ); +}, +areEqual); + +function getPathDetails({ + isStackedPath, + lastPath, +}: { + isStackedPath: boolean; + lastPath: any; +}) { + let pathKey = ''; + let pathValue: string | string[] = ''; + if (isStackedPath) { + pathKey = Object.keys(lastPath)[0]; + pathValue = lastPath[pathKey]; + } else { + [pathKey = '', pathValue = ''] = lastPath?.split(' = '); + } + return { pathKey, pathValue }; +} + +function getCurrentContent({ + isStackedPath, + pathValue, + depth, + items, +}: { + isStackedPath: boolean; + pathValue: string | string[]; + depth: number; + items: [] | [][]; +}) { + let currentValue = ''; + let currentItems: [] = []; + + if (isStackedPath) { + currentValue = (pathValue[depth] as string)?.trim(); + for (let item of items) { + if (item[depth]) { + currentItems.push(item[depth]); + } + } + } else { + currentValue = (pathValue as string)?.trim(); + currentItems = items as []; + } + return { currentValue, currentItems }; +} diff --git a/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.d.ts b/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.d.ts new file mode 100644 index 00000000..d1a45e03 --- /dev/null +++ b/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.d.ts @@ -0,0 +1,6 @@ +export interface INameAndDescriptionCardProps { + title?: string; + defaultName?: string; + defaultDescription: string; + onSave: (name: string, description: string) => void; +} diff --git a/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.scss b/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.scss new file mode 100644 index 00000000..1390aca2 --- /dev/null +++ b/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.scss @@ -0,0 +1,106 @@ +@use 'src/styles/abstracts' as *; + +.NameAndDescriptionCard { + width: 100%; + padding: $space-lg; + background-color: #ffffff; + border: $border-grey; + margin-bottom: $space-unit; + border-radius: $border-radius-lg; + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: column; + &__header { + width: 100%; + display: flex; + justify-content: space-between; + margin-bottom: $space-xs; + } + &__content { + display: flex; + flex-direction: column; + width: 100%; + &__nameBox { + margin-bottom: $space-unit * 2; + &__nameInput { + width: 40%; + .MuiFormHelperText-root { + position: absolute; + bottom: -1.5rem; + } + } + .MuiInputLabel-outlined { + transform: translate(14px, 10px) scale(1); + font-size: $text-md; + &.MuiInputLabel-shrink { + font-size: $text-xs; + color: $pico-50; + font-weight: $font-500; + } + } + } + &__descriptionBox { + width: 100%; + &__descriptionInput { + height: 5.25rem; + width: 100%; + .MuiOutlinedInput-root.Mui-error .MuiOutlinedInput-notchedOutline { + border-color: #f44336 !important; + } + .MuiOutlinedInput-multiline { + padding: $space-xs $space-unit; + overflow: hidden; + height: 5.25rem; + + .MuiOutlinedInput-inputMultiline { + height: 100% !important; + overflow-y: scroll !important; + } + } + + .MuiInputLabel-outlined { + transform: translate(14px, 9px) scale(1); + &.MuiInputLabel-shrink { + transform: translate(14px, -6px) scale(0.75); + font-size: $text-xs; + color: $pico-50; + font-weight: $font-500; + } + } + + .MuiFormLabel-root { + color: $pico-50; + font-weight: $font-500; + font-size: $text-md; + &.Mui-error { + color: #f44336; + } + } + + .MuiInputBase-root { + .MuiInputBase-input { + font-weight: $font-500; + font-size: $text-md; + color: $text-color; + } + + .MuiOutlinedInput-notchedOutline { + border-color: $cuddle; + } + + .PrivateNotchedOutline-legendLabelled-13 { + span { + padding-right: 0; + } + } + } + } + } + } + &__saveBtn { + &.Mui-disabled { + color: $white !important; + } + } +} diff --git a/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.tsx b/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.tsx new file mode 100644 index 00000000..036b3e92 --- /dev/null +++ b/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.tsx @@ -0,0 +1,96 @@ +import React, { memo } from 'react'; +import * as yup from 'yup'; +import _ from 'lodash-es'; +import { useFormik } from 'formik'; + +import { Button, TextField } from '@material-ui/core'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { INameAndDescriptionCardProps } from '.'; + +import './NameAndDescriptionCard.scss'; + +function NameAndDescriptionCard({ + title = 'Run Properties', + defaultName, + defaultDescription, + onSave, +}: INameAndDescriptionCardProps): React.FunctionComponentElement { + const formik = useFormik({ + initialValues: { + name: defaultName ?? '', + description: defaultDescription ?? '', + }, + onSubmit: _.noop, + validationSchema: yup.object({ + name: yup.string().required('Name is a required field'), + }), + }); + + const { values, errors, touched, setFieldValue, setFieldTouched } = formik; + + function onChange(e: React.ChangeEvent, fieldName: string) { + setFieldValue(fieldName, e?.target?.value, true).then(() => { + setFieldTouched(fieldName, true); + }); + } + + function saveHandler() { + onSave(values.name, values.description); + } + + return ( + +
+
+ + {title} + + +
+
+
+ onChange(e, 'name')} + error={!!(touched.name && errors.name)} + helperText={touched.name && errors.name} + label='Name' + /> +
+
+ onChange(e, 'description')} + error={!!(touched.description && errors.description)} + helperText={touched.description && errors.description} + /> +
+
+
+
+ ); +} + +export default memo(NameAndDescriptionCard); diff --git a/src/src/components/NameAndDescriptionCard/index.ts b/src/src/components/NameAndDescriptionCard/index.ts new file mode 100644 index 00000000..48bb8476 --- /dev/null +++ b/src/src/components/NameAndDescriptionCard/index.ts @@ -0,0 +1,5 @@ +import NameAndDescriptionCard from './NameAndDescriptionCard'; + +export * from './NameAndDescriptionCard.d'; + +export default NameAndDescriptionCard; diff --git a/src/src/components/NotificationContainer/NotificationContainer.d.ts b/src/src/components/NotificationContainer/NotificationContainer.d.ts new file mode 100644 index 00000000..f84328dd --- /dev/null +++ b/src/src/components/NotificationContainer/NotificationContainer.d.ts @@ -0,0 +1,23 @@ +export interface INotificationContainer { + data: INotification[]; + handleClose: (id: number) => void; +} + +export interface INotification { + id: number; + messages: string[]; + closeDelay?: number; + severity: 'error' | 'info' | 'success' | 'warning'; +} + +export interface ISyntaxErrorDetail { + line: number; + offset: number; + end_offset?: number; + statement: string; +} + +export interface ISyntaxErrorDetails { + detail: ISyntaxErrorDetail; + message: string; +} diff --git a/src/src/components/NotificationContainer/NotificationContainer.scss b/src/src/components/NotificationContainer/NotificationContainer.scss new file mode 100644 index 00000000..1720f2d5 --- /dev/null +++ b/src/src/components/NotificationContainer/NotificationContainer.scss @@ -0,0 +1,47 @@ +@use 'src/styles/abstracts' as *; + +.NotificationContainer { + .MuiAlert-outlinedSuccess { + border: 0.0625rem solid #2bc784; + } + .MuiAlert-outlinedError { + border: 0.0625rem solid #e64e48; + } + .MuiPaper-root { + background: $white; + height: 4rem; + display: flex; + align-items: center; + border-radius: $border-radius-main; + .MuiAlert-icon { + padding: 0; + svg { + width: 2.375rem; + height: 2.375rem; + } + } + + .MuiAlert-action { + display: flex; + align-items: flex-start; + height: 100%; + .MuiSvgIcon-fontSizeSmall { + font-size: 1.05rem; + fill: $pico; + } + } + } + &__contentBox { + &__severity { + font-weight: $font-600; + font-size: $text-md; + text-transform: capitalize; + color: $pico; + } + &__message { + font-weight: $font-400; + font-size: $text-md; + color: $pico; + } + } +} diff --git a/src/src/components/NotificationContainer/NotificationContainer.tsx b/src/src/components/NotificationContainer/NotificationContainer.tsx new file mode 100644 index 00000000..38528a76 --- /dev/null +++ b/src/src/components/NotificationContainer/NotificationContainer.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { Alert } from '@material-ui/lab'; +import { Box, Snackbar } from '@material-ui/core'; + +import { ReactComponent as SuccessIcon } from 'assets/icons/notifications/success.svg'; +import { ReactComponent as ErrorIcon } from 'assets/icons/notifications/error.svg'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { INotificationContainer } from 'types/components/NotificationContainer/NotificationContainer'; + +import './NotificationContainer.scss'; + +export default function NotificationContainer({ + data = [], + handleClose, +}: INotificationContainer): React.FunctionComponentElement { + return ( + + {!_.isEmpty(data) ? ( +
+ +
+ {data.map(({ id, severity, messages }) => ( + + handleClose(+id)} + variant='outlined' + severity={severity} + iconMapping={{ + success: , + error: , + }} + style={{ height: 'auto' }} + > +
+

+ {severity} +

+ {messages.map((message: string, i: number) => { + return message ? ( +

+ {message} +

+ ) : null; + })} +
+
+
+ ))} +
+
+
+ ) : null} +
+ ); +} diff --git a/src/src/components/NotificationContainer/NotificationContainerStore.ts b/src/src/components/NotificationContainer/NotificationContainerStore.ts new file mode 100644 index 00000000..16184ace --- /dev/null +++ b/src/src/components/NotificationContainer/NotificationContainerStore.ts @@ -0,0 +1,28 @@ +import create from 'zustand'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; + +function createNotificationEngine() { + const state = create<{ data: INotification[] }>(() => ({ + data: [], + })); + + const onNotificationDelete = (id: number) => { + const notificationList = state.getState().data; + state.setState({ + data: notificationList.filter((notification) => notification.id !== id), + }); + }; + + const onNotificationAdd = (notificationData: INotification) => { + const notificationList = state.getState().data ?? []; + state.setState({ data: [...notificationList, notificationData] }); + setTimeout(() => { + onNotificationDelete(notificationData.id); + }, 3000); + }; + + return { notificationState: state, onNotificationDelete, onNotificationAdd }; +} + +export default createNotificationEngine(); diff --git a/src/src/components/NotificationContainer/index.ts b/src/src/components/NotificationContainer/index.ts new file mode 100644 index 00000000..bb991968 --- /dev/null +++ b/src/src/components/NotificationContainer/index.ts @@ -0,0 +1,7 @@ +import NotificationContainer from './NotificationContainer'; +import notificationContainerStore from './NotificationContainerStore'; +import useNotificationContainer from './useNotificationContainer'; + +export * from './NotificationContainer.d'; +export { notificationContainerStore, useNotificationContainer }; +export default NotificationContainer; diff --git a/src/src/components/NotificationContainer/useNotificationContainer.tsx b/src/src/components/NotificationContainer/useNotificationContainer.tsx new file mode 100644 index 00000000..8ea433ef --- /dev/null +++ b/src/src/components/NotificationContainer/useNotificationContainer.tsx @@ -0,0 +1,19 @@ +import React from 'react'; + +import { INotification } from './NotificationContainer.d'; +import notificationEngine from './NotificationContainerStore'; + +function useNotificationContainer() { + const { current: engine } = React.useRef(notificationEngine); + const notificationState: { data: INotification[] } = engine.notificationState( + (state: { data: INotification[] }) => state, + ); + + return { + notificationState: notificationState?.data || [], + onNotificationDelete: engine.onNotificationDelete, + onNotificationAdd: engine.onNotificationAdd, + }; +} + +export default useNotificationContainer; diff --git a/src/src/components/ProgressBar/ProgressBar.d.ts b/src/src/components/ProgressBar/ProgressBar.d.ts new file mode 100644 index 00000000..187e1933 --- /dev/null +++ b/src/src/components/ProgressBar/ProgressBar.d.ts @@ -0,0 +1,8 @@ +import { IRunRequestProgress } from 'utils/app/setRunRequestProgress'; + +export interface IProgressBarProps { + progress: IRunRequestProgress; + processing?: boolean; + pendingStatus?: boolean; + setIsProgressBarVisible?: (isVisible: boolena) => void; +} diff --git a/src/src/components/ProgressBar/ProgressBar.scss b/src/src/components/ProgressBar/ProgressBar.scss new file mode 100644 index 00000000..901db447 --- /dev/null +++ b/src/src/components/ProgressBar/ProgressBar.scss @@ -0,0 +1,101 @@ +@use 'src/styles/abstracts' as *; + +.ProgressBar { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + margin: 0 auto; + position: absolute; + width: 100%; + height: 100%; + background-color: white; + z-index: 9; + opacity: 1; + transform: translateY(0); + left: $space-xxxxs; + &.fadeOutProgress { + animation: fadeOutProgress 0.55s cubic-bezier(0.39, -0.01, 0.27, 1) forwards; + animation-delay: 0.7s; + .ProgressBar__container { + animation: fadeOutProgressInner 0.6s cubic-bezier(0.39, -0.01, 0.27, 1) forwards; + animation-delay: 0.75s; + } + } + @keyframes fadeOutProgress { + from { + opacity: 0.9; + } + to { + opacity: 0; + } + } + @keyframes fadeOutProgressInner { + from { + transform: translateY(0); + } + to { + transform: translateY(-15px); + } + } + &__container { + width: toRem(482px); + height: toRem(65px); + &__title { + color: $pico; + } + &__bar { + box-shadow: 0 0 0 1px #0000000f inset; + box-sizing: content-box; + position: relative; + background: $cuddle-70; + border-radius: $border-radius-xl; + height: toRem(8px); + margin: $space-sm 0 $space-xs; + & > span { + display: block; + height: 100%; + border-radius: $border-radius-xl; + background-color: $primary-color; + position: relative; + overflow: hidden; + will-change: width; + transition: width 0.3s ease-out; + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background-image: linear-gradient( + 315deg, + rgba(255, 255, 255, 0.09), + rgb(255 255 255 / 50%) 60%, + rgb(255 255 255 / 0%) 100% + ); + overflow: hidden; + transform: translateX(-100%); + animation: move 1.5s ease-out infinite; + } + @keyframes move { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(100%); + } + } + } + } + &__info { + display: flex; + color: $pico-70; + font-family: Inter, sans-serif; + font-feature-settings: 'tnum'; + &__matched { + margin-left: auto; + } + } + } +} diff --git a/src/src/components/ProgressBar/ProgressBar.tsx b/src/src/components/ProgressBar/ProgressBar.tsx new file mode 100644 index 00000000..a154eac8 --- /dev/null +++ b/src/src/components/ProgressBar/ProgressBar.tsx @@ -0,0 +1,88 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Text } from '../kit'; + +import { IProgressBarProps } from './ProgressBar.d'; + +import './ProgressBar.scss'; + +function ProgressBar({ + progress = {}, + processing = false, + pendingStatus = false, + setIsProgressBarVisible, +}: IProgressBarProps) { + const { checked = 0, trackedRuns = 0, matched = 0, percent = 0 } = progress; + const [renderBar, setRenderBar] = React.useState(false); + const timeoutIdRef = React.useRef(0); + + React.useEffect(() => { + if (processing || pendingStatus) { + setRenderBar(true); + setIsProgressBarVisible?.(true); + } else { + const hidingDelay = 2000; + if (timeoutIdRef.current) { + window.clearTimeout(timeoutIdRef.current); + } + timeoutIdRef.current = window.setTimeout(() => { + setRenderBar(false); + }, hidingDelay); + } + return () => { + if (timeoutIdRef.current) { + window.clearTimeout(timeoutIdRef.current); + } + setIsProgressBarVisible?.(false); + }; + }, [processing, pendingStatus, setIsProgressBarVisible]); + + const barWidth = React.useMemo( + () => (pendingStatus ? percent + '%' : 'unset'), + [pendingStatus, percent], + ); + const fadeOutProgress = React.useMemo( + () => !(processing || pendingStatus), + [pendingStatus, processing], + ); + const title = React.useMemo( + () => (pendingStatus ? 'Searching over runs...' : 'Processing...'), + [pendingStatus], + ); + + return renderBar ? ( +
+
+ + {title} + +
+ +
+ {trackedRuns !== 0 && ( +
+ + {checked} of {trackedRuns} checked + + + {matched} matched run(s) + +
+ )} +
+
+ ) : null; +} + +export default React.memo(ProgressBar); diff --git a/src/src/components/ProjectWrapper/ProjectWrapper.tsx b/src/src/components/ProjectWrapper/ProjectWrapper.tsx new file mode 100644 index 00000000..19493f1e --- /dev/null +++ b/src/src/components/ProjectWrapper/ProjectWrapper.tsx @@ -0,0 +1,21 @@ +import React from 'react'; + +import projectsModel from 'services/models/projects/projectsModel'; + +const projectDataRequestRef = projectsModel.getProjectsData(); +projectDataRequestRef.call(); +const pinnedSequencesRequestRef = projectsModel.getPinnedSequences(); +pinnedSequencesRequestRef.call(); + +function ProjectWrapper() { + React.useEffect(() => { + return () => { + projectDataRequestRef.abort(); + pinnedSequencesRequestRef.abort(); + }; + }, []); + + return null; +} + +export default ProjectWrapper; diff --git a/src/src/components/RangePanel/RangePanel.d.ts b/src/src/components/RangePanel/RangePanel.d.ts new file mode 100644 index 00000000..68640a25 --- /dev/null +++ b/src/src/components/RangePanel/RangePanel.d.ts @@ -0,0 +1,33 @@ +import { IValidationMetadata, IValidationPatterns } from 'components/kit/Input'; + +export interface IRangeSliderWithInputItem { + sliderName: string; + inputName: string; + sliderTitle: string; + inputTitle: string; + sliderTitleTooltip: string; + inputTitleTooltip: string; + /** + * min, max values + */ + rangeEndpoints: [number, number]; + selectedRangeValue: [number, number]; + inputValue: number; + sliderType: 'single' | 'range'; // This type is same as SliderWithInput component sliderType prop type. + inputValidationPatterns?: IValidationPatterns; + infoPropertyName?: string; +} + +export type RangeSliderData = IRangeSliderWithInputItem[]; + +export interface IRangeSliderPanelProps { + items?: RangeSliderData; + onApply: () => void; + onInputChange: ( + name: string, + value: number, + metadata?: IValidationMetadata, + ) => void; + onRangeSliderChange: (name: string, newValue: number[] | number) => void; + applyButtonDisabled: boolean; +} diff --git a/src/src/components/RangePanel/RangePanel.scss b/src/src/components/RangePanel/RangePanel.scss new file mode 100644 index 00000000..42857658 --- /dev/null +++ b/src/src/components/RangePanel/RangePanel.scss @@ -0,0 +1,50 @@ +@use 'src/styles/abstracts' as *; + +.RangePanel { + display: flex; + align-items: center; + height: 3rem; + width: 100%; + justify-content: center; + background: $white; + border-top: $border-main; + border-bottom-right-radius: toRem(6px); + .RangePanelContainer { + display: flex; + align-items: center; + height: 100%; + width: 100%; + max-width: 85rem; + padding: 0 2.125rem; + justify-content: center; + .ApplyButtonContainer { + height: 100%; + display: flex; + align-items: center; + .ApplyButton { + height: 1.5rem !important; + width: 5.125rem; + } + } + + .VerticalDivider { + width: 0.0625rem; + height: 1.5rem; + background: $primary-color-10; + margin-right: 2.75rem; + margin-left: 2.75rem; + } + .InfoMassageBox { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + i { + margin-right: $space-sm; + } + .InfoMessageBoldText { + margin: 0 toRem(3px); + } + } + } +} diff --git a/src/src/components/RangePanel/RangePanel.tsx b/src/src/components/RangePanel/RangePanel.tsx new file mode 100644 index 00000000..206f4e79 --- /dev/null +++ b/src/src/components/RangePanel/RangePanel.tsx @@ -0,0 +1,110 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import SliderWithInput from 'components/SliderWithInput'; +import { Button, Icon, Text } from 'components/kit'; +import { IValidationMetadata } from 'components/kit/Input'; + +import { IRangeSliderPanelProps } from './RangePanel.d'; + +import './RangePanel.scss'; + +function RangePanel({ + onApply, + applyButtonDisabled, + onRangeSliderChange, + onInputChange, + items, +}: IRangeSliderPanelProps) { + return ( +
{ + e.preventDefault(); + onApply(); + }} + > +
+ {items?.map((item) => { + const rangeLength = _.range( + item.rangeEndpoints?.[0] ?? 0, + (item.rangeEndpoints?.[1] ?? 0) + 1, + ).length; + return ( + + {item.rangeEndpoints?.[0] !== item.rangeEndpoints?.[1] ? ( + + onRangeSliderChange(item.sliderName, value) + } + onCountChange={(value, metadata?: IValidationMetadata) => { + onInputChange(item.inputName, value, metadata); + }} + inputValidationPatterns={ + item?.inputValidationPatterns ?? [ + { + errorCondition: (value: string | number) => +value <= 0, + errorText: `Value should be greater then ${0}`, + }, + { + errorCondition: (value: string | number) => { + return +value > rangeLength; + }, + errorText: `Value should be smaller then ${ + rangeLength + 1 + }`, + }, + ] + } + /> + ) : ( +
+ + + You have only + + 1 {item?.infoPropertyName || 'step'} + + logged. + +
+ )} +
+ + ); + })} +
+ +
+
+ + ); +} + +RangePanel.displayName = 'RangePanel'; + +export default React.memo(RangePanel); diff --git a/src/src/components/RangePanel/index.tsx b/src/src/components/RangePanel/index.tsx new file mode 100644 index 00000000..b48f3912 --- /dev/null +++ b/src/src/components/RangePanel/index.tsx @@ -0,0 +1,5 @@ +import RangePanel from './RangePanel'; + +export * from './RangePanel.d'; + +export default RangePanel; diff --git a/src/src/components/ReleaseNoteItem/ReleaseNoteItem.d.ts b/src/src/components/ReleaseNoteItem/ReleaseNoteItem.d.ts new file mode 100644 index 00000000..e586a5cd --- /dev/null +++ b/src/src/components/ReleaseNoteItem/ReleaseNoteItem.d.ts @@ -0,0 +1,20 @@ +import React from 'react'; + +/** + * @description The IReleaseNoteItemProps interface. + */ +export interface IReleaseNoteItemProps + extends Partial> { + /** + * @description The info of the release note + * @type string + * @example '[feat] Add support for new metrics' + */ + info: string; + /** + * @description tag name of the release note + * @type string + * @example 'v3.13.0' + */ + tagName: string; +} diff --git a/src/src/components/ReleaseNoteItem/ReleaseNoteItem.scss b/src/src/components/ReleaseNoteItem/ReleaseNoteItem.scss new file mode 100644 index 00000000..8186f218 --- /dev/null +++ b/src/src/components/ReleaseNoteItem/ReleaseNoteItem.scss @@ -0,0 +1,45 @@ +@use 'src/styles/abstracts' as *; + +.ReleaseNoteItem { + display: flex; + padding-left: 18px; + margin-bottom: $space-sm; + position: relative; + text-decoration: none; + p { + word-break: break-word; + } + &__tagName { + color: $primary-color; + font-weight: 600; + } + &::before { + content: ''; + position: absolute; + left: 0; + top: 3px; + width: 7px; + height: 7px; + z-index: 1; + border-radius: $border-radius-circle; + background-color: $primary-color; + } + &::after { + content: ''; + position: absolute; + left: 3px; + top: 3px; + height: 100%; + width: 1px; + background-color: $pico-20; + } + &:last-child { + margin-bottom: 0; + } + + &:hover { + text-decoration: underline; + text-decoration-color: $text-color; + cursor: pointer; + } +} diff --git a/src/src/components/ReleaseNoteItem/ReleaseNoteItem.tsx b/src/src/components/ReleaseNoteItem/ReleaseNoteItem.tsx new file mode 100644 index 00000000..b361f140 --- /dev/null +++ b/src/src/components/ReleaseNoteItem/ReleaseNoteItem.tsx @@ -0,0 +1,23 @@ +import React from 'react'; + +import { Text } from 'components/kit'; + +import { IReleaseNoteItemProps } from './ReleaseNoteItem.d'; + +import './ReleaseNoteItem.scss'; + +function ReleaseNoteItem({ + info, + tagName, + ...rest +}: IReleaseNoteItemProps): React.FunctionComponentElement { + return ( + + + {tagName} - {info} + + + ); +} + +export default React.memo(ReleaseNoteItem); diff --git a/src/src/components/ResizeElement/ResizableElement.d.ts b/src/src/components/ResizeElement/ResizableElement.d.ts new file mode 100644 index 00000000..608a74ed --- /dev/null +++ b/src/src/components/ResizeElement/ResizableElement.d.ts @@ -0,0 +1,8 @@ +import * as React from 'react'; + +export interface ResizableElementProps + extends React.HTMLAttributes { + resizingFallback?: React.ReactNode; + children: React.ReactNode | ((resizing: boolean) => React.ReactNode); + hide?: boolean; +} diff --git a/src/src/components/ResizeElement/ResizableElement.tsx b/src/src/components/ResizeElement/ResizableElement.tsx new file mode 100644 index 00000000..db4a3164 --- /dev/null +++ b/src/src/components/ResizeElement/ResizableElement.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import classNames from 'classnames'; + +import { ResizeElementContext, ResizableElementProps } from './'; + +const ResizableElement = React.forwardRef(function ResizableElement( + props: ResizableElementProps, + ref?: React.LegacyRef, +) { + const { + children, + className = '', + resizingFallback = null, + hide = false, + } = props; + const { resizing } = React.useContext(ResizeElementContext); + + const childrenElement = React.useMemo(() => { + return typeof children === 'function' ? children(resizing) : children; + }, [children, resizing]); + return ( +
+ {hide + ? null + : resizing && resizingFallback + ? resizingFallback + : childrenElement} +
+ ); +}); + +ResizableElement.displayName = 'ResizableElement'; + +export default ResizableElement; diff --git a/src/src/components/ResizeElement/ResizeElement.d.ts b/src/src/components/ResizeElement/ResizeElement.d.ts new file mode 100644 index 00000000..cbd0dc0b --- /dev/null +++ b/src/src/components/ResizeElement/ResizeElement.d.ts @@ -0,0 +1,31 @@ +import React from 'react'; +import { HeightProperty, WidthProperty } from 'csstype'; + +import { ResizableSideEnum } from './'; + +export interface ResizeElementProps { + id?: string; + children: React.ReactNode; + side?: ResizableSideEnum; + gutterSize?: number; + snapOffset?: number; + useLocalStorage?: boolean; + initialSizes: { + width?: WidthProperty; + height?: HeightProperty; + maxWidth: number; + maxHeight: number; + }; + onResizeStart?: ( + resizeElement: React.RefObject, + gutterSize: number, + ) => void; + onResize?: ( + resizeElement: React.RefObject, + gutterSize: number, + ) => void; + onResizeEnd?: ( + resizeElement: React.RefObject, + gutterSize: number, + ) => void; +} diff --git a/src/src/components/ResizeElement/ResizeElement.scss b/src/src/components/ResizeElement/ResizeElement.scss new file mode 100644 index 00000000..c797c90e --- /dev/null +++ b/src/src/components/ResizeElement/ResizeElement.scss @@ -0,0 +1,49 @@ +@use 'src/styles/abstracts' as *; + +.ResizeElement { + position: relative; + display: flex; + overflow: scroll; + &__gutter { + position: absolute; + display: inline-flex; + z-index: 1; + transition: all 0.25s cubic-bezier(1,.14,1,.5); + &__left { + cursor: col-resize; + height: 100%; + left: 0; + top: 0; + box-shadow: inset 2px 0 0 0 $primary-color-20; + } + &__right { + cursor: col-resize; + height: 100%; + right: 0; + top: 0; + box-shadow: inset 2px 0 0 0 $primary-color-20; + } + &__top { + cursor: row-resize; + width: 100%; + left: 0; + top: 0; + box-shadow: inset 0 2px 0 0 $primary-color-20; + } + &__bottom { + cursor: row-resize; + width: 100%; + left: 0; + bottom: 0; + box-shadow: inset 0 -2px 0 0 $primary-color-20; + } + &:hover, &:active { + background-color: $primary-color-50; + box-shadow: unset; + } + } + & > .ResizableElement { + width: 100%; + height: 100%; + } +} diff --git a/src/src/components/ResizeElement/ResizeElement.tsx b/src/src/components/ResizeElement/ResizeElement.tsx new file mode 100644 index 00000000..f8115692 --- /dev/null +++ b/src/src/components/ResizeElement/ResizeElement.tsx @@ -0,0 +1,234 @@ +import * as React from 'react'; +import { WidthProperty, HeightProperty } from 'csstype'; + +import ErrorBoundary from 'components/ErrorBoundary'; + +import { + ResizeElementProps, + ResizeElementContext, + ResizableSideEnum, +} from './'; + +import './ResizeElement.scss'; + +function ResizeElement(props: ResizeElementProps) { + const { + id = 'ResizeElement', + children, + gutterSize = 4, + snapOffset = 0, + side = ResizableSideEnum.LEFT, + initialSizes, + useLocalStorage = false, + onResizeEnd, + onResizeStart, + onResize, + } = props; + const containerRef = React.useRef(null); + const gutterElemRef = React.useRef(null); + const containerRectRef = React.useRef(); + + const [resizing, setResizing] = React.useState(false); + + const isHorizontal = [ + ResizableSideEnum.LEFT, + ResizableSideEnum.RIGHT, + ].includes(side); + + const containerInitialSize = React.useMemo( + () => ({ + width: '100%' as WidthProperty, + height: '100%' as HeightProperty, + ...initialSizes, + }), + [initialSizes], + ); + + const getResizeHandler = React.useCallback( + (side: ResizableSideEnum, containerNode: HTMLElement) => { + const { maxWidth, maxHeight } = containerInitialSize; + + const checkVerticalBounds = (height: number) => { + return !(height < gutterSize || (maxHeight && height > maxHeight)); + }; + const checkHorizontalBounds = (width: number) => { + return !(width < gutterSize || (maxWidth && width > maxWidth)); + }; + + const getSize = (size: number, maxSize?: number): number => { + let newSize; + if (size < snapOffset) { + newSize = gutterSize; + } else if (maxSize && maxSize - size < snapOffset) { + newSize = maxSize; + } else { + newSize = size; + } + return newSize; + }; + const setHeight = (height: number) => { + const newHeight = getSize(height, maxHeight); + containerNode.style.height = `${newHeight}px`; + }; + const setWidth = (width: number) => { + const newWidth = getSize(width, maxWidth); + containerNode.style.width = `${newWidth}px`; + }; + + const dict = { + [ResizableSideEnum.LEFT]: (e: MouseEvent, rect: DOMRect) => { + const width = rect.right - e.pageX; + if (checkHorizontalBounds(width)) { + setWidth(width); + } + }, + [ResizableSideEnum.RIGHT]: (e: MouseEvent, rect: DOMRect) => { + const width = e.pageX - rect.left; + if (checkHorizontalBounds(width)) { + setWidth(width); + } + }, + [ResizableSideEnum.TOP]: (e: MouseEvent, rect: DOMRect) => { + const height = rect.bottom - e.pageY; + if (checkVerticalBounds(height)) { + setHeight(height); + } + }, + [ResizableSideEnum.BOTTOM]: (e: MouseEvent, rect: DOMRect) => { + const height = e.pageY - rect.top; + if (checkVerticalBounds(height)) { + setHeight(height); + } + }, + }; + return dict[side]; + }, + [gutterSize, snapOffset, containerInitialSize], + ); + + const getStringifiedSize = (size: string | number) => { + return typeof size === 'string' ? size : `${size}px`; + }; + + React.useEffect(() => { + const containerNode = containerRef.current; + if (!containerNode) return; + + /** + * Set initial sizes + */ + const { maxHeight, maxWidth } = containerInitialSize; + containerNode.style.maxHeight = getStringifiedSize(maxHeight); + containerNode.style.maxWidth = getStringifiedSize(maxWidth); + + if (useLocalStorage) { + const savedSizes = localStorage.getItem(id); + if (savedSizes) { + const { width, height } = JSON.parse(savedSizes); + + containerNode.style.width = width; + containerNode.style.height = height; + return; + } + } + + const { width, height } = containerInitialSize; + containerNode.style.width = getStringifiedSize(width); + containerNode.style.height = getStringifiedSize(height); + }, [containerInitialSize, useLocalStorage, id]); + + React.useEffect(() => { + const containerNode = containerRef.current; + const gutterNode = gutterElemRef.current; + if (!containerNode || !gutterNode) return; + + /** + * Set resize listeners/handlers + */ + const resizeHandler = getResizeHandler(side, containerNode); + + const onMouseMove = (e: MouseEvent) => { + e.stopPropagation(); + const rect = containerRectRef.current as DOMRect; + resizeHandler(e, rect); + onResize && onResize(containerRef, gutterSize); + }; + + const onMouseUp = (e: MouseEvent) => { + e.stopPropagation(); + setResizing(false); + document.removeEventListener('mousemove', onMouseMove); + document.removeEventListener('mouseup', onMouseUp); + document.body.style.userSelect = 'unset'; + document.body.style.cursor = 'unset'; + document.body.style.pointerEvents = 'unset'; + if (useLocalStorage) { + const { offsetWidth, offsetHeight } = containerNode; + const sizes: Record = { + width: + offsetWidth < snapOffset + ? getStringifiedSize(containerInitialSize.width) + : containerNode.style.width, + height: + offsetHeight < snapOffset + ? getStringifiedSize(containerInitialSize.height) + : containerNode.style.height, + }; + localStorage.setItem(id, JSON.stringify(sizes)); + } + onResizeEnd && onResizeEnd(containerRef, gutterSize); + }; + + const onMouseDown = (e: MouseEvent) => { + e.stopPropagation(); + setResizing(true); + document.body.style.pointerEvents = 'none'; + document.body.style.userSelect = 'none'; + document.body.style.cursor = isHorizontal ? 'col-resize' : 'row-resize'; + document.addEventListener('mousemove', onMouseMove); + document.addEventListener('mouseup', onMouseUp); + containerRectRef.current = containerNode.getBoundingClientRect(); + onResizeStart && onResizeStart(containerRef, gutterSize); + }; + + gutterNode.addEventListener('mousedown', onMouseDown); + return () => { + gutterNode.removeEventListener('mousedown', onMouseDown); + }; + }, [ + side, + id, + useLocalStorage, + isHorizontal, + gutterSize, + snapOffset, + getResizeHandler, + onResize, + onResizeEnd, + onResizeStart, + containerInitialSize, + ]); + + const gutterStyle = { + width: isHorizontal ? gutterSize : '100%', + height: !isHorizontal ? gutterSize : '100%', + }; + return ( + + +
+
+ {children} +
+ + + ); +} + +ResizeElement.displayName = 'ResizeElement'; + +export default React.memo(ResizeElement); diff --git a/src/src/components/ResizeElement/context.ts b/src/src/components/ResizeElement/context.ts new file mode 100644 index 00000000..125e7b0b --- /dev/null +++ b/src/src/components/ResizeElement/context.ts @@ -0,0 +1,7 @@ +import * as React from 'react'; + +const ResizeElementContext = React.createContext({ + resizing: false, +}); + +export default ResizeElementContext; diff --git a/src/src/components/ResizeElement/index.ts b/src/src/components/ResizeElement/index.ts new file mode 100644 index 00000000..efd4778f --- /dev/null +++ b/src/src/components/ResizeElement/index.ts @@ -0,0 +1,16 @@ +import ResizeElement from './ResizeElement'; +import ResizableElement from './ResizableElement'; +import ResizeElementContext from './context'; + +export * from './ResizeElement.d'; +export * from './ResizableElement.d'; + +enum ResizableSideEnum { + LEFT = 'left', + RIGHT = 'right', + TOP = 'top', + BOTTOM = 'bottom', +} + +export { ResizableElement, ResizeElementContext, ResizableSideEnum }; +export default ResizeElement; diff --git a/src/src/components/ResizeModeActions/ResizeModeActions.scss b/src/src/components/ResizeModeActions/ResizeModeActions.scss new file mode 100644 index 00000000..b7c711e8 --- /dev/null +++ b/src/src/components/ResizeModeActions/ResizeModeActions.scss @@ -0,0 +1,23 @@ +.ResizeModeActions { + padding-right: 1rem; + display: flex; + align-items: center; + justify-content: center; + border-right: 0.0625rem solid #e8f1fd; + margin-right: 1rem; + + button { + &:nth-child(2) { + margin: 0 0.25rem; + } + } + + &__fullHeight { + padding: 0.25rem; + button { + &:nth-child(2) { + margin: 0 0.25rem; + } + } + } +} diff --git a/src/src/components/ResizeModeActions/ResizeModeActions.tsx b/src/src/components/ResizeModeActions/ResizeModeActions.tsx new file mode 100644 index 00000000..4fff41c1 --- /dev/null +++ b/src/src/components/ResizeModeActions/ResizeModeActions.tsx @@ -0,0 +1,56 @@ +import React from 'react'; + +import { IconName } from 'components/kit/Icon'; +import { Button, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { IResizeModeActions } from 'types/components/ResizeModeActions/ResizeModeActions'; + +import './ResizeModeActions.scss'; + +const resizeButtons: { mode: ResizeModeEnum; icon: IconName }[] = [ + { + mode: ResizeModeEnum.Hide, + icon: 'table-resize-hide', + }, + { + mode: ResizeModeEnum.Resizable, + icon: 'table-resize-resizable', + }, + { + mode: ResizeModeEnum.MaxHeight, + icon: 'table-resize-maximize', + }, +]; + +function ResizeModeActions({ + onTableResizeModeChange, + resizeMode, + className, +}: IResizeModeActions): React.FunctionComponentElement { + return ( + +
+ {resizeButtons.map(({ icon, mode }) => ( + + ))} +
+
+ ); +} + +export default ResizeModeActions; diff --git a/src/src/components/ResizePanel/ResizePanel.scss b/src/src/components/ResizePanel/ResizePanel.scss new file mode 100644 index 00000000..c5408e43 --- /dev/null +++ b/src/src/components/ResizePanel/ResizePanel.scss @@ -0,0 +1,28 @@ +@use 'src/styles/abstracts' as *; + +.ResizePanel { + cursor: row-resize; + justify-content: center; + display: flex; + align-items: center; + height: toRem(4px); + transition: all 0.15s ease-out 0.2s; + background-color: transparent; + box-shadow: inset 0 2px 0 0 $primary-color-20; + &:hover, + &:active, + &.resizing { + background-color: $primary-color-50; + box-shadow: unset; + } + &__fullHeight { + background-color: $cuddle-10; + border-top: $border-main; + display: flex; + justify-content: center; + align-items: center; + } + &__hidden { + display: none; + } +} diff --git a/src/src/components/ResizePanel/ResizePanel.tsx b/src/src/components/ResizePanel/ResizePanel.tsx new file mode 100644 index 00000000..8409c618 --- /dev/null +++ b/src/src/components/ResizePanel/ResizePanel.tsx @@ -0,0 +1,42 @@ +import React from 'react'; + +import ResizeModeActions from 'components/ResizeModeActions/ResizeModeActions'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { IResizePanelProps } from 'types/components/ResizePanel/ResizePanel'; + +import './ResizePanel.scss'; + +function ResizePanel({ + panelResizing, + resizeElemRef, + resizeMode, + onTableResizeModeChange, + className, +}: IResizePanelProps): React.FunctionComponentElement | null { + return ( + +
+ {resizeMode === ResizeModeEnum.Hide ? ( + + ) : null} +
+
+ ); +} + +export default React.memo(ResizePanel); diff --git a/src/src/components/ResizingFallback/ResizingFallback.scss b/src/src/components/ResizingFallback/ResizingFallback.scss new file mode 100644 index 00000000..153cd57f --- /dev/null +++ b/src/src/components/ResizingFallback/ResizingFallback.scss @@ -0,0 +1,16 @@ +@use 'src/styles/abstracts' as *; + +.ResizingFallback { + display: flex; + width: 100%; + height: 100%; + flex-direction: column; + align-items: center; + justify-content: center; + background-color: $primary-color-5; + user-select: none; + text-align: center; + &__text { + padding: $space-xxs $space-sm; + } +} diff --git a/src/src/components/ResizingFallback/ResizingFallback.tsx b/src/src/components/ResizingFallback/ResizingFallback.tsx new file mode 100644 index 00000000..d589c2df --- /dev/null +++ b/src/src/components/ResizingFallback/ResizingFallback.tsx @@ -0,0 +1,17 @@ +import React from 'react'; + +import { Text } from 'components/kit'; + +import './ResizingFallback.scss'; + +function ResizingFallback() { + return ( +
+ + Release to resize + +
+ ); +} + +export default React.memo(ResizingFallback); diff --git a/src/src/components/ResizingFallback/index.ts b/src/src/components/ResizingFallback/index.ts new file mode 100644 index 00000000..9086fe25 --- /dev/null +++ b/src/src/components/ResizingFallback/index.ts @@ -0,0 +1,3 @@ +import ResizingFallback from './ResizingFallback'; + +export default ResizingFallback; diff --git a/src/src/components/RouteLeavingGuard/RouteLeavingGuard.d.ts b/src/src/components/RouteLeavingGuard/RouteLeavingGuard.d.ts new file mode 100644 index 00000000..cf96252e --- /dev/null +++ b/src/src/components/RouteLeavingGuard/RouteLeavingGuard.d.ts @@ -0,0 +1,5 @@ +export interface IRouteLeavingGuardProps { + when: boolean; + message?: string; + confirmBtnText?: string; +} diff --git a/src/src/components/RouteLeavingGuard/RouteLeavingGuard.tsx b/src/src/components/RouteLeavingGuard/RouteLeavingGuard.tsx new file mode 100644 index 00000000..ed8d3894 --- /dev/null +++ b/src/src/components/RouteLeavingGuard/RouteLeavingGuard.tsx @@ -0,0 +1,84 @@ +import React from 'react'; +import { Prompt, useHistory } from 'react-router-dom'; + +import ConfirmModal from 'components/ConfirmModal/ConfirmModal'; +import { Icon } from 'components/kit'; + +import { IRouteLeavingGuardProps } from './RouteLeavingGuard.d'; + +function RouteLeavingGuard({ + when, + message = 'Changes you made may not be saved.', + confirmBtnText = 'Leave', +}: IRouteLeavingGuardProps) { + const [openModal, setOpenModal] = React.useState(false); + const [nextLocation, setNextLocation] = React.useState(''); + const [confirmNavigation, setConfirmNavigation] = React.useState(false); + const history = useHistory(); + + React.useEffect(() => { + if (confirmNavigation) { + history.push(nextLocation); + setConfirmNavigation(false); + } + window.addEventListener('beforeunload', onBeforeUnload); + return () => { + window.removeEventListener('beforeunload', onBeforeUnload); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [confirmNavigation, when]); + + function onBeforeUnload(event: any): string | undefined { + if (!when) { + return; + } else { + event?.preventDefault(); + if (event) { + event.returnValue = + 'Your changes is not saved. Do you still want to leave'; + } + return ''; + } + } + + function showModal(location: string): void { + setOpenModal(true); + setNextLocation(location); + } + + function closeModal() { + setOpenModal(false); + } + + function handleBlockedNavigation(location: Location | any): boolean { + if (!confirmNavigation) { + showModal(location.pathname); + return false; + } + return true; + } + function handleConfirm(): void { + closeModal(); + if (nextLocation) { + setConfirmNavigation(true); + } + } + + return ( + <> + + } + statusType='warning' + confirmBtnText={confirmBtnText} + title='Are you sure' + /> + + ); +} + +export default RouteLeavingGuard; diff --git a/src/src/components/RouteLeavingGuard/index.ts b/src/src/components/RouteLeavingGuard/index.ts new file mode 100644 index 00000000..166e1ab5 --- /dev/null +++ b/src/src/components/RouteLeavingGuard/index.ts @@ -0,0 +1,5 @@ +import RouteLeavingGuard from './RouteLeavingGuard'; + +export * from './RouteLeavingGuard.d'; + +export default RouteLeavingGuard; diff --git a/src/src/components/ScatterPlot/ScatterPlot.tsx b/src/src/components/ScatterPlot/ScatterPlot.tsx new file mode 100644 index 00000000..c9d8b722 --- /dev/null +++ b/src/src/components/ScatterPlot/ScatterPlot.tsx @@ -0,0 +1,274 @@ +import React from 'react'; +import { useResizeObserver } from 'hooks'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IAttributesRef } from 'types/components/LineChart/LineChart'; +import { IFocusedState } from 'types/services/models/metrics/metricsAppModel'; + +import { + clearArea, + drawArea, + drawAxes, + getAxisScale, + drawHoverAttributes, + drawScatterTrendline, + drawPoints, + drawUnableToRender, +} from 'utils/d3'; + +import { IScatterPlotProps } from './types.d'; + +import './styles.scss'; + +const ScatterPlot = React.forwardRef(function ScatterPlot( + props: IScatterPlotProps, + ref, +): React.FunctionComponentElement { + const { + index, + id = `${index}`, + nameKey = '', + data: { dimensions, data }, + syncHoverState, + chartTitle, + trendlineOptions, + readOnly = false, + resizeMode, + onMount, + margin = { + top: 30, + right: 20, + bottom: 30, + left: 60, + }, + } = props; + + // boxes + const visBoxRef = React.useRef({ + margin, + height: 0, + width: 0, + }); + const plotBoxRef = React.useRef({ + height: 0, + width: 0, + }); + + // containers + const parentRef = React.useRef(null); + const visAreaRef = React.useRef(null); + + // d3 node elements + const svgNodeRef = React.useRef(null); + const bgRectNodeRef = React.useRef(null); + const plotNodeRef = React.useRef(null); + const axesNodeRef = React.useRef(null); + const linesNodeRef = React.useRef(null); + const attributesNodeRef = React.useRef(null); + const highlightedNodeRef = React.useRef(null); + + // methods and values refs + const axesRef = React.useRef({}); + const linesRef = React.useRef({}); + const attributesRef = React.useRef({}); + const humanizerConfigRef = React.useRef({}); + const rafIDRef = React.useRef(); + + const [yDimension, xDimension] = Object.values(dimensions); + + const unableToDrawConditions: { condition: boolean; text?: string }[] = []; + const updateDeps = [data, dimensions, trendlineOptions, readOnly, resizeMode]; + + function draw() { + drawArea({ + index, + id, + nameKey, + visBoxRef, + plotBoxRef, + parentRef, + visAreaRef, + svgNodeRef, + bgRectNodeRef, + plotNodeRef, + axesNodeRef, + linesNodeRef, + attributesNodeRef, + chartTitle, + }); + + const { width, height, margin } = visBoxRef.current; + + const axesScaleType = { + xAxis: xDimension.scaleType, + yAxis: yDimension.scaleType, + }; + + const xScale = getAxisScale({ + domainData: xDimension.domainData, + rangeData: [0, width - margin.left - margin.right], + scaleType: axesScaleType.xAxis, + }); + const yScale = getAxisScale({ + domainData: yDimension.domainData, + rangeData: [height - margin.top - margin.bottom, 0], + scaleType: axesScaleType.yAxis, + }); + + unableToDrawConditions.unshift({ + condition: + yDimension.domainData[0] === '-' || xDimension.domainData[0] === '-', + text: 'Unable to draw points with the current data. Please adjust the data.', + }); + + attributesRef.current.xScale = xScale; + attributesRef.current.yScale = yScale; + + drawAxes({ + svgNodeRef, + axesNodeRef, + axesRef, + plotBoxRef, + xScale, + yScale, + visBoxRef, + axesScaleType, + humanizerConfigRef, + drawBgTickLines: { y: true, x: true }, + }); + + drawPoints({ + index, + data, + nameKey, + xScale, + yScale, + pointsRef: linesRef, + pointsNodeRef: linesNodeRef, + }); + + if (!readOnly) { + drawHoverAttributes({ + index, + id, + nameKey, + data, + axesScaleType, + syncHoverState, + visAreaRef, + attributesRef, + plotBoxRef, + visBoxRef, + svgNodeRef, + bgRectNodeRef, + attributesNodeRef, + linesNodeRef, + highlightedNodeRef, + drawAxisLines: { x: false, y: false }, + drawAxisLabels: { x: false, y: false }, + }); + } + + if (trendlineOptions.isApplied) { + drawScatterTrendline({ + index, + nameKey, + data, + type: trendlineOptions.type, + bandwidth: trendlineOptions.bandwidth, + xScale, + yScale, + targetRef: linesNodeRef, + }); + } + + drawUnableToRender({ + renderArr: unableToDrawConditions, + visAreaRef, + attributesRef, + readOnly, + syncHoverState, + }); + } + + function renderChart() { + clearArea({ visAreaRef }); + draw(); + } + + const resizeObserverCallback: ResizeObserverCallback = React.useCallback( + (entries: ResizeObserverEntry[]) => { + if (entries?.length) { + rafIDRef.current = window.requestAnimationFrame(renderChart); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + updateDeps, + ); + + const observerReturnCallback = React.useCallback(() => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }, []); + + useResizeObserver(resizeObserverCallback, parentRef, observerReturnCallback); + + React.useEffect(() => { + rafIDRef.current = window.requestAnimationFrame(renderChart); + return () => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, updateDeps); + + React.useEffect(() => { + if (typeof onMount === 'function') { + onMount(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useImperativeHandle(ref, () => ({ + setActiveLineAndCircle: ( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => { + attributesRef.current.setActiveLineAndCircle?.( + lineKey, + focusedStateActive, + force, + ); + }, + updateHoverAttributes: (xValue: number, dataSelector?: string) => { + attributesRef.current.updateHoverAttributes?.(xValue, dataSelector); + }, + clearHoverAttributes: () => { + attributesRef.current.clearHoverAttributes?.(); + }, + setFocusedState: (focusedState: IFocusedState) => { + if (focusedState) { + attributesRef.current.focusedState = { + ...focusedState, + visId: focusedState.visId ?? `${focusedState.chartIndex}`, + }; + } + }, + })); + + return ( + +
+
+
+ + ); +}); + +ScatterPlot.displayName = 'ScatterPlot'; + +export default React.memo(ScatterPlot); diff --git a/src/src/components/ScatterPlot/index.ts b/src/src/components/ScatterPlot/index.ts new file mode 100644 index 00000000..9c176f70 --- /dev/null +++ b/src/src/components/ScatterPlot/index.ts @@ -0,0 +1,6 @@ +import ScatterPlot from './ScatterPlot'; + +export * from './types.d'; +export * from './ScatterPlot'; + +export default ScatterPlot; diff --git a/src/src/components/ScatterPlot/styles.scss b/src/src/components/ScatterPlot/styles.scss new file mode 100644 index 00000000..870efc9b --- /dev/null +++ b/src/src/components/ScatterPlot/styles.scss @@ -0,0 +1,98 @@ +@use 'src/styles/abstracts' as *; + +.ScatterPlot { + background-color: white; + height: 100%; + width: 100%; + position: relative; + overflow: hidden; + user-select: none; + min-width: toRem(150px); + min-height: toRem(150px); + .unableToDrawText { + font-size: $text-md; + text-align: center; + fill: $grey; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 80%; + } + &.backgroundRect { + cursor: crosshair; + } + &.zoomMode rect { + cursor: zoom-in; + } + .HoverCircle { + cursor: pointer; + opacity: 1; + stroke-width: 3; + fill: white; + border-radius: 50%; + paint-order: stroke; + /* on click */ + &.focus { + stroke-width: 4; + clip-path: unset; + &__shadow { + stroke-width: 12; + } + } + /* on hover */ + &.active { + stroke-width: 5; + } + } + .Attributes { + &.highlight > .HoverCircle:not(.active):not(.focus) { + opacity: 0.5; + } + } + .ChartMouseValue { + position: absolute; + box-sizing: border-box; + padding: $space-xxs $space-xs; + background-color: $primary-bg; + border: 1px solid $primary-light; + color: $primary-dark; + font-size: 10px; + font-weight: $font-400; + white-space: nowrap; + } + .ChartMouseValueXAxis { + transform: translateX(-50%); + border-radius: 0 0 6px 6px; + border-top: none; + overflow: hidden; + } + .ChartMouseValueYAxis { + transform: translateY(-50%); + border-radius: 6px 0 0 6px; + border-right: none; + overflow: hidden; + box-shadow: inset -8px 0 5px -6px #3b5896; /* var(--primary);*/ + } + .Lines { + overflow: hidden; + &.highlight > .Circle:not(.active):not(.highlighted) { + opacity: 0.2; + } + } + .Circle { + cursor: pointer; + opacity: 1; + stroke-width: 2.4; + fill: white; + outline: 0 solid; + border-radius: 50%; + paint-order: stroke; + &.active { + stroke-width: 5; + } + &.highlighted { + opacity: 1; + } + } +} diff --git a/src/src/components/ScatterPlot/types.d.ts b/src/src/components/ScatterPlot/types.d.ts new file mode 100644 index 00000000..8a23c904 --- /dev/null +++ b/src/src/components/ScatterPlot/types.d.ts @@ -0,0 +1,33 @@ +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { IChartTitle } from 'types/services/models/metrics/metricsAppModel'; +import { ITrendlineOptions } from 'types/services/models/scatter/scatterAppModel'; +import { ISyncHoverStateArgs } from 'types/utils/d3/drawHoverAttributes'; +import { IDimensionType } from 'types/utils/d3/drawParallelAxes'; +import { IRun } from 'types/services/models/metrics/runModel'; + +export interface IPoint { + key: string; + data: { + xValues: number[] | string[]; + yValues: number[] | string[]; + }; + color: string; + groupKey: string; + chartIndex?: number; + run?: IRun; +} + +export interface IScatterPlotProps { + index: number; + id?: string; + nameKey?: string; + data: { dimensions: IDimensionType[]; data: IPoint[] }; + chartTitle?: IChartTitle; + trendlineOptions: ITrendlineOptions; + syncHoverState: (args: ISyncHoverStateArgs) => void; + resizeMode?: ResizeModeEnum; + onMount?: () => void; + readOnly?: boolean; + margin?: { top: number; right: number; bottom: number; left: number }; +} diff --git a/src/src/components/SelectTag/SelectTag.scss b/src/src/components/SelectTag/SelectTag.scss new file mode 100644 index 00000000..dc4db4cf --- /dev/null +++ b/src/src/components/SelectTag/SelectTag.scss @@ -0,0 +1,87 @@ +@use 'src/styles/abstracts' as *; + +.SelectTag { + max-width: 20rem; + width: 20rem; + max-height: 240px; + display: flex; + flex-direction: column; + &__searchBarContainer { + padding: $space-xs; + } + &__tags { + overflow: auto; + max-height: 200px; + flex: 1 1; + .icon-check { + padding: 0; + } + + &__item { + display: flex; + width: 100%; + max-width: 100%; + border-bottom: $border-main; + padding: $space-xs toRem(25px) $space-xs toRem(30px); + position: relative; + cursor: pointer; + &:hover { + background-color: $cuddle-20; + } + &:last-child { + border-bottom: $border-transparent; + } + &__checkedIcon { + position: absolute; + left: toRem(10px); + top: $space-xs; + } + &__deleteButton { + position: absolute; + right: toRem(10px); + top: $space-xxs; + } + &__content { + display: flex; + max-width: 100%; + flex-direction: column; + width: 100%; + padding-right: $space-xxxs; + + &__nameWrapper { + display: flex; + align-items: flex-start; + &__name { + word-break: break-all; + } + &__colorBadge { + width: toRem(14px); + min-width: toRem(14px); + height: toRem(14px); + display: block; + border-radius: $border-radius-circle; + margin-right: $space-xxxs; + } + } + + &__description { + margin-top: $space-xxxxs; + word-break: break-all; + } + } + } + } + + &__noTags { + padding: 1rem 0; + display: flex; + justify-content: center; + flex: 1; + align-items: center; + } + + &__createTag__container { + padding: $space-xs $space-unit; + text-align: center; + } +} diff --git a/src/src/components/SelectTag/SelectTag.tsx b/src/src/components/SelectTag/SelectTag.tsx new file mode 100644 index 00000000..36ec04b1 --- /dev/null +++ b/src/src/components/SelectTag/SelectTag.tsx @@ -0,0 +1,245 @@ +import React from 'react'; +import _ from 'lodash-es'; +import { Link as RouteLink } from 'react-router-dom'; + +import { Divider, Link } from '@material-ui/core'; + +import { Text, Button, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import SearchInput from 'components/kit/DataList/SearchBar/SearchInput'; + +import { PathEnum } from 'config/enums/routesEnum'; + +import tagsService from 'services/api/tags/tagsService'; +import runsService from 'services/api/runs/runsService'; + +import { ISelectTagProps } from 'types/components/SelectTag/SelectTag'; +import { ITagInfo, ITagInfoWithSelectedProperty } from 'types/pages/tags/Tags'; + +import './SelectTag.scss'; + +function SelectTag({ + runHash, + attachedTags, + setAttachedTags, + onRunsTagsChange, + updatePopover, +}: ISelectTagProps): JSX.Element { + const [tags, setTags] = React.useState([]); + const [searchValue, setSearchValue] = React.useState(''); + const [sortedTags, setSortedTags] = React.useState< + ITagInfoWithSelectedProperty[] + >([]); + const getTagsRef = React.useRef(null); + const attachTagToRunRef = React.useRef(null); + const deleteRunsTagRef = React.useRef(null); + + const addSelectedPropertyToTags = function ( + tags: ITagInfo[], + ): ITagInfoWithSelectedProperty[] { + return tags.map((tag: ITagInfo) => { + const selected = !!attachedTags.find( + (attachedTag) => attachedTag.id === tag.id, + ); + return { ...tag, selected }; + }); + }; + + const deleteRunsTag = React.useCallback( + (run_id: string, tag: ITagInfo): void => { + deleteRunsTagRef.current = runsService?.deleteRunsTag(run_id, tag.id); + deleteRunsTagRef.current.call(); + }, + [], + ); + + const onAttachedTagDelete = React.useCallback( + (e): void => { + const tag_id = e.currentTarget?.id; + const tag = attachedTags.find((tag) => tag.id === tag_id); + if (tag) { + const resultTags: ITagInfo[] = attachedTags.filter( + (t) => tag.id !== t.id, + ); + setAttachedTags(resultTags); + deleteRunsTag(runHash, tag); + onRunsTagsChange && onRunsTagsChange(runHash, resultTags); + setSortedTags((sT) => + sT.map((tag: ITagInfoWithSelectedProperty) => { + if (tag.id === tag_id) { + return { ...tag, selected: false }; + } + return tag; + }), + ); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [onRunsTagsChange, setAttachedTags, attachedTags, deleteRunsTag, runHash], + ); + + const attachTagToRun = React.useCallback((tag: ITagInfo, run_id: string) => { + attachTagToRunRef.current = runsService?.attachRunsTag( + { tag_name: tag.name }, + run_id, + ); + attachTagToRunRef.current.call(); + }, []); + + const onAttachedTagAdd = React.useCallback( + (e: React.MouseEvent): void => { + const tag_id = e.currentTarget?.id; + if (!attachedTags.find((tag) => tag.id === tag_id)) { + const tag = tags.find((tag) => tag.id === tag_id); + if (tag) { + setAttachedTags((prevState) => [...prevState, tag]); + attachTagToRun(tag, runHash); + onRunsTagsChange && onRunsTagsChange(runHash, [...attachedTags, tag]); + setSortedTags((sT) => + sT.map((tag: ITagInfoWithSelectedProperty) => { + if (tag.id === tag_id) { + return { ...tag, selected: true }; + } + return tag; + }), + ); + } + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [ + attachedTags, + attachTagToRun, + runHash, + setAttachedTags, + tags, + onRunsTagsChange, + ], + ); + + React.useEffect(() => { + if (runHash) { + getTagsRef.current = tagsService?.getTags(); + getTagsRef.current?.call().then((tags: ITagInfo[]) => { + setSortedTags( + tags + ? _.orderBy( + addSelectedPropertyToTags(tags), + ['selected', 'name'], + ['desc', 'asc'], + ) + : [], + ); + setTags(tags ?? []); + if (updatePopover) { + updatePopover(`${Date.now()}`); + } + }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [runHash]); + + const filteredTagsList = React.useMemo(() => { + if (searchValue) { + return sortedTags.filter((tag) => + tag.name.toLowerCase().includes(searchValue.toLowerCase()), + ); + } + return sortedTags; + }, [searchValue, sortedTags]); + + React.useEffect(() => { + return () => { + getTagsRef.current?.abort(); + attachTagToRunRef.current?.abort(); + deleteRunsTagRef.current?.abort(); + }; + }, []); + + return ( + +
+
+ setSearchValue('')} + onInputChange={(value) => setSearchValue(value)} + isDisabled={_.isEmpty(sortedTags)} + isValidInput={true} + /> +
+ + {filteredTagsList?.length > 0 ? ( +
+ {filteredTagsList.map((tag: ITagInfoWithSelectedProperty) => { + return ( +
+ tag.selected ? onAttachedTagDelete(e) : onAttachedTagAdd(e) + } + > + {tag.selected && ( + + )} +
+
+ + + {tag.name} + +
+ {tag.description ? ( + + {tag.description} + + ) : null} +
+
+ ); + })} +
+ ) : ( +
+ + No Tags Found + +
+ )} + +
+ + + +
+
+
+ ); +} + +export default React.memo(SelectTag); diff --git a/src/src/components/SideBar/SideBar.tsx b/src/src/components/SideBar/SideBar.tsx new file mode 100644 index 00000000..e94ab360 --- /dev/null +++ b/src/src/components/SideBar/SideBar.tsx @@ -0,0 +1,120 @@ +import React from 'react'; +import { NavLink } from 'react-router-dom'; + +import { Drawer, Tooltip } from '@material-ui/core'; + +import logoImg from 'assets/logo.svg'; +import { ReactComponent as DiscordIcon } from 'assets/icons/discord.svg'; + +import { Icon, Text } from 'components/kit'; +import { IconName } from 'components/kit/Icon'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import CommunityPopup from 'components/CommunityPopup'; + +import { PathEnum } from 'config/enums/routesEnum'; +import { AIM_VERSION } from 'config/config'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DOCUMENTATIONS } from 'config/references'; + +import routes, { IRoute } from 'routes/routes'; + +import { trackEvent } from 'services/analytics'; + +import { getItem } from 'utils/storage'; + +import './Sidebar.scss'; + +function SideBar(): React.FunctionComponentElement { + function getPathFromStorage(route: PathEnum): PathEnum | string { + const path = getItem(`${route.slice(1)}Url`) ?? ''; + if (path !== '' && path.startsWith(route)) { + return path; + } + return route; + } + + return ( + +
+ +
    + +
  • + logo +
  • +
    +
    + {Object.values(routes).map((route: IRoute, index: number) => { + const { showInSidebar, path, displayName, icon } = route; + return ( + showInSidebar && ( + getPathFromStorage(path)} + exact={true} + isActive={(m, location) => + location.pathname.split('/')[1] === path.split('/')[1] + } + activeClassName='Sidebar__NavLink--active' + className='Sidebar__NavLink' + > +
  • + + + {displayName} + +
  • +
    + ) + ); + })} +
    +
+ +
+
+
+ ); +} + +export default React.memo(SideBar); diff --git a/src/src/components/SideBar/Sidebar.scss b/src/src/components/SideBar/Sidebar.scss new file mode 100644 index 00000000..7cb3f4a0 --- /dev/null +++ b/src/src/components/SideBar/Sidebar.scss @@ -0,0 +1,105 @@ +@use 'src/styles/abstracts' as *; + +.Sidebar { + width: 75px; + max-width: 75px; + position: relative; + z-index: 10; + .MuiDrawer-paperAnchorDockedLeft { + border-right: unset; + } + .MuiDrawer-paper { + top: unset; + } + &__Paper { + background-color: #1d2253; + width: 75.6px; + overflow: hidden; + } + &__List { + flex: 1 100%; + padding: 0; + overflow: hidden; + display: flex; + flex-direction: column; + &__container { + overflow: hidden auto; + } + &__item { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: 80px; + padding: 0.5rem; + img { + width: 2.25rem; + margin: auto; + } + &--icon { + color: #fff; + } + &--text { + margin-top: 6px; + font-size: 0.7rem; + font-style: normal; + font-weight: $font-500; + color: #fff; + } + } + } + &__NavLink { + position: relative; + text-decoration: none; + &--active { + display: block; + &:before { + content: ''; + position: absolute; + top: 20px; + left: 0px; + height: 40px; + width: 3px; + background-color: #ffff; + border-radius: 0 0.375rem 0.375rem 0; + } + } + } + &__bottom { + padding-top: $space-xxxs; + position: relative; + padding-bottom: $space-md; + display: flex; + flex-direction: column; + &__anchor { + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: $text-xxl; + text-align: center; + color: $pico-20; + text-decoration: none; + height: toRem(44px); + transition: color 0.18s ease-out; + &:hover { + color: $white; + svg { + fill: $white; + } + } + } + &::before { + content: ''; + width: toRem(40px); + left: calc(50% - 1.25rem); + border-top: 1px solid $pico-70; + position: absolute; + top: 0; + } + & > span { + text-align: center; + margin-top: $space-xs; + } + } +} diff --git a/src/src/components/SliderWithInput/SliderWithInput.scss b/src/src/components/SliderWithInput/SliderWithInput.scss new file mode 100644 index 00000000..ec72ba89 --- /dev/null +++ b/src/src/components/SliderWithInput/SliderWithInput.scss @@ -0,0 +1,86 @@ +@use 'src/styles/abstracts' as *; + +.SliderWithInput { + display: flex; + align-items: center; + height: 100%; + max-width: toRem(520px); + width: 100%; + &__densityWrapper { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + &__densityField { + width: 5.375rem; + height: 1.25rem; + border: 0.0625rem solid $cuddle-70; + border-radius: $border-radius-xss; + font-size: 0.625rem; + font-weight: $font-600; + color: $pico-80; + padding-left: 0.375rem; + /* Chrome, Safari, Edge, Opera */ + &::-webkit-outer-spin-button, + &::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + + /* Firefox */ + &[type='number'] { + -moz-appearance: textfield; + } + &:focus-visible { + outline: unset; + } + } + &__densityTitleBox { + display: flex; + &__labelTooltip { + background-color: $pico-70; + width: 0.6875rem; + height: 0.6875rem; + color: $white; + font-size: 0.4375rem; + display: flex; + align-items: center; + justify-content: center; + border-radius: $border-radius-circle; + margin-top: 0.0625rem; + cursor: pointer; + } + &__densityFieldLabel { + margin-right: 0.16rem; + min-width: 4.4rem; + margin-bottom: 0.1875rem; + } + } + } + &__sliderWrapper { + max-width: 24.875rem; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; + margin-right: 2rem; + padding-bottom: toRem(8px); + .Slider { + padding-bottom: toRem(3px); + } + &__sliderTitleBox { + line-height: toRem(18px); + } + &__title { + margin-right: 0.25rem; + font-size: $text-xxs; + font-weight: $font-400; + color: $pico-70; + } + &__sliderValuesLabel { + width: 4.875rem; + margin-right: 0.5rem; + } + } +} diff --git a/src/src/components/SliderWithInput/SliderWithInput.tsx b/src/src/components/SliderWithInput/SliderWithInput.tsx new file mode 100644 index 00000000..74b5f6ad --- /dev/null +++ b/src/src/components/SliderWithInput/SliderWithInput.tsx @@ -0,0 +1,118 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import { Text, Slider, InputWrapper } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ISliderWithInputProps } from './types.d'; + +import './SliderWithInput.scss'; + +/** + * @property {string} sliderTitle - title of slider + * @property {string} countInputTitle - title of count input + * @property {number} selectedRangeValue - selected range value + * @property {number} selectedCountValue - selected input value + * @property {function} onSearch - search method + * @property {function} onCountChange - count change method + * @property {function} onRangeChange - range change method + * @property {number} min - minimum range value + * @property {number} max - maximum range value + * @property {string} sliderTitleTooltip - tooltip value of slider title + * @property {string} countTitleTooltip - tooltip value of count title + */ + +function SliderWithInput({ + sliderTitle, + countInputTitle, + selectedRangeValue, + selectedCountValue, + onSearch, + onCountChange, + onRangeChange, + min, + max, + sliderTitleTooltip, + countTitleTooltip, + sliderType = 'range', + inputValidationPatterns, +}: ISliderWithInputProps): React.FunctionComponentElement { + return ( + +
+
+
+ {sliderTitleTooltip ? ( + + + {sliderTitle}: + + + ) : ( + + {sliderTitle}: + + )} + {`${selectedRangeValue[0]} - ${selectedRangeValue[1]}`} +
+ {sliderType === 'single' ? ( + { + onCountChange(value); + }} + getAriaValueText={(value) => `${value}`} + aria-labelledby='track-false-slider' + track={false} + min={selectedRangeValue[0]} + max={selectedRangeValue[1]} + valueLabelDisplay='auto' + /> + ) : ( + onRangeChange(value)) as any} + min={min} + max={max} + valueLabelDisplay='auto' + getAriaValueText={(value) => `${value}`} + onKeyPress={(e) => { + if (e.which === 13) { + onSearch(); + } + }} + /> + )} +
+
+ { + onCountChange(value, metadata); + }} + validationPatterns={inputValidationPatterns ?? []} + /> +
+
+
+ ); +} + +SliderWithInput.displayName = 'SliderWithInput'; + +export default React.memo(SliderWithInput); diff --git a/src/src/components/SliderWithInput/index.ts b/src/src/components/SliderWithInput/index.ts new file mode 100644 index 00000000..d17dddb0 --- /dev/null +++ b/src/src/components/SliderWithInput/index.ts @@ -0,0 +1,5 @@ +import SliderWithInput from './SliderWithInput'; + +export * from './types.d'; + +export default SliderWithInput; diff --git a/src/src/components/SliderWithInput/types.d.ts b/src/src/components/SliderWithInput/types.d.ts new file mode 100644 index 00000000..1c37cc64 --- /dev/null +++ b/src/src/components/SliderWithInput/types.d.ts @@ -0,0 +1,17 @@ +import { IValidationMetadata } from 'components/kit/Input'; + +export interface ISliderWithInputProps { + sliderTitle: string; + countInputTitle: string; + sliderTitleTooltip?: string; + countTitleTooltip?: string; + min: number; + max: number; + selectedRangeValue: number[]; + selectedCountValue: number; + sliderType?: 'range' | 'single'; + onSearch: () => void; + onCountChange: (value: number, metadata?: IValidationMetadata) => void; + onRangeChange: (newValue: number[] | number) => void; + inputValidationPatterns?: IValidationPatterns; +} diff --git a/src/src/components/SmoothingPopover/SmoothingPopover.scss b/src/src/components/SmoothingPopover/SmoothingPopover.scss new file mode 100644 index 00000000..6f844324 --- /dev/null +++ b/src/src/components/SmoothingPopover/SmoothingPopover.scss @@ -0,0 +1,21 @@ +@use 'src/styles/abstracts' as *; + +.SmoothingPopover { + width: 24.5rem; + padding: $space-xs; + &__Divider { + margin: $space-xs 0; + } + + &__subtitle { + text-transform: uppercase; + padding: $space-xs $space-xs; + } + &__ToggleButton { + padding: 0 $space-xs; + } + + &__Slider { + margin: 0 $space-xs; + } +} diff --git a/src/src/components/SmoothingPopover/SmoothingPopover.tsx b/src/src/components/SmoothingPopover/SmoothingPopover.tsx new file mode 100644 index 00000000..4bcd30cf --- /dev/null +++ b/src/src/components/SmoothingPopover/SmoothingPopover.tsx @@ -0,0 +1,159 @@ +import React from 'react'; + +import { Divider, MenuItem, Slider } from '@material-ui/core'; + +import { Text, ToggleButton } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import { ISmoothingPopoverProps } from 'types/components/SmoothingPopover/SmoothingPopover'; + +import { SmoothingAlgorithmEnum } from 'utils/smoothingData'; +import { CurveEnum } from 'utils/d3'; + +import './SmoothingPopover.scss'; + +const emaProps = { + marks: [ + { value: 0, label: '0' }, + { value: 0.25, label: '0.25' }, + { value: 0.5, label: '0.5' }, + { value: 0.75, label: '0.75' }, + { value: 0.99, label: '0.99' }, + ], + step: 0.01, + min: 0, + max: 0.99, + default: CONTROLS_DEFAULT_CONFIG.metrics.smoothing.factor, +}; + +const cmaProps = { + marks: [ + { value: 1, label: '1' }, + { value: 25, label: '25' }, + { value: 51, label: '51' }, + { value: 75, label: '75' }, + { value: 99, label: '99' }, + ], + step: 2, + min: 1, + max: 99, + default: 59, +}; + +function SmoothingPopover( + props: ISmoothingPopoverProps, +): React.FunctionComponentElement { + const [factor, setFactor] = React.useState(props.smoothing.factor); + + const handleAlgorithmChange = React.useCallback( + (event): void => { + const factorMin: number = + event.target.id === SmoothingAlgorithmEnum.EMA + ? emaProps.default + : cmaProps.default; + setFactor(factorMin); + props.onSmoothingChange({ + algorithm: event.target.id, + factor: factorMin, + }); + }, + [props], + ); + + function handleFactorChange( + event: React.ChangeEvent, + val: number | any, + ): void { + if (val !== factor) { + setFactor(val); + } + } + + function handleInterpolation(value: CurveEnum, id: string | number): void { + props.onSmoothingChange({ + curveInterpolation: value, + }); + } + + function handleSmoothingData( + ev: React.ChangeEvent, + value: number | any, + ): void { + props.onSmoothingChange({ + factor: value, + }); + } + + const sliderProps = React.useMemo(() => { + return props.smoothing.algorithm === SmoothingAlgorithmEnum.EMA + ? emaProps + : cmaProps; + }, [props.smoothing.algorithm]); + + return ( + +
+
+ + Chart Smoothing + +
+ `${val}s`} + value={factor} + onChange={handleFactorChange} + onChangeCommitted={handleSmoothingData} + marks={sliderProps.marks} + step={sliderProps.step} + max={sliderProps.max} + min={sliderProps.min} + /> +
+
+ + Exponential Moving Average + + + Centred Moving Average + +
+
+ +
+ + Curve Interpolation method + + +
+
+
+ ); +} + +export default React.memo(SmoothingPopover); diff --git a/src/src/components/SplitPane/SplitPane.d.ts b/src/src/components/SplitPane/SplitPane.d.ts new file mode 100644 index 00000000..173d8182 --- /dev/null +++ b/src/src/components/SplitPane/SplitPane.d.ts @@ -0,0 +1,6 @@ +import { SplitProps } from 'react-split'; + +interface SplitPaneProps extends SplitProps { + resizing?: boolean; + useLocalStorage?: boolean; +} diff --git a/src/src/components/SplitPane/SplitPane.scss b/src/src/components/SplitPane/SplitPane.scss new file mode 100644 index 00000000..acc7601e --- /dev/null +++ b/src/src/components/SplitPane/SplitPane.scss @@ -0,0 +1,42 @@ +@use 'src/styles/abstracts' as *; + +.SplitPane { + display: flex; + width: 100%; + height: 100%; + .gutter { + transition: all 0.15s ease-out 0.2s; + background-color: white; + } + &.horizontal { + flex-direction: row; + .gutter-horizontal { + cursor: col-resize; + box-shadow: inset 2px 0 0 0 $primary-color-20; + &:hover, &:active { + background-color: $primary-color-50; + box-shadow: unset; + } + } + .SplitPaneItem { + overflow-x: auto; + } + } + &.vertical { + flex-direction: column; + .gutter-vertical { + cursor: row-resize; + box-shadow: inset 0 2px 0 0 $primary-color-20; + &:hover, &:active { + background-color: $primary-color-50; + box-shadow: unset; + } + } + .SplitPaneItem { + overflow-y: auto; + } + } + &.hide { + visibility: hidden; + } +} diff --git a/src/src/components/SplitPane/SplitPane.tsx b/src/src/components/SplitPane/SplitPane.tsx new file mode 100644 index 00000000..6477775f --- /dev/null +++ b/src/src/components/SplitPane/SplitPane.tsx @@ -0,0 +1,93 @@ +import * as React from 'react'; +import Split from 'react-split'; +import classNames from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { SplitPaneProps, SplitPaneContext } from '.'; + +import './SplitPane.scss'; + +function SplitPane(props: SplitPaneProps) { + const { + id = '', + sizes, + children, + resizing, + direction = 'horizontal', + gutterSize = 4, + className = '', + onDragStart, + onDragEnd, + useLocalStorage = false, + ...rest + } = props; + const [resizingPane, setResizingPane] = React.useState(false); + + const onResizeStart = React.useCallback( + (startSizes: number[]) => { + setResizingPane(true); + if (typeof onDragStart === 'function') { + onDragStart(startSizes); + } + }, + [onDragStart], + ); + + const onResizeEnd = React.useCallback( + (endSizes: number[]) => { + setResizingPane(false); + if (typeof onDragEnd === 'function') { + onDragEnd(endSizes); + } + if (useLocalStorage) { + localStorage.setItem(`${id}-panesSizes`, JSON.stringify(endSizes)); + } + }, + [onDragEnd, id, useLocalStorage], + ); + + const getSizes = React.useCallback( + (useLocalStorage: boolean, id: string, sizes?: number[]) => { + if (useLocalStorage) { + const savedSizes = localStorage.getItem(`${id}-panesSizes`); + if (savedSizes) { + return JSON.parse(savedSizes); + } + } + return sizes; + }, + [], + ); + + React.useEffect(() => { + if (typeof resizing === 'boolean') { + setResizingPane(resizing); + } + }, [resizing]); + + return ( + + + + {children} + + + + ); +} + +SplitPane.displayName = 'SplitPane'; + +export default SplitPane; diff --git a/src/src/components/SplitPane/SplitPaneItem.d.ts b/src/src/components/SplitPane/SplitPaneItem.d.ts new file mode 100644 index 00000000..fb842562 --- /dev/null +++ b/src/src/components/SplitPane/SplitPaneItem.d.ts @@ -0,0 +1,7 @@ +import * as React from 'react'; + +export interface SplitPaneItemProps extends React.HTMLAttributes { + resizingFallback?: React.ReactNode; + children: React.ReactNode | ((resizing: boolean) => React.ReactNode); + hide?: boolean; +} diff --git a/src/src/components/SplitPane/SplitPaneItem.tsx b/src/src/components/SplitPane/SplitPaneItem.tsx new file mode 100644 index 00000000..23ee3a18 --- /dev/null +++ b/src/src/components/SplitPane/SplitPaneItem.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import classNames from 'classnames'; + +import { SplitPaneContext, SplitPaneItemProps } from '.'; + +const SplitPaneItem = React.forwardRef(function SplitPaneItem( + props: SplitPaneItemProps, + ref?: React.LegacyRef, +) { + const { + children, + className = '', + resizingFallback = null, + hide = false, + } = props; + const { resizing } = React.useContext(SplitPaneContext); + + const childrenElement = React.useMemo(() => { + return typeof children === 'function' ? children(resizing) : children; + }, [children, resizing]); + return ( +
+ {hide + ? null + : resizing && resizingFallback + ? resizingFallback + : childrenElement} +
+ ); +}); + +SplitPaneItem.displayName = 'SplitPaneItem'; + +export default SplitPaneItem; diff --git a/src/src/components/SplitPane/context.ts b/src/src/components/SplitPane/context.ts new file mode 100644 index 00000000..3e28b619 --- /dev/null +++ b/src/src/components/SplitPane/context.ts @@ -0,0 +1,7 @@ +import * as React from 'react'; + +const SplitPaneContext = React.createContext({ + resizing: false, +}); + +export default SplitPaneContext; diff --git a/src/src/components/SplitPane/index.ts b/src/src/components/SplitPane/index.ts new file mode 100644 index 00000000..302ff852 --- /dev/null +++ b/src/src/components/SplitPane/index.ts @@ -0,0 +1,10 @@ +import SplitPane from './SplitPane'; +import SplitPaneItem from './SplitPaneItem'; +import SplitPaneContext from './context'; + +export * from './SplitPane.d'; +export * from './SplitPaneItem.d'; + +export { SplitPaneItem, SplitPaneContext }; + +export default SplitPane; diff --git a/src/src/components/StatisticsBar/StatisticsBar.d.ts b/src/src/components/StatisticsBar/StatisticsBar.d.ts new file mode 100644 index 00000000..a55fbea7 --- /dev/null +++ b/src/src/components/StatisticsBar/StatisticsBar.d.ts @@ -0,0 +1,20 @@ +type StatisticsBarItem = { + percent: number; + color: string; + label?: string; + highlighted?: boolean; +}; + +export interface IStatisticsBarProps { + data: Array; + width?: number | string; + height?: number | string; + onMouseOver?: (id: string, source: string) => void; + onMouseLeave?: () => void; +} + +export interface IBarStyle { + width: string; + left: number; + backgroundColor: string; +} diff --git a/src/src/components/StatisticsBar/StatisticsBar.scss b/src/src/components/StatisticsBar/StatisticsBar.scss new file mode 100644 index 00000000..641a6155 --- /dev/null +++ b/src/src/components/StatisticsBar/StatisticsBar.scss @@ -0,0 +1,27 @@ +@use 'src/styles/abstracts' as *; + +.StatisticsBar { + position: relative; + background-color: $pico-2; + border-radius: $border-radius-sm; + &__item { + display: inline-flex; + height: 100%; + position: absolute; + transition: all 0.18s ease-out; + &:first-child { + border-top-left-radius: $border-radius-sm; + border-bottom-left-radius: $border-radius-sm; + } + &:last-child { + border-top-right-radius: $border-radius-sm; + border-bottom-right-radius: $border-radius-sm; + } + &.highlighted { + z-index: 1; + height: calc(100% + 2px); + margin-top: -1px; + box-shadow: 0 0 0 2px white; + } + } +} diff --git a/src/src/components/StatisticsBar/StatisticsBar.tsx b/src/src/components/StatisticsBar/StatisticsBar.tsx new file mode 100644 index 00000000..66c91ca1 --- /dev/null +++ b/src/src/components/StatisticsBar/StatisticsBar.tsx @@ -0,0 +1,61 @@ +import * as React from 'react'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import { IBarStyle, IStatisticsBarProps } from '.'; + +import './StatisticsBar.scss'; + +function StatisticsBar({ + data = [], + width = '100%', + height = 8, + onMouseOver, + onMouseLeave, +}: IStatisticsBarProps) { + const onSafeMouseOver = React.useCallback( + (id: string) => { + if (typeof onMouseOver === 'function') { + onMouseOver(id, 'bar'); + } + }, + [onMouseOver], + ); + const barStyles = React.useMemo(() => { + const styles: IBarStyle[] = []; + for (let i = 0; i < data.length; i++) { + const item = data[i]; + const prevItemLeftPos = styles[i - 1]?.left || 0; + const prevItemPercent = data[i - 1]?.percent || 0; + const style = { + width: `${item.percent.toFixed(2)}%`, + left: i === 0 ? 0 : prevItemLeftPos + prevItemPercent, + backgroundColor: item.color, + }; + styles.push(style); + } + return styles; + }, [data]); + return ( +
+ {Object.values(data).map( + ({ percent, color, label = '', highlighted }, i) => + percent ? ( + +
onSafeMouseOver(label)} + /> + + ) : null, + )} +
+ ); +} + +StatisticsBar.displayName = 'StatisticsBar'; + +export default React.memo(StatisticsBar); diff --git a/src/src/components/StatisticsBar/index.ts b/src/src/components/StatisticsBar/index.ts new file mode 100644 index 00000000..353e7bbd --- /dev/null +++ b/src/src/components/StatisticsBar/index.ts @@ -0,0 +1,5 @@ +import StatisticsBar from './StatisticsBar'; + +export * from './StatisticsBar.d'; + +export default StatisticsBar; diff --git a/src/src/components/StatisticsCard/StatisticsCard.d.ts b/src/src/components/StatisticsCard/StatisticsCard.d.ts new file mode 100644 index 00000000..b9c7f069 --- /dev/null +++ b/src/src/components/StatisticsCard/StatisticsCard.d.ts @@ -0,0 +1,18 @@ +import * as React from 'react'; + +import { IconName } from 'components/kit/Icon'; + +export interface IStatisticsCardProps { + label: string; + count: number; + badge?: { value: string; style?: React.CSSProperties }; + icon?: IconName; + iconBgColor?: string; + cardBgColor?: string; + onMouseOver?: (id: string, source: string) => void; + onMouseLeave?: () => void; + navLink?: string; + highlighted?: boolean; + outlined?: boolean; + isLoading?: boolean; +} diff --git a/src/src/components/StatisticsCard/StatisticsCard.scss b/src/src/components/StatisticsCard/StatisticsCard.scss new file mode 100644 index 00000000..34ddbbc0 --- /dev/null +++ b/src/src/components/StatisticsCard/StatisticsCard.scss @@ -0,0 +1,55 @@ +@use 'src/styles/abstracts' as *; + +.StatisticsCard { + padding: $space-xs; + display: inline-flex; + align-items: center; + justify-content: flex-start; + border-radius: $border-radius-sm; + min-width: toRem(132px); + max-width: toRem(132px); + border: $border-transparent; + transition: all 0.18s ease-out; + position: relative; + &__iconWrapper { + width: 2rem; + min-width: 2rem; + height: 2rem; + border-radius: 50%; + margin-right: $space-xs; + display: inline-flex; + align-items: center; + justify-content: center; + } + &__info { + display: flex; + flex-direction: column; + overflow: hidden; + &__label, + &__count { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + color: $pico; + user-select: none; + } + &__label { + text-transform: capitalize; + } + } + &__badge { + position: absolute; + top: -$space-xs; + right: -$space-xxs; + text-align: center; + white-space: nowrap; + padding: $space-xxxxxs $space-xxxs; + border-radius: $border-radius-xss; + background-color: white; + box-shadow: 0 1px 2px 0 #00000029; + user-select: none; + } + &.highlighted { + cursor: pointer; + } +} diff --git a/src/src/components/StatisticsCard/StatisticsCard.tsx b/src/src/components/StatisticsCard/StatisticsCard.tsx new file mode 100644 index 00000000..fec0f021 --- /dev/null +++ b/src/src/components/StatisticsCard/StatisticsCard.tsx @@ -0,0 +1,96 @@ +import * as React from 'react'; +import { useHistory } from 'react-router-dom'; +import classNames from 'classnames'; + +import { Icon, Text } from 'components/kit'; + +import hexToRgbA from 'utils/hexToRgbA'; + +import { IStatisticsCardProps } from './index'; + +import './StatisticsCard.scss'; + +function StatisticsCard({ + label, + badge = { value: '' }, + count, + icon, + iconBgColor = '#000000', + cardBgColor = hexToRgbA(iconBgColor, 0.1), + onMouseOver, + onMouseLeave, + navLink, + highlighted, + outlined = false, + isLoading = false, +}: IStatisticsCardProps) { + const history = useHistory(); + const onSafeMouseOver = React.useCallback( + (id: string) => { + if (typeof onMouseOver === 'function') { + onMouseOver(id, 'card'); + } + }, + [onMouseOver], + ); + const styles = { + card: { + borderColor: outlined ? iconBgColor : 'transparent', + backgroundColor: highlighted ? iconBgColor : cardBgColor, + }, + iconWrapper: { + backgroundColor: highlighted ? '#fff' : iconBgColor, + }, + iconColor: highlighted ? iconBgColor : '#fff', + label: highlighted ? { color: '#fff' } : {}, + count: highlighted ? { color: '#fff' } : {}, + }; + return ( +
navLink && history.push(navLink)} + onMouseLeave={onMouseLeave} + onMouseOver={() => onSafeMouseOver(label)} + className={classNames('StatisticsCard', { highlighted })} + style={styles.card} + > + {badge?.value && ( + + {badge.value} + + )} + {icon && ( +
+ +
+ )} +
+ + {label} + + + {isLoading ? '--' : count} + +
+
+ ); +} + +StatisticsCard.displayName = 'StatisticsCard'; + +export default React.memo(StatisticsCard); diff --git a/src/src/components/StatisticsCard/index.ts b/src/src/components/StatisticsCard/index.ts new file mode 100644 index 00000000..e957ea86 --- /dev/null +++ b/src/src/components/StatisticsCard/index.ts @@ -0,0 +1,5 @@ +import StatisticsCard from './StatisticsCard'; + +export * from './StatisticsCard.d'; + +export default StatisticsCard; diff --git a/src/src/components/StatusLabel/StatusLabel.tsx b/src/src/components/StatusLabel/StatusLabel.tsx new file mode 100644 index 00000000..d19e3cef --- /dev/null +++ b/src/src/components/StatusLabel/StatusLabel.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import stopPropagation from 'utils/stopPropagation'; + +import { IStatusLabelProps } from './types.d'; + +import './styles.scss'; + +/** + * @property {string} title - label title + * @property {string} status - status type + * @property {string} className - component className + */ +function StatusLabel({ + title, + status = 'success', + className = '', + disabled = false, +}: IStatusLabelProps): React.FunctionComponentElement { + return ( + +
+ {title && ( + + {title} + + )} +
+
+ ); +} + +StatusLabel.displayName = 'StatusLabel'; + +export default React.memo(StatusLabel); diff --git a/src/src/components/StatusLabel/index.ts b/src/src/components/StatusLabel/index.ts new file mode 100644 index 00000000..acaf136f --- /dev/null +++ b/src/src/components/StatusLabel/index.ts @@ -0,0 +1,6 @@ +import StatusLabel from './StatusLabel'; + +export * from './types.d'; +export * from './StatusLabel'; + +export default StatusLabel; diff --git a/src/src/components/StatusLabel/styles.scss b/src/src/components/StatusLabel/styles.scss new file mode 100644 index 00000000..e60b4341 --- /dev/null +++ b/src/src/components/StatusLabel/styles.scss @@ -0,0 +1,48 @@ +@use 'src/styles/abstracts' as *; + +.StatusLabel { + display: flex; + justify-content: center; + align-items: center; + height: 1.25rem; + padding: 0.25rem 0.5rem 0.25rem 1.375rem; + border-radius: $border-radius-sm; + position: relative; + &.success { + background: $success-color-10; + .title { + color: $success-color-100; + } + &::before { + background: $success-color-100; + } + &.disabled { + &::before { + background: $success-color-50; + } + } + } + &.alert { + background: $pico-5; + .title { + color: $pico-50; + } + &::before { + background: $pico-50; + } + &.disabled { + &::before { + background: $pico-30; + } + } + } + &::before { + content: ''; + width: 6px; + height: 6px; + position: absolute; + top: 7px; + left: 7px; + border-radius: $border-radius-circle; + } +} diff --git a/src/src/components/StatusLabel/types.d.ts b/src/src/components/StatusLabel/types.d.ts new file mode 100644 index 00000000..937055e1 --- /dev/null +++ b/src/src/components/StatusLabel/types.d.ts @@ -0,0 +1,6 @@ +export interface IStatusLabelProps { + title?: string; + className?: string; + status?: 'success' | 'alert' | 'warning' | 'error'; + disabled?: boolean; +} diff --git a/src/src/components/StepsDensityPopover/StepsDensityPopover.tsx b/src/src/components/StepsDensityPopover/StepsDensityPopover.tsx new file mode 100644 index 00000000..23a1aea8 --- /dev/null +++ b/src/src/components/StepsDensityPopover/StepsDensityPopover.tsx @@ -0,0 +1,35 @@ +import React from 'react'; + +import { Box, Slider } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +const marks = [ + { value: 10, label: '10' }, + { value: 100, label: '100' }, + { value: 200, label: '200' }, + { value: 300, label: '300' }, + { value: 400, label: '400' }, + { value: 500, label: '500' }, +]; +function StepsDensityPopover(): React.FunctionComponentElement { + return ( + + + Number Of Steps: + + + + + + ); +} + +export default React.memo(StepsDensityPopover); diff --git a/src/src/components/TabPanel/TabPanel.tsx b/src/src/components/TabPanel/TabPanel.tsx new file mode 100644 index 00000000..38d693ad --- /dev/null +++ b/src/src/components/TabPanel/TabPanel.tsx @@ -0,0 +1,30 @@ +import React, { memo } from 'react'; + +import { Box } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary'; + +import { ITabPanelProps } from 'types/components/TabPanel/TabPanel'; + +function TabPanel({ + children, + value, + index, + className, +}: ITabPanelProps): React.FunctionComponentElement { + return ( + + + + ); +} + +export default memo(TabPanel); diff --git a/src/src/components/Table/ArchiveModal.tsx b/src/src/components/Table/ArchiveModal.tsx new file mode 100644 index 00000000..bd90d11f --- /dev/null +++ b/src/src/components/Table/ArchiveModal.tsx @@ -0,0 +1,276 @@ +import React from 'react'; +import _ from 'lodash-es'; +import moment from 'moment'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon, Modal, Text } from 'components/kit'; +import DataList from 'components/kit/DataList'; + +import { DATE_WITH_SECONDS } from 'config/dates/dates'; + +import { processDurationTime } from 'utils/processDurationTime'; + +function ArchiveModal({ + opened, + onClose, + selectedRows = {}, + archiveMode, + onRowSelect, + archiveRuns, +}: { + opened: boolean; + onClose: () => void; + selectedRows: { [key: string]: any }; + archiveMode: boolean; + onRowSelect: ({ + actionType, + data, + }: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + }) => { + [key: string]: any; + }; + archiveRuns: ( + ids: string[], + archived: boolean, + ) => { + call: () => Promise; + abort: () => void; + }; +}): React.FunctionComponentElement { + const tableRef = React.useRef({}); + const disabledTableRef = React.useRef({}); + const archivedText = archiveMode ? 'archive' : 'unarchive'; + + const tableColumns = [ + { + dataKey: 'experiment', + key: 'experiment', + title: 'Experiment', + width: 0, + flexGrow: 1, + cellRenderer: function cellRenderer({ cellData, rowIndex }: any) { + return ( + +
+ + {cellData} + +
+
+ ); + }, + }, + { + dataKey: 'date', + key: 'date', + title: 'Date', + width: 275, + cellRenderer: function cellRenderer({ cellData }: any) { + return ( + +
+ + {cellData} + +
+
+ ); + }, + }, + { + dataKey: 'name', + key: 'name', + title: 'Name', + width: 0, + flexGrow: 1, + cellRenderer: function cellRenderer({ cellData, rowData }: any) { + return ( +
+

+ {cellData} +

+ {!rowData.isDisabled && ( + + )} +
+ ); + }, + }, + ]; + + const { data, disabledData } = React.useMemo(() => { + let archivedList: any[] = []; + let unarchivedList: any[] = []; + const runHashList: string[] = []; + Object.values(selectedRows).forEach((selectedRow: any) => { + if (!runHashList.includes(selectedRow.runHash)) { + runHashList.push(selectedRow.runHash); + const rowData = { + key: selectedRow.runHash, + date: `${moment(selectedRow.creation_time * 1000).format( + DATE_WITH_SECONDS, + )} • ${processDurationTime( + selectedRow?.creation_time * 1000, + selectedRow?.end_time ? selectedRow?.end_time * 1000 : Date.now(), + )}`, + experiment: selectedRow?.experiment?.name ?? 'default', + name: selectedRow?.name ?? '-', + runHash: selectedRow.runHash, + selectKey: selectedRow.selectKey, + isInProgress: !selectedRow?.end_time, + creationTime: selectedRow.creation_time * 1000000, + isDisabled: + (archiveMode && selectedRow.archived) || + (!archiveMode && !selectedRow.archived), + }; + if (selectedRow.archived) { + unarchivedList.push(rowData); + } else { + archivedList.push(rowData); + } + } + }); + archivedList = _.orderBy(archivedList, ['creationTime'], ['desc']); + unarchivedList = _.orderBy(unarchivedList, ['creationTime'], ['desc']); + tableRef.current?.updateData?.({ + newData: archiveMode ? archivedList : unarchivedList, + }); + disabledTableRef.current?.updateData?.({ + newData: !archiveMode ? archivedList : unarchivedList, + }); + return { + data: archiveMode ? archivedList : unarchivedList, + disabledData: !archiveMode ? archivedList : unarchivedList, + }; + }, [selectedRows, archiveMode]); + + function onArchive() { + const ids = data.map((item: any) => item.runHash); + archiveRuns(ids, archiveMode) + .call() + .then(() => onClose()); + } + + return opened ? ( + +
+ + {archiveMode + ? 'Archived runs are not visible in search by default. You can always go back and unarchive them.' + : 'The runs will become visible in search.'} + +
+ + {Object.values(data).length} + + + {`runs to ${archivedText}.`} + +
+ {!_.isEmpty(data) && ( + + )} + {!_.isEmpty(disabledData) && ( +
+ + {Object.values(disabledData).length} + + + {`runs are already ${archivedText}d.`} + +
+ )} + {!_.isEmpty(disabledData) && ( + + )} +
+
+ ) : ( + <> + ); +} + +export default React.memo(ArchiveModal); diff --git a/src/src/components/Table/AutoResizer.tsx b/src/src/components/Table/AutoResizer.tsx new file mode 100644 index 00000000..2f817e05 --- /dev/null +++ b/src/src/components/Table/AutoResizer.tsx @@ -0,0 +1,46 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; +import AutoSizer from 'react-virtualized-auto-sizer'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +/** + * Decorator component that automatically adjusts the width and height of a single child + */ +const AutoResizer = ({ className, width, height, children, onResize }) => { + const disableWidth = typeof width === 'number'; + const disableHeight = typeof height === 'number'; + + if (disableWidth && disableHeight) { + return ( +
+ {children({ width, height })} +
+ ); + } + + return ( + + + {(size) => + children({ + width: disableWidth ? width : size.width, + height: disableHeight ? height : size.height, + }) + } + + + ); +}; + +export default AutoResizer; diff --git a/src/src/components/Table/BaseTable.scss b/src/src/components/Table/BaseTable.scss new file mode 100644 index 00000000..a137a50a --- /dev/null +++ b/src/src/components/Table/BaseTable.scss @@ -0,0 +1,329 @@ +@use 'src/styles/abstracts' as *; +$table-prefix: BaseTable !default; + +@mixin table-edge-padding($padding-left: null, $padding-right: null) { + .#{$table-prefix} { + &__header-cell, + &__row-cell { + @if $padding-left != null { + &:first-child { + padding-left: $padding-left; + } + } + + @if $padding-right != null { + &:last-child { + padding-right: $padding-right; + } + } + } + } +} + +@mixin fill-layout($top: 0, $bottom: 0) { + position: absolute; + left: 0; + right: 0; + top: $top; + bottom: $bottom; + overflow: hidden; +} + +.#{$table-prefix} { + $table-font-size: 13px !default; + $table-padding-left: 15px !default; + $table-padding-right: 15px !default; + $column-padding: 7.5px !default; + + $background-color: #ffffff !default; + $box-shadow-color: #eeeeee !default; + $box-shadow-offset: 2px !default; + $box-shadow-blur: 4px !default; + $border: 1px solid #eeeeee !default; + $header-background-color: #f8f8f8 !default; + $header-font-weight: $font-600 !default; + $row-hovered-background-color: #e2f2ff !default; + $header-cell-hovered-background-color: #f3f3f3 !default; + $sort-indicator-hovered-color: #888888 !default; + $column-resizer-color: #5bb4ff !default; + + $show-frozen-rows-shadow: false !default; + $show-frozen-columns-shadow: true !default; + + box-shadow: 0 $box-shadow-offset $box-shadow-blur 0 $box-shadow-color; + background-color: $background-color; + position: relative; + box-sizing: border-box; + font-size: $table-font-size; + + &--disabled { + opacity: 0.7; + pointer-events: none; + } + + &--dynamic { + .#{$table-prefix}__row { + overflow: hidden; + align-items: stretch; + } + } + + &:not(.#{$table-prefix}--dynamic), + .#{$table-prefix}__row--frozen { + .#{$table-prefix}__row-cell-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + + @if ($show-frozen-rows-shadow) { + &--has-frozen-rows { + .#{$table-prefix}__header { + box-shadow: 0 $box-shadow-offset $box-shadow-blur 0 $box-shadow-color; + } + } + } + + &__table { + background-color: $background-color; + position: absolute; + top: 0; + // put header after body and reverse the display order + // to prevent header's shadow being covered by body + display: flex; + flex-direction: column-reverse; + + &-main { + @include table-edge-padding($table-padding-left, $table-padding-right); + outline: $border; + left: 0; + + .#{$table-prefix}__header { + background-color: $header-background-color; + color: #1c2852; + } + } + + &-frozen-left, + &-frozen-right { + .#{$table-prefix}__header, + .#{$table-prefix}__body { + overflow: hidden !important; + } + } + + &-frozen-left { + @include table-edge-padding($table-padding-left, null); + @if ($show-frozen-columns-shadow) { + box-shadow: $box-shadow-offset 0 $box-shadow-blur 0 $box-shadow-color; + } + top: 0; + left: 0; + + .#{$table-prefix}__header-row, + .#{$table-prefix}__row { + padding-right: 0 !important; + } + + .#{$table-prefix}__body { + overflow-y: auto !important; + } + } + + &-frozen-right { + @include table-edge-padding(null, $table-padding-right); + @if ($show-frozen-columns-shadow) { + box-shadow: -$box-shadow-offset 0 $box-shadow-blur 0 $box-shadow-color; + } + top: 0; + right: 0; + + .#{$table-prefix}__header-row, + .#{$table-prefix}__row { + padding-left: 0 !important; + } + + .#{$table-prefix}__body { + overflow-y: auto !important; + } + } + } + + &__header { + overflow: hidden !important; + } + + .#{$table-prefix}__header, + .#{$table-prefix}__body { + outline: none; + } + + &__header-row, + &__row { + display: flex; + align-items: center; + border-bottom: $border; + box-sizing: border-box; + } + + &__header-row { + background-color: $header-background-color; + font-weight: $header-font-weight; + } + + &__row { + background-color: $background-color; + cursor: pointer; + + &--hovered { + background-color: $row-hovered-background-color; + } + } + + &__row-expanded { + border-bottom: $border; + } + + &__header-cell, + &__row-cell { + min-width: 0; + height: 100%; + display: flex; + align-items: center; + padding: 0 $column-padding; + box-sizing: border-box; + border-right: $border; + white-space: nowrap; + + &--align-center { + justify-content: center; + text-align: center; + } + + &--align-right { + justify-content: flex-end; + text-align: right; + } + } + + &__header-cell { + position: relative; + cursor: default; + + &:hover { + .#{$table-prefix}__column-resizer { + visibility: visible; + opacity: 0.5; + + &:hover { + opacity: 1; + } + } + } + + .#{$table-prefix}__sort-indicator { + display: none; + } + + &--sortable { + &:hover { + background-color: $header-cell-hovered-background-color; + cursor: pointer; + } + + &:not(.#{$table-prefix}__header-cell--sorting):hover { + .#{$table-prefix}__sort-indicator { + display: block; + color: $sort-indicator-hovered-color; + } + } + } + + &--sorting { + &, + &:hover { + .#{$table-prefix}__sort-indicator { + display: block; + } + } + } + + &--resizing { + .#{$table-prefix}__column-resizer { + visibility: visible; + opacity: 1; + // workaround to prevent header being clicked when resizing stopped on header + &::after { + @include fill-layout(); + content: ''; + left: -9999px; + } + } + } + + &-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: normal; + } + } + + &__header-row--resizing { + .#{$table-prefix}__header-cell { + background-color: transparent; + cursor: col-resize; + + &:not(.#{$table-prefix}__header-cell--sorting) { + .#{$table-prefix}__sort-indicator { + display: none; + } + } + + &:not(.#{$table-prefix}__header-cell--resizing) { + .#{$table-prefix}__column-resizer { + visibility: hidden; + } + } + } + } + + &__column-resizer { + width: 3px; + visibility: hidden; + background-color: $column-resizer-color; + + &:hover { + visibility: visible; + opacity: 1; + } + } + + &__footer { + @include fill-layout(null); + background-color: $background-color; + } + + &__resizing-line { + cursor: col-resize; + position: absolute; + top: 0; + background-color: $column-resizer-color; + width: 3px; + transform: translateX(-100%); + } + + &__empty-layer { + @include fill-layout(); + background-color: $background-color; + } + + &__overlay { + @include fill-layout(); + pointer-events: none; + + & > * { + pointer-events: auto; + } + } +} diff --git a/src/src/components/Table/BaseTable.tsx b/src/src/components/Table/BaseTable.tsx new file mode 100644 index 00000000..3a7d548e --- /dev/null +++ b/src/src/components/Table/BaseTable.tsx @@ -0,0 +1,1277 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; +import memoize from 'memoize-one'; +import cn from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { getValue } from 'utils/helper'; + +import GridTable from './GridTable'; +import TableHeaderRow from './TableHeaderRow'; +import TableRow from './TableRow'; +import TableHeaderCell from './TableHeaderCell'; +import TableCell from './TableCell'; +import Column, { Alignment, FrozenDirection } from './Column'; +import SortOrder from './SortOrder'; +import ExpandIcon from './ExpandIcon'; +import SortIndicator from './SortIndicator'; +import ColumnResizer from './ColumnResizer'; +import ColumnManager from './ColumnManager'; +import { + renderElement, + normalizeColumns, + getEstimatedTotalRowsHeight, + isObjectEqual, + callOrReturn, + hasChildren, + flattenOnKeys, + cloneArray, + throttle, + debounce, + noop, +} from './utils'; + +import './BaseTable.scss'; + +const getColumns = memoize( + (columns, children) => columns || normalizeColumns(children), +); + +const getContainerStyle = (width, maxWidth, height) => ({ + width, + maxWidth, + height, + overflow: 'hidden', +}); + +const DEFAULT_COMPONENTS = { + TableCell, + TableHeaderCell, + ExpandIcon, + SortIndicator, +}; + +const RESIZE_THROTTLE_WAIT = 50; + +// used for memoization +const EMPTY_ARRAY: void[] = []; + +/** + * React table component // TODO: change to function component + */ +class BaseTable extends React.PureComponent { + constructor(props) { + super(props); + + const { columns, children, defaultExpandedRowKeys } = props; + this.state = { + scrollbarSize: 0, + hoveredRowKey: null, + activeRowKey: null, + resizingKey: null, + resizingWidth: 0, + expandedRowKeys: cloneArray(defaultExpandedRowKeys), + }; + this.columnManager = new ColumnManager( + getColumns(columns, children), + props.fixed, + ); + + this._setContainerRef = this._setContainerRef.bind(this); + this._setMainTableRef = this._setMainTableRef.bind(this); + this._setLeftTableRef = this._setLeftTableRef.bind(this); + this._setRightTableRef = this._setRightTableRef.bind(this); + + this.renderExpandIcon = this.renderExpandIcon.bind(this); + this.renderRow = this.renderRow.bind(this); + this.renderRowCell = this.renderRowCell.bind(this); + this.renderHeader = this.renderHeader.bind(this); + this.renderHeaderCell = this.renderHeaderCell.bind(this); + + this._handleScroll = this._handleScroll.bind(this); + this._handleVerticalScroll = this._handleVerticalScroll.bind(this); + this._handleRowsRendered = this._handleRowsRendered.bind(this); + this._handleRowHover = this._handleRowHover.bind(this); + this._handleRowClick = this._handleRowClick.bind(this); + this._handleRowExpand = this._handleRowExpand.bind(this); + this._handleColumnResize = throttle( + this._handleColumnResize.bind(this), + RESIZE_THROTTLE_WAIT, + ); + this._handleColumnResizeStart = this._handleColumnResizeStart.bind(this); + this._handleColumnResizeStop = this._handleColumnResizeStop.bind(this); + this._handleColumnSort = this._handleColumnSort.bind(this); + this._handleFrozenRowHeightChange = + this._handleFrozenRowHeightChange.bind(this); + this._handleRowHeightChange = this._handleRowHeightChange.bind(this); + + this._getLeftTableContainerStyle = memoize(getContainerStyle); + this._getRightTableContainerStyle = memoize(getContainerStyle); + this._flattenOnKeys = memoize((tree, keys, dataKey) => { + this._depthMap = {}; + return flattenOnKeys(tree, keys, this._depthMap, dataKey); + }); + this._resetColumnManager = memoize( + (columns, fixed) => { + this.columnManager.reset(columns, fixed); + + if (this.props.estimatedRowHeight && fixed) { + if (!this.columnManager.hasLeftFrozenColumns()) { + this._leftRowHeightMap = {}; + } + if (!this.columnManager.hasRightFrozenColumns()) { + this._rightRowHeightMap = {}; + } + } + }, + (newArgs, lastArgs) => + isObjectEqual( + newArgs, + lastArgs, + this.props.ignoreFunctionInColumnCompare, + ), + ); + + this._isResetting = false; + this._resetIndex = null; + this._rowHeightMap = {}; + this._rowHeightMapBuffer = {}; + this._mainRowHeightMap = {}; + this._leftRowHeightMap = {}; + this._rightRowHeightMap = {}; + this._getEstimatedTotalRowsHeight = memoize(getEstimatedTotalRowsHeight); + this._getRowHeight = this._getRowHeight.bind(this); + this._updateRowHeights = debounce(() => { + this._isResetting = true; + this._rowHeightMap = { + ...this._rowHeightMap, + ...this._rowHeightMapBuffer, + }; + this.resetAfterRowIndex(this._resetIndex, false); + this._rowHeightMapBuffer = {}; + this._resetIndex = null; + this.forceUpdateTable(); + this.forceUpdate(); + this._isResetting = false; + }, 0); + + this._scroll = { scrollLeft: 0, scrollTop: 0 }; + this._scrollHeight = 0; + this._lastScannedRowIndex = -1; + this._hasDataChangedSinceEndReached = true; + + this._data = props.data; + this._depthMap = {}; + + this._horizontalScrollbarSize = 0; + this._verticalScrollbarSize = 0; + this._scrollbarPresenceChanged = false; + } + + /** + * Get the DOM node of the table + */ + getDOMNode() { + return this.tableNode; + } + + /** + * Get the column manager + */ + getColumnManager() { + return this.columnManager; + } + + /** + * Get internal `expandedRowKeys` state + */ + getExpandedRowKeys() { + const { expandedRowKeys } = this.props; + return expandedRowKeys !== undefined + ? expandedRowKeys || EMPTY_ARRAY + : this.state.expandedRowKeys; + } + + /** + * Get the expanded state, fallback to normal state if not expandable. + */ + getExpandedState() { + return { + expandedData: this._data, + expandedRowKeys: this.getExpandedRowKeys(), + expandedDepthMap: this._depthMap, + }; + } + + /** + * Get the total height of all rows, including expanded rows. + */ + getTotalRowsHeight() { + const { rowHeight, estimatedRowHeight } = this.props; + + if (estimatedRowHeight) { + return this.table + ? this.table.getTotalRowsHeight() + : this._getEstimatedTotalRowsHeight(this._data, estimatedRowHeight); + } + return this._data.length * rowHeight; + } + + /** + * Get the total width of all columns. + */ + getTotalColumnsWidth() { + return this.columnManager.getColumnsWidth(); + } + + /** + * Forcefully re-render the inner Grid component. + * + * Calling `forceUpdate` on `Table` may not re-render the inner Grid since it uses `shallowCompare` as a performance optimization. + * Use this method if you want to manually trigger a re-render. + * This may be appropriate if the underlying row data has changed but the row sizes themselves have not. + */ + forceUpdateTable() { + this.table && this.table.forceUpdateTable(); + this.leftTable && this.leftTable.forceUpdateTable(); + this.rightTable && this.rightTable.forceUpdateTable(); + } + + /** + * Reset cached offsets for positioning after a specific rowIndex, should be used only in dynamic mode(estimatedRowHeight is provided) + * + * @param {number} rowIndex + * @param {boolean} shouldForceUpdate + */ + resetAfterRowIndex(rowIndex = 0, shouldForceUpdate = true) { + if (!this.props.estimatedRowHeight) return; + + this.table && this.table.resetAfterRowIndex(rowIndex, shouldForceUpdate); + this.leftTable && + this.leftTable.resetAfterRowIndex(rowIndex, shouldForceUpdate); + this.rightTable && + this.rightTable.resetAfterRowIndex(rowIndex, shouldForceUpdate); + } + + /** + * Reset row height cache, useful if `data` changed entirely, should be used only in dynamic mode(estimatedRowHeight is provided) + */ + resetRowHeightCache() { + if (!this.props.estimatedRowHeight) return; + + this._resetIndex = null; + this._rowHeightMapBuffer = {}; + this._rowHeightMap = {}; + this._mainRowHeightMap = {}; + this._leftRowHeightMap = {}; + this._rightRowHeightMap = {}; + } + + /** + * Scroll to the specified offset. + * Useful for animating position changes. + * + * @param {object} offset + */ + scrollToPosition(offset) { + this._scroll = offset; + + this.table && this.table.scrollToPosition(offset); + this.leftTable && this.leftTable.scrollToTop(offset.scrollTop); + this.rightTable && this.rightTable.scrollToTop(offset.scrollTop); + } + + /** + * Scroll to the specified offset vertically. + * + * @param {number} scrollTop + */ + scrollToTop(scrollTop) { + this._scroll.scrollTop = scrollTop; + + this.table && this.table.scrollToPosition(this._scroll); + this.leftTable && this.leftTable.scrollToTop(scrollTop); + this.rightTable && this.rightTable.scrollToTop(scrollTop); + } + + /** + * Scroll to the specified offset horizontally. + * + * @param {number} scrollLeft + */ + scrollToLeft(scrollLeft) { + this._scroll.scrollLeft = scrollLeft; + + this.table && this.table.scrollToPosition(this._scroll); + } + + /** + * Scroll to the specified row. + * By default, the table will scroll as little as possible to ensure the row is visible. + * You can control the alignment of the row though by specifying an align property. Acceptable values are: + * + * - `auto` (default) - Scroll as little as possible to ensure the row is visible. + * - `smart` - Same as `auto` if it is less than one viewport away, or it's the same as`center`. + * - `center` - Center align the row within the table. + * - `end` - Align the row to the bottom side of the table. + * - `start` - Align the row to the top side of the table. + * + * @param {number} rowIndex + * @param {string} align + */ + scrollToRow(rowIndex = 0, align = 'auto') { + this.table && this.table.scrollToRow(rowIndex, align); + this.leftTable && this.leftTable.scrollToRow(rowIndex, align); + this.rightTable && this.rightTable.scrollToRow(rowIndex, align); + } + + scrollToRowByKey = (rowKey) => { + let rowIndex = 0; + for (let i = 0; i < this.props.data.length; i++) { + if (this.props.data[i].key === rowKey) { + rowIndex = i; + break; + } + } + + this.scrollToRow(rowIndex, 'smart'); + }; + + /** + * Set `expandedRowKeys` manually. + * This method is available only if `expandedRowKeys` is uncontrolled. + * + * @param {array} expandedRowKeys + */ + setExpandedRowKeys(expandedRowKeys) { + // if `expandedRowKeys` is controlled + if (this.props.expandedRowKeys !== undefined) return; + + this.setState({ + expandedRowKeys: cloneArray(expandedRowKeys), + }); + } + + /** + * Set `hoveredRowKey` manually. + * + * @param {string} rowKey + */ + setHoveredRow = (rowKey) => { + this.setState({ hoveredRowKey: rowKey }); + }; + + /** + * Set `activeRowKey` manually. + * + * @param {string} rowKey + */ + setActiveRow = (rowKey) => { + this.setState({ activeRowKey: rowKey }); + }; + + renderExpandIcon({ rowData, rowIndex, depth, onExpand }) { + const { rowKey, expandColumnKey, expandIconProps } = this.props; + if (!expandColumnKey) return null; + + const expandable = rowIndex >= 0 && hasChildren(rowData); + const expanded = + rowIndex >= 0 && this.getExpandedRowKeys().indexOf(rowData[rowKey]) >= 0; + const extraProps = callOrReturn(expandIconProps, { + rowData, + rowIndex, + depth, + expandable, + expanded, + }); + const ExpandIcon = this._getComponent('ExpandIcon'); + + return ( + + ); + } + + renderRow({ isScrolling, columns, rowData, rowIndex, style }) { + const { + rowClassName, + rowRenderer, + rowEventHandlers, + expandColumnKey, + estimatedRowHeight, + } = this.props; + + const rowClass = callOrReturn(rowClassName, { columns, rowData, rowIndex }); + const extraProps = callOrReturn(this.props.rowProps, { + columns, + rowData, + rowIndex, + }); + const rowKey = rowData[this.props.rowKey]; + const depth = this._depthMap[rowKey] || 0; + + const className = cn(this._prefixClass('row'), rowClass, { + [this._prefixClass(`row--depth-${depth}`)]: + !!expandColumnKey && rowIndex >= 0, + [this._prefixClass('row--expanded')]: + !!expandColumnKey && this.getExpandedRowKeys().indexOf(rowKey) >= 0, + [this._prefixClass('row--hovered')]: + !isScrolling && rowKey === this.state.hoveredRowKey, + [this._prefixClass('row--frozen')]: depth === 0 && rowIndex < 0, + [this._prefixClass('row--customized')]: rowRenderer, + }); + + const hasFrozenColumns = this.columnManager.hasFrozenColumns(); + const rowProps = { + ...extraProps, + role: 'row', + key: `row-${rowKey}`, + isScrolling, + className, + style: { + ...style, + ...rowData?.rowProps?.style, + }, + columns, + rowIndex, + rowData, + rowKey, + expandColumnKey, + depth, + rowEventHandlers, + rowRenderer, + // for frozen rows we use fixed rowHeight + estimatedRowHeight: rowIndex >= 0 ? estimatedRowHeight : undefined, + getIsResetting: this._getIsResetting, + cellRenderer: this.renderRowCell, + expandIconRenderer: this.renderExpandIcon, + onRowExpand: this._handleRowExpand, + // for fixed table, we need to sync the hover state across the inner tables + onRowHover: this._handleRowHover, + onRowClick: this._handleRowClick, + onRowHeightChange: hasFrozenColumns + ? this._handleFrozenRowHeightChange + : this._handleRowHeightChange, + }; + + return ; + } + + renderRowCell({ + isScrolling, + columns, + column, + columnIndex, + rowData, + rowIndex, + expandIcon, + }) { + if (column[ColumnManager.PlaceholderKey]) { + return ( + +
+ + ); + } + + const { className, dataKey, dataGetter, cellRenderer } = column; + const TableCell = this._getComponent('TableCell'); + + const cellData = dataGetter + ? dataGetter({ columns, column, columnIndex, rowData, rowIndex }) + : getValue(rowData, dataKey); + const cellProps = { + isScrolling, + cellData, + columns, + column, + columnIndex, + rowData, + rowIndex, + container: this, + }; + const cell = renderElement( + cellRenderer || ( + + ), + cellProps, + ); + + const cellCls = callOrReturn(className, { + cellData, + columns, + column, + columnIndex, + rowData, + rowIndex, + }); + const cls = cn(this._prefixClass('row-cell'), cellCls, { + [this._prefixClass('row-cell--align-center')]: + column.align === Alignment.CENTER, + [this._prefixClass('row-cell--align-right')]: + column.align === Alignment.RIGHT, + }); + + const extraProps = callOrReturn(this.props.cellProps, { + columns, + column, + columnIndex, + rowData, + rowIndex, + }); + const { tagName, ...rest } = extraProps || {}; + const Tag = tagName || 'div'; + return ( + + {expandIcon} + {cell} + + ); + } + + renderHeader({ columns, headerIndex, style }) { + const { headerClassName, headerRenderer } = this.props; + + const headerClass = callOrReturn(headerClassName, { columns, headerIndex }); + const extraProps = callOrReturn(this.props.headerProps, { + columns, + headerIndex, + }); + + const className = cn(this._prefixClass('header-row'), headerClass, { + [this._prefixClass('header-row--resizing')]: !!this.state.resizingKey, + [this._prefixClass('header-row--customized')]: headerRenderer, + }); + + const headerProps = { + ...extraProps, + role: 'row', + key: `header-${headerIndex}`, + className, + style, + columns, + headerIndex, + headerRenderer, + cellRenderer: this.renderHeaderCell, + expandColumnKey: this.props.expandColumnKey, + expandIcon: this._getComponent('ExpandIcon'), + }; + + return ; + } + + renderHeaderCell({ columns, column, columnIndex, headerIndex, expandIcon }) { + if (column[ColumnManager.PlaceholderKey]) { + return ( +
+ ); + } + + const { headerClassName, headerRenderer } = column; + const { sortBy, sortState, headerCellProps } = this.props; + const TableHeaderCell = this._getComponent('TableHeaderCell'); + const SortIndicator = this._getComponent('SortIndicator'); + + const cellProps = { + columns, + column, + columnIndex, + headerIndex, + container: this, + }; + const cell = renderElement( + headerRenderer || ( + + ), + cellProps, + ); + + let sorting, sortOrder; + + if (sortState) { + const order = sortState[column.key]; + sorting = order === SortOrder.ASC || order === SortOrder.DESC; + sortOrder = sorting ? order : SortOrder.ASC; + } else { + sorting = column.key === sortBy.key; + sortOrder = sorting ? sortBy.order : SortOrder.ASC; + } + + const cellCls = callOrReturn(headerClassName, { + columns, + column, + columnIndex, + headerIndex, + }); + const cls = cn(this._prefixClass('header-cell'), cellCls, { + [this._prefixClass('header-cell--align-center')]: + column.align === Alignment.CENTER, + [this._prefixClass('header-cell--align-right')]: + column.align === Alignment.RIGHT, + [this._prefixClass('header-cell--sortable')]: column.sortable, + [this._prefixClass('header-cell--sorting')]: sorting, + [this._prefixClass('header-cell--resizing')]: + column.key === this.state.resizingKey, + }); + const extraProps = callOrReturn(headerCellProps, { + columns, + column, + columnIndex, + headerIndex, + }); + const { tagName, ...rest } = extraProps || {}; + const Tag = tagName || 'div'; + return ( + + + {expandIcon} + {cell} + {column.sortable && ( + + )} + {column.resizable && ( + + )} + + + ); + } + + renderMainTable() { + const { + width, + headerHeight, + rowHeight, + fixed, + estimatedRowHeight, + ...rest + } = this.props; + const height = this._getTableHeight(); + + let tableWidth = width - this._verticalScrollbarSize; + if (fixed) { + const columnsWidth = this.columnManager.getColumnsWidth(); + // make sure `scrollLeft` is always integer to fix a sync bug when scrolling to end horizontally + tableWidth = Math.max(Math.round(columnsWidth), tableWidth); + } + return ( + + + + ); + } + + renderLeftTable() { + if (!this.columnManager.hasLeftFrozenColumns()) return null; + + const { width, headerHeight, rowHeight, estimatedRowHeight, ...rest } = + this.props; + + const containerHeight = this._getFrozenContainerHeight(); + const offset = this._verticalScrollbarSize || 20; + const columnsWidth = this.columnManager.getLeftFrozenColumnsWidth(); + return ( + + + + ); + } + + renderRightTable() { + if (!this.columnManager.hasRightFrozenColumns()) return null; + + const { width, headerHeight, rowHeight, estimatedRowHeight, ...rest } = + this.props; + + const containerHeight = this._getFrozenContainerHeight(); + const columnsWidth = this.columnManager.getRightFrozenColumnsWidth(); + const scrollbarWidth = this._verticalScrollbarSize; + return ( + + + + ); + } + + renderResizingLine() { + const { width, fixed } = this.props; + const { resizingKey } = this.state; + if (!fixed || !resizingKey) return null; + + const columns = this.columnManager.getMainColumns(); + const idx = columns.findIndex((column) => column.key === resizingKey); + const column = columns[idx]; + const { width: columnWidth, frozen } = column; + const leftWidth = this.columnManager.recomputeColumnsWidth( + columns.slice(0, idx), + ); + + let left = leftWidth + columnWidth; + if (!frozen) { + left -= this._scroll.scrollLeft; + } else if (frozen === FrozenDirection.RIGHT) { + const rightWidth = this.columnManager.recomputeColumnsWidth( + columns.slice(idx + 1), + ); + if (rightWidth + columnWidth > width - this._verticalScrollbarSize) { + left = columnWidth; + } else { + left = width - this._verticalScrollbarSize - rightWidth; + } + } + const style = { + left, + height: this._getTableHeight() - this._horizontalScrollbarSize, + }; + return
; + } + + renderFooter() { + const { footerHeight, footerRenderer } = this.props; + if (footerHeight === 0) return null; + return ( +
+ {renderElement(footerRenderer)} +
+ ); + } + + renderEmptyLayer() { + const { data, frozenData, footerHeight, emptyRenderer } = this.props; + + if ((data && data.length) || (frozenData && frozenData.length)) return null; + const headerHeight = this._getHeaderHeight(); + return ( +
+ {renderElement(emptyRenderer)} +
+ ); + } + + renderOverlay() { + const { overlayRenderer } = this.props; + + return ( +
+ {!!overlayRenderer && renderElement(overlayRenderer)} +
+ ); + } + + render() { + const { + columns, + children, + width, + fixed, + data, + frozenData, + expandColumnKey, + disabled, + className, + style, + footerHeight, + classPrefix, + estimatedRowHeight, + } = this.props; + this._resetColumnManager(getColumns(columns, children), fixed); + + const _data = expandColumnKey + ? this._flattenOnKeys(data, this.getExpandedRowKeys(), this.props.rowKey) + : data; + if (this._data !== _data) { + this.resetAfterRowIndex(0, false); + this._data = _data; + } + // should be after `this._data` assigned + this._calcScrollbarSizes(); + this._totalRowsHeight = this.getTotalRowsHeight(); + + const containerStyle = { + ...style, + width, + height: this._getTableHeight() + footerHeight, + position: 'relative', + }; + const cls = cn(classPrefix, className, { + [`${classPrefix}--fixed`]: fixed, + [`${classPrefix}--expandable`]: !!expandColumnKey, + [`${classPrefix}--empty`]: data.length === 0, + [`${classPrefix}--has-frozen-rows`]: frozenData.length > 0, + [`${classPrefix}--has-frozen-columns`]: + this.columnManager.hasFrozenColumns(), + [`${classPrefix}--disabled`]: disabled, + [`${classPrefix}--dynamic`]: !!estimatedRowHeight, + }); + return ( +
+ {this.renderFooter()} + {this.renderMainTable()} + {this.renderLeftTable()} + {this.renderRightTable()} + {this.renderResizingLine()} + {this.renderEmptyLayer()} + {this.renderOverlay()} +
+ ); + } + + componentDidMount() { + const scrollbarSize = this.props.getScrollbarSize(); + if (scrollbarSize > 0) { + this.setState({ scrollbarSize }); + } + } + + componentDidUpdate(prevProps, prevState) { + const { data, height, maxHeight, estimatedRowHeight } = this.props; + if (data !== prevProps.data) { + this._lastScannedRowIndex = -1; + this._hasDataChangedSinceEndReached = true; + } + + if (maxHeight !== prevProps.maxHeight || height !== prevProps.height) { + this._maybeCallOnEndReached(); + } + this._maybeScrollbarPresenceChange(); + + if (estimatedRowHeight) { + if (this.getTotalRowsHeight() !== this._totalRowsHeight) { + this.forceUpdate(); + } + } + } + + _prefixClass(className) { + return `${this.props.classPrefix}__${className}`; + } + + _setContainerRef(ref) { + this.tableNode = ref; + } + + _setMainTableRef(ref) { + this.table = ref; + } + + _setLeftTableRef(ref) { + this.leftTable = ref; + } + + _setRightTableRef(ref) { + this.rightTable = ref; + } + + _getComponent(name) { + if (this.props.components && this.props.components[name]) + return this.props.components[name]; + return DEFAULT_COMPONENTS[name]; + } + + // for dynamic row height + _getRowHeight(rowIndex) { + const { estimatedRowHeight, rowKey } = this.props; + return ( + this._rowHeightMap[this._data[rowIndex][rowKey]] || + callOrReturn(estimatedRowHeight, { + rowData: this._data[rowIndex], + rowIndex, + }) + ); + } + + _getIsResetting() { + return this._isResetting; + } + + _getHeaderHeight() { + const { headerHeight } = this.props; + if (Array.isArray(headerHeight)) { + return headerHeight.reduce((sum, height) => sum + height, 0); + } + return headerHeight; + } + + _getFrozenRowsHeight() { + const { frozenData, rowHeight } = this.props; + return frozenData.length * rowHeight; + } + + _getTableHeight() { + const { height, maxHeight, footerHeight } = this.props; + let tableHeight = height - footerHeight; + + if (maxHeight > 0) { + const frozenRowsHeight = this._getFrozenRowsHeight(); + const totalRowsHeight = this.getTotalRowsHeight(); + const headerHeight = this._getHeaderHeight(); + const totalHeight = + headerHeight + + frozenRowsHeight + + totalRowsHeight + + this._horizontalScrollbarSize; + tableHeight = Math.min(totalHeight, maxHeight - footerHeight); + } + + return tableHeight; + } + + _getBodyHeight() { + return ( + this._getTableHeight() - + this._getHeaderHeight() - + this._getFrozenRowsHeight() + ); + } + + _getFrozenContainerHeight() { + const { maxHeight } = this.props; + + const tableHeight = + this._getTableHeight() - + (this._data.length > 0 ? this._horizontalScrollbarSize : 0); + // in auto height mode tableHeight = totalHeight + if (maxHeight > 0) return tableHeight; + + const totalHeight = + this.getTotalRowsHeight() + + this._getHeaderHeight() + + this._getFrozenRowsHeight(); + return Math.min(tableHeight, totalHeight); + } + + _calcScrollbarSizes() { + const { fixed, width } = this.props; + const { scrollbarSize } = this.state; + + const totalRowsHeight = this.getTotalRowsHeight(); + const totalColumnsWidth = this.getTotalColumnsWidth(); + + const prevHorizontalScrollbarSize = this._horizontalScrollbarSize; + const prevVerticalScrollbarSize = this._verticalScrollbarSize; + + if (scrollbarSize === 0) { + this._horizontalScrollbarSize = 0; + this._verticalScrollbarSize = 0; + } else { + // we have to set `this._horizontalScrollbarSize` before calling `this._getBodyHeight` + if (!fixed || totalColumnsWidth <= width - scrollbarSize) { + this._horizontalScrollbarSize = 0; + this._verticalScrollbarSize = + totalRowsHeight > this._getBodyHeight() ? scrollbarSize : 0; + } else { + if (totalColumnsWidth > width) { + this._horizontalScrollbarSize = scrollbarSize; + this._verticalScrollbarSize = + totalRowsHeight > + this._getBodyHeight() - this._horizontalScrollbarSize + ? scrollbarSize + : 0; + } else { + this._horizontalScrollbarSize = 0; + this._verticalScrollbarSize = 0; + if (totalRowsHeight > this._getBodyHeight()) { + this._horizontalScrollbarSize = scrollbarSize; + this._verticalScrollbarSize = scrollbarSize; + } + } + } + } + + if ( + prevHorizontalScrollbarSize !== this._horizontalScrollbarSize || + prevVerticalScrollbarSize !== this._verticalScrollbarSize + ) { + this._scrollbarPresenceChanged = true; + } + } + + _maybeScrollbarPresenceChange() { + if (this._scrollbarPresenceChanged) { + const { onScrollbarPresenceChange } = this.props; + this._scrollbarPresenceChanged = false; + + onScrollbarPresenceChange({ + size: this.state.scrollbarSize, + horizontal: this._horizontalScrollbarSize > 0, + vertical: this._verticalScrollbarSize > 0, + }); + } + } + + _maybeCallOnEndReached() { + const { onEndReached, onEndReachedThreshold } = this.props; + const { scrollTop } = this._scroll; + const scrollHeight = this.getTotalRowsHeight(); + const clientHeight = this._getBodyHeight(); + + if (!onEndReached || !clientHeight || !scrollHeight) return; + const distanceFromEnd = + scrollHeight - scrollTop - clientHeight + this._horizontalScrollbarSize; + if ( + this._lastScannedRowIndex >= 0 && + distanceFromEnd <= onEndReachedThreshold && + (this._hasDataChangedSinceEndReached || + scrollHeight !== this._scrollHeight) + ) { + this._hasDataChangedSinceEndReached = false; + this._scrollHeight = scrollHeight; + onEndReached({ distanceFromEnd }); + } + } + + _handleScroll(args) { + const lastScrollTop = this._scroll.scrollTop; + this.scrollToPosition(args); + this.props.onScroll(args); + + if (args.scrollTop > lastScrollTop) this._maybeCallOnEndReached(); + } + + _handleVerticalScroll({ scrollTop }) { + const lastScrollTop = this._scroll.scrollTop; + + if (scrollTop !== lastScrollTop) this.scrollToTop(scrollTop); + if (scrollTop > lastScrollTop) this._maybeCallOnEndReached(); + } + + _handleRowsRendered(args) { + this.props.onRowsRendered(args); + + if (args.overscanStopIndex > this._lastScannedRowIndex) { + this._lastScannedRowIndex = args.overscanStopIndex; + this._maybeCallOnEndReached(); + } + } + + _handleRowHover({ rowKey, hovered }) { + if (this.state.activeRowKey !== null) { + return; + } + + this.setHoveredRow(hovered ? rowKey : null); + if (typeof this.props.onRowHover === 'function') { + this.props.onRowHover(hovered ? rowKey : undefined); + } + } + + _handleRowClick({ rowKey }) { + if (!this.props.disableRowClick) { + const clickedOnSameRow = this.state.activeRowKey === rowKey; + this.setState({ + hoveredRowKey: rowKey, + activeRowKey: clickedOnSameRow ? null : rowKey, + }); + if (typeof this.props.onRowClick === 'function') { + this.props.onRowClick(clickedOnSameRow ? undefined : rowKey); + } + } + } + + _handleRowExpand({ expanded, rowData, rowIndex, rowKey }) { + const expandedRowKeys = cloneArray(this.getExpandedRowKeys()); + if (expanded) { + if (!expandedRowKeys.indexOf(rowKey) >= 0) expandedRowKeys.push(rowKey); + } else { + const index = expandedRowKeys.indexOf(rowKey); + if (index > -1) { + expandedRowKeys.splice(index, 1); + } + } + // if `expandedRowKeys` is uncontrolled, update internal state + if (this.props.expandedRowKeys === undefined) { + this.setState({ expandedRowKeys }); + } + this.props.onRowExpand({ expanded, rowData, rowIndex, rowKey }); + this.props.onExpandedRowsChange(expandedRowKeys); + } + + _handleColumnResize({ key }, width) { + this.columnManager.setColumnWidth(key, width); + this.setState({ resizingWidth: width }); + + const column = this.columnManager.getColumn(key); + this.props.onColumnResize({ column, width }); + } + + _handleColumnResizeStart({ key }) { + this.setState({ resizingKey: key }); + } + + _handleColumnResizeStop() { + const { resizingKey, resizingWidth } = this.state; + this.setState({ resizingKey: null, resizingWidth: 0 }); + + if (!resizingKey || !resizingWidth) return; + + const column = this.columnManager.getColumn(resizingKey); + this.props.onColumnResizeEnd({ column, width: resizingWidth }); + } + + _handleColumnSort(event) { + const key = event.currentTarget.dataset.key; + const { sortBy, sortState, onColumnSort } = this.props; + let order = SortOrder.ASC; + + if (sortState) { + order = sortState[key] === SortOrder.ASC ? SortOrder.DESC : SortOrder.ASC; + } else if (key === sortBy.key) { + order = sortBy.order === SortOrder.ASC ? SortOrder.DESC : SortOrder.ASC; + } + + const column = this.columnManager.getColumn(key); + onColumnSort({ column, key, order }); + } + + _handleFrozenRowHeightChange(rowKey, size, rowIndex, frozen) { + if (!frozen) { + this._mainRowHeightMap[rowKey] = size; + } else if (frozen === FrozenDirection.RIGHT) { + this._rightRowHeightMap[rowKey] = size; + } else { + this._leftRowHeightMap[rowKey] = size; + } + + const height = Math.max( + this._mainRowHeightMap[rowKey] || 0, + this._leftRowHeightMap[rowKey] || 0, + this._rightRowHeightMap[rowKey] || 0, + ); + + if (this._rowHeightMap[rowKey] !== height) { + this._handleRowHeightChange(rowKey, height, rowIndex); + } + } + + _handleRowHeightChange(rowKey, size, rowIndex) { + if (this._resetIndex === null) this._resetIndex = rowIndex; + else if (this._resetIndex > rowIndex) this._resetIndex = rowIndex; + + this._rowHeightMapBuffer[rowKey] = size; + this._updateRowHeights(); + } +} + +BaseTable.Column = Column; +BaseTable.PlaceholderKey = ColumnManager.PlaceholderKey; + +export default BaseTable; diff --git a/src/src/components/Table/Column.tsx b/src/src/components/Table/Column.tsx new file mode 100644 index 00000000..181a8de1 --- /dev/null +++ b/src/src/components/Table/Column.tsx @@ -0,0 +1,27 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +export const Alignment = { + LEFT: 'left', + CENTER: 'center', + RIGHT: 'right', +}; + +export const FrozenDirection = { + LEFT: 'left', + RIGHT: 'right', + DEFAULT: true, + NONE: false, +}; + +/** + * Column for BaseTable + */ +class Column extends React.Component {} + +Column.Alignment = Alignment; +Column.FrozenDirection = FrozenDirection; + +export default Column; diff --git a/src/src/components/Table/ColumnManager.ts b/src/src/components/Table/ColumnManager.ts new file mode 100644 index 00000000..b0c8a30e --- /dev/null +++ b/src/src/components/Table/ColumnManager.ts @@ -0,0 +1,206 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import { FrozenDirection } from './Column'; + +export default class ColumnManager { + constructor(columns, fixed) { + this._origColumns = []; + this.reset(columns, fixed); + } + + _cache(key, fn) { + if (key in this._cached) return this._cached[key]; + this._cached[key] = fn(); + return this._cached[key]; + } + + reset(columns, fixed) { + this._columns = columns.map((column) => { + let width = column.width; + if (column.resizable) { + // don't reset column's `width` if `width` prop doesn't change + const idx = this._origColumns.findIndex((x) => x.key === column.key); + if (idx >= 0 && this._origColumns[idx].width === column.width) { + width = this._columns[idx].width; + } + } + return { ...column, width }; + }); + this._origColumns = columns; + this._fixed = fixed; + this._cached = {}; + this._columnStyles = this.recomputeColumnStyles(); + } + + resetCache() { + this._cached = {}; + } + + getOriginalColumns() { + return this._origColumns; + } + + getColumns() { + return this._columns; + } + + getVisibleColumns() { + return this._cache('visibleColumns', () => { + return this._columns.filter((column) => !column.hidden); + }); + } + + hasFrozenColumns() { + return this._cache('hasFrozenColumns', () => { + return ( + this._fixed && + this.getVisibleColumns().some((column) => !!column.frozen) + ); + }); + } + + hasLeftFrozenColumns() { + return this._cache('hasLeftFrozenColumns', () => { + return ( + this._fixed && + this.getVisibleColumns().some( + (column) => + column.frozen === FrozenDirection.LEFT || column.frozen === true, + ) + ); + }); + } + + hasRightFrozenColumns() { + return this._cache('hasRightFrozenColumns', () => { + return ( + this._fixed && + this.getVisibleColumns().some( + (column) => column.frozen === FrozenDirection.RIGHT, + ) + ); + }); + } + + getMainColumns() { + return this._cache('mainColumns', () => { + const columns = this.getVisibleColumns(); + if (!this.hasFrozenColumns()) return columns; + + const mainColumns = []; + this.getLeftFrozenColumns().forEach((column) => { + //columns placeholder for the fixed table above them + mainColumns.push({ ...column, [ColumnManager.PlaceholderKey]: true }); + }); + this.getVisibleColumns().forEach((column) => { + if (!column.frozen) mainColumns.push(column); + }); + this.getRightFrozenColumns().forEach((column) => { + mainColumns.push({ ...column, [ColumnManager.PlaceholderKey]: true }); + }); + + return mainColumns; + }); + } + + getLeftFrozenColumns() { + return this._cache('leftFrozenColumns', () => { + if (!this._fixed) return []; + return this.getVisibleColumns().filter( + (column) => + column.frozen === FrozenDirection.LEFT || column.frozen === true, + ); + }); + } + + getRightFrozenColumns() { + return this._cache('rightFrozenColumns', () => { + if (!this._fixed) return []; + return this.getVisibleColumns().filter( + (column) => column.frozen === FrozenDirection.RIGHT, + ); + }); + } + + getColumn(key) { + const idx = this._columns.findIndex((column) => column.key === key); + return this._columns[idx]; + } + + getColumnsWidth() { + return this._cache('columnsWidth', () => { + return this.recomputeColumnsWidth(this.getVisibleColumns()); + }); + } + + getLeftFrozenColumnsWidth() { + return this._cache('leftFrozenColumnsWidth', () => { + return this.recomputeColumnsWidth(this.getLeftFrozenColumns()); + }); + } + + getRightFrozenColumnsWidth() { + return this._cache('rightFrozenColumnsWidth', () => { + return this.recomputeColumnsWidth(this.getRightFrozenColumns()); + }); + } + + recomputeColumnsWidth(columns) { + return columns.reduce((width, column) => width + column.width, 0); + } + + setColumnWidth(key, width) { + const column = this.getColumn(key); + column.width = width; + this._cached = {}; + this._columnStyles[column.key] = this.recomputeColumnStyle(column); + } + + getColumnStyle(key) { + return this._columnStyles[key]; + } + + getColumnStyles() { + return this._columnStyles; + } + + recomputeColumnStyle(column) { + let flexGrow = 0; + let flexShrink = 0; + if (!this._fixed) { + flexGrow = typeof column.flexGrow === 'number' ? column.flexGrow : 0; + flexShrink = + typeof column.flexShrink === 'number' ? column.flexShrink : 1; + } + // workaround for Flex bug on IE: https://github.com/philipwalton/flexbugs#flexbug-7 + const flexValue = `${flexGrow} ${flexShrink} auto`; + + const style = { + ...column.style, + flex: flexValue, + msFlex: flexValue, + WebkitFlex: flexValue, + width: column.width, + overflow: 'hidden', + }; + + if (!this._fixed && column.maxWidth) { + style.maxWidth = column.maxWidth; + } + if (!this._fixed && column.minWidth) { + style.minWidth = column.minWidth; + } + + return style; + } + + recomputeColumnStyles() { + return this._columns.reduce((styles, column) => { + styles[column.key] = this.recomputeColumnStyle(column); + return styles; + }, {}); + } +} + +ColumnManager.PlaceholderKey = '__placeholder__'; diff --git a/src/src/components/Table/ColumnResizer.tsx b/src/src/components/Table/ColumnResizer.tsx new file mode 100644 index 00000000..9848de33 --- /dev/null +++ b/src/src/components/Table/ColumnResizer.tsx @@ -0,0 +1,230 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { addClassName, removeClassName } from './utils'; + +const INVALID_VALUE = null; + +// copied from https://github.com/mzabriskie/react-draggable/blob/master/lib/utils/domFns.js +export function addUserSelectStyles(doc) { + if (!doc) return; + let styleEl = doc.getElementById('react-draggable-style-el'); + if (!styleEl) { + styleEl = doc.createElement('style'); + styleEl.type = 'text/css'; + styleEl.id = 'react-draggable-style-el'; + styleEl.innerHTML = + '.react-draggable-transparent-selection *::-moz-selection {all: inherit;}\n'; + styleEl.innerHTML += + '.react-draggable-transparent-selection *::selection {all: inherit;}\n'; + doc.getElementsByTagName('head')[0].appendChild(styleEl); + } + if (doc.body) addClassName(doc.body, 'react-draggable-transparent-selection'); +} + +export function removeUserSelectStyles(doc) { + if (!doc) return; + try { + if (doc.body) + removeClassName(doc.body, 'react-draggable-transparent-selection'); + if (doc.selection) { + doc.selection.empty(); + } else { + // Remove selection caused by scroll, unless it's a focused input + // (we use doc.defaultView in case we're in an iframe) + const selection = (doc.defaultView || window).getSelection(); + if (selection && selection.type !== 'Caret') { + selection.removeAllRanges(); + } + } + } catch (e) { + // probably IE + } +} + +const eventsFor = { + touch: { + start: 'touchstart', + move: 'touchmove', + stop: 'touchend', + }, + mouse: { + start: 'mousedown', + move: 'mousemove', + stop: 'mouseup', + }, +}; + +let dragEventFor = eventsFor.mouse; + +/** + * ColumnResizer for BaseTable + */ +class ColumnResizer extends React.PureComponent { + constructor(props) { + super(props); + + this.isDragging = false; + this.lastX = INVALID_VALUE; + this.width = 0; + + this._setHandleRef = this._setHandleRef.bind(this); + this._handleClick = this._handleClick.bind(this); + this._handleMouseDown = this._handleMouseDown.bind(this); + this._handleMouseUp = this._handleMouseUp.bind(this); + this._handleTouchStart = this._handleTouchStart.bind(this); + this._handleTouchEnd = this._handleTouchEnd.bind(this); + this._handleDragStart = this._handleDragStart.bind(this); + this._handleDragStop = this._handleDragStop.bind(this); + this._handleDrag = this._handleDrag.bind(this); + } + + componentWillUnmount() { + if (this.handleRef) { + const { ownerDocument } = this.handleRef; + ownerDocument.removeEventListener(eventsFor.mouse.move, this._handleDrag); + ownerDocument.removeEventListener( + eventsFor.mouse.stop, + this._handleDragStop, + ); + ownerDocument.removeEventListener(eventsFor.touch.move, this._handleDrag); + ownerDocument.removeEventListener( + eventsFor.touch.stop, + this._handleDragStop, + ); + removeUserSelectStyles(ownerDocument); + } + } + + render() { + const { + style, + column, + onResizeStart, + onResize, + onResizeStop, + minWidth, + ...rest + } = this.props; + + return ( + +
+ + ); + } + + _setHandleRef(ref) { + this.handleRef = ref; + } + + _handleClick(e) { + e.stopPropagation(); + } + + _handleMouseDown(e) { + dragEventFor = eventsFor.mouse; + this._handleDragStart(e); + } + + _handleMouseUp(e) { + dragEventFor = eventsFor.mouse; + this._handleDragStop(e); + } + + _handleTouchStart(e) { + dragEventFor = eventsFor.touch; + this._handleDragStart(e); + } + + _handleTouchEnd(e) { + dragEventFor = eventsFor.touch; + this._handleDragStop(e); + } + + _handleDragStart(e) { + if (typeof e.button === 'number' && e.button !== 0) return; + + this.isDragging = true; + this.lastX = INVALID_VALUE; + this.width = this.props.column.width; + this.props.onResizeStart(this.props.column); + + const { ownerDocument } = this.handleRef; + addUserSelectStyles(ownerDocument); + ownerDocument.addEventListener(dragEventFor.move, this._handleDrag); + ownerDocument.addEventListener(dragEventFor.stop, this._handleDragStop); + } + + _handleDragStop(e) { + if (!this.isDragging) return; + this.isDragging = false; + + this.props.onResizeStop(this.props.column); + + const { ownerDocument } = this.handleRef; + removeUserSelectStyles(ownerDocument); + ownerDocument.removeEventListener(dragEventFor.move, this._handleDrag); + ownerDocument.removeEventListener(dragEventFor.stop, this._handleDragStop); + } + + _handleDrag(e) { + let clientX = e.clientX; + if (e.type === eventsFor.touch.move) { + e.preventDefault(); + if (e.targetTouches && e.targetTouches[0]) + clientX = e.targetTouches[0].clientX; + } + + const { offsetParent } = this.handleRef; + const offsetParentRect = offsetParent.getBoundingClientRect(); + const x = clientX + offsetParent.scrollLeft - offsetParentRect.left; + + if (this.lastX === INVALID_VALUE) { + this.lastX = x; + return; + } + + const { column, minWidth: MIN_WIDTH } = this.props; + const { width, maxWidth, minWidth = MIN_WIDTH } = column; + const movedX = x - this.lastX; + if (!movedX) return; + + this.width = this.width + movedX; + this.lastX = x; + + let newWidth = this.width; + if (maxWidth && newWidth > maxWidth) { + newWidth = maxWidth; + } else if (newWidth < minWidth) { + newWidth = minWidth; + } + + if (newWidth === width) return; + this.props.onResize(column, newWidth); + } +} + +export default ColumnResizer; diff --git a/src/src/components/Table/DeleteModal.tsx b/src/src/components/Table/DeleteModal.tsx new file mode 100644 index 00000000..132c0933 --- /dev/null +++ b/src/src/components/Table/DeleteModal.tsx @@ -0,0 +1,273 @@ +import React from 'react'; +import _ from 'lodash-es'; +import moment from 'moment'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon, Modal, Text } from 'components/kit'; +import DataList from 'components/kit/DataList'; + +import { DATE_WITH_SECONDS } from 'config/dates/dates'; + +import { processDurationTime } from 'utils/processDurationTime'; + +function DeleteModal({ + opened, + onClose, + selectedRows = {}, + onRowSelect, + deleteRuns, +}: { + opened: boolean; + onClose: () => void; + selectedRows: { [key: string]: any }; + onRowSelect: ({ + actionType, + data, + }: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + }) => { + [key: string]: any; + }; + deleteRuns: (ids: string[]) => { + call: () => Promise; + abort: () => void; + }; +}): React.FunctionComponentElement { + const tableRef = React.useRef({}); + const disabledTableRef = React.useRef({}); + + const tableColumns = [ + { + dataKey: 'experiment', + key: 'experiment', + title: 'Experiment', + width: 0, + flexGrow: 1, + cellRenderer: function cellRenderer({ cellData }: any) { + return ( + +
+ + {cellData} + +
+
+ ); + }, + }, + { + dataKey: 'date', + key: 'date', + title: 'Date', + width: 275, + cellRenderer: function cellRenderer({ cellData }: any) { + return ( + +
+ + {cellData} + +
+
+ ); + }, + }, + { + dataKey: 'name', + key: 'name', + title: 'Name', + width: 0, + flexGrow: 1, + cellRenderer: function cellRenderer({ cellData, rowData }: any) { + return ( +
+ + {cellData} + + {!rowData.isDisabled && ( + + )} +
+ ); + }, + }, + ]; + + const { data, disabledData } = React.useMemo(() => { + let finishedList: any[] = []; + let inProgressList: any[] = []; + const runHashList: string[] = []; + Object.values(selectedRows).forEach((selectedRow: any) => { + if (!runHashList.includes(selectedRow.runHash)) { + runHashList.push(selectedRow.runHash); + const rowData = { + key: selectedRow.runHash, + date: `${moment(selectedRow.creation_time * 1000).format( + DATE_WITH_SECONDS, + )} • ${processDurationTime( + selectedRow?.creation_time * 1000, + Date.now(), + )}`, + experiment: selectedRow?.experiment?.name ?? 'default', + name: selectedRow?.name ?? '-', + runHash: selectedRow.runHash, + selectKey: selectedRow.selectKey, + isInProgress: !selectedRow?.end_time, + isDisabled: !selectedRow?.end_time, + creationTime: selectedRow.creation_time * 1000000, + }; + if (!selectedRow.end_time) { + inProgressList.push(rowData); + } else { + finishedList.push(rowData); + } + } + }); + + finishedList = _.orderBy(finishedList, ['creationTime'], ['desc']); + inProgressList = _.orderBy(inProgressList, ['creationTime'], ['desc']); + + tableRef.current?.updateData?.({ + newData: finishedList, + }); + disabledTableRef.current?.updateData?.({ + newData: inProgressList, + }); + return { + data: finishedList, + disabledData: inProgressList, + }; + }, [selectedRows]); + + function onDelete() { + const ids = data.map((item: any) => item.runHash); + deleteRuns(ids) + .call() + .then(() => onClose()); + } + + return opened ? ( + +
+ + You will lose all the logs and data related to them. This action + cannot be undone. + +
+ + {Object.values(data).length} + + + runs to delete. + +
+ {!_.isEmpty(data) && ( + + )} + {!_.isEmpty(disabledData) && ( +
+ + {Object.values(disabledData).length} + + + runs are still in progress. Unfinished runs cannot be deleted. + +
+ )} + {!_.isEmpty(disabledData) && ( + + )} +
+
+ ) : ( + <> + ); +} + +export default React.memo(DeleteModal); diff --git a/src/src/components/Table/ExpandIcon.tsx b/src/src/components/Table/ExpandIcon.tsx new file mode 100644 index 00000000..55667e94 --- /dev/null +++ b/src/src/components/Table/ExpandIcon.tsx @@ -0,0 +1,62 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; +import cn from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +/** + * default ExpandIcon for BaseTable + */ +class ExpandIcon extends React.PureComponent { + constructor(props) { + super(props); + + this._handleClick = this._handleClick.bind(this); + } + + render() { + const { expandable, expanded, indentSize, depth, onExpand, ...rest } = + this.props; + if (!expandable && indentSize === 0) return null; + + const cls = cn('BaseTable__expand-icon', { + 'BaseTable__expand-icon--expanded': expanded, + }); + return ( + +
+ {expandable && '\u25B8'} +
+
+ ); + } + + _handleClick(e) { + e.stopPropagation(); + e.preventDefault(); + const { onExpand, expanded } = this.props; + onExpand(!expanded); + } +} + +export default ExpandIcon; diff --git a/src/src/components/Table/GridTable.tsx b/src/src/components/Table/GridTable.tsx new file mode 100644 index 00000000..14338bbf --- /dev/null +++ b/src/src/components/Table/GridTable.tsx @@ -0,0 +1,213 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; +import cn from 'classnames'; +import { FixedSizeGrid, VariableSizeGrid } from 'react-window'; +import memoize from 'memoize-one'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import Header from './TableHeader'; +import { getEstimatedTotalRowsHeight } from './utils'; + +/** + * A wrapper of the Grid for internal only + */ +class GridTable extends React.PureComponent { + constructor(props) { + super(props); + + this._setHeaderRef = this._setHeaderRef.bind(this); + this._setBodyRef = this._setBodyRef.bind(this); + this._setInnerRef = this._setInnerRef.bind(this); + this._itemKey = this._itemKey.bind(this); + this._getBodyWidth = this._getBodyWidth.bind(this); + this._handleItemsRendered = this._handleItemsRendered.bind(this); + this._resetColumnWidthCache = memoize((bodyWidth) => { + if (!this.props.estimatedRowHeight) return; + this.bodyRef && this.bodyRef.resetAfterColumnIndex(0, false); + }); + this._getEstimatedTotalRowsHeight = memoize(getEstimatedTotalRowsHeight); + + this.renderRow = this.renderRow.bind(this); + } + + resetAfterRowIndex(rowIndex = 0, shouldForceUpdate) { + if (!this.props.estimatedRowHeight) return; + this.bodyRef && + this.bodyRef.resetAfterRowIndex(rowIndex, shouldForceUpdate); + } + + forceUpdateTable() { + this.headerRef && this.headerRef.forceUpdate(); + this.bodyRef && this.bodyRef.forceUpdate(); + } + + scrollToPosition(args) { + this.headerRef && this.headerRef.scrollTo(args.scrollLeft); + this.bodyRef && this.bodyRef.scrollTo(args); + } + + scrollToTop(scrollTop) { + this.bodyRef && this.bodyRef.scrollTo({ scrollTop }); + } + + scrollToLeft(scrollLeft) { + this.headerRef && this.headerRef.scrollTo(scrollLeft); + this.bodyRef && this.bodyRef.scrollToPosition({ scrollLeft }); + } + + scrollToRow(rowIndex = 0, align = 'auto') { + this.bodyRef && this.bodyRef.scrollToItem({ rowIndex, align }); + } + + getTotalRowsHeight() { + const { data, rowHeight, estimatedRowHeight } = this.props; + + if (estimatedRowHeight) { + return ( + (this.innerRef && this.innerRef.clientHeight) || + this._getEstimatedTotalRowsHeight(data, estimatedRowHeight) + ); + } + return data.length * rowHeight; + } + + renderRow(args) { + const { data, columns, rowRenderer } = this.props; + const rowData = data[args.rowIndex]; + return rowRenderer({ ...args, columns, rowData }); + } + + render() { + const { + containerStyle, + classPrefix, + className, + data, + frozenData, + width, + height, + rowHeight, + estimatedRowHeight, + getRowHeight, + headerWidth, + bodyWidth, + useIsScrolling, + onScroll, + hoveredRowKey, + overscanRowCount, + // omit from rest + style, + onScrollbarPresenceChange, + ...rest + } = this.props; + const headerHeight = this._getHeaderHeight(); + const frozenRowCount = frozenData.length; + const frozenRowsHeight = rowHeight * frozenRowCount; + const cls = cn(`${classPrefix}__table`, className); + const containerProps = containerStyle ? { style: containerStyle } : null; + const Grid = estimatedRowHeight ? VariableSizeGrid : FixedSizeGrid; + + this._resetColumnWidthCache(bodyWidth); + return ( + +
+ + {this.renderRow} + + {headerHeight + frozenRowsHeight > 0 && ( + // put header after body and reverse the display order via css + // to prevent header's shadow being covered by body +
0 ? hoveredRowKey : null} + /> + )} +
+
+ ); + } + + _setHeaderRef(ref) { + this.headerRef = ref; + } + + _setBodyRef(ref) { + this.bodyRef = ref; + } + + _setInnerRef(ref) { + this.innerRef = ref; + } + + _itemKey({ rowIndex }) { + const { data, rowKey } = this.props; + return data[rowIndex][rowKey]; + } + + _getHeaderHeight() { + const { headerHeight } = this.props; + if (Array.isArray(headerHeight)) { + return headerHeight.reduce((sum, height) => sum + height, 0); + } + return headerHeight; + } + + _getBodyWidth() { + return this.props.bodyWidth; + } + + _handleItemsRendered({ + overscanRowStartIndex, + overscanRowStopIndex, + visibleRowStartIndex, + visibleRowStopIndex, + }) { + this.props.onRowsRendered({ + overscanStartIndex: overscanRowStartIndex, + overscanStopIndex: overscanRowStopIndex, + startIndex: visibleRowStartIndex, + stopIndex: visibleRowStopIndex, + }); + } +} + +export default GridTable; diff --git a/src/src/components/Table/GroupedColumnHeader.tsx b/src/src/components/Table/GroupedColumnHeader.tsx new file mode 100644 index 00000000..d5567a9a --- /dev/null +++ b/src/src/components/Table/GroupedColumnHeader.tsx @@ -0,0 +1,47 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import { formatValue } from 'utils/formatValue'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; + +const TITLE_MAX_ROW_LENGTH = 5; +function GroupedColumnHeader({ + data, +}: { + data: Array; +}): React.FunctionComponentElement { + const Title: React.ReactNode = React.useMemo(() => { + const filteredData = data.filter((val) => val); + const isEllipsis: boolean = filteredData.length > TITLE_MAX_ROW_LENGTH; + return filteredData + .slice(0, isEllipsis ? TITLE_MAX_ROW_LENGTH : data.length) + .map((val: any, index) => { + const value = isSystemMetric(val) + ? formatSystemMetricName(val) + : formatValue(val); + return ( +
+ {value} + {index + 1 === TITLE_MAX_ROW_LENGTH ? '...' : ''} +
+ ); + }); + }, [data]); + + return ( +
+ {Title}
}> +
+ Mixed: + {data.length} values +
+ +
+ ); +} + +GroupedColumnHeader.displayName = 'GroupedColumnHeader'; + +export default React.memo(GroupedColumnHeader); diff --git a/src/src/components/Table/RunNameColumn.tsx b/src/src/components/Table/RunNameColumn.tsx new file mode 100644 index 00000000..aca473a0 --- /dev/null +++ b/src/src/components/Table/RunNameColumn.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { Link as RouteLink } from 'react-router-dom'; +import classNames from 'classnames'; + +import { Link, Tooltip } from '@material-ui/core'; + +import StatusLabel from 'components/StatusLabel'; + +import { PathEnum } from 'config/enums/routesEnum'; + +function RunNameColumn({ + active, + runHash, + run, + hidden = false, +}: { + active: boolean; + runHash: string; + run: string; + hidden?: boolean; +}) { + return ( + + ); +} + +RunNameColumn.displayName = 'RunNameColumn'; + +export default React.memo(RunNameColumn); diff --git a/src/src/components/Table/SortIndicator.tsx b/src/src/components/Table/SortIndicator.tsx new file mode 100644 index 00000000..35c1c4d8 --- /dev/null +++ b/src/src/components/Table/SortIndicator.tsx @@ -0,0 +1,37 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; +import cn from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import SortOrder from './SortOrder'; + +/** + * default SortIndicator for BaseTable + */ +const SortIndicator = ({ sortOrder, className, style }) => { + const cls = cn('BaseTable__sort-indicator', className, { + 'BaseTable__sort-indicator--descending': sortOrder === SortOrder.DESC, + }); + return ( + +
+ {sortOrder === SortOrder.DESC ? '\u2193' : '\u2191'} +
+
+ ); +}; + +export default SortIndicator; diff --git a/src/src/components/Table/SortOrder.ts b/src/src/components/Table/SortOrder.ts new file mode 100644 index 00000000..b1f39227 --- /dev/null +++ b/src/src/components/Table/SortOrder.ts @@ -0,0 +1,15 @@ +/** + * Sort order for BaseTable + */ +const SortOrder = { + /** + * Sort data in ascending order + */ + ASC: 'asc', + /** + * Sort data in descending order + */ + DESC: 'desc', +}; + +export default SortOrder; diff --git a/src/src/components/Table/Table.scss b/src/src/components/Table/Table.scss new file mode 100644 index 00000000..dd51e992 --- /dev/null +++ b/src/src/components/Table/Table.scss @@ -0,0 +1,176 @@ +@use 'src/styles/abstracts' as *; + +.Table__header { + display: flex; + padding: 0.2rem 1rem; + height: toRem(38px); + align-items: center; + &__select__resize { + padding-right: 1rem; + display: flex; + align-items: center; + border-right: $border-main; + margin-right: 1rem; + + i { + &:nth-child(2) { + margin: 0 0.875rem; + } + } + } + &__buttons { + flex: 1; + } + &__item { + cursor: pointer; + display: flex; + align-items: center; + border: 0.0625rem solid transparent; + transition: all 0.18s ease-out; + border-radius: $radius-main; + padding: 0 0.375rem !important; + margin-right: 0.375rem !important; + i { + margin-right: 0.75rem; + } + &.opened { + border: $border-main-active; + background-color: $primary-color-10; + } + &--diffBtn { + margin-right: $space-xs; + } + } +} + +.ActionModalWrapper { + max-width: 1800px; +} + +.ActionModal { + width: 100%; + &__container { + width: 60vw; + max-width: 100%; + .Modal__content { + width: 100%; + } + } + &__Table { + .BaseTable__header { + border-radius: toRem(4px) toRem(4px) 0 0; + border-bottom: unset; + .BaseTable__header-row { + border-bottom: unset; + } + } + .BaseTable__header-cell { + background: $cuddle-20; + border-right: unset; + } + .BaseTable__row { + border-bottom: unset; + + .BaseTable__row-cell { + border-right: unset; + } + &:nth-child(odd) { + .BaseTable__row-cell { + background: $white; + } + } + &:nth-child(even) { + .BaseTable__row-cell { + background: $cuddle-10; + } + } + &:hover { + .BaseTable__row-cell { + background: $primary-color-10; + } + } + } + } + &__disabledTableWrapper { + opacity: 0.5; + .BaseTable__body > div { + pointer-events: none; + } + } + &__experimentRow { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + .BaseTable__row:hover { + .ActionModal__tableRowWithAction { + &__deleteButton { + display: flex; + } + } + } + &__tableRowWithAction { + display: flex; + align-items: center; + width: 100%; + justify-content: space-between; + position: relative; + &.isDisabled { + justify-content: flex-start; + } + &__deleteButton { + display: none; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + } + &__name { + padding-right: 2.875rem; + &.in-progress { + &::after { + content: ''; + position: absolute; + right: 1.75rem; + width: 0.375rem; + height: 0.375rem; + top: 50%; + border-radius: $border-radius-circle; + background: $success-color-100; + transform: translate(-50%, -50%); + } + } + } + } + &__tableTitle { + margin-top: 1rem; + display: block; + margin-bottom: toRem(6px); + &__count { + margin-right: $space-xxxs; + } + } +} +.TableColumn__SortButton { + margin: 0 $space-xxxs; +} +.selectedRowActionsContainer { + &__selectedRowsCount { + padding: 0 1.25rem 0 0.25rem; + margin: 0.25rem 0; + display: flex; + align-items: center; + border-right: $border-main; + margin-right: 1rem; + } +} + +.RunNameColumn { + display: flex; + align-items: center; + &.isHidden { + .MuiTypography-root { + color: $primary-color-50; + } + } +} diff --git a/src/src/components/Table/Table.tsx b/src/src/components/Table/Table.tsx new file mode 100644 index 00000000..723601cc --- /dev/null +++ b/src/src/components/Table/Table.tsx @@ -0,0 +1,1162 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; +import { isEmpty, isEqual, isNil } from 'lodash-es'; +import { useResizeObserver } from 'hooks'; +import _ from 'lodash-es'; + +import { Button, Icon, Text } from 'components/kit'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import IllustrationBlock from 'components/IllustrationBlock/IllustrationBlock'; +import ResizeModeActions from 'components/ResizeModeActions/ResizeModeActions'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { + ROW_CELL_SIZE_CONFIG, + RowHeightSize, + TABLE_DEFAULT_CONFIG, +} from 'config/table/tableConfigs'; +import { IllustrationsEnum } from 'config/illustrationConfig/illustrationConfig'; + +import SortPopover from 'pages/Metrics/components/Table/SortPopover/SortPopover'; +import ManageColumnsPopover from 'pages/Metrics/components/Table/ManageColumnsPopover/ManageColumnsPopover'; +import HideRowsPopover from 'pages/Metrics/components/Table/HideRowsPopover/HideRowsPopover'; +import RowHeightPopover from 'pages/Metrics/components/Table/RowHeightPopover/RowHeightPopover'; +import CompareSelectedRunsPopover from 'pages/Metrics/components/Table/CompareSelectedRunsPopover'; +import MetricsValueKeyPopover from 'pages/Metrics/components/Table/MetricsValueKeyPopover'; + +import { ITableProps } from 'types/components/Table/Table'; + +import CustomTable from '../CustomTable/Table'; + +import ArchiveModal from './ArchiveModal'; +import DeleteModal from './DeleteModal'; +import AutoResizer from './AutoResizer'; +import BaseTable from './BaseTable'; + +import './Table.scss'; + +const Table = React.forwardRef(function Table( + { + onManageColumns, + onColumnsVisibilityChange, + onTableDiffShow, + sameValueColumns, + onSort, + onRowsChange, + onExport, + onRowHeightChange, + onRowHover = () => {}, + onRowClick = () => {}, + onTableResizeModeChange, + onMetricsValueKeyChange, + metricsValueKey, + custom, + data, + columns, + navBarItems, + rowHeight = RowHeightSize.md, + estimatedRowHeight, + headerHeight = RowHeightSize.md, + sortOptions, + hideHeaderActions = false, + fixed = true, + excludedFields, + setExcludedFields, + alwaysVisibleColumns, + rowHeightMode, + hiddenColumns, + updateColumns, + columnsWidths, + updateColumnsWidths, + sortFields, + hiddenRows, + isLoading, + showRowClickBehaviour = true, + showResizeContainerActionBar = true, + resizeMode, + onSortReset, + height = 'calc(100% - 40px)', + multiSelect = false, + selectedRows, + onRowSelect, + minHeight, + archiveRuns, + deleteRuns, + hideSystemMetrics, + className = '', + appName, + hiddenChartRows, + focusedState, + columnsOrder, + illustrationConfig, + disableRowClick = false, + onToggleColumnsColorScales, + columnsColorScales, + onRowsVisibilityChange, + visualizationElementType, + noColumnActions, + ...props + }: ITableProps, + ref, +): React.FunctionComponentElement { + const tableRef = React.useRef(); + const startIndex = React.useRef(0); + const endIndex = React.useRef(0); + const expandedGroups = React.useRef([]); + const hoveredRowKey = React.useRef(null); + const activeRowKey = React.useRef(null); + const tableContainerRef = React.useRef(); + const dataRef = React.useRef(data); + const columnsRef = React.useRef(columns ?? []); + const hiddenColumnsRef = React.useRef(hiddenColumns); + const scrollTopMutableRef = React.useRef({ top: 0 }); + + const [rowData, setRowData] = React.useState(data); + const [columnsData, setColumnsData] = React.useState(columns ?? []); + const [expanded, setExpanded] = React.useState({}); + const [isOpenDeleteSelectedPopup, setIsOpenDeleteSelectedPopup] = + React.useState(false); + const [isOpenUnarchiveSelectedPopup, setIsOpenUnarchiveSelectedPopup] = + React.useState(false); + const [isOpenArchiveSelectedPopup, setIsOpenArchiveSelectedPopup] = + React.useState(false); + const [tableBulkActionsVisibility, setTableBulkActionsVisibility] = + React.useState<{ + delete: boolean; + archive: boolean; + unarchive: boolean; + hideItems: boolean; + showItems: boolean; + }>({ + delete: false, + archive: false, + unarchive: false, + hideItems: false, + showItems: false, + }); + const [listWindow, setListWindow] = React.useState({ + top: 0, + left: 0, + height: 0, + width: 0, + availableSpace: 0, + }); + + let groups = !Array.isArray(rowData); + + React.useEffect(() => { + if (focusedState && !focusedState.active) { + activeRowKey.current = null; + } + }, [focusedState]); + + React.useEffect(() => { + updateFocusedRow(`rowKey-${activeRowKey.current}`); + }, [selectedRows]); + + React.useEffect(() => { + if (activeRowKey.current === null) { + updateHoveredRow(`rowKey-${hoveredRowKey.current}`); + } else { + updateFocusedRow(`rowKey-${activeRowKey.current}`); + } + }, [listWindow]); + + React.useImperativeHandle(ref, () => ({ + updateData: updateData, + setHoveredRow: setHoveredRow, + setActiveRow: setActiveRow, + scrollToRow: scrollToRow, + })); + + function calculateWindow({ + scrollTop, + offsetHeight, + itemHeight, + groupMargin, + }) { + const offset = 10; + + if (groups) { + let beforeScrollHeight = 0; + let scrollBottomHeight = 0; + let start = 0; + let end = 0; + let startIsSet = false; + let endIsSet = false; + for (let groupKey in dataRef.current) { + beforeScrollHeight += itemHeight + groupMargin; + scrollBottomHeight += itemHeight + groupMargin; + if (expandedGroups.current.includes(groupKey)) { + // eslint-disable-next-line no-loop-func + dataRef.current[groupKey].items.forEach((row) => { + if (scrollTop > beforeScrollHeight) { + beforeScrollHeight += itemHeight; + } else if (!startIsSet) { + start = row.index; + startIsSet = true; + } + + if (scrollBottomHeight < scrollTop + offsetHeight) { + scrollBottomHeight += itemHeight; + } else if (!endIsSet) { + end = row.index; + endIsSet = true; + } + }); + } else { + if (!endIsSet && !!dataRef.current[groupKey]?.items[0]?.index) { + end = dataRef.current[groupKey]?.items[0]?.index; + } + } + } + + const startIndex = start < offset ? 0 : start - offset; + const endIndex = end + offset; + + return { + startIndex, + endIndex, + }; + } + + const windowSize = Math.ceil(offsetHeight / itemHeight); + const start = Math.floor(scrollTop / itemHeight); + const startIndex = start < offset ? 0 : start - offset; + const endIndex = start + windowSize + offset; + + return { + startIndex, + endIndex, + }; + } + + function updateData({ newData, newColumns, hiddenColumns, dynamicData }) { + if (custom && dynamicData) { + if (!!newData) { + dataRef.current = newData; + } + if (!!hiddenColumns) { + hiddenColumnsRef.current = hiddenColumns; + } + if (!!newColumns) { + columnsRef.current = newColumns; + setColumnsData(newColumns); + } + virtualizedUpdate(); + } else { + if (!!newData) { + dataRef.current = newData; + setRowData(newData); + } + if (!!hiddenColumns) { + hiddenColumnsRef.current = hiddenColumns; + } + if (!!newColumns) { + columnsRef.current = newColumns; + setColumnsData(newColumns); + } + } + } + + function setHoveredRow(rowKey: string) { + window.requestAnimationFrame(() => { + if (custom) { + if (hoveredRowKey.current === rowKey) { + hoveredRowKey.current = null; + } else { + hoveredRowKey.current = rowKey; + } + if (activeRowKey.current === null) { + updateHoveredRow(`rowKey-${hoveredRowKey.current}`); + } + } else { + tableRef.current?.setHoveredRow(rowKey); + } + }); + } + + function setActiveRow(rowKey: string, toggle = false) { + window.requestAnimationFrame(() => { + if (custom) { + if (toggle && activeRowKey.current === rowKey) { + activeRowKey.current = null; + } else { + activeRowKey.current = rowKey; + } + updateFocusedRow(`rowKey-${activeRowKey.current}`); + } else { + tableRef.current?.setActiveRow(rowKey); + } + }); + } + + function scrollToRow(rowKey: string) { + window.requestAnimationFrame(() => { + if (custom) { + let top = 0; + if (groups) { + let groupCount = 0; + loop: for (let key in data) { + top += + ROW_CELL_SIZE_CONFIG[rowHeight]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargins; + for (let i = 0; i < data[key]?.items?.length; i++) { + if (data[key].items[i].key === rowKey) { + top += i * rowHeight; + if (!expanded[key]) { + expandedGroups.current.push(key); + setExpanded( + Object.fromEntries( + expandedGroups.current.map((key) => [key, true]), + ), + ); + } + break loop; + } + } + top += + rowHeight + + ((ROW_CELL_SIZE_CONFIG[rowHeight]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin) / + 2) * + groupCount; + if (expanded[key]) { + top += data[key].items.length * rowHeight; + } + groupCount++; + } + } else { + for (let i = 0; i < data?.length; i++) { + if (data[i].key === rowKey) { + top = i * rowHeight; + break; + } + } + } + + if ( + tableContainerRef.current && + (tableContainerRef.current.scrollTop > top || + tableContainerRef.current.scrollTop + + tableContainerRef.current.offsetHeight < + top) + ) { + setTimeout(() => { + window.requestAnimationFrame(() => { + tableContainerRef.current.scrollTo({ + top, + }); + }); + }, 100); + } + } else { + tableRef.current?.scrollToRowByKey(rowKey); + } + }); + } + + function virtualizedUpdate() { + if (groups) { + window.requestAnimationFrame(() => { + ['value', 'step', 'epoch', 'time'].forEach((colKey) => { + for (let groupKey in dataRef.current) { + const groupHeaderRowCell = document.querySelector( + `.Table__cell.${colKey}.index-${groupKey}`, + ); + if (!!groupHeaderRowCell) { + const groupRow = dataRef.current[groupKey]; + if (!!groupRow && !!groupRow.data) { + if (colKey === 'value') { + groupHeaderRowCell.children[0].children[0].children[0].textContent = + groupRow.data.aggregation.area.min; + groupHeaderRowCell.children[0].children[0].children[1].textContent = + groupRow.data.aggregation.line; + groupHeaderRowCell.children[0].children[0].children[2].textContent = + groupRow.data.aggregation.area.max; + if (!isNil(groupRow.data.aggregation.area.stdDevValue)) { + groupHeaderRowCell.children[0].children[0].children[3].textContent = + groupRow.data.aggregation.area.stdDevValue; + } + if (!isNil(groupRow.data.aggregation.area.stdErrValue)) { + groupHeaderRowCell.children[0].children[0].children[3].textContent = + groupRow.data.aggregation.area.stdErrValue; + } + } else { + groupHeaderRowCell.textContent = groupRow.data[colKey]; + } + if (expandedGroups.current.includes(groupKey)) { + groupRow.items.forEach((row) => { + if (row.index > endIndex.current) { + return; + } + if (row.index >= startIndex.current) { + const cell = document.querySelector( + `.Table__cell.${colKey}.index-${row.index}`, + ); + if (!!cell) { + cell.textContent = row[colKey]; + } + } + }); + } + } + } + } + }); + }); + } else { + window.requestAnimationFrame(() => { + ['value', 'step', 'epoch', 'time'].forEach((colKey) => { + for (let i = startIndex.current; i < endIndex.current; i++) { + const cell = document.querySelector( + `.Table__cell.${colKey}.index-${i}`, + ); + if (!!cell) { + const row = dataRef.current[i]; + if (!!row) { + cell.textContent = row[colKey]; + } + } + } + }); + }); + } + } + + function onGroupExpandToggle(groupKey) { + if (Array.isArray(groupKey)) { + expandedGroups.current = groupKey; + } else if (expandedGroups.current.includes(groupKey)) { + expandedGroups.current = expandedGroups.current.filter( + (item) => item !== groupKey, + ); + } else { + expandedGroups.current = expandedGroups.current.concat([groupKey]); + } + + const windowEdges = calculateWindow({ + scrollTop: tableContainerRef.current.scrollTop, + offsetHeight: tableContainerRef.current.offsetHeight, + scrollHeight: tableContainerRef.current.scrollHeight, + itemHeight: rowHeight, + groupMargin: + ROW_CELL_SIZE_CONFIG[rowHeight]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin, + }); + + startIndex.current = windowEdges.startIndex; + endIndex.current = windowEdges.endIndex; + + virtualizedUpdate(); + } + + function rowHoverHandler(row) { + if (activeRowKey.current === null) { + if (typeof onRowHover === 'function') { + onRowHover(row.key); + } + hoveredRowKey.current = row.key; + updateHoveredRow(`rowKey-${row.key}`); + } + } + + function rowClickHandler(row) { + if (showRowClickBehaviour) { + if (activeRowKey.current === row.key) { + activeRowKey.current = null; + } else { + activeRowKey.current = row.key; + } + + updateFocusedRow(`rowKey-${activeRowKey.current}`); + } + + if (typeof onRowClick === 'function') { + onRowClick( + activeRowKey.current === null ? undefined : activeRowKey.current, + ); + } + } + + function updateHoveredRow(activeRowClass) { + const prevActiveRow = document.querySelectorAll('.Table__cell.focused'); + if (!!prevActiveRow && prevActiveRow.length > 0) { + prevActiveRow.forEach((cell) => cell.classList.remove('focused')); + } + if (activeRowClass !== 'rowKey-null') { + window.requestAnimationFrame(() => { + const prevHoveredRow = document.querySelectorAll( + '.Table__cell.hovered', + ); + if (!!prevHoveredRow && prevHoveredRow.length > 0) { + prevHoveredRow.forEach((cell) => cell.classList.remove('hovered')); + } + + const activeRow = document.querySelectorAll( + `.Table__cell.${activeRowClass}`, + ); + + if (!!activeRow && activeRow.length > 0) { + activeRow.forEach((cell) => cell.classList.add('hovered')); + } + }); + } + } + + function updateFocusedRow(activeRowClass) { + const prevHoveredRow = document.querySelectorAll('.Table__cell.hovered'); + if (!!prevHoveredRow && prevHoveredRow.length > 0) { + prevHoveredRow.forEach((cell) => cell.classList.remove('hovered')); + } + if (activeRowClass !== 'rowKey-null') { + window.requestAnimationFrame(() => { + const prevActiveRow = document.querySelectorAll('.Table__cell.focused'); + if (!!prevActiveRow && prevActiveRow.length > 0) { + prevActiveRow.forEach((cell) => cell.classList.remove('focused')); + } + + const activeRow = document.querySelectorAll( + `.Table__cell.${activeRowClass}`, + ); + + if (!!activeRow && activeRow.length > 0) { + activeRow.forEach((cell) => cell.classList.add('focused')); + } + }); + } + } + + function setListWindowMeasurements() { + const leftPane = + tableContainerRef.current?.querySelector('.Table__pane--left'); + const rightPane = tableContainerRef.current?.querySelector( + '.Table__pane--right', + ); + let availableSpace = tableContainerRef.current?.offsetWidth ?? 0; + + if (leftPane || rightPane) { + availableSpace = + tableContainerRef.current.offsetWidth - + (leftPane?.offsetWidth ?? 0) - + (rightPane?.offsetWidth ?? 0) - + 32; // the selection section (checkboxes) + } + + setListWindow({ + top: tableContainerRef.current?.scrollTop, + left: tableContainerRef.current?.scrollLeft, + height: tableContainerRef.current?.offsetHeight, + width: tableContainerRef.current?.offsetWidth, + availableSpace, + }); + } + + function onToggleDeletePopup() { + setIsOpenDeleteSelectedPopup(!isOpenDeleteSelectedPopup); + } + + function onToggleArchivePopup() { + setIsOpenArchiveSelectedPopup(!isOpenArchiveSelectedPopup); + } + + function onToggleUnarchivePopup() { + setIsOpenUnarchiveSelectedPopup(!isOpenUnarchiveSelectedPopup); + } + + function onHideSelectedItems() { + onBatchRowsVisibilityChange('hide'); + } + + function onShowSelectedItems() { + onBatchRowsVisibilityChange('show'); + } + + function onBatchRowsVisibilityChange(changeMode: 'hide' | 'show') { + let data: any[] = []; + const selectedRowsValues = Object.values(selectedRows); + selectedRowsValues.forEach((selectedRow: any) => { + if (changeMode === 'hide') { + if (!selectedRow.isHidden) { + data.push(selectedRow.key); + } + } else { + if (selectedRow.isHidden) { + data.push(selectedRow.key); + } + } + }); + + onRowsVisibilityChange(data); + onRowSelect({ actionType: 'removeAll', data: selectedRowsValues }); + } + + React.useEffect(() => { + if (custom && !!tableContainerRef.current) { + const windowEdges = calculateWindow({ + scrollTop: tableContainerRef.current.scrollTop, + offsetHeight: tableContainerRef.current.offsetHeight, + scrollHeight: tableContainerRef.current.scrollHeight, + itemHeight: rowHeight, + groupMargin: + ROW_CELL_SIZE_CONFIG[rowHeight]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin, + }); + + startIndex.current = windowEdges.startIndex; + endIndex.current = windowEdges.endIndex; + + virtualizedUpdate(); + + tableContainerRef.current.onscroll = ({ target }) => { + const windowEdges = calculateWindow({ + scrollTop: target.scrollTop, + offsetHeight: target.offsetHeight, + scrollHeight: target.scrollHeight, + itemHeight: rowHeight, + groupMargin: + ROW_CELL_SIZE_CONFIG[rowHeight]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin, + }); + + startIndex.current = windowEdges.startIndex; + endIndex.current = windowEdges.endIndex; + virtualizedUpdate(); + + const isDownScrolling = + scrollTopMutableRef.current.top < target.scrollTop; + scrollTopMutableRef.current.top = target.scrollTop; + + if ( + props.allowInfiniteLoading && + props.infiniteLoadHandler && + isDownScrolling + ) { + if ( + target.scrollTop + target.offsetHeight > + target.scrollHeight - 2 * rowHeight + ) { + props.infiniteLoadHandler(); + } + } + setListWindowMeasurements(); + }; + } + + return () => { + if (custom && tableContainerRef.current) { + // eslint-disable-next-line react-hooks/exhaustive-deps + tableContainerRef.current.onscroll = null; + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [custom, rowData]); + + React.useEffect(() => { + if (custom) { + setListWindowMeasurements(); + } + }, [custom, columnsWidths, rowData]); + + React.useEffect(() => { + if (custom) { + requestAnimationFrame(() => { + if (!activeRowKey.current) { + updateHoveredRow( + `rowKey-${ + activeRowKey.current + ? activeRowKey.current + : hoveredRowKey.current + }`, + ); + } + }); + } + }, [custom, listWindow]); + + const observerReturnCallback = React.useCallback(() => { + setListWindowMeasurements(); + }, []); + + React.useEffect(() => { + const tableBulkActionsVisibility: { + delete: boolean; + archive: boolean; + unarchive: boolean; + hideItems: boolean; + showItems: boolean; + } = { + delete: false, + archive: false, + unarchive: false, + hideItems: false, + showItems: false, + }; + const values = Object.values(selectedRows || {}); + values.forEach((value) => { + if ( + !tableBulkActionsVisibility.delete || + !tableBulkActionsVisibility.archive || + !tableBulkActionsVisibility.unarchive || + !tableBulkActionsVisibility.hideItems || + !tableBulkActionsVisibility.showItems + ) { + if (value.archived) { + tableBulkActionsVisibility.archive = true; + } else { + tableBulkActionsVisibility.unarchive = true; + } + if (value.end_time) { + tableBulkActionsVisibility.delete = true; + } + if (onRowsVisibilityChange) { + if (value.isHidden) { + tableBulkActionsVisibility.showItems = true; + } else { + tableBulkActionsVisibility.hideItems = true; + } + } + } + }); + + setTableBulkActionsVisibility(tableBulkActionsVisibility); + }, [selectedRows, onRowsVisibilityChange]); + + const sortPopoverChanged: boolean = React.useMemo(() => { + return ( + TABLE_DEFAULT_CONFIG[appName as Exclude]?.sortFields + ?.length !== sortFields?.length + ); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [sortFields]); + + useResizeObserver( + observerReturnCallback, + tableContainerRef, + sortPopoverChanged, + ); + + const isDiffButtonDisabled: boolean = React.useMemo(() => { + if (sameValueColumns) { + let filteredColumns: string[] = sameValueColumns?.filter( + (value) => + !TABLE_DEFAULT_CONFIG[appName].nonHidableColumns.has(value) && + !hiddenColumns?.includes(value), + ); + return !filteredColumns.length; + } + }, [appName, sameValueColumns, hiddenColumns]); + + const selectedRunsQuery: string = React.useMemo(() => { + if (!_.isEmpty(selectedRows)) { + return `run.hash in [${_.uniq( + Object.values(selectedRows)?.map((row: any) => `"${row.runHash}"`), + ).join(',')}]`; + } + }, [selectedRows]); + + // The right check is !props.isInfiniteLoading && (isLoading || isNil(rowData)) + // but after setting isInfiniteLoading to true, the rowData becomes null, unnecessary renders happening + // @TODO sanitize this point + return ( + + {!isEmpty(rowData) ? ( +
+ {!hideHeaderActions && isEmpty(selectedRows) ? ( +
+ {showResizeContainerActionBar && ( + + )} + +
+ {onManageColumns && ( + item.key !== '#' && item.key !== 'actions', + )} + columnsOrder={columnsOrder} + hiddenColumns={hiddenColumns} + hideSystemMetrics={hideSystemMetrics} + onManageColumns={onManageColumns} + onColumnsVisibilityChange={onColumnsVisibilityChange} + appName={appName} + /> + )} + {onRowsChange && ( + + )} + {onSort && ( + ( + + )} + component={ + + } + /> + )} + {onRowHeightChange && ( + + )} + {onMetricsValueKeyChange && ( + + )} +
+ {onTableDiffShow && ( + + )} + {onExport && ( +
+ +
+ )} +
+ ) : !hideHeaderActions && !isEmpty(selectedRows) && multiSelect ? ( +
+
+ + {Object.keys(selectedRows).length} Selected + +
+ {tableBulkActionsVisibility.delete && ( +
+ +
+ )} + {tableBulkActionsVisibility.unarchive && ( +
+ +
+ )} + {tableBulkActionsVisibility.archive && ( +
+ +
+ )} + {tableBulkActionsVisibility.hideItems && ( +
+ +
+ )} + {tableBulkActionsVisibility.showItems && ( +
+ +
+ )} +
+ +
+
+ ) : ( + '' + )} +
+ + {({ width, height }) => + custom ? ( +
+ + !col.isHidden)} + onGroupExpandToggle={onGroupExpandToggle} + onRowHover={rowHoverHandler} + onRowClick={ + showRowClickBehaviour ? rowClickHandler : undefined + } + listWindow={listWindow} + multiSelect={multiSelect} + selectedRows={selectedRows || {}} + onRowSelect={onRowSelect} + columnsColorScales={columnsColorScales} + onToggleColumnsColorScales={onToggleColumnsColorScales} + noColumnActions={noColumnActions} + {...props} + /> + +
+ ) : ( + + rowData[rowIndex]?.rowProps} + sortBy={{}} + useIsScrolling={false} + overscanRowCount={1} + onEndReachedThreshold={500} + getScrollbarSize={() => null} + ignoreFunctionInColumnCompare={false} + onScroll={() => null} + onRowsRendered={() => null} + onScrollbarPresenceChange={() => null} + onRowExpand={() => null} + onExpandedRowsChange={() => null} + onColumnSort={() => null} + onColumnResize={() => null} + onColumnResizeEnd={() => null} + onRowHover={onRowHover} + onRowClick={onRowClick} + disableRowClick={disableRowClick} + /> + + ) + } +
+
+ + + +
+ ) : ( + + )} +
+ ); +}); + +function propsComparator( + prevProps: ITableProps, + nextProps: ITableProps, +): boolean { + // Add custom here checks here + + if (prevProps.isLoading !== nextProps.isLoading) { + return false; + } + + if (prevProps.rowHeight !== nextProps.rowHeight) { + return false; + } + + if (prevProps.metricsValueKey !== nextProps.metricsValueKey) { + return false; + } + + if (prevProps.sortFields !== nextProps.sortFields) { + return false; + } + + if (prevProps.resizeMode !== nextProps.resizeMode) { + return false; + } + + if (prevProps.columnsWidths !== nextProps.columnsWidths) { + return false; + } + + if (prevProps.selectedRows !== nextProps.selectedRows) { + return false; + } + + if (prevProps.hiddenColumns !== nextProps.hiddenColumns) { + return false; + } + + if (prevProps.hiddenChartRows !== nextProps.hiddenChartRows) { + return false; + } + + if (prevProps.columnsOrder !== nextProps.columnsOrder) { + return false; + } + + if (prevProps.focusedState?.active !== nextProps.focusedState?.active) { + return false; + } + + if (prevProps.columnsColorScales !== nextProps.columnsColorScales) { + return false; + } + + if (!isEqual(prevProps.illustrationConfig, nextProps.illustrationConfig)) { + return false; + } + + return true; +} + +export default React.memo(Table, propsComparator); diff --git a/src/src/components/Table/TableCell.tsx b/src/src/components/Table/TableCell.tsx new file mode 100644 index 00000000..eb8e98b7 --- /dev/null +++ b/src/src/components/Table/TableCell.tsx @@ -0,0 +1,28 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { toString } from './utils'; + +/** + * Cell component for BaseTable + */ +const TableCell = ({ + className, + cellData, + column, + columnIndex, + rowData, + rowIndex, +}) => ( + +
+ {React.isValidElement(cellData) ? cellData : toString(cellData)} +
+
+); + +export default TableCell; diff --git a/src/src/components/Table/TableHeader.tsx b/src/src/components/Table/TableHeader.tsx new file mode 100644 index 00000000..0e2c5f25 --- /dev/null +++ b/src/src/components/Table/TableHeader.tsx @@ -0,0 +1,74 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +class TableHeader extends React.PureComponent { + constructor(props) { + super(props); + + this.renderHeaderRow = this.renderHeaderRow.bind(this); + this.renderFrozenRow = this.renderFrozenRow.bind(this); + this._setRef = this._setRef.bind(this); + } + + scrollTo(offset) { + if (this.headerRef) this.headerRef.scrollLeft = offset; + } + + renderHeaderRow(height, index) { + const { columns, headerRenderer } = this.props; + if (height <= 0) return null; + + const style = { width: '100%', height }; + return headerRenderer({ style, columns, headerIndex: index }); + } + + renderFrozenRow(rowData, index) { + const { columns, rowHeight, rowRenderer } = this.props; + const style = { width: '100%', height: rowHeight }; + // for frozen row the `rowIndex` is negative + const rowIndex = -index - 1; + return rowRenderer({ style, columns, rowData, rowIndex }); + } + + render() { + const { className, width, height, rowWidth, headerHeight, frozenData } = + this.props; + if (height <= 0) return null; + + const style = { + width, + height: height, + position: 'relative', + overflow: 'hidden', + }; + + const innerStyle = { + width: rowWidth, + height, + }; + + const rowHeights = Array.isArray(headerHeight) + ? headerHeight + : [headerHeight]; + return ( + +
+
+ {rowHeights.map(this.renderHeaderRow)} + {frozenData.map(this.renderFrozenRow)} +
+
+
+ ); + } + + _setRef(ref) { + this.headerRef = ref; + } +} + +export default TableHeader; diff --git a/src/src/components/Table/TableHeaderCell.tsx b/src/src/components/Table/TableHeaderCell.tsx new file mode 100644 index 00000000..aa3b9dbc --- /dev/null +++ b/src/src/components/Table/TableHeaderCell.tsx @@ -0,0 +1,17 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +/** + * HeaderCell component for BaseTable + */ +const TableHeaderCell = ({ className, column, columnIndex }) => ( + +
{column.title}
+
+); + +export default TableHeaderCell; diff --git a/src/src/components/Table/TableHeaderRow.tsx b/src/src/components/Table/TableHeaderRow.tsx new file mode 100644 index 00000000..f1770f45 --- /dev/null +++ b/src/src/components/Table/TableHeaderRow.tsx @@ -0,0 +1,47 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { renderElement } from './utils'; + +/** + * HeaderRow component for BaseTable + */ +const TableHeaderRow = ({ + className, + style, + columns, + headerIndex, + cellRenderer, + headerRenderer, + expandColumnKey, + expandIcon: ExpandIcon, + ...rest +}) => { + let cells = columns.map((column, columnIndex) => + cellRenderer({ + columns, + column, + columnIndex, + headerIndex, + expandIcon: column.key === expandColumnKey && , + }), + ); + + if (headerRenderer) { + cells = renderElement(headerRenderer, { cells, columns, headerIndex }); + } + + return ( + +
+ {cells} +
+
+ ); +}; + +export default TableHeaderRow; diff --git a/src/src/components/Table/TableRow.tsx b/src/src/components/Table/TableRow.tsx new file mode 100644 index 00000000..1b0363e8 --- /dev/null +++ b/src/src/components/Table/TableRow.tsx @@ -0,0 +1,206 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { renderElement } from './utils'; + +/** + * Row component for BaseTable + */ +class TableRow extends React.PureComponent { + constructor(props) { + super(props); + + this.state = { + measured: false, + }; + + this._setRef = this._setRef.bind(this); + this._handleExpand = this._handleExpand.bind(this); + } + + componentDidMount() { + this.props.estimatedRowHeight && + this.props.rowIndex >= 0 && + this._measureHeight(true); + } + + componentDidUpdate(prevProps, prevState) { + if ( + this.props.estimatedRowHeight && + this.props.rowIndex >= 0 && + // should not re-measure if it's updated after measured and reset + !this.props.getIsResetting() && + this.state.measured && + prevState.measured + ) { + this.setState({ measured: false }, () => this._measureHeight()); + } + } + + render() { + /* eslint-disable no-unused-vars */ + const { + isScrolling, + className, + style, + columns, + rowIndex, + rowData, + expandColumnKey, + depth, + rowEventHandlers, + estimatedRowHeight, + rowRenderer, + cellRenderer, + expandIconRenderer, + // omit the following from rest + rowKey, + getIsResetting, + onRowHover, + onRowExpand, + onRowHeightChange, + onRowClick, + ...rest + } = this.props; + /* eslint-enable no-unused-vars */ + + const expandIcon = expandIconRenderer({ + rowData, + rowIndex, + depth, + onExpand: this._handleExpand, + }); + let cells = columns.map((column, columnIndex) => + cellRenderer({ + isScrolling, + columns, + column, + columnIndex, + rowData, + rowIndex, + expandIcon: column.key === expandColumnKey && expandIcon, + }), + ); + + if (rowRenderer) { + cells = renderElement(rowRenderer, { + isScrolling, + cells, + columns, + rowData, + rowIndex, + depth, + }); + } + + const eventHandlers = this._getEventHandlers(rowEventHandlers); + + if (estimatedRowHeight && rowIndex >= 0) { + const { height, ...otherStyles } = style; + return ( +
+ {cells} +
+ ); + } + + return ( + +
+ {cells} +
+
+ ); + } + + _setRef(ref) { + this.ref = ref; + } + + _handleExpand(expanded) { + const { onRowExpand, rowData, rowIndex, rowKey } = this.props; + onRowExpand && onRowExpand({ expanded, rowData, rowIndex, rowKey }); + } + + _measureHeight(initialMeasure) { + if (!this.ref) return; + + const { style, rowKey, onRowHeightChange, rowIndex, columns } = this.props; + const height = this.ref.getBoundingClientRect().height; + this.setState({ measured: true }, () => { + if (initialMeasure || height !== style.height) + onRowHeightChange( + rowKey, + height, + rowIndex, + columns[0] && !columns[0].__placeholder__ && columns[0].frozen, + ); + }); + } + + _getEventHandlers(handlers = {}) { + const { rowData, rowIndex, rowKey, onRowHover, onRowClick } = this.props; + const eventHandlers = {}; + Object.keys(handlers).forEach((eventKey) => { + const callback = handlers[eventKey]; + if (typeof callback === 'function') { + eventHandlers[eventKey] = (event) => { + callback({ rowData, rowIndex, rowKey, event }); + }; + } + }); + + if (onRowHover) { + const mouseEnterHandler = eventHandlers['onMouseEnter']; + eventHandlers['onMouseEnter'] = (event) => { + onRowHover({ + hovered: true, + rowData, + rowIndex, + rowKey, + event, + }); + mouseEnterHandler && mouseEnterHandler(event); + }; + + const mouseLeaveHandler = eventHandlers['onMouseLeave']; + eventHandlers['onMouseLeave'] = (event) => { + onRowHover({ + hovered: false, + rowData, + rowIndex, + rowKey, + event, + }); + mouseLeaveHandler && mouseLeaveHandler(event); + }; + } + + if (onRowClick) { + const clickHandler = eventHandlers['onClick']; + eventHandlers['onClick'] = (event) => { + onRowClick({ + rowData, + rowIndex, + rowKey, + event, + }); + clickHandler && clickHandler(event); + }; + } + + return eventHandlers; + } +} + +export default TableRow; diff --git a/src/src/components/Table/TableSortIcons.tsx b/src/src/components/Table/TableSortIcons.tsx new file mode 100644 index 00000000..3d5223e5 --- /dev/null +++ b/src/src/components/Table/TableSortIcons.tsx @@ -0,0 +1,33 @@ +import React from 'react'; + +import { Icon, Button } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +type Props = { + sort: string | null; + onSort: () => void; +}; + +export default function TableSortIcons( + props: Props, +): React.FunctionComponentElement { + return ( + + + + ); +} diff --git a/src/src/components/Table/utils.ts b/src/src/components/Table/utils.ts new file mode 100644 index 00000000..8f6346ef --- /dev/null +++ b/src/src/components/Table/utils.ts @@ -0,0 +1,239 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +export function renderElement(renderer, props) { + if (React.isValidElement(renderer)) { + if (!props) return renderer; + return React.cloneElement(renderer, props); + } else if (typeof renderer === 'function') { + if (renderer.prototype && renderer.prototype.isReactComponent) { + return React.createElement(renderer, props); + } else if (renderer.defaultProps) { + return renderer({ ...renderer.defaultProps, ...props }); + } + return renderer(props); + } else { + return null; + } +} + +export function normalizeColumns(elements) { + const columns = []; + React.Children.forEach(elements, (element) => { + if (React.isValidElement(element) && element.key) { + const column = { ...element.props, key: element.key }; + columns.push(column); + } + }); + return columns; +} + +export function isObjectEqual(objA, objB, ignoreFunction = true) { + if (objA === objB) return true; + if (objA === null && objB === null) return true; + if (objA === null || objB === null) return false; + if (typeof objA !== 'object' || typeof objB !== 'object') return false; + + const keysA = Object.keys(objA); + const keysB = Object.keys(objB); + if (keysA.length !== keysB.length) return false; + + for (let i = 0; i < keysA.length; i++) { + const key = keysA[i]; + + if (key === '_owner' && objA.$$typeof) { + // React-specific: avoid traversing React elements' _owner. + // _owner contains circular references + // and is not needed when comparing the actual elements (and not their owners) + continue; + } + + const valueA = objA[key]; + const valueB = objB[key]; + const valueAType = typeof valueA; + + if (valueAType !== typeof valueB) return false; + if (valueAType === 'function' && ignoreFunction) continue; + if (valueAType === 'object') { + if (!isObjectEqual(valueA, valueB, ignoreFunction)) return false; + else continue; + } + if (valueA !== valueB) return false; + } + return true; +} + +export function callOrReturn(funcOrValue, ...args) { + return typeof funcOrValue === 'function' ? funcOrValue(...args) : funcOrValue; +} + +export function hasChildren(data) { + return Array.isArray(data.children) && data.children.length > 0; +} + +export function unflatten( + array, + rootId = null, + dataKey = 'id', + parentKey = 'parentId', +) { + const tree = []; + const childrenMap = {}; + + const length = array.length; + for (let i = 0; i < length; i++) { + const item = { ...array[i] }; + const id = item[dataKey]; + const parentId = item[parentKey]; + + if (Array.isArray(item.children)) { + childrenMap[id] = item.children.concat(childrenMap[id] || []); + } else if (!childrenMap[id]) { + childrenMap[id] = []; + } + item.children = childrenMap[id]; + + if (parentId !== undefined && parentId !== rootId) { + if (!childrenMap[parentId]) childrenMap[parentId] = []; + childrenMap[parentId].push(item); + } else { + tree.push(item); + } + } + + return tree; +} + +export function flattenOnKeys(tree, keys, depthMap = {}, dataKey = 'id') { + if (!keys || !keys.length) return tree; + + const array = []; + const keysSet = new Set(); + keys.forEach((x) => keysSet.add(x)); + + let stack = [].concat(tree); + stack.forEach((x) => (depthMap[x[dataKey]] = 0)); + while (stack.length > 0) { + const item = stack.shift(); + + array.push(item); + if ( + keysSet.has(item[dataKey]) && + Array.isArray(item.children) && + item.children.length > 0 + ) { + stack = [].concat(item.children, stack); + item.children.forEach( + (x) => (depthMap[x[dataKey]] = depthMap[item[dataKey]] + 1), + ); + } + } + + return array; +} + +// Babel7 changed the behavior of @babel/plugin-transform-spread in https://github.com/babel/babel/pull/6763 +// [...array] is transpiled to array.concat() while it was [].concat(array) before +// this change breaks immutable array(seamless-immutable), [...array] should always return mutable array +export function cloneArray(array) { + if (!Array.isArray(array)) return []; + return [].concat(array); +} + +export function noop() { + return null; +} + +export function toString(value) { + if (typeof value === 'string') return value; + if (value === null || value === undefined) return ''; + return value.toString ? value.toString() : ''; +} + +// copied from https://www.30secondsofcode.org/js/s/debounce +export const debounce = (fn, ms = 0) => { + let timeoutId; + return function (...args) { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => fn.apply(this, args), ms); + }; +}; + +// copied from https://www.30secondsofcode.org/js/s/throttle +export const throttle = (fn, wait) => { + let inThrottle, lastFn, lastTime; + return function (...args) { + if (!inThrottle) { + fn.apply(this, args); + lastTime = Date.now(); + inThrottle = true; + } else { + clearTimeout(lastFn); + lastFn = setTimeout(() => { + if (Date.now() - lastTime >= wait) { + fn.apply(this, args); + lastTime = Date.now(); + } + }, Math.max(wait - (Date.now() - lastTime), 0)); + } + }; +}; + +// copied from https://github.com/react-bootstrap/dom-helpers +let scrollbarSize; +export function getScrollbarSize(recalculate) { + if ((!scrollbarSize && scrollbarSize !== 0) || recalculate) { + if ( + typeof window !== 'undefined' && + window.document && + window.document.createElement + ) { + const scrollDiv = document.createElement('div'); + + scrollDiv.style.position = 'absolute'; + scrollDiv.style.top = '-9999px'; + scrollDiv.style.width = '50px'; + scrollDiv.style.height = '50px'; + scrollDiv.style.overflow = 'scroll'; + + document.body.appendChild(scrollDiv); + scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + } + } + + return scrollbarSize; +} + +export function addClassName(el, className) { + if (el.classList) { + el.classList.add(className); + } else { + if (!el.className.match(new RegExp(`(?:^|\\s)${className}(?!\\S)`))) { + el.className += ` ${className}`; + } + } +} + +export function removeClassName(el, className) { + if (el.classList) { + el.classList.remove(className); + } else { + el.className = el.className.replace( + new RegExp(`(?:^|\\s)${className}(?!\\S)`, 'g'), + '', + ); + } +} + +export function getEstimatedTotalRowsHeight(data, estimatedRowHeight) { + return typeof estimatedRowHeight === 'function' + ? data.reduce( + (height, rowData, rowIndex) => + height + estimatedRowHeight({ rowData, rowIndex }), + 0, + ) + : data.length * estimatedRowHeight; +} diff --git a/src/src/components/TableLoader/TableLoader.scss b/src/src/components/TableLoader/TableLoader.scss new file mode 100644 index 00000000..0e288096 --- /dev/null +++ b/src/src/components/TableLoader/TableLoader.scss @@ -0,0 +1,14 @@ +.TableLoader__container { + height: 100%; + width: 100%; + display: flex; + flex-direction: column; + padding: 0 1.5rem; +} +.TableLoader__raw { + display: flex; + height: 2.5rem; + .MuiSkeleton-root { + margin-right: 2rem; + } +} diff --git a/src/src/components/TableLoader/TableLoader.tsx b/src/src/components/TableLoader/TableLoader.tsx new file mode 100644 index 00000000..ae66198f --- /dev/null +++ b/src/src/components/TableLoader/TableLoader.tsx @@ -0,0 +1,60 @@ +import React from 'react'; + +import { Skeleton } from '@material-ui/lab'; + +import './TableLoader.scss'; + +function TableLoader(): React.FunctionComponentElement { + return ( +
+
+ + + + +
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+ ); +} + +export default React.memo(TableLoader); diff --git a/src/src/components/TagForm/TagForm.scss b/src/src/components/TagForm/TagForm.scss new file mode 100644 index 00000000..34075147 --- /dev/null +++ b/src/src/components/TagForm/TagForm.scss @@ -0,0 +1,85 @@ +@import 'src/styles/abstracts/_variables.scss'; + +.TagForm { + &__tagFormContainer { + padding: 20px; + border-bottom: 1px solid #f2f5fa; + &__TextField { + width: 100%; + margin-top: $space-xxxs; + margin-bottom: 20px; + } + + &__colorContainer { + margin-bottom: 20px; + &__colorBox { + margin-top: $space-xxxs; + padding: 5px; + border: $border-grey-lighter; + border-radius: 6px; + width: 100%; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + &__colorButton { + border-radius: $border-radius-circle; + margin: 5px; + width: 50px; + height: 50px; + min-width: auto; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + .MuiButton-label { + width: 34px; + height: 34px; + border-radius: $border-radius-circle; + display: flex; + justify-content: center; + align-items: center; + position: relative; + } + &__content { + width: 34px; + height: 34px; + border-radius: $border-radius-circle; + opacity: 0.2; + } + &__circle { + position: absolute; + top: 50%; + left: 50%; + width: 16px; + height: 16px; + border-radius: $border-radius-circle; + transform: translate(-50%, -50%); + } + } + } + } + &__previewContainer { + &__tagPreviewBox { + margin-top: $space-xxxs; + border: $border-grey-lighter; + border-radius: 6px; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + height: 56px; + position: relative; + padding: 0 0.5rem; + } + } + } + &__tagFormFooterContainer { + height: 64px; + display: flex; + justify-content: center; + align-items: center; + &__cancelButton { + margin-right: $space-sm; + } + } +} diff --git a/src/src/components/TagForm/TagForm.tsx b/src/src/components/TagForm/TagForm.tsx new file mode 100644 index 00000000..3a123dc0 --- /dev/null +++ b/src/src/components/TagForm/TagForm.tsx @@ -0,0 +1,238 @@ +import React, { memo, useMemo } from 'react'; +import * as yup from 'yup'; +import { isEmpty, noop } from 'lodash-es'; +import { useFormik } from 'formik'; + +import { makeStyles } from '@material-ui/core'; +import { Button, TextField } from '@material-ui/core'; + +import { Badge, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import COLORS from 'config/colors/colors'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import tagsAppModel from 'services/models/tags/tagsAppModel'; +import { trackEvent } from 'services/analytics'; + +import { ITagFormProps } from 'types/components/TagForm/TagForm'; + +import './TagForm.scss'; + +const useStyles = makeStyles({ + tagColor: { + border: ({ colorName, color }: { color: string; colorName: string }) => + `1px solid ${colorName === color ? color : 'transparent'}`, + '&:hover, &:focus': { + border: ({ colorName }: { colorName: string }) => + `1px solid ${colorName} !important;`, + backgroundColor: 'inherit', + }, + }, +}); + +type TagColorWrapperProp = { + colorName: string; + onColorButtonClick: (colorName: string) => void; + color: string; +}; + +function TagColorWrapper({ + colorName, + onColorButtonClick, + color, +}: TagColorWrapperProp) { + const { tagColor } = useStyles({ color, colorName }); + return ( + + ); +} + +function TagForm({ + tagData, + editMode, + tagId, + onCloseModal, +}: ITagFormProps): React.FunctionComponentElement { + const formik = useFormik({ + initialValues: editMode + ? { + name: tagData?.name || '', + color: tagData?.color || COLORS[0][0], + comment: tagData?.description || '', + } + : { name: '', color: COLORS[0][0], comment: '' }, + onSubmit: noop, + validationSchema: yup.object({ + name: yup + .string() + .required('Required field') + .max(50, 'Must be 50 characters or fewer'), + comment: yup.string().max(100, 'Must be 100 characters or fewer'), + }), + }); + const { + values, + errors, + touched, + setFieldValue, + setValues, + setFieldTouched, + submitForm, + validateForm, + } = formik; + const { name, color, comment } = values; + + function onChange(e: React.ChangeEvent, fieldName: string) { + setFieldValue(fieldName, e?.target?.value, true).then(() => { + setFieldTouched(fieldName, true); + }); + } + + const colors = useMemo( + () => + COLORS[0].map((colorName, index) => ( + + )), + // eslint-disable-next-line react-hooks/exhaustive-deps + [color], + ); + + function onCreateButtonClick() { + trackEvent(ANALYTICS_EVENT_KEYS.tags.create); + + submitForm().then(() => + validateForm(values).then((errors) => { + if (isEmpty(errors)) { + tagsAppModel + .createTag({ name, color, description: comment }) + .then((res: any) => { + if (res.id) { + onCloseModal(); + tagsAppModel.getTagsData().call(); + } + }); + } + }), + ); + } + + function onSaveButtonClick() { + submitForm().then(() => + validateForm(values).then((errors) => { + if (isEmpty(errors)) { + tagsAppModel + .updateTag({ name, color, description: comment }, tagId || '') + .then(() => { + tagsAppModel.getTagsData().call(); + tagsAppModel.getTagById(tagId || '').call(); + onCloseModal(); + }); + } + }), + ); + } + + function onResetButtonClick() { + setValues( + { + name: tagData?.name || '', + color: tagData?.color || '', + comment: tagData?.description || '', + }, + true, + ); + } + + function onColorButtonClick(color: string) { + setFieldValue('color', color); + } + + return ( + +
+
+ + Name + + onChange(e, 'name')} + value={name} + size='small' + error={!!(touched.name && errors.name)} + helperText={touched.name && errors.name} + /> + + Comment + + onChange(e, 'comment')} + className='TagForm__tagFormContainer__TextField TextField__TextArea__OutLined__Small' + multiline + value={comment} + error={!!(touched.comment && errors.comment)} + helperText={touched.comment && errors.comment} + /> +
+ + Colors + +
+ {colors} +
+
+
+ + Preview + +
+ +
+
+
+
+ + +
+
+
+ ); +} + +export default memo(TagForm); diff --git a/src/src/components/Theme/Theme.tsx b/src/src/components/Theme/Theme.tsx new file mode 100644 index 00000000..be17dcd7 --- /dev/null +++ b/src/src/components/Theme/Theme.tsx @@ -0,0 +1,93 @@ +import React from 'react'; + +import { + unstable_createMuiStrictModeTheme as createMuiTheme, + ThemeOptions, + ThemeProvider, + StylesProvider, +} from '@material-ui/core'; + +import { IThemeProps } from 'types/components/Theme/Theme'; +// import useFontSize from 'hooks/fontSize/useFontSize'; + +export const ThemeContext = React.createContext({}); +const { Provider } = ThemeContext; + +const light: ThemeOptions = { + typography: { + fontFamily: 'Inter, sans-serif', + }, + overrides: { + MuiDivider: { + root: { + backgroundColor: '#E8F1FC', + }, + }, + MuiButton: { + root: { + height: 32, + boxShadow: 'unset', + }, + contained: { + boxShadow: 'unset', + }, + }, + }, + props: { + MuiButtonBase: { + disableRipple: true, + }, + }, + palette: { + type: 'light', + primary: { + main: '#1473E6', + }, + secondary: { + main: '#1c2852', + }, + text: { + primary: '#414B6D', + }, + }, + spacing: (factor: number) => `${factor}em`, +}; + +const darkTheme: ThemeOptions = { + palette: { + type: 'dark', + primary: { + main: '#64b5f6', + }, + text: { + // secondary: '#000', + }, + }, +}; + +function Theme( + props: IThemeProps, +): React.FunctionComponentElement { + const [dark, setDark] = React.useState(false); + // const fontSize = useFontSize(); + // + // React.useEffect(() => { + // document.getElementsByTagName('html')[0].style.fontSize = fontSize + 'px'; + // }, [fontSize]); + + const handleTheme = React.useCallback((): void => { + setDark(!dark); + }, [dark]); + + const theme = createMuiTheme(dark ? darkTheme : light); + return ( + + {/* */} + + {props.children} + + + ); +} + +export default Theme; diff --git a/src/src/components/TooltipContentPopover/TooltipContentPopover.scss b/src/src/components/TooltipContentPopover/TooltipContentPopover.scss new file mode 100644 index 00000000..32eb6999 --- /dev/null +++ b/src/src/components/TooltipContentPopover/TooltipContentPopover.scss @@ -0,0 +1,40 @@ +@use 'src/styles/abstracts' as *; + +.TooltipContentPopover { + width: 25rem; + padding: $space-xs; + display: flex; + flex-direction: column; + max-height: 20rem; + &__subtitle { + text-transform: uppercase; + margin: $space-xs 0; + } + &__Divider { + margin: $space-unit 0 $space-xs; + } + &__section { + margin: 0 $space-xs; + &:last-child { + padding-bottom: $space-unit; + } + } + &__option { + display: flex; + width: 100%; + overflow: hidden; + &__label { + margin-left: $space-xs; + max-width: 100%; + overflow: hidden; + word-break: break-all; + } + } + &__SelectedTagsContainer { + overflow: auto; + display: flex; + flex-wrap: wrap; + gap: $space-xxxs; + width: 100%; + } +} diff --git a/src/src/components/TooltipContentPopover/TooltipContentPopover.tsx b/src/src/components/TooltipContentPopover/TooltipContentPopover.tsx new file mode 100644 index 00000000..4aa783a8 --- /dev/null +++ b/src/src/components/TooltipContentPopover/TooltipContentPopover.tsx @@ -0,0 +1,208 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { Checkbox, Divider, TextField } from '@material-ui/core'; +import { Autocomplete } from '@material-ui/lab'; +import { + CheckBox as CheckBoxIcon, + CheckBoxOutlineBlank, +} from '@material-ui/icons'; + +import { Badge, SelectDropdown, Text, ToggleButton } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { ISelectDropdownOption } from 'components/kit/SelectDropdown'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { ITooltipContentPopoverProps } from 'types/components/TooltipContentPopover/TooltipContentPopover'; +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel.d'; + +import './TooltipContentPopover.scss'; + +function TooltipContentPopover({ + onChangeTooltip, + selectedFields = [], + tooltipAppearance = TooltipAppearanceEnum.Auto, + isTooltipDisplayed = true, + selectOptions, +}: ITooltipContentPopoverProps): React.FunctionComponentElement { + let [inputValue, setInputValue] = React.useState(''); + + function onSelectedFieldsChange( + e: any, + values: IGroupingSelectOption[], + ): void { + if (e?.code !== 'Backspace') { + handleSelect(values); + } else { + if (inputValue.length === 0) { + handleSelect(values); + } + } + } + + function handleSelect(values: IGroupingSelectOption[]) { + onChangeTooltip({ + selectedFields: values.map((item: IGroupingSelectOption) => + typeof item === 'string' ? item : item.value, + ), + }); + } + + const onDisplayTooltipChange = React.useCallback((): void => { + onChangeTooltip({ display: !isTooltipDisplayed }); + }, [onChangeTooltip, isTooltipDisplayed]); + + const onTooltipAppearanceChange = React.useCallback( + (value): void => { + onChangeTooltip({ appearance: value.value }); + }, + [onChangeTooltip], + ); + + const values: IGroupingSelectOption[] = React.useMemo(() => { + let data: { value: string; group: string; label: string }[] = []; + selectOptions.forEach((option) => { + if (selectedFields.indexOf(option.value) !== -1) { + data.push(option); + } + }); + + // Sort selected values by the order of their application + return data.sort( + (a, b) => + selectedFields.indexOf(a.value) - selectedFields.indexOf(b.value), + ); + }, [selectOptions, selectedFields]); + + const tooltipAppearanceOptions: ISelectDropdownOption[] = + React.useMemo(() => { + return Object.values(TooltipAppearanceEnum).map((option) => { + return { label: _.capitalize(option), value: option }; + }); + }, []); + + const options = React.useMemo(() => { + if (inputValue.trim() !== '') { + const filtered = selectOptions.filter((item) => { + return item.label.indexOf(inputValue) !== -1; + }); + + return filtered + .slice() + .sort( + (a, b) => a.label.indexOf(inputValue) - b.label.indexOf(inputValue), + ); + } + return selectOptions; + }, [selectOptions, inputValue]); + + return ( + +
+
+ + Select Fields To Display In The Tooltip + + option.group} + getOptionLabel={(option) => option.label} + getOptionSelected={(option, value) => option.value === value.value} + renderInput={(params) => ( + { + setInputValue(e.target.value); + }, + }} + className='TextField__OutLined__Small' + variant='outlined' + placeholder='Select Fields' + /> + )} + renderOption={(option, { selected }) => ( +
+ } + checkedIcon={} + style={{ marginRight: 4 }} + checked={selected} + /> + + {option.label} + +
+ )} + renderTags={(value, getTagProps) => ( +
+ {value.map((selected, i) => ( + + ))} +
+ )} + /> +
+ +
+ + Tooltip Visibility On Hover + + +
+ +
+ + Tooltip Appearance + + +
+
+
+ ); +} + +export default React.memo(TooltipContentPopover); diff --git a/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.d.ts b/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.d.ts new file mode 100644 index 00000000..3d70bb2d --- /dev/null +++ b/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.d.ts @@ -0,0 +1,6 @@ +import { ITrendlineOptions } from 'types/services/models/scatter/scatterAppModel'; + +export interface ITrendlineOptionsPopoverProps { + trendlineOptions: ITrendlineOptions; + onChangeTrendlineOptions: (options: Partial) => void; +} diff --git a/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.scss b/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.scss new file mode 100644 index 00000000..56568fda --- /dev/null +++ b/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.scss @@ -0,0 +1,47 @@ +@use 'src/styles/abstracts' as *; + +.TrendlineOptionsPopover { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + width: 400px; + padding: $space-xs 0; + &__section { + width: 100%; + display: flex; + flex-direction: column; + padding: 0 $space-xs; + } + &__bandwidth { + margin-top: $space-xs; + margin-bottom: $space-xxxs; + padding: 0 $space-xs; + &--disabled { + opacity: 0.2; + pointer-events: none; + } + + &__value { + display: flex; + align-items: center; + + &__subtitle { + text-transform: uppercase; + } + + &__number { + margin-left: $space-xs; + } + } + + &__Slider { + display: flex; + align-items: center; + margin: $space-xs 0; + .Slider { + margin: 0 $space-md; + } + } + } +} diff --git a/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.tsx b/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.tsx new file mode 100644 index 00000000..49af7a81 --- /dev/null +++ b/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.tsx @@ -0,0 +1,100 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { MenuItem } from '@material-ui/core'; + +import { Text, Slider } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { TrendlineTypeEnum } from 'utils/d3'; + +import { ITrendlineOptionsPopoverProps } from './TrendlineOptionsPopover.d'; + +import './TrendlineOptionsPopover.scss'; + +function TrendlineOptionsPopover({ + trendlineOptions, + onChangeTrendlineOptions, +}: ITrendlineOptionsPopoverProps): React.FunctionComponentElement { + function onTypeSelect(e: React.ChangeEvent): void { + const type = e.target?.getAttribute('data-name'); + if (trendlineOptions.type !== type) { + onChangeTrendlineOptions({ + type, + }); + } + } + + function onBandwidthChange( + event: React.ChangeEvent<{}>, + value: number | number[], + ) { + if (trendlineOptions.bandwidth !== value) { + onChangeTrendlineOptions({ + bandwidth: value as number, + }); + } + } + + return ( + +
+
+ + Simple Linear Regression + + + LOESS + +
+
+ + bandwidth: + + + {trendlineOptions.bandwidth} + +
+
+ 0.0 + `${val}`} + value={trendlineOptions.bandwidth} + onChange={onBandwidthChange} + aria-labelledby='track-false-slider' + track={false} + step={0.01} + max={1} + min={0} + /> + 1.0 +
+
+
+
+
+ ); +} + +export default React.memo(TrendlineOptionsPopover); diff --git a/src/src/components/TrendlineOptionsPopover/index.ts b/src/src/components/TrendlineOptionsPopover/index.ts new file mode 100644 index 00000000..ae995b06 --- /dev/null +++ b/src/src/components/TrendlineOptionsPopover/index.ts @@ -0,0 +1,3 @@ +import TrendlineOptionsPopover from './TrendlineOptionsPopover'; + +export default TrendlineOptionsPopover; diff --git a/src/src/components/VisualizationLegends/VisualizationLegends.d.ts b/src/src/components/VisualizationLegends/VisualizationLegends.d.ts new file mode 100644 index 00000000..b9a64beb --- /dev/null +++ b/src/src/components/VisualizationLegends/VisualizationLegends.d.ts @@ -0,0 +1,19 @@ +import { LegendsModeEnum } from 'utils/d3'; + +export interface IVisualizationLegendsProps { + data?: VisualizationLegendsDataType; + mode?: LegendsModeEnum; + readOnly?: boolean; +} + +export interface LegendColumnDataType { + value: string; + order?: number; + color?: string; + dasharray?: string; + chartIndex?: number; +} + +export interface LegendsDataType { + [key: string]: Record; +} diff --git a/src/src/components/VisualizationLegends/VisualizationLegends.scss b/src/src/components/VisualizationLegends/VisualizationLegends.scss new file mode 100644 index 00000000..7d656e2f --- /dev/null +++ b/src/src/components/VisualizationLegends/VisualizationLegends.scss @@ -0,0 +1,25 @@ +@use 'src/styles/abstracts' as *; + +.VisualizationLegends { + padding: $space-xs; + background-color: white; + height: 100%; + width: 100%; + &.pinned { + position: relative; + } + &.unpinned { + position: absolute; + right: 0; + opacity: 0.8; + box-shadow: 0 0 0 1px $grey-lighter; + &:hover { + opacity: 1 + } + } + &__container { + height: 100%; + width: 100%; + overflow: auto; + } +} diff --git a/src/src/components/VisualizationLegends/VisualizationLegends.tsx b/src/src/components/VisualizationLegends/VisualizationLegends.tsx new file mode 100644 index 00000000..006f25f5 --- /dev/null +++ b/src/src/components/VisualizationLegends/VisualizationLegends.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { drawLegends, LegendsModeEnum } from 'utils/d3'; + +import { IVisualizationLegendsProps } from '.'; + +import './VisualizationLegends.scss'; + +function VisualizationLegends(props: IVisualizationLegendsProps) { + const { data = {}, mode = LegendsModeEnum.PINNED, readOnly = false } = props; + const dataRef = React.useRef({}); + const containerRef = React.useRef(null); + + React.useEffect(() => { + if (containerRef.current && !_.isEqual(dataRef.current, data)) { + dataRef.current = data; + drawLegends({ + data, + containerNode: containerRef.current, + readOnly, + }); + } + }, [data, readOnly]); + + return ( + +
+
+
+ + ); +} + +VisualizationLegends.displayName = 'VisualizationLegends'; + +export default React.memo(VisualizationLegends); diff --git a/src/src/components/VisualizationLegends/index.ts b/src/src/components/VisualizationLegends/index.ts new file mode 100644 index 00000000..e758dec7 --- /dev/null +++ b/src/src/components/VisualizationLegends/index.ts @@ -0,0 +1,5 @@ +import VisualizationLegends from './VisualizationLegends'; + +export * from './VisualizationLegends.d'; + +export default VisualizationLegends; diff --git a/src/src/components/VisualizationTooltip/VisualizationTooltip.d.ts b/src/src/components/VisualizationTooltip/VisualizationTooltip.d.ts new file mode 100644 index 00000000..050e2e64 --- /dev/null +++ b/src/src/components/VisualizationTooltip/VisualizationTooltip.d.ts @@ -0,0 +1,21 @@ +import React from 'react'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +export interface IVisualizationTooltipProps { + id?: string; + children?: React.ReactNode; + elementRect: ElementRect; + open: boolean; + forceOpen?: boolean; + className?: string; + containerNode?: HTMLElement | null; + tooltipAppearance?: TooltipAppearanceEnum; +} + +export type ElementRect = { + top: number; + bottom: number; + left: number; + right: number; +} | null; diff --git a/src/src/components/VisualizationTooltip/VisualizationTooltip.scss b/src/src/components/VisualizationTooltip/VisualizationTooltip.scss new file mode 100644 index 00000000..35a1245f --- /dev/null +++ b/src/src/components/VisualizationTooltip/VisualizationTooltip.scss @@ -0,0 +1,35 @@ +@use 'src/styles/abstracts' as *; + +.VisualizationTooltip { + pointer-events: none; + z-index: 5 !important; + height: toRem(200px); // To not block table scroll + &.pinnedPopover { + width: 100%; + height: 100%; + } + > *:first-of-type { + height: toRem(200px); // To not block table scroll + } + &__content { + transform: none !important; + width: toRem(230px); + max-height: toRem(250px); + background: rgba(255, 255, 255, 0.78); + box-shadow: 0 1px 1px rgb(34 58 90 / 20%), 0 2px 2px rgb(34 58 90 / 20%), + 0 4px 4px rgb(34 58 90 / 20%), 0 6px 8px rgb(34 58 90 / 20%); + border: $border-main; + backdrop-filter: blur(3px); + overflow: unset; + &__pinned { + width: auto; + max-height: toRem(130px); + } + &__active { + background: $white; + } + &__hide { + visibility: hidden; + } + } +} diff --git a/src/src/components/VisualizationTooltip/VisualizationTooltip.tsx b/src/src/components/VisualizationTooltip/VisualizationTooltip.tsx new file mode 100644 index 00000000..35034ae9 --- /dev/null +++ b/src/src/components/VisualizationTooltip/VisualizationTooltip.tsx @@ -0,0 +1,161 @@ +import React from 'react'; +import classNames from 'classnames'; +import _ from 'lodash-es'; + +import { Popover, PopoverPosition } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import getPositionBasedOnOverflow from 'utils/getPositionBasedOnOverflow'; + +import { ElementRect, IVisualizationTooltipProps } from './'; + +import './VisualizationTooltip.scss'; + +function VisualizationTooltip(props: IVisualizationTooltipProps) { + let { + id = 'tooltip', + forceOpen = false, + open = false, + className = '', + containerNode = document.body, + tooltipAppearance = TooltipAppearanceEnum.Auto, + elementRect, + children, + } = props; + open = forceOpen || open; + + const [openPopover, setOpenPopover] = React.useState( + !!elementRect && open, + ); + const [popoverNode, setPopoverNode] = React.useState(); + const [popoverPos, setPopoverPos] = React.useState({ + top: 10000, + left: 10000, + }); + + const isPopoverPinned = React.useMemo( + () => + tooltipAppearance === TooltipAppearanceEnum.Top || + tooltipAppearance === TooltipAppearanceEnum.Bottom, + [tooltipAppearance], + ); + + const onPopoverPositionChange = React.useCallback( + (elementRect: ElementRect) => { + if (elementRect && popoverNode && containerNode) { + // Popover viewport need to be overflowed by chart container + const popoverRect = popoverNode.getBoundingClientRect(); + const containerRect = containerNode.getBoundingClientRect(); + + if (containerRect.width && containerRect.height) { + const posRect = { + top: elementRect.top - containerNode.scrollTop, + left: elementRect.left - containerNode.scrollLeft, + right: elementRect.right - containerNode.scrollLeft, + bottom: elementRect.bottom - containerNode.scrollTop, + }; + + const pos = getPositionBasedOnOverflow( + posRect, + popoverRect, + containerRect, + isPopoverPinned, + tooltipAppearance, + ); + setPopoverPos(pos); + } + } + }, + [containerNode, popoverNode, isPopoverPinned, tooltipAppearance], + ); + + React.useEffect(() => { + setOpenPopover(!!elementRect && open); + }, [elementRect, open]); + + React.useEffect(() => { + if (!!elementRect && openPopover) { + onPopoverPositionChange(elementRect); + } + }, [elementRect, openPopover, forceOpen, onPopoverPositionChange]); + + React.useEffect(() => { + if (containerNode) { + const onScrollEnd = _.debounce( + () => setOpenPopover(!!elementRect && open), + 300, + ); + const onScroll = _.debounce( + () => { + setOpenPopover(false); + }, + 200, + { + leading: true, + trailing: false, + }, + ); + + containerNode.addEventListener('scroll', onScroll); + containerNode.addEventListener('scroll', onScrollEnd); + return () => { + containerNode?.removeEventListener('scroll', onScroll); + containerNode?.removeEventListener('scroll', onScrollEnd); + }; + } + }, [elementRect, open, containerNode]); + + React.useEffect(() => { + const onMouseMove = ({ target }: any) => { + if ( + !forceOpen && + !containerNode?.contains(target) && + !popoverNode?.contains(target) + ) { + setOpenPopover(false); + } + }; + document.addEventListener('mousemove', onMouseMove); + return () => { + document.removeEventListener('mousemove', onMouseMove); + }; + }, [containerNode, popoverNode, forceOpen]); + + return ( + + + + ); +} + +export default React.memo(VisualizationTooltip); diff --git a/src/src/components/VisualizationTooltip/index.ts b/src/src/components/VisualizationTooltip/index.ts new file mode 100644 index 00000000..9fe9910f --- /dev/null +++ b/src/src/components/VisualizationTooltip/index.ts @@ -0,0 +1,5 @@ +import VisualizationTooltip from './VisualizationTooltip'; + +export * from './VisualizationTooltip.d'; + +export default VisualizationTooltip; diff --git a/src/src/components/ZoomInPopover/ZoomInPopover.scss b/src/src/components/ZoomInPopover/ZoomInPopover.scss new file mode 100644 index 00000000..f7a29ff3 --- /dev/null +++ b/src/src/components/ZoomInPopover/ZoomInPopover.scss @@ -0,0 +1,4 @@ +.ZoomInPopover { + width: 16.5rem; + padding: 0.5rem; +} diff --git a/src/src/components/ZoomInPopover/ZoomInPopover.tsx b/src/src/components/ZoomInPopover/ZoomInPopover.tsx new file mode 100644 index 00000000..15e31b9b --- /dev/null +++ b/src/src/components/ZoomInPopover/ZoomInPopover.tsx @@ -0,0 +1,45 @@ +import React from 'react'; + +import { MenuItem } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IZoomInPopoverProps } from 'types/components/ZoomInPopover/ZoomInPopover'; + +import { ZoomEnum } from 'utils/d3'; + +import './ZoomInPopover.scss'; + +function ZoomInPopover({ + mode, + onChange, +}: IZoomInPopoverProps): React.FunctionComponentElement { + function handleChange(e: React.ChangeEvent): void { + const value = e.target?.getAttribute('data-name'); + if (value && mode !== parseInt(value) && typeof onChange === 'function') { + onChange({ mode: parseInt(value), active: true }); + } + } + return ( + +
+ + Multiple Zooming + + + Single Zooming + +
+
+ ); +} + +export default React.memo(ZoomInPopover); diff --git a/src/src/components/ZoomOutPopover/ZoomOutPopover.scss b/src/src/components/ZoomOutPopover/ZoomOutPopover.scss new file mode 100644 index 00000000..3b582ce9 --- /dev/null +++ b/src/src/components/ZoomOutPopover/ZoomOutPopover.scss @@ -0,0 +1,4 @@ +.ZoomOutPopover { + width: 16.5rem; + padding: 0.5rem; +} diff --git a/src/src/components/ZoomOutPopover/ZoomOutPopover.tsx b/src/src/components/ZoomOutPopover/ZoomOutPopover.tsx new file mode 100644 index 00000000..de8c6201 --- /dev/null +++ b/src/src/components/ZoomOutPopover/ZoomOutPopover.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { MenuItem } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IZoomOutPopoverProps } from 'types/components/ZoomOutPopover/ZoomOutPopover'; + +import './ZoomOutPopover.scss'; + +function ZoomOutPopover({ + zoomHistory = [], + onChange, +}: IZoomOutPopoverProps): React.FunctionComponentElement { + const groupedHistory = _.groupBy(zoomHistory, (item) => item.id); + + function handleZoomOut(e: React.ChangeEvent): void { + const value = e.target?.getAttribute('data-name'); + if (value && typeof onChange === 'function') { + const index = _.findLastIndex(zoomHistory, (item) => item.id === value); + let changedHistory = [...zoomHistory]; + if (index || index === 0) { + changedHistory.splice(index, 1); + } + onChange({ history: changedHistory, active: false }); + } + } + + function handleResetZooming() { + if (typeof onChange === 'function') { + onChange?.({ history: [], active: false }); + } + } + return ( + +
+ {Object.keys(groupedHistory)?.map((id) => ( + + {`Zoom Out Chart ${id}`} + + ))} + Reset Zooming +
+
+ ); +} + +export default React.memo(ZoomOutPopover); diff --git a/src/src/components/kit/ActionCard/ActionCard.d.ts b/src/src/components/kit/ActionCard/ActionCard.d.ts new file mode 100644 index 00000000..c81595f1 --- /dev/null +++ b/src/src/components/kit/ActionCard/ActionCard.d.ts @@ -0,0 +1,12 @@ +import { TooltipProps } from '@material-ui/core/Tooltip'; + +import { IButtonProps } from 'components/kit'; + +export interface IActionCardProps { + title: string; + description: string; + btnTooltip: TooltipProps['title']; + btnText: string; + onAction: () => void; + btnProps: IButtonProps; +} diff --git a/src/src/components/kit/ActionCard/ActionCard.scss b/src/src/components/kit/ActionCard/ActionCard.scss new file mode 100644 index 00000000..21b00ea4 --- /dev/null +++ b/src/src/components/kit/ActionCard/ActionCard.scss @@ -0,0 +1,20 @@ +@use 'src/styles/abstracts' as *; + +.ActionCard { + width: 100%; + padding: $space-lg; + border: $border-grey; + border-radius: $border-radius-lg; + display: flex; + align-items: center; + justify-content: space-between; + background-color: $white; + &__infoBox { + display: flex; + flex-direction: column; + justify-content: space-between; + &__message { + margin-top: $space-xxxs; + } + } +} diff --git a/src/src/components/kit/ActionCard/ActionCard.tsx b/src/src/components/kit/ActionCard/ActionCard.tsx new file mode 100644 index 00000000..9c8b89e8 --- /dev/null +++ b/src/src/components/kit/ActionCard/ActionCard.tsx @@ -0,0 +1,48 @@ +import React from 'react'; + +import Tooltip from '@material-ui/core/Tooltip'; + +import { Button, Text } from 'components/kit'; + +import { IActionCardProps } from './ActionCard.d'; + +import './ActionCard.scss'; + +function ActionCard({ + title, + description, + btnTooltip, + btnText, + onAction, + btnProps, +}: IActionCardProps): React.FunctionComponentElement { + return ( +
+
+ + {title} + + + {description} + +
+ + +
+ +
+
+
+ ); +} + +ActionCard.displayName = 'ActionCard'; + +export default React.memo(ActionCard); diff --git a/src/src/components/kit/ActionCard/index.tsx b/src/src/components/kit/ActionCard/index.tsx new file mode 100644 index 00000000..16bcf76f --- /dev/null +++ b/src/src/components/kit/ActionCard/index.tsx @@ -0,0 +1,4 @@ +import ActionCard from './ActionCard'; +export * from './ActionCard.d'; + +export default ActionCard; diff --git a/src/src/components/kit/AlertBanner/AlertBanner.d.ts b/src/src/components/kit/AlertBanner/AlertBanner.d.ts new file mode 100644 index 00000000..8c16cb11 --- /dev/null +++ b/src/src/components/kit/AlertBanner/AlertBanner.d.ts @@ -0,0 +1,15 @@ +import { IconName } from 'components/kit/Icon/Icon'; + +type AlertBannerType = 'warning' | 'info' | 'error' | 'success'; + +export interface IAlertBannerProps { + children?: React.ReactNode; + type: AlertBannerType; + visibilityDuration?: number; + isVisiblePermanently?: boolean; +} + +export interface ITypeMetadata { + cssClassName: string; + iconName: IconName; +} diff --git a/src/src/components/kit/AlertBanner/AlertBanner.scss b/src/src/components/kit/AlertBanner/AlertBanner.scss new file mode 100644 index 00000000..93c5312d --- /dev/null +++ b/src/src/components/kit/AlertBanner/AlertBanner.scss @@ -0,0 +1,71 @@ +@use 'src/styles/abstracts' as *; + +.AlertBanner { + &_iconCnt { + width: 24px; + height: 24px; + margin: 8px; + font-size: 24px; + } + + &_warning { + @include backgroundColorOpacity($warning-color-25, 0.5); + + &_iconCnt { + color: $warning-color; + } + } + + &_info { + @include backgroundColorOpacity($primary-color-25, 0.5); + + &_iconCnt { + color: $primary-color; + } + } + + &_error { + @include backgroundColorOpacity($error-color-25, 0.5); + + &_iconCnt { + color: $error-color; + width: 20px; + height: 20px; + margin: 10px; + font-size: 20px; + } + } + + &_success { + @include backgroundColorOpacity($success-color-25, 0.5); + + &_iconCnt { + color: $success-color; + } + } + + position: fixed; + width: 100%; + display: flex; + font-size: 11px; + line-height: 40px; + align-items: center; + justify-content: center; + color: #414b6d; + z-index: 1; + + & > div { + display: flex; + width: 100%; + justify-content: center; + text-align: center; + } + + .MuiButton-root { + margin-left: 32px; + + .icon-close { + font-size: 10px; + } + } +} diff --git a/src/src/components/kit/AlertBanner/AlertBanner.tsx b/src/src/components/kit/AlertBanner/AlertBanner.tsx new file mode 100644 index 00000000..51388fd4 --- /dev/null +++ b/src/src/components/kit/AlertBanner/AlertBanner.tsx @@ -0,0 +1,67 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import { isNil } from 'lodash-es'; + +import { Icon, Button } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IAlertBannerProps } from './AlertBanner.d'; +import { typesMetadata } from './config'; + +import './AlertBanner.scss'; + +function AlertBanner({ + children, + type, + visibilityDuration = 6000, + isVisiblePermanently = false, +}: IAlertBannerProps): React.FunctionComponentElement { + const [isVisible, setIsVisible] = useState(true); + + const memoizedTypeMetadata = useMemo(() => { + return typesMetadata[type]; + }, [type]); + + const onClose = () => { + setIsVisible(false); + }; + + useEffect(() => { + let timeoutPath: any = null; + + if (!isVisiblePermanently) { + timeoutPath = setTimeout(onClose, visibilityDuration); + } + + return () => { + if (!isNil(timeoutPath)) { + clearTimeout(timeoutPath); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + <> + {isVisible && ( + +
+ +

{children}

+ +
+
+ )} + + ); +} + +AlertBanner.displayName = 'AlertBanner'; + +export default React.memo(AlertBanner); diff --git a/src/src/components/kit/AlertBanner/config.ts b/src/src/components/kit/AlertBanner/config.ts new file mode 100644 index 00000000..8e9208ff --- /dev/null +++ b/src/src/components/kit/AlertBanner/config.ts @@ -0,0 +1,30 @@ +import { ITypeMetadata } from './AlertBanner.d'; + +const warning: ITypeMetadata = { + cssClassName: 'warning', + iconName: 'warning-contained', +}; + +const info: ITypeMetadata = { + cssClassName: 'info', + iconName: 'circle-info', +}; + +const error: ITypeMetadata = { + cssClassName: 'error', + iconName: 'close-circle', +}; + +const success: ITypeMetadata = { + cssClassName: 'success', + iconName: 'success-icon', +}; + +const typesMetadata = { + warning, + info, + error, + success, +}; + +export { typesMetadata }; diff --git a/src/src/components/kit/AlertBanner/index.ts b/src/src/components/kit/AlertBanner/index.ts new file mode 100644 index 00000000..895e5836 --- /dev/null +++ b/src/src/components/kit/AlertBanner/index.ts @@ -0,0 +1,5 @@ +import AlertBanner from './AlertBanner'; + +export * from './AlertBanner.d'; + +export default AlertBanner; diff --git a/src/src/components/kit/AudioBox/AudioBox.d.ts b/src/src/components/kit/AudioBox/AudioBox.d.ts new file mode 100644 index 00000000..c214eaa0 --- /dev/null +++ b/src/src/components/kit/AudioBox/AudioBox.d.ts @@ -0,0 +1,5 @@ +export interface IAudioBoxProps { + data: any; + additionalProperties: any; + style: any; +} diff --git a/src/src/components/kit/AudioBox/AudioBox.scss b/src/src/components/kit/AudioBox/AudioBox.scss new file mode 100644 index 00000000..c3c02ac9 --- /dev/null +++ b/src/src/components/kit/AudioBox/AudioBox.scss @@ -0,0 +1,205 @@ +@use 'src/styles/abstracts' as *; + +.AudioBox { + max-width: toRem(268px); + &__controllers { + position: relative; + display: flex; + align-items: center; + padding: $space-xs; + background-color: $pico-5; + border-radius: $border-radius-main; + width: toRem(268px); + height: toRem(40px); + &__download { + min-width: 1.5rem; + } + &__player { + min-width: 1.5rem; + height: 1.5rem; + border-radius: $radius-main; + position: relative; + display: flex; + align-items: center; + justify-content: center; + transition: background-color 0.18s ease-out; + &:hover { + background-color: rgba(28, 40, 82, 0.04); + } + .Icon__container { + position: absolute; + z-index: 0; + font-size: $text-sm; + } + .MuiPaper-root { + height: 1.5rem; + width: 1.5rem; + display: flex; + align-items: center; + justify-self: center; + background-color: transparent; + box-shadow: unset; + .MuiGrid-root { + padding: 0; + display: flex; + svg { + font-size: $text-xxl; + color: transparent; + z-index: 1; + position: relative; + &:hover { + color: transparent; + } + } + } + } + } + &__timer { + display: flex; + span { + width: 2rem; + text-align: right; + @include monospaceFontFamily(); + &:last-child { + text-align: left; + } + } + &-long { + min-width: toRem(74px); + span { + min-width: 2.5rem; + text-align: right; + display: inline-block; + &:last-child { + text-align: left; + } + } + } + } + .Slider { + &:hover { + .MuiSlider-thumb { + opacity: 1; + visibility: visible; + } + .Mui-disabled { + .MuiSlider-thumb { + opacity: 0; + visibility: hidden; + } + } + } + + .MuiSlider { + &-root { + height: 0.375rem; + display: flex; + align-items: center; + } + &-rail, + &-track { + height: 0.125rem; + } + + &-thumb { + width: 0.5rem; + height: 0.5rem; + box-shadow: unset; + background-color: $primary-color; + margin-top: 0; + transition: opacity 0.18s ease-out; + opacity: 0; + visibility: hidden; + &:hover { + box-shadow: unset; + } + &::after { + // display: none; + width: toRem(18px); + height: toRem(22px); + top: toRem(-6px); + left: toRem(-5px); + } + } + } + } + + &__progressSlider { + margin: 0 $space-xxxs 0 $space-xxs; + height: toRem(40px); + .MuiSlider-root { + height: 100% !important; + } + } + &__volume { + margin: 0 $space-xxs 0 $space-xs; + position: relative; + button { + justify-content: flex-start; + } + &:hover { + .AudioBox__controllers__volume__Slider { + opacity: 1; + visibility: visible; + } + } + &__Slider { + background-color: $pico-5; + opacity: 0; + visibility: hidden; + transition: all 0.18s ease-out; + bottom: -1rem; + left: 0; + position: absolute; + width: toRem(56px); + box-shadow: 0 0.125rem 0.25rem rgba(28, 40, 82, 0.15); + border-radius: $border-radius-xss; + height: 1rem; + display: flex; + justify-content: center; + z-index: 2; + .Slider { + width: 2rem; + .MuiSlider { + &-root { + height: 0.375rem; + color: $pico-80; + } + &-rail, + &-track { + height: 0.125rem; + } + &-track { + background-color: $pico-80; + } + &-thumb { + height: toRem(6px); + width: toRem(6px); + background-color: $pico-80; + border-color: $pico-80; + margin-left: toRem(-4px); + margin-top: 0; + &:hover { + box-shadow: unset; + } + &::after { + width: toRem(16px); + height: toRem(16px); + top: toRem(-6px); + left: toRem(-6px); + } + } + } + } + } + } + } + &__caption { + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: $space-xxxxs; + max-width: toRem(268px); + } +} diff --git a/src/src/components/kit/AudioBox/AudioBox.tsx b/src/src/components/kit/AudioBox/AudioBox.tsx new file mode 100644 index 00000000..e1fc92c8 --- /dev/null +++ b/src/src/components/kit/AudioBox/AudioBox.tsx @@ -0,0 +1,235 @@ +import React from 'react'; +import AudioPlayer from 'material-ui-audio-player'; + +import { Button, Icon, Spinner, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { BATCH_COLLECT_DELAY } from 'config/mediaConfigs/mediaConfigs'; + +import AudioBoxProgress from 'modules/BaseExplorer/components/AudioBox/AudioBoxProgress'; +import AudioBoxVolume from 'modules/BaseExplorer/components/AudioBox/AudioBoxVolume'; + +import blobsURIModel from 'services/models/media/blobsURIModel'; + +import contextToString from 'utils/contextToString'; +import { downloadLink } from 'utils/helper'; + +import { IAudioBoxProps } from '.'; + +import './AudioBox.scss'; + +function AudioBox({ + data, + additionalProperties, + style = {}, +}: IAudioBoxProps): React.FunctionComponentElement { + const { blob_uri } = data; + const [isPlaying, setIsPlaying] = React.useState(false); + const [audio, setAudio] = React.useState(null); + const [processing, setProcessing] = React.useState(false); + let [src, setSrc] = React.useState(''); + let [blobData, setBlobData] = React.useState( + blobsURIModel.getState()[blob_uri] ?? null, + ); + let [muted, setMuted] = React.useState(true); + + const readyToPlay = React.useRef(false); + + React.useEffect(() => { + let timeoutID: number; + let subscription: any; + if (processing) { + if (blobData === null) { + if (blobsURIModel.getState()[blob_uri]) { + setBlobData(blobsURIModel.getState()[blob_uri]); + } else { + subscription = blobsURIModel.subscribe(blob_uri, (data) => { + setBlobData(data[blob_uri]); + subscription.unsubscribe(); + }); + timeoutID = window.setTimeout(() => { + if (blobsURIModel.getState()[blob_uri]) { + setBlobData(blobsURIModel.getState()[blob_uri]); + subscription.unsubscribe(); + } else { + // addUriToList(blob_uri); + } + }, BATCH_COLLECT_DELAY); + } + } + } + return () => { + if (timeoutID) { + clearTimeout(timeoutID); + } + if (subscription) { + subscription.unsubscribe(); + } + if (audio) { + audio.pause(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [processing]); + + React.useEffect(() => { + if (blobData) { + const audioRef = new Audio(); + audioRef.autoplay = true; + audioRef.muted = true; + audioRef.src = `data:audio/${data.format};base64,${blobData}`; + setSrc(`data:audio/${data.format};base64,${blobData}`); + setAudio(audioRef); + setMuted(false); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [blobData]); + + React.useEffect(() => { + if (isPlaying) { + audio?.play().then(() => { + setMuted(false); + }); + } else { + audio?.pause(); + } + }, [isPlaying, audio]); + + React.useEffect(() => { + // Pause and clean up on unmount + if (audio) { + audio.addEventListener('ended', onAudioEnded); + audio.addEventListener('canplay', handleReadyToPlay); + } + return () => { + if (audio) { + audio.pause(); + audio.removeEventListener('ended', onAudioEnded); + audio.removeEventListener('canplay', handleReadyToPlay); + } + }; + }, [audio]); + + React.useEffect(() => { + if (audio && !muted) { + audio.muted = false; + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [muted]); + + function handleReadyToPlay(): void { + setProcessing(false); + } + + function onAudioEnded(): void { + setIsPlaying(false); + } + + function onPlayChange(): void { + if (audio) { + readyToPlay.current = true; + setIsPlaying(!isPlaying); + } else { + setProcessing(true); + additionalProperties + .getAudiosBlobsData([blob_uri]) + .call() + .then(() => { + readyToPlay.current = true; + setIsPlaying(!isPlaying); + }); + } + } + + function onDownload(): void { + if (audio) { + handleDownload(); + } else { + setProcessing(true); + additionalProperties + .getAudiosBlobsData([blob_uri]) + .call() + .then(handleDownload); + } + } + + function handleDownload(): void { + const { index, format, context, step, caption, audio_name } = data; + const contextName = + contextToString(context) === '' ? '' : `_${contextToString(context)}`; + const name = `${audio_name}${contextName}_${caption}_${step}_${index}`; + + downloadLink(`data:audio/${format};base64,${blobData}`, name); + } + + return ( + +
+
+ {audio ? ( + + ) : ( +
+ + {processing ? ( + + ) : ( + + )} +
+ )} + + + +
+ + {data?.caption || ''} + +
+
+ ); +} + +AudioBox.displayName = 'AudioBox'; + +export default React.memo(AudioBox); diff --git a/src/src/components/kit/AudioBox/index.ts b/src/src/components/kit/AudioBox/index.ts new file mode 100644 index 00000000..11a85e22 --- /dev/null +++ b/src/src/components/kit/AudioBox/index.ts @@ -0,0 +1,5 @@ +import AudioBox from './AudioBox'; + +export * from './AudioBox.d'; + +export default AudioBox; diff --git a/src/src/components/kit/AutoSuggestions/AutoSuggestions.d.ts b/src/src/components/kit/AutoSuggestions/AutoSuggestions.d.ts new file mode 100644 index 00000000..9a57f03e --- /dev/null +++ b/src/src/components/kit/AutoSuggestions/AutoSuggestions.d.ts @@ -0,0 +1,10 @@ +import React from 'react'; + +export interface IAutoSuggestionsProps { + suggestionsList: string[]; + suggestionsPosition: { left: number; top: number }; + suggestionsRef: React.RefObject; + inputRef: React.MutableRefObject; + onSuggestionClick: (suggestion: string) => void; + setSuggestionsList: (list: string[]) => void; +} diff --git a/src/src/components/kit/AutoSuggestions/AutoSuggestions.scss b/src/src/components/kit/AutoSuggestions/AutoSuggestions.scss new file mode 100644 index 00000000..703f668f --- /dev/null +++ b/src/src/components/kit/AutoSuggestions/AutoSuggestions.scss @@ -0,0 +1,35 @@ +@use 'src/styles/abstracts' as *; + +.AutoSuggestions { + position: absolute; + width: 21.875rem; + max-width: calc(100vw - 29rem); + border: 0.0625rem solid #dceafb; + border-radius: 0.0625rem; + background-color: #fff; + z-index: 9999; + overflow: hidden; + &__item { + padding: 0 $space-xxs; + display: block; + color: $pico-60; + min-height: 1.5rem; + cursor: pointer; + outline: unset !important; + &:hover, + &:focus-visible, + &:focus { + background-color: #dceafb; + outline: unset; + } + &:last-child { + border-bottom: unset; + } + } +} + +//for safari browsers +.AutoSuggestions__item:focus { + background-color: #dceafb; + outline: unset; +} diff --git a/src/src/components/kit/AutoSuggestions/AutoSuggestions.tsx b/src/src/components/kit/AutoSuggestions/AutoSuggestions.tsx new file mode 100644 index 00000000..810bf4fd --- /dev/null +++ b/src/src/components/kit/AutoSuggestions/AutoSuggestions.tsx @@ -0,0 +1,80 @@ +import React from 'react'; +import styled from 'styled-components'; +import useDropdownMenu from 'react-accessible-dropdown-menu-hook'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IAutoSuggestionsProps } from './AutoSuggestions.d'; + +import './AutoSuggestions.scss'; + +const SuggestionsContainer: any = styled.div` + left: ${(props: any) => props.suggestionsPosition.left}px; + top: ${(props: any) => props.suggestionsPosition.top}px; + border: ${(props: any) => props.isEmpty && 'unset'}; +`; +function AutoSuggestions({ + inputRef, + suggestionsRef, + suggestionsList, + suggestionsPosition, + onSuggestionClick, + setSuggestionsList, +}: IAutoSuggestionsProps): React.FunctionComponentElement | null { + const { buttonProps, itemProps } = useDropdownMenu(suggestionsList.length); + React.useEffect(() => { + if (suggestionsRef) { + suggestionsRef.current.itemProps = { ...itemProps }; + suggestionsRef.current.buttonProps = { ...buttonProps }; + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + function onSuggestionsKeyDown( + e: React.KeyboardEvent, + ): void { + if (e.key === 'Escape') { + inputRef.current.focus(); + } else { + if (buttonProps.onKeyDown) { + buttonProps?.onKeyDown(e); + } + } + } + + function onSuggestionsBlur(e: React.FocusEvent): void { + if (!e.relatedTarget) { + setSuggestionsList([]); + } + } + + return ( + + + {suggestionsList?.map((suggestion: string, index: number) => ( + onSuggestionClick(suggestion)} + {...itemProps[index]} + > + {suggestion} + + ))} + + + ); +} + +AutoSuggestions.displayName = 'AutoSuggestions'; + +export default AutoSuggestions; diff --git a/src/src/components/kit/AutoSuggestions/index.ts b/src/src/components/kit/AutoSuggestions/index.ts new file mode 100644 index 00000000..baf640a8 --- /dev/null +++ b/src/src/components/kit/AutoSuggestions/index.ts @@ -0,0 +1,4 @@ +import AutoSuggestions from './AutoSuggestions'; +export * from './AutoSuggestions.d'; + +export default AutoSuggestions; diff --git a/src/src/components/kit/Badge/Badge.d.ts b/src/src/components/kit/Badge/Badge.d.ts new file mode 100644 index 00000000..8f2321d5 --- /dev/null +++ b/src/src/components/kit/Badge/Badge.d.ts @@ -0,0 +1,21 @@ +import React from 'react'; + +import { IconName } from '../Icon/Icon.d'; + +export interface IBadgeProps + extends Partial> { + id?: string; + label: string; + value?: string; + color?: string; + startIcon?: IconName; + size?: 'xSmall' | 'small' | 'medium' | 'large' | 'xLarge'; + onDelete?: (label: string) => void; + onClick?: (e: React.MouseEvent) => void; + maxWidth?: string; + style?: React.CSSProperties; + className?: string; + selectBadge?: boolean; + disabled?: boolean; + monospace?: boolean; +} diff --git a/src/src/components/kit/Badge/Badge.scss b/src/src/components/kit/Badge/Badge.scss new file mode 100644 index 00000000..91125089 --- /dev/null +++ b/src/src/components/kit/Badge/Badge.scss @@ -0,0 +1,148 @@ +@use 'src/styles/abstracts' as *; + +.Badge { + display: inline-flex; + flex-wrap: nowrap; + align-items: center; + justify-content: center; + height: 1.75rem; + border-radius: 0.375rem; + font-weight: $font-500; + white-space: nowrap; + vertical-align: middle; + text-decoration: none; + + &__label { + flex-wrap: nowrap; + white-space: nowrap; + line-height: 1rem; + overflow: hidden; + max-width: 100%; + text-overflow: ellipsis; + } + i { + display: flex; + align-items: center; + justify-content: center; + width: unset; + height: unset; + margin: 0; + } + + &__deleteIcon, + &__startIcon { + width: 1.125rem; + height: 1.125rem; + margin-left: unset; + display: flex; + align-items: center; + justify-content: center; + border-radius: $border-radius-xs; + transition: all 0.18s ease-out; + } + &__deleteIcon { + cursor: pointer; + } + &__select { + margin-top: $space-xxxs; + margin-right: $space-xxxs; + } + &__disabled { + pointer-events: none; + opacity: 0.5; + } + &__default { + color: #414b6d; + background-color: $cuddle-10; + border: $border-grey; + &:hover { + background-color: $cuddle-10; + } + .Badge__startIcon { + i { + color: $text-color; + } + } + .Badge__deleteIcon { + i { + color: $text-color; + } + &:hover { + background-color: $cuddle-30; + } + } + } + + &__small, + &__xSmall { + font-size: $text-sm; + i { + font-size: 0.4375rem; + margin-bottom: 1px; + } + .Badge__label { + padding: 0 $space-xs; + } + .Badge__deleteIcon, + .Badge__startIcon { + width: 0.875rem; + height: 0.875rem; + } + .Badge__deleteIcon { + margin-right: 0.25rem; + } + .Badge__startIcon { + margin-left: 0.25rem; + } + } + &__small { + height: 1.5rem; + } + + &__xSmall { + height: 1.125rem; + } + &__medium { + height: 1.5rem; + font-size: $text-md; + .Badge__label { + padding: 0 $space-sm; + } + i { + font-size: $text-xxs; + } + .Badge__deleteIcon { + margin-right: $space-xs; + } + .Badge__startIcon { + margin-left: $space-xs; + } + } + + &__large, + &__xLarge { + font-size: $text-md; + height: 1.75rem; + .Badge__label { + padding: 0 $space-sm; + } + .Badge__deleteIcon { + margin-right: $space-xs; + i { + font-size: $text-xxs; + } + } + .Badge__startIcon { + margin-left: $space-xs; + i { + font-size: $text-xxs; + } + } + } + &__xLarge { + height: 2rem; + .Badge__label { + padding: 0 $space-unit; + } + } +} diff --git a/src/src/components/kit/Badge/Badge.tsx b/src/src/components/kit/Badge/Badge.tsx new file mode 100644 index 00000000..2e870311 --- /dev/null +++ b/src/src/components/kit/Badge/Badge.tsx @@ -0,0 +1,108 @@ +import React from 'react'; +import styled from 'styled-components'; +import classNames from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { Icon } from '../index'; + +import { IBadgeProps } from './Badge.d'; + +import './Badge.scss'; + +const getBadgeColor: (color: string) => string = (color: string): string => + `background-color: ${color}1a; + color: ${color}; + border: 0.0625rem solid ${color};`; + +const BadgeContainer: any = styled.div` + font-family: ${(props: any) => + props.monospace ? '"Inconsolata", monospace' : 'Inter, sans-serif'}; + ${({ color }) => color && getBadgeColor(color)}; + font-variation-settings: ${(props: any) => props.monospace && "'wdth' 82"}; + ${(props: any) => ({ ...props.styleProps })} +`; + +const BadgeIcon = styled.span` + ${(props) => + props.color && + `&:hover { + background-color: ${props.color}2a} + }`} +`; + +/** + * @property {string} id - id of Badge + * @property {string} label - label of Badge + * @property {string} color - Badge color + * @property {string} size - size of Badge + * @property {maxWidth} string - maximum width of Badge + * @property {React.CSSProperties} style - applies inline styles + * @property {string} className - component className + * @property {boolean} selectBadge - defines if Badge renders in Select component + * @property {function} onDelete - delete callBack function + * @property {function} onClick - handling on Badge click function + */ +function Badge({ + id, + label, + value, + color = '', + size = 'medium', + style, + className = '', + startIcon, + maxWidth = '100%', + monospace = false, + disabled = false, + selectBadge, + onDelete, + onClick, +}: IBadgeProps): React.FunctionComponentElement { + return ( + + + {startIcon && ( + + + + )} + {label} + {onDelete && ( + { + e.stopPropagation(); + onDelete(value ?? label); + }} + className='Badge__deleteIcon' + > + + + )} + + + ); +} + +Badge.displayName = 'Badge'; + +export default Badge; diff --git a/src/src/components/kit/Badge/index.ts b/src/src/components/kit/Badge/index.ts new file mode 100644 index 00000000..24d7727f --- /dev/null +++ b/src/src/components/kit/Badge/index.ts @@ -0,0 +1,4 @@ +import Badge from './Badge'; +export * from './Badge.d'; + +export default Badge; diff --git a/src/src/components/kit/Button/Button.d.ts b/src/src/components/kit/Button/Button.d.ts new file mode 100644 index 00000000..40d92bdd --- /dev/null +++ b/src/src/components/kit/Button/Button.d.ts @@ -0,0 +1,6 @@ +import { ButtonProps } from '@material-ui/core/Button'; + +export interface IButtonProps extends ButtonProps { + withOnlyIcon?: boolean; + size?: ButtonProps['size'] | 'xSmall' | 'xxSmall'; +} diff --git a/src/src/components/kit/Button/Button.scss b/src/src/components/kit/Button/Button.scss new file mode 100644 index 00000000..77713670 --- /dev/null +++ b/src/src/components/kit/Button/Button.scss @@ -0,0 +1,34 @@ +// -------- contained overrides -------- +.MuiButton-contained { + &.Mui-disabled { + box-shadow: none; + background-color: #1266cc; + color: white; + opacity: 0.5; + } + &:hover { + box-shadow: none; + } +} + +// -------- outlined overrides -------- +.MuiButton-outlined { + &.Mui-disabled { + box-shadow: none; + color: #89b9f2; + border-color: #89b9f2; + opacity: 0.5; + } +} + +// text +.MuiButton-label { + text-transform: capitalize; +} + +// -------- text overrides -------- +.MuiButton-text { + &.Mui-disabled { + color: #89b9f2; + } +} diff --git a/src/src/components/kit/Button/Button.tsx b/src/src/components/kit/Button/Button.tsx new file mode 100644 index 00000000..a679baa9 --- /dev/null +++ b/src/src/components/kit/Button/Button.tsx @@ -0,0 +1,92 @@ +import React from 'react'; + +import MUButton from '@material-ui/core/Button'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IButtonProps } from '.'; + +import './Button.scss'; + +const sizes = { + xxSmall: '1.25rem', + xSmall: '1.5rem', + small: '1.75rem', + medium: '2rem', + large: '2.25rem', +}; + +const fontSizes = { + xxSmall: '0.625rem', + xSmall: '0.75rem', + small: '0.875rem', + medium: '0.875rem', + large: '0.875rem', +}; + +const withOnlyIconSizes = { + xxSmall: '1.25rem', + xSmall: '1.5rem', + small: '1.75rem', + medium: '2rem', + large: '2.25rem', +}; + +const minWidthSizes = { + xxSmall: 'auto', + xSmall: 'auto', + small: '4.375rem', + medium: '4.375rem', + large: '4.375rem', +}; + +const paddingSizes = { + xxSmall: '0.125rem 0.5rem', + xSmall: '0.25rem 0.625rem', + small: '0.5rem 1.25rem', + medium: '0.5rem 1.25rem', + large: '0.5rem 1.25rem', +}; + +const borderRadiusSizes = { + xxSmall: '0.25rem', + xSmall: '0.25rem', + small: '0.25rem', + medium: '0.375rem', + large: '0.5rem', +}; + +function Button({ + size, + withOnlyIcon, + color, + children, + ...rest +}: IButtonProps): React.FunctionComponentElement { + const styleOverrides = { + borderRadius: borderRadiusSizes[size || 'medium'], + padding: withOnlyIcon ? '0.25rem' : paddingSizes[size || 'medium'], + fontSize: fontSizes[size || 'medium'], + height: withOnlyIcon + ? withOnlyIconSizes[size || 'medium'] + : sizes[size || 'medium'], + minWidth: withOnlyIcon ? '1.25rem' : minWidthSizes[size || 'medium'], + ...(withOnlyIcon && { width: withOnlyIconSizes[size || 'medium'] }), + }; + + return ( + + + {children} + + + ); +} + +Button.displayName = 'Button'; + +export default React.memo(Button); diff --git a/src/src/components/kit/Button/index.ts b/src/src/components/kit/Button/index.ts new file mode 100644 index 00000000..e9f8f218 --- /dev/null +++ b/src/src/components/kit/Button/index.ts @@ -0,0 +1,4 @@ +import Button from './Button'; +export * from './Button.d'; + +export default Button; diff --git a/src/src/components/kit/Card/Card.d.ts b/src/src/components/kit/Card/Card.d.ts new file mode 100644 index 00000000..45851878 --- /dev/null +++ b/src/src/components/kit/Card/Card.d.ts @@ -0,0 +1,19 @@ +import React from 'react'; + +import { IIllustrationConfig } from 'types/components/Table/Table'; + +export interface ICardProps { + title: string; + subtitle?: string; + children?: React.ReactNode; + className?: string; + dataListProps?: { + tableColumns: any; + tableData: any; + searchableKeys?: string[]; + illustrationConfig?: IIllustrationConfig; + isLoading?: boolean; + withSearchBar?: boolean; + calcTableHeight?: boolean; + }; +} diff --git a/src/src/components/kit/Card/Card.scss b/src/src/components/kit/Card/Card.scss new file mode 100644 index 00000000..b70ac8d4 --- /dev/null +++ b/src/src/components/kit/Card/Card.scss @@ -0,0 +1,23 @@ +@use 'src/styles/abstracts' as *; + +.Card { + display: flex; + flex-direction: column; + padding: $space-lg; + border: $border-grey; + border-radius: $border-radius-lg; + background: $white; + width: 100%; + &__header { + margin-bottom: $space-md; + display: flex; + flex-direction: column; + &__subTitle { + margin-top: $space-xxxs; + margin-bottom: $space-xxxs; + } + } + &__tableWrapper { + height: toRem(356px); + } +} diff --git a/src/src/components/kit/Card/Card.tsx b/src/src/components/kit/Card/Card.tsx new file mode 100644 index 00000000..41ef7fd8 --- /dev/null +++ b/src/src/components/kit/Card/Card.tsx @@ -0,0 +1,65 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Text } from 'components/kit'; +import DataList from 'components/kit/DataList'; + +import { ICardProps } from './Card.d'; + +import './Card.scss'; + +/** + * @property {string} title - title + * @property {string} subTitle - subtitle (optional) + * @property {string} className - additional class name (optional) + * @property {boolean} isLoading - is loading + * @property {{ + * tableColumns: any, + * tableData: any, + * searchableKeys?: string[], + * illustrationConfig?: IIllustrationConfig, + * isLoading: boolean, + * }} dataListProps - table props + * @property {React.HTMLElement} children - children element + */ + +function Card({ + title, + subtitle, + className, + dataListProps, + children, +}: ICardProps): React.FunctionComponentElement { + const tableRef = React.useRef(null); + + return ( +
+
+ + {title} + + {subtitle && ( + + {subtitle} + + )} +
+ {children || ( +
+ {dataListProps?.tableData && ( + + )} +
+ )} +
+ ); +} + +Card.displayName = 'Card'; + +export default React.memo(Card); diff --git a/src/src/components/kit/Card/index.tsx b/src/src/components/kit/Card/index.tsx new file mode 100644 index 00000000..48356677 --- /dev/null +++ b/src/src/components/kit/Card/index.tsx @@ -0,0 +1,5 @@ +import Card from './Card'; + +export * from './Card'; + +export default Card; diff --git a/src/src/components/kit/DataList/DataList.d.ts b/src/src/components/kit/DataList/DataList.d.ts new file mode 100644 index 00000000..ec9ebbbd --- /dev/null +++ b/src/src/components/kit/DataList/DataList.d.ts @@ -0,0 +1,18 @@ +import React from 'react'; + +import { IIllustrationConfig } from 'types/components/Table/Table'; + +export interface IDataListProps { + tableRef: React.RefObject; + tableData: any; + isLoading?: boolean; + withSearchBar?: boolean; + tableColumns: any; + searchableKeys?: string[]; + illustrationConfig?: IIllustrationConfig; + rowHeight?: number; + height?: string; + tableClassName?: string; + toolbarItems?: React.FunctionComponentElement[]; + disableMatchBar?: boolean; +} diff --git a/src/src/components/kit/DataList/DataList.scss b/src/src/components/kit/DataList/DataList.scss new file mode 100644 index 00000000..6934fe77 --- /dev/null +++ b/src/src/components/kit/DataList/DataList.scss @@ -0,0 +1,93 @@ +@use 'src/styles/abstracts' as *; + +.DataList { + display: flex; + flex-direction: column; + width: 100%; + max-height: 100%; + &__toolbarItems { + height: 2rem; + margin-left: $space-md; + display: flex; + align-items: center; + } + &__textsTable { + border: $border-grey; + border-radius: $border-radius-md; + overflow: hidden; + width: 100%; + .BaseTable__body { + & > div { + width: 100% !important; + .BaseTable__row { + width: 100% !important; + } + } + } + } + &__mark { + background-color: $mark-color; + color: $pico; + } + .VisualizationLoader { + height: 100% !important; + } + .BaseTable { + &__table-main { + outline: none; + } + &__header { + &-row { + background: #ebf0f8; + border-bottom: none; + } + &-cell { + border-bottom: $border-grey; + padding: 0 toRem(16px); + &:last-child { + border-right: none; + } + &-text { + font-size: $text-md; + } + } + } + &__row { + border-bottom: none; + cursor: initial; + &--hovered { + background: #e8f1fc; + } + + &-cell { + position: relative; + min-height: 24px; + max-height: 300px; + padding: 0 $space-unit; + border-right: unset; + border-bottom: $border-grey; + display: flex; + p { + word-break: break-all; + white-space: normal; + } + + &:last-child { + display: flex; + border-right: none; + white-space: normal; + &:has(> pre) { + overflow: auto !important; + } + } + } + + &:last-child { + box-shadow: $cuddle-50 0px 1px 0px 0px; + .BaseTable__row-cell { + border-bottom: none; + } + } + } + } +} diff --git a/src/src/components/kit/DataList/DataList.tsx b/src/src/components/kit/DataList/DataList.tsx new file mode 100644 index 00000000..f3d58e38 --- /dev/null +++ b/src/src/components/kit/DataList/DataList.tsx @@ -0,0 +1,129 @@ +import React from 'react'; +import classNames from 'classnames'; + +import Table from 'components/Table/Table'; +import useTextSearch from 'components/kit/DataList/SearchBar/useTextSearch'; +import BusyLoaderWrapper from 'components/BusyLoaderWrapper/BusyLoaderWrapper'; + +import SearchBar from './SearchBar'; +import { IDataListProps } from './DataList.d'; + +import './DataList.scss'; + +/** + * @property {any} tableColumns - columns + * @property {any} tableData - rows + * @property {string[]} searchableKeys - additional class name (optional) + * @property {IIllustrationConfig} illustrationConfig - illustration config + * @property {boolean} isLoading - data is loading + * @property {boolean} withoutSearchBar - show search bar + * @property {React.RefElement} tableRef - ref + */ + +function DataList({ + tableRef, + tableData, + isLoading, + tableColumns, + withSearchBar = true, + searchableKeys, + illustrationConfig, + rowHeight = 28, + height = '100vh', + tableClassName = '', + toolbarItems = [], + disableMatchBar = false, +}: IDataListProps): React.FunctionComponentElement { + const textSearch = useTextSearch({ + rawData: tableData, + updateData, + searchableKeys, + }); + + function getHighlightedData(data: any[], regex: RegExp | null) { + const searchableKeysList = searchableKeys ?? Object.keys(data[0] ?? {}); + const index = searchableKeysList.indexOf('key'); + if (index > -1) { + searchableKeysList.splice(index, 1); + } + return data.map((item) => { + const highlightedItem: any = {}; + searchableKeysList.forEach((searchableKey: string) => { + const reg = new RegExp(regex?.source ?? '', regex?.flags); + highlightedItem[searchableKey] = + regex === null + ? `${item[searchableKey]}` + : `${item[searchableKey]}` + ?.split(regex) + ?.filter((part: string) => part !== '') + ?.map((part: string, i: number) => { + return reg.test(part) ? ( + + {part} + + ) : ( + part + ); + }); + }); + return { + ...item, + ...highlightedItem, + }; + }); + } + + function updateData(data: any[], regex: RegExp | null) { + tableRef.current?.updateData({ newData: getHighlightedData(data, regex) }); + } + return ( +
+ {withSearchBar && ( +
+ +
+ )} + + {textSearch.data && ( + + )} + + + ); +} + +DataList.displayName = 'DataList'; + +export default React.memo(DataList); diff --git a/src/src/components/kit/DataList/SearchBar/SearchBar.scss b/src/src/components/kit/DataList/SearchBar/SearchBar.scss new file mode 100644 index 00000000..9a63d11d --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/SearchBar.scss @@ -0,0 +1,40 @@ +@use 'src/styles/abstracts' as *; + +.SearchBar { + display: flex; + width: toRem(415px); + margin-bottom: toRem(14px); + align-items: center; + max-width: 100%; + + .MatchIcons { + display: flex; + align-items: baseline; + } + + label { + font-size: $text-md; + } + + .MatchButton { + margin-right: $space-xxs; + &:last-child { + margin-right: unset; + } + + &:not(.active) { + .Mui-disabled { + color: $pico-30; + } + } + &.active { + .Icon__container { + color: $primary-color; + } + } + .Icon__container { + font-size: $text-lg; + color: $pico-80; + } + } +} diff --git a/src/src/components/kit/DataList/SearchBar/SearchBar.tsx b/src/src/components/kit/DataList/SearchBar/SearchBar.tsx new file mode 100644 index 00000000..72b0f1aa --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/SearchBar.tsx @@ -0,0 +1,135 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import Icon from 'components/kit/Icon'; +import Button from 'components/kit/Button'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { + ISearchBarProps, + MatchTypes, +} from 'components/kit/DataList/SearchBar/types.d'; + +import SearchInput from './SearchInput'; + +import './SearchBar.scss'; + +function SearchBar({ + matchType, + searchValue, + isValidInput, + onInputClear, + onInputChange, + onMatchTypeChange, + isDisabled, + disableMatchBar = false, + toolbarItems, +}: ISearchBarProps) { + return ( + +
+ + {disableMatchBar ? null : ( +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+ )} + + {!!toolbarItems?.length && ( +
{toolbarItems}
+ )} +
+
+ ); +} + +SearchBar.displayName = 'SearchBar'; + +export default React.memo(SearchBar); diff --git a/src/src/components/kit/DataList/SearchBar/SearchInput/EndAdornment.tsx b/src/src/components/kit/DataList/SearchBar/SearchInput/EndAdornment.tsx new file mode 100644 index 00000000..1ecc9a7b --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/SearchInput/EndAdornment.tsx @@ -0,0 +1,38 @@ +import React from 'react'; + +import Icon from 'components/kit/Icon'; +import Button from 'components/kit/Button'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ISearchInputEndAdornment } from '../types'; + +function EndAdornment({ + showSearchIcon = true, + onClickClearButton, + isDisabled, +}: ISearchInputEndAdornment) { + return ( + + + {showSearchIcon ? ( + + ) : ( + <> + + + + )} + + + ); +} + +export default React.memo(EndAdornment); diff --git a/src/src/components/kit/DataList/SearchBar/SearchInput/SearchInput.scss b/src/src/components/kit/DataList/SearchBar/SearchInput/SearchInput.scss new file mode 100644 index 00000000..772352af --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/SearchInput/SearchInput.scss @@ -0,0 +1,52 @@ +@use 'src/styles/abstracts' as *; + +.SearchInput { + margin-right: toRem(10px); + &.activeCloseButton { + .MuiInputBase-root { + padding-right: $space-xxs; + } + } + .MuiOutlinedInput-adornedEnd { + padding-right: toRem(10px); + } + label { + font-size: $text-md; + } + + .MuiFormLabel-root { + top: $space-xxxxs; + } + + input { + font-size: $text-md; + &::placeholder { + font-size: $text-md; + } + } + width: 100%; + .MuiInputLabel-outlined { + z-index: 1; + transform: translate(14px, 6px) scale(1); + pointer-events: none; + &.MuiInputLabel-shrink { + transform: translate(14px, -6px) scale(0.75); + } + } + + .EndAdornment { + display: flex; + align-items: center; + .divider-vertical { + width: toRem(1px); + height: toRem(20px); + margin: 0 toRem(6px) 0 toRem(8px); + background: $cuddle-70; + border-radius: toRem(1px); + } + + .Mui-disabled { + color: $pico-30; + } + } +} diff --git a/src/src/components/kit/DataList/SearchBar/SearchInput/index.tsx b/src/src/components/kit/DataList/SearchBar/SearchInput/index.tsx new file mode 100644 index 00000000..703a6bd7 --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/SearchInput/index.tsx @@ -0,0 +1,58 @@ +import React, { ChangeEvent } from 'react'; +import classNames from 'classnames'; + +import { FormControl, InputLabel, OutlinedInput } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ISearchInputProps } from '../types'; + +import EndAdornment from './EndAdornment'; + +import './SearchInput.scss'; + +function SearchInput({ + value, + onInputClear, + onInputChange, + isValidInput, + isDisabled, +}: ISearchInputProps) { + return ( + + + + Search + + ) => + onInputChange(event.target.value) + } + endAdornment={ + + } + style={{ + height: 28, + }} + /> + + + ); +} + +export default React.memo(SearchInput); diff --git a/src/src/components/kit/DataList/SearchBar/index.ts b/src/src/components/kit/DataList/SearchBar/index.ts new file mode 100644 index 00000000..7a508f97 --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/index.ts @@ -0,0 +1,3 @@ +import SearchBar from './SearchBar'; + +export default SearchBar; diff --git a/src/src/components/kit/DataList/SearchBar/types.d.ts b/src/src/components/kit/DataList/SearchBar/types.d.ts new file mode 100644 index 00000000..5eea84e2 --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/types.d.ts @@ -0,0 +1,44 @@ +export interface ISearchBarProps { + matchType: MatchTypes | null; + searchValue: string; + isValidInput: boolean; + onInputChange: (value: string) => void; + onInputClear: () => void; + onMatchTypeChange: (value: MatchTypes | null) => void; + isDisabled: boolean; + toolbarItems?: React.FunctionComponentElement[]; + disableMatchBar?: boolean; +} + +export interface ISearchInputProps { + value: string; + isValidInput: boolean; + isDisabled: boolean; + onInputChange: (value: string) => void; + onInputClear: () => void; +} + +export interface ISearchInputEndAdornment { + showSearchIcon?: boolean; + isDisabled: boolean; + onClickClearButton: () => void; +} + +export interface UseTextSearchProps { + rawData: { text: string }[]; + updateData: (data: { text: string }[], regex: RegExp | null) => void; + searchableKeys?: string[]; +} + +export enum MatchTypes { + Case = 'case', + Word = 'word', + RegExp = 'regExp', +} + +export type FilterOptions = { + matchType: MatchTypes | null; + searchValue: string; + isValidSearch: boolean; + appliedRegExp: RegExp | null; +}; diff --git a/src/src/components/kit/DataList/SearchBar/useTextSearch.ts b/src/src/components/kit/DataList/SearchBar/useTextSearch.ts new file mode 100644 index 00000000..386dfd1a --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/useTextSearch.ts @@ -0,0 +1,165 @@ +import React from 'react'; + +import { FilterOptions, MatchTypes, UseTextSearchProps } from './types.d'; + +const defaultFilterOption: FilterOptions = { + matchType: null, + searchValue: '', + isValidSearch: true, + appliedRegExp: null, +}; + +function useTextSearch({ + rawData, + updateData, + searchableKeys, +}: UseTextSearchProps) { + const [data, setData] = React.useState<{ text: string }[]>(rawData); + const [filterOptions, setFilterOptions] = + React.useState(defaultFilterOption); + + React.useEffect(() => { + if (filterOptions.appliedRegExp) { + const filteredData = filterByCase( + filterOptions.searchValue, + filterOptions.appliedRegExp, + filterOptions.matchType, + ); + + setData(filteredData); + updateData(filteredData, filterOptions.appliedRegExp); + } else { + setData(rawData); + updateData(rawData, null); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [rawData]); + + function search(search: string, matchType: MatchTypes | null) { + if (!search) { + setData(rawData); + updateData(rawData, null); + setFilterOptions((fO) => ({ + ...fO, + appliedRegExp: null, + })); + return; + } + let appliedRegExp: RegExp | null; + // @TODO fix \ and [ symbols issue + try { + switch (matchType) { + case MatchTypes.Word: + search = `\\b${search}\\b`; + appliedRegExp = new RegExp(`(${search})`, 'gi'); + break; + case MatchTypes.Case: + appliedRegExp = new RegExp(`(${search})`, 'g'); + break; + case MatchTypes.RegExp: + try { + let match = search.match(new RegExp('^/(.*?)/([gimy]*)$')); + if (match) { + appliedRegExp = new RegExp(`(${match[1]})`, match[2]); + } else { + appliedRegExp = new RegExp(`(${search})`, 'g'); + } + } catch (e) { + appliedRegExp = null; + } + break; + default: + appliedRegExp = new RegExp(`(${search})`.toLowerCase(), 'gi'); + } + } catch { + appliedRegExp = new RegExp('()'.toLowerCase(), 'gi'); + } + + const filteredData = filterByCase(search, appliedRegExp, matchType); + + setFilterOptions((fO) => ({ + ...fO, + appliedRegExp, + })); + setData(filteredData); + updateData(filteredData, appliedRegExp); + } + + function filterByCase( + search: string, + appliedRegExp: RegExp | null, + matchType: MatchTypes | null, + ) { + const searchableKeysList = searchableKeys ?? Object.keys(rawData[0] || {}); + const index = searchableKeysList.indexOf('key'); + if (index > -1) { + searchableKeysList.splice(index, 1); + } + return rawData?.filter((item: any) => { + return !!searchableKeysList.find((searchableKey: string) => { + const text = `${item[searchableKey]}`; + switch (matchType) { + case MatchTypes.Word: + if (text.search(appliedRegExp!) > -1) { + return item; + } + break; + case MatchTypes.Case: + if (text.indexOf(search) > -1) { + return item; + } + break; + case MatchTypes.RegExp: + try { + if (appliedRegExp!.test(text)) { + return item; + } + } catch (e) { + setFilterOptions((fO) => ({ + ...fO, + isValidSearch: false, + appliedRegExp: null, + })); + } + + break; + default: + if (text.toLowerCase().indexOf(search.toLowerCase()) > -1) { + return item; + } + } + return false; + }); + }); + } + + function clearSearchInputData() { + changeSearchInput(''); + } + + function changeSearchInput(value: string) { + search(value, filterOptions.matchType); + setFilterOptions((fO) => ({ + ...fO, + searchValue: value, + })); + } + + function changeMatchType(matchType: MatchTypes | null) { + search(filterOptions.searchValue, matchType); + setFilterOptions((fO) => ({ + ...fO, + matchType, + })); + } + + return { + data, + filterOptions, + changeMatchType, + clearSearchInputData, + changeSearchInput, + }; +} + +export default useTextSearch; diff --git a/src/src/components/kit/DataList/index.tsx b/src/src/components/kit/DataList/index.tsx new file mode 100644 index 00000000..d04a8278 --- /dev/null +++ b/src/src/components/kit/DataList/index.tsx @@ -0,0 +1,5 @@ +import DataList from './DataList'; + +export * from './DataList.d'; + +export default DataList; diff --git a/src/src/components/kit/DictVisualizer/DictVisualizer.d.ts b/src/src/components/kit/DictVisualizer/DictVisualizer.d.ts new file mode 100644 index 00000000..175eceee --- /dev/null +++ b/src/src/components/kit/DictVisualizer/DictVisualizer.d.ts @@ -0,0 +1,29 @@ +import { CSSProperties } from 'react'; + +export interface IDictVisualizerProps { + src: object | Record; + style?: CSSProperties; + autoScale?: boolean; +} + +export type DictVisualizerRowType = { + id: string; + root?: boolean; + closing?: boolean; + level: number; + key: string | number | null; + value: unknown; + closedValue?: unknown; + sub: string | null; + color: string; + copyContent?: string; +}; + +export interface IDictVisualizerRowProps { + row: DictVisualizerRowType; + collapseToggler: (rowID: string) => void; + style?: CSSProperties; + index: number; + isCollapsed: boolean; + rowsCount: number; +} diff --git a/src/src/components/kit/DictVisualizer/DictVisualizer.scss b/src/src/components/kit/DictVisualizer/DictVisualizer.scss new file mode 100644 index 00000000..b1186817 --- /dev/null +++ b/src/src/components/kit/DictVisualizer/DictVisualizer.scss @@ -0,0 +1,60 @@ +@use 'src/styles/abstracts' as *; + +.DictVisualizer { + @include monospaceFontFamily(); + width: 100%; + height: 100%; +} +.DictVisualizer__row { + display: flex; + align-items: center; + + &:hover { + .DictVisualizer__row__copy { + visibility: visible; + } + } +} + +.DictVisualizer__row__indent { + display: inline-block; + height: 100%; + margin-left: 9px; // based on icon size + margin-right: $space-md; + border-left: $border-dark; +} + +.DictVisualizer__row__collapseToggler { + display: flex; + align-items: center; + margin-right: $space-xxxs; + cursor: pointer; +} + +.DictVisualizer__row__content { + display: flex; + align-items: baseline; +} + +.DictVisualizer__row__content__key { + margin-right: $space-xs; +} + +.DictVisualizer__row__content__sub { + margin-right: $space-xxs; + font-style: italic; + white-space: nowrap; +} + +.DictVisualizer__row__content__value { + white-space: nowrap; +} + +.DictVisualizer__row__content__value--closing { + margin-left: 7px; // based on icon size +} + +.DictVisualizer__row__copy { + margin-left: $space-xxxs; + visibility: hidden; +} diff --git a/src/src/components/kit/DictVisualizer/DictVisualizer.tsx b/src/src/components/kit/DictVisualizer/DictVisualizer.tsx new file mode 100644 index 00000000..b44e6717 --- /dev/null +++ b/src/src/components/kit/DictVisualizer/DictVisualizer.tsx @@ -0,0 +1,329 @@ +import * as React from 'react'; +import { FixedSizeList as List, ListChildComponentProps } from 'react-window'; +import AutoSizer from 'react-virtualized-auto-sizer'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import CopyToClipBoard from 'components/CopyToClipBoard/CopyToClipBoard'; + +import { formatValue } from 'utils/formatValue'; +import { toType, typeToColor } from 'utils/valueToType/valueToType'; + +import Text from '../Text'; +import Icon from '../Icon'; +import Button from '../Button'; + +import { + IDictVisualizerProps, + DictVisualizerRowType, + IDictVisualizerRowProps, +} from './DictVisualizer.d'; + +import './DictVisualizer.scss'; + +const ROW_SIZE = 22; + +function DictVisualizer(props: IDictVisualizerProps) { + const [collapsedItems, setCollapsedItems] = React.useState< + Record + >({}); + + const initialRows = React.useRef([]); + + const [rows, setRows] = React.useState([]); + + function collapseToggler(id: string) { + setCollapsedItems((cI) => ({ + ...cI, + [id]: !cI[id], + })); + } + + React.useEffect(() => { + initialRows.current = flattenDict(props.src as Record); + setRows(initialRows.current); + }, [props.src]); + + React.useEffect(() => { + if ( + initialRows.current.length > 0 && + Object.keys(collapsedItems).length > 0 + ) { + let newRows: DictVisualizerRowType[] = []; + let currentRootIsClosed: string | null = null; + for (let i = 0; i < initialRows.current.length; i++) { + const row = initialRows.current[i]; + if (!currentRootIsClosed) { + newRows.push(row); + } + if (collapsedItems[row.id]) { + currentRootIsClosed = + currentRootIsClosed === row.id + ? null + : currentRootIsClosed !== null + ? currentRootIsClosed + : row.id; + } + } + + setRows(newRows); + } + }, [collapsedItems, initialRows]); + + return ( + +
+ + {({ width, height }) => ( + + {({ index, style }: ListChildComponentProps) => { + const row = rows[index]; + return ( + + ); + }} + + )} + +
+
+ ); +} + +function DictVisualizerRow(props: IDictVisualizerRowProps) { + const { row, style, index, collapseToggler, isCollapsed, rowsCount } = props; + + return ( +
+ {index !== 0 && + index !== rowsCount - 1 && + Array(row.level + 1) + .fill('_') + .map((_, i) => ( +
+ ))} + {row.root && ( + + )} +
+ {row.key !== null && ( + + {row.key}: + + )} + {row.sub !== null && ( + + {row.sub} + + )} + collapseToggler(row.id) : undefined} + > + {(isCollapsed ? row.closedValue : row.value) as string} + +
+ {row.copyContent && ( + + )} +
+ ); +} + +// Convert the dict to a list of key-value pairs +function flattenDict( + dict: Record | unknown[], + level: number = 0, + parentKey: string = 'root', +) { + let rows: DictVisualizerRowType[] = []; + + // Add top level brackets + if (level === 0) { + if (Array.isArray(dict)) { + let nestedItemsLength = dict.length; + rows.push({ + id: parentKey, + root: nestedItemsLength > 0, + level, + key: null, + value: `[${nestedItemsLength === 0 ? ']' : ''}`, + closedValue: '[...]', + sub: `${nestedItemsLength} item${nestedItemsLength === 1 ? '' : 's'}`, + color: typeToColor('array'), + copyContent: formatValue(dict), + }); + } else { + let nestedItemsLength = Object.keys(dict).length; + rows.push({ + id: parentKey, + root: nestedItemsLength > 0, + level, + key: null, + value: `{${nestedItemsLength === 0 ? '}' : ''}`, + closedValue: '{...}', + sub: `${nestedItemsLength} item${nestedItemsLength === 1 ? '' : 's'}`, + color: typeToColor('object'), + copyContent: formatValue(dict), + }); + } + } + for (let key in dict) { + let item: unknown = Array.isArray(dict) ? dict[+key] : dict[key]; + let type = toType(item); + let color = typeToColor(type); + let id = `${parentKey}__${key}`; + const value = formatValue(item); + if (Array.isArray(item)) { + // Add array subtree + rows.push({ + id, + root: item.length > 0, + level, + key: formatValue(key), + value: `[${item.length === 0 ? ']' : ''}`, + closedValue: '[...]', + sub: `${item.length} item${item.length === 1 ? '' : 's'}`, + color: typeToColor('array'), + copyContent: value, + }); + if (item.length > 0) { + rows.push(...flattenDict(item as unknown[], level + 1, id)); + rows.push({ + id, + level, + closing: true, + key: null, + value: ']', + sub: null, + color: typeToColor('array'), + }); + } + } else if (typeof item === 'object' && item !== null) { + // Add dict subtree + let nestedItemsLength = Object.keys(item).length; + rows.push({ + id, + root: nestedItemsLength > 0, + level, + key: formatValue(key), + value: `{${nestedItemsLength === 0 ? '}' : ''}`, + closedValue: '{...}', + sub: `${nestedItemsLength} item${nestedItemsLength === 1 ? '' : 's'}`, + color: typeToColor('object'), + copyContent: value, + }); + if (nestedItemsLength > 0) { + rows.push( + ...flattenDict(item as Record, level + 1, id), + ); + rows.push({ + id, + level, + closing: true, + key: null, + value: '}', + sub: null, + color: typeToColor('object'), + }); + } + } else { + // Add row for primitive values + rows.push({ + id, + level, + key: Array.isArray(dict) ? +key : formatValue(key), + value, + sub: type === '' ? null : type, + color, + copyContent: value, + }); + } + } + + // Add top level closing brackets + if (level === 0) { + if (Array.isArray(dict)) { + rows.push({ + id: parentKey, + level, + closing: true, + key: null, + value: ']', + sub: null, + color: typeToColor('array'), + }); + } else { + rows.push({ + id: parentKey, + level, + closing: true, + key: null, + value: '}', + sub: null, + color: typeToColor('object'), + }); + } + } + + return rows; +} + +DictVisualizer.displayName = 'DictVisualizer'; + +export default React.memo(DictVisualizer); diff --git a/src/src/components/kit/DictVisualizer/index.ts b/src/src/components/kit/DictVisualizer/index.ts new file mode 100644 index 00000000..7093df67 --- /dev/null +++ b/src/src/components/kit/DictVisualizer/index.ts @@ -0,0 +1,5 @@ +import DictVisualizer from './DictVisualizer'; + +export * from './DictVisualizer.d'; + +export default DictVisualizer; diff --git a/src/src/components/kit/Dropdown/Dropdown.d.ts b/src/src/components/kit/Dropdown/Dropdown.d.ts new file mode 100644 index 00000000..c0890e79 --- /dev/null +++ b/src/src/components/kit/Dropdown/Dropdown.d.ts @@ -0,0 +1,23 @@ +import { IIconProps } from 'components/kit/Icon'; + +export interface IDropdownProps { + placeholder?: string; + value?: string | null; + options: + | OptionsOrGroups<{ value: string; label: string }> + | { value: string; label: string }[]; + size?: 'small' | 'medium' | 'large'; + open?: boolean; + withPortal?: true; + className?: string; + selectClassName?: string; + label?: string; + maxMenuListHeight?: string; + isColored?: boolean; + isDisabled?: boolean; + isClearable?: boolean; + onMenuOpen: () => void; + onMenuClose: () => void; + onChange: (value: { value: string; label: string } | null) => void; + icon?: IIconProps; +} diff --git a/src/src/components/kit/Dropdown/Dropdown.scss b/src/src/components/kit/Dropdown/Dropdown.scss new file mode 100644 index 00000000..9e37f9d9 --- /dev/null +++ b/src/src/components/kit/Dropdown/Dropdown.scss @@ -0,0 +1,50 @@ +@use 'src/styles/abstracts' as *; + +.Dropdown { + position: relative; + &__label { + position: absolute; + z-index: 1; + transition: 0.3s all; + pointer-events: none; + &.swapped { + background: #ffffff; + transition: 0.3s all; + padding: 0 0.25rem; + top: -0.5125rem !important; + } + } + &__indicatorContainer { + padding: 0px 5px; + display: flex; + align-items: center; + height: 100%; + } +} + +.IndicatorsContainer { + padding-right: 0.9375rem; + height: 100%; + display: flex; + align-items: center; + &__clearIcon { + margin-right: 1.25rem; + } +} + +.DropdownCustomOption { + padding: 0.5rem 1rem 0.5rem 0.5rem; + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; + border-radius: $border-radius-sm; + &:hover { + background: #f2f5fa; + } + & > span { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} diff --git a/src/src/components/kit/Dropdown/Dropdown.tsx b/src/src/components/kit/Dropdown/Dropdown.tsx new file mode 100644 index 00000000..793b3e58 --- /dev/null +++ b/src/src/components/kit/Dropdown/Dropdown.tsx @@ -0,0 +1,275 @@ +import React, { useEffect, useState } from 'react'; +import classNames from 'classnames'; +import Select, { + ClearIndicatorProps, + components, + ControlProps, +} from 'react-select'; + +import { Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import DropdownCustomOption from './DropdownCustomOption'; +import { + baseSizes, + indicatorsContainerSizes, + labelTopPosition, +} from './config'; + +import { IDropdownProps } from '.'; + +import './Dropdown.scss'; + +/** + * @property {number} size - input size + * @property {{value: string; label: string}[]} options - options list + * @property {boolean} open - is dropdown open + * @property {string} placeholder - dropdown placeholder + * @property {{value: string; label: string}} value - dropdown value + * @property {string} className - dropdown className + * @property {string} selectClassName - select dropdown className, + * @property {boolean} withPortal - open dropdown menu in portal + * @property {function} onMenuOpen - callBack on menu opening + * @property {function} onMenuClose - callBack on menu closing + * @property {function} onChange - callBack on dropdown value change + * @property {boolean} isColored - color dropdown if it is used + * @property {string} label - swap label to top if dropdown has value and replace placeholder + * @property {IIconProps} icon - icon for dropdown input + * @property {React.HTMLAttributes} rest - rest properties that can be set + */ +function Dropdown({ + size = 'medium', + options, + open = false, + placeholder = 'Select...', + value = null, + className = '', + selectClassName = '', + withPortal, + onMenuOpen, + onMenuClose, + onChange, + isClearable = false, + isColored = false, + maxMenuListHeight = '12.5rem', + label, + icon, + isDisabled = false, + ...rest +}: IDropdownProps): React.FunctionComponentElement { + const [labelSwapped, setLabelSwapped] = useState(!!value); + const customStyles = { + iconStyles: () => + ({ + display: 'inline-flex', + alignItems: 'center', + justifyContent: 'center', + margin: '0 0.5rem', + color: icon?.color || '#1473E6', + width: '1.5rem', + height: '1.5rem', + fontSize: icon?.fontSize, + pointerEvents: 'none', + } as React.CSSProperties), + control: (base: any) => ({ + ...base, + height: baseSizes[size], + minHeight: baseSizes[size], + borderRadius: '0.375rem', + boxShadow: 'none', + borderColor: + isColored && value ? '#1473E6' : open ? '#90AFDA' : '#BDCEE8', + '&:hover': { + borderColor: + isColored && value ? '#1473E6' : open ? '#90AFDA' : '#BDCEE8', + }, + }), + indicatorSeparator: () => ({ + display: 'none', + }), + indicatorsContainer: (provided: any) => ({ + ...provided, + height: indicatorsContainerSizes[size], + padding: '0.375rem 0', + }), + placeholder: (holder: any) => ({ + ...holder, + fontSize: '0.875rem', + color: '#606986', + marginBottom: '0.0625rem', + }), + input: (provided: any) => ({ + ...provided, + margin: '0', + }), + valueContainer: (provided: any) => ({ + ...provided, + height: indicatorsContainerSizes[size], + padding: icon ? '0 0.375rem 0 0rem' : '0 0.375rem 0 1rem', + fontSize: '0.875rem', + color: isColored && value ? '#1473E6' : '#414B6D', + }), + menuPortal: (provided: any) => ({ + ...provided, + zIndex: 1000000, + position: 'fixed', + }), + singleValue: (provided: any) => ({ + ...provided, + marginLeft: 0, + color: isColored && value ? '#1473E6' : '#414B6D', + marginBottom: '0.0625rem', + }), + dropdownIndicator: () => ({ + marginRight: '0.625rem', + height: '100%', + display: 'flex', + alignItems: 'center', + }), + clearIndicator: () => ({ + padding: '0 0.625rem', + borderLeft: '1px solid #D1DDEF', + cursor: 'pointer', + height: '100%', + display: 'flex', + alignItems: 'center', + }), + menu: (provided: any) => ({ + ...provided, + borderRadius: '0.375rem', + padding: '0.5rem', + }), + menuList: (provided: any) => ({ + ...provided, + maxHeight: maxMenuListHeight, + }), + option: (provided: any) => ({ + ...provided, + height: baseSizes[size], + }), + }; + + function ClearIndicator(props: ClearIndicatorProps) { + const { + children = , + getStyles, + innerProps: { ref, ...restInnerProps }, + } = props; + return ( +
+
{children}
+
+ ); + } + + function DropdownIndicator(props: any) { + const { + children = ( + + ), + getStyles, + innerProps: { ref, ...restInnerProps }, + } = props; + return ( +
+
{children}
+
+ ); + } + + function Control({ children, ...props }: ControlProps) { + return ( + + {icon ? ( + + + + ) : null} + {children} + + ); + } + + function handleMenuOpen() { + onMenuOpen(); + !labelSwapped && setLabelSwapped(true); + } + + function handleMenuClose() { + onMenuClose(); + !value && setLabelSwapped(false); + } + + useEffect(() => { + if (value && !labelSwapped) { + setLabelSwapped(true); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [value]); + + return ( + +
+ {label && ( + + {label} + + )} + + +
+
+ + + +`; diff --git a/src/src/components/kit/Input/config.ts b/src/src/components/kit/Input/config.ts new file mode 100644 index 00000000..4241d9bd --- /dev/null +++ b/src/src/components/kit/Input/config.ts @@ -0,0 +1,43 @@ +const labelAppearances = { + default: { + cssClassName: 'default', + }, + swap: { + cssClassName: 'swap', + }, + 'top-labeled': { + cssClassName: 'topLabeled', + }, +}; + +const inputSizes = { + small: { + cssClassName: 'small', + }, + medium: { + cssClassName: 'medium', + }, + large: { + cssClassName: 'large', + }, +}; + +const inputTypeConversionFns: { + [key: string]: ({ + value, + isRequiredNumberValue, + isNumberValueFloat, + }: { + value: any; + isRequiredNumberValue?: boolean; + isNumberValueFloat?: boolean; + }) => string | number | undefined; +} = { + number: ({ value, isRequiredNumberValue, isNumberValueFloat }) => { + const result = isNumberValueFloat ? parseFloat(value) : parseInt(value); + return !isNaN(result) ? result : isRequiredNumberValue ? 0 : undefined; + }, + text: ({ value }) => `${value}`, +}; + +export { labelAppearances, inputSizes, inputTypeConversionFns }; diff --git a/src/src/components/kit/Input/index.tsx b/src/src/components/kit/Input/index.tsx new file mode 100644 index 00000000..b6fafe63 --- /dev/null +++ b/src/src/components/kit/Input/index.tsx @@ -0,0 +1,5 @@ +import Input from './Input'; + +export * from './Input.d'; + +export default Input; diff --git a/src/src/components/kit/JsonViewPopover/JsonViewPopover.tsx b/src/src/components/kit/JsonViewPopover/JsonViewPopover.tsx new file mode 100644 index 00000000..23370557 --- /dev/null +++ b/src/src/components/kit/JsonViewPopover/JsonViewPopover.tsx @@ -0,0 +1,34 @@ +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import DictVisualizer from 'components/kit/DictVisualizer'; + +import { IJsonViewPopoverProps } from './types.d'; + +import './styles.scss'; + +/** + * @property {object} json - json object + * @return React.FunctionComponentElement + */ + +function JsonViewPopover({ + json, + dictVisualizerSize, +}: IJsonViewPopoverProps): React.FunctionComponentElement { + return ( + +
+ +
+
+ ); +} + +JsonViewPopover.displayName = 'JsonViewPopover'; + +export default React.memo(JsonViewPopover); diff --git a/src/src/components/kit/JsonViewPopover/index.ts b/src/src/components/kit/JsonViewPopover/index.ts new file mode 100644 index 00000000..cf909412 --- /dev/null +++ b/src/src/components/kit/JsonViewPopover/index.ts @@ -0,0 +1,6 @@ +import JsonViewPopover from './JsonViewPopover'; + +export * from './types.d'; +export * from './JsonViewPopover'; + +export default JsonViewPopover; diff --git a/src/src/components/kit/JsonViewPopover/styles.scss b/src/src/components/kit/JsonViewPopover/styles.scss new file mode 100644 index 00000000..09e584b8 --- /dev/null +++ b/src/src/components/kit/JsonViewPopover/styles.scss @@ -0,0 +1,8 @@ +@use 'src/styles/abstracts' as *; + +.JsonViewPopover { + display: flex; + justify-content: center; + align-items: center; + padding: $space-unit; +} diff --git a/src/src/components/kit/JsonViewPopover/types.d.ts b/src/src/components/kit/JsonViewPopover/types.d.ts new file mode 100644 index 00000000..02cd7030 --- /dev/null +++ b/src/src/components/kit/JsonViewPopover/types.d.ts @@ -0,0 +1,7 @@ +export interface IJsonViewPopoverProps { + json: object; + dictVisualizerSize?: { + width: number; + height: number; + }; +} diff --git a/src/src/components/kit/ListItem/Index.ts b/src/src/components/kit/ListItem/Index.ts new file mode 100644 index 00000000..3320afcb --- /dev/null +++ b/src/src/components/kit/ListItem/Index.ts @@ -0,0 +1,5 @@ +import ListItem from './ListItem'; + +export * from './ListItem'; + +export default ListItem; diff --git a/src/src/components/kit/ListItem/ListItem.d.ts b/src/src/components/kit/ListItem/ListItem.d.ts new file mode 100644 index 00000000..6d8fa4a2 --- /dev/null +++ b/src/src/components/kit/ListItem/ListItem.d.ts @@ -0,0 +1,11 @@ +import React from 'react'; + +export interface IListItemProps + extends Partial> { + className?: string; + children?: React.ReactNode; + size?: IListITemSize; + onClick?: (event: React.MouseEvent) => void; +} + +export type IListITemSize = 'small' | 'medium' | 'large'; diff --git a/src/src/components/kit/ListItem/ListItem.tsx b/src/src/components/kit/ListItem/ListItem.tsx new file mode 100644 index 00000000..af40f8d6 --- /dev/null +++ b/src/src/components/kit/ListItem/ListItem.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import styled from 'styled-components'; + +import { IListItemProps, IListITemSize } from './ListItem.d'; + +const heights: { small: string; medium: string; large: string } = { + small: '24px', + medium: '28px', + large: '32px', +}; + +const Container = styled.div` + display: flex; + align-items: center; + height: ${({ size }) => heights[size as IListITemSize]}; + padding: 0 0.75rem; + border-radius: 0.25rem; + transition: all 0.18s ease-out; + cursor: pointer; + &:hover { + background-color: #f4f4f6; + color: #1473e6; + .Text { + color: #1473e6; + } + } + .Text { + max-width: 100%; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } +`; + +function ListItem({ + className = '', + size = 'medium', + children, + onClick, + ...rest +}: IListItemProps) { + return ( + null} + className={`ListItem ${className}`} + size={size} + {...rest} + > + {children} + + ); +} + +export default React.memo(ListItem); diff --git a/src/src/components/kit/Menu/Menu.scss b/src/src/components/kit/Menu/Menu.scss new file mode 100644 index 00000000..d91beb07 --- /dev/null +++ b/src/src/components/kit/Menu/Menu.scss @@ -0,0 +1,106 @@ +@use 'src/styles/abstracts' as *; + +$border_radius: toRem(6px); + +$title_top_padding: toRem(10px); +$title_left_padding: toRem(15px); +$padding_8: toRem(8px); + +.Aim_Menu_Wr { + display: flex; + flex-direction: column; + border: toRem(1px) solid $grayish; + box-sizing: border-box; + border-radius: $border_radius 0 0 $border_radius; + height: 100%; + .Title { + background-color: $primary-color-5; + padding: $title_top_padding $title_left_padding; + border-bottom: toRem(1px) solid $grayish; + border-top-left-radius: $border_radius + } + .Menu { + display: flex; + flex-direction: column; + padding: toRem(8px); + overflow-y: auto; + height: 100%; + .MenuItem { + display: flex; + flex-direction: column; + margin-bottom: toRem(2px); + border-radius: $border-radius; + &:focus-visible { + outline:unset; + } + // layers1 layer2 is created due to design inconsistencies + // @TODO improve this while working on creating tree view from this component + .MenuItemHead { + cursor: pointer; + border-radius: toRem(6px); + display: flex; + word-break: break-word; + + div { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: toRem(9px) toRem(14px); + } + &.layer1 { + &.active { + background-color: $primary-color-10; + &:before { + content: ''; + width: 4px; + border-radius: $border_radius 0 0 $border-radius; + background: $primary-color; + } + } + } + &.layer2 { + // additional styles here + } + &.open { + background-color: $primary-color-10; + + &:before { + content: ''; + width: 4px; + border-radius: $border_radius 0 0 0; // difference width active is top-left border radius + background: $primary-color; + } + } + &.no_child { + margin-right: toRem(8px); + } + &:hover { + background: $cuddle-30; + } + } + .MenuItemBody { + width: 100%; + background-color: $primary-color-5; + border-radius: 0 toRem(4px) toRem(4px) 0; + display: none; + &.open { + display: flex; + } + + > div { + padding: $padding_8 0 $padding_8 $padding_8; + width: 100%; + } + + // left blue layer + &:before { + content: ''; + width: toRem(4px); + border-bottom-left-radius: $border_radius; + background: $primary-color; + } + } + } + } +} diff --git a/src/src/components/kit/Menu/Menu.tsx b/src/src/components/kit/Menu/Menu.tsx new file mode 100644 index 00000000..c29d4c56 --- /dev/null +++ b/src/src/components/kit/Menu/Menu.tsx @@ -0,0 +1,69 @@ +import React from 'react'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import MenuItem from './MenuItem'; +import { IMenuProps, IMenuItem } from './types'; + +import './Menu.scss'; + +/** + * Menu component + * usage + * + */ +function Menu({ + data, + title, + onChangeActiveItem, + defaultActiveItemKey = '', +}: IMenuProps): React.FunctionComponentElement { + const [activeItemKey, setActiveItemKey] = + React.useState(defaultActiveItemKey); + + const onClickItem = React.useCallback( + (key: string, name: string) => { + setActiveItemKey(key); + if (onChangeActiveItem) { + onChangeActiveItem(key, name); + } + }, + [onChangeActiveItem, setActiveItemKey], + ); + + React.useEffect(() => { + if (defaultActiveItemKey !== activeItemKey) { + setActiveItemKey(defaultActiveItemKey); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [defaultActiveItemKey]); + + return ( + +
+ {title && ( +
+ + {title} + +
+ )} +
+ {data.map((item: IMenuItem) => ( + + ))} +
+
+
+ ); +} + +Menu.displayName = 'Menu'; + +export default React.memo(Menu); diff --git a/src/src/components/kit/Menu/MenuItem.tsx b/src/src/components/kit/Menu/MenuItem.tsx new file mode 100644 index 00000000..571c62f3 --- /dev/null +++ b/src/src/components/kit/Menu/MenuItem.tsx @@ -0,0 +1,139 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IMenuItemProps, IMenuItem } from './types'; + +/** + * Generate key with id and parentId + * @param parentId + * @param id + */ +function generateKeyWithParent(parentId: string | number, id: string | number) { + return (parentId ? parentId + '.' : '') + id; +} + +/** + * MenuItem + * active key computed based on tree model (test1.test2.test3) + * @param name + * @param id + * @param children + * @param onClickOpen + * @param parentId + * @param activeItemKey + */ +function MenuItem({ + name, + id, + children, + onClickOpen, + parentId = '', + activeItemKey, +}: IMenuItemProps) { + const { isActive, isOpen } = React.useMemo(() => { + /* + * the fastest algorithm to have tree view is to identify the item with it's parent's ids + * if we have this type of tree + * layer1 -> layer2 -> layer3 + * if the layer3 is active, the active key will be layer1.layer2.layer3 + * if the layer2 is active, the active key will be layer1.layer2 + */ + const key = generateKeyWithParent(parentId, id); + const active = key === activeItemKey || id === activeItemKey; + const open = activeItemKey.toString().includes(`${key}.`); + + return { + isActive: active, + isOpen: open, + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [activeItemKey, id, parentId, name]); + + const onClickItem = React.useCallback( + (event) => { + event.stopPropagation(); + event.stopPropagation(); + let key = generateKeyWithParent(parentId, id); + let callbackName = name; + // if the item has children, activate first child + if (children?.length) { + key += `.${children[0].id}`; + callbackName = children[0].name; + } + + // ensure that clicked item is not active yet + if (key !== activeItemKey) { + onClickOpen(key, callbackName); + } + }, + [onClickOpen, parentId, id, name, children, activeItemKey], + ); + + return ( + +
+
+
+ + {name} + + {children?.length && ( + + )} +
+
+ {children?.length && ( +
+
+ {children?.map((item: IMenuItem) => ( + + ))} +
+
+ )} +
+
+ ); +} + +export default React.memo(MenuItem); diff --git a/src/src/components/kit/Menu/index.ts b/src/src/components/kit/Menu/index.ts new file mode 100644 index 00000000..be5ef3de --- /dev/null +++ b/src/src/components/kit/Menu/index.ts @@ -0,0 +1,8 @@ +import Menu from './Menu'; +import Item from './MenuItem'; + +export * from './Menu'; +export * from './types.d'; + +export const MenuItem = Item; +export default Menu; diff --git a/src/src/components/kit/Menu/types.d.ts b/src/src/components/kit/Menu/types.d.ts new file mode 100644 index 00000000..a56fed8f --- /dev/null +++ b/src/src/components/kit/Menu/types.d.ts @@ -0,0 +1,20 @@ +export type IMenuItem = { + id: string | number; + children?: IMenuItem[]; + name: string; +}; + +export interface IMenuItemProps extends IMenuItem { + onClickOpen: (key: string, name: string) => void; + activeItemKey: string | number; + parentId?: string | number; +} + +export type MenuData = IMenuItem[]; + +export type IMenuProps = { + onChangeActiveItem?: (key: string, name: string) => void; + defaultActiveItemKey?: string; + data: MenuData; + title?: string; +}; diff --git a/src/src/components/kit/Modal/Modal.d.ts b/src/src/components/kit/Modal/Modal.d.ts new file mode 100644 index 00000000..c0a86eea --- /dev/null +++ b/src/src/components/kit/Modal/Modal.d.ts @@ -0,0 +1,28 @@ +import React from 'react'; + +import { DialogProps } from '@material-ui/core'; + +import { IconName } from 'components/kit/Icon/Icon.d'; + +import { Override } from 'types/utils/common'; + +export type IModalProps = Override< + DialogProps, + { + open: boolean; + onClose: () => void; + onOk: () => void; + title?: string | React.ReactNode; + titleIconName?: IconName; + titleIconColor?: string; + cancelButtonText?: string | React.ReactNode; + okButtonText?: string | React.ReactNode; + modalType?: 'warning' | 'error' | 'info' | 'success'; + okButtonColor?: string; + withoutTitleIcon?: boolean; + children: React.ReactNode; + maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false; + isOkButtonDisabled?: boolean; + className?: string; + } +>; diff --git a/src/src/components/kit/Modal/Modal.scss b/src/src/components/kit/Modal/Modal.scss new file mode 100644 index 00000000..bd3df873 --- /dev/null +++ b/src/src/components/kit/Modal/Modal.scss @@ -0,0 +1,96 @@ +@use 'src/styles/abstracts' as *; + +@mixin getTypeColors($color, $cover-color) { + .Modal__header__titleIcon { + background-color: $cover-color; + + .Icon__container { + color: $color; + } + } + + .Modal__footer__okButton { + background-color: $color; + } +} + +.Modal { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + padding: 1rem 0.5rem 0 0.5rem; + position: relative; + max-height: calc(100vh - 4rem); + &__header { + padding: 0.5rem 1rem; + display: flex; + align-items: center; + width: 100%; + &__titleIcon { + width: 2rem; + height: 2rem; + display: flex; + justify-content: center; + align-items: center; + border-radius: $border-radius-circle; + margin-right: 1rem; + &.warning { + color: $warning-color; + background: $warning-color-10; + } + &.error { + color: $error-color; + background: $error-color-10; + } + &.success { + color: $success-color; + background: $success-color-10; + } + &.info { + color: $primary-color; + background: $primary-color-10; + } + } + } + &__content { + padding: 0 1rem 1.5rem 1rem; + overflow: auto; + } + &__footer { + border-top: $border-main; + padding: 1rem; + display: flex; + justify-content: flex-end; + width: 100%; + &__okButton { + margin-left: 0.5rem; + } + &__okCancel { + color: $pico; + } + } + + &.warning { + @include getTypeColors($warning-color, $warning-color-10); + } + + &.error { + @include getTypeColors($error-color, $error-color-10); + } + + &.info { + @include getTypeColors($primary-color, $primary-color-10); + } + + &.success { + @include getTypeColors($success-color, $success-color-10); + } + + &__closeButton { + position: absolute; + top: $space-xxs; + right: $space-xxs; + color: $pico-80; + } +} diff --git a/src/src/components/kit/Modal/Modal.tsx b/src/src/components/kit/Modal/Modal.tsx new file mode 100644 index 00000000..ee339b44 --- /dev/null +++ b/src/src/components/kit/Modal/Modal.tsx @@ -0,0 +1,107 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Dialog } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; + +import { IModalProps } from './Modal.d'; + +import './Modal.scss'; + +const ModalType: any = { + warning: { + iconName: 'warning-contained', + }, + error: { iconName: 'close-circle' }, + info: { iconName: 'circle-info' }, + success: { iconName: 'success-icon' }, +}; + +function Modal({ + open, + onClose, + onOk, + title, + titleIconName, + cancelButtonText = 'Cancel', + modalType = 'info', + okButtonText = 'Ok', + okButtonColor, + withoutTitleIcon, + children, + maxWidth = 'sm', + isOkButtonDisabled = false, + className = '', + ...rest +}: IModalProps): React.FunctionComponentElement { + return ( + +
+
+ {!withoutTitleIcon && ( +
+ +
+ )} + {title && ( +
+ {typeof title === 'string' ? ( + + {title} + + ) : ( + title + )} +
+ )} +
+
{children}
+
+ + +
+ +
+
+ ); +} + +Modal.displayName = 'Modal'; + +export default React.memo(Modal); diff --git a/src/src/components/kit/Modal/index.tsx b/src/src/components/kit/Modal/index.tsx new file mode 100644 index 00000000..c907a47b --- /dev/null +++ b/src/src/components/kit/Modal/index.tsx @@ -0,0 +1,5 @@ +import Modal from './Modal'; + +export * from './Modal.d'; + +export default Modal; diff --git a/src/src/components/kit/SelectDropdown/SelectDropdown.d.ts b/src/src/components/kit/SelectDropdown/SelectDropdown.d.ts new file mode 100644 index 00000000..41b0d2d2 --- /dev/null +++ b/src/src/components/kit/SelectDropdown/SelectDropdown.d.ts @@ -0,0 +1,18 @@ +import AutocompleteProps from '@material-ui/lab/Autocomplete/Autocomplete'; +import { UseAutocompleteProps } from '@material-ui/lab'; + +export interface ISelectDropdownOption { + value: string; + label: string; + group?: string; +} + +export type ISelectDropdownProps = Omit< + AutocompleteProps, + 'ListboxProps' +> & + UseAutocompleteProps & { + selectOptions: T[]; + handleSelect: (option: T) => void; + selected?: T['value']; + }; diff --git a/src/src/components/kit/SelectDropdown/SelectDropdown.scss b/src/src/components/kit/SelectDropdown/SelectDropdown.scss new file mode 100644 index 00000000..32999a9e --- /dev/null +++ b/src/src/components/kit/SelectDropdown/SelectDropdown.scss @@ -0,0 +1,31 @@ +@use 'src/styles/abstracts' as *; + +.SelectDropdown { + position: relative; + &__popper { + .MuiAutocomplete-groupLabel { + color: $text-color-50; + font-size: $text-sm; + font-weight: 500; + border-top: $border-separator; + } + + .MuiAutocomplete-option[aria-selected="true"] { + .SelectDropdown__option__label { + color: $primary-color; + } + } + } + &__groupItem { + padding: $space-xxs $space-sm; + width: 100%; + user-select: none; + &__divider { + margin: $space-xs 0; + } + } + &__Input { + display: flex; + padding: $space-sm $space-unit; + } +} \ No newline at end of file diff --git a/src/src/components/kit/SelectDropdown/SelectDropdown.tsx b/src/src/components/kit/SelectDropdown/SelectDropdown.tsx new file mode 100644 index 00000000..c6033a24 --- /dev/null +++ b/src/src/components/kit/SelectDropdown/SelectDropdown.tsx @@ -0,0 +1,141 @@ +import React from 'react'; + +import { TextField } from '@material-ui/core'; +import { Autocomplete, AutocompleteRenderInputParams } from '@material-ui/lab'; + +import { Text } from 'components/kit'; + +import { + ISelectDropdownOption as ISelectOption, + ISelectDropdownProps, +} from './SelectDropdown.d'; + +import './SelectDropdown.scss'; + +/** + * @property {ISelectDropdownOption[]} selectOptions - options for select dropdown + * @property {Function} handleSelect - handle selected option + * @property {string | undefined} selected - controlled select dropdown (optional) + * @property {AutocompleteProps} rest - rest props for Autocomplete component + * @property {React.HTMLElement} children - children element + */ + +function SelectDropdown({ + selectOptions = [], + handleSelect, + selected, + ...rest +}: ISelectDropdownProps): React.FunctionComponentElement { + const [selectedOption, setSelectedOption] = React.useState(); + const [searchValue, setSearchValue] = React.useState(); + + // ****** memoized functions + const renderInput = React.useCallback( + (params: AutocompleteRenderInputParams): React.ReactNode => { + return ( + ) => { + setSearchValue(e.target.value); + }, + onBlur: (event) => { + const { onBlur } = params.inputProps as { onBlur: Function }; + onBlur?.(event); + setSearchValue(selectedOption?.label); + }, + }} + className='TextField__OutLined__Small' + variant='outlined' + placeholder='Select Alignment' + /> + ); + }, + [selectedOption, searchValue], + ); + + const renderOption = React.useCallback( + (option: ISelectOption): React.ReactNode => { + return ( +
+ + {option.label} + +
+ ); + }, + [], + ); + + const handleOptionChange = React.useCallback( + (e: React.ChangeEvent<{}>, option: ISelectOption) => { + handleSelect(option); + setSelectedOption(option); + setSearchValue(undefined); + }, + [handleSelect, setSelectedOption, setSearchValue], + ); + + // ****** hooks + React.useEffect(() => { + if (selected) { + const controlledSelectedOption = selectOptions.find( + (option: ISelectOption) => option.value === selected, + ); + if (controlledSelectedOption) { + setSelectedOption(controlledSelectedOption); + } + } + }, [selected, selectOptions]); + + // ****** memoized data + const optionsToRender = React.useMemo(() => { + if ( + (searchValue || searchValue?.trim() !== '') && + searchValue !== selectedOption?.label + ) { + const searchKey = searchValue?.toLowerCase() || ''; + return selectOptions.filter((item: ISelectOption) => { + return item.label.toLowerCase().indexOf(searchKey) !== -1; + }); + } + return selectOptions; + }, [selectOptions, searchValue, selectedOption]); + + return ( +
+ option.group || ''} + getOptionLabel={(option: ISelectOption) => option.label} + getOptionSelected={(option: ISelectOption, value) => + option.value === value.value + } + renderInput={renderInput} + renderOption={renderOption} + classes={{ + popper: 'SelectDropdown__popper', + }} + {...rest} + /> +
+ ); +} + +SelectDropdown.displayName = 'SelectDropdown'; + +export default React.memo>(SelectDropdown); diff --git a/src/src/components/kit/SelectDropdown/index.tsx b/src/src/components/kit/SelectDropdown/index.tsx new file mode 100644 index 00000000..22761588 --- /dev/null +++ b/src/src/components/kit/SelectDropdown/index.tsx @@ -0,0 +1,5 @@ +import SelectDropdown from './SelectDropdown'; + +export * from './SelectDropdown.d'; + +export default SelectDropdown; diff --git a/src/src/components/kit/Slider/Slider.d.ts b/src/src/components/kit/Slider/Slider.d.ts new file mode 100644 index 00000000..1189c0bf --- /dev/null +++ b/src/src/components/kit/Slider/Slider.d.ts @@ -0,0 +1,12 @@ +import React from 'react'; + +import { SliderProps } from '@material-ui/core'; + +export interface ISliderProps extends SliderProps { + containerClassName?: string; + style?: React.CSSProperties; + onChange?: (event: React.ChangeEvent<{}>, value: number | number[]) => void; + prevIconNode?: React.ReactNode; + nextIconNode?: React.ReactNode; + label?: React.ReactNode; +} diff --git a/src/src/components/kit/Slider/Slider.scss b/src/src/components/kit/Slider/Slider.scss new file mode 100644 index 00000000..e7b4d5be --- /dev/null +++ b/src/src/components/kit/Slider/Slider.scss @@ -0,0 +1,84 @@ +@use 'src/styles/abstracts' as *; + +.Slider { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + .MuiSlider-root { + padding: 0; + height: 0.25rem; + .MuiSlider-rail { + height: 0.25rem; + border-radius: $border-radius-sm; + opacity: 1; + background: $cuddle-50; + } + .MuiSlider-track { + height: 0.25rem; + border-radius: $border-radius-sm; + background: $primary-color; + } + .MuiSlider-thumb { + background: $white; + border: 0.09375rem solid $primary-color; + margin-top: -0.25rem; + margin-left: -$space-xxs; + .MuiSlider-valueLabel { + left: calc(-50% - 0.625rem); + top: -1.0625rem; + } + .MuiSlider-valueLabel > span { + width: 2.3125rem; + height: 1.1875rem; + border: 0.0625rem solid $primary-color; + background: $white; + border-radius: 0.4375rem; + transform: unset; + span { + font-size: 0.625rem; + font-weight: $font-600; + color: $primary-color; + transform: unset; + text-overflow: ellipsis; + max-width: 100%; + overflow: hidden; + padding: $space-xxxxs $space-xxxs; + } + } + &.Mui-focusVisible { + box-shadow: 0 0 0 0.125rem rgba(20, 115, 230, 0.2); + } + &:hover { + box-shadow: 0 0 0 0.125rem rgba(20, 115, 230, 0.2); + } + &.MuiSlider-active { + box-shadow: 0 0 0 0.125rem rgba(20, 115, 230, 0.2); + } + &::after { + top: 0px; + bottom: 0px; + left: 0px; + right: 0px; + } + } + } + .Mui-disabled { + .MuiSlider-track { + background: #a7b7cd; + } + .MuiSlider-thumb { + margin-top: toRem(-2px); + margin-left: toRem(-4px); + } + } + .Mui-disabled { + .MuiSlider-track { + background: #a7b7cd; + } + .MuiSlider-thumb { + margin-top: toRem(-2px); + margin-left: toRem(-4px); + } + } +} diff --git a/src/src/components/kit/Slider/Slider.tsx b/src/src/components/kit/Slider/Slider.tsx new file mode 100644 index 00000000..1aefd716 --- /dev/null +++ b/src/src/components/kit/Slider/Slider.tsx @@ -0,0 +1,33 @@ +import React from 'react'; + +import { Slider as MaterialSlider } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ISliderProps } from '.'; + +import './Slider.scss'; + +function Slider({ + containerClassName = '', + style = {}, + prevIconNode = null, + nextIconNode = null, + label = null, + ...rest +}: ISliderProps): React.FunctionComponentElement { + return ( + +
+ {label} + {prevIconNode && prevIconNode} + + {nextIconNode && nextIconNode} +
+
+ ); +} + +Slider.displayName = 'Slider'; + +export default React.memo(Slider); diff --git a/src/src/components/kit/Slider/index.ts b/src/src/components/kit/Slider/index.ts new file mode 100644 index 00000000..e75312cc --- /dev/null +++ b/src/src/components/kit/Slider/index.ts @@ -0,0 +1,5 @@ +import Slider from './Slider'; + +export * from './Slider.d'; + +export default Slider; diff --git a/src/src/components/kit/Spinner/Spinner.d.ts b/src/src/components/kit/Spinner/Spinner.d.ts new file mode 100644 index 00000000..23964d6e --- /dev/null +++ b/src/src/components/kit/Spinner/Spinner.d.ts @@ -0,0 +1,7 @@ +export interface ISpinnerProps { + className?: string; + style?: React.StyleHTMLAttributes; + size?: number | string; + thickness?: number; + color?: string; +} diff --git a/src/src/components/kit/Spinner/Spinner.scss b/src/src/components/kit/Spinner/Spinner.scss new file mode 100644 index 00000000..3a4d3053 --- /dev/null +++ b/src/src/components/kit/Spinner/Spinner.scss @@ -0,0 +1,30 @@ +@use 'src/styles/abstracts' as *; + +.Spinner { + display: flex; + justify-content: center; + align-items: center; +} + +.Spinner__loader { + width: 100%; + height: 100%; + border-style: solid; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { + transform: rotate(0); + } + 50% { + transform: rotate(120deg); + } + 75% { + transform: rotate(270deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/src/src/components/kit/Spinner/Spinner.tsx b/src/src/components/kit/Spinner/Spinner.tsx new file mode 100644 index 00000000..fce46ae1 --- /dev/null +++ b/src/src/components/kit/Spinner/Spinner.tsx @@ -0,0 +1,42 @@ +import React from 'react'; + +import { ISpinnerProps } from './Spinner.d'; + +import './Spinner.scss'; + +/** + * @property {number | string} size - * The size of the circle. + * If using a number, the pixel unit is assumed. + * If using a string, you need to provide the CSS unit, e.g '3rem'. + * @property {number} thickness - The thickness of the circle. + * @property {string} color - The color of the circle. + * @property {string} className - component className + */ + +function Spinner({ + size = 40, + thickness = 3, + color = '#1473e6', + className = '', +}: ISpinnerProps): React.FunctionComponentElement { + return ( +
+
+
+ ); +} + +Spinner.displayName = 'Spinner'; + +export default React.memo(Spinner); diff --git a/src/src/components/kit/Spinner/index.tsx b/src/src/components/kit/Spinner/index.tsx new file mode 100644 index 00000000..baa7cb99 --- /dev/null +++ b/src/src/components/kit/Spinner/index.tsx @@ -0,0 +1,5 @@ +import Spinner from './Spinner'; + +export * from './Spinner.d'; + +export default Spinner; diff --git a/src/src/components/kit/Switcher/Switcher.d.ts b/src/src/components/kit/Switcher/Switcher.d.ts new file mode 100644 index 00000000..78be393f --- /dev/null +++ b/src/src/components/kit/Switcher/Switcher.d.ts @@ -0,0 +1,18 @@ +import React, { ReactElement } from 'react'; + +export interface ISwitcherProps { + leftLabel?: SwitcherLabel; + rightLabel?: SwitcherLabel; + checked: boolean | undefined; + color?: 'primary' | 'secondary'; + size?: 'small' | 'medium' | 'large'; + variant?: 'contained' | 'outlined'; + name?: string; + onChange: (e: React.ChangeEvent, checked: boolean) => void; +} + +export type SwitcherLabel = + | string + | number + | React.FunctionComponent + | ReactElement; diff --git a/src/src/components/kit/Switcher/Switcher.scss b/src/src/components/kit/Switcher/Switcher.scss new file mode 100644 index 00000000..bca11b15 --- /dev/null +++ b/src/src/components/kit/Switcher/Switcher.scss @@ -0,0 +1,189 @@ +@use 'src/styles/abstracts' as *; + +.Switcher { + display: inline-block; + cursor: pointer; + border-radius: 0.625rem; + color: #fff; + position: relative; + user-select: none; + border: none; + + &__circle { + border-radius: 0.625rem; + background-color: #fff; + transition: all 0.1s linear; + position: absolute; + left: 2px; + top: $space-xxxxs; + } + + &__leftLabel, + &__rightLabel { + transition: all 0.18s ease-out; + position: absolute; + top: 4px; + line-height: 8px; + } + + &__leftLabel { + left: 4px; + transform: scale(0); + } + + &__rightLabel { + transform: scale(1); + right: 4px; + } + + &__checked { + .Switcher__leftLabel { + transform: scale(1); + } + + .Switcher__rightLabel { + transform: scale(0); + } + } + + &__primary { + background-color: $pico-50; + + &.Switcher__checked { + background-color: $primary-color; + } + } + + &__secondary { + background-color: $pico-50; + + &.Switcher__checked { + background-color: $pico; + } + } + + &__small { + height: 0.8125rem; + width: 1.5rem; + font-size: 0.5rem; + .Switcher__circle { + width: 0.5625rem; + border-radius: 0.5rem; + height: 0.5625rem; + line-height: 0.5625rem; + top: 2px; + &__checked { + left: calc(100% - 11px); + } + } + &:hover { + .Switcher__circle { + width: 0.675rem; + &__checked { + left: calc(100% - 13px); + } + } + } + .Switcher__leftLabel, + .Switcher__rightLabel { + top: 3px; + font-size: 7px; + line-height: 7px; + display: flex; + align-items: center; + justify-content: center; + } + } + + &__medium { + height: 1rem; + width: 2rem; + line-height: 8px; + + .Switcher__circle { + font-size: 0.75rem; + width: 0.75rem; + height: 0.75rem; + &__checked { + left: calc(100% - 14px); + } + } + &:hover { + .Switcher__circle { + width: 0.9375rem; + &__checked { + left: calc(100% - 17px); + } + } + } + } + + &__large { + height: 1.25rem; + width: 2.5rem; + font-size: 10px; + line-height: 10px; + + .Switcher__circle { + width: 1rem; + height: 1rem; + &__checked { + left: calc(100% - 18px); + } + } + &:hover { + .Switcher__circle { + width: 1.25rem; + &__checked { + left: calc(100% - 22px); + } + } + } + + .Switcher__leftLabel, + .Switcher__rightLabel { + font-size: 10px; + line-height: 8px; + display: flex; + align-items: center; + justify-content: center; + top: 5px; + } + } + + &__outlined { + border: 0.0625rem solid $pico-50; + background-color: #fff; + color: $pico-50; + + &.Switcher__primary { + &.Switcher__small { + .Switcher__rightLabel { + top: 2px; + right: 2px; + } + + .Switcher__leftLabel { + top: 2px; + left: 2px; + } + } + + .Switcher__circle { + color: $pico-50; + background-color: $pico-50; + top: 1px; + &__checked { + color: $primary-color; + background-color: $primary-color; + } + } + + &.Switcher__checked { + border-color: $primary-color; + background-color: #fff; + color: $primary-color; + } + } + } +} diff --git a/src/src/components/kit/Switcher/Switcher.test.tsx b/src/src/components/kit/Switcher/Switcher.test.tsx new file mode 100644 index 00000000..aa695ea9 --- /dev/null +++ b/src/src/components/kit/Switcher/Switcher.test.tsx @@ -0,0 +1,52 @@ +import { render, fireEvent } from '@testing-library/react'; + +import Switcher from './Switcher'; + +const mockClick = jest.fn(); + +describe(' -', () => { + test('Renders Correctly', () => { + const { asFragment } = render( + , + ); + + expect(asFragment()).toMatchSnapshot(); + }); + + test('Renders width labels correctly', () => { + const { getByText } = render( + , + ); + + expect(getByText('right label', { exact: true })); + expect(getByText('left label', { exact: true })); + }); + + test('onchange event works properly', () => { + const { getByTestId } = render(); + + const switcher = getByTestId('switcher'); + + fireEvent.click(switcher); + expect(mockClick).toHaveBeenCalledTimes(1); + expect(switcher.querySelector('i')).not.toHaveClass( + 'Switcher__circle__checked', + ); + + fireEvent.click(switcher); + expect(mockClick).toHaveBeenCalledTimes(2); + expect(switcher.querySelector('i')).toHaveClass( + 'Switcher__circle__checked', + ); + }); +}); diff --git a/src/src/components/kit/Switcher/Switcher.tsx b/src/src/components/kit/Switcher/Switcher.tsx new file mode 100644 index 00000000..4820385a --- /dev/null +++ b/src/src/components/kit/Switcher/Switcher.tsx @@ -0,0 +1,58 @@ +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ISwitcherProps } from './Switcher.d'; + +import './Switcher.scss'; + +function Switcher({ + onChange, + checked, + color = 'primary', + leftLabel, + rightLabel, + size = 'medium', + variant = 'contained', + name = 'switcher', +}: ISwitcherProps) { + const [checkedValue, setCheckedValue] = React.useState( + checked, + ); + + function handleClick(e: React.ChangeEvent) { + setCheckedValue(!checkedValue); + onChange(e, !checkedValue); + } + + React.useEffect(() => { + setCheckedValue((prevState) => { + return checked !== prevState ? checked : prevState; + }); + }, [checked]); + + return ( + + + + ); +} + +export default React.memo(Switcher); diff --git a/src/src/components/kit/Switcher/__snapshots__/Switcher.test.tsx.snap b/src/src/components/kit/Switcher/__snapshots__/Switcher.test.tsx.snap new file mode 100644 index 00000000..e2ec6585 --- /dev/null +++ b/src/src/components/kit/Switcher/__snapshots__/Switcher.test.tsx.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` - Renders Correctly 1`] = ` + + + +`; diff --git a/src/src/components/kit/Switcher/index.ts b/src/src/components/kit/Switcher/index.ts new file mode 100644 index 00000000..d00e51b3 --- /dev/null +++ b/src/src/components/kit/Switcher/index.ts @@ -0,0 +1,4 @@ +import Switcher from './Switcher'; + +export * from './Switcher.d'; +export default Switcher; diff --git a/src/src/components/kit/Test/Test.test.tsx b/src/src/components/kit/Test/Test.test.tsx new file mode 100644 index 00000000..79608848 --- /dev/null +++ b/src/src/components/kit/Test/Test.test.tsx @@ -0,0 +1,27 @@ +import { render } from '@testing-library/react'; + +import Test from './Test'; + +const Title1 = 'Test Title 1'; +const Title2 = 'Test Title 2'; + +describe(' - ', () => { + test('Renders without crashing', () => { + const { asFragment } = render(); + + expect(asFragment()).toMatchSnapshot(); + }); + + test('Renders right content', () => { + const { getByText } = render(); + + getByText(Title2); + }); + + test('Prop change works properly', () => { + const { getByText, rerender } = render(); + getByText(Title2); + rerender(); + getByText(Title1); + }); +}); diff --git a/src/src/components/kit/Test/Test.tsx b/src/src/components/kit/Test/Test.tsx new file mode 100644 index 00000000..d3941419 --- /dev/null +++ b/src/src/components/kit/Test/Test.tsx @@ -0,0 +1,24 @@ +import React from 'react'; + +import Text from 'components/kit/Text'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ITestProps } from './types.d'; + +import './styles.scss'; + +function Test({ + title, +}: ITestProps): React.FunctionComponentElement { + return ( + +
+ {title} +
+
+ ); +} + +Test.displayName = 'Test'; + +export default React.memo(Test); diff --git a/src/src/components/kit/Test/__snapshots__/Test.test.tsx.snap b/src/src/components/kit/Test/__snapshots__/Test.test.tsx.snap new file mode 100644 index 00000000..16122469 --- /dev/null +++ b/src/src/components/kit/Test/__snapshots__/Test.test.tsx.snap @@ -0,0 +1,15 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` - Renders without crashing 1`] = ` + +
+ + Test Title 1 + +
+
+`; diff --git a/src/src/components/kit/Test/index.ts b/src/src/components/kit/Test/index.ts new file mode 100644 index 00000000..9df95791 --- /dev/null +++ b/src/src/components/kit/Test/index.ts @@ -0,0 +1,6 @@ +import Test from './Test'; + +export * from './types.d'; +export * from './Test'; + +export default Test; diff --git a/src/src/components/kit/Test/styles.scss b/src/src/components/kit/Test/styles.scss new file mode 100644 index 00000000..ea63d417 --- /dev/null +++ b/src/src/components/kit/Test/styles.scss @@ -0,0 +1,8 @@ +@use 'src/styles/abstracts' as *; + +.Test { + display: flex; + justify-content: center; + align-items: center; +} + \ No newline at end of file diff --git a/src/src/components/kit/Test/types.d.ts b/src/src/components/kit/Test/types.d.ts new file mode 100644 index 00000000..43cffb8c --- /dev/null +++ b/src/src/components/kit/Test/types.d.ts @@ -0,0 +1,3 @@ +export interface ITestProps { + title: string; +} diff --git a/src/src/components/kit/Text/Text.d.ts b/src/src/components/kit/Text/Text.d.ts new file mode 100644 index 00000000..1ec566c9 --- /dev/null +++ b/src/src/components/kit/Text/Text.d.ts @@ -0,0 +1,41 @@ +import React from 'react'; + +export interface ITextProps + extends Partial< + React.HTMLAttributes< + HTMLSpanElement | HTMLHeadingElement | HTMLParagraphElement | HTMLElement + > + > { + component?: componentType; + weight?: componentWeightType; + size?: componentSizeType; + color?: componentColorType; + className?: string; + children?: React.ReactNode; + tint?: componentTintType; + ref?: React.MutableRefObject; +} + +type componentType = + | 'h1' + | 'h2' + | 'h3' + | 'h4' + | 'h5' + | 'h6' + | 'span' + | 'p' + | 'pre' + | 'strong' + | 'small'; +type componentColorType = + | 'primary' + | 'secondary' + | 'success' + | 'error' + | 'warning' + | 'info' + | 'inherit'; +type componentSizeType = 8 | 10 | 11 | 12 | 14 | 16 | 18 | 24 | 36; +type componentWeightType = 300 | 400 | 500 | 600 | 700; +type componentTintType = 5 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100; diff --git a/src/src/components/kit/Text/Text.scss b/src/src/components/kit/Text/Text.scss new file mode 100644 index 00000000..f7ddf60d --- /dev/null +++ b/src/src/components/kit/Text/Text.scss @@ -0,0 +1,193 @@ +@use 'src/styles/abstracts' as *; + +.Text { + &__size { + &_36 { + font-size: $text-xxxl; + } + + &_24 { + font-size: $text-xxl; + } + + &_18 { + font-size: $text-xl; + } + + &_16 { + font-size: $text-lg; + } + + &_14 { + font-size: $text-md; + } + &_12 { + font-size: $text-sm; + } + &_11 { + font-size: $text-xs; + } + &_10 { + font-size: $text-xxs; + } + &_8 { + font-size: $text-xxxs; + } + } + + &__weight { + &_300 { + font-weight: $font-300; + } + &_400 { + font-weight: $font-400; + } + &_500 { + font-weight: $font-500; + } + &_600 { + font-weight: $font-600; + } + &_700 { + font-weight: $font-700; + } + &_800 { + font-weight: $font-700; + } + &_900 { + font-weight: $font-700; + } + } + + &__color { + &_primary { + color: $text-color; + &_100 { + color: $pico; + } + &_90 { + color: $pico-90; + } + &_80 { + color: $pico-80; + } + &_70 { + color: $pico-70; + } + &_60 { + color: $pico-60; + } + &_50 { + color: $pico-50; + } + &_40 { + color: $pico-40; + } + &_30 { + color: $pico-30; + } + &_20 { + color: $pico-20; + } + &_10 { + color: $pico-10; + } + &_5 { + color: $pico-5; + } + } + &_secondary { + color: #fff; + &_100 { + color: $pico; + } + &_80 { + color: $pico-80; + } + &_50 { + color: $pico-50; + } + &_10 { + color: $pico-10; + } + } + &_error { + color: $error-color; + &_100 { + color: $error-color; + } + &_80 { + color: $error-color-80; + } + &_50 { + color: $error-color-50; + } + &_10 { + color: $error-color-10; + } + &_5 { + color: $error-color-5; + } + } + &_warning { + color: $warning-color; + &_100 { + color: $warning-color; + } + &_80 { + color: $warning-color-80; + } + &_50 { + color: $warning-color-50; + } + &_10 { + color: $warning-color-10; + } + &_5 { + color: $warning-color-5; + } + } + &_info { + color: $primary-color; + &_100 { + color: $primary-color; + } + &_80 { + color: $primary-color-80; + } + &_50 { + color: $primary-color-50; + } + &_10 { + color: $primary-color-10; + } + &_5 { + color: $primary-color-5; + } + } + &_success { + color: $success-color; + &_100 { + color: $success-color; + } + &_80 { + color: $success-color-80; + } + &_50 { + color: $success-color-50; + } + &_25 { + color: $success-color-25; + } + &_10 { + color: $success-color-10; + } + &_5 { + color: $success-color-5; + } + } + &_inherit { + color: inherit; + } + } +} diff --git a/src/src/components/kit/Text/Text.tsx b/src/src/components/kit/Text/Text.tsx new file mode 100644 index 00000000..054b621e --- /dev/null +++ b/src/src/components/kit/Text/Text.tsx @@ -0,0 +1,81 @@ +import React from 'react'; +import classNames from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ITextProps } from './Text.d'; + +import './Text.scss'; + +/** + * @property {number} size - text size + * @property {string} color - text color + * @property {number} weight - text weight + * @property {string} className - component className + * @property {string} component - defines rendering html tag + * @property {number} tint - tinting text color + * @property {React.HTMLAttributes} rest - rest properties that can be set + */ + +function Text({ + size, + color, + weight, + children, + className, + component, + tint, + ...rest +}: ITextProps): React.FunctionComponentElement { + const Element = (): React.FunctionComponentElement => { + const classes: string = classNames({ + Text: true, + [`Text__size_${size || 12}`]: true, + [`Text__weight_${weight || 500}`]: true, + [`Text__color_${color || 'primary'}${tint ? `_${tint}` : ''}`]: true, + [`${className}`]: !!className, + }); + + const elementProps = { + ...rest, + className: classes, + }; + + switch (component) { + case 'h1': + return

{children}

; + case 'h2': + return

{children}

; + case 'h3': + return

{children}

; + case 'h4': + return

{children}

; + case 'h5': + return
{children}
; + case 'h6': + return
{children}
; + case 'span': + return {children}; + case 'strong': + return {children}; + case 'small': + return {children}; + case 'p': + return

{children}

; + case 'pre': + return
{children}
; + default: + return {children}; + } + }; + + return ( + + + + ); +} + +Text.displayName = 'Text'; + +export default React.memo(Text); diff --git a/src/src/components/kit/Text/index.ts b/src/src/components/kit/Text/index.ts new file mode 100644 index 00000000..e06893db --- /dev/null +++ b/src/src/components/kit/Text/index.ts @@ -0,0 +1,3 @@ +import Text from './Text'; +export * from './Text.d'; +export default Text; diff --git a/src/src/components/kit/ToggleButton/ToggleButton.d.ts b/src/src/components/kit/ToggleButton/ToggleButton.d.ts new file mode 100644 index 00000000..c4916611 --- /dev/null +++ b/src/src/components/kit/ToggleButton/ToggleButton.d.ts @@ -0,0 +1,12 @@ +import { ButtonProps } from '@material-ui/core'; + +export default interface IToggleButtonProps extends ButtonProps { + onChange: (value: string | number | any, id?: string | number | any) => void; + id?: string | undefined; + leftLabel: string; + rightLabel: string; + leftValue: number | string; + rightValue: number | string; + value: string | number; + title: string; +} diff --git a/src/src/components/kit/ToggleButton/ToggleButton.scss b/src/src/components/kit/ToggleButton/ToggleButton.scss new file mode 100644 index 00000000..2160f989 --- /dev/null +++ b/src/src/components/kit/ToggleButton/ToggleButton.scss @@ -0,0 +1,25 @@ +@use 'src/styles/abstracts' as *; + +.ToggleButton { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; +} + +.ToggleButton__title { + font-size: $text-md; +} + +.ToggleButton__container { + padding: 0.25rem; + border: $border-main; + border-radius: $border-radius-md; + display: inline-block; + & button { + border-radius: 0.25rem !important; + &:first-child { + margin-right: 0.25rem; + } + } +} diff --git a/src/src/components/kit/ToggleButton/ToggleButton.tsx b/src/src/components/kit/ToggleButton/ToggleButton.tsx new file mode 100644 index 00000000..fb0c25b4 --- /dev/null +++ b/src/src/components/kit/ToggleButton/ToggleButton.tsx @@ -0,0 +1,65 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { Button } from '../index'; + +import IToggleButtonProps from './ToggleButton.d'; + +import './ToggleButton.scss'; + +function ToggleButton({ + leftLabel, + rightLabel, + title, + leftValue, + rightValue, + onChange, + value, + id, + className, +}: IToggleButtonProps): React.FunctionComponentElement { + function handleToggle(e: any): void { + const { id, value } = e.currentTarget; + onChange(value, id); + } + + return ( + +
+ +
+ {title} +
+
+ +
+ + +
+
+
+ ); +} + +export default ToggleButton; diff --git a/src/src/components/kit/ToggleButton/index.ts b/src/src/components/kit/ToggleButton/index.ts new file mode 100644 index 00000000..94712ae4 --- /dev/null +++ b/src/src/components/kit/ToggleButton/index.ts @@ -0,0 +1,4 @@ +import ToggleButton from './ToggleButton'; + +export * from './ToggleButton.d'; +export default ToggleButton; diff --git a/src/src/components/kit/index.ts b/src/src/components/kit/index.ts new file mode 100644 index 00000000..92177d68 --- /dev/null +++ b/src/src/components/kit/index.ts @@ -0,0 +1,40 @@ +import Text from './Text'; +import Switcher from './Switcher'; +import Button, { IButtonProps } from './Button'; +import ToggleButton from './ToggleButton'; +import Icon from './Icon'; +import Badge from './Badge'; +import Dropdown from './Dropdown'; +import JsonViewPopover from './JsonViewPopover'; +import AutoSuggestions from './AutoSuggestions'; +import Slider from './Slider'; +import Menu, { MenuItem } from './Menu'; +import Modal from './Modal'; +import ActionCard from './ActionCard'; +import InputWrapper from './Input'; +import Card from './Card'; +import SelectDropdown from './SelectDropdown'; +import Spinner from './Spinner'; + +export { + AutoSuggestions, + JsonViewPopover, + ToggleButton, + InputWrapper, + ActionCard, + Dropdown, + Switcher, + MenuItem, + Slider, + Button, + Modal, + Badge, + Text, + Icon, + Menu, + Card, + SelectDropdown, + Spinner, +}; + +export type { IButtonProps }; diff --git a/src/src/components/kit_v2/Badge/Badge.d.ts b/src/src/components/kit_v2/Badge/Badge.d.ts new file mode 100644 index 00000000..bbf551d4 --- /dev/null +++ b/src/src/components/kit_v2/Badge/Badge.d.ts @@ -0,0 +1,40 @@ +import { CSS, ColorPaletteType } from 'config/stitches/types'; + +export interface IBadgeProps { + /** + * @description Badge label + */ + label: string; + /** + * @description Badge color + * @default 'primary' + */ + color?: ColorPaletteType; + /** + * @description Badge size + * @default 'md' + */ + size?: 'xs' | 'sm' | 'md' | 'lg'; + /** + * @description Badge delete callback + * @default undefined + */ + onDelete?: (label: string) => void; + /** + * @description Badge disabled state + * @default false + * @type boolean + */ + disabled?: boolean; + /** + * @description Whether Badge is monospaced + * @default false + * @type boolean + */ + monospace?: boolean; + /** + * @description Badge stitches css prop object + * @example { backgroundColor: 'red' } + */ + css?: CSS; +} diff --git a/src/src/components/kit_v2/Badge/Badge.style.ts b/src/src/components/kit_v2/Badge/Badge.style.ts new file mode 100644 index 00000000..71eec851 --- /dev/null +++ b/src/src/components/kit_v2/Badge/Badge.style.ts @@ -0,0 +1,106 @@ +import Icon from 'components/kit_v2/Icon'; + +import { styled } from 'config/stitches'; +import { CSS } from 'config/stitches/types'; + +function getColors({ + color, + disabled, +}: { + color: string | undefined; + disabled: boolean; +}): CSS { + if (color) { + return { + bc: `$${color}${disabled ? 50 : 70}`, + '&:hover': { + bc: `$${color}80`, + }, + }; + } + return { + bc: 'white', + bs: '0 0 0 1px $colors$secondary50', + color: disabled ? '$textPrimary50' : '$textPrimary', + '&:hover': { + bc: '$colors$secondary10', + }, + }; +} + +const BadgeContainer = styled('div', { + width: 'fit-content', + display: 'inline-flex', + ai: 'center', + br: '$3', + color: '$textPrimary', + fontWeight: '$2', + lineHeight: '1', + transition: 'all 0.2s ease-out', + variants: { + font: { + mono: { + fontMono: 14, + }, + default: { + fontSize: '$3', + }, + }, + rightIcon: { true: {} }, + size: { + xs: { + height: '$1', + p: '0 $4', + }, + sm: { + height: '$2', + p: '0 $4', + }, + md: { + height: '$3', + p: '0 $6', + }, + lg: { + height: '$5', + p: '0 $6', + }, + }, + disabled: { + true: { + userSelect: 'none', + cursor: 'not-allowed', + pointerEvents: 'none', + color: '$textPrimary50', + }, + }, + }, + compoundVariants: [ + { + rightIcon: true, + css: { + pr: '0', + }, + }, + ], +}); + +const RightIcon: any = styled(Icon, { + display: 'flex', + ai: 'center', + jc: 'center', + size: '$1', + ml: '$2', + fontFamily: '$mono', + cursor: 'pointer', + userSelect: 'none', + variants: { + inputSize: { + xs: { mr: '$2' }, + sm: { mr: '$2' }, + md: { mr: '$4' }, + lg: { mr: '$4' }, + }, + }, +}); + +export { BadgeContainer, RightIcon, getColors }; diff --git a/src/src/components/kit_v2/Badge/Badge.tsx b/src/src/components/kit_v2/Badge/Badge.tsx new file mode 100644 index 00000000..41fdfe11 --- /dev/null +++ b/src/src/components/kit_v2/Badge/Badge.tsx @@ -0,0 +1,66 @@ +import React from 'react'; + +import { IconX } from '@tabler/icons-react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IBadgeProps } from './Badge.d'; +import { BadgeContainer, getColors, RightIcon } from './Badge.style'; + +/** + * Badge component params + * @param {string} label - Label of the badge + * @param {string} size - Size of the badge + * @param {ColorPaletteType} color - Color of the badge + * @param {boolean} disabled - Disabled state of the badge + * @param {boolean} monospace - Monospace font of the badge + * @param {function} onDelete - Callback function for delete action + */ + +const Badge = React.forwardRef< + React.ElementRef, + IBadgeProps +>( + ( + { + label, + size = 'md', + color, + css, + monospace = false, + disabled = false, + onDelete, + ...rest + }: IBadgeProps, + forwardedRef, + ): React.FunctionComponentElement => { + return ( + + + {label} + {onDelete ? ( + } + inputSize={size} + size='md' + onClick={() => onDelete(label)} + /> + ) : null} + + + ); + }, +); + +Badge.displayName = 'Badge'; +export default Badge; diff --git a/src/src/components/kit_v2/Badge/index.ts b/src/src/components/kit_v2/Badge/index.ts new file mode 100644 index 00000000..863f0815 --- /dev/null +++ b/src/src/components/kit_v2/Badge/index.ts @@ -0,0 +1,4 @@ +import Badge from './Badge'; + +export * from './Badge'; +export default Badge; diff --git a/src/src/components/kit_v2/Box/Box.d.ts b/src/src/components/kit_v2/Box/Box.d.ts new file mode 100644 index 00000000..2265a64d --- /dev/null +++ b/src/src/components/kit_v2/Box/Box.d.ts @@ -0,0 +1,166 @@ +import React from 'react'; + +import { CSS } from 'config/stitches/types'; + +// Polymorphic Box component props +export interface IBoxProps + extends Partial>, + IBoxCssProps { + /** + * @optional + * @default 'div' + * @description HTML element to render + */ + as?: React.ElementType; + /** + * @optional + * @default {} + * @description CSS styles + * @example + * + */ + css?: CSS; + /** + * @description flex prop + * @optional + * @default false + */ +} + +interface IBoxCssProps { + /** + * @description display prop + * @optional + * @example + * + * @default 'block' + */ + display?: CSS['display']; + /** + * @description flex prop + * @optional + * @example + * + */ + flex?: CSS['flex']; + /** + * @description flex direction prop + * @optional + */ + fd?: CSS['flexDirection']; + /** + * @description flex wrap prop + * @optional + */ + fw?: CSS['flexWrap']; + /** + * @description flex align items prop + * @optional + * @default 'stretch' + */ + ai?: CSS['alignItems']; + /** + * @description flex justify content prop + * @optional + * @default 'flex-start' + * @example + * + */ + jc?: CSS['justifyContent']; + /** + * @description margin prop + * @optional + */ + m?: CSS['margin']; + /** + * @description margin top prop + * @optional + * @example + * + */ + mt?: CSS['marginTop']; + /** + * @description margin right prop + * @optional + * @example + * + */ + mr?: CSS['marginRight']; + /** + * @description margin bottom prop + * @optional + * @example + * + */ + mb?: CSS['marginBottom']; + /** + * @description margin left prop + * @optional + * @example + * + */ + ml?: CSS['marginLeft']; + /** + * @description padding prop + * @optional + * @example + * + */ + p?: CSS['padding']; + /** + * @description padding top prop + * @optional + * @example + * + */ + pt?: CSS['paddingTop']; + /** + * @description padding right prop + * @optional + * @example + * + */ + pr?: CSS['paddingRight']; + /** + * @description padding bottom prop + * @optional + * @example + * + */ + pb?: CSS['paddingBottom']; + /** + * @description padding left prop + * @optional + * @example + * + */ + pl?: CSS['paddingLeft']; + /** + * @description width prop + * @optional + * @example + * + */ + width?: CSS['width']; + /** + * @description height prop + * @optional + * @example + * + */ + height?: CSS['height']; + /** + * @description min background color prop + * @optional + * @example + * + */ + bg?: CSS['backgroundColor']; + /** + * color prop + * @optional + * @example + * + */ + color?: CSS['color']; +} diff --git a/src/src/components/kit_v2/Box/Box.tsx b/src/src/components/kit_v2/Box/Box.tsx new file mode 100644 index 00000000..f90b739e --- /dev/null +++ b/src/src/components/kit_v2/Box/Box.tsx @@ -0,0 +1,84 @@ +import React from 'react'; + +import { Slot } from '@radix-ui/react-slot'; + +import { styled } from 'config/stitches'; + +import { IBoxProps } from './Box.d'; + +const StyledBox = styled(Slot, {}); + +/** + * Polymorphic Box component + * @param {IBoxProps} props + * @param {keyof React.ElementType} as - HTML element or React component + * @param {object} css - css object + * @param {React.ReactNode} children - React children + * @param {Partial>} rest - HTML attributes + * @returns {React.FunctionComponentElement} + * @see https://www.radix-ui.com/docs/primitives/utilities/slot + * @see https://stitches.dev/docs/overriding-styles#the-css-prop + */ + +const Box = React.forwardRef( + ( + { as = 'div', css, children, ...props }: IBoxProps, + forwardedRef, + ): React.FunctionComponentElement => { + const Component = as; + const { layoutProps, restProps } = React.useMemo(() => { + const layoutKeys = [ + 'display', + 'flex', + 'fd', + 'fw', + 'ai', + 'jc', + 'm', + 'mt', + 'mr', + 'mb', + 'ml', + 'p', + 'pt', + 'pr', + 'pb', + 'pl', + 'width', + 'height', + 'bg', + 'color', + ]; + const layoutProps = Object.entries(props) + .filter(([key]) => layoutKeys.includes(key)) + .reduce((obj, [key, value]) => { + obj[key] = value; + return obj; + }, {} as { [key: string]: any }); + + const restProps = Object.entries(props) + .filter(([key]) => !layoutKeys.includes(key)) + .reduce((obj, [key, value]) => { + obj[key] = value; + return obj; + }, {} as { [key: string]: any }); + return { layoutProps, restProps }; + }, [props]); + + return ( + } + > + {children} + + ); + }, +); + +Box.displayName = 'Box'; +export default React.memo(Box); diff --git a/src/src/components/kit_v2/Box/index.ts b/src/src/components/kit_v2/Box/index.ts new file mode 100644 index 00000000..158681ca --- /dev/null +++ b/src/src/components/kit_v2/Box/index.ts @@ -0,0 +1,4 @@ +import Box from './Box'; + +export * from './Box.d'; +export default Box; diff --git a/src/src/components/kit_v2/Button/Button.d.ts b/src/src/components/kit_v2/Button/Button.d.ts new file mode 100644 index 00000000..9e00aa64 --- /dev/null +++ b/src/src/components/kit_v2/Button/Button.d.ts @@ -0,0 +1,63 @@ +import React from 'react'; + +import { CSS, ColorPaletteType } from 'config/stitches/types'; + +// Button component props +export interface IButtonProps + extends Partial> { + /** + * @description The color of the button + * @example 'primary' + */ + color?: ColorPaletteType; + /** + * @description The size of the button + * @example 'md' + * @default 'md' + */ + size?: ButtonSizeType; + /** + * @description The variant of the button + * @example 'contained' + * @default 'contained' + */ + variant?: ButtonVariantType; + /** + * @description The disabled state of the button + * @example false + * @default false + */ + disabled?: boolean; + /** + * @description The start icon of the button + * @example + */ + leftIcon?: React.ReactNode; + /** + * @description The end icon of the button + * @example + */ + rightIcon?: React.ReactNode; + /** + * @description The full width state of the button + * @example false + */ + fullWidth?: boolean; + /** + * @description The spacing variant of the button + * @example 'default' + * @default 'default' + */ + horizontalSpacing?: 'default' | 'compact'; + /** + * @description The css prop of the button + * @example { backgroundColor: 'red' } + */ + css?: CSS; +} + +// Button component size types +export type ButtonSizeType = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; + +// Button component variants +type ButtonVariantType = 'ghost' | 'outlined' | 'contained' | 'static'; diff --git a/src/src/components/kit_v2/Button/Button.style.ts b/src/src/components/kit_v2/Button/Button.style.ts new file mode 100644 index 00000000..1741df92 --- /dev/null +++ b/src/src/components/kit_v2/Button/Button.style.ts @@ -0,0 +1,74 @@ +import Icon from 'components/kit_v2/Icon'; + +import { styled } from 'config/stitches'; + +const Container: any = styled('button', { + all: 'unset', + display: 'inline-flex', + width: 'fit-content', + ai: 'center', + jc: 'center', + lineHeight: 1, + fontWeight: '$2', + cursor: 'pointer', + br: '$3', + transition: 'all 0.2s ease-in-out', + fontSize: '$3', + variants: { + size: { + xs: { + height: '$sizes$1', + fontSize: '$fontSizes$2', + p: '0 $space$7', + }, + sm: { + height: '$sizes$2', + fontSize: '$fontSizes$2', + p: '0 $space$7', + }, + md: { + height: '$sizes$3', + p: '0 $space$8', + }, + lg: { + height: '$sizes$5', + p: '0 $space$9', + }, + xl: { + height: '$sizes$7', + p: '0 $space$11', + }, + }, + disabled: { + true: { + userSelect: 'none', + cursor: 'not-allowed', + pointerEvents: 'none', + }, + }, + fullWidth: { + true: { + width: '100%', + }, + }, + }, +}); + +const IconContainer = styled(Icon, { + size: '$sizes$1', + display: 'flex', + jc: 'center', + ai: 'center', + lineHeight: '1', + fontSize: '$2', +}); + +const LeftIcon: any = styled(IconContainer, { + mr: '$2', +}); + +const RightIcon: any = styled(IconContainer, { + ml: '$2', +}); + +export { Container, LeftIcon, RightIcon }; diff --git a/src/src/components/kit_v2/Button/Button.test.tsx b/src/src/components/kit_v2/Button/Button.test.tsx new file mode 100644 index 00000000..88216c4c --- /dev/null +++ b/src/src/components/kit_v2/Button/Button.test.tsx @@ -0,0 +1,24 @@ +import { render } from '@testing-library/react'; + +import Button from './Button'; + +// Test of Button component +describe('', () => { + test('Renders Correctly', () => { + const { asFragment } = render(); + expect(asFragment()).toMatchSnapshot(); + }); + + // test onClick event + test('onClick event works properly', () => { + const onClick = jest.fn(); + const { getByTestId } = render( + , + ); + const button = getByTestId('button'); + button.click(); + expect(onClick).toHaveBeenCalled(); + }); +}); diff --git a/src/src/components/kit_v2/Button/Button.tsx b/src/src/components/kit_v2/Button/Button.tsx new file mode 100644 index 00000000..b95bf78d --- /dev/null +++ b/src/src/components/kit_v2/Button/Button.tsx @@ -0,0 +1,76 @@ +import React from 'react'; + +import { getButtonStyles } from '../utils/getButtonStyles'; + +import { IButtonProps } from './Button.d'; +import { ButtonSpacingMap, getIconSpacing } from './buttonConfig'; +import { Container, LeftIcon, RightIcon } from './Button.style'; + +/** + * @property {IButtonProps['color']} color - color of the button + * @property {IButtonProps['size']} size - size of the button + * @property {IButtonProps['variant']} variant - variant of the button + * @property {IButtonProps['fullWidth']} fullWidth - whether the button should take the full width of its container + * @property {IButtonProps['disabled']} disabled - whether the button should be disabled + * @property {IButtonProps['leftIcon']} leftIcon - icon to be displayed on the left side of the button + * @property {IButtonProps['rightIcon']} rightIcon - icon to be displayed on the right side of the button + * @property {IButtonProps['children']} children - children to be displayed inside the button + */ + +const Button = React.forwardRef< + React.ElementRef, + IButtonProps +>( + ( + { + color = 'primary', + size = 'md', + variant = 'contained', + fullWidth = false, + horizontalSpacing = 'default', + disabled, + leftIcon, + rightIcon, + css, + children, + ...rest + }: IButtonProps, + forwardedRef, + ) => { + return ( + + {leftIcon ? ( + + ) : null} + {children} + {rightIcon ? ( + + ) : null} + + ); + }, +); + +Button.displayName = 'Button'; +export default React.memo(Button); diff --git a/src/src/components/kit_v2/Button/buttonConfig.ts b/src/src/components/kit_v2/Button/buttonConfig.ts new file mode 100644 index 00000000..6ae49150 --- /dev/null +++ b/src/src/components/kit_v2/Button/buttonConfig.ts @@ -0,0 +1,23 @@ +import { ButtonSizeType, IButtonProps } from './Button.d'; + +export const ButtonSpacingMap = { + compact: { xs: '0 $4', sm: '0 $4', md: '0 $5', lg: '0 $6', xl: '0 $7' }, + default: { xs: '0 $7', sm: '0 $7', md: '0 $8', lg: '0 $9', xl: '0 $11' }, +}; + +export const getIconSpacing = ( + spacing: IButtonProps['horizontalSpacing'], + size: ButtonSizeType, +) => { + if (spacing === 'compact') { + return 'calc($3 * -1)'; + } + let spaces: Record = { + xs: 'calc($3 * -1)', + sm: 'calc($3 * -1)', + md: 'calc($4 * -1)', + lg: 'calc($5 * -1)', + xl: 'calc($7 * -1)', + }; + return spaces[size]; +}; diff --git a/src/src/components/kit_v2/Button/index.ts b/src/src/components/kit_v2/Button/index.ts new file mode 100644 index 00000000..b2c94caf --- /dev/null +++ b/src/src/components/kit_v2/Button/index.ts @@ -0,0 +1,4 @@ +import Button from './Button'; + +export * from './Button.d'; +export default Button; diff --git a/src/src/components/kit_v2/ButtonGroup/ButtonGroup.d.ts b/src/src/components/kit_v2/ButtonGroup/ButtonGroup.d.ts new file mode 100644 index 00000000..7e82b3fc --- /dev/null +++ b/src/src/components/kit_v2/ButtonGroup/ButtonGroup.d.ts @@ -0,0 +1,3 @@ +import { IButtonProps } from '../Button'; + +export interface IButtonGroupProps extends IButtonProps {} diff --git a/src/src/components/kit_v2/ButtonGroup/ButtonGroup.style.ts b/src/src/components/kit_v2/ButtonGroup/ButtonGroup.style.ts new file mode 100644 index 00000000..e1db4dda --- /dev/null +++ b/src/src/components/kit_v2/ButtonGroup/ButtonGroup.style.ts @@ -0,0 +1,44 @@ +import { styled } from 'config/stitches'; + +const Container: any = styled('div', { + all: 'unset', + display: 'inline-flex', + width: 'fit-content', + ai: 'center', + jc: 'center', + fontWeight: '$2', + overflow: 'hidden', + '& > button': { + br: '0', + bs: 'none', + '&:not(:first-of-type)': { + borderLeft: '1px solid', + }, + '&:first-of-type': { + borderTopLeftRadius: '$3', + borderBottomLeftRadius: '$3', + }, + '&:last-of-type': { + borderTopRightRadius: '$3', + borderBottomRightRadius: '$3', + }, + }, + variants: { + variant: { + outlined: { + '& > button': { + bs: 'inset 0 0 0 1px', + '&:not(:first-of-type)': { + borderLeft: 'none', + ml: '-1px', + }, + '&:hover': { + zIndex: 1, + }, + }, + }, + }, + }, +}); + +export { Container }; diff --git a/src/src/components/kit_v2/ButtonGroup/ButtonGroup.tsx b/src/src/components/kit_v2/ButtonGroup/ButtonGroup.tsx new file mode 100644 index 00000000..0d8b72d1 --- /dev/null +++ b/src/src/components/kit_v2/ButtonGroup/ButtonGroup.tsx @@ -0,0 +1,39 @@ +import React from 'react'; + +import { IButtonGroupProps } from './ButtonGroup.d'; +import { Container } from './ButtonGroup.style'; + +/** + * @description ButtonGroup component is a wrapper for Button component to group them together + * ButtonGroup component params + * @param {string} color - Color of the button group + * @param {React.ReactNode} children - React children + * @param {Partial>} rest - HTML attributes + */ +const ButtonGroup = React.forwardRef< + React.ElementRef, + IButtonGroupProps +>(({ color, children, ...rest }: IButtonGroupProps, forwardedRef) => { + const childrenWIthProps = React.Children.map(children, (child) => { + return React.cloneElement(child as React.FunctionComponentElement, { + color, + ...rest, + }); + }); + + return ( + + {childrenWIthProps} + + ); +}); + +ButtonGroup.displayName = 'ButtonGroup'; +export default React.memo(ButtonGroup); diff --git a/src/src/components/kit_v2/ButtonGroup/index.ts b/src/src/components/kit_v2/ButtonGroup/index.ts new file mode 100644 index 00000000..547c97d8 --- /dev/null +++ b/src/src/components/kit_v2/ButtonGroup/index.ts @@ -0,0 +1,4 @@ +import ButtonGroup from './ButtonGroup'; + +export * from './ButtonGroup.d'; +export default ButtonGroup; diff --git a/src/src/components/kit_v2/Checkbox/Checkbox.d.ts b/src/src/components/kit_v2/Checkbox/Checkbox.d.ts new file mode 100644 index 00000000..8cc58eef --- /dev/null +++ b/src/src/components/kit_v2/Checkbox/Checkbox.d.ts @@ -0,0 +1,39 @@ +import { CheckboxProps } from '@radix-ui/react-checkbox'; + +/** + * The Checkbox component is a form component that allows users to select one or more options from a list. + * @description The interface for the Checkbox component. + */ +export interface ICheckboxProps extends CheckboxProps { + /** + * The checked state of the checkbox. + * @description The checked state of the checkbox. + * @default false + */ + checked?: CheckboxProps['checked']; + /** + * The default checked state of the checkbox. + * @description The default checked state of the checkbox. + * @default false + */ + defaultChecked?: boolean; + /** + * The required state of the checkbox. + * @description The required state of the checkbox. + * @default false + */ + required?: boolean; + /** + * The callback function that is fired when the checked state of the checkbox is changed. + * @description The callback function that is fired when the checked state of the checkbox is changed. + * @param checked The checked state of the checkbox. + * @default () => {} + */ + onCheckedChange?: (checked: CheckboxProps['checked']) => void; + /** + * @description disabled state + * @default false + * @type boolean + */ + disabled?: boolean; +} diff --git a/src/src/components/kit_v2/Checkbox/Checkbox.style.ts b/src/src/components/kit_v2/Checkbox/Checkbox.style.ts new file mode 100644 index 00000000..03b1fa18 --- /dev/null +++ b/src/src/components/kit_v2/Checkbox/Checkbox.style.ts @@ -0,0 +1,95 @@ +import * as CheckboxPrimitive from '@radix-ui/react-checkbox'; + +import { styled } from 'config/stitches'; + +const IndeterminateIcon = styled('span', { + width: '6px', + height: '6px', + bc: '$primary100', + br: '$1', + transition: 'all 0.2s ease-out', +}); + +const StyledIndicator = styled(CheckboxPrimitive.Indicator, { + display: 'flex', + jc: 'center', + ai: 'center', + height: '100%', + width: '100%', + color: 'white', + transition: 'all 0.2s ease-out', +}); + +const IndicatorWrapper = styled('span', { + width: '10px', + height: '10px', + display: 'flex', + ai: 'center', + jc: 'center', + bs: 'inset 0 0 0 1px $colors$secondary100', + br: '$2', + transition: 'all 0.2s ease-out', +}); + +const StyledCheckbox = styled(CheckboxPrimitive.Root, { + size: '20px', + border: 'unset', + bc: 'transparent', + borderRadius: '$2', + display: 'flex', + ai: 'center', + jc: 'center', + lineHeight: 1, + cursor: 'pointer', + transition: 'all 0.2s ease-out', + '&:hover': { + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$primary100', + }, + }, + '&:disabled': { + pointerEvents: 'none', + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$secondary50 !important', + }, + }, + '&[data-state=checked]': { + '&:hover': { + [`& ${IndicatorWrapper}`]: { + bc: '$primary110', + }, + }, + '&:disabled': { + [`& ${IndicatorWrapper}`]: { + bc: '$secondary50', + }, + }, + [`& ${IndicatorWrapper}`]: { + bc: '$primary100', + bs: 'inset 0 0 0 1px transparent', + '&:disabled': { + bc: '$secondary50 !important', + }, + }, + }, + '&[data-state=indeterminate]': { + '&:hover': { + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$primary110', + }, + [`& ${IndeterminateIcon}`]: { + bc: '$primary110', + }, + }, + '&:disabled': { + [`& ${IndeterminateIcon}`]: { + bc: '$secondary50', + }, + }, + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$primary100', + }, + }, +}); + +export { StyledCheckbox, StyledIndicator, IndicatorWrapper, IndeterminateIcon }; diff --git a/src/src/components/kit_v2/Checkbox/Checkbox.tsx b/src/src/components/kit_v2/Checkbox/Checkbox.tsx new file mode 100644 index 00000000..4e423d35 --- /dev/null +++ b/src/src/components/kit_v2/Checkbox/Checkbox.tsx @@ -0,0 +1,79 @@ +import React from 'react'; + +import Icon from 'components/kit/Icon'; + +import { ICheckboxProps } from './Checkbox.d'; +import { + IndeterminateIcon, + IndicatorWrapper, + StyledCheckbox, + StyledIndicator, +} from './Checkbox.style'; + +/** + * @description Checkbox component + * Checkbox component params + * @param {boolean} checked - Checked state of the checkbox + * @param {boolean} defaultChecked - Default checked state of the checkbox + * @param {boolean} disabled - Disabled state of the checkbox + * @returns {React.FunctionComponentElement} + * @constructor + * @example + * + */ +export const CheckBox = React.forwardRef< + React.ElementRef, + ICheckboxProps +>( + ( + { checked, defaultChecked, disabled, ...props }: ICheckboxProps, + forwardedRef, + ): React.FunctionComponentElement => { + const [isChecked, setIsChecked] = React.useState( + checked || defaultChecked, + ); + + // control checkbox state from outside + React.useEffect(() => { + if (checked !== isChecked) { + setIsChecked(checked); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [checked]); + + // control checkbox state from inside + const handleChange = React.useCallback( + (val: ICheckboxProps['checked']) => { + if (!disabled) { + const value: ICheckboxProps['checked'] = + isChecked === 'indeterminate' ? false : val; + setIsChecked(value); + if (props.onCheckedChange) { + props.onCheckedChange(value); + } + } + }, + [isChecked, props, disabled], + ); + + return ( + + + + {isChecked === 'indeterminate' ? : null} + {isChecked === true ? : null} + + + + ); + }, +); + +CheckBox.displayName = 'CheckBox'; +export default React.memo(CheckBox); diff --git a/src/src/components/kit_v2/Checkbox/index.ts b/src/src/components/kit_v2/Checkbox/index.ts new file mode 100644 index 00000000..c497e396 --- /dev/null +++ b/src/src/components/kit_v2/Checkbox/index.ts @@ -0,0 +1,4 @@ +import Checkbox from './Checkbox'; + +export * from './Checkbox.d'; +export default Checkbox; diff --git a/src/src/components/kit_v2/ControlsButton/ControlsButton.d.ts b/src/src/components/kit_v2/ControlsButton/ControlsButton.d.ts new file mode 100644 index 00000000..81ef611f --- /dev/null +++ b/src/src/components/kit_v2/ControlsButton/ControlsButton.d.ts @@ -0,0 +1,45 @@ +export interface IControlsButtonProps { + /** + * @description Popover open state + * @example false + */ + open: boolean; + /** + * @description Popover has applied values + * @example false + * @default false + */ + hasAppliedValues?: boolean; + /** + * @description Control popover triggers applied values count + * @example 2 + * @default 0 + */ + appliedValuesCount?: number; + /** + * @description Control popover trigger right icon props + * @example { icon: , onClick: () => {} } + */ + rightIcon?: { + icon: React.ReactNode; + onClick: () => void; + }; + /** + * @description Control popover trigger left icon + * @example + */ + leftIcon?: React.ReactNode; + /** + * @description Control popover trigger children + */ + children: React.ReactNode; + /** + * @description Control popover trigger sizes + * @example 'md' + */ + size?: 'md' | 'lg' | 'xl'; + /** + * @description The disabled state of the button + */ + disabled?: boolean; +} diff --git a/src/src/components/kit_v2/ControlsButton/ControlsButton.style.ts b/src/src/components/kit_v2/ControlsButton/ControlsButton.style.ts new file mode 100644 index 00000000..f13e758d --- /dev/null +++ b/src/src/components/kit_v2/ControlsButton/ControlsButton.style.ts @@ -0,0 +1,178 @@ +import Icon from 'components/kit_v2/Icon'; + +import { styled } from 'config/stitches'; + +const Trigger = styled('button', { + all: 'unset', + display: 'inline-flex', + width: 'fit-content', + ai: 'center', + jc: 'center', + lineHeight: 1, + fontWeight: '$2', + cursor: 'pointer', + borderRadius: '$3', + transition: 'all 0.2s ease-out', + fontSize: '$3', + color: ' #5A667A', + '&:hover': { + bc: '#E2E6ED', + }, + variants: { + applied: { + true: { + bc: '$secondary10', + }, + }, + focused: { + true: { + bs: '0px 0px 0px 1px $colors$secondary100', + bc: '#E2E6ED', + }, + }, + rightIcon: { true: {} }, + leftIcon: { true: {} }, + size: { + md: { + height: '$3', + pl: '$5', + pr: '$4', + }, + lg: { + height: '$5', + pl: '$6', + pr: '$5', + }, + xl: { + height: '$7', + pl: '$7', + pr: '$6', + }, + }, + disabled: { + true: { + userSelect: 'none', + cursor: 'not-allowed', + pointerEvents: 'none', + color: '$secondary50', + }, + }, + }, + compoundVariants: [ + { + rightIcon: true, + size: 'md', + css: { + pr: '$3', + }, + }, + { + rightIcon: true, + size: 'lg', + css: { + pr: '$4', + }, + }, + { + rightIcon: true, + size: 'xl', + css: { + pr: '$6', + }, + }, + { + leftIcon: true, + size: 'md', + css: { + pl: '$2', + }, + }, + { + leftIcon: true, + size: 'lg', + css: { + pl: '$3', + }, + }, + { + leftIcon: true, + size: 'xl', + css: { + pl: '$5', + }, + }, + ], +}); + +const ArrowIcon: any = styled('span', { + width: '10px', + display: 'flex', + ai: 'center', + jc: 'center', + ml: '$2', + variants: { + rightIcon: { true: {} }, + size: { + md: {}, + lg: { + ml: '$3', + }, + xl: { + ml: '$5', + }, + }, + }, + compoundVariants: [ + { + size: 'md', + rightIcon: true, + css: { + mr: '$2', + }, + }, + { + size: 'lg', + rightIcon: true, + css: { + mr: '$3', + }, + }, + { + size: 'xl', + rightIcon: true, + css: { + mr: '$5', + }, + }, + ], +}); + +const AppliedCount = styled('span', { + width: '16px', + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + overflow: 'hidden', + height: '14px', + lineHeight: 1.4, + bc: '$secondary30', + display: 'inline-block', + textAlign: 'center', + br: '100px', + fontSize: '10px', + fontWeight: '$3', + ml: '$3', +}); + +const LeftIcon: any = styled(Icon, { + size: '$1', + display: 'flex', + ai: 'center', + jc: 'center', + mr: '$2', +}); + +const RightIcon = styled(Icon, { + width: '$1', +}); + +export { Trigger, ArrowIcon, AppliedCount, LeftIcon, RightIcon }; diff --git a/src/src/components/kit_v2/ControlsButton/ControlsButton.tsx b/src/src/components/kit_v2/ControlsButton/ControlsButton.tsx new file mode 100644 index 00000000..bafb73e3 --- /dev/null +++ b/src/src/components/kit_v2/ControlsButton/ControlsButton.tsx @@ -0,0 +1,83 @@ +import React from 'react'; + +import { IconCaretDown, IconCaretUp } from '@tabler/icons-react'; + +import { IControlsButtonProps } from './ControlsButton.d'; +import { + AppliedCount, + ArrowIcon, + LeftIcon, + RightIcon, + Trigger, +} from './ControlsButton.style'; + +/** + * @description ControlsButton component + * ControlsButton component params + * @param {string} children - Label of the button + * @param {boolean} open - Open state of the button + * @param {string} rightIcon - Right icon of the button + * @param {string} size - Size of the button + * @param {boolean} hasAppliedValues - Applied values state of the button + * @param {number} appliedValuesCount - Applied values count of the button + * @param {string} leftIcon - Left icon of the button + * @param {boolean} disabled - Disabled state of the button + * @returns {React.FunctionComponentElement} - React component + */ +const ControlsButton = React.forwardRef< + React.ElementRef, + IControlsButtonProps +>( + ( + { + children, + open, + rightIcon, + size = 'md', + hasAppliedValues = false, + appliedValuesCount, + leftIcon, + disabled, + ...props + }: IControlsButtonProps, + forwardedRef, + ) => { + return ( + + {leftIcon ? : null} + {children} + {appliedValuesCount ? ( + {appliedValuesCount} + ) : null} + { + + {open ? : } + + } + {rightIcon?.icon ? ( + { + e.preventDefault(); + rightIcon?.onClick(); + }} + icon={rightIcon?.icon} + color='secondary' + /> + ) : null} + + ); + }, +); + +ControlsButton.displayName = 'ControlsButton'; +export default React.memo(ControlsButton); diff --git a/src/src/components/kit_v2/ControlsButton/index.ts b/src/src/components/kit_v2/ControlsButton/index.ts new file mode 100644 index 00000000..0d2f98f6 --- /dev/null +++ b/src/src/components/kit_v2/ControlsButton/index.ts @@ -0,0 +1,4 @@ +import ControlsButton from './ControlsButton'; + +export * from './ControlsButton'; +export default ControlsButton; diff --git a/src/src/components/kit_v2/Dialog/Dialog.d.ts b/src/src/components/kit_v2/Dialog/Dialog.d.ts new file mode 100644 index 00000000..28d6cda0 --- /dev/null +++ b/src/src/components/kit_v2/Dialog/Dialog.d.ts @@ -0,0 +1,50 @@ +import { DialogProps } from '@radix-ui/react-dialog'; +export interface IDialogProps extends DialogProps { + /** + * Dialog title + * @default '' + * @optional + * @type string + */ + title?: string; + /** + * Dialog description + * @default '' + * @optional + * @type string + */ + description?: string; + /** + * dialog confirm callback + * @default () => {} + * @optional + * @type function + */ + onConfirm?: () => void; + /** + * Dialog trigger element + * @default null + * @optional + * @type React.ReactNode + * @example + * + */ + trigger?: React.ReactNode; + /** + * Dialog title icon + * @default null + * @optional + * @type React.ReactNode + * @example + */ + titleIcon?: React.ReactNode; + /** + * Dialog children element (content) to be rendered inside the dialog body (below the title and description) and above the footer buttons + * @default null + * @optional + * @type React.ReactNode + * @example + *
Dialog content
+ */ + children?: React.ReactNode; +} diff --git a/src/src/components/kit_v2/Dialog/Dialog.style.ts b/src/src/components/kit_v2/Dialog/Dialog.style.ts new file mode 100644 index 00000000..738c2d8a --- /dev/null +++ b/src/src/components/kit_v2/Dialog/Dialog.style.ts @@ -0,0 +1,68 @@ +import * as DialogPrimitive from '@radix-ui/react-dialog'; + +import { keyframes, styled } from 'config/stitches'; + +import Box from '../Box'; + +const overlayShow = keyframes({ + '0%': { opacity: 0 }, + '100%': { opacity: 1 }, +}); + +const contentShow = keyframes({ + '0%': { opacity: 0, transform: 'translate(-50%, -48%) scale(.96)' }, + '100%': { opacity: 1, transform: 'translate(-50%, -50%) scale(1)' }, +}); + +const DialogOverlay = styled(DialogPrimitive.Overlay, { + bc: 'hsla(206, 22%, 7%, 0.5)', + position: 'fixed', + inset: 0, + animation: `${overlayShow} 150ms cubic-bezier(0.16, 1, 0.3, 1)`, +}); + +const DialogContent = styled(DialogPrimitive.Content, { + position: 'fixed', + top: '50%', + left: '50%', + bc: 'white', + br: '$5', + bs: '0px 2px 4px -4px rgba(54, 61, 73, 0.25)', + transform: 'translate(-50%, -50%)', + width: '90vw', + maxWidth: '450px', + maxHeight: '85vh', + p: '$5', + animation: `${contentShow} 150ms cubic-bezier(0.16, 1, 0.3, 1)`, + '&:focus': { outline: 'none' }, +}); + +const DialogTitle = styled(DialogPrimitive.Title, { + fontSize: '$4', + fontWeight: '$4', + color: '$textPrimary', + wordBreak: 'break-word', +}); + +const DialogDescription = styled(DialogPrimitive.Description, { + margin: '$7 0', + fontSize: 15, + lineHeight: 1.5, +}); + +const DialogActions = styled(Box, { + borderTop: '1px solid $colors$secondary20', + pt: '$5', + mt: '$9', + display: 'flex', + ai: 'center', + jc: 'flex-end', +}); + +export { + DialogOverlay, + DialogContent, + DialogTitle, + DialogDescription, + DialogActions, +}; diff --git a/src/src/components/kit_v2/Dialog/Dialog.test.tsx b/src/src/components/kit_v2/Dialog/Dialog.test.tsx new file mode 100644 index 00000000..0ff2cb4a --- /dev/null +++ b/src/src/components/kit_v2/Dialog/Dialog.test.tsx @@ -0,0 +1,36 @@ +import { render } from '@testing-library/react'; + +import Dialog from './Dialog'; + +// Test of Dialog component +describe('Dialog', () => { + // Test of Dialog component + it('should render Dialog component', () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + // Test of title prop + it('should render Dialog component with title', () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + // Test of description prop + it('should render Dialog component with description', () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + // Test of trigger prop + it('should render Dialog component with trigger', () => { + const { container } = render(Trigger} />); + expect(container).toMatchSnapshot(); + }); + + // Test of open prop + it('should render Dialog component with open', () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/src/src/components/kit_v2/Dialog/Dialog.tsx b/src/src/components/kit_v2/Dialog/Dialog.tsx new file mode 100644 index 00000000..e1fe837d --- /dev/null +++ b/src/src/components/kit_v2/Dialog/Dialog.tsx @@ -0,0 +1,114 @@ +import React from 'react'; + +import * as DialogPrimitive from '@radix-ui/react-dialog'; +import { IconX } from '@tabler/icons-react'; + +import Button from '../Button'; +import Box from '../Box'; +import IconButton from '../IconButton'; + +import { IDialogProps } from './Dialog.d'; +import { + DialogActions, + DialogContent, + DialogDescription, + DialogOverlay, + DialogTitle, +} from './Dialog.style'; + +/** + * @description Dialog component is for displaying a dialog with a title, description, and actions + * Dialog component params + * @param {React.ReactNode} trigger - React children + * @param {string} title - Title of the dialog + * @param {string} description - Description of the dialog + * @param {React.ReactNode} children - React children + * @param {boolean} open - Open state of the dialog + * @param {React.ReactNode} onConfirm - On confirm callback of the dialog + * @param {React.ReactNode} onOpenChange - On open change callback of the dialog + * @returns {React.FunctionComponentElement} + * @constructor + * @example + * console.log('confirm')} + * trigger={} + * /> + */ +function Dialog({ + trigger, + title, + description, + open = false, + titleIcon, + children, + onConfirm, + onOpenChange, + ...props +}: IDialogProps): React.FunctionComponentElement { + return ( + + {trigger ? ( + {trigger} + ) : null} + + + + + {title ? ( + + {titleIcon ? ( + + {titleIcon} + + ) : null} + {title} + + ) : null} + {description ? ( + {description} + ) : null} + {children} + + + + + + + + + + + } + /> + + + + + ); +} + +Dialog.displayName = 'Dialog'; +export default React.memo(Dialog); diff --git a/src/src/components/kit_v2/Dialog/index.ts b/src/src/components/kit_v2/Dialog/index.ts new file mode 100644 index 00000000..40eb89e1 --- /dev/null +++ b/src/src/components/kit_v2/Dialog/index.ts @@ -0,0 +1,4 @@ +import Dialog from './Dialog'; + +export * from './Dialog.d'; +export default Dialog; diff --git a/src/src/components/kit_v2/Icon/Icon.d.ts b/src/src/components/kit_v2/Icon/Icon.d.ts new file mode 100644 index 00000000..5f2d3b98 --- /dev/null +++ b/src/src/components/kit_v2/Icon/Icon.d.ts @@ -0,0 +1,49 @@ +import * as React from 'react'; + +import { CSS } from 'config/stitches/types'; + +// The interface for the Icon component +export interface IIconProps + extends Partial> { + /** + * @description The css property is used to extend the styles of the component. + * @example + * ```tsx + * + * ``` + * @see https://stitches.dev/docs/api#css + * @default undefined + */ + css?: CSS; + /** + * @description The size of the Icon. + * @example + * ```tsx + * + * ``` + * @default lg + */ + size?: 'sm' | 'md' | 'lg'; + /** + * @description The icon node. + * @example + * ```tsx + * } /> + * ``` + * ```tsx + * + * ``` + * @default undefined + * @see https://tablericons.com/ + */ + icon: React.ReactNode; + /** + * @description The color of the Icon. + * @example + * ```tsx + * + * ``` + * @default undefined + */ + color?: CSS['color']; +} diff --git a/src/src/components/kit_v2/Icon/Icon.style.ts b/src/src/components/kit_v2/Icon/Icon.style.ts new file mode 100644 index 00000000..28f05ed1 --- /dev/null +++ b/src/src/components/kit_v2/Icon/Icon.style.ts @@ -0,0 +1,36 @@ +import { Slot } from '@radix-ui/react-slot'; + +import { styled } from 'config/stitches'; + +const Container: any = styled('div', { + display: 'inline-flex', + ai: 'center', + jc: 'center', + size: '$1', +}); + +const IconWrapper = styled('i', { + display: 'inline-flex', + ai: 'center', + jc: 'center', + variants: { + size: { + sm: { + size: '12px', + }, + md: { + size: '16px', + }, + lg: { + size: '$1', + }, + }, + }, +}); + +const IconSlot = styled(Slot, { + width: '100%', + height: '100%', +}); + +export { Container, IconWrapper, IconSlot }; diff --git a/src/src/components/kit_v2/Icon/Icon.test.tsx b/src/src/components/kit_v2/Icon/Icon.test.tsx new file mode 100644 index 00000000..51f0f92a --- /dev/null +++ b/src/src/components/kit_v2/Icon/Icon.test.tsx @@ -0,0 +1,30 @@ +import { IconDeviceCctvOff } from '@tabler/icons-react'; +import { render } from '@testing-library/react'; + +import Icon from './Icon'; + +// Test of Button component +describe('} />', () => { + test('Renders Correctly', () => { + const { asFragment } = render(} />); + expect(asFragment()).toMatchSnapshot(); + }); + + // test size prop + test('size prop works properly', () => { + const { getByTestId } = render( + } size='sm' />, + ); + const icon = getByTestId('icon'); + expect(icon).toHaveStyle('width: 12px, height: 12px'); + }); + + // test css prop + test('css prop works properly', () => { + const { getByTestId } = render( + } css={{ color: 'red' }} />, + ); + const icon = getByTestId('icon'); + expect(icon).toHaveStyle("color: 'red'"); + }); +}); diff --git a/src/src/components/kit_v2/Icon/Icon.tsx b/src/src/components/kit_v2/Icon/Icon.tsx new file mode 100644 index 00000000..6e5ac040 --- /dev/null +++ b/src/src/components/kit_v2/Icon/Icon.tsx @@ -0,0 +1,40 @@ +import React from 'react'; + +import { IIconProps } from './Icon.d'; +import { Container, IconSlot, IconWrapper } from './Icon.style'; + +/** + * Icon component + * @param {string} size + * @param {React.ReactNode} icon + * @param {string} color + * @param {CSS} css + * @param {IIconProps} props + * @returns {React.FunctionComponentElement} + * @example + * + * } /> + * } size="sm" css={{ color: 'red' }}/> + */ +const Icon = React.forwardRef, IIconProps>( + ( + { size = 'lg', css, icon, color, ...props }: IIconProps, + forwardedRef, + ): React.FunctionComponentElement => { + return ( + + + {icon} + + + ); + }, +); + +Icon.displayName = 'Icon'; +export default React.memo(Icon); diff --git a/src/src/components/kit_v2/Icon/__snapshots__/Icon.test.tsx.snap b/src/src/components/kit_v2/Icon/__snapshots__/Icon.test.tsx.snap new file mode 100644 index 00000000..bc28ff98 --- /dev/null +++ b/src/src/components/kit_v2/Icon/__snapshots__/Icon.test.tsx.snap @@ -0,0 +1,48 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`} /> Renders Correctly 1`] = ` + +
+ + + + + + + + + + +
+
+`; diff --git a/src/src/components/kit_v2/Icon/index.ts b/src/src/components/kit_v2/Icon/index.ts new file mode 100644 index 00000000..2c1589a8 --- /dev/null +++ b/src/src/components/kit_v2/Icon/index.ts @@ -0,0 +1,4 @@ +import Icon from './Icon'; + +export * from './Icon.d'; +export default Icon; diff --git a/src/src/components/kit_v2/IconButton/IconButton.d.ts b/src/src/components/kit_v2/IconButton/IconButton.d.ts new file mode 100644 index 00000000..0c426b46 --- /dev/null +++ b/src/src/components/kit_v2/IconButton/IconButton.d.ts @@ -0,0 +1,47 @@ +import React from 'react'; + +import { CSS, ColorPaletteType } from 'config/stitches/types'; + +import { ButtonVariantType } from '../Button'; +export interface IIconButtonProps + extends Partial> { + /** + * @description The name of the icon + * @example 'add' + */ + icon: React.ReactNode; + /** + * @description The color of the icon button + * @example 'primary' + */ + color?: ColorPaletteType; + /** + * @description The size of the icon button + * @example 'md' + * @default 'md' + */ + size?: sizeType; + /** + * @description The variant of the icon button + * @example 'contained' + * @default 'contained' + */ + variant?: ButtonVariantType; + /** + * @description The disabled state of the icon button + * @example false + * @default false + */ + disabled?: boolean; + /** + * @description The css prop of the icon button + * @example { backgroundColor: 'red' } + * @default {} + */ + css?: CSS; +} + +// IconButton component size types +type sizeType = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; + +// IconButton component variants diff --git a/src/src/components/kit_v2/IconButton/IconButton.style.ts b/src/src/components/kit_v2/IconButton/IconButton.style.ts new file mode 100644 index 00000000..2d1c18af --- /dev/null +++ b/src/src/components/kit_v2/IconButton/IconButton.style.ts @@ -0,0 +1,43 @@ +import { styled } from 'config/stitches'; + +const Container = styled('button', { + all: 'unset', + display: 'inline-flex', + width: 'fit-content', + ai: 'center', + jc: 'center', + fontWeight: '$2', + cursor: 'pointer', + borderRadius: '$3', + transition: 'all 0.2s ease-in-out', + fontSize: '$2', + variants: { + size: { + xs: { + size: '$1', + }, + sm: { + size: '$2', + }, + md: { + size: '$3', + }, + lg: { + size: '$5', + fontSize: '$3', + }, + xl: { + size: '$7', + fontSize: '$3', + }, + }, + variant: { + contained: {}, + outlined: {}, + ghost: {}, + static: {}, + }, + }, +}); + +export { Container }; diff --git a/src/src/components/kit_v2/IconButton/IconButton.test.tsx b/src/src/components/kit_v2/IconButton/IconButton.test.tsx new file mode 100644 index 00000000..b5157434 --- /dev/null +++ b/src/src/components/kit_v2/IconButton/IconButton.test.tsx @@ -0,0 +1,22 @@ +import { render } from '@testing-library/react'; + +import IconButton from './IconButton'; + +// Test of IconButton component +describe('', () => { + test('Renders Correctly', () => { + const { asFragment } = render(); + expect(asFragment()).toMatchSnapshot(); + }); + + // test onClick event + test('onClick event works properly', () => { + const onClick = jest.fn(); + const { getByTestId } = render( + , + ); + const button = getByTestId('icon-button'); + button.click(); + expect(onClick).toHaveBeenCalled(); + }); +}); diff --git a/src/src/components/kit_v2/IconButton/IconButton.tsx b/src/src/components/kit_v2/IconButton/IconButton.tsx new file mode 100644 index 00000000..cd72ea18 --- /dev/null +++ b/src/src/components/kit_v2/IconButton/IconButton.tsx @@ -0,0 +1,54 @@ +import React from 'react'; + +import Icon from 'components/kit_v2/Icon'; + +import { getButtonStyles } from '../utils/getButtonStyles'; + +import { IIconButtonProps } from './IconButton.d'; +import { Container } from './IconButton.style'; + +/** + * @description IconButton component + * IconButton component params + * @param {string} icon - Icon of the button + * @param {string} size - Size of the button + * @param {string} color - Color of the button + * @param {string} variant - Variant of the button + * @param {boolean} disabled - Disabled state of the button + * @returns {React.FunctionComponentElement} - React component + * @example + * + */ +const IconButton = React.forwardRef< + React.ElementRef, + IIconButtonProps +>( + ( + { + icon, + size = 'sm', + color = 'primary', + variant = 'contained', + disabled = false, + css, + ...props + }: IIconButtonProps, + forwardedRef, + ): React.FunctionComponentElement => { + return ( + + + + ); + }, +); + +export default React.memo(IconButton); diff --git a/src/src/components/kit_v2/IconButton/__snapshots__/IconButton.test.tsx.snap b/src/src/components/kit_v2/IconButton/__snapshots__/IconButton.test.tsx.snap new file mode 100644 index 00000000..c56777fe --- /dev/null +++ b/src/src/components/kit_v2/IconButton/__snapshots__/IconButton.test.tsx.snap @@ -0,0 +1,14 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` Renders Correctly 1`] = ` + + + +`; diff --git a/src/src/components/kit_v2/IconButton/index.ts b/src/src/components/kit_v2/IconButton/index.ts new file mode 100644 index 00000000..0fa129c3 --- /dev/null +++ b/src/src/components/kit_v2/IconButton/index.ts @@ -0,0 +1,4 @@ +import IconButton from './IconButton'; + +export * from './IconButton.d'; +export default IconButton; diff --git a/src/src/components/kit_v2/Input/Input.d.ts b/src/src/components/kit_v2/Input/Input.d.ts new file mode 100644 index 00000000..edd3774f --- /dev/null +++ b/src/src/components/kit_v2/Input/Input.d.ts @@ -0,0 +1,45 @@ +import React from 'react'; + +import { CSS } from 'config/stitches/types'; + +// The Input component interface. +export interface IInputProps extends React.HTMLProps { + /** + * The Input placeholder. + * @default '' + */ + placeholder?: string; + /** + * The Input size. + * @default 'md' + */ + inputSize?: 'md' | 'lg' | 'xl'; + /** + * The error state. + * @default false + */ + error?: boolean; + /** + * The caption string. + */ + caption?: string; + /** + * The Input error message. + */ + errorMessage?: string; + /** + * The Input disabled state. + * @default false + */ + disabled?: boolean; + /** + * The Input left icon. + */ + leftIcon?: React.ReactNode; + /** + * The Input css prop. + * @default {} + * @example { backgroundColor: 'red' } + */ + css?: CSS; +} diff --git a/src/src/components/kit_v2/Input/Input.style.ts b/src/src/components/kit_v2/Input/Input.style.ts new file mode 100644 index 00000000..ab818825 --- /dev/null +++ b/src/src/components/kit_v2/Input/Input.style.ts @@ -0,0 +1,197 @@ +import Icon from 'components/kit_v2/Icon'; + +import { styled } from 'config/stitches'; + +const Container = styled('div', { + display: 'flex', + fd: 'column', +}); + +const LeftIcon = styled(Icon, { + position: 'absolute', + display: 'flex', + ai: 'center', + jc: 'center', + size: '$sizes$1', + color: '$secondary50', + pointerEvents: 'none', + variants: { + inputSize: { + md: { + left: '$space$4', + }, + lg: { + left: '$space$5', + }, + xl: { + left: '$space$6', + }, + }, + focused: { + true: { + color: '$textPrimary !important', + }, + }, + disabled: { + true: { + color: '$secondary30', + }, + }, + }, +}); + +const InputWrapper = styled('div', { + position: 'relative', + display: 'flex', + ai: 'center', + '&:hover': { + [`& ${LeftIcon}`]: { + color: '$secondary100', + }, + }, + variants: { + disabled: { + true: { + cursor: 'not-allowed', + pointerEvents: 'none', + color: '$secondary30', + }, + }, + }, +}); + +const InputContainer: any = styled('input', { + border: 'none', + outline: 'none', + height: '100%', + width: '100%', + color: '$textPrimary', + bs: '0px 0px 0px 1px $colors$secondary50', + br: '$3', + fontSize: '$3', + p: 0, + '&::placeholder': { + color: '$textPrimary50', + }, + '&:hover': { + bs: '0px 0px 0px 1px $colors$secondary100', + }, + '&:focus': { + bs: '0px 0px 0px 1px $colors$primary100', + }, + variants: { + leftIcon: { true: {} }, + size: { + md: { + height: '$sizes$3', + pl: '$6', + pr: '$16', + }, + lg: { + pl: '$7', + pr: '$17', + height: '$sizes$5', + }, + xl: { + pl: '$8', + pr: '$18', + height: '$sizes$7', + }, + }, + error: { + true: { + bs: '0px 0px 0px 1px $colors$danger100 !important', + }, + }, + disabled: { + true: { + color: '$textPrimary50', + }, + }, + }, + compoundVariants: [ + { + leftIcon: true, + size: 'md', + css: { + pl: '$16', + }, + }, + { + leftIcon: true, + size: 'lg', + css: { + pl: '$17', + }, + }, + { + leftIcon: true, + size: 'xl', + css: { + pl: '$18', + }, + }, + ], +}); + +const ClearButtonContainer = styled('div', { + position: 'absolute', + display: 'flex', + ai: 'center', + jc: 'center', + size: '$sizes$1', + cursor: 'pointer', + '& .Icon__container': { + display: 'flex', + ai: 'center', + jc: 'center', + p: '3px', + '& > i': { + background: '$secondary20', + color: '#5A667A', + br: '$round', + height: '100%', + p: '1px', + }, + }, + variants: { + size: { + md: { + right: '$4', + }, + lg: { + right: '$5', + }, + xl: { + right: '$6', + }, + }, + }, +}); + +const Caption = styled('p', { + fontSize: '$2', + mt: '2px', + color: '$textPrimary50', + variants: { + error: { + true: { + color: '$danger100', + }, + }, + disabled: { + true: { + color: '$secondary30', + }, + }, + }, +}); + +export { + Container, + InputContainer, + InputWrapper, + LeftIcon, + ClearButtonContainer, + Caption, +}; diff --git a/src/src/components/kit_v2/Input/Input.tsx b/src/src/components/kit_v2/Input/Input.tsx new file mode 100644 index 00000000..d19b50c6 --- /dev/null +++ b/src/src/components/kit_v2/Input/Input.tsx @@ -0,0 +1,132 @@ +import React from 'react'; + +import { IconX } from '@tabler/icons-react'; + +import Icon from 'components/kit_v2/Icon'; + +import { IInputProps } from './Input.d'; +import { + Caption, + ClearButtonContainer, + Container, + InputContainer, + InputWrapper, + LeftIcon, +} from './Input.style'; + +/** + * @description Input component + * Input component params + * @param {string} value - Value of the input + * @param {string} inputSize - Size of the input + * @param {string} placeholder - Placeholder of the input + * @param {boolean} error - Error state of the input + * @param {object} inputElementProps - Props of the input element + * @param {string} caption - Caption of the input + * @param {string} errorMessage - Error message of the input + * @param {string} leftIcon - Left icon of the input + * @param {boolean} disabled - Disabled state of the input + * @param {function} onChange - On change callback of the input + * @returns {React.FunctionComponentElement} - React component + * @example + * + */ +const Input = React.forwardRef, IInputProps>( + ( + { + inputSize = 'md', + placeholder, + error, + caption, + errorMessage, + leftIcon, + disabled, + css = {}, + ...props + }: IInputProps, + forwardedRef, + ): React.FunctionComponentElement => { + const [inputValue, setInputValue] = React.useState(props.value || ''); + const [isFocused, setIsFocused] = React.useState(false); + + React.useEffect(() => { + if (props.value !== inputValue) { + setInputValue(props.value); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [props.value]); + + const handleChange = React.useCallback( + (event: React.ChangeEvent) => { + let { value } = event.target; + setInputValue(value); + if (props.onChange) { + props.onChange(event); + } + }, + [props], + ); + + const handleClear = React.useCallback(() => { + if (disabled) return; + setInputValue(''); + if (props.onChange) { + props.onChange({ + target: { value: '' }, + } as React.ChangeEvent); + } + }, [disabled, props]); + + const onFocus = React.useCallback(() => { + setIsFocused(true); + }, []); + + const onBlur = React.useCallback(() => { + setIsFocused(false); + }, []); + + return ( + + + {leftIcon && ( + + )} + + + } /> + + + {errorMessage || caption ? ( +
+ ) : null} + + ); + }, +); + +Input.displayName = 'Input'; +export default React.memo(Input); diff --git a/src/src/components/kit_v2/Input/index.ts b/src/src/components/kit_v2/Input/index.ts new file mode 100644 index 00000000..d8d636d6 --- /dev/null +++ b/src/src/components/kit_v2/Input/index.ts @@ -0,0 +1,4 @@ +import Input from './Input'; + +export * from './Input.d'; +export default Input; diff --git a/src/src/components/kit_v2/ListItem/ListItem.d.ts b/src/src/components/kit_v2/ListItem/ListItem.d.ts new file mode 100644 index 00000000..7a0ae5ad --- /dev/null +++ b/src/src/components/kit_v2/ListItem/ListItem.d.ts @@ -0,0 +1,56 @@ +import React from 'react'; + +import { CSS } from 'config/stitches/types'; + +/** + * @description List item component props + */ +export interface IListItemProps + extends Partial> { + /** + * @description The size of the list item + * @example 'md' + * @default 'md' + */ + size?: ListItemSize; + /** + * @description The onClick event handler + * @example () => {} + * @type () => void + * @default undefined + * @optional true + */ + onClick?: (event: React.MouseEvent) => void; + /** + * @description The children of the list item + * @example
children
+ * @type React.ReactNode + * @default undefined + * @optional true + */ + children?: React.ReactNode; + /** + * @description The left node of the list item + * @example
left node
+ * @type React.ReactNode + * @default undefined + * @optional true + */ + leftNode?: React.ReactNode; + /** + * @description The right node of the list item + * @example
right node
+ * @type React.ReactNode + * @default undefined + * @optional true + */ + rightNode?: React.ReactNode; + /** + * @description The css of the list item + * @example { color: 'red' } + * @type CSS + */ + css?: CSS; +} + +export type ListItemSize = 'sm' | 'md' | 'lg'; diff --git a/src/src/components/kit_v2/ListItem/ListItem.style.ts b/src/src/components/kit_v2/ListItem/ListItem.style.ts new file mode 100644 index 00000000..09abf2ed --- /dev/null +++ b/src/src/components/kit_v2/ListItem/ListItem.style.ts @@ -0,0 +1,39 @@ +import { styled } from 'config/stitches'; + +const Container = styled('div', { + display: 'flex', + ai: 'center', + p: '0 $5', + br: '$3', + transition: 'all 0.2s ease-out', + cursor: 'pointer', + color: '#454545', + fontSize: '$3', + '&:hover': { + bc: '#EFF0F2', + }, + variants: { + size: { + sm: { + height: '$1', + }, + md: { + height: '$3', + }, + lg: { + height: '$5', + }, + }, + }, +}); + +const Content = styled('div', { + maxWidth: '100%', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', + overflow: 'hidden', + m: '0 $3', + flex: 1, +}); + +export { Container, Content }; diff --git a/src/src/components/kit_v2/ListItem/ListItem.tsx b/src/src/components/kit_v2/ListItem/ListItem.tsx new file mode 100644 index 00000000..c9633b2f --- /dev/null +++ b/src/src/components/kit_v2/ListItem/ListItem.tsx @@ -0,0 +1,49 @@ +import React from 'react'; + +import { IListItemProps } from './ListItem.d'; +import { Container, Content } from './ListItem.style'; + +/** + * ListItem component + * @param {React.ReactNode} children - children + * @param {function} onClick - onClick handler + * @param {ListItemSize} size - size of the ListItem + * @param {React.ReactNode} rightNode - right node + * @param {React.ReactNode} leftNode - left node + * @param {IListItemProps} rest - rest props + * @returns {React.FunctionComponentElement} + */ +const ListItem = React.forwardRef< + React.ElementRef, + IListItemProps +>( + ( + { + size = 'md', + children, + leftNode, + rightNode, + css = {}, + onClick, + ...rest + }: IListItemProps, + forwardedRef, + ): React.FunctionComponentElement => { + return ( + null} + size={size} + css={css} + ref={forwardedRef} + > + {leftNode ? leftNode : null} + {children} + {rightNode ? rightNode : null} + + ); + }, +); + +ListItem.displayName = 'ListItem'; +export default React.memo(ListItem); diff --git a/src/src/components/kit_v2/ListItem/index.ts b/src/src/components/kit_v2/ListItem/index.ts new file mode 100644 index 00000000..1a4aabb9 --- /dev/null +++ b/src/src/components/kit_v2/ListItem/index.ts @@ -0,0 +1,4 @@ +import ListItem from './ListItem'; + +export * from './ListItem.d'; +export default ListItem; diff --git a/src/src/components/kit_v2/Popover/Popover.d.ts b/src/src/components/kit_v2/Popover/Popover.d.ts new file mode 100644 index 00000000..4c1884a2 --- /dev/null +++ b/src/src/components/kit_v2/Popover/Popover.d.ts @@ -0,0 +1,33 @@ +import { PopperContentProps } from '@radix-ui/react-popover'; + +import { CSS } from 'config/stitches/types'; + +// Interface of the Popover component +export interface IPopoverProps { + /** + * Popover content + */ + content: React.ReactNode | any; + /** + * Trigger element + @default: + */ + trigger: React.ReactNode | (({ open: boolean }) => React.ReactNode); + /** + * popper props + */ + popperProps?: PopperProps; + /** + * Popover is default open + @default: false + */ + defaultOpen?: boolean; +} + +export interface PopperProps extends Partial { + /** + * styles for popper + * @default: {} + * */ + css?: CSS; +} diff --git a/src/src/components/kit_v2/Popover/Popover.style.ts b/src/src/components/kit_v2/Popover/Popover.style.ts new file mode 100644 index 00000000..43c02532 --- /dev/null +++ b/src/src/components/kit_v2/Popover/Popover.style.ts @@ -0,0 +1,50 @@ +import * as PopoverPrimitive from '@radix-ui/react-popover'; + +import { keyframes, styled } from 'config/stitches'; + +const slideUpAndFade = keyframes({ + '0%': { opacity: 0, transform: 'translateY(2px)' }, + '100%': { opacity: 1, transform: 'translateY(0)' }, +}); + +const slideRightAndFade = keyframes({ + '0%': { opacity: 0, transform: 'translateX(-2px)' }, + '100%': { opacity: 1, transform: 'translateX(0)' }, +}); + +const slideDownAndFade = keyframes({ + '0%': { opacity: 0, transform: 'translateY(-2px)' }, + '100%': { opacity: 1, transform: 'translateY(0)' }, +}); + +const slideLeftAndFade = keyframes({ + '0%': { opacity: 0, transform: 'translateX(2px)' }, + '100%': { opacity: 1, transform: 'translateX(0)' }, +}); + +const StyledContent = styled(PopoverPrimitive.Content, { + borderRadius: 4, + padding: 20, + width: 260, + zIndex: '$popover', + backgroundColor: 'white', + boxShadow: + 'hsl(206 22% 7% / 35%) 0px 10px 38px -10px, hsl(206 22% 7% / 20%) 0px 10px 20px -15px', + '@media (prefers-reduced-motion: no-preference)': { + animationDuration: '400ms', + animationTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)', + willChange: 'transform, opacity', + '&[data-state="open"]': { + '&[data-side="top"]': { animationName: slideDownAndFade }, + '&[data-side="right"]': { animationName: slideLeftAndFade }, + '&[data-side="bottom"]': { animationName: slideUpAndFade }, + '&[data-side="left"]': { animationName: slideRightAndFade }, + }, + }, + '&:focus': { + boxShadow: + "hsl(206 22% 7% / 35%) 0px 10px 38px -10px, hsl(206 22% 7% / 20%) 0px 10px 20px -15px, 0 0 0 2px 'black'", + }, +}); + +export { StyledContent }; diff --git a/src/src/components/kit_v2/Popover/Popover.tsx b/src/src/components/kit_v2/Popover/Popover.tsx new file mode 100644 index 00000000..22f3cc9e --- /dev/null +++ b/src/src/components/kit_v2/Popover/Popover.tsx @@ -0,0 +1,56 @@ +import React from 'react'; + +import * as PopoverPrimitive from '@radix-ui/react-popover'; + +import { IPopoverProps } from './Popover.d'; +import { StyledContent } from './Popover.style'; + +/** + * @description Popover component is for displaying a popover with a title, description, and actions + * Popover component params + * @param {React.ReactNode} trigger - React children + * @param {React.ReactNode} content - React children + * @param {boolean} defaultOpen - Default open state of the popover + * @param {PopperProps} popperProps - Popper props + * @returns {React.FunctionComponentElement} + * @constructor + * @example + * Open popover} + * content={Popover content} + * /> + */ +function Popover({ + trigger, + content, + defaultOpen, + popperProps, +}: IPopoverProps): React.FunctionComponentElement { + const [open, setOpen] = React.useState(defaultOpen); + + const handleOpenChange = React.useCallback((val: boolean) => { + setOpen(val); + }, []); + + return ( + + + {typeof trigger === 'function' ? trigger({ open }) : trigger} + + + + {content} + + + + ); +} + +Popover.displayName = 'Popover'; +export default React.memo(Popover); diff --git a/src/src/components/kit_v2/Popover/index.ts b/src/src/components/kit_v2/Popover/index.ts new file mode 100644 index 00000000..497a8666 --- /dev/null +++ b/src/src/components/kit_v2/Popover/index.ts @@ -0,0 +1,3 @@ +import Popover from './Popover'; + +export default Popover; diff --git a/src/src/components/kit_v2/QueryBadge/QueryBadge.d.ts b/src/src/components/kit_v2/QueryBadge/QueryBadge.d.ts new file mode 100644 index 00000000..235a6f73 --- /dev/null +++ b/src/src/components/kit_v2/QueryBadge/QueryBadge.d.ts @@ -0,0 +1,29 @@ +import { IButtonProps } from '../Button'; + +/** + * @description QueryBadge component props + */ +export interface IQueryBadgeProps extends IButtonProps { + /** + * @description QueryBadge component children + * @default null + * @type {React.ReactNode} + */ + children?: React.ReactNode; + /** + * @description QueryBadge component size + * @default 'md' + */ + size?: 'sm' | 'md' | 'lg' | 'xl'; + /** + * @description QueryBadge component color + * @default 'primary' + */ + color?: 'primary' | 'secondary'; + /** + * @description QueryBadge component disabled state + * @default false + * @type boolean + */ + disabled?: boolean; +} diff --git a/src/src/components/kit_v2/QueryBadge/QueryBadge.style.ts b/src/src/components/kit_v2/QueryBadge/QueryBadge.style.ts new file mode 100644 index 00000000..25d6c693 --- /dev/null +++ b/src/src/components/kit_v2/QueryBadge/QueryBadge.style.ts @@ -0,0 +1,9 @@ +import { styled } from 'config/stitches'; + +import Text from '../Text'; + +const ButtonText = styled(Text, { + color: '$textPrimary', +}); + +export { ButtonText }; diff --git a/src/src/components/kit_v2/QueryBadge/QueryBadge.tsx b/src/src/components/kit_v2/QueryBadge/QueryBadge.tsx new file mode 100644 index 00000000..c79183f1 --- /dev/null +++ b/src/src/components/kit_v2/QueryBadge/QueryBadge.tsx @@ -0,0 +1,73 @@ +import React from 'react'; + +import { IconEye } from '@tabler/icons-react'; + +import ButtonGroup from '../ButtonGroup'; +import Button from '../Button'; +import IconButton from '../IconButton'; + +import { IQueryBadgeProps } from './QueryBadge.d'; +import { ButtonText } from './QueryBadge.style'; + +/** + * @component QueryBadge + * @description QueryBadge component + * @param {string} size - size of the QueryBadge + * @param {string} color - color of the QueryBadge + * @param {boolean} disabled - disabled state of the QueryBadge + * @returns {React.FunctionComponentElement} - React component + * @example + * + */ +const QueryBadge = React.forwardRef< + React.ElementRef, + IQueryBadgeProps +>( + ( + { + size = 'sm', + color = 'secondary', + disabled = false, + variant = 'outlined', + children, + ...rest + }: IQueryBadgeProps, + forwardedRef, + ): React.FunctionComponentElement => { + return ( + + + } + css={color === 'primary' ? { bc: '$primary10' } : {}} + /> + + ); + }, +); + +QueryBadge.displayName = 'QueryBadge'; +export default React.memo(QueryBadge); diff --git a/src/src/components/kit_v2/QueryBadge/index.ts b/src/src/components/kit_v2/QueryBadge/index.ts new file mode 100644 index 00000000..6762b9db --- /dev/null +++ b/src/src/components/kit_v2/QueryBadge/index.ts @@ -0,0 +1,4 @@ +import QueryBadge from './QueryBadge'; + +export * from './QueryBadge.d'; +export default QueryBadge; diff --git a/src/src/components/kit_v2/Radio/Radio.d.ts b/src/src/components/kit_v2/Radio/Radio.d.ts new file mode 100644 index 00000000..4c46d1e3 --- /dev/null +++ b/src/src/components/kit_v2/Radio/Radio.d.ts @@ -0,0 +1,19 @@ +import { RadioGroupItemProps } from '@radix-ui/react-radio-group'; + +export interface IRadioItemProps extends RadioGroupItemProps { + /** + * The value of the radio button. + * @default '' + */ + value: string; + /** + * The disabled state of the radio button. + * @default false + */ + disabled?: boolean; + /** + * The required state of the radio button. + * @default false + */ + required?: boolean; +} diff --git a/src/src/components/kit_v2/Radio/Radio.style.ts b/src/src/components/kit_v2/Radio/Radio.style.ts new file mode 100644 index 00000000..4cf4822e --- /dev/null +++ b/src/src/components/kit_v2/Radio/Radio.style.ts @@ -0,0 +1,85 @@ +import { Root, Item, Indicator } from '@radix-ui/react-radio-group'; + +import { styled } from 'config/stitches'; + +const StyledRadioGroup = styled(Root, {}); + +const IndicatorWrapper = styled('span', { + all: 'unset', + display: 'inline-block', + bc: 'white', + width: 12, + height: 12, + br: '$round', + transition: '$main', + bs: 'inset 0 0 0 1px $colors$secondary100', + cursor: 'pointer', +}); + +const RadioGroupIndicator = styled(Indicator, { + display: 'flex', + ai: 'center', + jc: 'center', + width: '100%', + height: '100%', + position: 'relative', + transition: '$main', + '&::after': { + content: '""', + display: 'block', + width: 6, + height: 6, + br: '50%', + bc: '$primary100', + }, +}); + +const RadioItem = styled(Item, { + all: 'unset', + bc: 'white', + size: '$1', + br: '$round', + transition: '$main', + display: 'flex', + ai: 'center', + jc: 'center', + cursor: 'pointer', + '&:hover': { + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$primary100', + }, + }, + '&[data-state="checked"]': { + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$primary100', + }, + }, +}); + +const Flex = styled('div', { + display: 'flex', + '&[data-disabled]': { + pointerEvents: 'none', + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$secondary50 !important', + }, + [`& ${RadioGroupIndicator}`]: { + '&::after': { + bc: '$secondary50', + }, + }, + }, +}); + +const RadioLabel = styled('label', { + cursor: 'pointer', +}); + +export { + StyledRadioGroup, + RadioItem, + RadioGroupIndicator, + IndicatorWrapper, + Flex, + RadioLabel, +}; diff --git a/src/src/components/kit_v2/Radio/Radio.tsx b/src/src/components/kit_v2/Radio/Radio.tsx new file mode 100644 index 00000000..505186b8 --- /dev/null +++ b/src/src/components/kit_v2/Radio/Radio.tsx @@ -0,0 +1,53 @@ +import React from 'react'; + +import { RadioGroupProps } from '@radix-ui/react-radio-group'; + +import { IRadioItemProps } from './Radio.d'; +import { + Flex, + IndicatorWrapper, + RadioGroupIndicator, + RadioItem, + RadioLabel, + StyledRadioGroup, +} from './Radio.style'; + +/** + * @description Radio component is for displaying a radio button + * Radio component params + * @param {React.ReactNode} children - React children + * @param {props} props - RadioGroupProps + * @returns {React.FunctionComponentElement} + * @constructor + * @example + * + * Radio 1 + * Radio 2 + * + */ +export const RadioGroup = React.forwardRef< + React.ElementRef, + RadioGroupProps +>(({ children, ...props }: RadioGroupProps) => ( + {children} +)); + +const Radio = React.forwardRef, IRadioItemProps>( + ({ ...props }: IRadioItemProps, forwardedRef) => ( + + + + + + + {props.children ? ( + + {props.children} + + ) : null} + + ), +); + +Radio.displayName = 'Radio'; +export default React.memo(Radio); diff --git a/src/src/components/kit_v2/Radio/index.ts b/src/src/components/kit_v2/Radio/index.ts new file mode 100644 index 00000000..0a24668a --- /dev/null +++ b/src/src/components/kit_v2/Radio/index.ts @@ -0,0 +1,4 @@ +import RadioItem from './Radio'; + +export * from './Radio.d'; +export default RadioItem; diff --git a/src/src/components/kit_v2/Select/Select.d.ts b/src/src/components/kit_v2/Select/Select.d.ts new file mode 100644 index 00000000..d0b16886 --- /dev/null +++ b/src/src/components/kit_v2/Select/Select.d.ts @@ -0,0 +1,123 @@ +import React from 'react'; + +import { CSS } from 'config/stitches/types'; + +import { IPopoverProps } from '../Popover/Popover'; + +// The interface of the Select + +export interface ISelectProps { + /** + * @description The size of the select + * @example 'md' + * @default 'md' + */ + size?: SelectSizeType; + /** + * @description The onChange event handler + * @example () => {} + * @type () => void + * @default undefined + */ + onChange?: (event: React.ChangeEvent) => void; + /** + * @description The options of the select + * @example [{group: 'Metrics', options: [{value: 'metric1', label: 'Metric 1'}]}] + * @type ISelectOption[] + * @default undefined + */ + options?: SelectOptionType[]; + /** + * @description The value of the select + * @example 'metric1' | ['metric1', 'metric2'] + * @type string | string[] + * @default undefined + */ + value?: string | string[]; + /** + * @description The multiple select + * @example false + */ + multiple?: boolean; + /** + * @description The css of the list item + * @example { color: 'red' } + * @type CSS + */ + css?: CSS; + /** + * @description The disabled state of the list item + * @example false + */ + disabled?: boolean; + /** + * @description The trigger of the list item + * @example + */ + trigger?: React.ReactNode; + /** + * @description The popper props of the Select component + * @example sideOffset: 8 + */ + popoverProps?: IPopoverProps; + /** + * @description onValueChange event handler + * @example (val: string) => {} + * @type (val: string) => void + */ + onValueChange: (val: string) => void; + /** + * @description the height of the select + * @example 400 + * @default 400 + * @type number + */ + height?: number; + /** + * @description searchability of the select + * @example false + * @default false + */ + searchable?: boolean; +} + +type SelectOptionType = { + group?: string; + options?: { value: string; label: string | React.ReactNode }[]; +}; + +type SelectSizeType = 'sm' | 'md' | 'lg'; +export interface ISelectItemProps { + /** + * @description The data of the item + * @example {items, value, onValueChange, multiple, size} + * @required + */ + data: { + items: SelectItemType[]; + value: string | string[] | undefined; + onValueChange: (val: string) => void; + multiple?: boolean | undefined; + size: SelectSizeType; + }; + /** + * @description The index of the item + * @example 0 + * @type number + * @required + */ + index: number; + /** + * @description The style of the item + * @example { color: 'red' } + * @type CSS + * @required + */ + style: React.CSSProperties; +} + +export type SelectItemType = { + value?: string; + label?: string | React.ReactNode; + group?: string; +}; diff --git a/src/src/components/kit_v2/Select/Select.test.tsx b/src/src/components/kit_v2/Select/Select.test.tsx new file mode 100644 index 00000000..fc6e7565 --- /dev/null +++ b/src/src/components/kit_v2/Select/Select.test.tsx @@ -0,0 +1,36 @@ +import { render } from '@testing-library/react'; + +import Select from './'; + +// Test of Select component +describe('Select component', () => { + const options = [ + { + group: 'Group 1', + options: [ + { value: 'test1', label: 'Test 1' }, + { value: 'test2', label: 'Test 2' }, + ], + }, + ]; + + it('should render with options', () => { + const { container } = render( + {}} + />, + ); + expect(container).toBeInTheDocument(); + }); +}); diff --git a/src/src/components/kit_v2/Select/Select.tsx b/src/src/components/kit_v2/Select/Select.tsx new file mode 100644 index 00000000..68174a49 --- /dev/null +++ b/src/src/components/kit_v2/Select/Select.tsx @@ -0,0 +1,200 @@ +import React from 'react'; +import { FixedSizeList as List } from 'react-window'; + +import Popover from '../Popover'; +import Button from '../Button'; +import Box from '../Box'; +import Text from '../Text'; +import Input from '../Input'; + +import { ISelectProps, ISelectItemProps } from './Select.d'; +import SelectItem from './SelectItem'; + +const sizeDict = { + sm: 20, + md: 24, + lg: 28, +}; + +/** + * @description Virtualized Select component with search + * @param {boolean} multiple - whether multiple select + * @param {React.ReactNode} trigger - trigger element + * @param {PopoverProps} popoverProps - popover props + * @param {string | string[] | undefined } value - selected value + * @param {(val: string | string[]) => void} onValueChange - on value change callback + * @param {boolean} searchable - whether searchable + * @param {ISelectItemProps['data']['items']} options - options + * @param {('sm' | 'md' | 'lg')} size - size + * @param {number} height - the height of the list + * @returns {React.FunctionComponentElement} + */ +const Select = ({ + multiple, + trigger, + popoverProps, + value, + onValueChange, + searchable, + options = [], + size = 'md', + height = 256, +}: ISelectProps) => { + const [search, setSearch] = React.useState(''); + + const onSearchChange = React.useCallback((e) => { + setSearch(e.target.value); + }, []); + + const flattenOptions: ISelectItemProps['data']['items'] | [] = + React.useMemo(() => { + if (options.length > 0) { + return options + ?.map((item) => { + if (item.group) { + return [{ group: item.group }, ...item.options!]; + } else { + return [...item.options!]; + } + }) + .flat(); + } else { + return []; + } + }, [options]); + + const searchedOptions: ISelectItemProps['data']['items'] | [] = + React.useMemo(() => { + let data: ISelectItemProps['data']['items'] | any[] = []; + if (searchable && options.length > 0) { + data = options + ?.map((item) => { + const filteredData = item?.options + ?.filter((option) => { + if (option.label) { + return (option.label as string) + .toLowerCase() + .includes(search.toLowerCase()); + } + return false; + }) + .map((opt: any) => { + const searchVal = search.toLowerCase(); + const index = opt.label.toLowerCase().indexOf(searchVal); + const beforeStr = opt.label.substring(0, index); + const afterStr = opt.label.slice(index + search.length); + const middleStr = opt.label.substring( + index, + index + search.length, + ); + const title = + index > -1 ? ( + <> + {beforeStr} + {middleStr} + {afterStr} + + ) : ( + opt.label + ); + return { ...opt, label: title }; + }); + + if (filteredData?.length) { + return { ...item, options: filteredData }; + } + return null; + }) + .filter(Boolean); + } + + if (data?.length > 0) { + const flatten = data + ?.map((item) => { + if (item.group) { + return [{ group: item.group }, ...item.options]; + } else { + return [...item.options]; + } + }) + .flat(); + return flatten; + } + return []; + }, [options, search, searchable]); + + const noResults: boolean = React.useMemo(() => { + if (searchable) { + return ( + !!search && searchedOptions.length === 0 && flattenOptions?.length > 0 + ); + } + return false; + }, [search, searchable, searchedOptions, flattenOptions]); + + const data: ISelectItemProps['data'] = React.useMemo(() => { + const items = searchable ? searchedOptions : flattenOptions; + return { + items: noResults ? flattenOptions : items, + value, + onValueChange, + multiple, + size, + }; + }, [ + flattenOptions, + multiple, + noResults, + onValueChange, + searchable, + searchedOptions, + size, + value, + ]); + + return ( + trigger || } + content={ + <> + {searchable ? ( + + + {noResults ? ( + + No Results + + ) : null} + + ) : null} + + + {SelectItem} + + + + } + /> + ); +}; + +Select.displayName = 'Select'; +export default React.memo(Select); diff --git a/src/src/components/kit_v2/Select/SelectItem.tsx b/src/src/components/kit_v2/Select/SelectItem.tsx new file mode 100644 index 00000000..1cf834ce --- /dev/null +++ b/src/src/components/kit_v2/Select/SelectItem.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { areEqual } from 'react-window'; + +import { IconCheck } from '@tabler/icons-react'; + +import Text from '../Text'; +import Icon from '../Icon'; +import ListItem from '../ListItem'; +import { CheckBox } from '../Checkbox/Checkbox'; + +import { ISelectItemProps } from './Select.d'; + +/** + * SelectItem component for react-window list + * @param {ISelectItemProps} props - props + * @returns {React.FunctionComponentElement} + * @constructor + * @category Components + * @subcategory Select + */ +const SelectItem = ({ + data, + index, + style, +}: ISelectItemProps): React.FunctionComponentElement => { + const { items, value, onValueChange, multiple, size } = data; + const item = items[index]; + let selected: boolean = false; + if (item.value) { + selected = value === item.value || value?.indexOf(item.value) !== -1; + } + const rightNode = multiple ? null : selected ? ( + } /> + ) : null; + + return ( + <> + {item.group ? ( + + {item.group} + + ) : ( + : null} + onClick={() => onValueChange(item.value!)} + > + + {item.label} + + + )} + + ); +}; + +SelectItem.displayName = 'SelectItem'; +export default React.memo(SelectItem, areEqual); diff --git a/src/src/components/kit_v2/Select/index.ts b/src/src/components/kit_v2/Select/index.ts new file mode 100644 index 00000000..8fd02a2e --- /dev/null +++ b/src/src/components/kit_v2/Select/index.ts @@ -0,0 +1,4 @@ +import Select from './Select'; + +export * from './Select.d'; +export default Select; diff --git a/src/src/components/kit_v2/Separator/Separator.d.ts b/src/src/components/kit_v2/Separator/Separator.d.ts new file mode 100644 index 00000000..c1f2497b --- /dev/null +++ b/src/src/components/kit_v2/Separator/Separator.d.ts @@ -0,0 +1,26 @@ +import { SeparatorProps } from '@radix-ui/react-separator'; + +import { CSS } from 'config/stitches/types'; + +export interface ISeparatorProps extends SeparatorProps { + /** + * @description The color of the separator + * @example 'primary' + * @default 'gray' + */ + color?: CSS['color']; + /** + * @description The margin of the separator + * @example '10px' + * @default '0' + * @type {CSS['margin']} + */ + margin?: CSS['margin']; + /** + * @description The css prop of the separator + * @example { margin: '10px' } + * @default {} + * @type {CSS} + */ + css?: CSS; +} diff --git a/src/src/components/kit_v2/Separator/Separator.style.ts b/src/src/components/kit_v2/Separator/Separator.style.ts new file mode 100644 index 00000000..a448a760 --- /dev/null +++ b/src/src/components/kit_v2/Separator/Separator.style.ts @@ -0,0 +1,8 @@ +import * as Separator from '@radix-ui/react-separator'; + +import { styled } from 'config/stitches'; + +export const SeparatorRoot: any = styled(Separator.Root, { + '&[data-orientation=horizontal]': { height: 1, width: '100%' }, + '&[data-orientation=vertical]': { height: 'inherit', width: 1 }, +}); diff --git a/src/src/components/kit_v2/Separator/Separator.test.tsx b/src/src/components/kit_v2/Separator/Separator.test.tsx new file mode 100644 index 00000000..2e997f86 --- /dev/null +++ b/src/src/components/kit_v2/Separator/Separator.test.tsx @@ -0,0 +1,40 @@ +import { render } from '@testing-library/react'; + +import Separator from './Separator'; + +// Test of Separator component + +describe('', () => { + test('Renders Correctly', () => { + const { asFragment } = render(); + expect(asFragment()).toMatchSnapshot(); + }); + + // test color prop + test('color prop works properly', () => { + const { getByTestId } = render(); + const separator = getByTestId('separator'); + expect(separator).toHaveStyle('background-color: $primary100'); + }); + + // test orientation prop + test('orientation prop works properly', () => { + const { getByTestId } = render(); + const separator = getByTestId('separator'); + expect(separator).toHaveAttribute('data-orientation', 'vertical'); + }); + + // test margin prop + test('margin prop works properly', () => { + const { getByTestId } = render(); + const separator = getByTestId('separator'); + expect(separator).toHaveStyle('margin: "0 $4'); + }); + + // test css prop + test('css prop works properly', () => { + const { getByTestId } = render(); + const separator = getByTestId('separator'); + expect(separator).toHaveStyle("color: 'red'"); + }); +}); diff --git a/src/src/components/kit_v2/Separator/Separator.tsx b/src/src/components/kit_v2/Separator/Separator.tsx new file mode 100644 index 00000000..4f14ef5f --- /dev/null +++ b/src/src/components/kit_v2/Separator/Separator.tsx @@ -0,0 +1,42 @@ +import React from 'react'; + +import { SeparatorRoot } from './Separator.style'; +import { ISeparatorProps } from './Separator.d'; + +/** + * Separator component + * @param {string} color - color of the separator line + * @param {string} margin - margin of the separator line + * @param {CSS} css - css of the separator line + * @param {ISeparatorProps} props - HTML attributes + * @returns {React.FunctionComponentElement} + * @example + * + * + * + * + */ +function Separator({ + orientation = 'horizontal', + color = '$secondary30', + margin, + css, + ...props +}: ISeparatorProps): React.FunctionComponentElement { + return ( + + ); +} + +Separator.displayName = 'Separator'; +export default React.memo(Separator); diff --git a/src/src/components/kit_v2/Separator/__snapshots__/Separator.test.tsx.snap b/src/src/components/kit_v2/Separator/__snapshots__/Separator.test.tsx.snap new file mode 100644 index 00000000..ecd1dd52 --- /dev/null +++ b/src/src/components/kit_v2/Separator/__snapshots__/Separator.test.tsx.snap @@ -0,0 +1,12 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` Renders Correctly 1`] = ` + +
+ {errorMessage ? errorMessage : caption || ''} +
+ )} + + + ); +} +export default ActiveRunsTable; diff --git a/src/src/pages/Dashboard/components/ActiveRunsTable/useActiveRunsTable.tsx b/src/src/pages/Dashboard/components/ActiveRunsTable/useActiveRunsTable.tsx new file mode 100644 index 00000000..4ff0ea90 --- /dev/null +++ b/src/src/pages/Dashboard/components/ActiveRunsTable/useActiveRunsTable.tsx @@ -0,0 +1,264 @@ +import React from 'react'; +import _ from 'lodash-es'; +import moment from 'moment'; + +import RunNameColumn from 'components/Table/RunNameColumn'; +import { Badge } from 'components/kit'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import { TABLE_DATE_FORMAT } from 'config/dates/dates'; + +import { IResourceState } from 'modules/core/utils/createResource'; + +import { IRun } from 'types/services/models/metrics/runModel'; + +import contextToString from 'utils/contextToString'; +import { processDurationTime } from 'utils/processDurationTime'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import { formatValue } from 'utils/formatValue'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { decode, encode } from 'utils/encoder/encoder'; + +import createActiveRunsEngine from './ActiveRunsStore'; + +function useActiveRunsTable() { + const tableRef = React.useRef(null); + const { current: activeRunsEngine } = React.useRef(createActiveRunsEngine); + const activeRunsStore: IResourceState[]> = + activeRunsEngine.activeRunsState((state) => state); + const [selectedRows, setSelectedRows] = React.useState< + Record + >({}); + const [comparisonQuery, setComparisonQuery] = React.useState(''); + + React.useEffect(() => { + activeRunsEngine.fetchActiveRuns(); + return () => { + activeRunsEngine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const metricsColumns = React.useMemo(() => { + if (activeRunsStore.data) { + const metrics: any = []; + const systemMetrics: any = []; + const metricsValues: any = {}; + activeRunsStore.data.forEach(({ hash, traces }: IRun) => { + traces.metric.forEach((trace: any) => { + const metricHash = getMetricHash(trace.name, trace.context as any); + + if (metricsValues.hasOwnProperty(metricHash)) { + metricsValues[metricHash][hash] = [ + trace.values.last_step, + trace.values.last, + ]; + } else { + metricsValues[metricHash] = { + [hash]: [trace.values.last_step, trace.values.last], + }; + + const metricContext = contextToString( + trace.context as Record, + ) as string; + + const isSystem = isSystemMetric(trace.name); + const col = { + key: metricHash, + content: ( + + ), + topHeader: isSystem + ? formatSystemMetricName(trace.name) + : trace.name, + name: trace.name, + context: metricContext, + isSystem, + }; + + if (isSystem) { + systemMetrics.push(col); + } else { + metrics.push(col); + } + } + }); + }); + + return { + columns: _.orderBy(metrics, ['name', 'context'], ['asc', 'asc']).concat( + _.orderBy(systemMetrics, ['name', 'context'], ['asc', 'asc']), + ) as any, + values: metricsValues, + }; + } + + return { + columns: [], + values: [], + }; + }, [activeRunsStore.data]); + + // memoized table data + const tableData = React.useMemo(() => { + if (activeRunsStore.data) { + return activeRunsStore.data.map( + ({ props, hash }: IRun, index: number) => { + const key = encode({ + hash, + }); + let row: any = { + key, + selectKey: key, + index, + experiment: { + content: ( + + ), + }, + run: { + content: ( + + ), + }, + date: moment(props.creation_time * 1000).format(TABLE_DATE_FORMAT), + duration: processDurationTime( + props.creation_time * 1000, + props.end_time ? props.end_time * 1000 : Date.now(), + ), + }; + + metricsColumns.columns.forEach((col: any) => { + const [step, value] = metricsColumns.values[col.key][hash] ?? [ + null, + null, + ]; + row[col.key] = { + content: + step === null + ? '--' + : col.isSystem + ? formatValue(value) + : `step: ${step} / value: ${formatValue(value)}`, + }; + }); + return row; + }, + ); + } + return []; + }, [activeRunsStore.data, metricsColumns]); + + // memoized table columns + const tableColumns = React.useMemo(() => { + const columns = [ + { + key: 'experiment', + content: Experiment, + topHeader: 'Run', + pin: 'left', + }, + { + key: 'run', + content: Name, + topHeader: 'Run', + pin: 'left', + }, + { + key: 'date', + content: Date, + topHeader: 'Run', + }, + { + key: 'duration', + content: Duration, + topHeader: 'Run', + }, + ]; + return columns.concat(metricsColumns.columns); + }, [metricsColumns]); + + // Update the table data and columns when the activity data changes + React.useEffect(() => { + if (tableRef.current?.updateData) { + tableRef.current.updateData({ + newColumns: tableColumns, + newData: tableData, + }); + } + }, [tableData, tableColumns]); + + // Handler for row selection + const onRowSelect = React.useCallback( + ({ actionType, data }) => { + let selected: Record = { ...selectedRows }; + switch (actionType) { + case 'single': + if (selectedRows[data.key]) { + selected = _.omit(selectedRows, data.key); + } else { + selected[data.key] = true; + } + break; + case 'selectAll': + if (Array.isArray(data)) { + data.forEach((item: any) => { + if (!selectedRows[item.key]) { + selected[item.key] = true; + } + }); + } else { + Object.values(data) + .reduce((acc: any[], value: any) => { + return acc.concat(value.items); + }, []) + .forEach((item: any) => { + if (!selectedRows[item.selectKey]) { + selected[item.selectKey] = true; + } + }); + } + break; + case 'removeAll': + if (Array.isArray(data)) { + selected = {}; + } + break; + } + + setSelectedRows(selected); + + setComparisonQuery( + `run.hash in [${Object.keys(selected) + .map((key) => `"${JSON.parse(decode(key)).hash}"`) + .join(', ')}]`, + ); + }, + [selectedRows], + ); + + return { + data: activeRunsStore.data, + tableData, + tableColumns, + tableRef, + loading: activeRunsStore.loading, + selectedRows, + comparisonQuery, + onRowSelect, + }; +} + +export default useActiveRunsTable; diff --git a/src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.scss b/src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.scss new file mode 100644 index 00000000..fb0e3642 --- /dev/null +++ b/src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.scss @@ -0,0 +1,38 @@ +@use 'src/styles/abstracts' as *; + +.AimIntegrations { + margin-top: $space-lg; +} + +.AimIntegrations__section { + padding: $space-lg 0; +} + +.AimIntegrations__section__title { + margin-bottom: $space-sm; +} + +.AimIntegrations__section__accordion { + box-shadow: 0 0 0 1px $pico-20; + margin: 0 !important; + + &::before { + content: none; + } +} + +.AimIntegrations__section__accordion__summary { + padding: $space-xs $space-sm !important; + min-height: 42px !important; + max-height: 42px !important; +} + +.AimIntegrations__section__accordion__details { + display: block; + padding: $space-sm $space-sm!important; +} + +.AimIntegrations__section__text { + font-style: italic; + margin-top: $space-sm; +} diff --git a/src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.tsx b/src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.tsx new file mode 100644 index 00000000..67bb80d2 --- /dev/null +++ b/src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.tsx @@ -0,0 +1,202 @@ +import * as React from 'react'; + +import { + Accordion, + AccordionDetails, + AccordionSummary, + Link, +} from '@material-ui/core'; + +import { Icon, Text } from 'components/kit'; +import CodeBlock from 'components/CodeBlock/CodeBlock'; + +import { DOCUMENTATIONS } from 'config/references'; + +import './AimIntegrations.scss'; + +function AimIntegrations() { + const [expanded, setExpanded] = React.useState(0); + + const handleChange = + (panel: number) => (event: React.ChangeEvent<{}>, newExpanded: boolean) => { + setExpanded(newExpanded ? panel : false); + }; + + const integrations = [ + { + title: 'Integrate PyTorch Lightning', + docsLink: DOCUMENTATIONS.INTEGRATIONS.PYTORCH_LIGHTNING, + code: `from aim.pytorch_lightning import AimLogger + +# ... +trainer = pl.Trainer(logger=AimLogger(experiment='experiment_name')) +# ...`, + }, + { + title: 'Integrate Hugging Face', + docsLink: DOCUMENTATIONS.INTEGRATIONS.HUGGING_FACE, + code: `from aim.hugging_face import AimCallback + +# ... +aim_callback = AimCallback(repo='/path/to/logs/dir', experiment='mnli') +trainer = Trainer( + model=model, + args=training_args, + train_dataset=train_dataset if training_args.do_train else None, + eval_dataset=eval_dataset if training_args.do_eval else None, + callbacks=[aim_callback], + # ... +) +# ...`, + }, + { + title: 'Integrate Keras & tf.keras', + docsLink: DOCUMENTATIONS.INTEGRATIONS.KERAS, + code: `import aim + +# ... +model.fit(x_train, y_train, epochs=epochs, callbacks=[ + aim.keras.AimCallback(repo='/path/to/logs/dir', experiment='experiment_name') + + # Use aim.tensorflow.AimCallback in case of tf.keras + aim.tensorflow.AimCallback(repo='/path/to/logs/dir', experiment='experiment_name') +]) +# ...`, + }, + { + title: 'Integrate KerasTuner', + docsLink: DOCUMENTATIONS.INTEGRATIONS.KERAS_TUNER, + code: `from aim.keras_tuner import AimCallback + +# ... +tuner.search( + train_ds, + validation_data=test_ds, + callbacks=[AimCallback(tuner=tuner, repo='.', experiment='keras_tuner_test')], +) +# ...`, + }, + { + title: 'Integrate XGBoost', + docsLink: DOCUMENTATIONS.INTEGRATIONS.XGBOOST, + code: `from aim.xgboost import AimCallback + +# ... +aim_callback = AimCallback(repo='/path/to/logs/dir', experiment='experiment_name') +bst = xgb.train(param, xg_train, num_round, watchlist, callbacks=[aim_callback]) +# ...`, + }, + { + title: 'Integrate CatBoost', + docsLink: DOCUMENTATIONS.INTEGRATIONS.CATBOOST, + code: `from aim.catboost import AimLogger + +# ... +model.fit(train_data, train_labels, log_cout=AimLogger(loss_function='Logloss'), logging_level="Info") +# ...`, + }, + { + title: 'Integrate fastai', + docsLink: DOCUMENTATIONS.INTEGRATIONS.FASTAI, + code: `from aim.fastai import AimCallback + +# ... +learn = cnn_learner(dls, resnet18, pretrained=True, + loss_func=CrossEntropyLossFlat(), + metrics=accuracy, model_dir="/tmp/model/", + cbs=AimCallback(repo='.', experiment='fastai_test')) +# ...`, + }, + { + title: 'Integrate LightGBM', + docsLink: DOCUMENTATIONS.INTEGRATIONS.LIGHT_GBM, + code: `from aim.lightgbm import AimCallback + +# ... +aim_callback = AimCallback(experiment='lgb_test') +aim_callback.experiment['hparams'] = params + +gbm = lgb.train(params, + lgb_train, + num_boost_round=20, + valid_sets=lgb_eval, + callbacks=[aim_callback, lgb.early_stopping(stopping_rounds=5)]) +# ...`, + }, + + { + title: 'Integrate PyTorch Ignite', + docsLink: DOCUMENTATIONS.INTEGRATIONS.PYTORCH_IGNITE, + code: `from aim.pytorch_ignite import AimLogger + +# ... +aim_logger = AimLogger() + +aim_logger.log_params({ + "model": model.__class__.__name__, + "pytorch_version": str(torch.__version__), + "ignite_version": str(ignite.__version__), +}) + +aim_logger.attach_output_handler( + trainer, + event_name=Events.ITERATION_COMPLETED, + tag="train", + output_transform=lambda loss: {'loss': loss} +) +# ...`, + }, + ]; + + return ( +
+ + Integrate Aim with your favorite ML framework + +
+ {integrations.map((item, i) => ( + + } + className='AimIntegrations__section__accordion__summary' + > + + {item.title} + + + + + + See documentation{' '} + + here + + . + + + + ))} +
+
+ ); +} + +export default AimIntegrations; diff --git a/src/src/pages/Dashboard/components/AimIntegrations/index.ts b/src/src/pages/Dashboard/components/AimIntegrations/index.ts new file mode 100644 index 00000000..abd212a2 --- /dev/null +++ b/src/src/pages/Dashboard/components/AimIntegrations/index.ts @@ -0,0 +1,3 @@ +import AimIntegrations from './AimIntegrations'; + +export default AimIntegrations; diff --git a/src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeed.tsx b/src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeed.tsx new file mode 100644 index 00000000..4e9754ee --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeed.tsx @@ -0,0 +1,13 @@ +import React from 'react'; + +import ContributionsFeed from 'components/ContributionsFeed'; + +import useDashboardContributionsFeed from './useDashboardContributionsFeed'; + +function DashboardContributionsFeed(): React.FunctionComponentElement | null { + const props = useDashboardContributionsFeed(); + + return ; +} + +export default React.memo(DashboardContributionsFeed); diff --git a/src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeedStore.ts b/src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeedStore.ts new file mode 100644 index 00000000..85a336af --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeedStore.ts @@ -0,0 +1,25 @@ +import { createSearchRunRequest } from 'modules/core/api/runsApi'; +import createResource from 'modules/core/utils/createResource'; + +import { RequestOptions } from 'services/NetworkService'; + +import { IRun } from 'types/services/models/metrics/runModel'; + +import { parseStream } from 'utils/encoder/streamEncoding'; + +function createDashboardContributionsFeedEngine() { + let { call } = createSearchRunRequest(); + + const { fetchData, state, destroy } = createResource[]>( + async (queryParams: RequestOptions['query_params']) => + parseStream(await call(queryParams)), + ); + return { + fetchContributionsFeed: (queryParams: RequestOptions['query_params']) => + fetchData(queryParams), + contributionsFeedState: state, + destroy, + }; +} + +export default createDashboardContributionsFeedEngine(); diff --git a/src/src/pages/Dashboard/components/DashboardContributionsFeed/index.ts b/src/src/pages/Dashboard/components/DashboardContributionsFeed/index.ts new file mode 100644 index 00000000..af543c42 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardContributionsFeed/index.ts @@ -0,0 +1,3 @@ +import DashboardContributionsFeed from './DashboardContributionsFeed'; + +export default DashboardContributionsFeed; diff --git a/src/src/pages/Dashboard/components/DashboardContributionsFeed/useDashboardContributionsFeed.ts b/src/src/pages/Dashboard/components/DashboardContributionsFeed/useDashboardContributionsFeed.ts new file mode 100644 index 00000000..33dd0c1f --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardContributionsFeed/useDashboardContributionsFeed.ts @@ -0,0 +1,125 @@ +import React from 'react'; +import moment from 'moment'; + +import { + TIMELINE_DAY_FORMAT, + TIMELINE_MONTH_FORMAT, + TIMELINE_TIME_FORMAT, +} from 'config/dates/dates'; + +import { IResourceState } from 'modules/core/utils/createResource'; + +import { IRun } from 'types/services/models/metrics/runModel'; + +import projectContributionsEngine from '../ProjectContributions/ProjectContributionsStore'; + +import contributionsFeedEngine from './DashboardContributionsFeedStore'; + +function useDashboardContributionsFeed() { + const [data, setData] = React.useState([]); + const { current: engine } = React.useRef(contributionsFeedEngine); + const contributionsFeedStore: IResourceState = + engine.contributionsFeedState((state) => state); + const { current: contributionsEngine } = React.useRef( + projectContributionsEngine, + ); + const contributionsState = contributionsEngine.projectContributionsState( + (state) => state, + ); + + React.useEffect(() => { + engine.fetchContributionsFeed({ + limit: 25, + exclude_params: true, + exclude_traces: true, + }); + return () => { + engine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useEffect(() => { + if (contributionsFeedStore.data?.length) { + let newData = [...data, ...contributionsFeedStore.data]; + setData(newData); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [contributionsFeedStore.data]); + + const memoizedData = React.useMemo(() => { + // get existing month list from the contributionsFeedStore data + const feedData: { [key: string]: any } = {}; + if (data.length) { + const monthList = data?.reduce((acc: any, run: IRun) => { + const { props } = run; + const month = moment(props.creation_time * 1000).format( + TIMELINE_MONTH_FORMAT, + ); + if (!acc.includes(month)) { + acc.push(month); + } + return acc; + }, []); + // create a list of objects with month and contributions + + monthList.forEach((month: string) => { + feedData[month] = {}; + }); + + // add contributions to the month list + data?.forEach((run: IRun) => { + const { props, hash } = run; + + // get the month + const month = moment(props.creation_time * 1000).format( + TIMELINE_MONTH_FORMAT, + ); + + // get the day of the month + const day = moment(props.creation_time * 1000).format( + TIMELINE_DAY_FORMAT, + ); + + // create a contribution object + const contribution = { + name: props.name, + date: moment(props.creation_time * 1000).format(TIMELINE_TIME_FORMAT), + hash, + active: props.active, + creation_time: props.creation_time, + experiment: props.experiment?.name, + experimentId: props.experiment?.id, + }; + if (feedData[month]?.[day]?.length) { + feedData[month][day].push(contribution); + } else { + feedData[month][day] = [contribution]; + } + }); + } + return feedData; + }, [data]); + + function loadMore(): void { + if (contributionsFeedStore.data && !contributionsFeedStore.loading) { + engine.fetchContributionsFeed({ + limit: 25, + exclude_params: true, + exclude_traces: true, + offset: data[data.length - 1].hash, + }); + } + } + + return { + isLoading: contributionsFeedStore.loading, + data: memoizedData, + totalRunsCount: contributionsState.data?.num_runs, + archivedRunsCount: contributionsState.data?.num_archived_runs, + fetchedCount: data.length, + loadMore, + }; +} + +export default useDashboardContributionsFeed; diff --git a/src/src/pages/Dashboard/components/DashboardRight/DashboardRight.scss b/src/src/pages/Dashboard/components/DashboardRight/DashboardRight.scss new file mode 100644 index 00000000..c675f5d1 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/DashboardRight.scss @@ -0,0 +1,13 @@ +@use 'src/styles/abstracts' as *; + +.DashboardRight { + display: flex; + flex-direction: column; + width: 285px; + background-color: #fafafb; + overflow: auto; + &__title { + margin-top: $space-md; + padding: 0 $space-lg; + } +} diff --git a/src/src/pages/Dashboard/components/DashboardRight/DashboardRight.tsx b/src/src/pages/Dashboard/components/DashboardRight/DashboardRight.tsx new file mode 100644 index 00000000..01418b9d --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/DashboardRight.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +import { Text } from 'components/kit'; + +import ReleaseNotes from './ReleaseNotes/ReleaseNotes'; + +import './DashboardRight.scss'; + +function DashboardRight(): React.FunctionComponentElement { + return ( + + ); +} + +export default React.memo(DashboardRight); diff --git a/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.scss b/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.scss new file mode 100644 index 00000000..05ee72f5 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.scss @@ -0,0 +1,21 @@ +@use 'src/styles/abstracts' as *; + +.GuideLinks { + padding: $space-sm $space-sm $space-unit; + display: flex; + flex-direction: column; + border-bottom: $border-dark-lighter; + &__title { + margin-left: $space-sm; + } + &__content { + margin: $space-xs 0 $space-unit; + &--name { + flex: 1 100; + } + } + &--btn { + margin: 0 $space-sm; + text-decoration: none; + } +} diff --git a/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.tsx b/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.tsx new file mode 100644 index 00000000..e83c0fdc --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.tsx @@ -0,0 +1,91 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; +import ListItem from 'components/kit/ListItem/ListItem'; + +import { DOCUMENTATIONS } from 'config/references'; + +import guideStore from './GuidesStore'; + +import './GuideDocs.scss'; + +function GuideDocs(): React.FunctionComponentElement { + const { shuffle, guideLinks, shuffled } = guideStore(); + + const onClick: ( + e: React.MouseEvent, + path: string, + newTab?: boolean, + ) => void = React.useCallback( + (e: React.MouseEvent, path: string, newTab = false) => { + e.stopPropagation(); + if (path) { + window.open(path, newTab ? '_blank' : '_self'); + window.focus(); + return; + } + }, + [], + ); + + React.useEffect(() => { + if (!shuffled) { + shuffle(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( +
+ + Guides + +
+ {guideLinks.map( + (link: { name: string; url: string }, index: number) => ( + + onClick(e, link.url)} + size={12} + tint={100} + > + {link.name} + + +
+ onClick(e, link.url, true)} + name='new-tab' + /> +
+
+
+ ), + )} +
+ + + +
+ ); +} + +export default React.memo(GuideDocs); diff --git a/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuidesStore.ts b/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuidesStore.ts new file mode 100644 index 00000000..b9542b28 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuidesStore.ts @@ -0,0 +1,20 @@ +import create from 'zustand'; + +import { DASHBOARD_PAGE_GUIDES } from 'config/references'; + +const guideStore = create<{ + shuffled: boolean; + guideLinks: any; + shuffle: () => void; +}>((set) => ({ + shuffled: false, + guideLinks: [{}], + shuffle: () => { + const guideLinks = DASHBOARD_PAGE_GUIDES; + const shuffledLinks = guideLinks + .sort(() => 0.5 - Math.random()) + .slice(0, 4); + set({ shuffled: true, guideLinks: shuffledLinks }); + }, +})); +export default guideStore; diff --git a/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.scss b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.scss new file mode 100644 index 00000000..59ed5125 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.scss @@ -0,0 +1,114 @@ +@use 'src/styles/abstracts' as *; + +.ReleaseNotes { + display: flex; + flex-direction: column; + &__Spinner { + display: flex; + align-items: center; + justify-content: center; + height: calc(100vh - 40px); + } + &__latest { + display: flex; + flex-direction: column; + margin-top: $space-lg; + padding: 0 $space-lg $space-unit; + border-bottom: $border-dark-lighter; + &__title { + display: flex; + margin-bottom: $space-sm; + span { + margin-left: $space-xs; + padding: $space-xxxxs $space-xxxs; + color: $white; + background-color: $primary-color; + border-radius: $border-radius-xss; + font-size: 10px; + font-weight: $font-700; + } + } + &__content { + display: flex; + flex-direction: column; + a { + text-decoration: none; + display: block; + } + &__item { + display: flex; + padding-left: 18px; + margin-bottom: $space-sm; + position: relative; + span { + word-break: break-word; + } + &::before { + content: ''; + position: absolute; + left: 0; + top: 3px; + width: 7px; + height: 7px; + border-radius: $border-radius-circle; + background-color: $pico-30; + } + &:last-child { + margin-bottom: 0; + } + } + } + } + &__changelog { + border-bottom: $border-dark-lighter; + &__title { + padding: $space-sm $space-lg 0; + } + &__content { + margin-top: $space-sm; + max-height: 290px; + padding: 0 $space-lg $space-unit; + overflow: auto; + .ReleaseNoteItem { + &::after { + height: calc(100% + #{$space-sm}); + } + } + } + &__currentRelease { + position: relative; + padding: $space-sm $space-lg; + .ReleaseNoteItem { + &::after { + top: -13px; + height: calc(100% + #{$space-sm}); + } + } + &::before { + content: ''; + transition: all 0.18s ease-out; + opacity: 0; + position: absolute; + left: 0; + top: -12px; + height: 13px; + width: 100%; + background: linear-gradient( + 180deg, + rgba(234, 235, 239, 0) 0%, + #eaebef 100% + ); + } + &__scroll { + &::before { + opacity: 1; + } + .ReleaseNoteItem { + &::after { + top: -11px !important; + } + } + } + } + } +} diff --git a/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.tsx b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.tsx new file mode 100644 index 00000000..79687979 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.tsx @@ -0,0 +1,105 @@ +import React from 'react'; + +import { Button, Spinner, Text } from 'components/kit'; +import ReleaseNoteItem from 'components/ReleaseNoteItem/ReleaseNoteItem'; + +import { AIM_VERSION } from 'config/config'; + +import GuideLinks from '../GuideDocs/GuideDocs'; + +import useReleaseNotes from './useReleaseNotes'; + +import './ReleaseNotes.scss'; + +function ReleaseNotes(): React.FunctionComponentElement { + const { + changelogData, + LatestReleaseData, + currentReleaseData, + isLoading, + releaseNoteRef, + scrollShadow, + } = useReleaseNotes(); + + return ( +
+ {isLoading ? ( +
+ +
+ ) : ( + <> +
+
+ + Aim {LatestReleaseData?.tagName} + + {`v${AIM_VERSION}` === LatestReleaseData?.tagName ? null : ( + Latest + )} +
+
+ {LatestReleaseData?.info?.map((title: string, index: number) => ( +
+ {title.replace(/-/g, ' ')} +
+ ))} + + + +
+
+ {`v${AIM_VERSION}` === LatestReleaseData?.tagName ? null : ( +
+ + Changelog + +
+ {changelogData.map((item) => ( + + ))} +
+ {currentReleaseData ? ( +
+ +
+ ) : null} +
+ )} + + + )} +
+ ); +} + +export default React.memo(ReleaseNotes); diff --git a/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleasesStore.ts b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleasesStore.ts new file mode 100644 index 00000000..e92c8267 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleasesStore.ts @@ -0,0 +1,11 @@ +import { fetchReleaseNotes } from 'modules/core/api/releaseNotesApi'; +import { IReleaseNote } from 'modules/core/api/releaseNotesApi/types'; +import createResource from 'modules/core/utils/createResource'; + +function createReleasesEngine() { + const { fetchData, state, destroy } = + createResource(fetchReleaseNotes); + return { fetchReleases: fetchData, releasesState: state, destroy }; +} + +export default createReleasesEngine(); diff --git a/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/useReleaseNotes.ts b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/useReleaseNotes.ts new file mode 100644 index 00000000..001b0dea --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/useReleaseNotes.ts @@ -0,0 +1,161 @@ +import React from 'react'; +import _ from 'lodash-es'; +import { marked } from 'marked'; + +import { AIM_VERSION } from 'config/config'; + +import { IReleaseNote } from 'modules/core/api/releaseNotesApi/types'; +import { IResourceState } from 'modules/core/utils/createResource'; +import { fetchReleaseByTagName } from 'modules/core/api/releaseNotesApi'; + +import createReleaseNotesEngine from './ReleasesStore'; + +const CHANGELOG_CONTENT_MAX_HEIGHT = 296; +function useReleaseNotes() { + const [loading, setLoading] = React.useState(true); + const [mounted, setMounted] = React.useState(false); + const [scrollShadow, setScrollShadow] = React.useState(false); + const [currentRelease, setCurrentRelease] = React.useState(); + const { current: releaseNotesEngine } = React.useRef( + createReleaseNotesEngine, + ); + const releaseNotesStore: IResourceState = + releaseNotesEngine.releasesState((state) => state); + const releaseNoteRef = React.useRef(null); + + React.useEffect(() => { + const releaseNoteNode = releaseNoteRef.current; + + if (releaseNotesStore.data?.length) { + // detect current release in fetched release notes + const release: IReleaseNote | undefined = releaseNotesStore.data?.find( + (release: IReleaseNote) => release.tag_name === `v${AIM_VERSION}`, + ); + if (release) { + setCurrentRelease(release); + setLoading(false); + } else { + fetchCurrentRelease(); + } + } else { + releaseNotesEngine.fetchReleases(); + } + return () => { + releaseNoteNode?.removeEventListener('scroll', onChangelogContentScroll); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [releaseNotesStore.data]); + + React.useEffect(() => { + if (!loading) { + setMounted(true); + } + if (mounted && releaseNoteRef.current) { + if ( + releaseNoteRef?.current?.scrollHeight > CHANGELOG_CONTENT_MAX_HEIGHT + ) { + setScrollShadow(true); + } + releaseNoteRef?.current?.addEventListener( + 'scroll', + onChangelogContentScroll, + ); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [loading, mounted]); + + const onChangelogContentScroll = _.throttle(() => { + const hasScrollShadow: boolean = + releaseNoteRef!.current!.scrollTop + CHANGELOG_CONTENT_MAX_HEIGHT <= + releaseNoteRef!.current!.scrollHeight; + setScrollShadow(hasScrollShadow); + }, 150); + async function fetchCurrentRelease(): Promise { + try { + const data = await fetchReleaseByTagName(`v${AIM_VERSION}`); + setCurrentRelease(data); + setLoading(false); + } catch (e) { + setLoading(false); + } + } + + function getLatestReleaseInfo(releaseBody: string): RegExpMatchArray | null { + const wrapper = document.createElement('div'); + wrapper.innerHTML = marked.parse(releaseBody); + const listElements: string[] = []; + wrapper.querySelectorAll('li').forEach((li, index) => { + if (index < 4) { + listElements.push( + li.innerText.replace( + // eslint-disable-next-line no-useless-escape + /(\sby\s\@[A-z\d](?:[A-z\d]|-(?=[A-z\d])){0,38}\s\w+\shttps\:\/\/github\.com\/((\w+\/?){4}))/g, + '', + ), + ); + } else { + return; + } + }); + return listElements; + } + + // function to modify release notes name + function modifyReleaseName(releaseTitle: string): string { + // eslint-disable-next-line no-useless-escape + return releaseTitle.replace(/(^\🚀\s*v\d+\.\d+\.\d+\s*\-\s*)/, ''); + } + + const changelogData: { tagName: string; info: any; url: string }[] = + React.useMemo(() => { + const data: { tagName: string; info: any; url: string }[] = []; + releaseNotesStore?.data?.some((release: IReleaseNote) => { + if (release.tag_name === `v${AIM_VERSION}`) { + return true; + } + data.push({ + tagName: release.tag_name, + info: modifyReleaseName(release.name), + url: release.html_url, + }); + return false; + }); + return data; + }, [releaseNotesStore.data]); + + const currentReleaseData: + | { tagName: string; info: any; url: string } + | undefined = React.useMemo(() => { + if (currentRelease) { + return { + tagName: currentRelease?.tag_name, + info: modifyReleaseName(currentRelease?.name), + url: currentRelease.html_url, + }; + } + }, [currentRelease]); + + const LatestReleaseData: + | { tagName: string; info: any; url: string } + | undefined = React.useMemo(() => { + const latest = releaseNotesStore?.data?.[0]; + if (latest) { + return { + tagName: latest?.tag_name, + info: getLatestReleaseInfo(latest.body), + url: latest.html_url, + }; + } + }, [releaseNotesStore.data]); + + return { + changelogData, + currentReleaseData, + LatestReleaseData, + isLoading: loading, + releaseNoteRef, + scrollShadow, + }; +} + +export default useReleaseNotes; diff --git a/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.scss b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.scss new file mode 100644 index 00000000..248e4820 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.scss @@ -0,0 +1,29 @@ +@use 'src/styles/abstracts' as *; + +$bookmark-height: 24px; +.DashboardBookmarks { + padding: $space-sm; + border-top: $border-dark-lighter; + + &__title { + padding: 0 $space-sm; + margin-bottom: $space-xs; + } + &__list { + max-height: 5 * $bookmark-height; + overflow: auto; + &__ListItem { + &__Text { + flex: 1; + margin-left: $space-xs; + text-transform: capitalize; + } + } + } + &__NavLink { + margin-top: $space-unit; + text-decoration: none; + display: block; + padding: 0 $space-sm; + } +} diff --git a/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.tsx b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.tsx new file mode 100644 index 00000000..a061b068 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { NavLink } from 'react-router-dom'; + +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; +import ListItem from 'components/kit/ListItem/ListItem'; + +import { IDashboardData } from 'modules/core/api/dashboardsApi'; + +import { BookmarkIconType } from 'pages/Bookmarks/components/BookmarkCard/BookmarkCard'; + +import useDashboardBookmarks from './useDashboardBookmarks'; + +import './DashboardBookmarks.scss'; + +function DashboardBookmarks(): React.FunctionComponentElement | null { + const { dashboardBookmarksStore, handleClick } = useDashboardBookmarks(); + + return dashboardBookmarksStore.data?.length ? ( +
+ + Bookmarks{' '} + {dashboardBookmarksStore.data.length + ? `(${dashboardBookmarksStore.data.length})` + : ''} + +
+ {dashboardBookmarksStore.data + .slice(0, 5) + ?.map((dashboard: IDashboardData) => ( + +
+ + + handleClick(e, dashboard)} + size={12} + tint={100} + > + {dashboard.name} + +
+ handleClick(e, dashboard, true)} + name='new-tab' + /> +
+
+
+
+ ))} +
+ {dashboardBookmarksStore.data.length > 5 ? ( + + + + ) : null} +
+ ) : null; +} + +export default React.memo(DashboardBookmarks); diff --git a/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarksStore.ts b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarksStore.ts new file mode 100644 index 00000000..85c86fa6 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarksStore.ts @@ -0,0 +1,17 @@ +import { + fetchDashboardsList, + IDashboardData, +} from 'modules/core/api/dashboardsApi'; +import createResource from 'modules/core/utils/createResource'; + +function createDashboardBookmarksEngine() { + const { fetchData, state, destroy } = + createResource(fetchDashboardsList); + return { + fetchDashboardBookmarks: fetchData, + dashboardBookmarksState: state, + destroy, + }; +} + +export default createDashboardBookmarksEngine(); diff --git a/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/useDashboardBookmarks.tsx b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/useDashboardBookmarks.tsx new file mode 100644 index 00000000..f7d0e4e5 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/useDashboardBookmarks.tsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { useHistory } from 'react-router-dom'; + +import { IResourceState } from 'modules/core/utils/createResource'; +import { IDashboardData } from 'modules/core/api/dashboardsApi'; + +import createBookmarksEngine from './DashboardBookmarksStore'; + +function useDashboardBookmarks() { + const history = useHistory(); + const { current: dashboardBookmarksEngine } = React.useRef( + createBookmarksEngine, + ); + const dashboardBookmarksStore: IResourceState = + dashboardBookmarksEngine.dashboardBookmarksState((state) => state); + + React.useEffect(() => { + dashboardBookmarksEngine.fetchDashboardBookmarks(); + return () => { + dashboardBookmarksEngine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const handleClick: ( + e: React.MouseEvent, + dashboard: IDashboardData, + newTab?: boolean, + ) => void = React.useCallback( + ( + e: React.MouseEvent, + dashboard: IDashboardData, + newTab = false, + ) => { + e.stopPropagation(); + if (dashboard) { + const path = `${dashboard.app_type}/${dashboard.app_id}`; + if (newTab) { + window.open(path, '_blank'); + window.focus(); + return; + } + history.push(path); + } + }, + [history], + ); + + return { handleClick, dashboardBookmarksStore }; +} + +export default useDashboardBookmarks; diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.d.ts b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.d.ts new file mode 100644 index 00000000..da00b740 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.d.ts @@ -0,0 +1,7 @@ +export type ExperimentsCardRowDataType = { + key: number; + name: string; + archived: boolean; + run_count: number; + id: string; +}; diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.scss b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.scss new file mode 100644 index 00000000..779068f6 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.scss @@ -0,0 +1,15 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentsCard { + border-top: $border-dark-lighter; + padding: $space-unit $space-sm; + &__title { + margin-bottom: $space-sm; + padding: 0 $space-sm; + } + .ExperimentNameBox { + &__experimentName { + font-size: $text-sm; + } + } +} diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.tsx b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.tsx new file mode 100644 index 00000000..b8618a1a --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import DataList from 'components/kit/DataList'; +import { Text } from 'components/kit'; + +import CompareSelectedRunsPopover from 'pages/Metrics/components/Table/CompareSelectedRunsPopover'; + +import { AppNameEnum } from 'services/models/explorer'; + +import useExperimentsCard from './useExperimentsCard'; + +import './ExperimentsCard.scss'; + +function ExperimentsCard(): React.FunctionComponentElement | null { + const { + tableRef, + tableColumns, + tableData, + experimentsStore, + selectedRows, + experimentsQuery, + } = useExperimentsCard(); + return experimentsStore.data?.length ? ( +
+ + Experiments ({experimentsStore.data.length}) + + , + ]} + disableMatchBar={true} + /> +
+ ) : null; +} + +ExperimentsCard.displayName = 'ExperimentsCard'; + +export default React.memo(ExperimentsCard); diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsStore.ts b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsStore.ts new file mode 100644 index 00000000..93b9d930 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsStore.ts @@ -0,0 +1,13 @@ +import { + getExperiments, + IExperimentData, +} from 'modules/core/api/experimentsApi'; +import createResource from 'modules/core/utils/createResource'; + +function createExperimentsEngine() { + const { fetchData, state, destroy } = + createResource(getExperiments); + return { fetchExperiments: fetchData, experimentsState: state, destroy }; +} + +export default createExperimentsEngine(); diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/index.ts b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/index.ts new file mode 100644 index 00000000..82c235f5 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/index.ts @@ -0,0 +1,4 @@ +import ExperimentsCard from './ExperimentsCard'; + +export * from './ExperimentsCard.d'; +export default ExperimentsCard; diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/useExperimentsCard.tsx b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/useExperimentsCard.tsx new file mode 100644 index 00000000..c40b03e6 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/useExperimentsCard.tsx @@ -0,0 +1,206 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { Checkbox } from '@material-ui/core'; + +import { Icon, Text } from 'components/kit'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import { IResourceState } from 'modules/core/utils/createResource'; +import { IExperimentData } from 'modules/core/api/experimentsApi'; + +import createExperimentEngine from './ExperimentsStore'; + +import { ExperimentsCardRowDataType } from '.'; + +function useExperimentsCard() { + const tableRef = React.useRef(null); + const [selectedRows, setSelectedRows] = React.useState< + Record + >({}); + const { current: experimentsEngine } = React.useRef(createExperimentEngine); + const experimentsStore: IResourceState = + experimentsEngine.experimentsState((state) => state); + + React.useEffect(() => { + experimentsEngine.fetchExperiments(); + return () => { + experimentsEngine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // memoized table data + const tableData: ExperimentsCardRowDataType[] = React.useMemo(() => { + if (experimentsStore.data) { + return experimentsStore.data.map( + ({ name, archived, run_count, id }: IExperimentData, index: number) => { + return { + key: index, + name, + archived, + run_count, + id, + }; + }, + ); + } + return []; + }, [experimentsStore.data]); + + // on row selection + const onRowSelect = React.useCallback( + (rowKey?: string, rowData?: ExperimentsCardRowDataType) => { + if (rowKey) { + const newSelectedRows = selectedRows[rowKey] + ? _.omit(selectedRows, rowKey) + : { ...selectedRows, [rowKey]: rowData }; + setSelectedRows(newSelectedRows); + } else if (!_.isEmpty(selectedRows)) { + setSelectedRows({}); + } else { + const newSelectedRows = tableData.reduce( + ( + acc: Record, + rowData: ExperimentsCardRowDataType, + ) => { + acc[rowData.id] = rowData; + return acc; + }, + {}, + ); + setSelectedRows(newSelectedRows); + } + }, + [selectedRows, tableData], + ); + + // memoized table columns + const tableColumns = React.useMemo( + () => [ + { + dataKey: 'id', + key: 'id', + title: ( + } + className='selectCheckbox' + checkedIcon={ + tableData.length === Object.keys(selectedRows)?.length ? ( + + + + ) : ( + + + + ) + } + onClick={() => onRowSelect()} + checked={!_.isEmpty(selectedRows)} + /> + ), + width: '20px', + cellRenderer: ({ + cellData, + rowData, + }: { + cellData: string; + rowData: ExperimentsCardRowDataType; + }) => { + return ( + } + className='selectCheckbox' + checked={!!selectedRows[cellData]} + checkedIcon={ + + + + } + onClick={() => onRowSelect(cellData, rowData)} + /> + ); + }, + }, + { + dataKey: 'name', + key: 'name', + title: ( + + Name + + ), + width: 'calc(100% - 50px)', + style: { paddingLeft: 10, paddingRight: 12 }, + cellRenderer: ({ + cellData, + rowData, + }: { + cellData: string; + rowData: ExperimentsCardRowDataType; + }) => ( + + ), + }, + { + dataKey: 'run_count', + key: 'run_count', + title: ( + + Runs + + ), + flexGrow: 1, + width: '46px', + textAlign: 'right', + style: { textAlign: 'right' }, + cellRenderer: ({ cellData }: { cellData: number }) => ( + + {cellData} + + ), + }, + ], + [tableData?.length, onRowSelect, selectedRows], + ); + + // Update the table data and columns when the experiments data changes + React.useEffect(() => { + if (tableRef.current?.updateData) { + tableRef.current.updateData({ + newColumns: tableColumns, + newData: tableData, + }); + } + }, [tableData, tableColumns]); + + const experimentsQuery = React.useMemo(() => { + return `run.experiment in [${Object.values(selectedRows) + .map(({ name }: ExperimentsCardRowDataType) => `"${name}"`) + .join(',')}]`; + }, [selectedRows]); + + return { + tableRef, + tableColumns, + tableData, + experimentsStore, + selectedRows, + experimentsQuery, + }; +} +export default useExperimentsCard; diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExploreSection.scss b/src/src/pages/Dashboard/components/ExploreSection/ExploreSection.scss new file mode 100644 index 00000000..70491e58 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExploreSection.scss @@ -0,0 +1,137 @@ +@use 'src/styles/abstracts' as *; + +.ExploreSection { + display: flex; + flex-direction: column; + min-width: 310px; + width: 310px; + background-color: $pico-2; + overflow: auto; + height: 100vh; + &__Spinner { + height: 100%; + display: flex; + align-items: center; + justify-content: center; + } + &__loading { + display: none; + } + &__title { + margin-top: 1.25rem; + padding: 0 1.5rem; + } + .ExploreSection__content { + .DataList { + .CompareSelectedRunsPopover__trigger { + margin-right: 0 !important; + .Icon__container { + margin-right: $space-xxxs; + } + .Text { + font-size: $text-sm; + } + } + + .IllustrationBlock { + &__container { + padding-bottom: 0; + } + &__large__img { + height: 100%; + img { + height: 100%; + } + } + } + .defaultSelectIcon { + border: 1.5px solid $pico-50; + border-radius: $border-radius-xs; + width: 12px; + height: 12px; + } + &__toolbarItems { + height: unset; + margin-left: $space-xs; + } + &__textsTable { + border: none; + padding-left: $space-xs; + } + .SearchBar { + width: auto; + min-width: 250px; + padding: 0 $space-sm; + margin-bottom: $space-xxxs; + .SearchInput { + margin-right: 0; + } + .MuiOutlinedInput-root { + background-color: $white; + } + label { + font-size: $text-sm; + } + } + .selectedSelectIcon { + border-radius: $border-radius-xs; + width: 12px; + height: 12px; + background: $primary-color; + color: $white; + display: flex; + justify-content: center; + align-items: center; + } + .partiallySelectedSelectIcon { + border-radius: $border-radius-xs; + width: 12px; + height: 12px; + display: flex; + justify-content: center; + align-items: center; + } + .MuiCheckbox-root { + padding: $space-xxxs !important; + } + .BaseTable { + background-color: transparent; + &__table { + background-color: transparent; + } + &__header { + background: transparent; + &-row { + background-color: transparent; + } + &-cell { + border: none; + background-color: transparent; + padding: 0; + &--text { + font-size: 12px; + } + } + } + &__row { + background-color: transparent; + box-shadow: unset; + &-cell { + background-color: transparent; + border: none; + padding: 0; + &:first-child { + padding: 0; + } + p { + max-width: 100%; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + } + } + } + } +} diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExploreSection.tsx b/src/src/pages/Dashboard/components/ExploreSection/ExploreSection.tsx new file mode 100644 index 00000000..729942b9 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExploreSection.tsx @@ -0,0 +1,60 @@ +import React from 'react'; + +import { Spinner, Text } from 'components/kit'; + +import ExperimentsCard from './ExperimentsCard'; +import DashboardBookmarks from './DashboardBookmarks/DashboardBookmarks'; +import QuickLinks from './QuickLinks/QuickLinks'; +import TagsCard from './TagsCard/TagsCard'; +import RecentSearches from './RecentSearches/RecentSearches'; +import createTagsEngine from './TagsCard/TagsStore'; +import createExperimentsEngine from './ExperimentsCard/ExperimentsStore'; +import bookmarksEngine from './DashboardBookmarks/DashboardBookmarksStore'; + +import './ExploreSection.scss'; + +function ExploreSection(): React.FunctionComponentElement { + const [loading, setLoading] = React.useState(true); + const { loading: tagsLoading } = React.useRef( + createTagsEngine, + ).current.tagsState((state) => state); + const { loading: experimentsLoading } = React.useRef( + createExperimentsEngine, + ).current.experimentsState((state) => state); + const { loading: bookmarksLoading } = React.useRef( + bookmarksEngine, + ).current.dashboardBookmarksState((state) => state); + + React.useEffect(() => { + // if all resources are loaded + if (!tagsLoading && !experimentsLoading && !bookmarksLoading) { + setLoading(false); + } + }, [bookmarksLoading, experimentsLoading, tagsLoading]); + + return ( + + ); +} + +export default React.memo(ExploreSection); diff --git a/src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.scss b/src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.scss new file mode 100644 index 00000000..bf3b38c7 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.scss @@ -0,0 +1,17 @@ +@use 'src/styles/abstracts' as *; + +.QuickLinks { + padding: $space-lg $space-sm $space-unit; + &__title { + margin-bottom: $space-xs; + padding: 0 $space-sm; + } + &__list { + margin-top: $space-md $space-lg; + &__ListItem { + &__Text { + flex: 1; + } + } + } +} diff --git a/src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.tsx b/src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.tsx new file mode 100644 index 00000000..edbe8aa1 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.tsx @@ -0,0 +1,112 @@ +import React from 'react'; +import { useHistory } from 'react-router-dom'; +import moment from 'moment'; + +import { Tooltip } from '@material-ui/core'; + +import { Icon, Text } from 'components/kit'; +import ListItem from 'components/kit/ListItem/ListItem'; + +import { DATE_QUERY_FORMAT } from 'config/dates/dates'; + +import { encode } from 'utils/encoder/encoder'; + +import './QuickLinks.scss'; + +const linkItems: { path: string; label: string }[] = [ + { + path: 'active', + label: 'Active runs', + }, + { + path: 'archived', + label: 'Archived runs', + }, + { + path: 'latest', + label: "Last week's runs", + }, +]; + +function QuickLinks(): React.FunctionComponentElement { + const history = useHistory(); + + const onClick: ( + e: React.MouseEvent, + value: string, + newTab?: boolean, + ) => void = React.useCallback( + (e: React.MouseEvent, value: string, newTab = false) => { + e.stopPropagation(); + if (value) { + let search = {}; + if (value === 'latest') { + search = encode({ + query: `datetime(${moment() + .subtract(7, 'day') + .format( + DATE_QUERY_FORMAT, + )}) <= run.created_at < datetime(${moment().format( + DATE_QUERY_FORMAT, + )})`, + }); + } else { + search = encode({ + query: `run.${value.toLowerCase()} == True`, + }); + } + const path = `/runs?select=${search}`; + if (newTab) { + window.open(path, '_blank'); + window.focus(); + return; + } + history.push(path); + } + }, + [history], + ); + + return ( +
+ + Quick Navigation + +
+ {linkItems.map(({ label, path }) => ( + + onClick(e, path)} + size={12} + tint={100} + > + {label} + + +
+ onClick(e, path, true)} + name='new-tab' + /> +
+
+
+ ))} +
+
+ ); +} + +export default QuickLinks; diff --git a/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearchItem.tsx b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearchItem.tsx new file mode 100644 index 00000000..9a237db8 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearchItem.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { useHistory } from 'react-router-dom'; + +import { Tooltip } from '@material-ui/core'; + +import ListItem from 'components/kit/ListItem/ListItem'; +import { Icon } from 'components/kit'; + +import useCodeHighlighter from 'hooks/useCodeHighlighter'; + +import { BookmarkIconType } from 'pages/Bookmarks/components/BookmarkCard/BookmarkCard'; + +import { encode } from 'utils/encoder/encoder'; + +function RecentSearchItem({ + query, + explorer, +}: { + query: string; + explorer: string; +}) { + const { elementRef } = useCodeHighlighter(); + const history = useHistory(); + + const onClick: (e: React.MouseEvent, newTab?: boolean) => void = + React.useCallback( + (e: React.MouseEvent, newTab?: boolean) => { + e.stopPropagation(); + const search = encode({ + query, + advancedMode: true, + advancedQuery: query, + }); + const path = `/${explorer}?select=${search}`; + if (newTab) { + window.open(path, '_blank'); + window.focus(); + return; + } + history.push(path); + }, + [explorer, history, query], + ); + return ( + +
+ onClick(e)}> + +
+            {query}
+          
+ onClick(e, true)} + name='new-tab' + /> +
+
+
+ ); +} +export default React.memo(RecentSearchItem); diff --git a/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.scss b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.scss new file mode 100644 index 00000000..b7e68184 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.scss @@ -0,0 +1,21 @@ +@use 'src/styles/abstracts' as *; + +.RecentSearches { + padding: 0 $space-sm $space-unit; + &__title { + margin-bottom: $space-xs; + padding: 0 $space-sm; + } + + pre { + max-width: 100%; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + font-size: 15px; + font-weight: $font-600; + @include monospaceFontFamily(15); + flex: 1 1; + margin: 0 $space-xs; + } +} diff --git a/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.tsx b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.tsx new file mode 100644 index 00000000..af23102f --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.tsx @@ -0,0 +1,46 @@ +import React from 'react'; + +import { Text } from 'components/kit'; + +import { getItem } from 'utils/storage'; + +import RecentSearchItem from './RecentSearchItem'; + +import './RecentSearches.scss'; + +function RecentSearches(): React.FunctionComponentElement | null { + const [recentSearches, setRecentSearches] = React.useState< + { explorer: string; query: string }[] + >([]); + + React.useEffect(() => { + const recent = getItem('recentSearches'); + if (recent) { + setRecentSearches(JSON.parse(recent)); + } + }, []); + return recentSearches.length ? ( +
+ + Recent Searches + +
+ {recentSearches.map((item, index) => ( + + ))} +
+
+ ) : null; +} + +export default React.memo(RecentSearches); diff --git a/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/useRecentSearches.ts b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/useRecentSearches.ts new file mode 100644 index 00000000..56cfc9fe --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/useRecentSearches.ts @@ -0,0 +1,5 @@ +function useRecentSearches() { + return null; +} + +export default useRecentSearches; diff --git a/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.d.ts b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.d.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.scss b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.scss new file mode 100644 index 00000000..1f3a5702 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.scss @@ -0,0 +1,19 @@ +@use 'src/styles/abstracts' as *; + +.TagsCard { + border-top: $border-dark-lighter; + padding: 1rem; + padding: $space-unit $space-sm; + &__title { + margin-bottom: $space-sm; + padding: 0 $space-sm; + } + .Badge { + border-radius: $border-radius-sm; + } + &__NavLink { + text-decoration: none; + display: block; + margin-top: $space-unit; + } +} diff --git a/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.tsx b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.tsx new file mode 100644 index 00000000..dc00ebee --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.tsx @@ -0,0 +1,72 @@ +import React from 'react'; +import { NavLink } from 'react-router-dom'; + +import DataList from 'components/kit/DataList'; +import { Button, Text } from 'components/kit'; + +import CompareSelectedRunsPopover from 'pages/Metrics/components/Table/CompareSelectedRunsPopover'; + +import { AppNameEnum } from 'services/models/explorer'; + +import useTagsCard from './useTagsCard'; + +import './TagsCard.scss'; + +function TagsCard(): React.FunctionComponentElement | null { + const { + tableRef, + tableColumns, + tableData, + tagsStore, + selectedRows, + tagsQuery, + } = useTagsCard(); + + return ( +
+ + Tags {tagsStore?.data?.length ? `(${tagsStore?.data?.length})` : ''} + + {tagsStore?.data?.length ? ( + , + ]} + /> + ) : null} + + + +
+ ); +} + +TagsCard.displayName = 'TagsCard'; + +export default React.memo(TagsCard); diff --git a/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsStore.ts b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsStore.ts new file mode 100644 index 00000000..57e39ee4 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsStore.ts @@ -0,0 +1,11 @@ +import createResource from 'modules/core/utils/createResource'; +import { fetchTagsList } from 'modules/core/api/tagsApi'; +import { ITagData } from 'modules/core/api/tagsApi/types'; + +function createTagsEngine() { + const { fetchData, state, destroy } = + createResource(fetchTagsList); + return { fetchTags: fetchData, tagsState: state, destroy }; +} + +export default createTagsEngine(); diff --git a/src/src/pages/Dashboard/components/ExploreSection/TagsCard/useTagsCard.tsx b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/useTagsCard.tsx new file mode 100644 index 00000000..bf0e6e36 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/useTagsCard.tsx @@ -0,0 +1,177 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { Checkbox } from '@material-ui/core'; + +import { Badge, Icon, Text } from 'components/kit'; + +import { IResourceState } from 'modules/core/utils/createResource'; +import { ITagData } from 'modules/core/api/tagsApi/types'; + +import createTagsEngine from './TagsStore'; + +function useTagsCard() { + const tableRef = React.useRef(null); + const [selectedRows, setSelectedRows] = React.useState([]); + const { current: tagsEngine } = React.useRef(createTagsEngine); + const tagsStore: IResourceState = tagsEngine.tagsState( + (state) => state, + ); + + React.useEffect(() => { + tagsEngine.fetchTags(); + return () => { + tagsEngine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // memoized table data + const tableData = React.useMemo(() => { + if (tagsStore.data) { + return tagsStore.data.map( + ({ name, archived, run_count, color }: ITagData) => { + return { + key: name, + name, + color, + archived, + run_count, + id: name, + }; + }, + ); + } + return []; + }, [tagsStore.data]); + + // on row selection + const onRowSelect = React.useCallback( + (rowKey?: string) => { + if (rowKey) { + const newSelectedRows = selectedRows.includes(rowKey) + ? selectedRows.filter((row: string) => row !== rowKey) + : [...selectedRows, rowKey]; + setSelectedRows(newSelectedRows); + } else if (selectedRows.length) { + setSelectedRows([]); + } else { + setSelectedRows(tableData.map(({ name }: any) => name)); + } + }, + [selectedRows, tableData], + ); + + // memoized table columns + const tableColumns = React.useMemo( + () => [ + { + dataKey: 'id', + key: 'id', + title: ( + } + className='selectCheckbox' + checkedIcon={ + tableData.length === Object.keys(selectedRows)?.length ? ( + + + + ) : ( + + + + ) + } + onClick={() => onRowSelect()} + checked={!!selectedRows.length} + /> + ), + width: '20px', + cellRenderer: ({ cellData }: any) => { + return ( + } + className='selectCheckbox' + checked={selectedRows.includes(cellData)} + checkedIcon={ + + + + } + onClick={() => onRowSelect(cellData)} + /> + ); + }, + }, + { + dataKey: 'name', + key: 'name', + title: ( + + Name + + ), + width: 'calc(100% - 50px)', + style: { paddingLeft: 10, paddingRight: 12 }, + cellRenderer: ({ cellData, rowData: { color } }: any) => ( + + ), + }, + { + dataKey: 'run_count', + key: 'run_count', + title: ( + + Runs + + ), + flexGrow: 1, + style: { textAlign: 'right' }, + width: '46px', + cellRenderer: ({ cellData }: any) => ( + + {cellData} + + ), + }, + ], + [tableData?.length, onRowSelect, selectedRows], + ); + + // Update the table data and columns when the tags data changes + React.useEffect(() => { + if (tableRef.current?.updateData) { + tableRef.current.updateData({ + newColumns: tableColumns, + newData: tableData, + }); + } + }, [tableData, tableColumns]); + + const tagsQuery = React.useMemo(() => { + return `any([t in [${_.uniq(selectedRows) + .map((val: string) => `"${val}"`) + .join(',')}] for t in run.tags])`; + }, [selectedRows]); + + return { + tableRef, + tableColumns, + tableData, + tagsStore, + selectedRows, + tagsQuery, + }; +} +export default useTagsCard; diff --git a/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.scss b/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.scss new file mode 100644 index 00000000..e5e9c7cc --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.scss @@ -0,0 +1,44 @@ +@use 'src/styles/abstracts' as *; + +.ProjectContributions { + margin: 1.75rem 0; + &__HeatMap { + display: flex; + overflow: hidden; + @media only screen and (max-width: 1452px) { + justify-content: flex-end; + } + } + &__Statistics__card { + background: linear-gradient(97.73deg, #8c32af 0%, #6bace5 100%); + opacity: 0.8; + border-radius: $border-radius-main; + width: 13.125em; + height: 80px; + color: $white; + position: relative; + span { + display: block; + } + + &:after { + content: url('../../../../../src/assets/experiments.svg'); + position: absolute; + right: 0; + top: 0; + opacity: 0.4; + } + + &:last-child { + margin-top: 6px; + background: linear-gradient(98.46deg, #1473e6 0%, #09c6f9 100%); + &:after { + content: url('../../../../../src/assets/runs.svg'); + } + } + } + + &__loader { + margin-top: 0.5rem; + } +} diff --git a/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.tsx b/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.tsx new file mode 100644 index 00000000..7bede888 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.tsx @@ -0,0 +1,48 @@ +import React from 'react'; + +import HeatMap from 'components/HeatMap/HeatMap'; +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import { trackEvent } from 'services/analytics'; + +import useProjectContributions from './useProjectContributions'; + +import './ProjectContributions.scss'; + +function ProjectContributions(): React.FunctionComponentElement { + const { projectContributionsStore } = useProjectContributions(); + function shiftDate(date: any, numDays: any) { + const newDate = new Date(date); + newDate.setDate(newDate.getDate() + numDays); + return newDate; + } + let today = new Date(); + return ( + +
+ + Contributions + +
+ { + trackEvent(ANALYTICS_EVENT_KEYS.dashboard.activityCellClick); + }} + data={Object.keys( + projectContributionsStore.data?.activity_map ?? {}, + ).map((k) => [ + new Date(k), + projectContributionsStore.data?.activity_map[k], + ])} + /> +
+
+
+ ); +} +export default React.memo(ProjectContributions); diff --git a/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributionsStore.ts b/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributionsStore.ts new file mode 100644 index 00000000..2a133c65 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributionsStore.ts @@ -0,0 +1,17 @@ +import { + getProjectContributions, + GetProjectContributionsResult, +} from 'modules/core/api/projectApi'; +import createResource from 'modules/core/utils/createResource'; + +function projectContributionsEngine() { + const { fetchData, state, destroy } = + createResource(getProjectContributions); + return { + fetchProjectContributions: fetchData, + projectContributionsState: state, + destroy, + }; +} + +export default projectContributionsEngine(); diff --git a/src/src/pages/Dashboard/components/ProjectContributions/useProjectContributions.tsx b/src/src/pages/Dashboard/components/ProjectContributions/useProjectContributions.tsx new file mode 100644 index 00000000..c13a19fb --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectContributions/useProjectContributions.tsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import { GetProjectContributionsResult } from 'modules/core/api/projectApi'; +import { IResourceState } from 'modules/core/utils/createResource'; + +import projectContributionsEngine from './ProjectContributionsStore'; + +function useProjectContributions() { + const { current: engine } = React.useRef(projectContributionsEngine); + const projectContributionsStore: IResourceState = + engine.projectContributionsState((state) => state); + + React.useEffect(() => { + if (!projectContributionsStore.data) { + engine.fetchProjectContributions(); + } + return () => { + engine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return { + projectContributionsStore, + }; +} + +export default useProjectContributions; diff --git a/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.d.ts b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.d.ts new file mode 100644 index 00000000..885275a4 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.d.ts @@ -0,0 +1,12 @@ +import * as React from 'react'; + +import { IconName } from 'components/kit/Icon'; + +export interface IProjectStatistic { + label: string; + count: number; + iconBgColor?: string; + icon?: IconName; + navLink?: string; + badge?: { value: string; style?: React.CSSProperties }; +} diff --git a/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.scss b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.scss new file mode 100644 index 00000000..5e98dce1 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.scss @@ -0,0 +1,20 @@ +@use 'src/styles/abstracts' as *; + +.ProjectStatistics { + &__totalRuns { + margin-top: $space-lg; + } + &__trackedSequences { + margin-top: $space-lg; + } + &__cards { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: $space-unit; + margin-top: $space-sm; + } + &__bar { + margin-top: $space-sm; + } +} diff --git a/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.tsx b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.tsx new file mode 100644 index 00000000..d2bf9177 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.tsx @@ -0,0 +1,250 @@ +import * as React from 'react'; + +import { Text } from 'components/kit'; +import StatisticsCard from 'components/StatisticsCard'; +import StatisticsBar from 'components/StatisticsBar'; + +import routes from 'routes/routes'; + +import { SequenceTypesEnum } from 'types/core/enums'; + +import { encode } from 'utils/encoder/encoder'; + +import { IProjectStatistic, useProjectStatistics } from '.'; + +import './ProjectStatistics.scss'; + +const statisticsInitialMap: Record = { + [SequenceTypesEnum.Metric]: { + label: 'Metrics', + count: 0, + icon: 'metrics', + iconBgColor: '#7A4CE0', + navLink: routes.METRICS.path, + }, + systemMetrics: { + label: 'Sys. metrics', + count: 0, + icon: 'metrics', + iconBgColor: '#AF4EAB', + navLink: `${routes.METRICS.path}?select=${encode({ + advancedQuery: "metric.name.startswith('__system__') == True", + advancedMode: true, + })}`, + }, + [SequenceTypesEnum.Figures]: { + label: 'Figures', + icon: 'figures', + count: 0, + iconBgColor: '#18AB6D', + navLink: routes.FIGURES_EXPLORER.path, + }, + [SequenceTypesEnum.Images]: { + label: 'Images', + icon: 'images', + count: 0, + iconBgColor: '#F17922', + navLink: routes.IMAGE_EXPLORE.path, + }, + [SequenceTypesEnum.Audios]: { + label: 'Audios', + icon: 'audios', + count: 0, + iconBgColor: '#FCB500', + navLink: routes.AUDIOS_EXPLORER.path, + badge: { + value: 'New', + style: { backgroundColor: '#1473e6', color: '#fff' }, + }, + }, + [SequenceTypesEnum.Texts]: { + label: 'Texts', + icon: 'text', + count: 0, + iconBgColor: '#E149A0', + navLink: routes.TEXT_EXPLORER.path, + badge: { + value: 'New', + style: { backgroundColor: '#1473e6', color: '#fff' }, + }, + }, + [SequenceTypesEnum.Distributions]: { + label: 'Distributions', + icon: 'distributions', + count: 0, + iconBgColor: '#0394B4', + navLink: '', + badge: { + value: 'Explorer coming soon', + }, + }, +}; + +const runsCountingInitialMap: Record<'archived' | 'runs', IProjectStatistic> = { + runs: { + label: 'runs', + icon: 'runs', + count: 0, + iconBgColor: '#1473E6', + navLink: routes.RUNS.path, + }, + archived: { + label: 'archived', + icon: 'archive', + count: 0, + iconBgColor: '#606986', + navLink: `/runs?select=${encode({ query: 'run.archived == True' })}`, + }, +}; + +function ProjectStatistics() { + const [hoveredState, setHoveredState] = React.useState({ + source: '', + id: '', + }); + const { projectParamsStore, projectContributionsStore } = + useProjectStatistics(); + + const { statisticsMap, totalTrackedSequencesCount } = React.useMemo(() => { + const statistics = { ...statisticsInitialMap }; + let totalTrackedSequencesCount = 0; + + for (let [seqName, seqData] of Object.entries( + projectParamsStore.data || {}, + )) { + let systemMetricsCount = 0; + let sequenceItemsCount = 0; + for (let [itemKey, itemData] of Object.entries(seqData)) { + if (itemKey.startsWith('__system__')) { + systemMetricsCount += itemData.length; + } else { + sequenceItemsCount += itemData.length; + } + } + totalTrackedSequencesCount += sequenceItemsCount; + statistics[seqName].count = sequenceItemsCount; + if (systemMetricsCount) { + totalTrackedSequencesCount += systemMetricsCount; + statistics.systemMetrics.count = systemMetricsCount; + } + } + return { statisticsMap: statistics, totalTrackedSequencesCount }; + }, [projectParamsStore]); + + const { totalRunsCount, archivedRuns } = React.useMemo( + () => ({ + totalRunsCount: projectContributionsStore.data?.num_runs || 0, + archivedRuns: projectContributionsStore.data?.num_archived_runs || 0, + }), + [projectContributionsStore], + ); + const statisticsBarData = React.useMemo( + () => + Object.values(statisticsMap).map( + ({ label, iconBgColor = '#000', count }) => ({ + highlighted: hoveredState.id === label, + label, + color: iconBgColor, + percent: + totalTrackedSequencesCount === 0 + ? 0 + : (count / totalTrackedSequencesCount) * 100, + }), + ), + [statisticsMap, totalTrackedSequencesCount, hoveredState], + ); + const runsCountingMap = React.useMemo( + () => ({ + runs: { + ...runsCountingInitialMap.runs, + count: totalRunsCount - archivedRuns, + }, + archived: { + ...runsCountingInitialMap.archived, + count: archivedRuns, + }, + }), + [archivedRuns, totalRunsCount], + ); + const onMouseOver = React.useCallback((id = '', source = '') => { + setHoveredState({ source, id }); + }, []); + const onMouseLeave = React.useCallback(() => { + setHoveredState({ source: '', id: '' }); + }, []); + return ( +
+ + Total runs: {totalRunsCount} + +
+ {Object.values(runsCountingMap).map( + ({ label, icon, count, iconBgColor, navLink }) => ( + + ), + )} +
+ + Tracked sequences + +
+ {Object.values(statisticsMap).map( + ({ label, icon, count, iconBgColor, navLink, badge }) => ( + + ), + )} +
+
+ +
+
+ ); +} + +ProjectStatistics.displayName = 'ProjectStatistics'; + +export default React.memo(ProjectStatistics); diff --git a/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatisticsStore.ts b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatisticsStore.ts new file mode 100644 index 00000000..a9cca3a1 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatisticsStore.ts @@ -0,0 +1,23 @@ +import createResource from 'modules/core/utils/createResource'; +import { getParams, GetParamsResult } from 'modules/core/api/projectApi'; + +import { SequenceTypesEnum } from 'types/core/enums'; + +function projectStatisticsEngine() { + const { fetchData, state, destroy } = createResource(() => + getParams({ + sequence: [ + SequenceTypesEnum.Metric, + SequenceTypesEnum.Images, + SequenceTypesEnum.Figures, + SequenceTypesEnum.Texts, + SequenceTypesEnum.Audios, + SequenceTypesEnum.Distributions, + ], + exclude_params: true, + }), + ); + return { fetchProjectParams: fetchData, projectParamsState: state, destroy }; +} + +export default projectStatisticsEngine(); diff --git a/src/src/pages/Dashboard/components/ProjectStatistics/index.tsx b/src/src/pages/Dashboard/components/ProjectStatistics/index.tsx new file mode 100644 index 00000000..8b236988 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectStatistics/index.tsx @@ -0,0 +1,7 @@ +import ProjectStatistics from './ProjectStatistics'; +import useProjectStatistics from './useProjectStatistics'; + +export * from './ProjectStatistics.d'; +export { useProjectStatistics }; + +export default ProjectStatistics; diff --git a/src/src/pages/Dashboard/components/ProjectStatistics/useProjectStatistics.tsx b/src/src/pages/Dashboard/components/ProjectStatistics/useProjectStatistics.tsx new file mode 100644 index 00000000..57b602bc --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectStatistics/useProjectStatistics.tsx @@ -0,0 +1,31 @@ +import * as React from 'react'; + +import projectContributionsEngine from '../ProjectContributions/ProjectContributionsStore'; + +import projectStatisticsEngine from './ProjectStatisticsStore'; + +function useProjectStatistics() { + const { current: projectStatsEngine } = React.useRef(projectStatisticsEngine); + const projectParamsStore = projectStatsEngine.projectParamsState( + (state) => state, + ); + const { current: contributionsEngine } = React.useRef( + projectContributionsEngine, + ); + const projectContributionsStore = + contributionsEngine.projectContributionsState((state) => state); + + React.useEffect(() => { + if (!projectParamsStore.data) { + projectStatsEngine.fetchProjectParams(); + } + return () => { + projectStatsEngine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [projectStatsEngine]); + + return { projectParamsStore, projectContributionsStore }; +} + +export default useProjectStatistics; diff --git a/src/src/pages/Dashboard/components/QuickStart/QuickStart.scss b/src/src/pages/Dashboard/components/QuickStart/QuickStart.scss new file mode 100644 index 00000000..65dec975 --- /dev/null +++ b/src/src/pages/Dashboard/components/QuickStart/QuickStart.scss @@ -0,0 +1,14 @@ +@use 'src/styles/abstracts' as *; + +.QuickStart__section { + padding: $space-lg 0; +} + +.QuickStart__section__title { + margin-bottom: $space-sm; +} + +.QuickStart__section__text { + font-style: italic; + margin-top: $space-sm; +} diff --git a/src/src/pages/Dashboard/components/QuickStart/QuickStart.tsx b/src/src/pages/Dashboard/components/QuickStart/QuickStart.tsx new file mode 100644 index 00000000..4608789d --- /dev/null +++ b/src/src/pages/Dashboard/components/QuickStart/QuickStart.tsx @@ -0,0 +1,74 @@ +import * as React from 'react'; + +import { Link } from '@material-ui/core'; + +import { Text } from 'components/kit'; +import CodeBlock from 'components/CodeBlock/CodeBlock'; + +import { DOCUMENTATIONS } from 'config/references'; + +import './QuickStart.scss'; + +function QuickStart() { + return ( +
+ + Quick Start + +
+ + Integrate Aim with your code + + + + See the full list of supported trackable objects(e.g. images, text, + etc){' '} + + here + + . + +
+
+ ); +} + +export default QuickStart; diff --git a/src/src/pages/Dashboard/components/QuickStart/index.ts b/src/src/pages/Dashboard/components/QuickStart/index.ts new file mode 100644 index 00000000..a9701cfe --- /dev/null +++ b/src/src/pages/Dashboard/components/QuickStart/index.ts @@ -0,0 +1,3 @@ +import QuickStart from './QuickStart'; + +export default QuickStart; diff --git a/src/src/pages/Experiment/Experiment.scss b/src/src/pages/Experiment/Experiment.scss new file mode 100644 index 00000000..19449e09 --- /dev/null +++ b/src/src/pages/Experiment/Experiment.scss @@ -0,0 +1,109 @@ +@use 'src/styles/abstracts' as *; + +.Experiment { + height: 100%; + background: $cuddle-10; + &__tabsContainer { + background: $white; + box-shadow: 0 toRem(4px) toRem(6px) rgba(144, 175, 218, 0.2), + 0 1px 0 0 $cuddle-20; + border-top: $border-grey-lighter; + position: relative; + z-index: 1; + &__tabs { + .MuiTabs-fixed { + overflow: auto !important; + } + .MuiTabs-scroller { + --ms-overflow-style: none; + --scrollbar-width: none; + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } + } + .MuiTabs-indicator { + display: none; + } + } + .PrivateTabIndicator-root-1 { + display: none; + } + .MuiTabs-root { + height: toRem(40px); + min-height: auto; + } + .MuiTabs-flexContainer { + .MuiTab-textColorPrimary { + color: $pico-80; + font-size: $text-md; + font-weight: $font-500; + text-transform: unset; + min-height: toRem(40px); + transition: all 0.18s ease-out; + &:hover { + color: $pico; + background-color: $cuddle-30; + } + .MuiTab-wrapper { + line-height: 1.05; + } + &.MuiTab-root { + padding: 0.625rem $space-unit; + min-width: auto !important; + border-right: 1px solid transparent; + text-transform: capitalize; + } + &.Mui-selected { + color: $pico; + position: relative; + &::before { + content: ''; + width: 100%; + height: toRem(3px); + background: $primary-color; + position: absolute; + left: 0; + bottom: 0; + transition: all 3s; + } + } + } + } + .PrivateTabIndicator-root-5 { + display: none; + } + &.MuiPaper-rounded { + border-radius: unset; + } + } + &__tabPanelBox { + overflow-y: auto; + height: calc(100vh - 112px); + &__suspenseLoaderContainer { + width: 100%; + display: flex; + justify-content: center; + height: 100%; + align-items: center; + } + } + &__tabPanel { + .MuiBox-root { + height: 100%; + .RunDetailTabLoader { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + } + } + &.overviewPanel { + position: relative; + overflow: hidden; + .RunOverviewTab { + padding: 0 $space-unit; + } + } + } +} diff --git a/src/src/pages/Experiment/Experiment.tsx b/src/src/pages/Experiment/Experiment.tsx new file mode 100644 index 00000000..9c9fb38e --- /dev/null +++ b/src/src/pages/Experiment/Experiment.tsx @@ -0,0 +1,249 @@ +import React, { LazyExoticComponent } from 'react'; +import { + Route, + Switch, + useHistory, + useLocation, + useParams, + useRouteMatch, +} from 'react-router-dom'; +import { Link } from 'react-router-dom'; + +import { Paper, Tab, Tabs } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import BusyLoaderWrapper from 'components/BusyLoaderWrapper/BusyLoaderWrapper'; +import NotificationContainer, { + useNotificationContainer, +} from 'components/NotificationContainer'; +import { Spinner } from 'components/kit'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { setDocumentTitle } from 'utils/document/documentTitle'; + +import ExperimentHeader from './components/ExperimentHeader'; +import useExperimentState from './useExperimentState'; + +import './Experiment.scss'; + +const ExperimentOverviewTab = React.lazy( + () => + import( + /* webpackChunkName: "ExperimentOverviewTab" */ './components/ExperimentOverviewTab' + ), +); + +const ExperimentRunsTab = React.lazy( + () => + import( + /* webpackChunkName: "ExperimentOverviewTab" */ './components/ExperimentRunsTab' + ), +); + +const ExperimentNotesTab = React.lazy( + () => + import( + /* webpackChunkName: "ExperimentOverviewTab" */ './components/ExperimentNotesTab' + ), +); + +const ExperimentSettingsTab = React.lazy( + () => + import( + /* webpackChunkName: "ExperimentOverviewTab" */ './components/ExperimentSettingsTab' + ), +); + +const tabs: Record = { + overview: 'Overview', + runs: 'Runs', + notes: 'Notes', + settings: 'Settings', +}; + +function Experiment(): React.FunctionComponentElement { + const { experimentId } = useParams<{ experimentId: string }>(); + const history = useHistory(); + const { url } = useRouteMatch(); + const { pathname } = useLocation(); + const [activeTab, setActiveTab] = React.useState(pathname); + const { + experimentState, + experimentsState, + getExperimentsData, + updateExperiment, + } = useExperimentState(experimentId); + const { notificationState, onNotificationDelete } = + useNotificationContainer(); + + const { data: experimentData, loading: isExperimentLoading } = + experimentState; + + const { data: experimentsData, loading: isExperimentsLoading } = + experimentsState; + + const tabContent: Record< + string, + { props: Record; Component: LazyExoticComponent } + > = { + overview: { + props: { + experimentName: experimentData?.name ?? '', + experimentId, + description: experimentData?.description ?? '', + }, + Component: ExperimentOverviewTab, + }, + runs: { + props: { + experimentName: experimentData?.name ?? '', + experimentId, + }, + Component: ExperimentRunsTab, + }, + notes: { + props: { + experimentId, + }, + Component: ExperimentNotesTab, + }, + settings: { + props: { + experimentName: experimentData?.name ?? '', + updateExperiment, + description: experimentData?.description ?? '', + }, + Component: ExperimentSettingsTab, + }, + }; + + function handleTabChange(event: React.ChangeEvent<{}>, newValue: string) { + setActiveTab(newValue); + } + + function redirect(): void { + const splitPathname: string[] = pathname.split('/'); + const path: string = `${url}/overview`; + if (splitPathname.length > 4) { + history.replace(path); + setActiveTab(path); + return; + } + if (splitPathname[3]) { + if (!Object.keys(tabs).includes(splitPathname[3])) { + history.replace(path); + } + } else { + history.replace(path); + } + setActiveTab(path); + } + + function getCurrentTabValue(pathname: string, url: string) { + const values = Object.keys(tabs).map((tabKey) => `${url}/${tabKey}`); + return values.indexOf(pathname) === -1 ? false : pathname; + } + + React.useEffect(() => { + if (pathname !== activeTab) { + setActiveTab(pathname); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [pathname]); + + React.useEffect(() => { + setDocumentTitle(experimentData?.name || experimentId, true); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [experimentData]); + + React.useEffect(() => { + redirect(); + analytics.pageView(ANALYTICS_EVENT_KEYS.experiment.pageView); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + +
+ + + + {Object.keys(tabs).map((tabKey: string) => ( + + ))} + + + + + {Object.keys(tabs).map((tabKey: string) => { + const { Component, props } = tabContent[tabKey]; + return ( + + + {tabKey === 'overview' ? ( +
+ + +
+ } + > + + + + ) : ( +
+
+ + +
+ } + > + + +
+ + )} +
+
+ ); + })} +
+
+
+ +
+ ); +} +export default React.memo(Experiment); diff --git a/src/src/pages/Experiment/ExperimentStore.ts b/src/src/pages/Experiment/ExperimentStore.ts new file mode 100644 index 00000000..42bcf8fd --- /dev/null +++ b/src/src/pages/Experiment/ExperimentStore.ts @@ -0,0 +1,64 @@ +import { notificationContainerStore } from 'components/NotificationContainer'; + +import { + getExperimentById, + getExperiments, + updateExperimentById, + IExperimentData, +} from 'modules/core/api/experimentsApi'; +import createResource from 'modules/core/utils/createResource'; + +import * as analytics from 'services/analytics'; + +function experimentEngine() { + const { + fetchData: fetchExperimentData, + state: experimentState, + destroy: destroyExperiment, + } = createResource(getExperimentById); + const { + fetchData: fetchExperimentsData, + state: experimentsState, + destroy: destroyExperiments, + } = createResource(getExperiments); + + function updateExperiment(name: string, description: string) { + const experimentData = experimentState.getState().data; + updateExperimentById( + { name, description, archived: experimentData?.archived }, + experimentData?.id || '', + ) + .then(() => { + experimentState.setState((prev: any) => ({ + data: { ...prev.data, name, description }, + })); + notificationContainerStore.onNotificationAdd({ + id: Date.now(), + messages: ['Changes successfully saved'], + severity: 'success', + }); + analytics.trackEvent( + '[Experiment] Edit Experiment name and description', + ); + }) + .catch((err) => { + notificationContainerStore.onNotificationAdd({ + id: Date.now(), + messages: [err.message || 'Something went wrong'], + severity: 'error', + }); + }); + } + + return { + fetchExperimentData, + experimentState, + destroyExperiment, + fetchExperimentsData, + experimentsState, + destroyExperiments, + updateExperiment, + }; +} + +export default experimentEngine(); diff --git a/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.d.ts b/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.d.ts new file mode 100644 index 00000000..af88ddb5 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.d.ts @@ -0,0 +1,10 @@ +import { IExperimentData } from 'modules/core/api/experimentsApi/types'; + +export interface IExperimentHeaderProps { + isExperimentLoading: boolean; + experimentData: IExperimentData | null; + isExperimentsLoading: boolean; + experimentsData: IExperimentData[] | null; + experimentId: string; + getExperimentsData: () => void; +} diff --git a/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.scss b/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.scss new file mode 100644 index 00000000..d202fc4f --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.scss @@ -0,0 +1,100 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentHeader { + &__headerContainer { + height: 4.375rem; + background: $white; + display: flex; + align-items: center; + &__appBarBox { + display: flex; + padding-top: $space-unit; + justify-content: space-between; + &__navigationContainer { + max-width: 50%; + width: 50%; + } + &__actionContainer { + width: 4.5rem; + display: flex; + justify-content: center; + align-items: center; + border-left: $border-main; + margin-bottom: $space-unit; + i { + color: $pico-70; + } + a { + text-decoration: unset; + } + } + } + &__appBarTitleBox { + display: flex; + flex-direction: column; + font-size: $text-md; + font-weight: $font-600; + color: $text-color; + align-items: flex-start; + height: fit-content; + max-width: 100%; + width: auto; + &__appBarTitleBoxWrapper { + display: flex; + width: 100%; + } + &__title { + margin-bottom: $space-xxs; + } + &__date { + display: flex; + i { + margin-right: $space-xxs; + color: $pico-70; + } + } + &__Skeleton { + margin-right: $space-xs; + } + &__buttonSelectToggler { + width: 1.5rem; + height: 1.5rem; + top: -$space-xxxxs; + &.opened { + background: $primary-color-10; + } + .MuiButton-label { + padding-top: $space-xxxxs; + } + } + &__container { + display: flex; + align-items: flex-start; + flex-direction: column; + margin-right: $space-xxxs; + cursor: pointer; + max-width: calc(100% - 6.5rem); + + &__pageName { + margin-right: 0.4375em; + text-transform: capitalize; + text-decoration: none; + } + &__runHash { + margin-left: 0.4375em; + text-transform: lowercase; + } + } + span { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 100%; + } + } + .StatusLabel { + margin-left: $space-xs; + } + } +} diff --git a/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.tsx b/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.tsx new file mode 100644 index 00000000..59cd4f6d --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.tsx @@ -0,0 +1,134 @@ +import React from 'react'; +import classNames from 'classnames'; +import { NavLink, useRouteMatch } from 'react-router-dom'; +import moment from 'moment'; + +import { Skeleton } from '@material-ui/lab'; +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { DATE_WITH_SECONDS } from 'config/dates/dates'; + +import ExperimentNavigationPopover from '../ExperimentNavigationPopover'; + +import { IExperimentHeaderProps } from '.'; + +import './ExperimentHeader.scss'; + +function ExperimentHeader({ + isExperimentLoading, + experimentData, + isExperimentsLoading, + experimentsData, + experimentId, + getExperimentsData, +}: IExperimentHeaderProps): React.FunctionComponentElement { + const { url } = useRouteMatch(); + + return ( + +
+
+
+ ( +
+ {!isExperimentLoading ? ( + <> +
+ +
+ + {`${experimentData?.name || 'default'}`} + +
+
+ + +
+ + ) : ( +
+ + +
+ )} +
+ )} + component={ + + } + /> +
+ {!isExperimentLoading ? ( + <> + + + {`${moment( + (experimentData?.creation_time || 0) * 1000, + ).format(DATE_WITH_SECONDS)}`} + + + ) : ( + + )} +
+
+
+ + + +
+
+
+
+ ); +} +export default ExperimentHeader; diff --git a/src/src/pages/Experiment/components/ExperimentHeader/index.ts b/src/src/pages/Experiment/components/ExperimentHeader/index.ts new file mode 100644 index 00000000..f4b50871 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentHeader/index.ts @@ -0,0 +1,4 @@ +import ExperimentHeader from './ExperimentHeader'; + +export * from './ExperimentHeader.d'; +export default ExperimentHeader; diff --git a/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.d.ts b/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.d.ts new file mode 100644 index 00000000..53c3cda2 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.d.ts @@ -0,0 +1,8 @@ +import { IExperimentData } from 'modules/core/api/experimentsApi/types'; + +export interface IExperimentNavigationPopoverProps { + experimentsData: IExperimentData[] | null; + experimentId: string; + isExperimentsLoading: boolean; + getExperimentsData: () => void; +} diff --git a/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.scss b/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.scss new file mode 100644 index 00000000..f1876222 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.scss @@ -0,0 +1,116 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentNavigationPopover { + height: 20rem; + width: 28rem; + &__contentContainer { + height: calc(100% - 2.25rem); + display: flex; + &__experimentsListContainer { + background: $white; + width: 100%; + height: 100%; + position: relative; + padding: $space-xxs $space-xs 0 $space-xs; + &::before { + content: ''; + position: absolute; + background: linear-gradient( + 180deg, + rgba(248, 250, 253, 0) 0%, + #f8fafd 75.52% + ); + height: $space-xs; + width: 100%; + bottom: 0; + left: 0; + z-index: 1; + } + &__experimentList { + overflow-y: auto; + height: 100%; + .experimentBox { + position: relative; + width: 100%; + text-decoration: none; + height: auto; + padding: $space-xs; + display: flex; + align-items: flex-start; + cursor: pointer; + text-decoration: unset; + margin-bottom: $space-xxxxs; + position: relative; + flex-direction: column; + border-radius: 0.25rem; + + &:hover { + background: $cuddle-20; + } + &__experimentName { + width: 100%; + word-break: break-all; + margin-bottom: 0.375rem; + @include monospaceFontFamily(); + } + &__date { + display: flex; + align-items: center; + @include monospaceFontFamily(14); + i { + margin-right: $space-xxs; + } + } + &.selected { + background: $primary-color-10; + &:hover { + border-radius: 0.3125rem 0 0 0.3125rem; + } + } + &:last-child { + margin-bottom: 0; + } + } + } + } + } + &__headerContainer { + background: $primary-color-5; + width: 100%; + height: 2.25rem; + display: flex; + border-bottom: $border-main; + i { + transform: rotate(90deg); + align-items: center; + display: flex; + } + &__titleContainer { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + &:first-child { + border-right: $border-main; + } + } + } + + &__loaderContainer { + height: 100%; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + } + .MuiPaper-root { + width: 37.5rem; + background: $white; + border: $border-main; + box-sizing: border-box; + box-shadow: 0 0.25rem 0.375rem rgba(144, 175, 218, 0.2); + border-radius: 0.3125rem 0.3125rem 0 0; + height: 20rem; + } +} diff --git a/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.tsx b/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.tsx new file mode 100644 index 00000000..0000174a --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.tsx @@ -0,0 +1,92 @@ +import React from 'react'; +import classNames from 'classnames'; +import moment from 'moment'; +import { NavLink, useLocation } from 'react-router-dom'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { Icon, Spinner, Text } from 'components/kit'; + +import { DATE_WITH_SECONDS } from 'config/dates/dates'; + +import { IExperimentNavigationPopoverProps } from '.'; + +import './ExperimentNavigationPopover.scss'; + +function ExperimentNavigationPopover({ + experimentsData, + experimentId, + isExperimentsLoading, + getExperimentsData, +}: IExperimentNavigationPopoverProps): React.FunctionComponentElement { + const { pathname } = useLocation(); + + React.useEffect(() => { + if (!experimentsData) { + getExperimentsData(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + +
+
+
+ + Experiments + +
+
+
+
+
+ {!isExperimentsLoading ? ( + experimentsData?.map((experiment) => ( + + + {experiment?.name ?? 'default'} + +
+ + + {`${moment(experiment.creation_time * 1000).format( + DATE_WITH_SECONDS, + )}`} + +
+
+ )) + ) : ( +
+ +
+ )} +
+
+
+
+
+ ); +} +export default ExperimentNavigationPopover; diff --git a/src/src/pages/Experiment/components/ExperimentNavigationPopover/index.ts b/src/src/pages/Experiment/components/ExperimentNavigationPopover/index.ts new file mode 100644 index 00000000..002308eb --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNavigationPopover/index.ts @@ -0,0 +1,4 @@ +import ExperimentNavigationPopover from './ExperimentNavigationPopover'; + +export * from './ExperimentNavigationPopover.d'; +export default ExperimentNavigationPopover; diff --git a/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesEngine.ts b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesEngine.ts new file mode 100644 index 00000000..4b95e83f --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesEngine.ts @@ -0,0 +1,68 @@ +import { notificationContainerStore } from 'components/NotificationContainer'; + +import { + createExperimentNote, + getExperimentNote, + GetExperimentNoteResult, + updateExperimentNote, +} from 'modules/core/api/experimentsApi'; +import createResource from 'modules/core/utils/createResource'; + +function createExperimentNotesEngine() { + const { fetchData, state, destroy } = createResource( + (experimentId: string) => getExperimentNote(experimentId), + ); + + return { + fetchExperimentNote: (experimentId: string) => fetchData(experimentId), + createExperimentNote: (experimentId: string, content: string) => + createExperimentNote(experimentId, { content }) + .then((res) => { + state.setState((prev: any) => ({ + ...prev, + data: [{ content, ...res }], + })); + notificationContainerStore.onNotificationAdd({ + id: Date.now(), + messages: ['Note successfully created'], + severity: 'success', + }); + }) + .catch((err) => + notificationContainerStore.onNotificationAdd({ + id: Date.now(), + messages: [err.message || 'Something went wrong'], + severity: 'error', + }), + ), + updateExperimentNote: ( + experimentId: string, + noteId: string, + content: string, + ) => { + return updateExperimentNote(experimentId, noteId, { content }) + .then((res) => { + state.setState((prev: any) => ({ + ...prev, + data: [{ ...prev.data[0], updated_at: res.updated_at }], + })); + notificationContainerStore.onNotificationAdd({ + id: Date.now(), + messages: ['Note successfully updated'], + severity: 'success', + }); + }) + .catch((err) => { + notificationContainerStore.onNotificationAdd({ + id: Date.now(), + messages: [err.message || 'Something went wrong'], + severity: 'error', + }); + }); + }, + experimentNoteState: state, + destroy, + }; +} + +export default createExperimentNotesEngine(); diff --git a/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.d.ts b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.d.ts new file mode 100644 index 00000000..b70a08fd --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.d.ts @@ -0,0 +1,3 @@ +export interface IExperimentNotesTabProps { + experimentId: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.scss b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.scss new file mode 100644 index 00000000..3ca937e9 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.scss @@ -0,0 +1,136 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentNotesTab { + .isLoading { + .ProseMirror { + opacity: 0; + } + } + padding: 1.5rem 0; + height: 100%; + &__Editor { + height: 100%; + position: relative; + &__actionPanel { + display: flex; + background-color: $cuddle-20; + justify-content: space-between; + padding: $space-xs $space-lg; + border-radius: $border-radius-lg $border-radius-lg 0 0; + border: $border-grey; + &__info { + display: flex; + align-items: center; + &-field { + display: flex; + align-items: center; + i { + margin-right: $space-sm; + } + &:first-child { + margin-right: $space-unit; + } + } + } + &__saveBtn { + &.Mui-disabled { + color: $white !important; + } + } + } + &__container { + justify-content: start !important; + height: calc(100% - 44px); + & > div:first-child { + height: 100%; + border-radius: 0 0 $border-radius-lg $border-radius-lg; + border: $border-grey; + border-top: 0; + } + } + .ProseMirror { + font-size: $text-lg; + padding: $space-unit 2rem; + padding-left: toRem(48px); + font-family: 'Inter', sans-serif; + font-weight: $font-500; + height: 100%; + opacity: 1; + color: $pico; + transition: opacity 0.18s ease-out; + overflow: auto; + .block-menu-trigger { + margin-left: toRem(-27px); + &:hover { + color: $pico-80; + } + } + code { + font-size: 100%; + } + input { + background-color: unset; + } + a { + color: $denim; + } + &-selectednode { + outline: $border-main-active !important; + } + hr { + &::before { + border-top: 0.0625rem solid #bdcee8; + } + } + .page-break { + &::before { + border-top: 0.0625rem dashed #bdcee8; + } + } + .heading-actions { + display: none; + } + h1, + h2, + h3, + h4 { + &::before { + content: unset !important; + display: none !important; + } + } + mark { + background-color: $mark-color; + color: $pico; + } + h1 { + font-size: $text-xxxl; + } + } + } + &__spinnerWrapper { + position: absolute; + height: 100%; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + top: 0; + left: 0; + } +} +#block-menu-container { + box-shadow: 0 0.25rem 0.375rem rgb(144 175 218 / 20%); + border: 0.0625rem solid #e8f1fc; + svg { + fill: $pico-80; + } +} + +#notes-toolbar-popover { + box-shadow: 0 0.25rem 0.375rem rgb(144 175 218 / 20%); + border: $border-grey-light; + &::before { + content: unset !important; + } +} diff --git a/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.tsx b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.tsx new file mode 100644 index 00000000..1f13495a --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.tsx @@ -0,0 +1,147 @@ +import React from 'react'; +import moment from 'moment'; +import Editor from 'rich-markdown-editor'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon, Spinner, Text } from 'components/kit'; +import RouteLeavingGuard from 'components/RouteLeavingGuard'; + +import { YEAR_MONTH_DAY_DATE_FORMAT } from 'config/dates/dates'; +import { RichEditorThemeColors } from 'config/colors/colors'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import NoteTooltip from 'pages/RunDetail/RunDetailNotesTab/NoteTooltip'; + +import * as analytics from 'services/analytics'; + +import useExperimentNotes from './useExperimentNotes'; + +import { IExperimentNotesTabProps } from '.'; + +import './ExperimentNotesTab.scss'; + +function ExperimentNotesTab( + props: IExperimentNotesTabProps, +): React.FunctionComponentElement { + const { isLoading, noteData, onNoteCreate, onNoteUpdate } = + useExperimentNotes(props.experimentId)!; + const [value, setValue] = React.useState(''); + const [saveDisabled, setSaveDisabled] = React.useState(true); + const [theme, setTheme] = React.useState(null); + const editorRef = React.useRef(null); + + React.useEffect(() => { + if (editorRef.current) { + setValue(noteData?.id ? noteData?.content : ''); + setTheme({ + ...editorRef.current?.theme(), + ...RichEditorThemeColors, + }); + } + }, [noteData]); + + // CRUD handlers + const onNoteSave = React.useCallback((): void => { + setSaveDisabled(true); + if (noteData?.id) { + onNoteUpdate({ + content: editorRef.current.value(), + }).catch(() => setSaveDisabled(false)); + } else { + onNoteCreate({ + content: editorRef.current.value(), + }).catch(() => setSaveDisabled(false)); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [noteData?.id, props.experimentId]); + + const onNoteChange = React.useCallback( + (currentVal: () => string): void => { + const isSaveDisabled: boolean = value === currentVal(); + if (saveDisabled !== isSaveDisabled) { + setSaveDisabled(isSaveDisabled); + } + }, + [saveDisabled, value], + ); + + React.useEffect(() => { + analytics.pageView(ANALYTICS_EVENT_KEYS.experiment.tabs.notes.tabView); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( +
+ +
+
+
+ {noteData?.created_at && ( + +
+ + + {`${moment + .utc(noteData?.created_at) + .local() + .format(YEAR_MONTH_DAY_DATE_FORMAT)}`} + +
+
+ )} + {noteData?.updated_at && ( + +
+ + + {`${moment + .utc(noteData?.updated_at) + .local() + .format(YEAR_MONTH_DAY_DATE_FORMAT)}`} + +
+
+ )} +
+ +
+ +
+
+
+ { + return {children}; + }} + onChange={onNoteChange} + /> + {isLoading && ( +
+ +
+ )} +
+
+ ); +} +export default React.memo(ExperimentNotesTab); diff --git a/src/src/pages/Experiment/components/ExperimentNotesTab/index.ts b/src/src/pages/Experiment/components/ExperimentNotesTab/index.ts new file mode 100644 index 00000000..4de4e8b5 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNotesTab/index.ts @@ -0,0 +1,8 @@ +import ExperimentNotesTab from './ExperimentNotesTab'; +import experimentNotesEngine from './ExperimentNotesEngine'; + +export { experimentNotesEngine }; + +export * from './ExperimentNotesTab.d'; + +export default ExperimentNotesTab; diff --git a/src/src/pages/Experiment/components/ExperimentNotesTab/useExperimentNotes.tsx b/src/src/pages/Experiment/components/ExperimentNotesTab/useExperimentNotes.tsx new file mode 100644 index 00000000..00e687af --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNotesTab/useExperimentNotes.tsx @@ -0,0 +1,44 @@ +import React from 'react'; + +import experimentNotesEngine from './ExperimentNotesEngine'; + +function useExperimentNotes(experimentId: string) { + const { current: engine } = React.useRef(experimentNotesEngine); + + const experimentNoteState = engine.experimentNoteState((state) => state); + React.useEffect(() => { + if (!experimentNoteState?.data?.[0]) { + engine.fetchExperimentNote(experimentId); + } + if (experimentNoteState?.data) { + engine.destroy(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [experimentId]); + + React.useEffect(() => { + return () => engine.destroy(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + function onNoteCreate(note: { content: string }) { + return engine.createExperimentNote(experimentId, note.content); + } + + function onNoteUpdate(note: { content: string }) { + return engine.updateExperimentNote( + experimentId, + `${experimentNoteState?.data?.[0]?.id}`, + note.content, + ); + } + + return { + noteData: experimentNoteState?.data?.[0], + isLoading: experimentNoteState.loading, + onNoteCreate, + onNoteUpdate, + }; +} + +export default useExperimentNotes; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.d.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.d.ts new file mode 100644 index 00000000..ceebed1a --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.d.ts @@ -0,0 +1,4 @@ +export interface IExperimentContributionsProps { + experimentId: string; + experimentName: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.scss b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.scss new file mode 100644 index 00000000..32cc2460 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.scss @@ -0,0 +1,48 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentContributions { + margin: 1.75rem 0; + &__HeatMap { + display: flex; + overflow: hidden; + @media only screen and (max-width: 1212px) { + justify-content: flex-end; + } + } + &__Statistics__card { + background: linear-gradient(97.73deg, #8c32af 0%, #6bace5 100%); + opacity: 0.8; + border-radius: $border-radius-main; + width: 13.125em; + height: toRem(80px); + color: $white; + position: relative; + span { + display: block; + } + + &:after { + content: url('../../../../../../src/assets/experiments.svg'); + position: absolute; + right: 0; + top: 0; + opacity: 0.4; + } + + &:last-child { + margin-top: $space-xxs; + background: linear-gradient(98.46deg, #1473e6 0%, #09c6f9 100%); + &:after { + content: url('../../../../../../src/assets/runs.svg'); + } + } + } + + &__loader { + margin-top: $space-xs; + } + + h2 { + margin-bottom: $space-unit; + } +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.tsx new file mode 100644 index 00000000..432240ea --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.tsx @@ -0,0 +1,58 @@ +import React from 'react'; + +import HeatMap from 'components/HeatMap/HeatMap'; +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import { trackEvent } from 'services/analytics'; + +import useExperimentContributions from './useExperimentContributions'; + +import { IExperimentContributionsProps } from '.'; + +import './ExperimentContributions.scss'; + +function ExperimentContributions({ + experimentId, + experimentName, +}: IExperimentContributionsProps): React.FunctionComponentElement { + const { experimentContributionsState } = + useExperimentContributions(experimentId); + + function shiftDate(date: any, numDays: any) { + const newDate = new Date(date); + newDate.setDate(newDate.getDate() + numDays); + return newDate; + } + + let today = new Date(); + + return ( + +
+ + Contributions + +
+ { + trackEvent(ANALYTICS_EVENT_KEYS.dashboard.activityCellClick); + }} + additionalQuery={` and run.experiment == "${experimentName}"`} + data={Object.keys( + experimentContributionsState.data?.activity_map ?? {}, + ).map((k) => [ + new Date(k), + experimentContributionsState.data?.activity_map[k], + ])} + /> +
+
+
+ ); +} +export default React.memo(ExperimentContributions); diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributionsStore.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributionsStore.ts new file mode 100644 index 00000000..a5e7fd81 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributionsStore.ts @@ -0,0 +1,20 @@ +import { + GetExperimentContributionsResult, + getExperimentContributions, +} from 'modules/core/api/experimentsApi'; +import createResource from 'modules/core/utils/createResource'; + +function experimentContributionsEngine() { + const { fetchData, state, destroy } = + createResource( + getExperimentContributions, + ); + return { + fetchExperimentContributions: (experimentId: string) => + fetchData(experimentId), + experimentContributionsState: state, + destroy, + }; +} + +export default experimentContributionsEngine(); diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/index.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/index.ts new file mode 100644 index 00000000..fce0a473 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/index.ts @@ -0,0 +1,8 @@ +import ExperimentContributions from './ExperimentContributions'; +import experimentContributionsEngine from './ExperimentContributionsStore'; + +export * from './ExperimentContributions.d'; + +export { experimentContributionsEngine }; + +export default ExperimentContributions; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/useExperimentContributions.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/useExperimentContributions.tsx new file mode 100644 index 00000000..0c672136 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/useExperimentContributions.tsx @@ -0,0 +1,32 @@ +import React from 'react'; + +import { GetExperimentContributionsResult } from 'modules/core/api/experimentsApi'; +import { IResourceState } from 'modules/core/utils/createResource'; + +import experimentContributionsEngine from './ExperimentContributionsStore'; + +function useExperimentContributions(experimentId: string) { + const { current: engine } = React.useRef(experimentContributionsEngine); + const experimentContributionsState: IResourceState = + engine.experimentContributionsState((state) => state); + + React.useEffect(() => { + if (!experimentContributionsState.data) { + engine.fetchExperimentContributions(experimentId); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [experimentContributionsState.data]); + + React.useEffect(() => { + return () => { + engine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return { + experimentContributionsState, + }; +} + +export default useExperimentContributions; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.d.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.d.ts new file mode 100644 index 00000000..733dede2 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.d.ts @@ -0,0 +1,4 @@ +export interface IExperimentContributionsFeedProps { + experimentName: string; + experimentId: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.tsx new file mode 100644 index 00000000..00094154 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.tsx @@ -0,0 +1,17 @@ +import React from 'react'; + +import ContributionsFeed from 'components/ContributionsFeed'; + +import useExperimentContributionsFeed from './useExperimentContributionsFeed'; + +import { IExperimentContributionsFeedProps } from '.'; + +function ExperimentContributionsFeed({ + experimentId, + experimentName, +}: IExperimentContributionsFeedProps): React.FunctionComponentElement | null { + const props = useExperimentContributionsFeed(experimentId, experimentName); + return ; +} + +export default React.memo(ExperimentContributionsFeed); diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeedStore.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeedStore.ts new file mode 100644 index 00000000..7844e25e --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeedStore.ts @@ -0,0 +1,26 @@ +import { + createSearchExperimentRunsRequest, + ExperimentRun, +} from 'modules/core/api/experimentsApi'; +import createResource from 'modules/core/utils/createResource'; + +import { RequestOptions } from 'services/NetworkService'; + +function createExperimentContributionsFeedEngine() { + let { call } = createSearchExperimentRunsRequest(); + + const { fetchData, state, destroy } = createResource( + async (experimentId: string, queryParams: RequestOptions['query_params']) => + await call(experimentId, queryParams), + ); + return { + fetchExperimentContributionsFeed: ( + experimentId: string, + queryParams: RequestOptions['query_params'], + ) => fetchData({ experimentId, queryParams }), + experimentContributionsFeedState: state, + destroy, + }; +} + +export default createExperimentContributionsFeedEngine(); diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/index.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/index.ts new file mode 100644 index 00000000..a67a3a40 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/index.ts @@ -0,0 +1,9 @@ +import ExperimentContributionsFeed from './ExperimentContributionsFeed'; +import experimentContributionsFeedEngine from './ExperimentContributionsFeedStore'; +import useExperimentContributionsFeed from './useExperimentContributionsFeed'; + +export * from './ExperimentContributionsFeed.d'; + +export { experimentContributionsFeedEngine, useExperimentContributionsFeed }; + +export default ExperimentContributionsFeed; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/useExperimentContributionsFeed.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/useExperimentContributionsFeed.tsx new file mode 100644 index 00000000..05dde410 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/useExperimentContributionsFeed.tsx @@ -0,0 +1,125 @@ +import React from 'react'; +import moment from 'moment'; +import _ from 'lodash-es'; + +import { + TIMELINE_DAY_FORMAT, + TIMELINE_MONTH_FORMAT, + TIMELINE_TIME_FORMAT, +} from 'config/dates/dates'; + +import { IResourceState } from 'modules/core/utils/createResource'; +import { ExperimentRun } from 'modules/core/api/experimentsApi'; + +import experimentContributionsEngine from '../ExperimentContributions/ExperimentContributionsStore'; + +import experimentContributionsFeedEngine from './ExperimentContributionsFeedStore'; + +function useExperimentContributionsFeed( + experimentId: string, + experimentName: string, +) { + const [data, setData] = React.useState([]); + const { current: engine } = React.useRef(experimentContributionsFeedEngine); + const contributionsFeedStore: IResourceState = + engine.experimentContributionsFeedState((state) => state); + + const { current: contributionsEngine } = React.useRef( + experimentContributionsEngine, + ); + const experimentContributionsState = + contributionsEngine.experimentContributionsState((state) => state); + + React.useEffect(() => { + if (_.isEmpty(contributionsFeedStore.data)) { + engine.fetchExperimentContributionsFeed(experimentId, { + limit: 25, + }); + } + return () => engine.destroy(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useEffect(() => { + if (contributionsFeedStore.data?.length) { + let newData = [...data, ...contributionsFeedStore.data]; + setData(newData); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [contributionsFeedStore.data]); + + const memoizedData = React.useMemo(() => { + // get existing month list from the contributionsFeedStore data + const feedData: { [key: string]: any } = {}; + if (data.length) { + const monthList = data?.reduce( + (acc: { [key: string]: any }, run: ExperimentRun) => { + const month = moment(run.creation_time * 1000).format( + TIMELINE_MONTH_FORMAT, + ); + if (!acc.includes(month) && !run.archived) { + acc.push(month); + } + return acc; + }, + [], + ); + // create a list of objects with month and contributions + + monthList.forEach((month: string) => { + feedData[month] = {}; + }); + + // add contributions to the month list + data?.forEach((run: ExperimentRun) => { + if (!run.archived) { + // get the month + const month = moment(run.creation_time * 1000).format( + TIMELINE_MONTH_FORMAT, + ); + + // get the day of the month + const day = moment(run.creation_time * 1000).format( + TIMELINE_DAY_FORMAT, + ); + + // create a contribution object + const contribution = { + name: run.name, + date: moment(run.creation_time * 1000).format(TIMELINE_TIME_FORMAT), + hash: run.run_id, + creation_time: run.creation_time, + experiment: experimentName, + experimentId: experimentId, + }; + if (feedData[month]?.[day]?.length) { + feedData[month][day].push(contribution); + } else { + feedData[month][day] = [contribution]; + } + } + }); + } + return feedData; + }, [data, experimentName, experimentId]); + + function loadMore(): void { + if (contributionsFeedStore.data && !contributionsFeedStore.loading) { + engine.fetchExperimentContributionsFeed(experimentId, { + limit: 25, + offset: data[data.length - 1].run_id, + }); + } + } + + return { + isLoading: contributionsFeedStore.loading, + data: memoizedData, + totalRunsCount: experimentContributionsState.data?.num_runs, + archivedRunsCount: experimentContributionsState.data?.num_archived_runs, + fetchedCount: data.length, + loadMore, + }; +} + +export default useExperimentContributionsFeed; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.d.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.d.ts new file mode 100644 index 00000000..29565105 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.d.ts @@ -0,0 +1,9 @@ +import React from 'react'; + +export interface IExperimentOverviewSidebarProps { + sidebarRef: HTMLElement | any; + overviewSectionRef: React.RefObject; + setContainerHeight: (height: number | string) => void; + overviewSectionContentRef: any; + description: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.scss b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.scss new file mode 100644 index 00000000..554693c5 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.scss @@ -0,0 +1,88 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentOverviewSidebar { + width: $run-overview-sidebar-width; + min-width: $run-overview-sidebar-width; + overflow-y: auto; + overflow-x: hidden; + padding: $space-xs; + padding: $space-unit * 2 $space-xs $space-xs; + position: sticky; + top: 0; + h3 { + margin-bottom: $space-sm; + } + &__wrapper { + height: -moz-fit-content; + height: fit-content; + } + &__section { + margin: 0 $space-unit $space-lg; + &__descriptionBox { + padding-top: $space-md; + &__header { + display: flex; + justify-content: space-between; + a { + text-decoration: unset; + } + i { + color: $pico-50; + } + h3 { + margin-top: $space-xxxs; + } + } + &__description { + display: flex; + max-height: 4.5rem; + overflow: hidden; + position: relative; + word-break: break-all; + flex-direction: column; + .dots { + background: $cuddle-10; + position: absolute; + bottom: 0; + right: 0; + height: 0.775rem; + display: flex; + justify-content: center; + align-items: center; + width: 4.5rem; + display: flex; + justify-content: flex-end; + padding-right: $space-xxxs; + cursor: pointer; + } + &.showAll { + max-height: 100%; + } + &.hasMore { + &:after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + height: toRem(10px); + width: 100%; + z-index: 1; + } + } + } + &__seeMoreButtonBox { + width: 100%; + justify-content: flex-start; + align-items: center; + display: flex; + padding-top: $space-xxxxs; + .Text { + cursor: pointer; + &:hover { + text-decoration: underline; + } + } + } + } + } +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.tsx new file mode 100644 index 00000000..e6385fab --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import classNames from 'classnames'; +import { NavLink, useRouteMatch } from 'react-router-dom'; + +import { Text, Button, Icon } from 'components/kit'; + +import { IExperimentOverviewSidebarProps } from '.'; + +import './ExperimentOverviewSidebar.scss'; + +const CLOSED_DESCRIPTION_BOX_MAX_HEIGHT = 72; +const SIDEBAR_TOP_SPACE = 40; + +function ExperimentOverviewSidebar({ + sidebarRef, + overviewSectionRef, + setContainerHeight, + overviewSectionContentRef, + description, +}: IExperimentOverviewSidebarProps): React.FunctionComponentElement { + const { url } = useRouteMatch(); + const descriptionBoxRef = React.useRef(null); + const [seeMoreDescription, setSeeMoreDescription] = + React.useState(false); + const [descriptionHeight, setDescriptionHeight] = React.useState(0); + + function onContainerScroll(e: any) { + overviewSectionRef?.current?.scrollTo(0, e.target.scrollTop); + } + + function onSeeMoreButtonClick() { + setSeeMoreDescription(!seeMoreDescription); + } + + React.useEffect(() => { + setDescriptionHeight(descriptionBoxRef?.current?.offsetHeight); + }, [descriptionBoxRef?.current?.offsetHeight, seeMoreDescription]); + + React.useEffect(() => { + if ( + overviewSectionContentRef?.current?.offsetHeight > + sidebarRef?.current?.childNodes[0].offsetHeight + ) { + setContainerHeight('100%'); + } else { + setContainerHeight( + sidebarRef?.current?.childNodes[0].offsetHeight + SIDEBAR_TOP_SPACE, + ); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [descriptionHeight]); + + return ( +
+
+
+
+ + Description + + + + +
+ +
= CLOSED_DESCRIPTION_BOX_MAX_HEIGHT && + !seeMoreDescription, + }, + )} + ref={descriptionBoxRef} + > + {description || 'No description'} +
+ {descriptionHeight >= CLOSED_DESCRIPTION_BOX_MAX_HEIGHT && ( +
+ + {seeMoreDescription ? 'See less' : 'See more'} + +
+ )} +
+
+
+ ); +} +export default ExperimentOverviewSidebar; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/index.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/index.ts new file mode 100644 index 00000000..be99de25 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/index.ts @@ -0,0 +1,5 @@ +import ExperimentOverviewSidebar from './ExperimentOverviewSidebar'; + +export * from './ExperimentOverviewSidebar.d'; + +export default ExperimentOverviewSidebar; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.d.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.d.ts new file mode 100644 index 00000000..69dca48e --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.d.ts @@ -0,0 +1,5 @@ +export interface IExperimentOverviewTabProps { + experimentName: string; + experimentId: string; + description: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.scss b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.scss new file mode 100644 index 00000000..1800de45 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.scss @@ -0,0 +1,33 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentOverviewTab { + display: flex; + height: 100%; + justify-content: center; + overflow-y: auto; + padding: 0 $space-unit; + &__content { + flex: 1 100%; + max-width: calc( + #{$container-max-width-without-paddings} - #{$run-overview-sidebar-width} + ); + height: 100%; + &__section { + margin: $space-lg 0; + background: $white; + padding: $space-lg; + border: $border-grey; + border-radius: $border-radius-lg; + display: inline-block; + width: 100%; + } + } +} + +@media screen and (max-width: 1500px) { + .ExperimentOverviewTab { + &__content { + max-width: calc(100% - #{$run-overview-sidebar-width}); + } + } +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.tsx new file mode 100644 index 00000000..a332be16 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.tsx @@ -0,0 +1,67 @@ +import React from 'react'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import ExperimentContributions from './ExperimentContributions'; +import ExperimentOverviewSidebar from './ExperimentOverviewSidebar'; +import ExperimentStatistics from './ExperimentStatistics'; +import ExperimentContributionsFeed from './ExperimentContributionsFeed'; + +import { IExperimentOverviewTabProps } from '.'; + +import './ExperimentOverviewTab.scss'; + +function ExperimentOverviewTab( + props: IExperimentOverviewTabProps, +): React.FunctionComponentElement { + const sidebarRef = React.useRef(null); + const overviewSectionRef = React.useRef(null); + const overviewSectionContentRef = React.useRef(null); + const [containerHeight, setContainerHeight] = React.useState( + 0, + ); + + React.useEffect(() => { + analytics.pageView(ANALYTICS_EVENT_KEYS.experiment.tabs.overview.tabView); + }, []); + + function onContainerScroll(e: any) { + sidebarRef?.current?.scrollTo(0, e.target.scrollTop); + } + + return ( +
+
+
+ + + +
+
+ +
+ ); +} +export default ExperimentOverviewTab; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.d.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.d.ts new file mode 100644 index 00000000..6e63a4a0 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.d.ts @@ -0,0 +1,3 @@ +export interface IExperimentStatisticsProps { + experimentName: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.scss b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.scss new file mode 100644 index 00000000..3d85f8b2 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.scss @@ -0,0 +1,17 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentStatistics { + &__trackedSequences { + margin-top: $space-lg; + } + &__cards { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: $space-unit; + margin-top: $space-sm; + } + &__bar { + margin-top: $space-sm; + } +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.tsx new file mode 100644 index 00000000..a2f1f725 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.tsx @@ -0,0 +1,191 @@ +import * as React from 'react'; + +import { Text } from 'components/kit'; +import StatisticsCard from 'components/StatisticsCard'; +import StatisticsBar from 'components/StatisticsBar'; + +import { IProjectStatistic } from 'pages/Dashboard/components/ProjectStatistics'; + +import { encode } from 'utils/encoder/encoder'; + +import experimentContributionsEngine from '../ExperimentContributions/ExperimentContributionsStore'; + +import { IExperimentStatisticsProps } from '.'; + +import './ExperimentStatistics.scss'; + +function ExperimentStatistics({ experimentName }: IExperimentStatisticsProps) { + const [hoveredState, setHoveredState] = React.useState({ + source: '', + id: '', + }); + const { current: expContributionsEngine } = React.useRef( + experimentContributionsEngine, + ); + + const contributionsState = + expContributionsEngine.experimentContributionsState((state) => state); + + const { totalRunsCount, archivedRuns } = React.useMemo( + () => ({ + totalRunsCount: contributionsState.data?.num_runs || 0, + archivedRuns: contributionsState.data?.num_archived_runs || 0, + }), + [contributionsState], + ); + + const runsCountingMap: Record<'archived' | 'runs', IProjectStatistic> = + React.useMemo( + () => ({ + runs: { + label: 'runs', + icon: 'runs', + count: totalRunsCount - archivedRuns, + iconBgColor: '#1473E6', + navLink: `/runs?select=${encode({ + query: `run.experiment == '${experimentName}'`, + })}`, + }, + archived: { + label: 'archived', + icon: 'archive', + count: archivedRuns, + iconBgColor: '#606986', + navLink: `/runs?select=${encode({ + query: `run.archived == True and run.experiment == '${experimentName}'`, + })}`, + }, + }), + [totalRunsCount, archivedRuns, experimentName], + ); + + const statisticsMap: Record = React.useMemo( + () => ({ + active: { + label: 'Active', + count: contributionsState.data?.num_active_runs || 0, + icon: 'runs', + iconBgColor: '#18AB6D', + navLink: `/runs?select=${encode({ + query: `run.active == True and run.experiment == '${experimentName}'`, + })}`, + }, + // @TODO implement failed runs + // failed: { + // label: 'Failed', + // count: 0, + // icon: 'runs', + // iconBgColor: '#e64e48', + // navLink: `/runs?select=${encode({ + // query: `run.failed == True and run.experiment == '${experimentName}'`, + // })}`, + // }, + finished: { + label: 'Finished', + icon: 'runs', + count: totalRunsCount - (contributionsState.data?.num_active_runs || 0), + iconBgColor: '#83899e', + navLink: `/runs?select=${encode({ + query: `run.active == False and run.experiment == '${experimentName}'`, + })}`, + }, + }), + [contributionsState, experimentName, totalRunsCount], + ); + + const statisticsBarData = React.useMemo( + () => + Object.values(statisticsMap).map( + ({ label, iconBgColor = '#000', count }) => ({ + highlighted: hoveredState.id === label, + label, + color: iconBgColor, + percent: totalRunsCount === 0 ? 0 : (count / totalRunsCount) * 100, + }), + ), + [statisticsMap, totalRunsCount, hoveredState], + ); + + const onMouseOver = React.useCallback((id = '', source = '') => { + setHoveredState({ source, id }); + }, []); + + const onMouseLeave = React.useCallback(() => { + setHoveredState({ source: '', id: '' }); + }, []); + + return ( +
+ + Total runs: {totalRunsCount} + +
+ {Object.values(runsCountingMap).map( + ({ label, icon, count, iconBgColor, navLink }) => ( + + ), + )} +
+ + Runs status + +
+ {Object.values(statisticsMap).map( + ({ label, icon, count, iconBgColor, navLink }) => ( + + ), + )} +
+
+ +
+
+ ); +} + +ExperimentStatistics.displayName = 'ExperimentStatistics'; + +export default React.memo(ExperimentStatistics); diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/index.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/index.ts new file mode 100644 index 00000000..9ef9fdb0 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/index.ts @@ -0,0 +1,5 @@ +import ExperimentStatistics from './ExperimentStatistics'; + +export * from './ExperimentStatistics.d'; + +export default ExperimentStatistics; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/index.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/index.ts new file mode 100644 index 00000000..d9b9cca3 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/index.ts @@ -0,0 +1,5 @@ +import ExperimentOverviewTab from './ExperimentOverviewTab'; + +export * from './ExperimentOverviewTab.d'; + +export default ExperimentOverviewTab; diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsStore.ts b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsStore.ts new file mode 100644 index 00000000..8be246b7 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsStore.ts @@ -0,0 +1,25 @@ +import { createSearchRunRequest } from 'modules/core/api/runsApi'; +import createResource from 'modules/core/utils/createResource'; + +import { RequestOptions } from 'services/NetworkService'; + +import { IRun } from 'types/services/models/metrics/runModel'; + +import { parseStream } from 'utils/encoder/streamEncoding'; + +function createExperimentRunsEngine() { + const { call } = createSearchRunRequest(); + + const { fetchData, state, destroy } = createResource[]>( + async (queryParams: RequestOptions['query_params']) => + parseStream(await call(queryParams)), + ); + return { + fetchExperimentRuns: (queryParams: RequestOptions['query_params']) => + fetchData(queryParams), + experimentRunsState: state, + destroy, + }; +} + +export default createExperimentRunsEngine(); diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.d.ts b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.d.ts new file mode 100644 index 00000000..ac27d26d --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.d.ts @@ -0,0 +1,4 @@ +export interface IExperimentRunsTabProps { + experimentName: string; + experimentId: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.scss b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.scss new file mode 100644 index 00000000..d337917a --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.scss @@ -0,0 +1,15 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentRunsTab { + width: 100%; + height: 100%; + padding: $space-lg 0; + &__content { + height: 100%; + background: $white; + padding: $space-lg; + border: $border-grey; + border-radius: $border-radius-lg; + width: 100%; + } +} diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.tsx b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.tsx new file mode 100644 index 00000000..beaa6b2d --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.tsx @@ -0,0 +1,29 @@ +import React, { memo } from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import ExperimentRunsTable from './ExperimentRunsTable'; + +import { IExperimentRunsTabProps } from '.'; + +import './ExperimentRunsTab.scss'; + +function ExperimentRunsTab({ + experimentName, + experimentId, +}: IExperimentRunsTabProps): React.FunctionComponentElement { + return ( + +
+
+ +
+
+
+ ); +} + +export default memo(ExperimentRunsTab); diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.d.ts b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.d.ts new file mode 100644 index 00000000..52f76f2f --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.d.ts @@ -0,0 +1,4 @@ +export interface IExperimentRunsTableProps { + experimentName: string; + experimentId: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.scss b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.scss new file mode 100644 index 00000000..83e54cc2 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.scss @@ -0,0 +1,48 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentRunsTable { + height: 100%; + position: relative; + &__header { + display: flex; + align-items: center; + justify-content: space-between; + height: toRem(28px); + &__titleBox { + display: flex; + align-items: center; + &__title { + margin-right: $space-xxxs; + } + } + .CompareSelectedRunsPopover__trigger { + margin-right: 0 !important; + } + } + &__table { + height: calc(100% - 34px); + margin-top: $space-xxs; + border: $border-grey; + border-top: none; + width: 100%; + &--loading { + display: flex; + align-items: center; + justify-content: center; + } + &--empty { + border: none; + } + } +} + +.Infinite_Loader { + position: absolute; + width: 100%; + height: 100px; + bottom: 0; + display: flex; + justify-content: center; + align-items: center; + background-color: rgba(255, 255, 255, 0.3); +} diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.tsx b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.tsx new file mode 100644 index 00000000..c35cd5a2 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.tsx @@ -0,0 +1,117 @@ +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import { Skeleton } from '@material-ui/lab'; + +import { Spinner, Text } from 'components/kit'; +import Table from 'components/Table/Table'; + +import { RowHeightSize } from 'config/table/tableConfigs'; + +import CompareSelectedRunsPopover from 'pages/Metrics/components/Table/CompareSelectedRunsPopover'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { IExperimentRunsTableProps, useExperimentRunsTable } from '.'; + +import './ExperimentRunsTable.scss'; + +function ExperimentRunsTable({ + experimentName, + experimentId, +}: IExperimentRunsTableProps) { + const { + tableRef, + tableColumns, + tableData, + loading, + selectedRows, + comparisonQuery, + onRowSelect, + loadMore, + isInfiniteLoading, + totalRunsCount, + } = useExperimentRunsTable(experimentName, experimentId); + + return ( +
+
+
+ + {_.isEmpty(selectedRows) + ? 'Experiment Runs' + : `Selected Runs (${Object.values(selectedRows).length})`} + + {_.isEmpty(selectedRows) ? ( + loading ? ( + + ) : ( + + {!_.isEmpty(tableData) + ? ` (${tableData?.length}/${totalRunsCount})` + : '(0)'} + + ) + ) : null} +
+ {tableData?.length > 0 ? ( +
+ +
+ ) : null} +
+
+ {_.isEmpty(tableData) && loading ? ( + + ) : ( +
+ )} + {isInfiniteLoading && ( +
+ +
+ )} + + + ); +} +export default ExperimentRunsTable; diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/index.ts b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/index.ts new file mode 100644 index 00000000..a72f052d --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/index.ts @@ -0,0 +1,6 @@ +import ExperimentRunsTable from './ExperimentRunsTable'; +import useExperimentRunsTable from './useExperimentRunsTable'; + +export { useExperimentRunsTable }; +export * from './ExperimentRunsTable.d'; +export default ExperimentRunsTable; diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/useExperimentRunsTable.tsx b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/useExperimentRunsTable.tsx new file mode 100644 index 00000000..d1fa1817 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/useExperimentRunsTable.tsx @@ -0,0 +1,308 @@ +import React from 'react'; +import moment from 'moment'; +import _ from 'lodash-es'; + +import { Badge } from 'components/kit'; +import RunNameColumn from 'components/Table/RunNameColumn'; + +import { TABLE_DATE_FORMAT } from 'config/dates/dates'; + +import { IResourceState } from 'modules/core/utils/createResource'; + +import { experimentContributionsEngine } from 'pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions'; + +import { IRun } from 'types/services/models/metrics/runModel'; + +import { getMetricHash } from 'utils/app/getMetricHash'; +import contextToString from 'utils/contextToString'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { formatValue } from 'utils/formatValue'; +import { processDurationTime } from 'utils/processDurationTime'; +import { decode, encode } from 'utils/encoder/encoder'; + +import experimentRunsEngine from '../ExperimentRunsStore'; + +function useExperimentRunsTable(experimentName: string, experimentId: string) { + const tableRef = React.useRef(null); + const dataRef = React.useRef(null); + const [data, setData] = React.useState([]); + const [isInfiniteLoading, setIsInfiniteLoading] = + React.useState(false); + const { current: engine } = React.useRef(experimentRunsEngine); + const { current: expContributionsEngine } = React.useRef( + experimentContributionsEngine, + ); + const contributionsState = + expContributionsEngine.experimentContributionsState((state) => state); + const experimentRunsState: IResourceState[]> = + engine.experimentRunsState((state) => state); + const [selectedRows, setSelectedRows] = React.useState< + Record + >({}); + const [comparisonQuery, setComparisonQuery] = React.useState(''); + + React.useEffect(() => { + if (_.isEmpty(experimentRunsState.data)) { + engine.fetchExperimentRuns({ + limit: 50, + exclude_params: true, + q: `run.experiment == '${experimentName}'`, + }); + } + return () => { + engine.destroy(); + expContributionsEngine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useEffect(() => { + if (_.isEmpty(contributionsState.data)) { + expContributionsEngine.fetchExperimentContributions(experimentId); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [contributionsState.data]); + + React.useEffect(() => { + if (experimentRunsState.data) { + engine.destroy(); + } + if (contributionsState.data) { + expContributionsEngine.destroy(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [experimentId]); + + React.useEffect(() => { + if (experimentRunsState.data?.length) { + let newData = [...data, ...experimentRunsState.data]; + setData(newData); + dataRef.current = newData; + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [experimentRunsState.data]); + + const metricsColumns = React.useMemo(() => { + if (data) { + const metrics: any = []; + const systemMetrics: any = []; + const metricsValues: any = {}; + data.forEach(({ hash, traces }: IRun) => { + traces.metric.forEach((trace: any) => { + const metricHash = getMetricHash(trace.name, trace.context as any); + + if (metricsValues.hasOwnProperty(metricHash)) { + metricsValues[metricHash][hash] = [ + trace.values.last_step, + trace.values.last, + ]; + } else { + metricsValues[metricHash] = { + [hash]: [trace.values.last_step, trace.values.last], + }; + + const metricContext = contextToString( + trace.context as Record, + ) as string; + + const isSystem = isSystemMetric(trace.name); + const col = { + key: metricHash, + content: ( + + ), + topHeader: isSystem + ? formatSystemMetricName(trace.name) + : trace.name, + name: trace.name, + context: metricContext, + isSystem, + }; + + if (isSystem) { + systemMetrics.push(col); + } else { + metrics.push(col); + } + } + }); + }); + + return { + columns: _.orderBy(metrics, ['name', 'context'], ['asc', 'asc']).concat( + _.orderBy(systemMetrics, ['name', 'context'], ['asc', 'asc']), + ) as any, + values: metricsValues, + }; + } + + return { + columns: [], + values: [], + }; + }, [data]); + + // memoized table data + const tableData = React.useMemo(() => { + if (data) { + return data.map(({ props, hash }: IRun, index: number) => { + const key = encode({ + hash, + }); + let row: any = { + key, + selectKey: key, + index, + run: { + content: ( + + ), + }, + date: moment(props.creation_time * 1000).format(TABLE_DATE_FORMAT), + duration: processDurationTime( + props.creation_time * 1000, + props.end_time ? props.end_time * 1000 : Date.now(), + ), + }; + + metricsColumns.columns.forEach((col: any) => { + const [step, value] = metricsColumns.values[col.key][hash] ?? [ + null, + null, + ]; + row[col.key] = { + content: + step === null + ? '--' + : col.isSystem + ? formatValue(value) + : `step: ${step ?? '-'} / value: ${formatValue(value)}`, + }; + }); + return row; + }); + } + return []; + }, [data, metricsColumns]); + + // memoized table columns + const tableColumns = React.useMemo(() => { + const columns = [ + { + key: 'run', + content: Name, + topHeader: 'Run', + pin: 'left', + }, + { + key: 'date', + content: Date, + topHeader: 'Run', + }, + { + key: 'duration', + content: Duration, + topHeader: 'Run', + }, + ]; + return columns.concat(metricsColumns.columns); + }, [metricsColumns]); + + function loadMore(): void { + if (experimentRunsState.data && !experimentRunsState.loading) { + setIsInfiniteLoading(true); + engine + .fetchExperimentRuns({ + limit: 50, + exclude_params: true, + offset: dataRef.current[dataRef.current.length - 1]?.hash, + q: `run.experiment == '${experimentName}'`, + }) + .finally(() => setIsInfiniteLoading(false)); + } + } + + // Handler for row selection + const onRowSelect = React.useCallback( + ({ actionType, data }) => { + let selected: Record = { ...selectedRows }; + switch (actionType) { + case 'single': + if (selectedRows[data.key]) { + selected = _.omit(selectedRows, data.key); + } else { + selected[data.key] = true; + } + break; + case 'selectAll': + if (Array.isArray(data)) { + data.forEach((item: any) => { + if (!selectedRows[item.key]) { + selected[item.key] = true; + } + }); + } else { + Object.values(data) + .reduce((acc: any[], value: any) => { + return acc.concat(value.items); + }, []) + .forEach((item: any) => { + if (!selectedRows[item.selectKey]) { + selected[item.selectKey] = true; + } + }); + } + break; + case 'removeAll': + if (Array.isArray(data)) { + selected = {}; + } + break; + } + + setSelectedRows(selected); + + setComparisonQuery( + `run.hash in [${Object.keys(selected) + .map((key) => `"${JSON.parse(decode(key)).hash}"`) + .join(', ')}] and run.experiment == "${experimentName}"`, + ); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [selectedRows, tableData], + ); + + React.useEffect(() => { + tableRef.current?.updateData({ + newData: tableData, + newColumns: tableColumns, + }); + }, [tableData, tableColumns]); + + return { + data, + tableData, + tableColumns, + tableRef, + loading: experimentRunsState.loading, + isInfiniteLoading, + selectedRows, + comparisonQuery, + onRowSelect, + loadMore, + totalRunsCount: + (contributionsState?.data?.num_runs ?? 0) - + (contributionsState?.data?.num_archived_runs ?? 0), + }; +} + +export default useExperimentRunsTable; diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/index.ts b/src/src/pages/Experiment/components/ExperimentRunsTab/index.ts new file mode 100644 index 00000000..61a1fc5d --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/index.ts @@ -0,0 +1,6 @@ +import ExperimentRunsTab from './ExperimentRunsTab'; +import experimentRunsEngine from './ExperimentRunsStore'; + +export { experimentRunsEngine }; +export * from './ExperimentRunsTab.d'; +export default ExperimentRunsTab; diff --git a/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.d.ts b/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.d.ts new file mode 100644 index 00000000..e4d2f900 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.d.ts @@ -0,0 +1,5 @@ +export interface IExperimentSettingsTabProps { + experimentName: string; + description: string; + updateExperiment: (name: string, description: string) => void; +} diff --git a/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.scss b/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.scss new file mode 100644 index 00000000..b558b8d5 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.scss @@ -0,0 +1,8 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentSettingsTab { + padding: $space-lg 0; + &__actionCardsCnt { + margin: 0 toRem(164px); + } +} diff --git a/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.tsx b/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.tsx new file mode 100644 index 00000000..2fd3b8cc --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.tsx @@ -0,0 +1,43 @@ +import React, { memo } from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import NameAndDescriptionCard from 'components/NameAndDescriptionCard'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IExperimentSettingsTabProps } from '.'; + +import './ExperimentSettingsTab.scss'; + +function ExperimentSettingsTab({ + experimentName, + description, + updateExperiment, +}: IExperimentSettingsTabProps): React.FunctionComponentElement { + React.useEffect(() => { + analytics.pageView(ANALYTICS_EVENT_KEYS.experiment.tabs.settings.tabView); + }, []); + + function onSave(name: string, description: string) { + updateExperiment(name, description); + } + + return ( + +
+
+ +
+
+
+ ); +} + +export default memo(ExperimentSettingsTab); diff --git a/src/src/pages/Experiment/components/ExperimentSettingsTab/index.ts b/src/src/pages/Experiment/components/ExperimentSettingsTab/index.ts new file mode 100644 index 00000000..a0a6d843 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentSettingsTab/index.ts @@ -0,0 +1,5 @@ +import ExperimentSettingsTab from './ExperimentSettingsTab'; + +export * from './ExperimentSettingsTab.d'; + +export default ExperimentSettingsTab; diff --git a/src/src/pages/Experiment/useExperimentState.tsx b/src/src/pages/Experiment/useExperimentState.tsx new file mode 100644 index 00000000..b3931e8f --- /dev/null +++ b/src/src/pages/Experiment/useExperimentState.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +import { IResourceState } from 'modules/core/utils/createResource'; +import { IExperimentData } from 'modules/core/api/experimentsApi'; + +import experimentEngine from './ExperimentStore'; + +function useExperimentState(experimentId: string) { + const { current: engine } = React.useRef(experimentEngine); + const experimentState: IResourceState = + engine.experimentState((state) => state); + const experimentsState: IResourceState = + engine.experimentsState((state) => state); + + React.useEffect(() => { + return () => { + engine.destroyExperiment(); + engine.destroyExperiments(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useEffect(() => { + engine.fetchExperimentData(experimentId as any); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [experimentId]); + + return { + experimentState, + experimentsState, + getExperimentsData: engine.fetchExperimentsData, + updateExperiment: engine.updateExperiment, + }; +} + +export default useExperimentState; diff --git a/src/src/pages/FiguresExplorer/config.ts b/src/src/pages/FiguresExplorer/config.ts new file mode 100644 index 00000000..84362dcd --- /dev/null +++ b/src/src/pages/FiguresExplorer/config.ts @@ -0,0 +1,43 @@ +import produce from 'immer'; + +import { getDefaultHydration } from 'modules/BaseExplorer'; +import { GroupType, Order } from 'modules/core/pipeline'; +import { defaultHydration } from 'modules/BaseExplorer/getDefaultHydration'; +import { CaptionProperties } from 'modules/BaseExplorer/components/Controls'; + +import getFiguresExplorerStaticContent from './getStaticContent'; + +export const getFiguresDefaultConfig = (): typeof defaultHydration => { + const defaultConfig = getDefaultHydration(); + + const groupings = produce(defaultConfig.groupings, (draft: any) => { + draft[GroupType.COLUMN].defaultApplications.orders = [Order.ASC, Order.ASC]; + draft[GroupType.COLUMN].defaultApplications.fields = [ + 'run.hash', + 'figures.name', + ]; + draft[GroupType.ROW].defaultApplications.orders = [Order.DESC]; + draft[GroupType.ROW].defaultApplications.fields = ['record.step']; + }); + + const controls = produce(defaultConfig.controls, (draft: any) => { + draft.captionProperties = { + component: CaptionProperties, + state: { + initialState: { + displayBoxCaption: true, + selectedFields: ['run.name', 'figures.name', 'figures.context'], + }, + persist: 'url', + }, + }; + }); + + return { + ...defaultConfig, + groupings, + controls, + box: defaultConfig.box, + getStaticContent: getFiguresExplorerStaticContent, + }; +}; diff --git a/src/src/pages/FiguresExplorer/getStaticContent.tsx b/src/src/pages/FiguresExplorer/getStaticContent.tsx new file mode 100644 index 00000000..5af476b7 --- /dev/null +++ b/src/src/pages/FiguresExplorer/getStaticContent.tsx @@ -0,0 +1,52 @@ +import * as React from 'react'; + +import { DOCUMENTATIONS } from 'config/references'; + +import getBaseExplorerStaticContent, { + STATIC_CONTENT_TYPES, +} from 'modules/BaseExplorer/utils/getBaseExplorerStaticContent'; +import { StaticContentType } from 'modules/BaseExplorer/types'; + +function getFiguresExplorerStaticContent( + type: StaticContentType, +): React.ReactNode { + const illustrationContent = getFiguresExplorerIllustrationContent(type); + return getBaseExplorerStaticContent(type, illustrationContent); +} + +function getFiguresExplorerIllustrationContent( + type: StaticContentType, +): React.ReactNode { + const Never_Executed = ( + <> + It’s super easy to search Aim experiments. Just start typing your query in + the search bar above. +
+ Look up + + search docs + + to learn more. + + ); + const Failed = 'Incorrect Query'; + const Insufficient_Resources = "You don't have any tracked figures"; + const Empty = 'No Results'; + const Empty_Bookmarks = "You don't have any saved bookmark"; + + const CONTENT = { + [STATIC_CONTENT_TYPES.Never_Executed]: Never_Executed, + [STATIC_CONTENT_TYPES.Failed]: Failed, + [STATIC_CONTENT_TYPES.Insufficient_Resources]: Insufficient_Resources, + [STATIC_CONTENT_TYPES.Empty]: Empty, + [STATIC_CONTENT_TYPES.Empty_Bookmarks]: Empty_Bookmarks, + }; + return CONTENT[type] || null; +} + +export default getFiguresExplorerStaticContent; diff --git a/src/src/pages/FiguresExplorer/index.tsx b/src/src/pages/FiguresExplorer/index.tsx new file mode 100644 index 00000000..641c8679 --- /dev/null +++ b/src/src/pages/FiguresExplorer/index.tsx @@ -0,0 +1,35 @@ +import renderer from 'modules/BaseExplorer'; +import Figures from 'modules/BaseExplorer/components/Figures'; + +import { AimObjectDepths, SequenceTypesEnum } from 'types/core/enums'; + +import { getFiguresDefaultConfig } from './config'; + +const defaultConfig = getFiguresDefaultConfig(); + +const FiguresExplorer = renderer( + { + name: 'Figures Explorer', + sequenceName: SequenceTypesEnum.Figures, + basePath: 'figures', + persist: true, + adapter: { + objectDepth: AimObjectDepths.Step, + }, + groupings: defaultConfig.groupings, + visualizations: { + vis1: { + component: defaultConfig.Visualizer, + controls: defaultConfig.controls, + box: { + ...defaultConfig.box, + component: Figures, + }, + }, + }, + getStaticContent: defaultConfig.getStaticContent, + }, + __DEV__, +); + +export default FiguresExplorer; diff --git a/src/src/pages/ImagesExplore/ImagesExplore.scss b/src/src/pages/ImagesExplore/ImagesExplore.scss new file mode 100644 index 00000000..415194c5 --- /dev/null +++ b/src/src/pages/ImagesExplore/ImagesExplore.scss @@ -0,0 +1,65 @@ +@use 'src/styles/abstracts' as *; +.ImagesExplore { + &__container { + background-color: #ffffff; + min-width: 50rem; + height: 100%; + .ImagesExplore__visualization { + display: flex; + position: relative; + flex-direction: column; + flex: 1 100%; + max-height: calc(100% - #{toRem(136px)}); + .ProgressBar { + padding-bottom: toRem(136px); + } + } + .ImagesExplore__section { + height: 100vh; + } + .ImagesExplore__loader { + flex-direction: column; + justify-content: space-between; + } + .ImagesExplore__fullHeight { + height: 100%; + } + .ImagesExplore__section__appBarContainer { + display: flex; + flex-direction: column; + justify-content: center; + } + .ImagesExplore__table__container { + flex: 0.5 1 0; + min-height: 11rem; + &.fullHeight { + flex: 1 100% !important; + } + &.hide { + display: none; + } + } + .ImagesExplore__ResizePanel { + &__hide { + display: none; + } + } + .ImagesExplore__imagesWrapper__container { + min-height: 14.5rem; + flex: 0.5 1 0; + overflow: auto; + &.fullHeight { + flex: 1 100% !important; + } + &.hide { + display: none; + } + } + } + &__SelectForm__Grouping__container { + display: flex; + border-bottom: $border-main; + min-height: 6rem; + max-height: 6rem; + } +} diff --git a/src/src/pages/ImagesExplore/ImagesExplore.tsx b/src/src/pages/ImagesExplore/ImagesExplore.tsx new file mode 100644 index 00000000..ed1b87ae --- /dev/null +++ b/src/src/pages/ImagesExplore/ImagesExplore.tsx @@ -0,0 +1,583 @@ +/* eslint-disable react-hooks/rules-of-hooks */ +import React, { useState } from 'react'; +import { useHistory, useRouteMatch } from 'react-router-dom'; +import _ from 'lodash-es'; +import classNames from 'classnames'; +import { useResizeObserver, useModel, usePanelResize } from 'hooks'; + +import NotificationContainer from 'components/NotificationContainer/NotificationContainer'; +import Table from 'components/Table/Table'; +import ResizePanel from 'components/ResizePanel/ResizePanel'; +import MediaPanel from 'components/MediaPanel'; +import { MediaTypeEnum } from 'components/MediaPanel/config'; +import Grouping from 'components/Grouping/Grouping'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import RangePanel from 'components/RangePanel'; +import ProgressBar from 'components/ProgressBar/ProgressBar'; +import IllustrationBlock from 'components/IllustrationBlock/IllustrationBlock'; + +import pageTitlesEnum from 'config/pageTitles/pageTitles'; +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import GroupingPopovers, { + GroupNameEnum, +} from 'config/grouping/GroupingPopovers'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { + IllustrationsEnum, + Request_Illustrations, +} from 'config/illustrationConfig/illustrationConfig'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import SelectForm from 'pages/ImagesExplore/components/SelectForm/SelectForm'; +import Controls from 'pages/ImagesExplore/components/Controls/Controls'; + +import imagesExploreAppModel from 'services/models/imagesExplore/imagesExploreAppModel'; +import * as analytics from 'services/analytics'; +import { AppNameEnum } from 'services/models/explorer'; + +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; +import { IApiRequest } from 'types/services/services'; +import { IModel, State } from 'types/services/models/model'; + +import exceptionHandler from 'utils/app/exceptionHandler'; +import getStateFromUrl from 'utils/getStateFromUrl'; +import { ChartTypeEnum } from 'utils/d3'; +import { SortField, SortFields } from 'utils/getSortedFields'; + +import ImagesExploreAppBar from './components/ImagesExploreAppBar/ImagesExploreAppBar'; + +import './ImagesExplore.scss'; + +function ImagesExplore(): React.FunctionComponentElement { + const route = useRouteMatch(); + const history = useHistory(); + const imagesExploreData = useModel(imagesExploreAppModel); + const imagesWrapperRef = React.useRef(null); + const tableElemRef = React.useRef(null); + const wrapperElemRef = React.useRef(null); + const resizeElemRef = React.useRef(null); + const [offsetHeight, setOffsetHeight] = useState( + imagesWrapperRef?.current?.offsetHeight, + ); + const [isProgressBarVisible, setIsProgressBarVisible] = + React.useState(false); + const imagesRequestRef = React.useRef(null); + + const [offsetWidth, setOffsetWidth] = useState( + imagesWrapperRef?.current?.offsetWidth, + ); + + function handleSearch() { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.images.imagesPanel.clickApplyButton, + ); + imagesRequestRef.current = imagesExploreAppModel.getImagesData(true); + imagesRequestRef.current.call(); + } + + useResizeObserver(() => { + if (imagesWrapperRef?.current?.offsetHeight !== offsetHeight) { + setOffsetHeight(imagesWrapperRef?.current?.offsetHeight); + } + if (imagesWrapperRef?.current?.offsetWidth !== offsetWidth) { + setOffsetWidth(imagesWrapperRef?.current?.offsetWidth); + } + }, imagesWrapperRef); + + React.useEffect(() => { + setOffsetWidth(imagesWrapperRef?.current?.offsetWidth); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [imagesWrapperRef?.current?.offsetWidth]); + + // eslint-disable-next-line react-hooks/rules-of-hooks + const memoizedImagesSortFields = React.useMemo(() => { + if (_.isEmpty(imagesExploreData?.groupingSelectOptions)) { + return { sortFieldsDict: {}, sortFields: [] }; + } + const grouping = imagesExploreData?.config?.grouping; + const group: string[] = [...(grouping?.row || [])]; + //ToDo reverse mode + const groupFields = + // grouping?.reverseMode?.row + // ? imagesExploreData?.groupingSelectOptions.filter( + // (option: IGroupingSelectOption) => !group.includes(option.value), + // ) + // : + imagesExploreData?.groupingSelectOptions.filter( + (option: IGroupingSelectOption) => group.includes(option.value), + ); + let sortGroupFields = groupFields.reduce( + (acc: SortFields, field: SortField) => { + const resultField = imagesExploreData?.config?.images?.sortFieldsDict[ + field.value + ] || { ...field, order: 'asc' }; + acc.push({ ...resultField, readonly: true }); + return acc; + }, + [], + ); + sortGroupFields = sortGroupFields.concat( + imagesExploreData?.config?.images?.sortFields + .filter((field: SortField) => { + //ToDo reverse mode + + // if (grouping?.reverseMode?.row) { + // return group.includes(field.value); + // } else { + return !group.includes(field.value); + // } + }) + .map((field: SortField) => ({ ...field, readonly: false })), + ); + + return { + sortFieldsDict: sortGroupFields.reduce( + (acc: { [key: string]: SortField }, field: SortField) => { + acc[field.value] = field; + return acc; + }, + {}, + ), + sortFields: sortGroupFields, + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + imagesExploreData?.config?.grouping, + imagesExploreData?.config?.images?.sortFields, + imagesExploreData?.groupingSelectOptions, + ]); + + const panelResizing = usePanelResize( + wrapperElemRef, + imagesWrapperRef, + tableElemRef, + resizeElemRef, + imagesExploreData?.config?.table || {}, + imagesExploreAppModel.onTableResizeEnd, + ); + + React.useEffect(() => { + imagesExploreAppModel.initialize(route.params.appId); + let appRequestRef: IApiRequest; + let imagesRequestRef: IApiRequest; + if (route.params.appId) { + appRequestRef = imagesExploreAppModel.getAppConfigData( + route.params.appId, + ); + appRequestRef + .call((detail: any) => { + exceptionHandler({ + detail, + model: imagesExploreAppModel as IModel, + }); + }) + .then(() => { + imagesExploreAppModel.setDefaultAppConfigData(false); + imagesRequestRef = imagesExploreAppModel.getImagesData(); + imagesRequestRef.call((detail: any) => { + exceptionHandler({ + detail, + model: imagesExploreAppModel, + }); + }); + }); + } else { + imagesExploreAppModel.setDefaultAppConfigData(); + imagesRequestRef = imagesExploreAppModel.getImagesData(); + imagesRequestRef.call((detail: any) => { + exceptionHandler({ detail, model: imagesExploreAppModel }); + }); + } + + analytics.pageView(ANALYTICS_EVENT_KEYS.images.pageView); + + const unListenHistory = history.listen(() => { + if (!!imagesExploreData?.config) { + if ( + (imagesExploreData.config.grouping !== getStateFromUrl('grouping') || + imagesExploreData.config.images !== getStateFromUrl('images') || + imagesExploreData.config.select !== getStateFromUrl('select')) && + history.location.pathname === `/${AppNameEnum.IMAGES}` + ) { + imagesExploreAppModel.setDefaultAppConfigData(); + imagesExploreAppModel.updateModelData(); + } + } + }); + return () => { + imagesExploreAppModel.destroy(); + imagesRequestRef?.abort(); + unListenHistory(); + if (appRequestRef) { + appRequestRef.abort(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + +
+
+
+ +
+ + g.groupName === GroupNameEnum.ROW, + )} + isDisabled={isProgressBarVisible} + groupingData={imagesExploreData?.config?.grouping} + groupingSelectOptions={imagesExploreData?.groupingSelectOptions} + onGroupingSelectChange={ + imagesExploreAppModel.onGroupingSelectChange + } + onGroupingModeChange={ + imagesExploreAppModel.onGroupingModeChange + } + onGroupingPaletteChange={() => {}} + onGroupingReset={() => {}} + onGroupingApplyChange={ + imagesExploreAppModel.onGroupingApplyChange + } + onGroupingPersistenceChange={() => {}} + onShuffleChange={() => {}} + /> +
+
+ + {_.isEmpty(imagesExploreData?.tableData) && + _.isEmpty(imagesExploreData?.imagesData) ? ( + + ) : ( + <> +
+ {imagesExploreData?.config?.table.resizeMode === + ResizeModeEnum.MaxHeight ? null : ( + + } + tooltipType={ChartTypeEnum.ImageSet} + actionPanelSize={44} + actionPanel={ + imagesExploreData?.config?.images?.stepRange && + imagesExploreData?.config?.images?.indexRange && + imagesExploreAppModel.showRangePanel() && + !_.isEmpty(imagesExploreData?.imagesData) && ( + + ) + } + /> + )} +
+ +
+ {imagesExploreData?.config?.table.resizeMode === + ResizeModeEnum.Hide ? null : ( + +
+ + )} + + + )} + + + + {imagesExploreData?.notifyData?.length > 0 && ( + + )} + + + ); +} + +export default ImagesExplore; diff --git a/src/src/pages/ImagesExplore/components/Controls/Controls.scss b/src/src/pages/ImagesExplore/components/Controls/Controls.scss new file mode 100644 index 00000000..0759858f --- /dev/null +++ b/src/src/pages/ImagesExplore/components/Controls/Controls.scss @@ -0,0 +1,86 @@ +@use 'src/styles/abstracts' as *; + +.Controls__container { + padding: 0.75rem 0; + display: flex; + flex-direction: column; + align-items: center; + overflow: auto; + + & > div { + margin-bottom: 0.375rem; + + &:last-child { + margin-bottom: 0; + } + } +} + +.Controls__icon { + color: $pico-70; + font-size: 1.125rem; + &.active { + color: $primary-color; + } +} + +.Controls__anchor { + height: 2.25rem; + width: 2.25rem; + display: flex; + cursor: pointer; + position: relative; + align-items: center; + justify-content: center; + transition: background-color 0.18s ease-out; + border: 0.0625rem solid transparent; + border-radius: $border-radius-main; + + &.active { + background-color: $primary-color-10; + + &.outlined { + border: $border-main-active; + } + } + + &.disabled { + cursor: initial; + i { + color: $pico-50; + } + &:hover { + background-color: transparent; + } + } + + &:hover { + background-color: $pico-5; + + .icon-arrow-left { + opacity: 1; + } + } +} + +.Controls__anchor__arrow { + width: 0.6875rem; + height: 100%; + position: absolute; + left: -0.75rem; + display: flex; + align-items: center; + justify-content: center; + + .icon-arrow-left { + transition: all 0.18s ease-out; + color: $pico-70; + } +} + +.Controls__anchor__arrow--opened { + .icon-arrow-left { + transform: rotate(180deg); + color: $primary-color; + } +} diff --git a/src/src/pages/ImagesExplore/components/Controls/Controls.tsx b/src/src/pages/ImagesExplore/components/Controls/Controls.tsx new file mode 100644 index 00000000..0282f6d5 --- /dev/null +++ b/src/src/pages/ImagesExplore/components/Controls/Controls.tsx @@ -0,0 +1,181 @@ +import React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import TooltipContentPopover from 'components/TooltipContentPopover/TooltipContentPopover'; +import { Icon } from 'components/kit'; +import ImagePropertiesPopover from 'components/ImagePropertiesPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import SortPopover from 'pages/Metrics/components/Table/SortPopover/SortPopover'; + +import { IControlProps } from 'types/pages/imagesExplore/components/Controls/Controls'; + +import './Controls.scss'; + +function Controls( + props: IControlProps, +): React.FunctionComponentElement { + const imagePropertiesChanged: boolean = React.useMemo(() => { + const { alignmentType, mediaItemSize, imageRendering } = + props.additionalProperties; + return ( + alignmentType !== CONTROLS_DEFAULT_CONFIG.images.alignmentType || + mediaItemSize !== CONTROLS_DEFAULT_CONFIG.images.mediaItemSize || + imageRendering !== CONTROLS_DEFAULT_CONFIG.images.imageRendering + ); + }, [props.additionalProperties]); + + const tooltipChanged: boolean = React.useMemo(() => { + return ( + props.tooltip?.appearance !== + CONTROLS_DEFAULT_CONFIG.images.tooltip.appearance || + props.tooltip?.selectedFields?.length !== + CONTROLS_DEFAULT_CONFIG.images.tooltip.selectedFields.length + ); + }, [props.tooltip]); + + const sortFieldsChanged: boolean = React.useMemo(() => { + return ( + props.sortFields.length !== + CONTROLS_DEFAULT_CONFIG.images.sortFields.length + ); + }, [props.sortFields]); + + return ( + +
+
+ ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+ ( + +
+ +
+
+ )} + component={ + + } + /> +
+ +
+ +
+
+
+ ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+
+ ); +} + +export default Controls; diff --git a/src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.scss b/src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.scss new file mode 100644 index 00000000..599bc05b --- /dev/null +++ b/src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.scss @@ -0,0 +1,36 @@ +@use 'src/styles/abstracts' as *; + +.ImagesExploreAppBar { + &__item { + &__bookmark { + margin-right: $space-xxxs; + padding: 0 $space-xs !important; + &__Text { + margin-right: 0.625rem; + } + &__Icon { + color: $text-color; + } + } + } + &__menu { + border-left: $border-main; + padding: 0 $space-xxxs; + height: 100%; + display: flex; + align-items: center; + span { + cursor: pointer; + } + } + &__popover { + width: 16rem; + padding: $space-xs; + display: flex; + flex-direction: column; + a { + text-decoration: none; + color: inherit; + } + } +} diff --git a/src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.tsx b/src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.tsx new file mode 100644 index 00000000..9d7775ec --- /dev/null +++ b/src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.tsx @@ -0,0 +1,150 @@ +import React from 'react'; +import { useRouteMatch } from 'react-router-dom'; + +import { MenuItem } from '@material-ui/core'; + +import BookmarkForm from 'components/BookmarkForm/BookmarkForm'; +import AppBar from 'components/AppBar/AppBar'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import { Icon, Button, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import ConfirmModal from 'components/ConfirmModal/ConfirmModal'; + +import { DOCUMENTATIONS } from 'config/references'; + +import './ImagesExploreAppBar.scss'; + +function ImagesExploreAppBar({ + onBookmarkCreate, + onBookmarkUpdate, + onResetConfigData, + title, + disabled, +}: any): React.FunctionComponentElement { + const [popover, setPopover] = React.useState(''); + const route = useRouteMatch(); + + function handleBookmarkClick(value: string): void { + setPopover(value); + } + + function handleClosePopover(): void { + setPopover(''); + } + + function handleBookmarkUpdate(): void { + onBookmarkUpdate(route.params.appId); + handleClosePopover(); + } + + return ( + + + {route.params.appId ? ( + + ( + + )} + component={ +
+ handleBookmarkClick('create')}> + Create Bookmark + + handleBookmarkClick('update')}> + Update Bookmark + +
+ } + /> +
+ ) : ( + + )} +
+ + ( + + )} + component={ +
+ + Reset Controls to System Defaults + + + Explorer Documentation + +
+ } + /> +
+
+ + + + } + title='Update bookmark' + statusType='success' + confirmBtnText='Update' + /> +
+
+ ); +} + +export default React.memo(ImagesExploreAppBar); diff --git a/src/src/pages/ImagesExplore/components/ImagesExploreTableGrid/ImagesExploreTableGrid.tsx b/src/src/pages/ImagesExplore/components/ImagesExploreTableGrid/ImagesExploreTableGrid.tsx new file mode 100644 index 00000000..781eb694 --- /dev/null +++ b/src/src/pages/ImagesExplore/components/ImagesExploreTableGrid/ImagesExploreTableGrid.tsx @@ -0,0 +1,494 @@ +import moment from 'moment'; +import _ from 'lodash-es'; +import * as React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import TableSortIcons from 'components/Table/TableSortIcons'; +import { Badge, JsonViewPopover } from 'components/kit'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import GroupedColumnHeader from 'components/Table/GroupedColumnHeader'; +import RunNameColumn from 'components/Table/RunNameColumn'; +import AttachedTagsList from 'components/AttachedTagsList/AttachedTagsList'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import COLORS from 'config/colors/colors'; +import { TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { TABLE_DEFAULT_CONFIG } from 'config/table/tableConfigs'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { IOnGroupingSelectChangeParams } from 'types/services/models/metrics/metricsAppModel'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import contextToString from 'utils/contextToString'; +import { formatValue } from 'utils/formatValue'; +import { SortActionTypes, SortField } from 'utils/getSortedFields'; +import getColumnOptions from 'utils/getColumnOptions'; + +function getImagesExploreTableColumns( + paramColumns: string[] = [], + groupingSelectOptions: IGroupingSelectOption[], + groupFields: { [key: string]: unknown } | null, + order: { left: string[]; middle: string[]; right: string[] }, + hiddenColumns: string[], + sortFields?: any[], + onSort?: ({ sortFields, order, index, actionType }: any) => void, + grouping?: { [key: string]: string[] }, + onGroupingToggle?: (params: IOnGroupingSelectChangeParams) => void, +): ITableColumn[] { + let columns: ITableColumn[] = [ + { + key: 'experiment', + content: Name, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment') + ? 'left' + : order?.middle?.includes('experiment') + ? null + : order?.right?.includes('experiment') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.IMAGES!, + 'run.props.experiment.name', + ), + }, + { + key: 'experiment_description', + content: Description, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment_description') + ? 'left' + : order?.middle?.includes('experiment_description') + ? null + : order?.right?.includes('experiment_description') + ? 'right' + : null, + }, + { + key: 'hash', + content: Hash, + topHeader: 'Run', + pin: order?.left?.includes('hash') + ? 'left' + : order?.middle?.includes('hash') + ? null + : order?.right?.includes('hash') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.IMAGES!, + 'run.hash', + ), + }, + { + key: 'run', + content: Name, + topHeader: 'Run', + pin: order?.left?.includes('run') + ? 'left' + : order?.middle?.includes('run') + ? null + : order?.right?.includes('run') + ? 'right' + : 'left', + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.IMAGES!, + 'run.props.name', + ), + }, + + { + key: 'description', + content: Description, + topHeader: 'Run', + pin: order?.left?.includes('description') + ? 'left' + : order?.middle?.includes('description') + ? null + : order?.right?.includes('description') + ? 'right' + : null, + }, + { + key: 'date', + content: Date, + topHeader: 'Run', + pin: order?.left?.includes('date') + ? 'left' + : order?.middle?.includes('date') + ? null + : order?.right?.includes('date') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.IMAGES!, + 'run.props.creation_time', + ), + }, + { + key: 'duration', + content: Duration, + topHeader: 'Run', + pin: order?.left?.includes('date') + ? 'left' + : order?.middle?.includes('date') + ? null + : order?.right?.includes('date') + ? 'right' + : null, + }, + { + key: 'tags', + content: Tags, + topHeader: 'Run', + pin: order?.left?.includes('tags') + ? 'left' + : order?.right?.includes('tags') + ? 'right' + : null, + }, + { + key: 'name', + content: Name, + topHeader: 'Images', + pin: order?.left?.includes('name') + ? 'left' + : order?.right?.includes('name') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.IMAGES!, + 'name', + ), + }, + { + key: 'context', + content: Context, + topHeader: 'Images', + pin: order?.left?.includes('context') + ? 'left' + : order?.right?.includes('context') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.IMAGES!, + 'context', + ), + }, + { + key: 'actions', + content: '', + topHeader: '', + pin: 'right', + }, + ].concat( + paramColumns.map((param) => { + const paramKey = `run.params.${param}`; + const sortItemIndex: number = + sortFields?.findIndex((value: SortField) => value.value === paramKey) ?? + -1; + return { + key: param, + content: ( + + + {param} + {onSort && ( + + onSort({ + sortFields, + index: sortItemIndex, + field: + sortItemIndex === -1 + ? groupingSelectOptions.find( + (value) => value.value === paramKey, + ) + : sortFields?.[sortItemIndex], + actionType: + sortFields?.[sortItemIndex]?.order === 'desc' + ? SortActionTypes.DELETE + : SortActionTypes.ORDER_TABLE_TRIGGER, + }) + } + sort={ + !_.isNil(sortFields?.[sortItemIndex]) + ? sortFields?.[sortItemIndex]?.order + : null + } + /> + )} + + + ), + topHeader: 'Run Params', + pin: order?.left?.includes(param) + ? 'left' + : order?.right?.includes(param) + ? 'right' + : null, + }; + }), + ); + + columns = columns.map((col) => ({ + ...col, + isHidden: + !TABLE_DEFAULT_CONFIG.images.nonHidableColumns.has(col.key) && + hiddenColumns.includes(col.key), + })); + + const columnsOrder = order?.left.concat(order.middle).concat(order.right); + columns.sort((a, b) => { + if (a.key === '#') { + return -1; + } else if (a.key === 'actions') { + return 1; + } else if (b.key === 'actions') { + return -1; + } + if (!columnsOrder.includes(a.key) && !columnsOrder.includes(b.key)) { + return 0; + } else if (!columnsOrder.includes(a.key)) { + return 1; + } else if (!columnsOrder.includes(b.key)) { + return -1; + } + return columnsOrder.indexOf(a.key) - columnsOrder.indexOf(b.key); + }); + + if (groupFields) { + columns = [ + { + key: '#', + content: '', + topHeader: 'Group', + pin: 'left', + }, + { + key: 'groups', + content: ( + +
+ {Object.keys(groupFields).map((field) => { + let name: string = field.replace('run.params.', ''); + name = name.replace( + 'run.props.experiment.name', + 'run.props.experiment', + ); + name = name.replace('run.props', 'run'); + return ( + +
{name}
+
+ ); + })} +
+
+ ), + pin: order?.left?.includes('groups') + ? 'left' + : order?.right?.includes('groups') + ? 'right' + : null, + topHeader: 'Group Config', + }, + ...columns, + ]; + } + return columns; +} + +const TagsColumn = (props: { + runHash: string; + tags: ITagInfo[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + headerRenderer: () => React.ReactNode; + addTagButtonSize: 'xxSmall' | 'xSmall'; +}) => { + return ; +}; + +function imagesExploreTableRowRenderer( + rowData: any, + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void, + actions?: { [key: string]: (e: any) => void }, + groupHeaderRow = false, + columns: string[] = [], +) { + if (groupHeaderRow) { + const row: { [key: string]: any } = {}; + for (let i = 0; i < columns.length; i++) { + const col = columns[i]; + if (col === 'context') { + row[col] = { + content: + rowData.context.length > 1 ? ( + + ) : ( + + ), + }; + } else if (['step', 'epoch'].includes(col)) { + row[col] = + rowData[col] === null + ? '-' + : Array.isArray(rowData[col]) + ? '' + : rowData[col]; + } else if (col === 'time') { + row[col] = + rowData.time === null + ? '-' + : Array.isArray(rowData.time) + ? '' + : moment(rowData.time).format(TABLE_DATE_FORMAT); + } else if (col === 'groups') { + row.groups = { + content: ( + +
+ {Object.keys(rowData[col]).map((item, index) => { + const value: string | { [key: string]: unknown } = + rowData[col][item]; + return _.isObject(value) ? ( + + ( + + + {contextToString(value)} + + + )} + component={} + /> + + ) : ( + +
{formatValue(value)}
+
+ ); + })} +
+
+ ), + }; + } else if (Array.isArray(rowData[col])) { + row[col] = { + content: , + }; + } + } + + return _.merge({}, rowData, row); + } else { + const row = { + experiment: { + content: ( + + ), + }, + run: { + content: ( + + ), + }, + metric: rowData.metric, + context: { + content: + rowData.context.length > 1 ? ( + + ) : ( + + ), + }, + value: rowData.value, + step: rowData.step, + epoch: rowData.epoch, + tags: { + content: ( + <>} + addTagButtonSize='xxSmall' + /> + ), + }, + time: + rowData.time === null + ? '-' + : moment(rowData.time).format(TABLE_DATE_FORMAT), + actions: { + //@TODO add hide sequence functionality + content: ( + // + <> + ), + }, + }; + + return _.merge({}, rowData, row); + } +} + +export { getImagesExploreTableColumns, imagesExploreTableRowRenderer }; diff --git a/src/src/pages/ImagesExplore/components/SelectForm/SelectForm.scss b/src/src/pages/ImagesExplore/components/SelectForm/SelectForm.scss new file mode 100644 index 00000000..379e1a41 --- /dev/null +++ b/src/src/pages/ImagesExplore/components/SelectForm/SelectForm.scss @@ -0,0 +1,124 @@ +@use 'src/styles/abstracts' as *; + +.SelectForm { + flex: 1; + padding: 0.725rem 1.5em; + display: flex; + + &__container__metrics { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + padding-right: 1rem; + /* TODO [GA]: Override MUI default styles in a nice way */ + .MuiBox-root { + justify-content: flex-start; + } + } + &__container__search { + width: 103px; + display: flex; + justify-content: space-between; + flex-direction: column; + } + &__Popper { + border: $border-main; + width: 40%; + border-radius: $radius-main; + z-index: 6; + color: #586069; + background-color: #ffffff; + .MuiAutocomplete-paper { + box-shadow: unset; + margin: unset; + } + } + &__metric__select { + width: 100%; + + input { + padding: 0.5rem; + font-size: $text-md; + border-bottom: $border-main; + } + } + &__TextField { + position: relative; + } + &__textarea { + flex: 1; + .MuiOutlinedInput-multiline.MuiOutlinedInput-marginDense { + padding-top: toRem(7.5px); + padding-bottom: toRem(7.5px); + } + } + &__search__button { + width: 100%; + } + &__search__actions { + display: flex; + justify-content: space-between; + + button { + border: $border-main; + &:nth-child(2) { + margin: 0 0.25rem; + } + &.active { + border: $border-main-active; + background-color: $primary-color-5; + } + } + } + &__clearAll { + height: 24px; + width: 24px; + background: #e8f1fc; + border-radius: 6px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + position: relative; + &.disabled { + opacity: 0.5; + } + &:after { + content: ''; + position: absolute; + width: 20px; + height: 34px; + background: rgba(255, 255, 255, 0.5); + background: linear-gradient( + 90deg, + rgba(255, 255, 255, 0) 0%, + rgba(255, 255, 255, 1) 92% + ); + left: -20px; + top: -5px; + border-radius: 0; + color: white; + pointer-events: none; + } + + i { + color: #1473e6; + font-size: 10px; + } + } + &__tags { + display: flex; + align-items: center; + overflow: auto; + max-width: calc(100vw - 33rem); + min-width: 12rem; + + .Badge { + margin-right: 0.5rem; + &:last-child { + margin-right: 20px; + } + } + } +} diff --git a/src/src/pages/ImagesExplore/components/SelectForm/SelectForm.tsx b/src/src/pages/ImagesExplore/components/SelectForm/SelectForm.tsx new file mode 100644 index 00000000..24200c5f --- /dev/null +++ b/src/src/pages/ImagesExplore/components/SelectForm/SelectForm.tsx @@ -0,0 +1,384 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { + Box, + Checkbox, + Divider, + InputBase, + Popper, + Tooltip, +} from '@material-ui/core'; +import Autocomplete from '@material-ui/lab/Autocomplete'; +import { + CheckBox as CheckBoxIcon, + CheckBoxOutlineBlank, +} from '@material-ui/icons'; + +import { Icon, Badge, Button, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import AutocompleteInput from 'components/AutocompleteInput'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import imagesExploreAppModel from 'services/models/imagesExplore/imagesExploreAppModel'; +import { trackEvent } from 'services/analytics'; + +import { ISelectFormProps } from 'types/pages/imagesExplore/components/SelectForm/SelectForm'; +import { ISelectOption } from 'types/services/models/explorer/createAppModel'; + +import './SelectForm.scss'; + +function SelectForm({ + requestIsPending, + isDisabled = false, + selectedImagesData, + searchButtonDisabled, + selectFormData, + onImagesExploreSelectChange, + onSelectRunQueryChange, + toggleSelectAdvancedMode, + onSelectAdvancedQueryChange, + onSearchQueryCopy, +}: ISelectFormProps): React.FunctionComponentElement { + const [anchorEl, setAnchorEl] = React.useState(null); + const [searchValue, setSearchValue] = React.useState(''); + const searchMetricsRef = React.useRef(null); + const autocompleteRef: any = React.useRef>(null); + const advancedAutocompleteRef: any = + React.useRef>(null); + React.useEffect(() => { + return () => { + searchMetricsRef.current?.abort(); + }; + }, []); + + function handleSearch(e?: React.ChangeEvent): void { + e?.preventDefault(); + if (requestIsPending || searchButtonDisabled) { + return; + } + let query = selectedImagesData?.advancedMode + ? advancedAutocompleteRef?.current?.getValue() + : autocompleteRef?.current?.getValue(); + if (selectedImagesData?.advancedMode) { + onSelectAdvancedQueryChange(query ?? ''); + } else { + onSelectRunQueryChange(query ?? ''); + } + searchMetricsRef.current = imagesExploreAppModel.getImagesData( + true, + true, + query ?? '', + ); + searchMetricsRef.current.call(); + + trackEvent(ANALYTICS_EVENT_KEYS.images.searchClick); + } + + function handleRequestAbort(e: React.SyntheticEvent): void { + e.preventDefault(); + if (!requestIsPending) { + return; + } + searchMetricsRef.current?.abort(); + imagesExploreAppModel.abortRequest(); + } + + function onSelect( + event: React.ChangeEvent<{}>, + value: ISelectOption[], + ): void { + if (event.type === 'click') { + const lookup = value.reduce( + (acc: { [key: string]: number }, curr: ISelectOption) => { + acc[curr.key] = ++acc[curr.key] || 0; + return acc; + }, + {}, + ); + onImagesExploreSelectChange( + value.filter((option: ISelectOption) => lookup[option.key] === 0), + ); + } + } + + function handleDelete(field: string): void { + let fieldData = [...selectedImagesData?.options].filter( + (opt: ISelectOption) => opt.key !== field, + ); + onImagesExploreSelectChange(fieldData); + } + + function toggleEditMode(): void { + toggleSelectAdvancedMode(); + } + + function handleClick(event: React.ChangeEvent) { + setAnchorEl(event.currentTarget); + } + + function handleClose(event: any, reason: any) { + if (reason === 'toggleInput') { + return; + } + if (anchorEl) { + anchorEl.focus(); + } + setAnchorEl(null); + setSearchValue(''); + } + + function handleResetSelectForm(): void { + onImagesExploreSelectChange([]); + onSelectRunQueryChange(''); + } + + function handleSearchInputChange( + e: React.ChangeEvent, + ): void { + setSearchValue(e.target.value); + } + + const options = React.useMemo(() => { + return ( + selectFormData?.options?.filter( + (option) => option.label.indexOf(searchValue) !== -1, + ) ?? [] + ); + }, [searchValue, selectFormData?.options]); + + const open: boolean = !!anchorEl; + const id = open ? 'select-metric' : undefined; + + return ( + +
+
+ + + {selectedImagesData?.advancedMode ? ( +
+ +
+ ) : ( + + + + + option.group} + getOptionLabel={(option) => option.label} + renderTags={() => null} + disableClearable={true} + ListboxProps={{ + style: { + height: 400, + }, + }} + renderInput={(params) => ( + + )} + renderOption={(option) => { + let selected: boolean = + !!selectedImagesData?.options.find( + (item: ISelectOption) => item.key === option.key, + )?.key; + return ( +
+ } + checkedIcon={} + checked={selected} + size='small' + /> + + {option.label} + +
+ ); + }} + /> +
+ + {selectedImagesData?.options.length === 0 && ( + + No images are selected + + )} + + {selectedImagesData?.options?.map( + (tag: ISelectOption) => { + return ( + + ); + }, + )} + +
+ {selectedImagesData?.options.length > 1 && ( + + + + )} +
+ )} +
+
+ {selectedImagesData?.advancedMode ? null : ( + +
+ +
+
+ )} +
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+
+
+
+ ); +} + +export default React.memo(SelectForm); diff --git a/src/src/pages/Metrics/Metrics.scss b/src/src/pages/Metrics/Metrics.scss new file mode 100644 index 00000000..94ad5cca --- /dev/null +++ b/src/src/pages/Metrics/Metrics.scss @@ -0,0 +1,93 @@ +@use 'src/styles/abstracts' as *; + +.Metrics__section { + height: 100vh; + overflow: hidden; + .Metrics__loader { + flex-direction: column; + justify-content: space-between; + } + .Metrics__visualization { + display: flex; + position: relative; + flex-direction: column; + flex: 1 100%; + max-height: calc(100% - #{toRem(136px)}); + .ProgressBar { + padding-bottom: toRem(136px); + } + } +} + +.Metrics__container { + background-color: #ffffff; + min-width: 50rem; + .Metrics__fullHeight { + height: 100%; + } + .Metrics__section__appBarContainer { + display: flex; + flex-direction: column; + } + .Metrics__chart__container { + flex: 0.5 1 0; + min-height: 11.25rem; + &.fullHeight { + flex: 1 100% !important; + } + &.hide { + display: none; + } + } + .Metrics__ResizePanel { + &.hide { + display: none; + } + } + .Metrics__table__container { + flex: 0.5 1 0; + min-height: 11rem; + &.fullHeight { + flex: 1 100% !important; + } + &.hide { + display: none; + } + } +} + +.Metrics__SelectForm__Grouping__container { + display: flex; + border-bottom: $border-main; + min-height: 6rem; + max-height: 6rem; +} + +.Metrics__table__aggregationColumn__cell { + display: flex; + flex: 1; + justify-content: space-between; + width: calc(100% + 28px); + span { + display: inline-block; + width: 100%; + min-width: 120px; + justify-content: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + &:nth-of-type(2) { + padding: 0 $space-xs; + margin: 0 $space-xs; + border-left: $border-separator; + border-right: $border-separator; + } + + &:nth-of-type(4) { + padding: 0 $space-xs; + margin: 0 $space-xs; + border-left: $border-separator; + } + } +} diff --git a/src/src/pages/Metrics/Metrics.tsx b/src/src/pages/Metrics/Metrics.tsx new file mode 100644 index 00000000..43b622d0 --- /dev/null +++ b/src/src/pages/Metrics/Metrics.tsx @@ -0,0 +1,312 @@ +import React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import Table from 'components/Table/Table'; +import ChartPanel from 'components/ChartPanel/ChartPanel'; +import NotificationContainer from 'components/NotificationContainer/NotificationContainer'; +import IllustrationBlock from 'components/IllustrationBlock/IllustrationBlock'; +import ResizePanel from 'components/ResizePanel/ResizePanel'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import Grouping from 'components/Grouping/Grouping'; +import ProgressBar from 'components/ProgressBar/ProgressBar'; + +import pageTitlesEnum from 'config/pageTitles/pageTitles'; +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { + RowHeightSize, + VisualizationElementEnum, +} from 'config/table/tableConfigs'; +import GroupingPopovers, { + GroupNameEnum, +} from 'config/grouping/GroupingPopovers'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { + IllustrationsEnum, + Request_Illustrations, +} from 'config/illustrationConfig/illustrationConfig'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { ILine } from 'types/components/LineChart/LineChart'; +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +import { ChartTypeEnum, CurveEnum } from 'utils/d3'; + +import MetricsBar from './components/MetricsBar/MetricsBar'; +import Controls from './components/Controls/Controls'; +import SelectForm from './components/SelectForm/SelectForm'; + +import './Metrics.scss'; + +function Metrics( + props: IMetricProps, +): React.FunctionComponentElement { + const [isProgressBarVisible, setIsProgressBarVisible] = + React.useState(false); + const chartProps = React.useMemo(() => { + return (props.lineChartData || []).map((chartData: ILine[]) => ({ + axesScaleType: props.axesScaleType, + axesScaleRange: props.axesScaleRange, + curveInterpolation: props.smoothing.isApplied + ? props.smoothing.curveInterpolation + : CurveEnum.Linear, + ignoreOutliers: props.ignoreOutliers, + highlightMode: props.highlightMode, + aggregatedData: props.aggregatedData?.filter( + (data) => data.chartIndex === chartData[0]?.chartIndex, + ), + zoom: props.zoom, + chartTitle: props.chartTitleData[chartData[0]?.chartIndex!], + aggregationConfig: props.aggregationConfig, + alignmentConfig: props.alignmentConfig, + onZoomChange: props.onZoomChange, + })); + }, [ + props.lineChartData, + props.axesScaleType, + props.smoothing.curveInterpolation, + props.smoothing.isApplied, + props.ignoreOutliers, + props.highlightMode, + props.zoom, + props.chartTitleData, + props.aggregatedData, + props.aggregationConfig, + props.alignmentConfig, + props.onZoomChange, + props.axesScaleRange, + ]); + + return ( + +
+
+
+ +
+ + + p.groupName === GroupNameEnum.COLOR || + p.groupName === GroupNameEnum.STROKE || + p.groupName === GroupNameEnum.CHART, + )} + isDisabled={isProgressBarVisible} + groupingData={props.groupingData} + groupingSelectOptions={props.groupingSelectOptions} + onGroupingSelectChange={props.onGroupingSelectChange} + onGroupingModeChange={props.onGroupingModeChange} + onGroupingPaletteChange={props.onGroupingPaletteChange} + onGroupingReset={props.onGroupingReset} + onGroupingApplyChange={props.onGroupingApplyChange} + onGroupingPersistenceChange={props.onGroupingPersistenceChange} + onShuffleChange={props.onShuffleChange} + /> +
+
+ + {_.isEmpty(props.tableData) && _.isEmpty(props.lineChartData) ? ( + + ) : ( + <> +
+ {props.resizeMode === ResizeModeEnum.MaxHeight ? null : ( + + } + /> + )} +
+ +
+ {props.resizeMode === ResizeModeEnum.Hide ? null : ( + +
+ + )} + + + )} + + + + {props.notifyData?.length > 0 && ( + + )} + + + ); +} + +export default React.memo(Metrics); diff --git a/src/src/pages/Metrics/MetricsContainer.tsx b/src/src/pages/Metrics/MetricsContainer.tsx new file mode 100644 index 00000000..5dedc51c --- /dev/null +++ b/src/src/pages/Metrics/MetricsContainer.tsx @@ -0,0 +1,220 @@ +import React from 'react'; +import { useHistory, useRouteMatch } from 'react-router-dom'; +import { useResizeObserver, useModel, usePanelResize } from 'hooks'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import metricAppModel from 'services/models/metrics/metricsAppModel'; +import * as analytics from 'services/analytics'; +import { AppNameEnum } from 'services/models/explorer'; + +import { ITableRef } from 'types/components/Table/Table'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { IMetricAppModelState } from 'types/services/models/metrics/metricsAppModel'; +import { IApiRequest } from 'types/services/services'; + +import setComponentRefs from 'utils/app/setComponentRefs'; +import getStateFromUrl from 'utils/getStateFromUrl'; +import exceptionHandler from 'utils/app/exceptionHandler'; + +import Metrics from './Metrics'; + +function MetricsContainer(): React.FunctionComponentElement { + const tableRef = React.useRef(null); + const chartPanelRef = React.useRef(null); + const tableElemRef = React.useRef(null); + const chartElemRef = React.useRef(null); + const wrapperElemRef = React.useRef(null); + const resizeElemRef = React.useRef(null); + const route = useRouteMatch(); + const history = useHistory(); + const metricsData = useModel>(metricAppModel); + const [chartPanelOffsetHeight, setChartPanelOffsetHeight] = React.useState( + chartElemRef?.current?.offsetHeight, + ); + + const panelResizing = usePanelResize( + wrapperElemRef, + chartElemRef, + tableElemRef, + resizeElemRef, + metricsData?.config?.table || undefined, + metricAppModel.onTableResizeEnd, + ); + + useResizeObserver(() => { + if (chartElemRef?.current?.offsetHeight !== chartPanelOffsetHeight) { + setChartPanelOffsetHeight(chartElemRef?.current?.offsetHeight); + } + }, chartElemRef); + + React.useEffect(() => { + if (tableRef.current && chartPanelRef.current) { + setComponentRefs({ + model: metricAppModel, + refElement: { + tableRef, + chartPanelRef, + }, + }); + } + }, [metricsData?.rawData]); + + React.useEffect(() => { + metricAppModel.initialize(route.params.appId); + let appRequestRef: IApiRequest; + let metricsRequestRef: IApiRequest; + if (route.params.appId) { + appRequestRef = metricAppModel.getAppConfigData(route.params.appId); + appRequestRef + .call((detail: any) => { + exceptionHandler({ detail, model: metricAppModel }); + }) + .then(() => { + metricAppModel.setDefaultAppConfigData(false); + metricsRequestRef = metricAppModel.getMetricsData(); + metricsRequestRef.call((detail: any) => { + exceptionHandler({ detail, model: metricAppModel }); + }); + }); + } else { + metricAppModel.setDefaultAppConfigData(); + metricsRequestRef = metricAppModel.getMetricsData(); + metricsRequestRef.call((detail: any) => { + exceptionHandler({ detail, model: metricAppModel }); + }); + } + analytics.pageView(ANALYTICS_EVENT_KEYS.metrics.pageView); + + const unListenHistory = history.listen(() => { + if (!!metricsData?.config) { + if ( + (metricsData.config.grouping !== getStateFromUrl('grouping') || + metricsData.config.chart !== getStateFromUrl('chart') || + metricsData.config.select !== getStateFromUrl('select')) && + history.location.pathname === `/${AppNameEnum.METRICS}` + ) { + metricAppModel.setDefaultAppConfigData(); + metricAppModel.updateModelData(); + } + } + }); + return () => { + metricAppModel.destroy(); + metricsRequestRef?.abort(); + unListenHistory(); + if (appRequestRef) { + appRequestRef.abort(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + return ( + + + + ); +} + +export default MetricsContainer; diff --git a/src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.scss b/src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.scss new file mode 100644 index 00000000..6949b266 --- /dev/null +++ b/src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.scss @@ -0,0 +1,61 @@ +@use 'src/styles/abstracts' as *; + +.ColorPopoverAdvanced { + width: 25rem; + + &__Switcher__button__container { + height: 1.75rem; + display: flex; + align-items: center; + .ColorPopoverAdvanced__span { + margin-left: 0.875rem; + } + } + &__persistence { + padding: 1rem; + border-bottom: $border-main; + } + + &__persistence__p { + margin: 0.5rem 0 1rem 0; + } + + &__preferred__colors { + padding: 1rem; + h3 { + margin-bottom: 0.5rem; + } + .ColorPopoverAdvanced__span { + flex: 1; + } + } + + &__paletteColors__container { + display: flex; + border-radius: $border-radius-md; + width: 10.5rem; + border: 0.0625rem solid transparent; + height: 2rem; + overflow: hidden; + transition: all 0.18s ease-out; + padding: 0.1875rem; + + &.active { + border: 0.0625rem solid $primary-color; + } + } + + &__paletteColors__colorItem { + display: inline-block; + flex: 1; + height: 100%; + + &:first-child { + border-radius: 0.25rem 0 0 0.25rem; + } + + &:last-child { + border-radius: 0 0.25rem 0.25rem 0; + } + } +} diff --git a/src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.tsx b/src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.tsx new file mode 100644 index 00000000..d0cf23e7 --- /dev/null +++ b/src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.tsx @@ -0,0 +1,118 @@ +import React from 'react'; + +import { Box, Radio } from '@material-ui/core'; + +import { Button, Switcher, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import COLORS from 'config/colors/colors'; + +import { IGroupingPopoverAdvancedProps } from 'types/components/GroupingPopover/GroupingPopover'; + +import './ColorPopoverAdvanced.scss'; + +function ColorPopoverAdvanced({ + onPersistenceChange, + onGroupingPaletteChange, + onShuffleChange, + persistence, + paletteIndex, + groupingData, +}: IGroupingPopoverAdvancedProps): React.FunctionComponentElement { + function onPaletteChange(e: React.ChangeEvent) { + let { value } = e.target; + if (onGroupingPaletteChange) { + onGroupingPaletteChange(parseInt(value)); + } + } + function isShuffleDisabled(): boolean { + //ToDo reverse mode + // if (groupingData?.reverseMode.color || groupingData?.color.length) { + if (groupingData?.color.length) { + return false; + } + return true; + } + + return ( + +
+
+ + colors persistence + + + Enable persistent coloring mode so that each item always has the + same color regardless of its order. + +
+
+ onPersistenceChange('color')} + checked={persistence} + size='large' + variant='contained' + /> + + Enable + +
+ {persistence && ( + + )} +
+
+
+ + Preferred color palette + +
+ {COLORS.map((options, index) => ( + + + + + {index === 0 ? '8 distinct colors' : '24 colors'}{' '} + +
+ {options.map((color) => ( + + ))} +
+
+
+ ))} +
+
+
+
+ ); +} + +export default ColorPopoverAdvanced; diff --git a/src/src/pages/Metrics/components/Controls/Controls.scss b/src/src/pages/Metrics/components/Controls/Controls.scss new file mode 100644 index 00000000..18486b90 --- /dev/null +++ b/src/src/pages/Metrics/components/Controls/Controls.scss @@ -0,0 +1,86 @@ +@use 'src/styles/abstracts' as *; + +.Controls__container { + padding: 0.75rem 0; + display: flex; + flex-direction: column; + align-items: center; + overflow: auto; + + & > div { + margin-bottom: 0.375rem; + + &:last-child { + margin-bottom: 0; + } + } +} + +.Controls__icon { + color: $pico-70; + font-size: 1.125rem; + &.active { + color: $primary-color; + } +} + +.Controls__anchor { + height: 2.25rem; + width: 2.25rem; + display: flex; + cursor: pointer; + position: relative; + align-items: center; + justify-content: center; + transition: background-color 0.18s ease-out; + border: 0.0625rem solid transparent; + border-radius: $border-radius-main; + + &.active { + background-color: $primary-color-10; + + &.outlined { + border: $border-main-active; + } + } + + &.disabled { + cursor: initial; + i { + color: $pico-50; + } + &:hover { + background-color: transparent; + } + } + + &:hover { + background-color: $pico-5; + + .icon-arrow-left { + opacity: 1; + } + } +} + +.Controls__anchor__arrow { + width: 0.6875rem; + height: 100%; + position: absolute; + left: -0.75rem; + display: flex; + align-items: center; + justify-content: center; + + &.opened { + .icon-arrow-left { + transform: rotate(180deg); + color: $primary-color; + } + } + + .icon-arrow-left { + transition: all 0.18s ease-out; + color: $pico-70; + } +} diff --git a/src/src/pages/Metrics/components/Controls/Controls.tsx b/src/src/pages/Metrics/components/Controls/Controls.tsx new file mode 100644 index 00000000..65430fa3 --- /dev/null +++ b/src/src/pages/Metrics/components/Controls/Controls.tsx @@ -0,0 +1,486 @@ +import React from 'react'; +import classNames from 'classnames'; +import _ from 'lodash-es'; + +import { Tooltip } from '@material-ui/core'; + +import AggregationPopover from 'components/AggregationPopover/AggregationPopover'; +import SmootheningPopover from 'components/SmoothingPopover/SmoothingPopover'; +import ZoomInPopover from 'components/ZoomInPopover/ZoomInPopover'; +import ZoomOutPopover from 'components/ZoomOutPopover/ZoomOutPopover'; +import HighlightModePopover from 'components/HighlightModesPopover/HighlightModesPopover'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import AxesScalePopover from 'components/AxesScalePopover/AxesScalePopover'; +import AlignmentPopover from 'components/AxesPropsPopover/AxesPropsPopover'; +import TooltipContentPopover from 'components/TooltipContentPopover/TooltipContentPopover'; +import { Icon } from 'components/kit'; +import ExportPreview from 'components/ExportPreview'; +import ChartGrid from 'components/ChartPanel/ChartGrid'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import ChartLegends from 'components/ChartPanel/ChartLegends'; + +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import { IControlProps } from 'types/pages/metrics/components/Controls/Controls'; + +import './Controls.scss'; + +function Controls( + props: IControlProps, +): React.FunctionComponentElement { + const [openExportModal, setOpenExportModal] = React.useState(false); + + const highlightModeChanged: boolean = React.useMemo(() => { + return ( + props.highlightMode !== CONTROLS_DEFAULT_CONFIG.metrics.highlightMode + ); + }, [props.highlightMode]); + + const axesScaleChanged: boolean = React.useMemo(() => { + return ( + props.axesScaleType.xAxis !== + CONTROLS_DEFAULT_CONFIG.metrics.axesScaleType.xAxis || + props.axesScaleType.yAxis !== + CONTROLS_DEFAULT_CONFIG.metrics.axesScaleType.yAxis + ); + }, [props.axesScaleType]); + + const alignmentChanged: boolean = React.useMemo(() => { + return ( + props.alignmentConfig.metric !== + CONTROLS_DEFAULT_CONFIG.metrics.alignmentConfig.metric || + props.alignmentConfig.type !== + CONTROLS_DEFAULT_CONFIG.metrics.alignmentConfig.type || + props.densityType !== CONTROLS_DEFAULT_CONFIG.metrics.densityType + ); + }, [props.alignmentConfig, props.densityType]); + + const axesRangeChanged: boolean = React.useMemo(() => { + return !_.isEqual( + props.axesScaleRange, + CONTROLS_DEFAULT_CONFIG.metrics.axesScaleRange, + ); + }, [props.axesScaleRange]); + + const tooltipChanged: boolean = React.useMemo(() => { + return ( + props.tooltip?.appearance !== + CONTROLS_DEFAULT_CONFIG.metrics.tooltip.appearance || + props.tooltip.selectedFields?.length !== + CONTROLS_DEFAULT_CONFIG.metrics.tooltip.selectedFields.length + ); + }, [props.tooltip]); + + const onToggleExportPreview = React.useCallback((): void => { + setOpenExportModal((state) => !state); + }, [setOpenExportModal]); + + return ( + +
+
+ + ( + +
{ + if (props.aggregationConfig.isEnabled) { + props.onAggregationConfigChange({ + isApplied: !props.aggregationConfig?.isApplied, + }); + } + }} + > + {props.aggregationConfig.isEnabled ? ( + + + + ) : null} + +
+
+ )} + component={ + + } + /> +
+
+
+ + ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+
+ + ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+
+ + ( + +
{ + props.onSmoothingChange({ + isApplied: !props.smoothing?.isApplied, + }); + }} + > + + + + +
+
+ )} + component={ + + } + /> +
+
+ +
+ +
+
+
+ + ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+
+ + ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+
+ + +
{ + if (!_.isEmpty(props.legendsData)) { + props.onLegendsChange({ display: !props.legends?.display }); + } + }} + > + +
+
+
+
+
+ + ( + +
{ + if (props.zoom) { + props.onZoomChange?.({ active: !props.zoom.active }); + } + }} + > + + + + +
+
+ )} + component={ + + } + /> +
+
+
+ + ( + +
{ + if (props.zoom?.history.length) { + props.onZoomChange?.({ + history: [...props.zoom.history].slice(0, -1), + }); + } + }} + > + {props.zoom?.history.length ? ( + + + + ) : null} + +
+
+ )} + component={ + + } + /> +
+
+ + {/* TODO add ability to open modals in ControlPopover component and change the name of the ControlPopover to more general*/} + +
+ +
+
+ {openExportModal && ( + + ) : null + } + > + + + )} +
+
+
+ ); +} + +export default Controls; diff --git a/src/src/pages/Metrics/components/MetricsBar/MetricsBar.scss b/src/src/pages/Metrics/components/MetricsBar/MetricsBar.scss new file mode 100644 index 00000000..69332811 --- /dev/null +++ b/src/src/pages/Metrics/components/MetricsBar/MetricsBar.scss @@ -0,0 +1,35 @@ +@use 'src/styles/abstracts' as *; + +.MetricsBar { + &__item__bookmark { + margin-right: $space-xxxs; + padding: 0 $space-xs !important; + &__Text { + margin-right: 0.625rem; + } + + &__Icon { + color: $text-color; + } + } + &__menu { + border-left: $border-main; + padding: 0 $space-xxxs; + height: 100%; + display: flex; + align-items: center; + span { + cursor: pointer; + } + } + &__popover { + width: 16rem; + padding: $space-xs; + display: flex; + flex-direction: column; + a { + text-decoration: none; + color: inherit; + } + } +} diff --git a/src/src/pages/Metrics/components/MetricsBar/MetricsBar.tsx b/src/src/pages/Metrics/components/MetricsBar/MetricsBar.tsx new file mode 100644 index 00000000..cb3bd1a5 --- /dev/null +++ b/src/src/pages/Metrics/components/MetricsBar/MetricsBar.tsx @@ -0,0 +1,155 @@ +import React from 'react'; +import { useRouteMatch } from 'react-router-dom'; + +import { MenuItem } from '@material-ui/core'; + +import BookmarkForm from 'components/BookmarkForm/BookmarkForm'; +import AppBar from 'components/AppBar/AppBar'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import LiveUpdateSettings from 'components/LiveUpdateSettings/LiveUpdateSettings'; +import { Button, Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import ConfirmModal from 'components/ConfirmModal/ConfirmModal'; + +import { DOCUMENTATIONS } from 'config/references'; + +import { IMetricsBarProps } from 'types/pages/metrics/components/MetricsBar/MetricsBar'; + +import './MetricsBar.scss'; + +function MetricsBar({ + title, + explorerName = 'METRICS', + liveUpdateConfig, + disabled, + onBookmarkCreate, + onBookmarkUpdate, + onResetConfigData, + onLiveUpdateConfigChange, +}: IMetricsBarProps): React.FunctionComponentElement { + const [popover, setPopover] = React.useState(''); + + const route = useRouteMatch(); + + function handleBookmarkClick(value: string): void { + setPopover(value); + } + + function handleClosePopover(): void { + setPopover(''); + } + + function handleBookmarkUpdate(): void { + onBookmarkUpdate(route.params.appId); + handleClosePopover(); + } + + return ( + + + + {route.params.appId ? ( + + ( + + )} + component={ +
+ handleBookmarkClick('create')}> + Create Bookmark + + handleBookmarkClick('update')}> + Update Bookmark + +
+ } + /> +
+ ) : ( + + )} +
+ + ( + + )} + component={ +
+ + Reset Controls to System Defaults + + + Explorer Documentation + +
+ } + /> +
+
+ + + + } + title='Update bookmark' + statusType='success' + confirmBtnText='Update' + /> +
+
+ ); +} + +export default React.memo(MetricsBar); diff --git a/src/src/pages/Metrics/components/MetricsTableGrid/MetricsTableGrid.tsx b/src/src/pages/Metrics/components/MetricsTableGrid/MetricsTableGrid.tsx new file mode 100644 index 00000000..46b911ac --- /dev/null +++ b/src/src/pages/Metrics/components/MetricsTableGrid/MetricsTableGrid.tsx @@ -0,0 +1,589 @@ +import moment from 'moment'; +import _ from 'lodash-es'; +import * as React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import TableSortIcons from 'components/Table/TableSortIcons'; +import { Badge, Button, Icon } from 'components/kit'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import JsonViewPopover from 'components/kit/JsonViewPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import RunNameColumn from 'components/Table/RunNameColumn'; +import GroupedColumnHeader from 'components/Table/GroupedColumnHeader'; +import AttachedTagsList from 'components/AttachedTagsList/AttachedTagsList'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import COLORS from 'config/colors/colors'; +import { TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { TABLE_DEFAULT_CONFIG } from 'config/table/tableConfigs'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { IOnGroupingSelectChangeParams } from 'types/services/models/metrics/metricsAppModel'; +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { + AggregationAreaMethods, + AggregationLineMethods, +} from 'utils/aggregateGroupData'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import contextToString from 'utils/contextToString'; +import { formatValue } from 'utils/formatValue'; +import { SortActionTypes, SortField, SortFields } from 'utils/getSortedFields'; +import getColumnOptions from 'utils/getColumnOptions'; + +function getMetricsTableColumns( + paramColumns: string[] = [], + groupingSelectOptions: IGroupingSelectOption[], + groupFields: { [key: string]: unknown } | null, + order: { left: string[]; middle: string[]; right: string[] }, + hiddenColumns: string[], + aggregationMethods?: { + area: AggregationAreaMethods; + line: AggregationLineMethods; + }, + sortFields?: SortFields, + onSort?: ({ sortFields, order, index, actionType }: any) => void, + grouping?: { [key: string]: string[] }, + onGroupingToggle?: (params: IOnGroupingSelectChangeParams) => void, +): ITableColumn[] { + let columns: ITableColumn[] = [ + { + key: 'experiment', + content: Name, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment') + ? 'left' + : order?.middle?.includes('experiment') + ? null + : order?.right?.includes('experiment') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + 'run.props.experiment.name', + ), + }, + { + key: 'experiment_description', + content: Description, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment_description') + ? 'left' + : order?.right?.includes('experiment_description') + ? 'right' + : null, + }, + { + key: 'hash', + content: Hash, + topHeader: 'Run', + pin: order?.left?.includes('hash') + ? 'left' + : order?.middle?.includes('hash') + ? null + : order?.right?.includes('hash') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + 'run.hash', + ), + }, + { + key: 'run', + content: Name, + topHeader: 'Run', + pin: order?.left?.includes('run') + ? 'left' + : order?.middle?.includes('run') + ? null + : order?.right?.includes('run') + ? 'right' + : 'left', + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + 'run.props.name', + ), + }, + + { + key: 'description', + content: Description, + topHeader: 'Run', + pin: order?.left?.includes('description') + ? 'left' + : order?.right?.includes('description') + ? 'right' + : null, + }, + { + key: 'date', + content: Date, + topHeader: 'Run', + pin: order?.left?.includes('date') + ? 'left' + : order?.right?.includes('date') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + 'run.props.creation_time', + ), + }, + { + key: 'duration', + content: Duration, + topHeader: 'Run', + pin: order?.left?.includes('duration') + ? 'left' + : order?.right?.includes('duration') + ? 'right' + : null, + }, + { + key: 'tags', + content: Tags, + topHeader: 'Run', + pin: order?.left?.includes('tags') + ? 'left' + : order?.right?.includes('tags') + ? 'right' + : null, + }, + { + key: 'metric', + content: Name, + topHeader: 'Metric', + pin: order?.left?.includes('metric') + ? 'left' + : order?.right?.includes('metric') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + 'name', + ), + }, + { + key: 'context', + content: Context, + topHeader: 'Metric', + pin: order?.left?.includes('context') + ? 'left' + : order?.right?.includes('context') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + 'context', + ), + }, + { + key: 'value', + content: groupFields ? ( +
+ Group Min + + {aggregationMethods!.line === AggregationLineMethods.MEAN + ? 'Mean' + : aggregationMethods!.line === AggregationLineMethods.MEDIAN + ? 'Median' + : aggregationMethods!.line === AggregationLineMethods.MIN + ? 'Min' + : 'Max'} + + Group Max + {aggregationMethods!.area === AggregationAreaMethods.STD_DEV && ( + Std. Dev. + )} + {aggregationMethods!.area === AggregationAreaMethods.STD_ERR && ( + Std. Err. + )} +
+ ) : ( + Value + ), + topHeader: groupFields ? 'Value' : 'Metric', + pin: order?.left?.includes('value') + ? 'left' + : order?.right?.includes('value') + ? 'right' + : null, + }, + { + key: 'step', + content: Step, + topHeader: 'Metric', + pin: order?.left?.includes('step') + ? 'left' + : order?.right?.includes('step') + ? 'right' + : null, + }, + { + key: 'epoch', + content: Epoch, + topHeader: 'Metric', + pin: order?.left?.includes('epoch') + ? 'left' + : order?.right?.includes('epoch') + ? 'right' + : null, + }, + { + key: 'time', + content: Time, + topHeader: 'Metric', + pin: order?.left?.includes('time') + ? 'left' + : order?.right?.includes('time') + ? 'right' + : null, + }, + { + key: 'actions', + content: '', + topHeader: '', + pin: 'right', + }, + ].concat( + paramColumns.map((param) => { + const paramKey = `run.params.${param}`; + const sortItemIndex: number = + sortFields?.findIndex((value: SortField) => value.value === paramKey) ?? + -1; + return { + key: param, + content: ( + + {param} + {onSort && ( + + onSort({ + sortFields, + index: sortItemIndex, + field: + sortItemIndex === -1 + ? groupingSelectOptions.find( + (value) => value.value === paramKey, + ) + : sortFields?.[sortItemIndex], + actionType: + sortFields?.[sortItemIndex]?.order === 'desc' + ? SortActionTypes.DELETE + : SortActionTypes.ORDER_TABLE_TRIGGER, + }) + } + sort={ + !_.isNil(sortFields?.[sortItemIndex]) + ? sortFields?.[sortItemIndex]?.order ?? null + : null + } + /> + )} + + ), + topHeader: 'Run Params', + pin: order?.left?.includes(param) + ? 'left' + : order?.right?.includes(param) + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + paramKey, + ), + }; + }), + ); + + const columnsOrder = order?.left.concat(order.middle).concat(order.right); + columns.sort((a, b) => { + if (a.key === '#') { + return -1; + } else if (a.key === 'actions') { + return 1; + } else if (b.key === 'actions') { + return -1; + } + if (!columnsOrder.includes(a.key) && !columnsOrder.includes(b.key)) { + return 0; + } else if (!columnsOrder.includes(a.key)) { + return 1; + } else if (!columnsOrder.includes(b.key)) { + return -1; + } + return columnsOrder.indexOf(a.key) - columnsOrder.indexOf(b.key); + }); + + if (groupFields) { + columns = [ + { + key: '#', + content: '', + topHeader: 'Group', + pin: 'left', + }, + { + key: 'groups', + content: ( +
+ {Object.keys(groupFields).map((field) => { + let name: string = field.replace('run.params.', ''); + name = name.replace( + 'run.props.experiment.name', + 'run.props.experiment', + ); + name = name.replace('run.props', 'run'); + return ( + + {name} + + ); + })} +
+ ), + pin: order?.left?.includes('groups') + ? 'left' + : order?.right?.includes('groups') + ? 'right' + : null, + topHeader: 'Group Config', + }, + ...columns, + ]; + } + columns = columns.map((col) => ({ + ...col, + isHidden: + !TABLE_DEFAULT_CONFIG.metrics.nonHidableColumns.has(col.key) && + hiddenColumns.includes(col.key), + })); + return columns; +} + +const TagsColumn = (props: { + runHash: string; + tags: ITagInfo[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + headerRenderer: () => React.ReactNode; + addTagButtonSize: 'xxSmall' | 'xSmall'; +}) => { + return ; +}; + +function metricsTableRowRenderer( + rowData: any, + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void, + actions?: { [key: string]: (e: any) => void }, + groupHeaderRow = false, + columns: string[] = [], +) { + if (groupHeaderRow) { + const row: { [key: string]: any } = {}; + for (let i = 0; i < columns.length; i++) { + const col = columns[i]; + if (col === 'metric') { + let metricName: string = isSystemMetric(rowData[col]) + ? formatSystemMetricName(rowData[col]) + : rowData[col]; + row.metric = { + content: + Array.isArray(rowData.metric) && rowData.metric.length > 1 ? ( + + ) : ( + {metricName} + ), + }; + } else if (col === 'context') { + row[col] = { + content: + rowData.context.length > 1 ? ( + + ) : ( + + ), + }; + } else if (col === 'value') { + row.value = { + content: ( +
+ {rowData.aggregation.area.min} + {rowData.aggregation.line} + {rowData.aggregation.area.max} + {!_.isNil(rowData.aggregation.area.stdDevValue) && ( + + {rowData.aggregation.area.stdDevValue} + + )} + {!_.isNil(rowData.aggregation.area.stdErrValue) && ( + + {rowData.aggregation.area.stdErrValue} + + )} +
+ ), + }; + } else if (col === 'groups') { + row.groups = { + content: ( + +
+ {Object.keys(rowData[col]).map((item) => { + const value: string | { [key: string]: unknown } = + rowData[col][item]; + return _.isObject(value) ? ( + ( + + + {contextToString(value)} + + + )} + component={} + /> + ) : ( + +
{formatValue(value)}
+
+ ); + })} +
+
+ ), + }; + } else if (['step', 'epoch'].includes(col)) { + row[col] = + rowData[col] === null + ? '-' + : Array.isArray(rowData[col]) + ? '' + : rowData[col]; + } else if (col === 'time') { + row[col] = + rowData.time === null + ? '-' + : Array.isArray(rowData.time) + ? '' + : moment(rowData.time).format(TABLE_DATE_FORMAT); + } else if (Array.isArray(rowData[col])) { + row[col] = { + content: , + }; + } + } + + return _.merge({}, rowData, row); + } else { + const row = { + experiment: { + content: ( + + ), + }, + run: { + content: ( +
+ + )} + + + )} + + + + {notifyData?.length > 0 && ( + + )} + + ); +}; + +export default React.memo(Params); diff --git a/src/src/pages/Params/ParamsContainer.tsx b/src/src/pages/Params/ParamsContainer.tsx new file mode 100644 index 00000000..7c2f39a0 --- /dev/null +++ b/src/src/pages/Params/ParamsContainer.tsx @@ -0,0 +1,199 @@ +import React from 'react'; +import { useHistory, useRouteMatch } from 'react-router-dom'; +import { useResizeObserver, usePanelResize, useModel } from 'hooks'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import paramsAppModel from 'services/models/params/paramsAppModel'; +import * as analytics from 'services/analytics'; +import { AppNameEnum } from 'services/models/explorer'; + +import { IParamsAppModelState } from 'types/services/models/params/paramsAppModel'; +import { ITableRef } from 'types/components/Table/Table'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { IApiRequest } from 'types/services/services'; + +import getStateFromUrl from 'utils/getStateFromUrl'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import setComponentRefs from 'utils/app/setComponentRefs'; +import manageSystemMetricColumns from 'utils/app/manageSystemMetricColumns'; + +import Params from './Params'; + +function ParamsContainer(): React.FunctionComponentElement { + const tableRef = React.useRef(null); + const chartPanelRef = React.useRef(null); + const chartElemRef = React.useRef(null); + const tableElemRef = React.useRef(null); + const wrapperElemRef = React.useRef(null); + const resizeElemRef = React.useRef(null); + const paramsData = + useModel>(paramsAppModel); + const route = useRouteMatch(); + const history = useHistory(); + const [chartPanelOffsetHeight, setChartPanelOffsetHeight] = React.useState( + chartElemRef?.current?.offsetWidth, + ); + const panelResizing = usePanelResize( + wrapperElemRef, + chartElemRef, + tableElemRef, + resizeElemRef, + paramsData?.config?.table, + paramsAppModel.onTableResizeEnd, + ); + + useResizeObserver(() => { + if (chartElemRef?.current?.offsetHeight !== chartPanelOffsetHeight) { + setChartPanelOffsetHeight(chartElemRef?.current?.offsetHeight); + } + }, chartElemRef); + + React.useEffect(() => { + if (tableRef.current && chartPanelRef.current) { + setComponentRefs({ + model: paramsAppModel, + refElement: { + tableRef, + chartPanelRef, + }, + }); + } + if (paramsData?.rawData?.length > 0) { + manageSystemMetricColumns(paramsAppModel); + } + }, [paramsData?.rawData]); + + React.useEffect(() => { + paramsAppModel.initialize(route.params.appId); + let appRequestRef: IApiRequest; + let paramsRequestRef: IApiRequest; + if (route.params.appId) { + appRequestRef = paramsAppModel.getAppConfigData(route.params.appId); + appRequestRef + .call((detail: any) => { + exceptionHandler({ detail, model: paramsAppModel }); + }) + .then(() => { + paramsAppModel.setDefaultAppConfigData(false); + paramsRequestRef = paramsAppModel.getParamsData(); + paramsRequestRef.call((detail: any) => { + exceptionHandler({ detail, model: paramsAppModel }); + }); + }); + } else { + paramsAppModel.setDefaultAppConfigData(); + paramsRequestRef = paramsAppModel.getParamsData(); + paramsRequestRef.call((detail: any) => { + exceptionHandler({ detail, model: paramsAppModel }); + }); + } + + analytics.pageView(ANALYTICS_EVENT_KEYS.params.pageView); + + const unListenHistory = history.listen(() => { + if (!!paramsData?.config) { + if ( + (paramsData.config.grouping !== getStateFromUrl('grouping') || + paramsData.config.chart !== getStateFromUrl('chart') || + paramsData.config.select !== getStateFromUrl('select')) && + history.location.pathname === `/${AppNameEnum.PARAMS}` + ) { + paramsAppModel.setDefaultAppConfigData(); + paramsAppModel.updateModelData(); + } + } + }); + return () => { + paramsAppModel.destroy(); + paramsRequestRef?.abort(); + unListenHistory(); + if (appRequestRef) { + appRequestRef.abort(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + + ); +} + +export default ParamsContainer; diff --git a/src/src/pages/Params/components/Controls/Controls.scss b/src/src/pages/Params/components/Controls/Controls.scss new file mode 100644 index 00000000..4e948b9e --- /dev/null +++ b/src/src/pages/Params/components/Controls/Controls.scss @@ -0,0 +1,54 @@ +@use 'src/styles/abstracts' as *; + +.Params__Controls__container { + padding: 0.75rem 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + overflow: auto; + + & > div { + margin-bottom: 0.375rem; + + &:last-child { + margin-bottom: 0; + } + } +} + +.Params__Controls__icon { + color: $pico-70; + font-size: 1.125rem; + + &.active { + color: $primary-color; + } +} + +.Params__Controls__anchor { + height: 2.25rem; + width: 2.25rem; + display: flex; + cursor: pointer; + position: relative; + align-items: center; + justify-content: center; + transition: background-color 0.18s ease-out; + border: 0.0625rem solid transparent; + border-radius: $border-radius-main; + + &.active { + background-color: $primary-color-10; + &.outlined { + border: $border-main-active; + } + } + + &:hover { + background-color: $pico-5; + .icon-arrow-left { + opacity: 1; + } + } +} diff --git a/src/src/pages/Params/components/Controls/Controls.tsx b/src/src/pages/Params/components/Controls/Controls.tsx new file mode 100644 index 00000000..014e4e2a --- /dev/null +++ b/src/src/pages/Params/components/Controls/Controls.tsx @@ -0,0 +1,107 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import TooltipContentPopover from 'components/TooltipContentPopover/TooltipContentPopover'; +import { Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import { IControlProps } from 'types/pages/params/components/Controls/Controls'; + +import { CurveEnum } from 'utils/d3'; + +import './Controls.scss'; + +function Controls( + props: IControlProps, +): React.FunctionComponentElement { + const tooltipChanged: boolean = React.useMemo(() => { + return ( + props.tooltip?.appearance !== + CONTROLS_DEFAULT_CONFIG.params.tooltip.appearance || + props.tooltip?.selectedFields?.length !== + CONTROLS_DEFAULT_CONFIG.params.tooltip.selectedFields.length + ); + }, [props.tooltip]); + return ( + +
+ +
+ +
+
+ +
+ +
+
+
+ + ( + +
+ {/*TODO need to change icon */} + +
+
+ )} + component={ + + } + /> +
+
+
+
+ ); +} + +export default Controls; diff --git a/src/src/pages/Params/components/ParamsTableGrid/ParamsTableGrid.tsx b/src/src/pages/Params/components/ParamsTableGrid/ParamsTableGrid.tsx new file mode 100644 index 00000000..60dae1e3 --- /dev/null +++ b/src/src/pages/Params/components/ParamsTableGrid/ParamsTableGrid.tsx @@ -0,0 +1,526 @@ +import _ from 'lodash-es'; +import * as React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import { Badge, Button, Icon, JsonViewPopover } from 'components/kit'; +import TableSortIcons from 'components/Table/TableSortIcons'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import RunNameColumn from 'components/Table/RunNameColumn'; +import GroupedColumnHeader from 'components/Table/GroupedColumnHeader'; +import AttachedTagsList from 'components/AttachedTagsList/AttachedTagsList'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import COLORS from 'config/colors/colors'; +import { TABLE_DEFAULT_CONFIG } from 'config/table/tableConfigs'; +import { MetricsValueKeyEnum } from 'config/enums/tableEnums'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { IOnGroupingSelectChangeParams } from 'types/services/models/metrics/metricsAppModel'; +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import alphabeticalSortComparator from 'utils/alphabeticalSortComparator'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import contextToString from 'utils/contextToString'; +import { formatValue } from 'utils/formatValue'; +import { SortActionTypes, SortField } from 'utils/getSortedFields'; +import getColumnOptions from 'utils/getColumnOptions'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import { getMetricLabel } from 'utils/app/getMetricLabel'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +function getParamsTableColumns( + sortOptions: IGroupingSelectOption[], + metricsColumns: any, + paramColumns: string[] = [], + groupFields: { [key: string]: unknown } | null, + order: { left: string[]; middle: string[]; right: string[] }, + hiddenColumns: string[], + metricsValueKey: MetricsValueKeyEnum = MetricsValueKeyEnum.LAST, + sortFields?: any[], + onSort?: ({ sortFields, order, index, actionType }: any) => void, + grouping?: { [key: string]: string[] }, + onGroupingToggle?: (params: IOnGroupingSelectChangeParams) => void, + appName?: AppNameEnum, +): ITableColumn[] { + let columns: ITableColumn[] = [ + { + key: 'experiment', + content: Name, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment') + ? 'left' + : order?.middle?.includes('experiment') + ? null + : order?.right?.includes('experiment') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + appName!, + 'run.props.experiment.name', + ), + }, + { + key: 'experiment_description', + content: Description, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment_description') + ? 'left' + : order?.middle?.includes('experiment_description') + ? null + : order?.right?.includes('experiment_description') + ? 'right' + : null, + }, + { + key: 'hash', + content: Hash, + topHeader: 'Run', + pin: order?.left?.includes('hash') + ? 'left' + : order?.middle?.includes('hash') + ? null + : order?.right?.includes('hash') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + appName!, + 'run.hash', + ), + }, + { + key: 'run', + content: Name, + topHeader: 'Run', + pin: order?.left?.includes('run') + ? 'left' + : order?.middle?.includes('run') + ? null + : order?.right?.includes('run') + ? 'right' + : 'left', + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + appName!, + 'run.props.name', + ), + }, + + { + key: 'description', + content: Description, + topHeader: 'Run', + pin: order?.left?.includes('description') + ? 'left' + : order?.middle?.includes('description') + ? null + : order?.right?.includes('description') + ? 'right' + : null, + }, + { + key: 'date', + content: Date, + topHeader: 'Run', + pin: order?.left?.includes('date') + ? 'left' + : order?.middle?.includes('date') + ? null + : order?.right?.includes('date') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + appName!, + 'run.props.experiment.name', + ), + }, + { + key: 'duration', + content: Duration, + topHeader: 'Run', + pin: order?.left?.includes('duration') + ? 'left' + : order?.right?.includes('duration') + ? 'right' + : null, + }, + { + key: 'tags', + content: Tags, + topHeader: 'Run', + pin: order?.left?.includes('tags') + ? 'left' + : order?.right?.includes('tags') + ? 'right' + : null, + }, + { + key: 'actions', + content: '', + topHeader: '', + pin: 'right', + }, + ].concat( + Object.keys(metricsColumns).reduce((acc: any, metricName: string) => { + const systemMetricsList: ITableColumn[] = []; + const isSystem = isSystemMetric(metricName); + const metricsList: ITableColumn[] = []; + Object.keys(metricsColumns[metricName]).forEach((metricContext) => { + const metricHash = getMetricHash(metricName, metricContext); + const metricLabel = getMetricLabel(metricName, metricContext); + + const sortValueKey = `metricsValues.${metricHash}.${metricsValueKey}`; + const sortItemIndex: number = + sortFields?.findIndex((value: SortField) => { + return value.value === sortValueKey; + }) ?? -1; + let column = { + key: metricHash, + label: metricLabel, + content: isSystem ? ( + + {formatSystemMetricName(metricName)} + {onSort && ( + + onSort({ + sortFields, + index: sortItemIndex, + field: + sortItemIndex === -1 + ? sortOptions.find( + (value) => value.value === sortValueKey, + ) + : (sortFields?.[sortItemIndex] as SortField), + actionType: + sortFields?.[sortItemIndex]?.order === 'desc' + ? SortActionTypes.DELETE + : SortActionTypes.ORDER_TABLE_TRIGGER, + }) + } + sort={ + !_.isNil(sortFields?.[sortItemIndex]) + ? sortFields?.[sortItemIndex]?.order + : null + } + /> + )} + + ) : ( +
+ + {onSort && ( + + onSort({ + sortFields, + index: sortItemIndex, + field: + sortItemIndex === -1 + ? sortOptions.find( + (value) => value.value === sortValueKey, + ) + : (sortFields?.[sortItemIndex] as SortField), + actionType: + sortFields?.[sortItemIndex]?.order === 'desc' + ? SortActionTypes.DELETE + : SortActionTypes.ORDER_TABLE_TRIGGER, + }) + } + sort={ + !_.isNil(sortFields?.[sortItemIndex]) + ? sortFields?.[sortItemIndex]?.order + : null + } + /> + )} +
+ ), + topHeader: isSystem ? 'System Metrics' : metricName, + pin: order?.left?.includes(metricHash) + ? 'left' + : order?.right?.includes(metricHash) + ? 'right' + : null, + }; + isSystem ? systemMetricsList.push(column) : metricsList.push(column); + }); + acc = [ + ...acc, + ...metricsList.sort(alphabeticalSortComparator({ orderBy: 'key' })), + ...systemMetricsList.sort( + alphabeticalSortComparator({ orderBy: 'key' }), + ), + ]; + return acc; + }, []), + paramColumns.map((param) => { + const paramKey = `run.params.${param}`; + const sortItemIndex: number = + sortFields?.findIndex((value: SortField) => value.value === paramKey) ?? + -1; + + return { + key: param, + label: param, + content: ( + + {param} + {onSort && ( + + onSort({ + sortFields, + index: sortItemIndex, + field: + sortItemIndex === -1 + ? sortOptions.find((value) => value.value === paramKey) + : sortFields?.[sortItemIndex], + actionType: + sortFields?.[sortItemIndex]?.order === 'desc' + ? SortActionTypes.DELETE + : SortActionTypes.ORDER_TABLE_TRIGGER, + }) + } + sort={ + !_.isNil(sortFields?.[sortItemIndex]) + ? sortFields?.[sortItemIndex].order + : null + } + /> + )} + + ), + topHeader: 'Run Params', + pin: order?.left?.includes(param) + ? 'left' + : order?.right?.includes(param) + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + appName!, + paramKey, + ), + }; + }), + ); + + columns = columns.map((col) => ({ + ...col, + isHidden: + !TABLE_DEFAULT_CONFIG.params.nonHidableColumns.has(col.key) && + hiddenColumns.includes(col.key), + })); + + const columnsOrder = order?.left.concat(order.middle).concat(order.right); + columns.sort((a, b) => { + if (a.key === '#') { + return -1; + } else if (a.key === 'actions') { + return 1; + } else if (b.key === 'actions') { + return -1; + } + if (!columnsOrder.includes(a.key) && !columnsOrder.includes(b.key)) { + return 0; + } else if (!columnsOrder.includes(a.key)) { + return 1; + } else if (!columnsOrder.includes(b.key)) { + return -1; + } + return columnsOrder.indexOf(a.key) - columnsOrder.indexOf(b.key); + }); + if (groupFields) { + columns = [ + { + key: '#', + content: ( + + # + + ), + topHeader: 'Grouping', + pin: 'left', + }, + { + key: 'groups', + content: ( +
+ {Object.keys(groupFields).map((field) => { + let name: string = field.replace('run.params.', ''); + name = name.replace( + 'run.props.experiment.name', + 'run.props.experiment', + ); + name = name.replace('run.props', 'run'); + return ( + +
{name}
+
+ ); + })} +
+ ), + pin: order?.left?.includes('groups') + ? 'left' + : order?.right?.includes('groups') + ? 'right' + : null, + topHeader: 'Group Config', + }, + ...columns, + ]; + } + return columns; +} + +const TagsColumn = (props: { + runHash: string; + tags: ITagInfo[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + headerRenderer: () => React.ReactNode; + addTagButtonSize: 'xxSmall' | 'xSmall'; +}) => { + return ; +}; + +function paramsTableRowRenderer( + rowData: any, + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void, + actions?: { [key: string]: (e: any) => void }, + groupHeaderRow = false, + columns: string[] = [], +) { + if (groupHeaderRow) { + const row: { [key: string]: any } = {}; + for (let i = 0; i < columns.length; i++) { + const col = columns[i]; + if (col === 'groups') { + row.groups = { + content: ( + +
+ {Object.keys(rowData[col]).map((item) => { + const value: string | { [key: string]: unknown } = + rowData[col][item]; + return _.isObject(value) ? ( + ( + + + {contextToString(value)} + + + )} + component={} + /> + ) : ( + +
{formatValue(value)}
+
+ ); + })} +
+
+ ), + }; + } else if (Array.isArray(rowData[col])) { + row[col] = { + content: ( + + + + ), + }; + } + } + return _.merge({}, rowData, row); + } else { + const row = { + experiment: { + content: ( + + ), + }, + run: { + content: ( +
+ + {isInfiniteLoading && ( +
+ +
+ )} + + + ); +} + +export default RunsTable; diff --git a/src/src/pages/Runs/components/RunsBar/RunsBar.tsx b/src/src/pages/Runs/components/RunsBar/RunsBar.tsx new file mode 100644 index 00000000..b51d4d90 --- /dev/null +++ b/src/src/pages/Runs/components/RunsBar/RunsBar.tsx @@ -0,0 +1,63 @@ +import React from 'react'; + +import { MenuItem } from '@material-ui/core'; + +import AppBar from 'components/AppBar/AppBar'; +import LiveUpdateSettings from 'components/LiveUpdateSettings/LiveUpdateSettings'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { Button, Icon } from 'components/kit'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; + +import pageTitlesEnum from 'config/pageTitles/pageTitles'; +import { DOCUMENTATIONS } from 'config/references'; + +import 'pages/Metrics/components/MetricsBar/MetricsBar.scss'; + +function RunsBar(props: { + enabled: boolean; + delay: number; + onLiveUpdateConfigChange: () => void; + disabled: boolean; +}): React.FunctionComponentElement { + return ( + + + +
+ + ( + + )} + component={ + + } + /> + +
+
+
+ ); +} + +export default React.memo(RunsBar); diff --git a/src/src/pages/Runs/components/RunsTableGrid/RunsTableGrid.tsx b/src/src/pages/Runs/components/RunsTableGrid/RunsTableGrid.tsx new file mode 100644 index 00000000..5f69822f --- /dev/null +++ b/src/src/pages/Runs/components/RunsTableGrid/RunsTableGrid.tsx @@ -0,0 +1,262 @@ +import * as React from 'react'; +import { merge } from 'lodash-es'; + +import { Badge } from 'components/kit'; +import RunNameColumn from 'components/Table/RunNameColumn'; +import GroupedColumnHeader from 'components/Table/GroupedColumnHeader'; +import AttachedTagsList from 'components/AttachedTagsList/AttachedTagsList'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import COLORS from 'config/colors/colors'; +import { TABLE_DEFAULT_CONFIG } from 'config/table/tableConfigs'; + +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import alphabeticalSortComparator from 'utils/alphabeticalSortComparator'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import { getMetricLabel } from 'utils/app/getMetricLabel'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +function getRunsTableColumns( + metricsColumns: any, + runColumns: string[] = [], + order: { left: string[]; middle: string[]; right: string[] }, + hiddenColumns: string[], +): ITableColumn[] { + let columns: ITableColumn[] = [ + { + key: 'experiment', + content: Name, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment') + ? 'left' + : order?.middle?.includes('experiment') + ? null + : order?.right?.includes('experiment') + ? 'right' + : null, + }, + { + key: 'experiment_description', + content: Description, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment_description') + ? 'left' + : order?.middle?.includes('experiment_description') + ? null + : order?.right?.includes('experiment_description') + ? 'right' + : null, + }, + { + key: 'hash', + content: Hash, + topHeader: 'Run', + pin: order?.left?.includes('hash') + ? 'left' + : order?.middle?.includes('hash') + ? null + : order?.right?.includes('hash') + ? 'right' + : null, + }, + { + key: 'run', + content: Name, + topHeader: 'Run', + pin: order?.left?.includes('run') + ? 'left' + : order?.middle?.includes('run') + ? null + : order?.right?.includes('run') + ? 'right' + : 'left', + }, + { + key: 'description', + content: Description, + topHeader: 'Run', + pin: order?.left?.includes('description') + ? 'left' + : order?.middle?.includes('description') + ? null + : order?.right?.includes('description') + ? 'right' + : null, + }, + { + key: 'date', + content: Date, + topHeader: 'Run', + pin: order?.left?.includes('date') + ? 'left' + : order?.middle?.includes('date') + ? null + : order?.right?.includes('date') + ? 'right' + : null, + }, + { + key: 'duration', + content: Duration, + topHeader: 'Run', + pin: order?.left?.includes('date') + ? 'left' + : order?.right?.includes('date') + ? 'right' + : null, + }, + { + key: 'tags', + content: Tags, + topHeader: 'Run', + pin: order?.left?.includes('tags') + ? 'left' + : order?.right?.includes('tags') + ? 'right' + : null, + }, + ].concat( + Object.keys(metricsColumns).reduce((acc: any, metricName: string) => { + const systemMetricsList: ITableColumn[] = []; + const isSystem = isSystemMetric(metricName); + const metricsList: ITableColumn[] = []; + Object.keys(metricsColumns[metricName]).forEach((metricContext) => { + const metricHash = getMetricHash(metricName, metricContext); + const metricLabel = getMetricLabel(metricName, metricContext); + + let column = { + key: metricHash, + label: metricLabel, + content: isSystem ? ( + {formatSystemMetricName(metricName)} + ) : ( + + ), + topHeader: isSystem ? 'System Metrics' : metricName, + pin: order?.left?.includes(metricHash) + ? 'left' + : order?.right?.includes(metricHash) + ? 'right' + : null, + }; + isSystem ? systemMetricsList.push(column) : metricsList.push(column); + }); + acc = [ + ...acc, + ...metricsList.sort(alphabeticalSortComparator({ orderBy: 'key' })), + ...systemMetricsList.sort( + alphabeticalSortComparator({ orderBy: 'key' }), + ), + ]; + return acc; + }, []), + runColumns.map((param) => ({ + key: param, + content: {param}, + topHeader: 'Run Params', + pin: order?.left?.includes(param) + ? 'left' + : order?.right?.includes(param) + ? 'right' + : null, + })), + ); + + columns = columns.map((col) => ({ + ...col, + isHidden: + !TABLE_DEFAULT_CONFIG.runs.nonHidableColumns.has(col.key) && + hiddenColumns.includes(col.key), + })); + + const columnsOrder = order?.left.concat(order.middle).concat(order.right); + columns.sort((a, b) => { + if (!columnsOrder.includes(a.key) && !columnsOrder.includes(b.key)) { + return 0; + } else if (!columnsOrder.includes(a.key)) { + return 1; + } else if (!columnsOrder.includes(b.key)) { + return -1; + } + return columnsOrder.indexOf(a.key) - columnsOrder.indexOf(b.key); + }); + + return columns; +} + +const TagsColumn = (props: { + runHash: string; + tags: ITagInfo[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + headerRenderer: () => React.ReactNode; + addTagButtonSize: 'xxSmall' | 'xSmall'; +}) => { + return ; +}; + +function runsTableRowRenderer( + rowData: any, + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void, + groupHeaderRow = false, + columns: string[] = [], +) { + if (groupHeaderRow) { + const row: { [key: string]: any } = {}; + for (let i = 0; i < columns.length; i++) { + const col = columns[i]; + if (Array.isArray(rowData[col])) { + row[col] = { + content: , + }; + } + } + + return merge({}, rowData, row); + } else { + const row = { + experiment: { + content: ( + + ), + }, + run: { + content: ( + + ), + }, + tags: { + content: ( + <>} + addTagButtonSize='xxSmall' + /> + ), + }, + actions: { + content: null, + }, + }; + + return merge({}, rowData, row); + } +} + +export { getRunsTableColumns, runsTableRowRenderer }; diff --git a/src/src/pages/Runs/components/SearchBar/SearchBar.scss b/src/src/pages/Runs/components/SearchBar/SearchBar.scss new file mode 100644 index 00000000..70863ec7 --- /dev/null +++ b/src/src/pages/Runs/components/SearchBar/SearchBar.scss @@ -0,0 +1,12 @@ +@use 'src/styles/abstracts' as *; + +.Runs_Search_Bar { + display: flex; + border-bottom: $border-main; + padding: 1rem 1.5rem; + align-items: center; + + form { + width: 100%; + } +} diff --git a/src/src/pages/Runs/components/SearchBar/SearchBar.tsx b/src/src/pages/Runs/components/SearchBar/SearchBar.tsx new file mode 100644 index 00000000..38981c58 --- /dev/null +++ b/src/src/pages/Runs/components/SearchBar/SearchBar.tsx @@ -0,0 +1,94 @@ +import React from 'react'; + +import { Divider } from '@material-ui/core'; + +import { Button, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import AutocompleteInput from 'components/AutocompleteInput'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import runAppModel from 'services/models/runs/runsAppModel'; +import { trackEvent } from 'services/analytics'; + +import exceptionHandler from 'utils/app/exceptionHandler'; + +import './SearchBar.scss'; + +function SearchBar({ + selectFormData, + isRunsDataLoading, + searchValue, + onSearchInputChange, + isDisabled, +}: any) { + const searchRunsRef = React.useRef(null); + const autocompleteRef: any = React.useRef>(null); + React.useEffect(() => { + return () => { + searchRunsRef.current?.abort(); + }; + }, []); + + const handleRunSearch = React.useCallback(() => { + if (isRunsDataLoading) { + return; + } + const query = autocompleteRef?.current?.getValue(); + onSearchInputChange(query ?? ''); + searchRunsRef.current = runAppModel.getRunsData( + true, + true, + true, + query ?? '', + ); + searchRunsRef.current + .call((detail: any) => { + exceptionHandler({ detail, model: runAppModel }); + }) + .catch(); + trackEvent(ANALYTICS_EVENT_KEYS.runs.searchClick); + }, [isRunsDataLoading, onSearchInputChange]); + + function handleRequestAbort(e: React.SyntheticEvent): void { + e.preventDefault(); + if (!isRunsDataLoading) { + return; + } + searchRunsRef.current?.abort(); + runAppModel.abortRequest(); + } + return ( + +
+
+ + + + +
+
+ ); +} + +export default SearchBar; diff --git a/src/src/pages/Scatters/Scatters.scss b/src/src/pages/Scatters/Scatters.scss new file mode 100644 index 00000000..8726991f --- /dev/null +++ b/src/src/pages/Scatters/Scatters.scss @@ -0,0 +1,94 @@ +@use 'src/styles/abstracts' as *; + +.Scatters__section { + height: 100vh; + overflow: hidden; + .Scatters__loader { + flex-direction: column; + justify-content: space-between; + } + .Scatters__visualization { + display: flex; + position: relative; + flex-direction: column; + flex: 1 100%; + max-height: calc(100% - #{toRem(136px)}); + .ProgressBar { + padding-bottom: toRem(136px); + } + } +} + +.Scatters__container { + background-color: #ffffff; + min-width: 50rem; + .Scatters__fullHeight { + height: 100%; + } + .Scatters__section__appBarContainer { + display: flex; + flex-direction: column; + } + .Scatters__chart__container { + flex: 0.5 1 0; + min-height: 11.25rem; + &.fullHeight { + flex: 1 100% !important; + } + &.hide { + display: none; + } + } + .Scatters__ResizePanel { + &__hide { + display: none; + } + } + .Scatters__table__container { + flex: 0.5 1 0; + min-height: 11rem; + &.fullHeight { + flex: 1 100% !important; + } + &.hide { + display: none; + } + } +} + +.Scatters__SelectForm__Grouping__container { + display: flex; + border-bottom: $border-main; + min-height: 6rem; + max-height: 6rem; +} + +.Scatters__table__aggregationColumn__cell { + display: flex; + flex: 1; + + span { + display: inline-block; + width: toRem(120px); + min-width: 120px; + justify-content: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + &:nth-of-type(2) { + padding: 0 0.5rem; + margin: 0 0.5rem; + border-left: $border-separator; + border-right: $border-separator; + } + } +} + +.Table__cell--header { + .Scatters__table__aggregationColumn__cell { + span:last-of-type { + width: calc(120px - 1rem); + } + } +} diff --git a/src/src/pages/Scatters/Scatters.tsx b/src/src/pages/Scatters/Scatters.tsx new file mode 100644 index 00000000..d3e77e78 --- /dev/null +++ b/src/src/pages/Scatters/Scatters.tsx @@ -0,0 +1,253 @@ +import React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import Table from 'components/Table/Table'; +import ChartPanel from 'components/ChartPanel/ChartPanel'; +import NotificationContainer from 'components/NotificationContainer/NotificationContainer'; +import IllustrationBlock from 'components/IllustrationBlock/IllustrationBlock'; +import ResizePanel from 'components/ResizePanel/ResizePanel'; +import Grouping from 'components/Grouping/Grouping'; +import ProgressBar from 'components/ProgressBar/ProgressBar'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { + RowHeightSize, + VisualizationElementEnum, +} from 'config/table/tableConfigs'; +import GroupingPopovers, { + GroupNameEnum, +} from 'config/grouping/GroupingPopovers'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { + IllustrationsEnum, + Request_Illustrations, +} from 'config/illustrationConfig/illustrationConfig'; + +import AppBar from 'pages/Metrics/components/MetricsBar/MetricsBar'; +import Controls from 'pages/Scatters/components/Controls/Controls'; +import SelectForm from 'pages/Scatters/components/SelectForm/SelectForm'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { IScattersProps } from 'types/pages/scatters/Scatters'; + +import { ChartTypeEnum } from 'utils/d3'; + +import './Scatters.scss'; + +function Scatters( + props: IScattersProps, +): React.FunctionComponentElement { + const [isProgressBarVisible, setIsProgressBarVisible] = + React.useState(false); + const chartProps: any[] = React.useMemo(() => { + return (props.scatterPlotData || []).map((chartData: any) => ({ + chartTitle: props.chartTitleData[chartData.data[0]?.chartIndex], + trendlineOptions: props.trendlineOptions, + })); + }, [props.scatterPlotData, props.chartTitleData, props.trendlineOptions]); + + return ( + +
+
+
+ +
+ + + p.groupName === GroupNameEnum.COLOR || + p.groupName === GroupNameEnum.CHART, + )} + isDisabled={isProgressBarVisible} + groupingData={props.groupingData} + groupingSelectOptions={props.groupingSelectOptions} + onGroupingSelectChange={props.onGroupingSelectChange} + onGroupingModeChange={props.onGroupingModeChange} + onGroupingPaletteChange={props.onGroupingPaletteChange} + onGroupingReset={props.onGroupingReset} + onGroupingApplyChange={props.onGroupingApplyChange} + onGroupingPersistenceChange={props.onGroupingPersistenceChange} + onShuffleChange={props.onShuffleChange} + /> +
+
+ + {_.isEmpty(props.tableData) && + _.isEmpty(props.scatterPlotData) ? ( + + ) : ( + <> +
+ {props.resizeMode === ResizeModeEnum.MaxHeight ? null : ( + + } + /> + )} +
+ +
+ {props.resizeMode === ResizeModeEnum.Hide ? null : ( + +
+ + )} + + + )} + + + + {props.notifyData?.length > 0 && ( + + )} + + + ); +} + +export default React.memo(Scatters); diff --git a/src/src/pages/Scatters/ScattersContainer.tsx b/src/src/pages/Scatters/ScattersContainer.tsx new file mode 100644 index 00000000..8e62270f --- /dev/null +++ b/src/src/pages/Scatters/ScattersContainer.tsx @@ -0,0 +1,206 @@ +import React from 'react'; +import { useHistory, useRouteMatch } from 'react-router-dom'; +import { useModel, usePanelResize, useResizeObserver } from 'hooks'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import scattersAppModel from 'services/models/scatters/scattersAppModel'; +import projectsModel from 'services/models/projects/projectsModel'; +import * as analytics from 'services/analytics'; +import { AppNameEnum } from 'services/models/explorer'; + +import { ITableRef } from 'types/components/Table/Table'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { IProjectsModelState } from 'types/services/models/projects/projectsModel'; +import { IScatterAppModelState } from 'types/services/models/scatter/scatterAppModel'; +import { IApiRequest } from 'types/services/services'; + +import setComponentRefs from 'utils/app/setComponentRefs'; +import getStateFromUrl from 'utils/getStateFromUrl'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import manageSystemMetricColumns from 'utils/app/manageSystemMetricColumns'; + +import Scatters from './Scatters'; + +function ScattersContainer(): React.FunctionComponentElement { + const tableRef = React.useRef(null); + const chartPanelRef = React.useRef(null); + const tableElemRef = React.useRef(null); + const chartElemRef = React.useRef(null); + const wrapperElemRef = React.useRef(null); + const resizeElemRef = React.useRef(null); + const route = useRouteMatch(); + const history = useHistory(); + const scattersData = + useModel>(scattersAppModel); + const [chartPanelOffsetHeight, setChartPanelOffsetHeight] = React.useState( + chartElemRef?.current?.offsetWidth, + ); + const projectsData = useModel>(projectsModel); + const panelResizing = usePanelResize( + wrapperElemRef, + chartElemRef, + tableElemRef, + resizeElemRef, + scattersData?.config?.table, + scattersAppModel.onTableResizeEnd, + ); + + useResizeObserver(() => { + if (chartElemRef?.current?.offsetHeight !== chartPanelOffsetHeight) { + setChartPanelOffsetHeight(chartElemRef?.current?.offsetHeight); + } + }, chartElemRef); + + React.useEffect(() => { + if (tableRef.current && chartPanelRef.current) { + setComponentRefs({ + model: scattersAppModel, + refElement: { + tableRef, + chartPanelRef, + }, + }); + } + if (scattersData?.rawData?.length > 0) { + manageSystemMetricColumns(scattersAppModel); + } + }, [scattersData?.rawData]); + + React.useEffect(() => { + scattersAppModel.initialize(route.params.appId); + let appRequestRef: IApiRequest; + if (route.params.appId) { + appRequestRef = scattersAppModel.getAppConfigData(route.params.appId); + appRequestRef + .call((detail: any) => { + exceptionHandler({ detail, model: scattersAppModel }); + }) + .then(() => { + scattersAppModel.setDefaultAppConfigData(false); + scattersAppModel.getScattersData().call((detail: any) => { + exceptionHandler({ detail, model: scattersAppModel }); + }); + }); + } else { + scattersAppModel.setDefaultAppConfigData(); + } + const scattersRequestRef = scattersAppModel.getScattersData(); + scattersRequestRef.call((detail: any) => { + exceptionHandler({ detail, model: scattersAppModel }); + }); + analytics.pageView(ANALYTICS_EVENT_KEYS.scatters.pageView); + + const unListenHistory = history.listen(() => { + if (!!scattersData?.config) { + if ( + (scattersData.config.grouping !== getStateFromUrl('grouping') || + scattersData.config.chart !== getStateFromUrl('chart') || + scattersData.config.select !== getStateFromUrl('select')) && + history.location.pathname === `/${AppNameEnum.SCATTERS}` + ) { + scattersAppModel.setDefaultAppConfigData(); + scattersAppModel.updateModelData(); + } + } + }); + return () => { + scattersAppModel.destroy(); + scattersRequestRef.abort(); + unListenHistory(); + if (appRequestRef) { + appRequestRef.abort(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + + + + ); +} + +export default ScattersContainer; diff --git a/src/src/pages/Scatters/components/Controls/Controls.scss b/src/src/pages/Scatters/components/Controls/Controls.scss new file mode 100644 index 00000000..0759858f --- /dev/null +++ b/src/src/pages/Scatters/components/Controls/Controls.scss @@ -0,0 +1,86 @@ +@use 'src/styles/abstracts' as *; + +.Controls__container { + padding: 0.75rem 0; + display: flex; + flex-direction: column; + align-items: center; + overflow: auto; + + & > div { + margin-bottom: 0.375rem; + + &:last-child { + margin-bottom: 0; + } + } +} + +.Controls__icon { + color: $pico-70; + font-size: 1.125rem; + &.active { + color: $primary-color; + } +} + +.Controls__anchor { + height: 2.25rem; + width: 2.25rem; + display: flex; + cursor: pointer; + position: relative; + align-items: center; + justify-content: center; + transition: background-color 0.18s ease-out; + border: 0.0625rem solid transparent; + border-radius: $border-radius-main; + + &.active { + background-color: $primary-color-10; + + &.outlined { + border: $border-main-active; + } + } + + &.disabled { + cursor: initial; + i { + color: $pico-50; + } + &:hover { + background-color: transparent; + } + } + + &:hover { + background-color: $pico-5; + + .icon-arrow-left { + opacity: 1; + } + } +} + +.Controls__anchor__arrow { + width: 0.6875rem; + height: 100%; + position: absolute; + left: -0.75rem; + display: flex; + align-items: center; + justify-content: center; + + .icon-arrow-left { + transition: all 0.18s ease-out; + color: $pico-70; + } +} + +.Controls__anchor__arrow--opened { + .icon-arrow-left { + transform: rotate(180deg); + color: $primary-color; + } +} diff --git a/src/src/pages/Scatters/components/Controls/Controls.tsx b/src/src/pages/Scatters/components/Controls/Controls.tsx new file mode 100644 index 00000000..5d8f55f6 --- /dev/null +++ b/src/src/pages/Scatters/components/Controls/Controls.tsx @@ -0,0 +1,154 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import TooltipContentPopover from 'components/TooltipContentPopover/TooltipContentPopover'; +import { Icon } from 'components/kit'; +import TrendlineOptionsPopover from 'components/TrendlineOptionsPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import ExportPreview from 'components/ExportPreview'; +import ChartGrid from 'components/ChartPanel/ChartGrid'; + +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import { IControlProps } from 'types/pages/scatters/components/Controls/Controls'; + +import './Controls.scss'; + +function Controls( + props: IControlProps, +): React.FunctionComponentElement { + const [openExportModal, setOpenExportModal] = React.useState(false); + + const tooltipChanged: boolean = React.useMemo(() => { + return ( + props.tooltip?.appearance !== + CONTROLS_DEFAULT_CONFIG.scatters.tooltip.appearance || + props.tooltip?.selectedFields?.length !== + CONTROLS_DEFAULT_CONFIG.scatters.tooltip.selectedFields.length + ); + }, [props.tooltip]); + + const onToggleExportPreview = React.useCallback((): void => { + setOpenExportModal((state) => !state); + }, [setOpenExportModal]); + + return ( + +
+ +
+ ( + +
{ + props.onChangeTrendlineOptions({ + isApplied: !props.trendlineOptions?.isApplied, + }); + }} + > + + + + +
+
+ )} + component={ + + } + /> +
+
+ +
+ ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+ + {/* TODO add ability to open modals in ControlPopover component and change the name of the ControlPopover to more general*/} + +
+ +
+
+ {openExportModal && ( + + + + )} +
+
+
+ ); +} + +export default Controls; diff --git a/src/src/pages/Scatters/components/SelectForm/SelectForm.scss b/src/src/pages/Scatters/components/SelectForm/SelectForm.scss new file mode 100644 index 00000000..d5a1f7db --- /dev/null +++ b/src/src/pages/Scatters/components/SelectForm/SelectForm.scss @@ -0,0 +1,127 @@ +@use 'src/styles/abstracts' as *; + +.Scatters__SelectForm { + flex: 1; + padding: 0.725rem 1.5em; + display: flex; + flex-direction: column; + justify-content: space-between; + + &__container__options { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + /* TODO [GA]: Override MUI default styles in a nice way */ + .MuiBox-root { + justify-content: flex-start; + } + } + + &__container__search { + width: 103px; + display: flex; + justify-content: space-between; + flex-direction: column; + } + + &__Popper { + border: $border-main; + width: 40%; + border-radius: $radius-main; + z-index: 1; + color: #586069; + background-color: #ffffff; + .MuiAutocomplete-paper { + box-shadow: unset; + margin: unset; + } + } + + &__option__select { + width: 100%; + + input { + font-family: monospace; + padding: 0.5rem; + font-size: $text-md; + border-bottom: $border-main; + } + } + + &__TextField { + position: relative; + } + + &__textarea { + flex: 1; + .MuiOutlinedInput-multiline.MuiOutlinedInput-marginDense { + padding-top: toRem(7.5px); + padding-bottom: toRem(7.5px); + } + textarea { + font-family: monospace; + } + } + + &__search__button { + width: 100%; + } + + &__search__actions { + display: flex; + justify-content: space-between; + + button { + border: $border-main; + &:nth-child(2) { + margin: 0 0.25rem; + } + &.active { + border: $border-main-active; + background-color: $primary-color-5; + } + } + } + + &__clearAll { + height: 24px; + width: 24px; + background: #e8f1fc; + border-radius: 6px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + position: relative; + &.disabled { + opacity: 0.5; + } + &:after { + content: ''; + position: absolute; + width: 20px; + height: 34px; + background: rgba(255, 255, 255, 0.5); + background: linear-gradient( + 90deg, + rgba(255, 255, 255, 0) 0%, + rgba(255, 255, 255, 1) 92% + ); + left: -20px; + top: -5px; + border-radius: 0; + color: white; + pointer-events: none; + } + + i { + color: #1473e6; + font-size: 10px; + } + } + + .Dropdown { + flex: 1; + } +} diff --git a/src/src/pages/Scatters/components/SelectForm/SelectForm.tsx b/src/src/pages/Scatters/components/SelectForm/SelectForm.tsx new file mode 100644 index 00000000..2f4053de --- /dev/null +++ b/src/src/pages/Scatters/components/SelectForm/SelectForm.tsx @@ -0,0 +1,196 @@ +import React from 'react'; + +import { Box, Divider } from '@material-ui/core'; + +import { Button, Dropdown, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import AutocompleteInput from 'components/AutocompleteInput'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import scattersAppModel from 'services/models/scatters/scattersAppModel'; +import { trackEvent } from 'services/analytics'; + +import { ISelectFormProps } from 'types/pages/scatters/components/SelectForm/SelectForm'; + +import exceptionHandler from 'utils/app/exceptionHandler'; + +import './SelectForm.scss'; + +function SelectForm({ + requestIsPending, + isDisabled = false, + selectedOptionsData, + selectFormData, + onSelectOptionsChange, + onSelectRunQueryChange, +}: ISelectFormProps): React.FunctionComponentElement { + const [open, setOpen] = React.useState({ + x: false, + y: false, + }); + const searchRef = React.useRef(null); + const autocompleteRef: any = React.useRef>(null); + + React.useEffect(() => { + return () => { + searchRef.current?.abort(); + }; + }, []); + + function handleParamsSearch() { + if (requestIsPending) { + return; + } + let query = autocompleteRef?.current?.getValue(); + onSelectRunQueryChange(query ?? ''); + searchRef.current = scattersAppModel.getScattersData(true, query ?? ''); + searchRef.current.call((detail: any) => { + exceptionHandler({ detail, model: scattersAppModel }); + }); + trackEvent(ANALYTICS_EVENT_KEYS.scatters.searchClick); + } + + function handleRequestAbort(e: React.SyntheticEvent): void { + e.preventDefault(); + if (!requestIsPending) { + return; + } + searchRef.current?.abort(); + scattersAppModel.abortRequest(); + } + + const dropDownOptions: { value: string; label: string }[] = + React.useMemo(() => { + let data: { value: string; label: string }[] = []; + if (selectFormData.options) { + for (let option of selectFormData.options) { + data.push({ value: option.key, label: option.label }); + } + } + return data; + }, [selectFormData.options]); + + function onChange( + type: 'x' | 'y', + option: { value: string; label: string } | null, + ): void { + if (option) { + const selectedOptions = selectedOptionsData?.options; + if (type === 'y') { + onSelectOptionsChange([ + selectFormData.options.find((o) => o.key === option.value), + selectedOptions.length === 2 ? selectedOptions[1] : null, + ]); + } else if (type === 'x') { + onSelectOptionsChange([ + selectedOptions[0] || null, + selectFormData.options.find((o) => o.key === option.value), + ]); + } + } + } + + return ( + +
+ + +
+ + + + onChange('x', option)} + value={selectedOptionsData?.options[1]?.key || null} + options={dropDownOptions} + onMenuOpen={() => setOpen({ y: false, x: true })} + onMenuClose={() => setOpen({ y: false, x: false })} + open={open.x} + withPortal + label='X axis' + icon={{ name: 'x-axis' }} + isDisabled={isDisabled} + /> + + + + onChange('y', option)} + value={selectedOptionsData?.options[0]?.key || null} + options={dropDownOptions} + onMenuOpen={() => setOpen({ y: true, x: false })} + onMenuClose={() => setOpen({ y: false, x: false })} + open={open.y} + withPortal + label='Y axis' + icon={{ name: 'y-axis' }} + isDisabled={isDisabled} + /> + + + +
+
+ +
+ +
+
+ +
+ +
+
+
+
+ ); +} + +export default React.memo(SelectForm); diff --git a/src/src/pages/Tags/TagDelete.tsx b/src/src/pages/Tags/TagDelete.tsx new file mode 100644 index 00000000..5b5282ff --- /dev/null +++ b/src/src/pages/Tags/TagDelete.tsx @@ -0,0 +1,106 @@ +import React, { memo } from 'react'; +import * as yup from 'yup'; +import { isEmpty, noop } from 'lodash-es'; +import { useFormik } from 'formik'; + +import { TextField } from '@material-ui/core'; + +import ConfirmModal from 'components/ConfirmModal/ConfirmModal'; +import { Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import tagsAppModel from 'services/models/tags/tagsAppModel'; + +import './Tags.scss'; + +function TagDelete({ + tagInfo, + tagHash, + onDeleteModalToggle, + onTagDetailOverlayToggle, + isTagDetailOverLayOpened, + modalIsOpen, +}: any): React.FunctionComponentElement { + const formik = useFormik({ + initialValues: { name: '' }, + onSubmit: noop, + validationSchema: yup.object({ + name: yup.string().test('name', 'Name does not match', function (name) { + return name === tagInfo.name; + }), + }), + }); + const { + values, + errors, + touched, + setFieldValue, + setFieldTouched, + submitForm, + validateForm, + } = formik; + const { name } = values; + + function onChange(e: React.ChangeEvent) { + setFieldValue('name', e?.target?.value, true).then(() => { + setFieldTouched('name', true); + }); + } + + function onTagHide() { + submitForm().then(() => + validateForm(values).then((errors) => { + if (isEmpty(errors)) { + tagsAppModel.deleteTag(tagHash).then(() => { + tagsAppModel.getTagsData().call(); + isTagDetailOverLayOpened && onTagDetailOverlayToggle(); + onCancel(); + }); + } + }), + ); + } + + function onCancel(): void { + setFieldValue('name', ''); + setFieldTouched('name', false); + onDeleteModalToggle(); + } + + return ( + + } + title='Delete tag' + statusType='error' + confirmBtnText='Delete' + > + + {`Please type "${tagInfo?.name}" to confirm:`} + + + + + ); +} + +export default memo(TagDelete); diff --git a/src/src/pages/Tags/TagDetail.tsx b/src/src/pages/Tags/TagDetail.tsx new file mode 100644 index 00000000..ffc4251f --- /dev/null +++ b/src/src/pages/Tags/TagDetail.tsx @@ -0,0 +1,92 @@ +import React, { memo, useEffect } from 'react'; +import { isEmpty } from 'lodash-es'; + +import BusyLoaderWrapper from 'components/BusyLoaderWrapper/BusyLoaderWrapper'; +import IllustrationBlock from 'components/IllustrationBlock/IllustrationBlock'; +import { Badge, Button, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import tagsAppModel from 'services/models/tags/tagsAppModel'; + +import { ITagDetailProps } from 'types/pages/tags/Tags'; + +import TagRunsTable from './TagRunsTable'; + +import './Tags.scss'; + +function TagDetail({ + id, + onSoftDeleteModalToggle, + onUpdateModalToggle, + onDeleteModalToggle, + isTagInfoDataLoading, + tagInfo, + isRunsDataLoading, + tagRuns, +}: ITagDetailProps): React.FunctionComponentElement { + useEffect(() => { + const tagRequestRef = tagsAppModel.getTagById(id); + const tagRunsRequestRef = tagsAppModel.getTagRuns(id); + tagRunsRequestRef.call(); + tagRequestRef.call(); + return () => { + tagRunsRequestRef.abort(); + tagRequestRef.abort(); + }; + }, [id]); + + return ( + +
+
+ + {tagInfo && ( + + )} + +
+ {!tagInfo?.archived && ( + + )} + {tagInfo?.archived ? ( + + ) : ( + + )} + +
+
+ + + {!isEmpty(tagRuns) ? ( + + ) : ( + + )} + +
+
+ ); +} + +export default memo(TagDetail); diff --git a/src/src/pages/Tags/TagRunsTable.tsx b/src/src/pages/Tags/TagRunsTable.tsx new file mode 100644 index 00000000..943dc1bf --- /dev/null +++ b/src/src/pages/Tags/TagRunsTable.tsx @@ -0,0 +1,120 @@ +import React, { memo, useEffect, useRef } from 'react'; +import { NavLink } from 'react-router-dom'; +import moment from 'moment'; +import _ from 'lodash-es'; + +import { Tooltip } from '@material-ui/core'; + +import Table from 'components/Table/Table'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import StatusLabel from 'components/StatusLabel'; + +import { TABLE_DATE_FORMAT } from 'config/dates/dates'; + +import { ITagRun } from 'types/pages/tags/Tags'; + +import { processDurationTime } from 'utils/processDurationTime'; + +function TagRunsTable({ + runsList, +}: { + runsList: ITagRun[]; +}): React.FunctionComponentElement { + const tableRef = useRef({}); + const tableColumns = [ + { + dataKey: 'name', + key: 'name', + title: 'Name', + width: 0, + flexGrow: 1, + cellRenderer: function cellRenderer({ + cellData, + }: { + cellData: { name: string; id: string; active: boolean }; + }) { + return ( + <> + +
+ +
+
+ +
+ +

{cellData.name}

+
+
+
+ + ); + }, + }, + { + dataKey: 'date', + key: 'date', + title: 'Date', + width: 200, + cellRenderer: function cellRenderer({ cellData }: { cellData: string }) { + return

{cellData}

; + }, + }, + { + dataKey: 'duration', + key: 'duration', + title: 'Duration', + width: 200, + cellRenderer: function cellRenderer({ cellData }: { cellData: string }) { + return

{cellData}

; + }, + }, + ]; + + useEffect(() => { + if (runsList) { + tableRef?.current?.updateData({ + // eslint-disable-next-line react/prop-types + newData: runsList.map((run: ITagRun) => ({ + name: { + name: run.name, + id: run.run_id, + active: _.isNil(run.end_time), + }, + date: moment(run.creation_time * 1000).format(TABLE_DATE_FORMAT), + duration: processDurationTime( + run.creation_time * 1000, + run.end_time ? run.end_time * 1000 : Date.now(), + ), + key: run.run_id, + })), + newColumns: tableColumns, + }); + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [runsList]); + + return ( + +
+
+ + + ); +} + +export default memo(TagRunsTable); diff --git a/src/src/pages/Tags/TagSoftDelete.tsx b/src/src/pages/Tags/TagSoftDelete.tsx new file mode 100644 index 00000000..10ed8bb1 --- /dev/null +++ b/src/src/pages/Tags/TagSoftDelete.tsx @@ -0,0 +1,64 @@ +import React, { memo, useRef } from 'react'; + +import ConfirmModal from 'components/ConfirmModal/ConfirmModal'; +import { Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import tagsAppModel from 'services/models/tags/tagsAppModel'; + +import { ITagSoftDeleteProps } from 'types/pages/tags/Tags'; + +import './Tags.scss'; + +function TagSoftDelete({ + tagInfo, + tagHash, + onSoftDeleteModalToggle, + onTagDetailOverlayToggle, + isTagDetailOverLayOpened, + modalIsOpen, +}: ITagSoftDeleteProps): React.FunctionComponentElement { + const archivedRef = useRef({ archived: tagInfo?.archived }); + + function onTagHide() { + tagsAppModel.archiveTag(tagHash, !tagInfo?.archived).then(() => { + tagsAppModel.getTagsData().call(); + onSoftDeleteModalToggle(); + isTagDetailOverLayOpened && onTagDetailOverlayToggle(); + }); + } + + function onTagShow() { + tagsAppModel.archiveTag(tagHash, !tagInfo?.archived).then(() => { + tagsAppModel.getTagsData().call(); + onSoftDeleteModalToggle(); + isTagDetailOverLayOpened && onTagDetailOverlayToggle(); + }); + } + + return ( + + + } + title='Hide tag' + confirmBtnText={archivedRef.current?.archived ? 'Bring back' : 'Hide'} + /> + + ); +} + +export default memo(TagSoftDelete); diff --git a/src/src/pages/Tags/Tags.scss b/src/src/pages/Tags/Tags.scss new file mode 100644 index 00000000..3b47038f --- /dev/null +++ b/src/src/pages/Tags/Tags.scss @@ -0,0 +1,374 @@ +@use 'src/styles/abstracts' as *; + +.Tags { + height: 100vh; + overflow: hidden; + &__tabPanel { + height: calc(100% - 50px); + position: relative; + padding-bottom: 1.5rem; + & > div { + height: 100%; + position: relative; + } + } + &__tabsContainer { + border-radius: 0; + padding-left: 1.25rem; + box-shadow: none; + border: $border-grey; + &__tabs { + .MuiTab-textColorInherit { + opacity: 1; + font-weight: $font-500; + font-size: $text-md; + text-transform: none; + &.MuiInputBase-input { + font-weight: $font-600; + } + } + .Mui-selected { + font-weight: $font-600; + color: $pico; + } + } + .PrivateTabIndicator-root-5 { + height: 0.1875rem; + } + } + &__TagList { + position: relative; + height: 100%; + border-left: $border-grey; + border-right: $border-grey; + box-shadow: 0 toRem(1px) toRem(1px) $cuddle-50; + border-radius: 0 0 toRem(6px) toRem(6px); + .BaseTable { + &__body { + & > div { + width: 100% !important; + .BaseTable__row { + width: 100% !important; + } + } + } + &__row { + &-cell { + border-right: unset; + } + } + &__header-cell { + border-right: unset; + } + } + &__tagListBusyLoader { + padding-top: 100px; + } + &__header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.25rem; + background: #ffffff; + border-bottom: $border-grey; + .MuiInputBase-root { + height: 2rem; + padding-left: 0.8125rem; + border-radius: $border-radius-main; + i { + padding-right: 0.5625rem; + } + .MuiInputBase-input { + font-weight: $font-500; + font-size: $text-md; + color: #414b6d; + &::placeholder { + font-weight: $font-500; + font-size: $text-md; + color: #606986; + opacity: 1; + } + } + } + &__createButton { + text-transform: none; + width: 126px; + padding: 4px 10px 4px 13px; + i { + padding-right: 0.5rem; + } + .MuiButton-label { + font-weight: $font-500; + font-size: $text-md; + justify-content: flex-start; + } + } + } + &__tagListBox { + height: calc(100vh - 147px); + position: relative; + overflow: hidden; + border-radius: 0 0 toRem(6px) toRem(6px); + &__titleBox { + position: relative; + margin-left: 15px; + display: flex; + align-items: center; + justify-content: flex-start; + height: 40px; + background-color: $white; + &::before { + content: ''; + width: 34px; + height: 3px; + background: $primary-color; + position: absolute; + left: 0; + bottom: 0; + } + &__title { + font-weight: $font-600; + font-size: $text-md; + } + } + } + &__modalContainer { + width: 350px; + &__titleBox { + height: 40px; + border-bottom: 1px solid #f2f5fa; + display: flex; + justify-content: center; + align-items: center; + } + } + &__overLayContainer { + .MuiDrawer-paper { + width: 800px; + box-shadow: -5px 0px 10px rgba(28, 40, 82, 0.1); + top: 50px; + height: calc(100% - 40px); + } + .MuiBackdrop-root { + background-color: transparent; + } + } + } +} + +.TagsTable { + height: calc(100% - 40px); + width: 100%; + position: relative; + &__commentCell { + max-width: 600px; + word-break: break-word; + z-index: 99900; + &__actionsContainer { + right: 0; + top: 0; + height: 100%; + position: absolute; + align-items: center; + display: flex; + width: 160px; + justify-content: flex-end; + padding-right: 20px; + background: linear-gradient( + 90deg, + rgba(236, 243, 252, 0) 0%, + #ecf3fc 26.41%, + #ecf3fc 60.3% + ); + } + } + &__runDuration { + font-weight: $font-500; + color: $text-color; + font-size: $text-lg; + @include monospaceFontFamily(14); + } + &__runCreatedDate { + font-weight: $font-500; + color: $text-color; + font-size: $text-lg; + @include monospaceFontFamily(14); + } + &__runName { + font-weight: $font-500; + color: $primary-color; + text-decoration: none; + font-size: $text-lg; + @include monospaceFontFamily(14); + } + .BaseTable { + .BaseTable__table-main .BaseTable__row-cell:first-child { + padding-left: $space-unit; + } + &__body { + & > div { + width: 100% !important; + .BaseTable__row { + width: 100% !important; + } + } + } + &__table-main { + outline: none; + } + &__header { + &-row { + background: #ebf0f8; + border-bottom: none; + } + &-cell { + border-right: $border-grey; + border-bottom: $border-grey; + padding: 0 15px; + &:last-child { + border-right: none; + } + } + } + &__row { + border-bottom: none; + &--hovered { + background: #e8f1fc; + } + &-cell { + border-right: $border-grey; + border-bottom: $border-grey; + padding-left: 15px; + padding-right: 15px; + position: relative; + &:last-child { + white-space: unset; + border-right: none; + } + a { + text-decoration: none; + } + .MuiButton-root { + text-transform: none; + } + } + } + } + + &__runsCell { + display: flex; + align-items: center; + &--iconBox { + font-size: 1rem; + color: $primary-color; + margin-right: $space-xs; + } + } +} + +.TagDetail { + height: 100%; + &__headerContainer { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 20px 0 13px; + height: 40px; + border-bottom: $border-grey; + &__headerActionsBox { + display: flex; + align-items: center; + i { + font-size: 1rem; + } + &__actionsIcon { + margin-right: 25px; + cursor: pointer; + font-size: 1rem; + color: $primary-color; + &:last-child { + margin-right: 0; + } + } + } + } +} +.TagSoftDelete { + &__contentContainer { + padding: 25px 20px; + display: flex; + &__iconContainer { + margin-right: 30px; + display: flex; + justify-content: center; + align-items: center; + .MuiSvgIcon-root { + width: 4.5rem; + height: 3.5rem; + } + } + &__textBox { + &__titleText { + font-weight: $font-600; + font-size: $text-md; + margin-bottom: 5px; + } + &__contentText { + font-weight: $font-400; + font-size: $text-sm; + } + } + } + &__footerBox { + border-top: $border-grey; + height: 64px; + display: flex; + justify-content: center; + align-items: center; + &__cancelButton { + margin-right: 10px; + } + } +} + +.TagDelete { + &__contentContainer { + padding: 20px; + &__contentBox { + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; + &__warningText { + margin: 16px 0 4px 0; + } + .MuiInputBase-root { + margin-bottom: 0; + } + } + } + &__footerBox { + border-top: $border-grey; + height: 64px; + display: flex; + justify-content: center; + align-items: center; + &__cancelButton { + margin-right: 10px; + } + } +} + +.TagDetail__headerContainer__headerActionsBox__actionsIcon__Wrapper { + padding: 8px; + border-radius: 6px; + display: flex; + justify-content: center; + align-items: center; + margin-right: 5px; + color: $primary-color; + cursor: pointer; + &:hover { + background-color: rgba(28, 40, 82, 0.05); + } +} diff --git a/src/src/pages/Tags/Tags.tsx b/src/src/pages/Tags/Tags.tsx new file mode 100644 index 00000000..25b996bd --- /dev/null +++ b/src/src/pages/Tags/Tags.tsx @@ -0,0 +1,98 @@ +import React, { memo, useEffect, useState } from 'react'; + +import { Paper, Tab, Tabs } from '@material-ui/core'; + +import TabPanel from 'components/TabPanel/TabPanel'; +import NotificationContainer from 'components/NotificationContainer/NotificationContainer'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { ITagsProps } from 'types/pages/tags/Tags'; + +import TagsList from './TagsList'; + +import './Tags.scss'; + +function Tags({ + tagsListData, + isTagsDataLoading, + tagInfo, + tagRuns, + onNotificationDelete, + notifyData, + isRunsDataLoading, + isTagInfoDataLoading, +}: ITagsProps): React.FunctionComponentElement { + const [value, setValue] = useState(0); + const [archivedTagsList, setArchivedTagsList] = useState( + tagsListData?.filter((tag) => tag.archived) || [], + ); + const [tagsList, setTagsList] = useState( + tagsListData?.filter((tag) => !tag.archived) || [], + ); + + const handleChange = (event: React.ChangeEvent<{}>, newValue: number) => { + setValue(newValue); + analytics.trackEvent(ANALYTICS_EVENT_KEYS.tags.tabChange); + }; + + useEffect(() => { + setArchivedTagsList(tagsListData?.filter((tag) => tag.archived) || []); + setTagsList(tagsListData?.filter((tag) => !tag.archived) || []); + }, [tagsListData]); + + return ( + +
+ + + + + + + + + + + + + + + + + {notifyData?.length > 0 && ( + + )} +
+
+ ); +} + +export default memo(Tags); diff --git a/src/src/pages/Tags/TagsContainer.tsx b/src/src/pages/Tags/TagsContainer.tsx new file mode 100644 index 00000000..520e7a73 --- /dev/null +++ b/src/src/pages/Tags/TagsContainer.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { useModel } from 'hooks'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import tagsAppModel from 'services/models/tags/tagsAppModel'; +import * as analytics from 'services/analytics'; + +import Tags from './Tags'; + +const tagsRequestRef = tagsAppModel.getTagsData(); + +function TagsContainer(): React.FunctionComponentElement { + const tagsData = useModel(tagsAppModel); + + React.useEffect(() => { + tagsAppModel.initialize(); + tagsRequestRef.call(); + analytics.pageView(ANALYTICS_EVENT_KEYS.tags.pageView); + }, []); + return ( + + + + ); +} + +export default TagsContainer; diff --git a/src/src/pages/Tags/TagsList.tsx b/src/src/pages/Tags/TagsList.tsx new file mode 100644 index 00000000..7fd11c19 --- /dev/null +++ b/src/src/pages/Tags/TagsList.tsx @@ -0,0 +1,203 @@ +import React, { ChangeEvent, memo, useRef, useState } from 'react'; + +import { Button, Dialog, Drawer, TextField } from '@material-ui/core'; + +import TagForm from 'components/TagForm/TagForm'; +import { Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { ITagProps, ITagsListProps } from 'types/pages/tags/Tags'; + +import TagsTable from './TagsTable'; +import TagDetail from './TagDetail'; +import TagSoftDelete from './TagSoftDelete'; +import TagDelete from './TagDelete'; + +import './Tags.scss'; + +function TagsList({ + tagsList, + isHiddenTagsList, + isTagsDataLoading, + tagInfo, + tagRuns, + isRunsDataLoading, + isTagInfoDataLoading, +}: ITagsListProps): React.FunctionComponentElement { + const tableRef = useRef({}); + const [isCreateModalOpened, setIsCreateModalOpened] = useState(false); + const [isUpdateModalOpened, setIsUpdateModalOpened] = useState(false); + const [isSoftDeleteModalOpened, setIsSoftDeleteModalOpened] = useState(false); + const [isDeleteModalOpened, setIsDeleteModalOpened] = useState(false); + const [isTagDetailOverLayOpened, setIsTagDetailOverLayOpened] = + useState(false); + const [tagDetailId, setTagDetailId] = useState(''); + const [searchValue, setSearchValue] = useState(''); + + function onCreateModalToggle() { + setIsCreateModalOpened(!isCreateModalOpened); + } + + function onUpdateModalToggle() { + setIsUpdateModalOpened(!isUpdateModalOpened); + } + + function onSoftDeleteModalToggle() { + setIsSoftDeleteModalOpened(!isSoftDeleteModalOpened); + } + + function onDeleteModalToggle() { + setIsDeleteModalOpened(!isDeleteModalOpened); + } + + function onTagDetailOverlayToggle() { + if (isTagDetailOverLayOpened) { + tableRef.current?.setActiveRow(null); + } + setIsTagDetailOverLayOpened(!isTagDetailOverLayOpened); + } + + function openTagDetailOverLay() { + setIsTagDetailOverLayOpened(true); + } + + function onSearchInputChange(e: ChangeEvent) { + setSearchValue(e.target.value); + } + + function onTableRunClick(id: string) { + if (!isTagDetailOverLayOpened) { + openTagDetailOverLay(); + } + setTagDetailId(id); + analytics.trackEvent(ANALYTICS_EVENT_KEYS.tags.tagDetail); + } + + return ( +
+
+ , + disabled: isTagsDataLoading, + }} + onChange={onSearchInputChange} + value={searchValue} + /> + {!isHiddenTagsList && ( + + )} +
+ + + tag.name.includes(searchValue), + )} + isTagsDataLoading={isTagsDataLoading} + hasSearchValue={!!searchValue} + onTableRunClick={onTableRunClick} + onSoftDeleteModalToggle={onSoftDeleteModalToggle} + onDeleteModalToggle={onDeleteModalToggle} + onUpdateModalToggle={onUpdateModalToggle} + /> + +
+
+ + Create Tag + +
+
+ +
+
+
+ +
+
+ + Update Tag + +
+
+ +
+
+
+ {tagInfo && ( + + )} + {tagInfo && ( + + )} +
+ + {isTagDetailOverLayOpened && ( + + )} + +
+ ); +} + +export default memo(TagsList); diff --git a/src/src/pages/Tags/TagsTable.tsx b/src/src/pages/Tags/TagsTable.tsx new file mode 100644 index 00000000..a6368a3e --- /dev/null +++ b/src/src/pages/Tags/TagsTable.tsx @@ -0,0 +1,175 @@ +import React, { memo, useEffect, useState } from 'react'; +import _ from 'lodash-es'; + +import Table from 'components/Table/Table'; +import { Badge, Button, Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IllustrationsEnum } from 'config/illustrationConfig/illustrationConfig'; + +import tagsAppModel from 'services/models/tags/tagsAppModel'; + +import { ITagProps, ITagsTableProps } from 'types/pages/tags/Tags'; + +function TagsTable({ + tableRef, + tagsList, + hasSearchValue, + isTagsDataLoading, + onTableRunClick, + onSoftDeleteModalToggle, + onUpdateModalToggle, + onDeleteModalToggle, +}: ITagsTableProps): React.FunctionComponentElement { + const [hoveredRowIndex, setHoveredRowIndex] = useState(''); + const tableColumns = [ + { + dataKey: 'name', + key: 'name', + title: 'Name & Color', + width: 200, + cellRenderer: function cellRenderer({ cellData }: any, i: any) { + const { name, color } = cellData; + return ; + }, + }, + { + dataKey: 'runs', + key: 'runs', + title: 'Runs', + width: 150, + cellRenderer: function cellRenderer({ cellData }: any, i: any) { + return ( +
+ + + + + {cellData.count} + +
+ ); + }, + }, + { + dataKey: 'comment', + key: 'comment', + title: 'Comment', + width: 0, + flexGrow: 1, + cellRenderer: function cellRenderer({ cellData, i }: any) { + return ( +
e.stopPropagation()} + > + + {cellData.description} + + {cellData.id === hoveredRowIndex && ( +
+ {!cellData?.archived && ( + + )} + {cellData?.archived ? ( + + ) : ( + + )} + +
+ )} +
+ ); + }, + }, + ]; + + function onSoftDeleteClick(tagData: ITagProps) { + tagsAppModel.updateTagInfo(tagData); + onSoftDeleteModalToggle(); + } + + function onUpdateClick(tagData: ITagProps) { + tagsAppModel.updateTagInfo(tagData); + onUpdateModalToggle(); + } + + function onDeleteClick(tagData: ITagProps) { + tagsAppModel.updateTagInfo(tagData); + onDeleteModalToggle(); + } + + useEffect(() => { + if (tableRef.current.updateData) { + tableRef?.current?.updateData({ + newData: tagsList.map((tagData: ITagProps, i: number) => ({ + key: tagData.id, + name: { name: tagData.name, color: tagData.color }, + comment: tagData, + runs: { count: tagData.run_count, tagId: tagData.id }, + })), + newColumns: tableColumns, + }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [tagsList, onTableRunClick, hoveredRowIndex]); + + return ( + +
+
+ {!isTagsDataLoading && !_.isNil(tagsList) && ( + + {tagsList.length} {tagsList.length > 1 ? 'Tags' : 'Tag'} + + )} +
+ +
setHoveredRowIndex(rowIndex)} + onRowClick={(rowIndex) => onTableRunClick(rowIndex || '')} + illustrationConfig={{ + type: hasSearchValue + ? IllustrationsEnum.EmptySearch + : IllustrationsEnum.ExploreData, + page: 'tags', + }} + height='calc(100% - 39px)' + /> + + + ); +} + +export default memo(TagsTable); diff --git a/src/src/pages/TextExplorer/getStaticContent.tsx b/src/src/pages/TextExplorer/getStaticContent.tsx new file mode 100644 index 00000000..b1e1bef1 --- /dev/null +++ b/src/src/pages/TextExplorer/getStaticContent.tsx @@ -0,0 +1,52 @@ +import * as React from 'react'; + +import { DOCUMENTATIONS } from 'config/references'; + +import getBaseExplorerStaticContent, { + STATIC_CONTENT_TYPES, +} from 'modules/BaseExplorer/utils/getBaseExplorerStaticContent'; +import { StaticContentType } from 'modules/BaseExplorer/types'; + +function getTextExplorerStaticContent( + type: StaticContentType, +): React.ReactNode { + const illustrationContent = getTextExplorerIllustrationContent(type); + return getBaseExplorerStaticContent(type, illustrationContent); +} + +function getTextExplorerIllustrationContent( + type: StaticContentType, +): React.ReactNode { + const Never_Executed = ( + <> + It’s super easy to search Aim experiments. Just start typing your query in + the search bar above. +
+ Look up + + search docs + + to learn more. + + ); + const Failed = 'Incorrect Query'; + const Insufficient_Resources = "You don't have any tracked text"; + const Empty = 'No Results'; + const Empty_Bookmarks = "You don't have any saved bookmark"; + + const CONTENT = { + [STATIC_CONTENT_TYPES.Never_Executed]: Never_Executed, + [STATIC_CONTENT_TYPES.Failed]: Failed, + [STATIC_CONTENT_TYPES.Insufficient_Resources]: Insufficient_Resources, + [STATIC_CONTENT_TYPES.Empty]: Empty, + [STATIC_CONTENT_TYPES.Empty_Bookmarks]: Empty_Bookmarks, + }; + return CONTENT[type] || null; +} + +export default getTextExplorerStaticContent; diff --git a/src/src/pages/TextExplorer/index.tsx b/src/src/pages/TextExplorer/index.tsx new file mode 100644 index 00000000..854a19b1 --- /dev/null +++ b/src/src/pages/TextExplorer/index.tsx @@ -0,0 +1,44 @@ +import type { FunctionComponent } from 'react'; + +import renderer from 'modules/BaseExplorer'; +import TextBox from 'modules/BaseExplorer/components/TextBox/TextBox'; +import { VisualizerLegends } from 'modules/BaseExplorer/components/Widgets'; + +import { AimObjectDepths, SequenceTypesEnum } from 'types/core/enums'; + +import { getTextDefaultConfig } from './textConfig'; + +const defaultConfig = getTextDefaultConfig(); + +const TextExplorer = renderer( + { + name: 'Text Explorer', + sequenceName: SequenceTypesEnum.Texts, + basePath: 'text', + persist: true, + adapter: { + objectDepth: AimObjectDepths.Index, + }, + groupings: defaultConfig.groupings, + visualizations: { + vis1: { + component: defaultConfig.Visualizer as FunctionComponent, + controls: defaultConfig.controls, + box: { + ...defaultConfig.box, + component: TextBox, + initialState: defaultConfig.box.initialState, + }, + widgets: { + legends: { + component: VisualizerLegends, + }, + }, + }, + }, + getStaticContent: defaultConfig.getStaticContent, + }, + __DEV__, +); + +export default TextExplorer; diff --git a/src/src/pages/TextExplorer/textConfig.tsx b/src/src/pages/TextExplorer/textConfig.tsx new file mode 100644 index 00000000..67b87148 --- /dev/null +++ b/src/src/pages/TextExplorer/textConfig.tsx @@ -0,0 +1,105 @@ +import React, { memo } from 'react'; + +import COLORS from 'config/colors/colors'; + +import CaptionProperties from 'modules/BaseExplorer/components/Controls/CaptionProperties'; +import TextRendererMode from 'modules/BaseExplorer/components/Controls/TextRendererMode'; +import Legends from 'modules/BaseExplorer/components/Controls/Legends'; +import { GroupingItem } from 'modules/BaseExplorer/components/Grouping'; +import { getDefaultHydration } from 'modules/BaseExplorer'; +import { GroupType, Order } from 'modules/core/pipeline'; +import { defaultHydration } from 'modules/BaseExplorer/getDefaultHydration'; +import { IBaseComponentProps } from 'modules/BaseExplorer/types'; +import { PersistenceTypesEnum } from 'modules/core/engine/types'; + +import { AimFlatObjectBase } from 'types/core/AimObjects'; + +import { LegendsModeEnum } from 'utils/d3'; + +import getTextExplorerStaticContent from './getStaticContent'; + +export enum TEXT_RNDERER_MODES { + TEXT = 'text', + MARKDOWN = 'markdown', + HTML = 'html', + CODE = 'code', +} + +export const getTextDefaultConfig = (): typeof defaultHydration => { + const defaultConfig = getDefaultHydration(); + + return { + ...defaultConfig, + groupings: { + ...defaultConfig.groupings, + [GroupType.COLUMN]: { + ...defaultConfig.groupings[GroupType.COLUMN], + defaultApplications: { + orders: defaultConfig.groupings[GroupType.COLUMN].defaultApplications + ?.orders ?? [Order.ASC, Order.ASC], + fields: ['run.hash', 'texts.name'], + }, + }, + [GroupType.COLOR]: { + component: memo((props: IBaseComponentProps) => ( + + )), + + // @ts-ignore + styleApplier: ( + object: AimFlatObjectBase, + group: any, + boxConfig: any, + iteration: number, + ) => { + return { + color: + group[GroupType.COLOR]?.order !== undefined + ? COLORS[0][group[GroupType.COLOR].order % COLORS[0].length] + : null, + }; + }, + defaultApplications: { + fields: ['run.hash'], + orders: [Order.ASC], + }, + }, + }, + controls: { + ...defaultConfig.controls, + captionProperties: { + component: CaptionProperties, + state: { + initialState: { + displayBoxCaption: true, + selectedFields: ['run.name', 'texts.name', 'texts.context'], + }, + persist: 'url', + }, + }, + textRenderer: { + component: TextRendererMode, + state: { + initialState: { + type: 'text', + }, + persist: 'url', + }, + }, + legends: { + component: Legends, + state: { + initialState: { + display: false, + mode: LegendsModeEnum.PINNED, + }, + persist: PersistenceTypesEnum.Url, + }, + }, + }, + box: { + ...defaultConfig.box, + }, + getStaticContent: getTextExplorerStaticContent, + }; +}; diff --git a/src/src/react-app-env.d.ts b/src/src/react-app-env.d.ts new file mode 100644 index 00000000..6431bc5f --- /dev/null +++ b/src/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/src/reportWebVitals.ts b/src/src/reportWebVitals.ts new file mode 100644 index 00000000..b1b86f02 --- /dev/null +++ b/src/src/reportWebVitals.ts @@ -0,0 +1,17 @@ +import { ReportHandler } from 'web-vitals'; + +const reportWebVitals = (onPerfEntry?: ReportHandler) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import(/* webpackChunkName: "web-vitals" */ 'web-vitals').then( + ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }, + ); + } +}; + +export default reportWebVitals; diff --git a/src/src/routes/routes.tsx b/src/src/routes/routes.tsx new file mode 100644 index 00000000..75c659b2 --- /dev/null +++ b/src/src/routes/routes.tsx @@ -0,0 +1,231 @@ +import React from 'react'; + +import { PathEnum } from 'config/enums/routesEnum'; +import pageTitlesEnum from 'config/pageTitles/pageTitles'; + +const Runs = React.lazy( + () => import(/* webpackChunkName: "runs" */ 'pages/Runs/RunsContainer'), +); +const RunDetail = React.lazy( + () => import(/* webpackChunkName: "run" */ 'pages/RunDetail/RunDetail'), +); +const Experiment = React.lazy( + () => import(/* webpackChunkName: "run" */ 'pages/Experiment/Experiment'), +); +const Metrics = React.lazy( + () => + import(/* webpackChunkName: "metrics" */ 'pages/Metrics/MetricsContainer'), +); +const Params = React.lazy( + () => import(/* webpackChunkName: "params" */ 'pages/Params/ParamsContainer'), +); +const Bookmarks = React.lazy( + () => + import( + /* webpackChunkName: "bookmarks" */ 'pages/Bookmarks/BookmarksContainer' + ), +); +const Dashboard = React.lazy( + () => import(/* webpackChunkName: "dashboard" */ 'pages/Dashboard/Dashboard'), +); +const TagsContainer = React.lazy( + () => import(/* webpackChunkName: "tags" */ 'pages/Tags/TagsContainer'), +); +const Scatters = React.lazy( + () => + import( + /* webpackChunkName: "scatters" */ 'pages/Scatters/ScattersContainer' + ), +); +const ImagesExplore = React.lazy( + () => + import( + /* webpackChunkName: "images" */ 'pages/ImagesExplore/ImagesExplore' + ), +); +const FiguresExplore = React.lazy( + () => import(/* webpackChunkName: "figures" */ 'pages/FiguresExplorer'), +); +const AudiosExplorer = React.lazy( + () => import(/* webpackChunkName: "audios" */ 'pages/AudiosExplorer'), +); +const MetricsExplorer = React.lazy( + () => import(/* webpackChunkName: "metrics_v2" */ 'pages/MetricsExplorer'), +); + +const TextExplorer = React.lazy( + () => import(/* webpackChunkName: "text" */ 'pages/TextExplorer'), +); + +export interface IRoute { + path: PathEnum; + component: + | React.LazyExoticComponent< + () => React.FunctionComponentElement + > + | any; + showInSidebar: boolean; + displayName: string | null; + icon?: string | null; +} + +const routes = { + DASHBOARD: { + path: PathEnum.Dashboard, + component: Dashboard, + showInSidebar: false, + displayName: 'Dashboard', + icon: 'dashboard', + isExact: true, + title: pageTitlesEnum.DASHBOARD, + }, + RUNS: { + path: PathEnum.Runs, + component: Runs, + showInSidebar: true, + displayName: 'Runs', + icon: 'runs', + isExact: true, + title: pageTitlesEnum.RUNS_EXPLORER, + }, + METRICS: { + path: PathEnum.Metrics, + component: Metrics, + showInSidebar: true, + displayName: 'Metrics', + icon: 'metrics', + isExact: true, + title: pageTitlesEnum.METRICS_EXPLORER, + }, + METRICS_ID: { + path: PathEnum.Metrics_Id, + component: Metrics, + showInSidebar: false, + displayName: 'MetricsId', + isExact: true, + title: pageTitlesEnum.METRICS_EXPLORER, + }, + PARAMS: { + path: PathEnum.Params, + component: Params, + showInSidebar: true, + displayName: 'Params', + icon: 'params', + isExact: true, + title: pageTitlesEnum.PARAMS_EXPLORER, + }, + PARAMS_ID: { + path: PathEnum.Params_Id, + component: Params, + showInSidebar: false, + displayName: 'ParamsId', + isExact: true, + title: pageTitlesEnum.PARAMS_EXPLORER, + }, + TEXT_EXPLORER: { + path: PathEnum.Text_Explorer, + component: TextExplorer, + showInSidebar: true, + icon: 'text', + displayName: 'Text', + isExact: true, + title: pageTitlesEnum.TEXT_EXPLORER, + }, + IMAGE_EXPLORE: { + path: PathEnum.Images_Explore, + component: ImagesExplore, + showInSidebar: true, + displayName: 'Images', + icon: 'images', + isExact: true, + title: pageTitlesEnum.IMAGES_EXPLORER, + }, + IMAGE_EXPLORE_ID: { + path: PathEnum.Images_Explore_Id, + component: ImagesExplore, + showInSidebar: false, + displayName: 'ImagesId', + isExact: true, + title: pageTitlesEnum.IMAGES_EXPLORER, + }, + FIGURES_EXPLORER: { + path: PathEnum.Figures_Explorer, + component: FiguresExplore, + showInSidebar: true, + icon: 'figures', + displayName: 'Figures', + isExact: true, + title: pageTitlesEnum.FIGURES_EXPLORER, + }, + AUDIOS_EXPLORER: { + path: PathEnum.Audios_Explorer, + component: AudiosExplorer, + showInSidebar: true, + icon: 'audios', + displayName: 'Audios', + isExact: true, + title: pageTitlesEnum.AUDIOS_EXPLORER, + }, + SCATTERS: { + path: PathEnum.Scatters, + component: Scatters, + showInSidebar: true, + displayName: 'Scatters', + icon: 'scatterplot', + isExact: true, + title: pageTitlesEnum.SCATTERS_EXPLORER, + }, + SCATTERS_EXPLORE_ID: { + path: PathEnum.Scatters_Id, + component: Scatters, + showInSidebar: false, + displayName: 'ScatterId', + isExact: true, + title: pageTitlesEnum.SCATTERS_EXPLORER, + }, + BOOKMARKS: { + path: PathEnum.Bookmarks, + component: Bookmarks, + showInSidebar: true, + displayName: 'Bookmarks', + icon: 'bookmarks', + isExact: true, + title: pageTitlesEnum.BOOKMARKS, + }, + TAGS: { + path: PathEnum.Tags, + component: TagsContainer, + showInSidebar: true, + displayName: 'Tags', + icon: 'tags', + isExact: true, + title: pageTitlesEnum.TAGS, + }, + RUN_DETAIL: { + path: PathEnum.Run_Detail, + component: RunDetail, + showInSidebar: false, + displayName: 'Run Detail', + isExact: false, + title: pageTitlesEnum.RUN_DETAIL, + }, + Experiment: { + path: PathEnum.Experiment, + component: Experiment, + showInSidebar: false, + displayName: 'Experiment', + isExact: false, + title: pageTitlesEnum.EXPERIMENT, + }, + METRICS_EXPLORER: { + path: PathEnum.Metrics_Explorer, + component: MetricsExplorer, + showInSidebar: false, + icon: 'metrics', + displayName: 'Metrics_v2', + isExact: true, + title: pageTitlesEnum.METRICS_EXPLORER_V2, + }, +}; + +export default routes; diff --git a/src/src/services/NetworkService/index.ts b/src/src/services/NetworkService/index.ts new file mode 100644 index 00000000..2b455a17 --- /dev/null +++ b/src/src/services/NetworkService/index.ts @@ -0,0 +1,391 @@ +import Cookies from 'js-cookie'; + +import ENDPOINTS from '../api/endpoints'; +import { AuthToken } from '../api/api'; + +import { + HttpRequestMethods, + HttpErrorMessages, + Interceptor, + RequestOptions, + RequestInit, +} from './types'; +import exceptionDetector from './interceptors/exceptionDetector'; +// remove comment for this line once different platforms will have usage of fetch +// import 'isomorphic-fetch'; + +/** + * class NetworkService + * @Usage + * const api = new NetworkService('host/api', [(body, headers) => { body.data = {}; return {body, headers} }]); + * api.makeApiGetRequest('resource/:resourceId') + * .then({ body, headers } => { + * // body.data always will be {}, because passed interceptor which resets the data property of body + * }) + * @TODO write methods docs + */ +class NetworkService { + private interceptors: Interceptor[] = [exceptionDetector]; + private readonly uri?: string; + private readonly AUTH_TOKEN_KEY = 'Auth'; + private readonly AUTH_REFRESH_TOKEN_KEY = 'token'; + private readonly CONTENT_TYPE = { + JSON: 'application/json', + FORM_DATA: 'application/x-www-form-urlencoded', + }; + + constructor(uri: string, interceptors: Array = []) { + if (!uri) { + throw new Error('The "uri" argument must be a string.'); + } + + if (interceptors.length) { + interceptors.forEach((interceptor: Interceptor) => { + this.setInterceptor(interceptor); + }); + } + + this.uri = uri; + } + + public makeAPIGetRequest = ( + url: string, + options: RequestOptions = {}, + apiHost: string | undefined = this.uri, + ) => { + options = options || {}; + options.method = HttpRequestMethods.GET; + return this.makeAPIRequest(url, options, apiHost); + }; + + public makeAPIPostRequest = ( + url: string, + options: RequestOptions = {}, + apiHost: string | undefined = this.uri, + ) => { + options.method = HttpRequestMethods.POST; + return this.makeAPIRequest(url, options, apiHost); + }; + + public makeAPIPutRequest = ( + urlPrefix: string, + options: RequestOptions = {}, + apiHost: string | undefined = this.uri, + ) => { + options.method = HttpRequestMethods.PUT; + return this.makeAPIRequest(urlPrefix, options, apiHost); + }; + + public makeAPIDeleteRequest = ( + urlPrefix: string, + options: RequestOptions = {}, + apiHost: string | undefined = this.uri, + ) => { + options.method = HttpRequestMethods.DELETE; + return this.makeAPIRequest(urlPrefix, options, apiHost); + }; + + public makeAPIPatchRequest = ( + urlPrefix: string, + options: RequestOptions = {}, + apiHost: string | undefined = this.uri, + ) => { + options.method = HttpRequestMethods.PATCH; + return this.makeAPIRequest(urlPrefix, options, apiHost); + }; + + public createUrl = ( + arg: string | Array, + apiHost: string | undefined = this.uri, + ): string => { + if (Array.isArray(arg)) { + return [apiHost, ...arg].join('/'); + } + if (arg) { + return `${apiHost}/${arg}`; + } + return `${apiHost}`; + }; + + private createQueryParams = (queryParams: Record) => { + return Object.keys(queryParams) + .reduce((accumulator: Array, key: string) => { + const item = queryParams[key]; + if (item === null || item === undefined) return accumulator; + + if (Array.isArray(item)) { + for (let index = 0; index < item.length; index++) { + const arrItem = item[index]; + accumulator.push(`${key}=${arrItem}`); + } + } else { + accumulator.push(`${key}=${item}`); + } + + return accumulator; + }, []) + .join('&'); + }; + + public makeAPIRequest = ( + partUrl: string, + options: RequestOptions = {}, + apiHost: string | undefined = this.uri, + ): Promise<{ body: any; headers: any }> => { + return new Promise((resolve, reject) => { + let url = this.createUrl(partUrl, apiHost); + + this.request(url, options) + .then(async (response: Response) => { + if (!response) { + return reject({ + message: HttpErrorMessages.INVALID_RESPONSE_DATA, + }); + } + + const { headers } = response; + let body: { status?: number } = {}; + + const contentType = headers.get('content-type'); + + // @ts-ignore + body = response.body; + + if (contentType && contentType.indexOf('application/json') !== -1) { + body = await response.json(); + } + + try { + if (this.interceptors.length) { + this.interceptors.forEach((interceptor) => { + if (typeof interceptor === 'function') { + // @ts-ignore + body = interceptor(body, headers); + } + }); + } + } catch (e: any) { + reject({ message: e.message, res: { body, headers } }); + } + + if (response.status >= 400) { + return await this.checkCredentials(response, url, () => + this.request(url, options), + ); + } + + return resolve({ body, headers }); + }) + .catch((err: any) => reject(err)); + }); + }; + + private request = (url: string, options: RequestOptions = {}) => { + return new Promise((resolve, reject) => { + if (!url) { + return reject(HttpErrorMessages.INVALID_REQUEST_PARAMS); + } + + if (options.query_params) { + const queryParams = this.createQueryParams(options.query_params); + + if (queryParams) { + const paramGlue = url.includes('?') ? '&' : '?'; + url += `${paramGlue}${queryParams}`; + } + } + + if (!options.method) { + options.method = HttpRequestMethods.GET; + } + + const fetchOptions: RequestInit = { + method: options.method, + headers: options.headers || this.getRequestHeaders(), + }; + + if (options.credentials) { + fetchOptions.credentials = options.credentials; + } + + if (options.headers) { + fetchOptions.headers = options.headers; + } + + if (options.signal) { + fetchOptions.signal = options.signal; + } + + try { + if (options.body) { + if (options.body instanceof File) { + fetchOptions.body = options.body; + } else { + fetchOptions.body = JSON.stringify(options.body); + } + } + } catch (ex) { + return reject({ + message: HttpErrorMessages.INVALID_REQUEST_PARAMS, + }); + } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + fetch(url, fetchOptions) + .then((response) => resolve(response)) + .catch((error) => reject(error)); + }); + }; + + public setInterceptor(interceptor: Interceptor) { + if (typeof interceptor !== 'function') { + throw new Error(`The '${interceptor}' is not a function.`); + } + this.interceptors.push(interceptor); + } + + /** + * getTimezoneOffset is a function that returns the timezone offset + * @returns string + * @example + * const timezoneOffset = getTimezoneOffset(); + */ + public getTimezoneOffset(): string { + return `${new Date().getTimezoneOffset()}`; + } + + /** + * getAuthToken - Gets the token from local storage + * @returns {string} - The token + */ + public getAuthToken(): string { + return localStorage.getItem(this.AUTH_TOKEN_KEY) || ''; + } + + /** + * getRequestHeaders is a function that returns the request headers + * @returns object + * @example + * const requestHeaders = getRequestHeaders(); + * const response = await fetch(`${API_ROOT}${endpoint}`, { + * method: "POST", + * headers: requestHeaders, + * body: JSON.stringify(data), + * }); + */ + public getRequestHeaders(headers = {}) { + const requestHeaders: Record = { + 'X-Timezone-Offset': this.getTimezoneOffset(), + 'Content-Type': this.CONTENT_TYPE.JSON, + ...headers, + }; + + const Authorization = this.getAuthToken(); + if (Authorization) { + requestHeaders.Authorization = Authorization; + } + return requestHeaders; + } + + /** + * refreshToken is a function that makes a GET request to the auth endpoint for refresh the token + * @returns IResponse + * @throws Error + */ + public async refreshToken() { + return this.makeAPIGetRequest( + `${ENDPOINTS.AUTH.BASE}/${ENDPOINTS.AUTH.REFRESH}`, + { + headers: this.getRequestHeaders(), + credentials: + process.env.NODE_ENV === 'development' ? 'include' : 'same-origin', + }, + `${window.location.origin}/api`, + ); + } + + /** + * removeAuthToken - Removes the token from local storage and refresh token from cookies + * @returns {void} + */ + public removeAuthToken(): void { + localStorage.removeItem(this.AUTH_TOKEN_KEY); + this.removeRefreshToken(); + } + + /** + * setAuthToken - Sets the token in local storage and refresh token in cookies + * @param {AuthToken} token - The token object + * @returns {void} + */ + public setAuthToken({ + token_type, + refresh_token, + access_token, + }: AuthToken): void { + localStorage.setItem(this.AUTH_TOKEN_KEY, `${token_type} ${access_token}`); + this.setRefreshToken(refresh_token); + } + + /** + * setRefreshToken - Sets the refresh token in cookies + * @param refresh_token - The refresh token + * @returns {void} + */ + public setRefreshToken(refresh_token: string): void { + Cookies.set(this.AUTH_REFRESH_TOKEN_KEY, refresh_token); + } + + /** + * removeRefreshToken - Removes the refresh token from cookies + * @returns {void} + */ + public removeRefreshToken(): void { + Cookies.remove(this.AUTH_REFRESH_TOKEN_KEY); + } + + /** + * parseResponse is a generic function that parses the response body + * @param response is the response object + * @returns + * @throws Error + * @example + * const response = await fetch(`${API_ROOT}${endpoint}`); + * return parseResponse(response); + */ + public async parseResponse(response: Response): Promise { + try { + const data = await response.json(); + if (response.ok) { + return data; + } else { + return Promise.reject(new Error(data.message)); + } + } catch (error) { + throw error; + } + } + + public async checkCredentials( + response: Response, + endpoint: string, + refetch: () => Promise, + ): Promise { + if (response.status === 401) { + if (endpoint === `${ENDPOINTS.AUTH.BASE}/${ENDPOINTS.AUTH.REFRESH}`) { + this.removeAuthToken(); + return this.parseResponse(response); + } + // Refresh token + const token = (await this.refreshToken()).body; + if (token) { + this.setAuthToken(token); + return refetch(); + } + } + return this.parseResponse(response); + } +} + +export * from './types'; +export default NetworkService; diff --git a/src/src/services/NetworkService/interceptors/exceptionDetector.ts b/src/src/services/NetworkService/interceptors/exceptionDetector.ts new file mode 100644 index 00000000..7d3ad1a9 --- /dev/null +++ b/src/src/services/NetworkService/interceptors/exceptionDetector.ts @@ -0,0 +1,6 @@ +function exceptionDetector(data: any) { + // Actions + return data; +} + +export default exceptionDetector; diff --git a/src/src/services/NetworkService/types.ts b/src/src/services/NetworkService/types.ts new file mode 100644 index 00000000..82603d7a --- /dev/null +++ b/src/src/services/NetworkService/types.ts @@ -0,0 +1,118 @@ +export type Interceptor = ( + data: T, + headers?: Record, +) => D | Promise; + +export enum HttpRequestMethods { + GET = 'GET', + PUT = 'PUT', + HEAD = 'HEAD', + POST = 'POST', + PATCH = 'PATCH', + DELETE = 'DELETE', + OPTION = 'OPTION', +} + +export enum HttpErrorMessages { + INVALID_REQUEST_PARAMS = 'Invalid request parameters.', + INVALID_RESPONSE_DATA = 'Invalid Response Data', + SERVER_IS_UNAVAILABLE = 'The server is unavailable.', + RESPONSE_PARSING_ERROR = 'Unable to parse response.', +} + +export type RequestOptions = { + method?: HttpRequestMethods; + query_params?: Record; + headers?: Record; + body?: string | Record | File | ReadableStream; + signal?: AbortSignal; + credentials?: RequestCredentials; +}; + +export interface RequestInit { + /** + * A BodyInit object or null to set request's body. + */ + body?: string | Record | File | null; + + /** + * A string indicating how the request will interact with the + * browser's cache to set request's cache. + */ + cache?: Record; + + /** + * A string indicating whether credentials will be sent with the + * request always, never, or only when sent to a same-origin URL. + * + * Sets request's credentials. + */ + credentials?: RequestCredentials; + + /** + * A Headers object, an object literal, or an array of two-item + * arrays to set request's headers. + */ + headers?: Record; + + /** + * A cryptographic hash of the resource to be fetched by request. + * + * Sets request's integrity. + */ + integrity?: string; + + /** + * A boolean to set request's keepalive. + */ + keepalive?: boolean; + + /** + * A string to set request's method. + */ + method?: string; + + /** + * A string to indicate whether the request will use CORS, or will be + * restricted to same-origin URLs. Sets request's mode. + */ + mode?: Record; + + /** + * A string indicating whether request follows redirects, results in an error + * upon encountering a redirect, or returns the redirect (in an opaque fashion). + * + * Sets request's redirect. + */ + redirect?: Record; + + /** + * A string whose value is a same-origin URL, "about:client", or the empty string, + * to set request's referrer. + */ + referrer?: string; + + /** + * A referrer policy to set request's referrerPolicy. + */ + referrerPolicy?: Record; + + /** + * An AbortSignal to set request's signal. + */ + signal?: AbortSignal | null; +} + +export interface HttpResponseBody { + status: string; +} + +export type HttpResponse = { + body: T; + headers: any; // @TODO fill in later +}; + +export type RequestInstance = { + call: (...args: any) => Promise>; + cancel: () => void; +}; diff --git a/src/src/services/analytics.ts b/src/src/services/analytics.ts new file mode 100644 index 00000000..dad8a580 --- /dev/null +++ b/src/src/services/analytics.ts @@ -0,0 +1,62 @@ +//@ts-nocheck +export const SEGMENT_DEMO_WRITE_KEY = 'Z5rtxFe3gJmZB8JD97c4rqQa9R0q4Gkn'; +export const SEGMENT_WRITE_KEY = 'RrVqLHHD6WDXoFBkodO9KidodTtU92XO'; +export function isDev() { + return process.env.NODE_ENV === 'development'; +} + +let initialized = false; + +const enabled = () => { + return ( + !isDev() && window.analytics !== false && window.telemetry_enabled === 1 + ); +}; + +const init = () => { + if (initialized) return; + if ( + window.location.hostname.indexOf('aimstack.io') !== -1 && + (window.location.hostname.indexOf('demo') !== -1 || + window.location.hostname.indexOf('play') !== -1) + ) { + window.analytics._writeKey = SEGMENT_DEMO_WRITE_KEY; + window.analytics.load(SEGMENT_DEMO_WRITE_KEY); + } else { + window.analytics._writeKey = SEGMENT_WRITE_KEY; + window.analytics.load(SEGMENT_WRITE_KEY); + } + window.analytics.identify(); + initialized = true; +}; + +const pageView = (pageName, pageCat = null) => { + if (!enabled()) return; + init(); + window.analytics.page(pageCat, pageName, { + path: window.location.pathname, + url: window.location.hostname, + search: null, + referrer: null, + title: null, + }); +}; + +const trackEvent = (eventName: string, properties = {}) => { + if (!enabled()) return; + init(); + + window.analytics.track(eventName, properties, { + path: window.location.pathname, + url: window.location.hostname, + page: { + path: null, + search: null, + referrer: null, + title: null, + url: null, + }, + }); +}; + +export { init, pageView, trackEvent }; diff --git a/src/src/services/api/api.ts b/src/src/services/api/api.ts new file mode 100644 index 00000000..93615f5a --- /dev/null +++ b/src/src/services/api/api.ts @@ -0,0 +1,379 @@ +import Cookies from 'js-cookie'; + +import { getAPIHost, getAPIAuthToken } from 'config/config'; + +import ENDPOINTS from './endpoints'; + +export interface AuthToken { + /** + * @description access_token is the token of the user + * @example "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9" + */ + access_token: string; + /** + * @description token_type is the type of the token + * @example "bearer" + */ + token_type: string; + /** + * @description refresh_token is the refresh token of the user + * @example 3600 + */ + refresh_token: string; +} + +const AUTH_TOKEN_KEY = 'Auth'; +const AUTH_REFRESH_TOKEN_KEY = 'token'; +const AUTH_USER_KEY = 'user'; + +export const CONTENT_TYPE = { + JSON: 'application/json', + FORM_DATA: 'application/x-www-form-urlencoded', +}; + +function createAPIRequestWrapper( + url: string, + options: RequestInit = {}, + stream: boolean = false, + apiHost: string = getAPIHost(), +) { + const controller = new AbortController(); + const signal = controller.signal; + + return { + call: (exceptionHandler?: (error: ResponseDataType) => any) => + new Promise((resolve: (data: ResponseDataType) => void, reject) => { + fetch(`${apiHost}/${url}`, { ...options, signal }) + .then(async (response) => { + try { + if (response.status >= 400) { + const body = await response.json(); + + if (typeof exceptionHandler === 'function') { + exceptionHandler(body); + } + + return await checkCredentials( + response, + url, + () => + createAPIRequestWrapper( + url, + options, + stream, + apiHost, + ).call(exceptionHandler), + ); + } + const data = stream ? response.body : await response.json(); + + resolve(data); + } catch (err: Error | any) { + if (typeof exceptionHandler === 'function') { + exceptionHandler(err); + } + reject(err); + } + }) + .catch((err: Error | any) => { + if (err.name === 'AbortError') { + // Fetch aborted + } else { + if (typeof exceptionHandler === 'function') { + exceptionHandler(err); + } + reject(err); + } + }); + }), + abort: () => controller.abort(), + }; +} + +function getStream( + url: string, + params?: {}, + options?: RequestInit, + apiHost: string = getAPIHost(), +) { + return createAPIRequestWrapper( + `${url}${ + options?.method === 'POST' + ? '' + : params + ? '?' + new URLSearchParams(params).toString() + : '' + }`, + { + method: 'GET', + ...options, + headers: getRequestHeaders(), + ...(options?.method === 'POST' && { + body: JSON.stringify(params), + }), + }, + true, + apiHost, + ); +} + +function getStream1( + url: string, + params?: {}, + options?: RequestInit, + apiHost: string = getAPIHost(), +) { + return createAPIRequestWrapper( + `${url}${ + options?.method === 'POST' && params + ? '?' + new URLSearchParams(params).toString() + : '' + }`, + { + method: 'GET', + ...options, + headers: getRequestHeaders(), + ...(options?.method === 'POST' && { + body: JSON.stringify(options.body), + }), + }, + true, + apiHost, + ); +} + +function get( + url: string, + params?: {}, + options?: RequestInit, + apiHost: string = getAPIHost(), +) { + return createAPIRequestWrapper( + `${url}${params ? '?' + new URLSearchParams(params).toString() : ''}`, + { + method: 'GET', + ...options, + headers: getRequestHeaders(), + }, + false, + apiHost, + ); +} + +function post( + url: string, + data: object, + options?: RequestInit, + apiHost: string = getAPIHost(), +) { + return createAPIRequestWrapper( + url, + { + method: 'POST', + ...options, + headers: getRequestHeaders(), + body: JSON.stringify(data), + }, + false, + apiHost, + ); +} + +function put( + url: string, + data: object, + options?: RequestInit, + apiHost: string = getAPIHost(), +) { + return createAPIRequestWrapper( + url, + { + method: 'PUT', + ...options, + headers: getRequestHeaders(), + body: JSON.stringify(data), + }, + false, + apiHost, + ); +} + +function remove( + url: string, + options?: RequestInit, + apiHost: string = getAPIHost(), +) { + return createAPIRequestWrapper( + url, + { + method: 'DELETE', + ...options, + headers: getRequestHeaders(), + }, + false, + apiHost, + ); +} + +/** + * getTimezoneOffset is a function that returns the timezone offset + * @returns string + * @example + * const timezoneOffset = getTimezoneOffset(); + */ +function getTimezoneOffset(): string { + return `${new Date().getTimezoneOffset()}`; +} + +/** + * getRequestHeaders is a function that returns the request headers + * @returns object + * @example + * const requestHeaders = getRequestHeaders(); + * const response = await fetch(`${API_ROOT}${endpoint}`, { + * method: "POST", + * headers: requestHeaders, + * body: JSON.stringify(data), + * }); + */ +function getRequestHeaders(headers = {}) { + const requestHeaders: Record = { + 'X-Timezone-Offset': getTimezoneOffset(), + 'Content-Type': CONTENT_TYPE.JSON, + ...headers, + }; + const Authorization = getAuthToken(); + if (Authorization) { + requestHeaders.Authorization = Authorization; + } + return requestHeaders; +} + +/** + * getAuthToken - Gets the token from local storage + * @returns {string} - The token + */ +function getAuthToken(): string { + if (typeof window === 'undefined') { + return getAPIAuthToken(); + } + return localStorage.getItem(AUTH_TOKEN_KEY) || ''; +} + +/** + * removeAuthToken - Removes the token from local storage and refresh token from cookies + * @returns {void} + */ +function removeAuthToken(): void { + localStorage.removeItem(AUTH_TOKEN_KEY); + localStorage.removeItem(AUTH_USER_KEY); + removeRefreshToken(); +} + +/** + * setAuthToken - Sets the token in local storage and refresh token in cookies + * @param {AuthToken} token - The token object + * @returns {void} + */ +function setAuthToken({ + token_type, + refresh_token, + access_token, +}: AuthToken): void { + localStorage.setItem(AUTH_TOKEN_KEY, `${token_type} ${access_token}`); + setRefreshToken(refresh_token); +} + +/** + * setRefreshToken - Sets the refresh token in cookies + * @param refresh_token - The refresh token + * @returns {void} + */ +function setRefreshToken(refresh_token: string): void { + Cookies.set(AUTH_REFRESH_TOKEN_KEY, refresh_token); +} + +/** + * removeRefreshToken - Removes the refresh token from cookies + * @returns {void} + */ +function removeRefreshToken(): void { + Cookies.remove(AUTH_REFRESH_TOKEN_KEY); +} + +/** + * refreshToken is a function that makes a GET request to the auth endpoint for refresh the token + * @returns IResponse + * @throws Error + */ +function refreshToken() { + return get( + `${ENDPOINTS.AUTH.BASE}/${ENDPOINTS.AUTH.REFRESH}`, + undefined, + { + credentials: + process.env.NODE_ENV === 'development' ? 'include' : 'same-origin', + }, + `${window.location.origin}/api`, + ); +} + +/** + * parseResponse is a generic function that parses the response body + * @param response is the response object + * @returns + * @throws Error + * @example + * const response = await fetch(`${API_ROOT}${endpoint}`); + * return parseResponse(response); + */ +async function parseResponse(response: Response): Promise { + try { + const data = await response.json(); + if (response.ok) { + return data; + } else { + return Promise.reject(new Error(data.message)); + } + } catch (error) { + throw error; + } +} + +async function checkCredentials( + response: Response, + endpoint: string, + refetch: () => Promise, +): Promise { + if (response.status === 401) { + if (endpoint === `${ENDPOINTS.AUTH.BASE}/${ENDPOINTS.AUTH.REFRESH}`) { + removeAuthToken(); + window.location.assign(`${window.location.origin}/sign-in`); + return parseResponse(response); + } + if (localStorage.getItem('refreshing') !== 'true') { + localStorage.setItem('refreshing', 'true'); + // Refresh token + const token = await refreshToken().call(); + if (token) { + setAuthToken(token); + localStorage.setItem('refreshing', 'false'); + window.location.reload(); + return refetch(); + } + localStorage.setItem('refreshing', 'false'); + } + } + return parseResponse(response); +} + +const API = { + get, + getStream, + getStream1, + post, + put, + delete: remove, +}; + +export default API; diff --git a/src/src/services/api/apps/appsService.ts b/src/src/services/api/apps/appsService.ts new file mode 100644 index 00000000..83875783 --- /dev/null +++ b/src/src/services/api/apps/appsService.ts @@ -0,0 +1,38 @@ +import { IAppData } from 'types/services/models/metrics/metricsAppModel'; +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + APPS: 'apps', +}; + +function fetchAppsList(): IApiRequest { + return API.get(endpoints.APPS); +} + +function fetchApp(id: string): IApiRequest { + return API.get(`${endpoints.APPS}/${id}`); +} + +function createApp(reqBody: IAppData): IApiRequest { + return API.post(endpoints.APPS, reqBody); +} + +function updateApp(id: string, reqBody: IAppData): IApiRequest { + return API.put(`${endpoints.APPS}/${id}`, reqBody); +} + +function deleteApp(id: string): IApiRequest { + return API.delete(`${endpoints.APPS}/${id}`); +} +const appsService = { + endpoints, + fetchAppsList, + fetchApp, + createApp, + updateApp, + deleteApp, +}; + +export default appsService; diff --git a/src/src/services/api/audiosExplore/audiosExplore.ts b/src/src/services/api/audiosExplore/audiosExplore.ts new file mode 100644 index 00000000..a87955af --- /dev/null +++ b/src/src/services/api/audiosExplore/audiosExplore.ts @@ -0,0 +1,26 @@ +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + GET_AUDIOS: 'runs/search/audios', + GET_AUDIOS_BY_URIS: 'runs/audios/get-batch', +}; + +function getAudiosExploreData(params: {}): IApiRequest { + return API.getStream(endpoints.GET_AUDIOS, params); +} + +function getAudiosByURIs(body: string[]): IApiRequest { + return API.getStream>(endpoints.GET_AUDIOS_BY_URIS, body, { + method: 'POST', + }); +} + +const audiosExploreService = { + endpoints, + getAudiosExploreData, + getAudiosByURIs, +}; + +export default audiosExploreService; diff --git a/src/src/services/api/dashboard/dashboardService.ts b/src/src/services/api/dashboard/dashboardService.ts new file mode 100644 index 00000000..51381504 --- /dev/null +++ b/src/src/services/api/dashboard/dashboardService.ts @@ -0,0 +1,49 @@ +import { + IAppData, + IDashboardRequestBody, +} from 'types/services/models/metrics/metricsAppModel'; +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + DASHBOARD: 'dashboards', +}; + +function fetchDashboardsList(): IApiRequest { + return API.get(endpoints.DASHBOARD); +} + +function fetchDashboard(id: string): IApiRequest { + return API.get(`${endpoints.DASHBOARD}/${id}`); +} + +function createDashboard( + reqBody: IDashboardRequestBody, +): IApiRequest { + return API.post(endpoints.DASHBOARD, reqBody, { + headers: { 'Content-type': 'application/json' }, + }); +} + +function updateDashboard( + id: string, + reqBody: IDashboardRequestBody, +): IApiRequest { + return API.put(`${endpoints.DASHBOARD}/${id}`, reqBody); +} + +function deleteDashboard(id: string): IApiRequest { + return API.delete(`${endpoints.DASHBOARD}/${id}`); +} + +const dashboardService = { + endpoints, + createDashboard, + fetchDashboardsList, + fetchDashboard, + updateDashboard, + deleteDashboard, +}; + +export default dashboardService; diff --git a/src/src/services/api/endpoints.ts b/src/src/services/api/endpoints.ts new file mode 100644 index 00000000..56c64848 --- /dev/null +++ b/src/src/services/api/endpoints.ts @@ -0,0 +1,51 @@ +const ENDPOINTS = { + PROJECTS: { + BASE: '/projects', + GET: '', + GET_ACTIVITY: 'activity', + GET_PARAMS: 'params', + }, + + RUNS: { + BASE: '/runs', + GET: '', + SEARCH: 'search', + ACTIVE: 'active', + }, + + EXPERIMENTS: { + BASE: '/experiments', + GET: '', + CREATE: '', + SEARCH: 'search', + GET_ACTIVITY: 'activity', + GET_NOTE: 'note', + CREATE_NOTE: 'note', + }, + + DASHBOARDS: { + BASE: '/dashboards', + GET: '', + CREATE: '', + SEARCH: 'search', + }, + + TAGS: { + BASE: '/tags', + GET: '', + CREATE: '', + UPDATE: '', + DELETE: '', + }, + RELEASE_NOTES: { + BASE: 'https://api.github.com/repos/aimhubio/aim/releases', + GET: '', + GET_BY_TAG_NAME: 'tags', + }, + AUTH: { + BASE: 'auth', + REFRESH: 'refresh', + }, +}; + +export default ENDPOINTS; diff --git a/src/src/services/api/experiments/experimentsService.ts b/src/src/services/api/experiments/experimentsService.ts new file mode 100644 index 00000000..ed1f736b --- /dev/null +++ b/src/src/services/api/experiments/experimentsService.ts @@ -0,0 +1,57 @@ +import { IExperimentData } from 'modules/core/api/experimentsApi'; + +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + EXPERIMENTS: 'experiments', + GET_EXPERIMENT_BY_ID: (id: string) => `experiments/${id}`, + UPDATE_EXPERIMENT_BY_ID: (id: string) => `experiments/${id}`, + SEARCH_EXPERIMENT: (query: string) => `experiments/search=${query}`, + GET_RUNS_BY_EXPERIMENT_ID: (id: string) => `experiments/${id}/runs`, +}; + +function getExperimentsData(): IApiRequest { + return API.get(endpoints.EXPERIMENTS); +} + +function searchExperiment(query: string): IApiRequest { + return API.get(endpoints.SEARCH_EXPERIMENT(query)); +} + +function getExperimentById(id: string): IApiRequest { + return API.get(endpoints.GET_EXPERIMENT_BY_ID(id)); +} + +function updateExperimentById( + reqBody: { name?: string; archived?: boolean }, + id: string, +): IApiRequest<{ status: string; id: string }> { + return API.put(endpoints.UPDATE_EXPERIMENT_BY_ID(id), reqBody); +} + +function createExperiment(reqBody: { + name: string; +}): IApiRequest<{ id: string; status: string }> { + return API.post(endpoints.EXPERIMENTS, reqBody); +} + +function getRunsOfExperiment( + id: string, + params: { limit: number; offset?: string } = { limit: 10 }, +) { + return API.get(endpoints.GET_RUNS_BY_EXPERIMENT_ID(id), params); +} + +const experimentsService = { + endpoints, + getExperimentsData, + searchExperiment, + getExperimentById, + updateExperimentById, + createExperiment, + getRunsOfExperiment, +}; + +export default experimentsService; diff --git a/src/src/services/api/imagesExplore/imagesExploreService.ts b/src/src/services/api/imagesExplore/imagesExploreService.ts new file mode 100644 index 00000000..9e864b33 --- /dev/null +++ b/src/src/services/api/imagesExplore/imagesExploreService.ts @@ -0,0 +1,26 @@ +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + GET_IMAGES: 'runs/search/images', + GET_IMAGES_BY_URIS: 'runs/images/get-batch', +}; + +function getImagesExploreData(params: {}): IApiRequest { + return API.getStream(endpoints.GET_IMAGES, params); +} + +function getImagesByURIs(body: string[]): IApiRequest { + return API.getStream>(endpoints.GET_IMAGES_BY_URIS, body, { + method: 'POST', + }); +} + +const imagesExploreService = { + endpoints, + getImagesExploreData, + getImagesByURIs, +}; + +export default imagesExploreService; diff --git a/src/src/services/api/metrics/metricsMock.ts b/src/src/services/api/metrics/metricsMock.ts new file mode 100644 index 00000000..a12e5fbc --- /dev/null +++ b/src/src/services/api/metrics/metricsMock.ts @@ -0,0 +1,83 @@ +const hparams = { + lr: [0.0001, 0.0003, 0.0007, 0.001, 0.002, 0.01], + batch_size: [32, 64], + seed: [1, 3, 5, 7], + foo: ['bar', 'baz'], +}; + +function generateMetrics(count = 500, pointsCount = 50) { + const runsContainer = []; + for (let i = 0; i < count / 2; i++) { + runsContainer.push({ + experiment_name: `experiment${i + 1}`, + name: `runs${i + 1}`, + run_hash: generateRunHash(`${i}`), + params: { + hparams: { + lr: hparams.lr[Math.round(Math.random() * 6)], + batch_size: hparams.batch_size[Math.round(Math.random() * 2)], + seed: hparams.seed[Math.round(Math.random() * 4)], + foo: hparams.foo[Math.round(Math.random() * 2)], + }, + }, + metrics: ['train', 'val'].map((context) => { + return { + metric_name: 'foo', + context: { + subset: context, + }, + data: { + values: new Float64Array( + context === 'val' + ? [...Array(Math.ceil(pointsCount / 3))].map( + (e, j) => Math.random() * -1.1 + Math.random() * (j + 1), + ) + : [...Array(pointsCount)].map( + (e, j) => Math.random() * -1.1 + Math.random() * (j + 1), + ), + ), + steps: new Uint32Array( + context === 'val' + ? [...Array(Math.ceil(pointsCount / 3))] + .fill(0) + .map((e, i) => i * 10) + : [...Array(pointsCount)].fill(0).map((e, i) => i * 10), + ), + epochs: new Uint32Array( + context === 'val' ? [0, 1, 2] : [0, 0, 1, 1, 1, 2, 2], + ), + iterations: new Uint32Array( + context === 'val' + ? [...Array(Math.ceil(pointsCount / 3))] + .fill(0) + .map((e, i) => i * 10) + : [...Array(pointsCount)].fill(0).map((e, i) => i * 10), + ), + timestamp: new Uint32Array( + context === 'val' + ? [1624564800000, 1624564850820, 1624564876596] + : [ + 1624564800000, 1624564821000, 1624564834070, 1624564850820, + 1624564857000, 1624564865427, 1624564876596, + ], + ), + }, + }; + }), + }); + } + + return runsContainer; +} + +function generateRunHash(prefix: string) { + let result = ''; + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; + const charactersLength = characters.length; + for (let i = 0; i < 8; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return `${prefix}${result}`; +} + +export default generateMetrics; diff --git a/src/src/services/api/metrics/metricsService.ts b/src/src/services/api/metrics/metricsService.ts new file mode 100644 index 00000000..3f72d511 --- /dev/null +++ b/src/src/services/api/metrics/metricsService.ts @@ -0,0 +1,50 @@ +import { IApiRequest } from 'types/services/services'; +import { IAlignMetricsDataParams } from 'types/services/models/metrics/metricsAppModel'; + +import API from '../api'; +// import generateMetrics from './metricsMock'; +// import { IRun } from 'types/services/models/metrics/runModel'; + +const endpoints = { + GET_METRICS: 'runs/search/metric', + GET_ALIGNED_METRICS: 'runs/search/metric/align', +}; + +function getMetricsData(params: {}): IApiRequest { + return API.getStream(endpoints.GET_METRICS, params); + + // We will not remove this part yet, though we will need to refactor mock data structure + // due to API schema changes + + // return { + // call: () => ({ + // then: (resolve: (data: IRun[]) => void, reject?: unknown) => { + // setTimeout(() => { + // const mock = generateMetrics(200, 100); + // resolve(mock); + // }, 1000); + // }, + // }), + // abort: () => null, + // }; +} + +function fetchAlignedMetricsData( + params: IAlignMetricsDataParams, +): IApiRequest { + return API.getStream>( + endpoints.GET_ALIGNED_METRICS, + params, + { + method: 'POST', + }, + ); +} + +const metricsService = { + endpoints, + getMetricsData, + fetchAlignedMetricsData, +}; + +export default metricsService; diff --git a/src/src/services/api/notes/notesService.ts b/src/src/services/api/notes/notesService.ts new file mode 100644 index 00000000..22a83b65 --- /dev/null +++ b/src/src/services/api/notes/notesService.ts @@ -0,0 +1,57 @@ +import { + INoteReqBody, + INote, + INotesList, +} from 'types/services/models/notes/notes'; +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + GET_NOTES_LIST: (run_id: string): string => `runs/${run_id}/note`, + CREATE_NOTE: (run_id: string): string => `runs/${run_id}/note`, + GET_SINGLE_NOTE: (run_id: string, note_id: number): string => + `runs/${run_id}/note/${note_id}`, + UPDATE_NOTE: (run_id: string, note_id: number): string => + `runs/${run_id}/note/${note_id}`, + DELETE_NOTE: (run_id: string, note_id: number): string => + `runs/${run_id}/note/${note_id}`, +}; + +function getNotes(runId: string): IApiRequest { + return API.get(endpoints.GET_NOTES_LIST(runId)); +} + +function createNote(runId: string, reqBody: INoteReqBody): IApiRequest { + return API.post(endpoints.CREATE_NOTE(runId), reqBody, { + headers: { 'Content-type': 'application/json' }, + }); +} + +function getSingleNote(runId: string, noteId: number): IApiRequest { + return API.get(endpoints.GET_SINGLE_NOTE(runId, noteId)); +} + +function updateNote( + runId: string, + noteId: number, + reqBody: INoteReqBody, +): IApiRequest { + return API.put(endpoints.UPDATE_NOTE(runId, noteId), reqBody, { + headers: { 'Content-type': 'application/json' }, + }); +} + +function deleteNote(runId: string, noteId: number): IApiRequest { + return API.delete(endpoints.DELETE_NOTE(runId, noteId)); +} + +const notesService = { + getNotes, + getSingleNote, + createNote, + updateNote, + deleteNote, +}; + +export default notesService; diff --git a/src/src/services/api/projects/projectsService.ts b/src/src/services/api/projects/projectsService.ts new file mode 100644 index 00000000..5aca1cd6 --- /dev/null +++ b/src/src/services/api/projects/projectsService.ts @@ -0,0 +1,57 @@ +import { + IPinnedSequencesResData, + IProject, + IProjectParamsMetrics, +} from 'types/services/models/projects/projectsModel'; +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + GET_PROJECTS: 'projects', + GET_ACTIVITIES: 'projects/activity', + GET_PROJECTS_PARAMS: 'projects/params', + PINNED_SEQUENCES: 'projects/pinned-sequences', +}; + +function getProjectsData(): IApiRequest { + return API.get(endpoints.GET_PROJECTS); +} + +function fetchActivityData(): IApiRequest { + return API.get(endpoints.GET_ACTIVITIES); +} + +function getProjectParams( + sequences: string[] = ['metric'], +): IApiRequest { + const query = sequences.reduce( + (acc: string, sequence: string, index: number) => { + acc += `${index === 0 ? '?' : '&'}sequence=${sequence}`; + return acc; + }, + '', + ); + return API.get(endpoints.GET_PROJECTS_PARAMS + query); +} + +function getPinnedSequences(): IApiRequest { + return API.get(endpoints.PINNED_SEQUENCES); +} + +function setPinnedSequences( + body: IPinnedSequencesResData, +): IApiRequest { + return API.post(endpoints.PINNED_SEQUENCES, body); +} + +const projectsService = { + endpoints, + getProjectsData, + fetchActivityData, + getProjectParams, + getPinnedSequences, + setPinnedSequences, +}; + +export default projectsService; diff --git a/src/src/services/api/runs/paramsMock.ts b/src/src/services/api/runs/paramsMock.ts new file mode 100644 index 00000000..e055ccf5 --- /dev/null +++ b/src/src/services/api/runs/paramsMock.ts @@ -0,0 +1,87 @@ +import COLORS from 'config/colors/colors'; + +import { encode } from 'utils/encoder/encoder'; +/* eslint-disable no-loop-func */ +function randomGenerateLineData(count: number, dimensions: any) { + const dKeys = Object.keys(dimensions); + const data: any = []; + let f = 0; + for (let i = 0; i < count; i++) { + let a = {}; + f++; + dKeys.forEach((key) => { + f = f + 1; + if (f % 13 === 0) { + //@ts-ignore + a[key] = null; + } else { + if (dimensions[key].scaleType === 'linear') { + //@ts-ignore + a[key] = getRandomIntInclusive(...dimensions[key].domainData); + } else { + //@ts-ignore + a[key] = + dimensions[key].domainData[ + getRandomDoubleInclusive(0, dimensions[key].domainData.length - 1) + ]; + } + } + }); + data.push({ + values: a, + key: encode({ a }), + color: COLORS[0][i % COLORS[0].length], + }); + } + + return { + dimensions, + data, + }; +} + +export const mockData = randomGenerateLineData(10, { + column1: { scaleType: 'linear', domainData: [2, 5.6] }, + column2: { + scaleType: 'point', + domainData: [ + '+inf', + 'None', + '12', + 'hinalsfhsaifhsaifhoasihfoiawhfiwahfoiawhfowihhinalsfhsaifhsaifhoasihfoiawhfiwahfoiawhfowihff', + '-inf', + ], + }, + column3: { scaleType: 'linear', domainData: [3, 5] }, + column4: { scaleType: 'linear', domainData: [1, 2] }, + column5: { scaleType: 'linear', domainData: [8, 22] }, + column6: { scaleType: 'linear', domainData: [45, 60] }, +}); + +export const mockData2 = randomGenerateLineData(15, { + column1: { scaleType: 'linear', domainData: [2, 5.6] }, + column2: { + scaleType: 'point', + domainData: [ + '+inf', + 'None', + '12', + 'hinalsfhsaifhsaifhoasihfoiawhfiwahfoiawhfowihhinalsfhsaifhsaifhoasihfoiawhfiwahfoiawhfowihff', + '-inf', + ], + }, + column3: { scaleType: 'linear', domainData: [3, 5] }, + column4: { scaleType: 'linear', domainData: [1, 2] }, + column5: { scaleType: 'linear', domainData: [8, 22] }, + column6: { scaleType: 'linear', domainData: [45, 60] }, +}); + +function getRandomIntInclusive(min: number, max: number) { + return Math.random() * (max - min) + min; +} + +function getRandomDoubleInclusive(min: number, max: number) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; +} diff --git a/src/src/services/api/runs/runsService.ts b/src/src/services/api/runs/runsService.ts new file mode 100644 index 00000000..777001f1 --- /dev/null +++ b/src/src/services/api/runs/runsService.ts @@ -0,0 +1,127 @@ +import { TraceType } from 'services/models/runs/types'; + +import API from '../api'; + +const endpoints = { + GET_RUNS: 'runs/search/run', + GET_EXPERIMENTS: 'experiments', + GET_RUN_INFO: (id: string) => `runs/${id}/info`, + GET_RUN_LOGS: (id: string) => `runs/${id}/logs`, + GET_RUN_METRICS_BATCH_BY_TRACES: (id: string) => + `runs/${id}/metric/get-batch`, + EDIT_RUN: (id: string) => `runs/${id}`, + ARCHIVE_RUNS: (archived: boolean) => `runs/archive-batch?archive=${archived}`, + DELETE_RUN: (id: string) => `runs/${id}`, + DELETE_RUNS: 'runs/delete-batch', + ATTACH_RUNS_TAG: (id: string) => `runs/${id}/tags/new`, + DELETE_RUNS_TAG: (id: string, tag_id: string) => `runs/${id}/tags/${tag_id}`, + GET_BATCH: (id: string, trace: string) => `runs/${id}/${trace}/get-batch`, + GET_BATCH_BY_STEP: (id: string, trace: string) => + `runs/${id}/${trace}/get-step`, +}; + +function getRunsData(query?: string, limit?: number, offset?: string) { + return API.getStream(endpoints.GET_RUNS, { + q: query || '', + ...(limit ? { limit } : {}), + ...(offset ? { offset } : {}), + }); +} + +function getRunLogs(id: string, record_range?: string) { + return API.getStream(endpoints.GET_RUN_LOGS(id), { + record_range: record_range ?? '', + }); +} + +function getRunInfo(id: string) { + return API.get(endpoints.GET_RUN_INFO(id)); +} + +function getExperimentsData() { + return API.get(endpoints.GET_EXPERIMENTS); +} + +function getRunMetricsBatch(body: any, id: string) { + return API.post(endpoints.GET_RUN_METRICS_BATCH_BY_TRACES(id), body); +} + +function archiveRun(id: string, archived: boolean = false) { + return API.put(endpoints.EDIT_RUN(id), { archived }); +} + +function editRunNameAndDescription( + id: string, + name: string, + description: string, + archived: boolean, +) { + return API.put(endpoints.EDIT_RUN(id), { name, description, archived }); +} + +function archiveRuns(ids: string[], archived: boolean = false) { + return API.post(endpoints.ARCHIVE_RUNS(archived), ids); +} + +function deleteRun(id: string) { + return API.delete(endpoints.DELETE_RUN(id)); +} + +function deleteRuns(ids: string[]) { + return API.post(endpoints.DELETE_RUNS, ids); +} + +function attachRunsTag(body: object, run_id: string) { + return API.post(endpoints.ATTACH_RUNS_TAG(run_id), body); +} + +function deleteRunsTag(run_id: string, tag_id: string) { + return API.delete(endpoints.DELETE_RUNS_TAG(run_id, tag_id)); +} + +function getBatch(run_id: string, trace: TraceType, params: any, body: any) { + return API.getStream1( + endpoints.GET_BATCH(run_id, trace), + params, + { + method: 'POST', + body, + }, + ); +} + +function getBatchByStep( + run_id: string, + trace: TraceType, + params: any, + body: any, +) { + return API.getStream1( + endpoints.GET_BATCH_BY_STEP(run_id, trace), + params, + { + method: 'POST', + body, + }, + ); +} + +const runsService = { + endpoints, + getBatch, + getBatchByStep, + getRunsData, + getRunInfo, + getRunLogs, + getRunMetricsBatch, + getExperimentsData, + archiveRun, + deleteRun, + attachRunsTag, + deleteRunsTag, + archiveRuns, + deleteRuns, + editRunNameAndDescription, +}; + +export default runsService; diff --git a/src/src/services/api/tags/tagsService.ts b/src/src/services/api/tags/tagsService.ts new file mode 100644 index 00000000..25d8c65f --- /dev/null +++ b/src/src/services/api/tags/tagsService.ts @@ -0,0 +1,70 @@ +import API from '../api'; + +const endpoints = { + GET_TAGS: 'tags', + GET_TAG: 'tags/', + CREATE_TAG: 'tags', + UPDATE_TAG: 'tags/', + GET_TAG_RUNS: (id: string) => `tags/${id}/runs`, +}; + +function getTags() { + return API.get(endpoints.GET_TAGS); +} + +function getTagRuns(id: string) { + return API.get(endpoints.GET_TAG_RUNS(id)); +} + +function createTag(body: object) { + return API.post(endpoints.GET_TAGS, body, { + headers: { + 'Content-Type': 'application/json', + }, + }); +} + +function updateTag(body: object, id: string) { + return API.put(endpoints.UPDATE_TAG + id, body, { + headers: { + 'Content-Type': 'application/json', + }, + }); +} + +function getTagById(id: string) { + return API.get(endpoints.GET_TAG + id); +} + +function hideTag(id: string, archived: boolean) { + return API.put( + endpoints.GET_TAG + id, + { archived }, + { + headers: { + 'Content-Type': 'application/json', + }, + }, + ); +} + +function deleteTag(id: string) { + return API.delete(endpoints.GET_TAG + id, { + headers: { + 'Content-Type': 'application/json', + }, + }); +} + +const tagsService = { + endpoints, + getTags, + createTag, + updateTag, + getTagById, + getTagRuns, + hideTag, + deleteTag, +}; + +export default tagsService; diff --git a/src/src/services/live-update/README.md b/src/src/services/live-update/README.md new file mode 100644 index 00000000..b41a896f --- /dev/null +++ b/src/src/services/live-update/README.md @@ -0,0 +1,39 @@ +## Usage + +````js + // to describe webpack as this is a worker file + import LUWorker from 'comlink-loader!./services/live-update/Worker'; + import { getDataFromTransferable } from 'services/live-update' + import * as Comlink from 'comlink'; + + function initizeWorker(subscriber) { + let worker = new LUWorker(); + + // set config [name, uri, delay, enableLog] + worker.setConfig('Runs', 'runs/search/run', 1000, true); + worker.subscribeToApiCallResult( + // if subscriber has a context, please bind to the context + Comlink.proxy(subscriber), + ); + + return worker; + } + + const subscriber = (data) => { + const obj = getDataFromTransferable(data); + console.log("DATA --- ", obj); + + // send to render + } + + const w = initizeWorker(subscriber); + + w.start({ q: 'test', limit: 50 }) + // some condition + w.stop().then().catch()// will pause to call + // some condition + // w.start({ q: 'test1', limit: 60 }).then().catch() + + // to terminate + w.close(); +```` \ No newline at end of file diff --git a/src/src/services/live-update/Worker.ts b/src/src/services/live-update/Worker.ts new file mode 100644 index 00000000..d0923b00 --- /dev/null +++ b/src/src/services/live-update/Worker.ts @@ -0,0 +1,274 @@ +/** + * @TODO improve logging, exception handling + */ + +/* eslint-disable no-console */ + +import * as Comlink from 'comlink'; + +import { setAPIBasePath, setAPIAuthToken } from 'config/config'; + +import { + decodeBufferPairs, + decodePathsVals, + iterFoldTree, +} from 'utils/encoder/streamEncoding'; + +import { + Scheduler, + ApiMethods, + ISubscriptions, + SubscriptionTypes, + WorkerApiCallResultSubscriber, +} from './types'; +import { + createGetStream, + createTransferableData, + invariantError, + invariantSuccess, +} from './utils'; + +/* + * Subscribers collection grouped by subscription type + * Currently type 'API_CALL_RESULT' is the only subscription type, + * but it is possible to add some types here + */ +let subscriptions: ISubscriptions = { + [SubscriptionTypes.API_CALL_RESULT]: [], +}; + +/* + * symbol to identify the worker instance + * can be useful for logs + */ +let key: Symbol; + +// delay +let schedulerDelay: number = 5000; + +// api url prefix +let url: string = ''; + +// scheduler +let schedule: Scheduler = { + timerId: null, + inProgress: false, +}; + +// api methods +let apiMethods: ApiMethods | null = null; + +// enable/disable logging +let logging = true; + +/** + * @external function subscribeToApiCallResult + * When using it from other thread + * it is no possible to send callback function using postMessage's parameter + * make callback function as a proxy using Comlink.proxy(callback), or implement proxy + * making it proxy is a chance to transfer callable native codes between different agents(threads, workers, ...) + * Useful when other threads, or internal methods have to listen api call's responses + * @param {WorkerApiCallResultSubscriber} subscriber - callback function to call after some event + */ +function subscribeToApiCallResult(subscriber: WorkerApiCallResultSubscriber) { + subscriptions[SubscriptionTypes.API_CALL_RESULT].push(subscriber); +} + +/** + * @internal + * function removeSubscribers + * Currently this function removes only subscribers grouped by 'API_CALL_RESULT' subscription + * Can be useful to reset instance of worker, make use for destroying instance + * @param {SubscriptionTypes} type - @TODO please refactor function body, if there is need to reset all subscriptions + */ +function removeSubscribers( + type: SubscriptionTypes = SubscriptionTypes.API_CALL_RESULT, +) { + subscriptions[type] = []; +} + +/** + * function transferApiCallResponse + * This function called once api response is ready, and need to send to subscribers + * @internal usage + * @param {ArrayLike} data - api call response, can be any + */ +function transferApiCallResponse(data: Array) { + if (subscriptions[SubscriptionTypes.API_CALL_RESULT].length) { + const transferable = createTransferableData(data); + subscriptions[SubscriptionTypes.API_CALL_RESULT].forEach( + (subscriber: WorkerApiCallResultSubscriber) => { + subscriber( + Comlink.transfer(transferable.buffer, [transferable.buffer]), + ); + }, + ); + } +} + +function clearScheduler() { + if (schedule.timerId) { + clearTimeout(schedule.timerId); + } + schedule = { + timerId: null, + inProgress: false, + }; +} + +function updateSchedule(timerId: number) { + schedule = { + timerId, + inProgress: true, + }; +} + +/** + * @internal + * schedule periodic function call + * @param {(q: string) => Promise} f - callback + */ +function scheduler(f: (q: string) => Promise) { + // @TODO improve + // now this will call every for delay ms, need to create delay after each other + + const timerId = setTimeout(f, schedulerDelay); + schedule = { + timerId, + inProgress: false, + }; +} + +/** + * @external function stop + * stop worker processes + * currently there is a single process (api call) + * calling stop function will abort the call, and will pause scheduler + * @return {Promise} - abort promise + */ +async function stop(): Promise { + try { + clearScheduler(); + if (apiMethods) { + await apiMethods.abort(); + apiMethods = null; + } + invariantSuccess(`Stopped ${key.toString()} success`, logging); + } catch (e: Error | any) { + clearScheduler(); + invariantError(e, logging); + throw e; + } +} + +/** + * @external function start + * @param {Object} params - params to send with http request + */ +function start(params: Object = {}): void { + apiMethods = createGetStream(url, params); + invariantSuccess(`Started ${key.toString()} success`, logging); + + scheduler(startUpdateCall); +} + +/** + * @internal + */ +async function startUpdateCall(): Promise { + // calculate nec-s; + const timerId = setTimeout(startUpdateCall, schedulerDelay); + try { + logging && console.time(`${key.toString()} operated`); + const stream = await apiMethods?.call(); + let bufferPairs = decodeBufferPairs(stream); + let decodedPairs = decodePathsVals(bufferPairs); + let objects = iterFoldTree(decodedPairs, 1); + + const data = []; + + for await (let [keys, val] of objects) { + const d: any = val; + data.push({ ...d, hash: keys[0] } as any); + } + + logging && console.timeEnd(`${key.toString()} operated`); + transferApiCallResponse(data); + + // @ts-ignore + updateSchedule(timerId); + } catch (e) { + // @ts-ignore + updateSchedule(timerId); + invariantError(e, logging); + // throw e; remove comment once there will be handle error out of worker + } +} + +/** + * @external function close + * function close + * close function is useful for cleanup, when worker has not usage + * close function will + * removes all subscribers + * removes internal objects to reduce garbage collector iterations + * terminate the worker + * Alternative is myWorkerInstanceProxy[Comlink.releaseProxy]() + * this will detach the proxy and the exposed object from the message channel, allowing both ends to be garbage collected. + * Will be useful when there is no need to terminate, just need to remove js proxies to temporarily cleanup the heap + */ +function close() { + // maybe this is no need, depends on terminated/released + removeSubscribers(); + + // eslint-disable-next-line no-restricted-globals + self.close(); +} + +/** + * @TODO make chance to set config as constructor parameters + * @external function setConfig + * function setConfig + * @param {string} name - the name to unify worker + * @param {string} endpoint - http call endpoint + * @param {number} delay - delay (milliseconds) + * @param {boolean} enableLog - enable/disable logging - default is disabled + */ +const setConfig = ( + name: string, + endpoint: string, + delay: number = 5000, + enableLog = false, +) => { + key = Symbol(`app.live.update.${name}`); + logging = enableLog; + url = endpoint; + schedulerDelay = delay; +}; + +export function errorHandler(error: ResponseType) { + invariantError(error, logging); +} + +function replaceBasePath(basePath: string) { + setAPIBasePath(basePath); +} + +function setAuthToken(authToken: string) { + setAPIAuthToken(authToken); +} + +const WebWorker = { + subscribeToApiCallResult, + setConfig, + start, + close, + stop, + replaceBasePath, + setAuthToken, +}; + +export type IWorker = typeof WebWorker; + +// @ts-ignore +Comlink.expose(WebWorker); diff --git a/src/src/services/live-update/examples/LiveUpdateBridge.example.js b/src/src/services/live-update/examples/LiveUpdateBridge.example.js new file mode 100644 index 00000000..1b207fb0 --- /dev/null +++ b/src/src/services/live-update/examples/LiveUpdateBridge.example.js @@ -0,0 +1,103 @@ +/** + * @see README.md for more details + */ +/* eslint-disable no-console */ + +import * as Comlink from 'comlink'; + +// eslint-disable-next-line import/no-webpack-loader-syntax +import LUWorker from 'comlink-loader!../Worker'; + +import { getDataFromTransferable } from '../utils'; + +const embeddedAppNames = { + runs: { + name: 'Runs', + endpoint: 'runs/search/run', + }, + metrics: { + name: 'Metrics', + endpoint: 'runs/search/metric', + }, + params: { + name: 'Params', + endpoint: 'runs/search/run', + }, + scatters: { + name: 'Scatters', + endpoint: 'runs/search/run', + }, +}; + +class UpdateService { + constructor(appName, responseListener, delay) { + this.appName = appName; + this.delay = delay; + this.responseListener = responseListener; + + this.instance = new LUWorker(); + this.instance.replaceBasePath(window.API_BASE_PATH); + this.instance.setAuthToken(localStorage.getItem('Auth') || ''); + this.instance.setConfig( + appName, + embeddedAppNames[this.appName].endpoint, + delay, + process.env.NODE_ENV === 'development', + ); + this.instance.subscribeToApiCallResult( + Comlink.proxy(this.responseHandler.bind(this)), + ); + } + + async stop() { + if (this.inProgress) { + try { + const stopResult = await this.instance.stop(); + this.inProgress = false; + return stopResult; + } catch (e) { + console.log("---- couldn't stop worker"); + } + } + } + + start(params) { + this.inProgress = true; + this.instance + .start({ ...params, report_progress: 'False' }) + .then() + .catch((e) => { + console.log('worker start exception --> ', e); + }); + } + + responseHandler(data) { + const obj = getDataFromTransferable(data); + + this.responseListener(obj); + } + + changeDelay(delay) { + this.stop() + .catch(() => { + console.log("---- couldn't change config"); + }) + .finally(() => { + this.instance.setConfig( + this.appName, + embeddedAppNames[this.appName].endpoint, + delay, + process.env.NODE_ENV === 'development', + ); + }); + } + + clear() { + this.stop().finally(() => { + this.instance.close(); + this.instance[Comlink.releaseProxy](); + }); + } +} + +export default UpdateService; diff --git a/src/src/services/live-update/index.ts b/src/src/services/live-update/index.ts new file mode 100644 index 00000000..c92ddad8 --- /dev/null +++ b/src/src/services/live-update/index.ts @@ -0,0 +1,9 @@ +import LiveUpdateService from './examples/LiveUpdateBridge.example'; +import { createTransferableData, getDataFromTransferable } from './utils'; +import { WorkerApiCallResultSubscriber } from './types'; + +export { createTransferableData, getDataFromTransferable }; + +export type Subscriber = WorkerApiCallResultSubscriber; + +export default LiveUpdateService; diff --git a/src/src/services/live-update/types.ts b/src/src/services/live-update/types.ts new file mode 100644 index 00000000..b989b42a --- /dev/null +++ b/src/src/services/live-update/types.ts @@ -0,0 +1,31 @@ +export enum SubscriptionTypes { + API_CALL_RESULT = 'API_CALL_RESULT', +} + +export type ExceptionHandler = (error: ResponseType) => void; + +export type ApiMethods = { + call: (exceptionHandler?: ExceptionHandler) => Promise; + abort: () => void; +}; + +export type Scheduler = { + timerId: null | number; + inProgress: boolean; +}; + +export type WorkerApiCallResultSubscriber = (data: ArrayBufferLike) => void; + +export interface IScheduler { + timerId: number | null; + inProgress: boolean; +} + +export interface ApiRequestParams { + query: string; + limit: number; +} + +export interface ISubscriptions { + [SubscriptionTypes.API_CALL_RESULT]: WorkerApiCallResultSubscriber[]; +} diff --git a/src/src/services/live-update/utils.ts b/src/src/services/live-update/utils.ts new file mode 100644 index 00000000..d7af4cdb --- /dev/null +++ b/src/src/services/live-update/utils.ts @@ -0,0 +1,115 @@ +/* eslint-disable no-console */ + +import API from 'services/api/api'; + +import { IApiRequest } from 'types/services/services'; + +const LogTypes = { + log: 'black', + error: 'red', + success: 'green', +}; + +enum LogTypeNames { + log = 'log', + error = 'error', + success = 'success', +} + +export function log( + message: string | Error | typeof Error, + type: LogTypeNames = LogTypeNames.log, +): void { + console.log(`%c ${message}`, `color: ${LogTypes[type]}`); +} + +export function invariantSuccess(message: string, condition: boolean): void { + if (condition) { + log(message, LogTypeNames.success); + } +} + +export function invariantError( + exception: string | Error | typeof Error, + condition: boolean, +): void { + if (condition) { + log(exception, LogTypeNames.error); + } +} + +/** + * function createGetStream + * Useful to dynamically create {call, abort} methods + * @param {String} endpoint - uri + * @param {Object} params - parameters to send with http call + */ +export function createGetStream( + endpoint: string, + params: Object, +): IApiRequest { + return API.getStream(endpoint, params); +} + +/** + * @internal function arrayBufferToString + * Converts an ArrayBuffer to a String. + * @param buffer - Buffer to convert. + * @returns String. + */ +function arrayBufferToString(buffer: ArrayBuffer): string { + return String.fromCharCode.apply(null, Array.from(new Uint8Array(buffer))); +} + +/** + * @internal function stringToArrayBuffer + * Converts a String to an ArrayBuffer. + * @param str - String to convert. + * @returns ArrayBuffer. + */ +function stringToArrayBuffer(str: string): ArrayBuffer { + const stringLength = str.length; + const buffer = new ArrayBuffer(stringLength); + const bufferView = new Uint8Array(buffer); + for (let i = 0; i < stringLength; i++) { + bufferView[i] = str.charCodeAt(i); + } + return bufferView; +} + +/** + * createTransferableData + * Useful to convert transferable data to non-transferable getting from Worker + * @param {ArrayBufferLike} data - buffer + * convert buffer to JSON parse result + */ +export function createTransferableData(data: any): Buffer { + const stringData = JSON.stringify(data, (k: string, v) => { + if (k === 'blob') { + return arrayBufferToString(v); + } + + return v; + }); + + return Buffer.from(stringData, 'utf-8'); +} + +/** + * getDataFromTransferable + * Useful to convert transferable data to non-transferable getting from Worker + * @param {ArrayBufferLike} data - buffer + * convert buffer to JSON parse result + */ +export function getDataFromTransferable(data: ArrayBufferLike): any { + const view = new DataView(data, 0, data.byteLength); + const decoder = new TextDecoder('utf-8'); + const string = decoder.decode(view.buffer); + + return JSON.parse(string, (k, v) => { + if (k === 'blob') { + return stringToArrayBuffer(v); + } + return v; + }); +} diff --git a/src/src/services/models/bookmarks/bookmarksAppModel.ts b/src/src/services/models/bookmarks/bookmarksAppModel.ts new file mode 100644 index 00000000..b1a5a763 --- /dev/null +++ b/src/src/services/models/bookmarks/bookmarksAppModel.ts @@ -0,0 +1,132 @@ +import dashboardService from 'services/api/dashboard/dashboardService'; +import appsService from 'services/api/apps/appsService'; + +import { IBookmarksAppModelState } from 'types/services/models/bookmarks/bookmarksAppModel'; +import { IBookmarksData } from 'types/pages/bookmarks/Bookmarks'; + +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; + +import createModel from '../model'; + +let bookmarksRequestRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; +}; + +const model = createModel({ + isLoading: true, + listData: [], + notifyData: [], +}); + +function getBookmarksData() { + const { call, abort } = dashboardService.fetchDashboardsList(); + return { + call: () => + call().then(async (data: any) => { + try { + const appsList = await appsService + .fetchAppsList() + .call((detail: any) => { + exceptionHandler({ detail, model: model as any }); + }); + const listData = data.map((item: any) => { + const app = appsList.find( + (appData: any) => appData.id === item.app_id, + ); + return { ...item, select: app.state.select, type: app.type }; + }); + model.setState({ + isLoading: false, + listData, + }); + } catch (err: any) { + onNotificationAdd({ + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + model: model as any, + }); + } + model.setState({ isLoading: false }); + }), + + abort, + }; +} + +function onBookmarksNotificationDelete(id: number) { + onNotificationDelete({ id, model }); +} + +async function onBookmarkDelete(id: string) { + try { + model.setState({ isLoading: true }); + await dashboardService.deleteDashboard(id).call((detail: any) => { + exceptionHandler({ detail, model }); + }); + const listData: IBookmarksData[] | any = model.getState()?.listData; + const newListData = [...listData].filter((bookmark) => bookmark.id !== id); + model.setState({ + listData: newListData, + isLoading: false, + }); + } catch (err: any) { + model.setState({ + isLoading: false, + }); + onNotificationAdd({ + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + model: model as any, + }); + } +} + +function initialize() { + model.init(); + try { + bookmarksRequestRef = getBookmarksData(); + bookmarksRequestRef.call((detail) => { + exceptionHandler({ detail, model: model as any }); + model.setState({ + isLoading: false, + }); + }); + } catch (err: any) { + onNotificationAdd({ + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + model: model as any, + }); + model.setState({ + isLoading: false, + }); + bookmarksRequestRef.abort(); + } +} + +function destroy() { + bookmarksRequestRef.abort(); + model.destroy(); +} +const bookmarkAppModel = { + ...model, + initialize, + destroy, + getBookmarksData, + onBookmarkDelete, + onBookmarksNotificationDelete, +}; + +export default bookmarkAppModel; diff --git a/src/src/services/models/explorer/config.ts b/src/src/services/models/explorer/config.ts new file mode 100644 index 00000000..2a3620c4 --- /dev/null +++ b/src/src/services/models/explorer/config.ts @@ -0,0 +1,324 @@ +import _ from 'lodash-es'; + +import { TABLE_DEFAULT_CONFIG } from 'config/table/tableConfigs'; +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { IModel } from 'types/services/models/model'; +import { + IAppInitialConfig, + IAppModelConfig, + IAppModelState, +} from 'types/services/models/explorer/createAppModel'; +import { IApiRequest } from 'types/services/services'; +import { IAppData } from 'types/services/models/metrics/metricsAppModel'; + +import { ChartTypeEnum } from 'utils/d3'; +import setDefaultAppConfigData from 'utils/app/setDefaultAppConfigData'; +import getAppConfigData from 'utils/app/getAppConfigData'; + +import createModel from '../model'; + +import { AppDataTypeEnum, AppNameEnum } from './index'; + +function initializeAppModel(appConfig: IAppInitialConfig): InitialAppModelType { + const { appName, dataType, grouping, components, selectForm } = appConfig; + + const model = createModel({ + requestStatus: RequestStatusEnum.NotRequested, + requestProgress: { + matched: 0, + checked: 0, + trackedRuns: 0, + }, + selectFormData: { options: undefined, suggestions: [] }, + config: getConfig(), + }); + + let appRequest: { + call: () => Promise; + abort: () => void; + }; + + function getConfig(): IAppModelConfig { + switch (dataType) { + case AppDataTypeEnum.METRICS: { + const config: IAppModelConfig = { + liveUpdate: { + delay: 10000, + enabled: false, + }, + }; + if (grouping) { + config.grouping = { + color: [], + stroke: [], + chart: ['name'], + reverseMode: { + color: false, + stroke: false, + chart: false, + }, + isApplied: { + color: true, + stroke: true, + chart: true, + }, + persistence: { + color: false, + stroke: false, + }, + seed: { + color: 10, + stroke: 10, + }, + paletteIndex: 0, + }; + } + if (components?.table) { + config.table = { + resizeMode: TABLE_DEFAULT_CONFIG.metrics.resizeMode, + rowHeight: TABLE_DEFAULT_CONFIG.metrics.rowHeight, + sortFields: [...TABLE_DEFAULT_CONFIG.metrics.sortFields], + hiddenMetrics: [...TABLE_DEFAULT_CONFIG.metrics.hiddenMetrics], + hiddenColumns: [...TABLE_DEFAULT_CONFIG.metrics.hiddenColumns], + columnsWidths: { tags: 300 }, + columnsOrder: { + left: [...TABLE_DEFAULT_CONFIG.metrics.columnsOrder.left], + middle: [...TABLE_DEFAULT_CONFIG.metrics.columnsOrder.middle], + right: [...TABLE_DEFAULT_CONFIG.metrics.columnsOrder.right], + }, + height: TABLE_DEFAULT_CONFIG.metrics.height, + }; + } + if (components?.charts?.[0]) { + if (components.charts.indexOf(ChartTypeEnum.LineChart) !== -1) { + config.chart = { + highlightMode: CONTROLS_DEFAULT_CONFIG.metrics.highlightMode, + ignoreOutliers: CONTROLS_DEFAULT_CONFIG.metrics.ignoreOutliers, + zoom: { + active: CONTROLS_DEFAULT_CONFIG.metrics.zoom.active, + mode: CONTROLS_DEFAULT_CONFIG.metrics.zoom.mode, + history: [], + }, + axesScaleType: { + xAxis: CONTROLS_DEFAULT_CONFIG.metrics.axesScaleType.xAxis, + yAxis: CONTROLS_DEFAULT_CONFIG.metrics.axesScaleType.yAxis, + }, + axesScaleRange: { + yAxis: CONTROLS_DEFAULT_CONFIG.metrics.axesScaleRange.yAxis, + xAxis: CONTROLS_DEFAULT_CONFIG.metrics.axesScaleRange.xAxis, + }, + smoothing: { + algorithm: CONTROLS_DEFAULT_CONFIG.metrics.smoothing.algorithm, + factor: CONTROLS_DEFAULT_CONFIG.metrics.smoothing.factor, + curveInterpolation: + CONTROLS_DEFAULT_CONFIG.metrics.smoothing.curveInterpolation, + isApplied: CONTROLS_DEFAULT_CONFIG.metrics.smoothing.isApplied, + }, + alignmentConfig: { + metric: CONTROLS_DEFAULT_CONFIG.metrics.alignmentConfig.metric, + type: CONTROLS_DEFAULT_CONFIG.metrics.alignmentConfig.type, + }, + densityType: CONTROLS_DEFAULT_CONFIG.metrics.densityType, + aggregationConfig: { + methods: { + area: CONTROLS_DEFAULT_CONFIG.metrics.aggregationConfig + .methods.area, + line: CONTROLS_DEFAULT_CONFIG.metrics.aggregationConfig + .methods.line, + }, + isApplied: + CONTROLS_DEFAULT_CONFIG.metrics.aggregationConfig.isApplied, + isEnabled: + CONTROLS_DEFAULT_CONFIG.metrics.aggregationConfig.isEnabled, + }, + tooltip: { + appearance: CONTROLS_DEFAULT_CONFIG.metrics.tooltip.appearance, + display: CONTROLS_DEFAULT_CONFIG.metrics.tooltip.display, + selectedFields: + CONTROLS_DEFAULT_CONFIG.metrics.tooltip.selectedFields, + }, + legends: { + display: CONTROLS_DEFAULT_CONFIG.metrics.legends.display, + mode: CONTROLS_DEFAULT_CONFIG.metrics.legends.mode, + }, + focusedState: { + key: null, + xValue: null, + yValue: null, + active: false, + chartIndex: null, + }, + }; + } + } + + if (selectForm) { + config.select = { + options: [], + query: '', + advancedMode: false, + advancedQuery: '', + }; + } + return config; + } + case AppDataTypeEnum.RUNS: { + const config: IAppModelConfig = { + liveUpdate: { + delay: 10000, + enabled: false, + }, + }; + if (grouping) { + config.grouping = { + color: [], + stroke: [], + chart: [], + reverseMode: { + color: false, + stroke: false, + chart: false, + }, + isApplied: { + color: true, + stroke: true, + chart: true, + }, + persistence: { + color: false, + stroke: false, + }, + seed: { + color: 10, + stroke: 10, + }, + paletteIndex: 0, + }; + } + if (components?.table) { + config.table = { + metricsValueKey: TABLE_DEFAULT_CONFIG.runs.metricsValueKey, + rowHeight: TABLE_DEFAULT_CONFIG.runs.rowHeight, + hideSystemMetrics: TABLE_DEFAULT_CONFIG.runs.hideSystemMetrics, + hiddenMetrics: TABLE_DEFAULT_CONFIG.runs.hiddenMetrics, + hiddenColumns: TABLE_DEFAULT_CONFIG.runs.hiddenColumns, + sortFields: [...TABLE_DEFAULT_CONFIG.runs.sortFields], + columnsWidths: { tags: 300 }, + columnsColorScales: {}, + columnsOrder: { + left: [...TABLE_DEFAULT_CONFIG.runs.columnsOrder.left], + middle: [...TABLE_DEFAULT_CONFIG.runs.columnsOrder.middle], + right: [...TABLE_DEFAULT_CONFIG.runs.columnsOrder.right], + }, + resizeMode: TABLE_DEFAULT_CONFIG.runs.resizeMode, + height: TABLE_DEFAULT_CONFIG.runs.height, + }; + if (appName === AppNameEnum.RUNS) { + config.pagination = { + limit: 45, + offset: null, + isLatest: false, + }; + } + } + if (components?.charts?.[0]) { + if (components.charts.indexOf(ChartTypeEnum.HighPlot) !== -1) { + config.chart = { + curveInterpolation: + CONTROLS_DEFAULT_CONFIG.params.curveInterpolation, + isVisibleColorIndicator: + CONTROLS_DEFAULT_CONFIG.params.isVisibleColorIndicator, + focusedState: { + key: null, + xValue: null, + yValue: null, + active: false, + chartIndex: null, + }, + tooltip: { + appearance: CONTROLS_DEFAULT_CONFIG.params.tooltip.appearance, + display: CONTROLS_DEFAULT_CONFIG.params.tooltip.display, + selectedFields: + CONTROLS_DEFAULT_CONFIG.params.tooltip.selectedFields, + }, + brushExtents: {}, + }; + } + if (components.charts.indexOf(ChartTypeEnum.ScatterPlot) !== -1) { + config.table = { + ...config?.table!, + resizeMode: TABLE_DEFAULT_CONFIG.scatters.resizeMode, + }; + config.chart = { + focusedState: { + key: null, + xValue: null, + yValue: null, + active: false, + chartIndex: null, + }, + tooltip: { + appearance: CONTROLS_DEFAULT_CONFIG.scatters.tooltip.appearance, + display: CONTROLS_DEFAULT_CONFIG.scatters.tooltip.display, + selectedFields: + CONTROLS_DEFAULT_CONFIG.scatters.tooltip.selectedFields, + }, + trendlineOptions: { + type: CONTROLS_DEFAULT_CONFIG.scatters.trendlineOptions.type, + bandwidth: + CONTROLS_DEFAULT_CONFIG.scatters.trendlineOptions.bandwidth, + isApplied: + CONTROLS_DEFAULT_CONFIG.scatters.trendlineOptions.isApplied, + }, + }; + } + } + if (selectForm) { + config.select = { + options: [], + query: '', + advancedMode: false, + advancedQuery: '', + }; + } + //TODO solve the problem with keeping table config after switching from Scatters explore to Params explore. But the solution is temporal + return _.cloneDeep(config); + } + default: + return {}; + } + } + + function setModelDefaultAppConfigData( + recoverTableState: boolean = true, + ): void { + setDefaultAppConfigData({ + config: getConfig(), + appInitialConfig: appConfig, + model, + recoverTableState, + }); + } + + function getModelAppConfigData(appId: string): IApiRequest { + return getAppConfigData({ appId, appRequest, config: getConfig(), model }); + } + + return { + model, + getConfig, + setModelDefaultAppConfigData, + getModelAppConfigData, + }; +} + +export type InitialAppModelType = { + model: IModel; + getConfig: () => IAppModelConfig; + setModelDefaultAppConfigData: (recoverTableState?: boolean) => void; + getModelAppConfigData: (appId: string) => IApiRequest; +}; + +export default initializeAppModel; diff --git a/src/src/services/models/explorer/createAppModel.ts b/src/src/services/models/explorer/createAppModel.ts new file mode 100644 index 00000000..ded2276d --- /dev/null +++ b/src/src/services/models/explorer/createAppModel.ts @@ -0,0 +1,54 @@ +/** + * function createAppModel has 2 major functionalities: + * 1. getConfig() function which depends on appInitialConfig returns corresponding config state + * 2. getAppModelMethods() function which depends on appInitialConfig returns corresponding methods + * @appConfig {IAppInitialConfig} - the config which describe app model + */ + +import { IAppInitialConfig } from 'types/services/models/explorer/createAppModel'; + +import initializeAppModel from './config'; +import getRunsModelMethods from './runsModelMethods'; +import getParamsModelMethods from './paramsModelMethods'; +import getScattersModelMethods from './scattersModelMethods'; +import getMetricsAppModelMethods from './metricsModelMethods'; + +import { AppDataTypeEnum, AppNameEnum } from './index'; + +function createAppModel(appConfig: IAppInitialConfig) { + const { appName, dataType } = appConfig; + + const initialApp = initializeAppModel(appConfig); + const { model } = initialApp; + + function getRunsAppModelMethods() { + switch (appName) { + case AppNameEnum.PARAMS: + return getParamsModelMethods(initialApp, appConfig); + case AppNameEnum.RUNS: + return getRunsModelMethods(initialApp, appConfig); + case AppNameEnum.SCATTERS: + return getScattersModelMethods(initialApp, appConfig); + default: + return {}; + } + } + + function getAppModelMethods() { + switch (dataType) { + case AppDataTypeEnum.METRICS: + return getMetricsAppModelMethods(initialApp, appConfig); + case AppDataTypeEnum.RUNS: + return getRunsAppModelMethods(); + default: + return {}; + } + } + + return { + ...model, + ...getAppModelMethods(), + }; +} + +export default createAppModel; diff --git a/src/src/services/models/explorer/index.ts b/src/src/services/models/explorer/index.ts new file mode 100644 index 00000000..00717ad6 --- /dev/null +++ b/src/src/services/models/explorer/index.ts @@ -0,0 +1,66 @@ +import { IAppInitialConfig } from 'types/services/models/explorer/createAppModel'; + +import { ChartTypeEnum } from 'utils/d3'; + +import createAppModel from './createAppModel'; + +/** + * Constants and enums we can create and export from this file + */ + +export enum AppDataTypeEnum { + RUNS = 'runs', + METRICS = 'metrics', + IMAGES = 'images', +} + +export enum AppNameEnum { + METRICS = 'metrics', + PARAMS = 'params', + RUNS = 'runs', + IMAGES = 'images', + SCATTERS = 'scatters', + FIGURES = 'figures', + AUDIOS = 'audios', + TEXT = 'text', +} + +/** + * appInitialConfig is config object which describes our app models + * @appInitialConfig { [key: string]: IAppInitialConfig } + */ + +const appInitialConfig: { + [key: string]: IAppInitialConfig; +} = { + METRICS: { + dataType: AppDataTypeEnum.METRICS, + selectForm: AppNameEnum.METRICS, + grouping: true, + appName: AppNameEnum.METRICS, + components: { table: true, charts: [ChartTypeEnum.LineChart] }, + }, + PARAMS: { + dataType: AppDataTypeEnum.RUNS, + selectForm: AppNameEnum.RUNS, + grouping: true, + appName: AppNameEnum.PARAMS, + components: { table: true, charts: [ChartTypeEnum.HighPlot] }, + }, + RUNS: { + dataType: AppDataTypeEnum.RUNS, + selectForm: AppNameEnum.RUNS, + grouping: false, + appName: AppNameEnum.RUNS, + components: { table: true }, + }, + SCATTERS: { + dataType: AppDataTypeEnum.RUNS, + selectForm: AppNameEnum.RUNS, + grouping: true, + appName: AppNameEnum.SCATTERS, + components: { table: true, charts: [ChartTypeEnum.ScatterPlot] }, + }, +}; + +export { createAppModel, appInitialConfig }; diff --git a/src/src/services/models/explorer/metricsModelMethods.ts b/src/src/services/models/explorer/metricsModelMethods.ts new file mode 100644 index 00000000..d2b8d5bd --- /dev/null +++ b/src/src/services/models/explorer/metricsModelMethods.ts @@ -0,0 +1,1798 @@ +import moment from 'moment'; +import { saveAs } from 'file-saver'; +import _ from 'lodash-es'; + +import { IAxesScaleRange } from 'components/AxesPropsPopover'; + +import COLORS from 'config/colors/colors'; +import DASH_ARRAYS from 'config/dash-arrays/dashArrays'; +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { DensityOptions } from 'config/enums/densityEnum'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_EXPORTING_FORMAT, TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { getSuggestionsByExplorer } from 'config/monacoConfig/monacoConfig'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + getMetricsTableColumns, + metricsTableRowRenderer, +} from 'pages/Metrics/components/MetricsTableGrid/MetricsTableGrid'; + +import * as analytics from 'services/analytics'; +import metricsService from 'services/api/metrics/metricsService'; +import runsService from 'services/api/runs/runsService'; +import createMetricModel from 'services/models/metrics/metricModel'; +import { createRunModel } from 'services/models/metrics/runModel'; +import LiveUpdateService from 'services/live-update/examples/LiveUpdateBridge.example'; +import projectsService from 'services/api/projects/projectsService'; + +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { ILine } from 'types/components/LineChart/LineChart'; +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { IMetric } from 'types/services/models/metrics/metricModel'; +import { + IAggregationConfig, + IChartZoom, + IGroupingSelectOption, + IMetricAppModelState, + IMetricsCollection, + IMetricTableRowData, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, + ISmoothing, + ITooltip, + LegendsConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { + IMetricTrace, + IRun, + ISequence, +} from 'types/services/models/metrics/runModel'; +import { IModel } from 'types/services/models/model'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { + IAppInitialConfig, + IAppModelConfig, + IAppModelState, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { IApiRequest } from 'types/services/services'; +import { ITagInfo, ITagProps } from 'types/pages/tags/Tags'; + +import { + aggregateGroupData, + AggregationAreaMethods, +} from 'utils/aggregateGroupData'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import getAggregatedData from 'utils/app/getAggregatedData'; +import getChartTitleData from 'utils/app/getChartTitleData'; +import { getFilteredGroupingOptions } from 'utils/app/getFilteredGroupingOptions'; +import getFilteredRow from 'utils/app/getFilteredRow'; +import { getGroupingPersistIndex } from 'utils/app/getGroupingPersistIndex'; +import getGroupingSelectOptions from 'utils/app/getGroupingSelectOptions'; +import getQueryStringFromSelect from 'utils/app/getQueryStringFromSelect'; +import getRunData from 'utils/app/getRunData'; +import onAggregationConfigChange from 'utils/app/onAggregationConfigChange'; +import onAlignmentMetricChange from 'utils/app/onAlignmentMetricChange'; +import onAlignmentTypeChange from 'utils/app/onAlignmentTypeChange'; +import onAxesScaleTypeChange from 'utils/app/onAxesScaleTypeChange'; +import onChangeTooltip from 'utils/app/onChangeTooltip'; +import onColumnsOrderChange from 'utils/app/onColumnsOrderChange'; +import onColumnsVisibilityChange from 'utils/app/onColumnsVisibilityChange'; +import onGroupingApplyChange from 'utils/app/onGroupingApplyChange'; +import onGroupingModeChange from 'utils/app/onGroupingModeChange'; +import onGroupingPaletteChange from 'utils/app/onGroupingPaletteChange'; +import onGroupingPersistenceChange from 'utils/app/onGroupingPersistenceChange'; +import onGroupingReset from 'utils/app/onGroupingReset'; +import onGroupingSelectChange from 'utils/app/onGroupingSelectChange'; +import onHighlightModeChange from 'utils/app/onHighlightModeChange'; +import onIgnoreOutliersChange from 'utils/app/onIgnoreOutliersChange'; +import onSelectOptionsChange from 'utils/app/onSelectOptionsChange'; +import onMetricVisibilityChange from 'utils/app/onMetricsVisibilityChange'; +import onRowHeightChange from 'utils/app/onRowHeightChange'; +import onRowVisibilityChange from 'utils/app/onRowVisibilityChange'; +import onSelectAdvancedQueryChange from 'utils/app/onSelectAdvancedQueryChange'; +import onSelectRunQueryChange from 'utils/app/onSelectRunQueryChange'; +import onSmoothingChange from 'utils/app/onSmoothingChange'; +import { onTableDiffShow } from 'utils/app/onTableDiffShow'; +import { onTableResizeEnd } from 'utils/app/onTableResizeEnd'; +import onTableResizeModeChange from 'utils/app/onTableResizeModeChange'; +import onTableRowClick from 'utils/app/onTableRowClick'; +import onTableRowHover from 'utils/app/onTableRowHover'; +import onTableSortChange from 'utils/app/onTableSortChange'; +import onZoomChange from 'utils/app/onZoomChange'; +import setAggregationEnabled from 'utils/app/setAggregationEnabled'; +import toggleSelectAdvancedMode from 'utils/app/toggleSelectAdvancedMode'; +import updateColumnsWidths from 'utils/app/updateColumnsWidths'; +import updateSortFields from 'utils/app/updateTableSortFields'; +import contextToString from 'utils/contextToString'; +import { AlignmentOptionsEnum, ChartTypeEnum, HighlightEnum } from 'utils/d3'; +import { filterMetricsData } from 'utils/app/filterMetricData'; +import { formatValue } from 'utils/formatValue'; +import getClosestValue from 'utils/getClosestValue'; +import getObjectPaths from 'utils/getObjectPaths'; +import getSmoothenedData from 'utils/getSmoothenedData'; +import JsonToCSV from 'utils/JsonToCSV'; +import { setItem } from 'utils/storage'; +import { encode } from 'utils/encoder/encoder'; +import onBookmarkCreate from 'utils/app/onBookmarkCreate'; +import onBookmarkUpdate from 'utils/app/onBookmarkUpdate'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import onResetConfigData from 'utils/app/onResetConfigData'; +import onShuffleChange from 'utils/app/onShuffleChange'; +import setComponentRefs from 'utils/app/setComponentRefs'; +import updateURL from 'utils/app/updateURL'; +import onDensityTypeChange from 'utils/app/onDensityTypeChange'; +import getValueByField from 'utils/getValueByField'; +import getTooltipContent from 'utils/getTooltipContent'; +import { getValue } from 'utils/helper'; +import onRowSelect from 'utils/app/onRowSelect'; +import { SortField } from 'utils/getSortedFields'; +import onRunsTagsChange from 'utils/app/onRunsTagsChange'; +import { + alignByAbsoluteTime, + alignByCustomMetric, + alignByEpoch, + alignByRelativeTime, + alignByStep, +} from 'utils/app/alignMetricData'; +import setRequestProgress from 'utils/app/setRequestProgress'; +import onAxesScaleRangeChange from 'utils/app/onAxesScaleRangeChange'; +import getAdvancedSuggestion from 'utils/getAdvancedSuggestions'; +import { processDurationTime } from 'utils/processDurationTime'; +import getSelectOptions from 'utils/app/getSelectOptions'; +import onRowsVisibilityChange from 'utils/app/onRowsVisibilityChange'; +import { onCopyToClipBoard } from 'utils/onCopyToClipBoard'; +import saveRecentSearches from 'utils/saveRecentSearches'; +import getLegendsData from 'utils/app/getLegendsData'; +import onLegendsChange from 'utils/app/onLegendsChange'; + +import { InitialAppModelType } from './config'; + +// ************ Metrics App Model Methods + +function getMetricsAppModelMethods( + initialApp: InitialAppModelType, + appConfig: IAppInitialConfig, +) { + const { appName, grouping, components, selectForm } = appConfig; + const { + model, + getModelAppConfigData, + setModelDefaultAppConfigData, + getConfig, + } = initialApp; + let metricsRequestRef: { + call: ( + exceptionHandler: (detail: any) => void, + ) => Promise[]>>; + abort: () => void; + }; + let runsArchiveRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let runsDeleteRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let liveUpdateInstance: LiveUpdateService | null; + + function initialize(appId: string): void { + model.init(); + + const state: Partial = {}; + if (grouping) { + state.groupingSelectOptions = []; + } + if (components?.table) { + state.refs = { + ...state.refs, + tableRef: { current: null }, + }; + } + if (components?.charts?.[0]) { + state.refs = { + ...state.refs, + chartPanelRef: { current: null }, + }; + } + model.setState({ ...state }); + if (!appId) { + setModelDefaultAppConfigData(); + } + + projectsService + .getProjectParams(['metric']) + .call() + .then((data) => { + const advancedSuggestions: Record = getAdvancedSuggestion( + data.metric, + ); + model.setState({ + selectFormData: { + options: getSelectOptions(data, true), + suggestions: getSuggestionsByExplorer(appName, data), + advancedSuggestions: { + ...getSuggestionsByExplorer(appName, data), + metric: { + name: '', + context: _.isEmpty(advancedSuggestions) + ? '' + : { ...advancedSuggestions }, + }, + }, + }, + }); + }); + const liveUpdateState = model.getState()?.config?.liveUpdate; + + if (liveUpdateState?.enabled) { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + liveUpdateState.delay, + ); + } + } + + function updateData(newData: ISequence[]): void { + const configData = model.getState()?.config; + if (configData) { + setModelData(newData, configData); + } + } + + function abortRequest(): void { + if (metricsRequestRef) { + metricsRequestRef.abort(); + } + setRequestProgress(model); + model.setState({ + requestStatus: RequestStatusEnum.Ok, + }); + onModelNotificationAdd({ + id: Date.now(), + severity: 'info', + messages: ['Request has been cancelled'], + }); + } + + function getMetricsData( + shouldUrlUpdate?: boolean, + shouldResetSelectedRows?: boolean, + queryString?: string, + ): IApiRequest { + if (metricsRequestRef) { + metricsRequestRef.abort(); + } + const configData = model.getState()?.config; + + const metric = configData?.chart?.alignmentConfig?.metric; + + if (queryString) { + if (configData.select.advancedMode) { + configData.select.advancedQuery = queryString; + } else { + configData.select.query = queryString; + } + } + let query = getQueryStringFromSelect(configData?.select); + metricsRequestRef = metricsService.getMetricsData({ + q: query, + p: configData?.chart?.densityType, + ...(metric ? { x_axis: metric } : {}), + }); + + setRequestProgress(model); + return { + call: async () => { + if (query === '()') { + resetModelState(configData, shouldResetSelectedRows!); + } else { + model.setState({ + requestStatus: RequestStatusEnum.Pending, + queryIsEmpty: false, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + }); + liveUpdateInstance?.stop().then(); + try { + const stream = await metricsRequestRef.call((detail) => { + exceptionHandler({ detail, model }); + resetModelState(configData, shouldResetSelectedRows!); + }); + const runData = await getRunData(stream, (progress) => + setRequestProgress(model, progress), + ); + if (shouldUrlUpdate) { + updateURL({ configData, appName }); + } + saveRecentSearches(appName, query); + updateData(runData); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + // Abort Error + } else { + // eslint-disable-next-line no-console + console.log('Unhandled error: ', ex); + } + } + + liveUpdateInstance?.start({ + q: query, + p: configData?.chart?.densityType, + ...(metric && { x_axis: metric }), + }); + } + }, + abort: metricsRequestRef.abort, + }; + } + + function resetModelState(configData: any, shouldResetSelectedRows: boolean) { + let state: Partial = {}; + if ( + Array.isArray(components?.charts) && + components?.charts?.indexOf(ChartTypeEnum.LineChart) !== -1 + ) { + state.lineChartData = []; + } + + if (components.table) { + state.tableData = []; + state.config = { + ...configData, + table: { + ...configData?.table, + resizeMode: ResizeModeEnum.Resizable, + }, + }; + } + model.setState({ + queryIsEmpty: true, + rawData: [], + tableColumns: [], + selectFormData: { + ...model.getState().selectFormData, + error: null, + advancedError: null, + }, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + ...state, + }); + } + + function getDataAsTableRows( + processedData: IMetricsCollection[], + xValue: number | string | null = null, + paramKeys: string[], + isRowData: boolean, + config: IAppModelConfig, + groupingSelectOptions: IGroupingSelectOption[], + dynamicUpdate?: boolean, + ): { + rows: IMetricTableRowData[] | any; + sameValueColumns: string[]; + } { + if (!processedData) { + return { + rows: [], + sameValueColumns: [], + }; + } + + const rows: IMetricTableRowData[] | any = + processedData[0]?.config !== null ? {} : []; + + let rowIndex = 0; + const sameValueColumns: string[] = []; + + const columnsFlattenValues: { [key: string]: Set } = {}; + processedData.forEach((metricsCollection: IMetricsCollection) => { + const groupKey = metricsCollection.key; + const columnsValues: { [key: string]: string[] } = {}; + + if (metricsCollection.config !== null) { + const groupConfigData: { [key: string]: unknown } = {}; + for (let key in metricsCollection.config) { + groupConfigData[getValueByField(groupingSelectOptions, key)] = + metricsCollection.config[key]; + } + const groupHeaderRow = { + meta: { + chartIndex: config?.grouping?.chart?.length + ? metricsCollection.chartIndex + 1 + : null, + //ToDo reverse mode + // config?.grouping?.reverseMode?.chart + // ? metricsCollection.chartIndex + 1 + // : null, + color: metricsCollection.color, + dasharray: metricsCollection.dasharray, + itemsCount: metricsCollection.data.length, + config: groupConfigData, + }, + key: groupKey!, + groupRowsKeys: metricsCollection.data.map((metric) => metric.key), + color: metricsCollection.color, + dasharray: metricsCollection.dasharray, + aggregation: { + area: { + min: '', + max: '', + }, + line: '', + }, + experiment: '', + description: '', + date: '', + run: '', + hash: '', + metric: '', + context: [], + value: '', + step: '', + epoch: '', + time: '', + children: [], + groups: groupConfigData, + }; + + rows[groupKey!] = { + data: groupHeaderRow, + items: [], + }; + } + + metricsCollection.data.forEach((metric: IMetric) => { + const closestIndex = + xValue === null + ? null + : getClosestValue(metric.data.xValues as number[], xValue as number) + .index; + const rowValues: IMetricTableRowData = { + rowMeta: { + color: metricsCollection.color ?? metric.color, + }, + key: metric.key, + selectKey: `${metric.run.hash}/${metric.key}`, + hash: metric.run.hash, + isHidden: metric.isHidden, + index: rowIndex, + color: metricsCollection.color ?? metric.color, + dasharray: metricsCollection.dasharray ?? metric.dasharray, + experiment: metric.run.props?.experiment?.name ?? 'default', + experimentId: metric.run.props?.experiment?.id ?? '', + experiment_description: + metric.run.props?.experiment?.description ?? '-', + run: metric.run.props?.name ?? '-', + description: metric.run.props?.description ?? '-', + date: moment(metric.run.props.creation_time * 1000).format( + TABLE_DATE_FORMAT, + ), + tags: metric.run.props.tags.map((tag: ITagProps) => ({ + archived: false, + color: tag.color, + id: tag.id, + comment: tag.description, + name: tag.name, + run_count: 0, + })), + duration: processDurationTime( + metric.run.props.creation_time * 1000, + metric.run.props.end_time + ? metric.run.props.end_time * 1000 + : Date.now(), + ), + active: metric.run.props.active, + metric: metric.name, + context: contextToString(metric.context)?.split(',') || [''], + value: + closestIndex === null + ? '-' + : formatValue(metric.data.values[closestIndex]), + step: + closestIndex === null + ? '-' + : formatValue(metric.data.steps[closestIndex]), + epoch: + closestIndex === null + ? '-' + : formatValue(metric.data.epochs[closestIndex]), + time: + closestIndex !== null ? metric.data.timestamps[closestIndex] : null, + parentId: groupKey, + }; + rowIndex++; + + if (metricsCollection.config !== null && closestIndex !== null) { + rows[groupKey!].data.aggregation = { + area: { + min: formatValue( + metricsCollection.aggregation!.area.min?.yValues[closestIndex], + ), + max: formatValue( + metricsCollection.aggregation!.area.max?.yValues[closestIndex], + ), + }, + line: formatValue( + metricsCollection.aggregation!.line?.yValues[closestIndex], + ), + }; + if ( + config.chart?.aggregationConfig?.methods.area === + AggregationAreaMethods.STD_DEV + ) { + rows[groupKey!].data.aggregation.area.stdDevValue = formatValue( + metricsCollection.aggregation!.area.stdDevValue?.yValues[ + closestIndex + ], + ); + } + if ( + config.chart?.aggregationConfig?.methods.area === + AggregationAreaMethods.STD_ERR + ) { + rows[groupKey!].data.aggregation.area.stdErrValue = formatValue( + metricsCollection.aggregation!.area.stdErrValue?.yValues[ + closestIndex + ], + ); + } + } + + [ + 'experiment', + 'description', + 'date', + 'duration', + 'run', + 'hash', + 'metric', + 'context', + 'step', + 'epoch', + 'time', + ].forEach((key) => { + if (columnsValues.hasOwnProperty(key)) { + if ( + _.findIndex(columnsValues[key], (value) => + _.isEqual(rowValues[key], value), + ) === -1 + ) { + columnsValues[key].push(rowValues[key]); + } + } else { + columnsValues[key] = [rowValues[key]]; + } + }); + + if (!dynamicUpdate) { + paramKeys.forEach((paramKey) => { + const value = getValue(metric.run.params, paramKey, '-'); + rowValues[paramKey] = formatValue(value); + if (columnsValues.hasOwnProperty(paramKey)) { + if ( + _.findIndex(columnsValues[paramKey], (paramValue) => + _.isEqual(value, paramValue), + ) === -1 + ) { + columnsValues[paramKey].push(value); + } + } else { + columnsValues[paramKey] = [value]; + } + }); + } + + if (metricsCollection.config !== null) { + rows[groupKey!].items.push( + isRowData + ? rowValues + : metricsTableRowRenderer(rowValues, onModelRunsTagsChange, { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange({ + metricKey: rowValues.key, + model, + appName, + updateModelData, + }); + }, + }), + ); + } else { + rows.push( + isRowData + ? rowValues + : metricsTableRowRenderer(rowValues, onModelRunsTagsChange, { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange({ + metricKey: rowValues.key, + model, + appName, + updateModelData, + }); + }, + }), + ); + } + }); + + for (let columnKey in columnsValues) { + columnsFlattenValues[columnKey] = new Set([ + ...(columnsFlattenValues[columnKey] || []), + ...(columnsValues[columnKey] || []), + ]); + + if (metricsCollection.config !== null) { + rows[groupKey!].data[columnKey] = + columnsValues[columnKey].length === 1 + ? paramKeys.includes(columnKey) + ? formatValue(columnsValues[columnKey][0]) + : columnsValues[columnKey][0] + : columnsValues[columnKey]; + } + } + if (metricsCollection.config !== null && !isRowData) { + rows[groupKey!].data = metricsTableRowRenderer( + rows[groupKey!].data, + onModelRunsTagsChange, + {}, + true, + ['value', 'groups'].concat(Object.keys(columnsValues)), + ); + } + }); + for (let columnKey in columnsFlattenValues) { + if (columnsFlattenValues[columnKey].size === 1) { + sameValueColumns.push(columnKey); + } + } + return { rows, sameValueColumns }; + } + + function processData(data: ISequence[]): { + data: IMetricsCollection[]; + params: string[]; + runProps: string[]; + highLevelParams: string[]; + contexts: string[]; + selectedRows: any; + } { + const configData = model.getState()?.config; + let selectedRows = model.getState()?.selectedRows; + let metrics: IMetric[] = []; + let runParams: string[] = []; + let runProps: string[] = []; + let highLevelParams: string[] = []; + let contexts: string[] = []; + const paletteIndex: number = configData?.grouping?.paletteIndex || 0; + + data?.forEach((run: ISequence, index) => { + runParams = runParams.concat(getObjectPaths(run.params, run.params)); + runProps = runProps.concat(getObjectPaths(run.props, run.props)); + highLevelParams = highLevelParams.concat( + getObjectPaths(run.params, run.params, '', false, true), + ); + metrics = metrics.concat( + run.traces.map((trace: IMetricTrace) => { + contexts = contexts.concat( + getObjectPaths(trace.context, trace.context), + ); + const { + values, + steps, + epochs, + timestamps, + x_axis_values, + x_axis_iters, + } = filterMetricsData( + trace, + configData?.chart?.alignmentConfig.type, + configData?.chart?.axesScaleType, + ); + + let processedValues = [...values]; + if (configData?.chart?.smoothing.isApplied) { + processedValues = getSmoothenedData({ + smoothingAlgorithm: configData?.chart.smoothing.algorithm, + smoothingFactor: configData.chart.smoothing.factor, + data: processedValues, + }); + } + const metricKey = encode({ + runHash: run.hash, + metricName: trace.name, + traceContext: trace.context, + }); + const metricValues = new Float64Array(processedValues); + return createMetricModel({ + ...trace, + run: createRunModel(_.omit(run, 'traces') as IRun), + key: metricKey, + dasharray: 'none', + color: COLORS[paletteIndex][index % COLORS[paletteIndex].length], + isHidden: configData?.table?.hiddenMetrics!.includes(metricKey), + x_axis_values, + x_axis_iters, + lastValue: metricValues[metricValues.length - 1], + data: { + values: metricValues, + steps, + epochs, + timestamps, + xValues: [...steps], + yValues: processedValues, + }, + } as IMetric); + }), + ); + }); + + let sortFields = configData?.table?.sortFields ?? []; + + if (sortFields?.length === 0) { + sortFields = [ + { + value: 'run.props.creation_time', + order: 'desc', + label: '', + group: '', + }, + ]; + } + + const processedData = groupData( + _.orderBy( + metrics, + sortFields?.map( + (f: SortField) => (metric: IMetric) => getValue(metric, f.value, ''), + ), + sortFields?.map((f: SortField) => f.order), + ), + ); + const uniqParams = _.uniq(runParams).sort(); + const uniqHighLevelParams = _.uniq(highLevelParams).sort(); + const uniqContexts = _.uniq(contexts).sort(); + const uniqProps = _.uniq(runProps).sort(); + + const mappedData: Record = {}; + + for (let metric of metrics) { + mappedData[metric.run.hash] = { + runHash: metric.run.hash, + ...metric.run.props, + ...metric, + }; + } + + let selected: Record = {}; + + if (selectedRows && !_.isEmpty(selectedRows)) { + for (let rowKey in selectedRows) { + const slicedKey = rowKey.slice(0, rowKey.indexOf('/')); + if (mappedData[slicedKey]) + selected[rowKey] = { + selectKey: rowKey, + ...mappedData[slicedKey], + }; + } + } + + selectedRows = selected; + + return { + data: processedData, + params: uniqParams, + highLevelParams: uniqHighLevelParams, + contexts: uniqContexts, + runProps: uniqProps, + selectedRows, + }; + } + + function updateModelData( + configData = model.getState()!.config!, + shouldURLUpdate?: boolean, + ): void { + const { data, params, runProps, highLevelParams, contexts, selectedRows } = + processData(model.getState()?.rawData as ISequence[]); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + runProps, + contexts, + sequenceName: 'metric', + }), + ]; + const sortOptions = [ + ...groupingSelectOptions, + { + group: 'metric', + label: 'metric.values.last', + value: 'lastValue', + }, + ]; + + const legendsData = getLegendsData( + data, + groupingSelectOptions, + configData?.grouping, + [GroupNameEnum.COLOR, GroupNameEnum.STROKE, GroupNameEnum.CHART], + ); + + const tableData = getDataAsTableRows( + data, + configData?.chart?.focusedState.xValue ?? null, + params, + false, + configData, + groupingSelectOptions, + ); + + const tableColumns = getMetricsTableColumns( + params, + groupingSelectOptions, + data[0]?.config, + configData.table?.columnsOrder!, + configData.table?.hiddenColumns!, + configData.chart?.aggregationConfig.methods, + configData.table?.sortFields, + onSortChange, + configData.grouping as any, + onModelGroupingSelectChange, + ); + + model.getState()?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + hiddenColumns: configData.table?.hiddenColumns!, + }); + + if (shouldURLUpdate) { + updateURL({ configData, appName }); + } + + model.setState({ + config: configData, + data, + lineChartData: getDataAsLines(data), + chartTitleData: getChartTitleData({ + processedData: data, + groupingSelectOptions, + model: model as IModel, + }), + aggregatedData: getAggregatedData>({ + processedData: data, + model: model as IModel, + }), + legendsData, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + groupingSelectOptions, + sortOptions, + selectedRows, + }); + } + + function setModelData( + rawData: ISequence[], + configData: IAppModelConfig, + ): void { + const modelState: IAppModelState = model.getState(); + const sortFields = modelState?.config?.table?.sortFields; + const { data, runProps, params, highLevelParams, contexts, selectedRows } = + processData(rawData); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + + if (configData) { + setAggregationEnabled({ model, appName }); + } + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + runProps, + params: sortedParams, + contexts, + sequenceName: 'metric', + }), + ]; + const sortOptions = [ + ...groupingSelectOptions, + { + group: 'metric', + label: 'metric.values.last', + value: 'lastValue', + }, + ]; + + const legendsData = getLegendsData( + data, + groupingSelectOptions, + configData?.grouping, + [GroupNameEnum.COLOR, GroupNameEnum.STROKE, GroupNameEnum.CHART], + ); + + const tableData = getDataAsTableRows( + data, + configData?.chart?.focusedState?.xValue ?? null, + params, + false, + configData, + groupingSelectOptions, + ); + + const tableColumns = getMetricsTableColumns( + params, + groupingSelectOptions, + data[0]?.config, + configData.table?.columnsOrder!, + configData.table?.hiddenColumns!, + configData?.chart?.aggregationConfig?.methods, + sortFields, + onSortChange, + configData.grouping as any, + onModelGroupingSelectChange, + ); + + modelState?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + }); + + model.setState({ + requestStatus: RequestStatusEnum.Ok, + rawData, + config: configData, + params, + data, + selectFormData: { + ...modelState?.selectFormData, + [configData.select?.advancedMode ? 'advancedError' : 'error']: null, + }, + lineChartData: getDataAsLines(data), + chartTitleData: getChartTitleData>( + { + processedData: data, + groupingSelectOptions, + model: model as IModel, + }, + ), + aggregatedData: getAggregatedData>({ + processedData: data, + model: model as IModel, + }), + legendsData, + tableData: tableData.rows, + tableColumns: tableColumns, + sameValueColumns: tableData.sameValueColumns, + groupingSelectOptions, + sortOptions, + selectedRows, + }); + } + + function alignData( + data: IMetricsCollection[], + type: AlignmentOptionsEnum = model.getState()!.config!.chart + ?.alignmentConfig.type, + ): IMetricsCollection[] { + const alignmentObj: { [key: string]: Function } = { + [AlignmentOptionsEnum.STEP]: alignByStep, + [AlignmentOptionsEnum.EPOCH]: alignByEpoch, + [AlignmentOptionsEnum.RELATIVE_TIME]: alignByRelativeTime, + [AlignmentOptionsEnum.ABSOLUTE_TIME]: alignByAbsoluteTime, + [AlignmentOptionsEnum.CUSTOM_METRIC]: alignByCustomMetric, + default: () => { + throw new Error('Unknown value for X axis alignment'); + }, + }; + const alignment = alignmentObj[type] || alignmentObj.default; + return alignment(data, model); + } + + function groupData(data: IMetric[]): IMetricsCollection[] { + const configData = model.getState()!.config; + const grouping = configData!.grouping; + const { paletteIndex = 0 } = grouping || {}; + const groupByColor = getFilteredGroupingOptions({ + groupName: GroupNameEnum.COLOR, + model, + }); + const groupByStroke = getFilteredGroupingOptions({ + groupName: GroupNameEnum.STROKE, + model, + }); + const groupByChart = getFilteredGroupingOptions({ + groupName: GroupNameEnum.CHART, + model, + }); + if ( + groupByColor.length === 0 && + groupByStroke.length === 0 && + groupByChart.length === 0 + ) { + return alignData([ + { + config: null, + color: null, + dasharray: null, + chartIndex: 0, + data: data, + }, + ]); + } + + const groupValues: { + [key: string]: IMetricsCollection; + } = {}; + + const groupingFields = _.uniq( + groupByColor.concat(groupByStroke).concat(groupByChart), + ); + + for (let i = 0; i < data.length; i++) { + const groupValue: { [key: string]: string } = {}; + groupingFields.forEach((field) => { + groupValue[field] = getValue(data[i], field); + }); + const groupKey = encode(groupValue); + if (groupValues.hasOwnProperty(groupKey)) { + groupValues[groupKey].data.push(data[i]); + } else { + groupValues[groupKey] = { + key: groupKey, + config: groupValue, + color: null, + dasharray: null, + chartIndex: 0, + data: [data[i]], + }; + } + } + + let colorIndex = 0; + let dasharrayIndex = 0; + let chartIndex = 0; + + const colorConfigsMap: { [key: string]: number } = {}; + const dasharrayConfigsMap: { [key: string]: number } = {}; + const chartIndexConfigsMap: { [key: string]: number } = {}; + + for (let groupKey in groupValues) { + const groupValue = groupValues[groupKey]; + + if (groupByColor.length > 0) { + const colorConfig = _.pick(groupValue.config, groupByColor); + const colorKey = encode(colorConfig); + + if (grouping?.persistence.color && grouping.isApplied.color) { + let index = getGroupingPersistIndex({ + groupConfig: colorConfig, + grouping, + groupName: 'color', + }); + groupValue.color = + COLORS[paletteIndex][ + Number(index % BigInt(COLORS[paletteIndex].length)) + ]; + } else if (colorConfigsMap.hasOwnProperty(colorKey)) { + groupValue.color = + COLORS[paletteIndex][ + colorConfigsMap[colorKey] % COLORS[paletteIndex].length + ]; + } else { + colorConfigsMap[colorKey] = colorIndex; + groupValue.color = + COLORS[paletteIndex][colorIndex % COLORS[paletteIndex].length]; + colorIndex++; + } + } + + if (groupByStroke.length > 0) { + const dasharrayConfig = _.pick(groupValue.config, groupByStroke); + const dasharrayKey = encode(dasharrayConfig); + if (grouping?.persistence.stroke && grouping.isApplied.stroke) { + let index = getGroupingPersistIndex({ + groupConfig: dasharrayConfig, + grouping, + groupName: 'stroke', + }); + groupValue.dasharray = + DASH_ARRAYS[Number(index % BigInt(DASH_ARRAYS.length))]; + } else if (dasharrayConfigsMap.hasOwnProperty(dasharrayKey)) { + groupValue.dasharray = + DASH_ARRAYS[dasharrayConfigsMap[dasharrayKey] % DASH_ARRAYS.length]; + } else { + dasharrayConfigsMap[dasharrayKey] = dasharrayIndex; + groupValue.dasharray = + DASH_ARRAYS[dasharrayIndex % DASH_ARRAYS.length]; + dasharrayIndex++; + } + } + + if (groupByChart.length > 0) { + const chartIndexConfig = _.pick(groupValue.config, groupByChart); + const chartIndexKey = encode(chartIndexConfig); + if (chartIndexConfigsMap.hasOwnProperty(chartIndexKey)) { + groupValue.chartIndex = chartIndexConfigsMap[chartIndexKey]; + } else { + chartIndexConfigsMap[chartIndexKey] = chartIndex; + groupValue.chartIndex = chartIndex; + chartIndex++; + } + } + } + + const groups = alignData(Object.values(groupValues)); + const chartConfig = configData!.chart; + + return aggregateGroupData({ + groupData: groups, + methods: { + area: chartConfig!.aggregationConfig.methods.area, + line: chartConfig!.aggregationConfig.methods.line, + }, + scale: chartConfig!.axesScaleType, + }); + } + + function onSearchQueryCopy(): void { + const selectedMetricsData = model.getState()?.config?.select; + let query = getQueryStringFromSelect(selectedMetricsData); + onCopyToClipBoard(query, false, () => onNotificationAdd, { + notification: { + id: Date.now(), + severity: 'success', + messages: ['Run Expression Copied'], + }, + model, + }); + } + + function getDataAsLines( + processedData: IMetricsCollection[], + ): ILine[][] { + if (!processedData) { + return []; + } + const lines = processedData + .map((metricsCollection: IMetricsCollection) => + metricsCollection.data + .filter((metric) => !metric.isHidden) + .map((metric: IMetric) => { + return { + ...metric, + groupKey: metricsCollection.key, + color: metricsCollection.color ?? metric.color, + dasharray: metricsCollection.dasharray ?? metric.dasharray, + chartIndex: metricsCollection.chartIndex, + selectors: [ + metric.key, + metric.key, + encode({ runHash: metric.run.hash }), + ], + data: { + xValues: metric.data.xValues, + yValues: metric.data.yValues, + }, + }; + }), + ) + .flat(); + + return Object.values(_.groupBy(lines, 'chartIndex')); + } + + function onExportTableData(): void { + const { data, params, config, groupingSelectOptions } = model.getState(); + + const tableData = getDataAsTableRows( + data, + config?.chart?.focusedState.xValue ?? null, + params, + true, + config, + groupingSelectOptions, + ); + const tableColumns: ITableColumn[] = getMetricsTableColumns( + params, + groupingSelectOptions, + data[0]?.config, + config?.table?.columnsOrder!, + config?.table?.hiddenColumns!, + config?.chart?.aggregationConfig.methods, + ); + + const excludedFields: string[] = ['#', 'actions']; + const filteredHeader: string[] = tableColumns.reduce( + (acc: string[], column: ITableColumn) => + acc.concat( + excludedFields.indexOf(column.key) === -1 && !column.isHidden + ? column.key + : [], + ), + [], + ); + + let emptyRow: { [key: string]: string } = {}; + filteredHeader.forEach((column: string) => { + emptyRow[column] = '--'; + }); + + const groupedRows: IMetricTableRowData[][] = + data.length > 1 + ? Object.keys(tableData.rows).map( + (groupedRowKey: string) => tableData.rows[groupedRowKey].items, + ) + : [ + Array.isArray(tableData.rows) + ? tableData.rows + : tableData.rows[Object.keys(tableData.rows)[0]].items, + ]; + + const dataToExport: { [key: string]: string }[] = []; + + groupedRows?.forEach( + (groupedRow: IMetricTableRowData[], groupedRowIndex: number) => { + groupedRow?.forEach((row: IMetricTableRowData) => { + const filteredRow = getFilteredRow({ + columnKeys: filteredHeader, + row, + }); + dataToExport.push(filteredRow); + }); + if (groupedRows?.length - 1 !== groupedRowIndex) { + dataToExport.push(emptyRow); + } + }, + ); + + const blob = new Blob([JsonToCSV(dataToExport)], { + type: 'text/csv;charset=utf-8;', + }); + saveAs(blob, `${appName}-${moment().format(DATE_EXPORTING_FORMAT)}.csv`); + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.exports.csv); + } + + const onActivePointChange = _.debounce( + (activePoint: IActivePoint, focusedStateActive: boolean = false): void => { + const { data, params, refs, config, groupingSelectOptions } = + model.getState(); + if (!!config) { + const tableRef: any = refs?.tableRef; + let tableData = null; + if (config.table?.resizeMode !== ResizeModeEnum.Hide) { + tableData = getDataAsTableRows( + data, + activePoint.xValue, + params, + false, + config, + groupingSelectOptions, + true, + ); + if (tableRef) { + tableRef.current?.updateData({ + newData: tableData.rows, + dynamicData: true, + }); + + if (focusedStateActive) { + tableRef.current?.scrollToRow?.(activePoint.key); + tableRef.current?.setActiveRow?.( + focusedStateActive ? activePoint.key : null, + ); + } else { + tableRef.current?.setHoveredRow?.(activePoint.key); + } + } + } + let configData = config; + if (configData?.chart) { + // TODO remove this later + // remove unnecessary content prop from tooltip config + if (configData.chart.tooltip?.hasOwnProperty('content')) { + delete configData.chart.tooltip.content; + } + + configData = { + ...configData, + chart: { + ...configData.chart, + focusedState: { + active: focusedStateActive, + key: activePoint.key, + xValue: activePoint.xValue, + yValue: activePoint.yValue, + chartIndex: activePoint.chartIndex, + visId: activePoint.visId || `${activePoint.chartIndex}`, + }, + }, + }; + + if ( + config.chart?.focusedState.active !== focusedStateActive || + (config.chart.focusedState.active && + activePoint.key !== config.chart.focusedState.key) + ) { + updateURL({ configData, appName }); + } + } + + const tooltipData = { + ...configData?.chart?.tooltip, + content: getTooltipContent({ + groupingNames: [ + GroupNameEnum.COLOR, + GroupNameEnum.STROKE, + GroupNameEnum.CHART, + ], + groupingSelectOptions, + data, + configData, + activePointKey: configData.chart?.focusedState?.key, + selectedFields: configData.chart?.tooltip?.selectedFields, + }), + }; + model.setState({ config: configData, tooltip: tooltipData }); + } + }, + 50, + ); + + function onModelRunsTagsChange(runHash: string, tags: ITagInfo[]): void { + onRunsTagsChange({ runHash, tags, model, updateModelData }); + } + + function onModelGroupingSelectChange({ + groupName, + list, + }: IOnGroupingSelectChangeParams): void { + onGroupingSelectChange({ + groupName, + list, + model, + appName, + updateModelData, + setAggregationEnabled, + }); + } + + function onModelBookmarkCreate({ + name, + description, + }: { + name: string; + description: string; + }): Promise { + return onBookmarkCreate({ name, description, model, appName }); + } + + function onModelBookmarkUpdate(id: string): void { + onBookmarkUpdate({ id, model, appName }); + } + + function onModelNotificationDelete(id: number): void { + onNotificationDelete({ id, model }); + } + + function onModelNotificationAdd(notification: N & INotification): void { + onNotificationAdd({ notification, model }); + } + + function onModelResetConfigData(): void { + onResetConfigData({ model, getConfig, updateModelData }); + } + + function onSortChange({ + sortFields, + order, + index, + actionType, + field, + }: any): void { + onTableSortChange({ + field, + sortFields, + order, + index, + actionType, + model, + appName, + updateModelData, + }); + } + + function setModelComponentRefs(refElement: object): void { + setComponentRefs({ refElement, model }); + } + + function changeLiveUpdateConfig(config: { + enabled?: boolean; + delay?: number; + }): void { + const state = model.getState(); + const configData = state?.config; + const liveUpdateConfig = configData?.liveUpdate; + const metric = configData?.chart?.alignmentConfig?.metric; + let query = getQueryStringFromSelect(configData?.select); + + if (!liveUpdateConfig?.enabled && config.enabled && query !== '()') { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + config.delay || liveUpdateConfig?.delay, + ); + liveUpdateInstance?.start({ + p: configData?.chart?.densityType, + q: query, + ...(metric && { x_axis: metric }), + }); + } else { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; + } + + const newLiveUpdateConfig = { + ...liveUpdateConfig, + ...config, + }; + model.setState({ + config: { + ...configData, + liveUpdate: newLiveUpdateConfig, + }, + }); + setItem('metricsLUConfig', encode(newLiveUpdateConfig)); + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].liveUpdate} ${ + config.enabled ? 'on' : 'off' + }`, + ); + } + + function destroy(): void { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; //@TODO check is this need or not + } + + function archiveRuns(ids: string[], archived: boolean): IApiRequest { + runsArchiveRef = runsService.archiveRuns(ids, archived); + return { + call: async () => { + try { + await runsArchiveRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getMetricsData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [ + `Runs are successfully ${ + archived ? 'archived' : 'unarchived' + } `, + ], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.archiveRunsBatch, + ); + } + }, + abort: runsArchiveRef.abort, + }; + } + + function deleteRuns(ids: string[]): IApiRequest { + runsDeleteRef = runsService.deleteRuns(ids); + return { + call: async () => { + try { + await runsDeleteRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getMetricsData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: ['Runs are successfully deleted'], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.deleteRunsBatch, + ); + } + }, + abort: runsDeleteRef.abort, + }; + } + + const methods = { + initialize, + getAppConfigData: getModelAppConfigData, + getMetricsData, + abortRequest, + getDataAsTableRows, + setDefaultAppConfigData: setModelDefaultAppConfigData, + setComponentRefs: setModelComponentRefs, + updateModelData, + onActivePointChange, + onExportTableData, + onBookmarkCreate: onModelBookmarkCreate, + onBookmarkUpdate: onModelBookmarkUpdate, + onNotificationAdd: onModelNotificationAdd, + onNotificationDelete: onModelNotificationDelete, + onResetConfigData: onModelResetConfigData, + onRunsTagsChange: onModelRunsTagsChange, + onSortChange, + onSearchQueryCopy, + changeLiveUpdateConfig, + destroy, + deleteRuns, + archiveRuns, + }; + + if (grouping) { + Object.assign(methods, { + onGroupingSelectChange: onModelGroupingSelectChange, + onGroupingModeChange({ + groupName, + value, + }: IOnGroupingModeChangeParams): void { + onGroupingModeChange({ + groupName, + value, + model, + appName, + updateModelData, + setAggregationEnabled, + }); + }, + onGroupingPaletteChange(index: number): void { + onGroupingPaletteChange({ + index, + model, + appName, + updateModelData, + setAggregationEnabled, + }); + }, + onGroupingReset(groupName: GroupNameEnum): void { + onGroupingReset({ + groupName, + model, + appName, + updateModelData, + setAggregationEnabled, + }); + }, + onGroupingApplyChange(groupName: GroupNameEnum): void { + onGroupingApplyChange({ + groupName, + model, + appName, + updateModelData, + setAggregationEnabled, + }); + }, + onGroupingPersistenceChange(groupName: GroupNameEnum): void { + onGroupingPersistenceChange({ + groupName, + model, + appName, + updateModelData, + setAggregationEnabled, + }); + }, + onShuffleChange(name: 'color' | 'stroke'): void { + onShuffleChange({ name, model, updateModelData }); + }, + }); + } + if (selectForm) { + Object.assign(methods, { + onMetricsSelectChange(data: D & Partial): void { + onSelectOptionsChange({ data, model }); + }, + onSelectRunQueryChange(query: string): void { + onSelectRunQueryChange({ query, model }); + }, + onSelectAdvancedQueryChange(query: string): void { + onSelectAdvancedQueryChange({ query, model }); + }, + toggleSelectAdvancedMode(): void { + toggleSelectAdvancedMode({ model, appName }); + }, + }); + } + if (components?.charts?.[0]) { + Object.assign(methods, { + onHighlightModeChange(mode: HighlightEnum): void { + onHighlightModeChange({ mode, model, appName }); + }, + onZoomChange(zoom: Partial): void { + onZoomChange({ + zoom, + model, + appName, + }); + }, + onSmoothingChange(args: Partial): void { + onSmoothingChange({ args, model, appName, updateModelData }); + }, + onIgnoreOutliersChange(): void { + onIgnoreOutliersChange({ model, updateModelData, appName }); + }, + onAxesScaleTypeChange(args: IAxesScaleState): void { + onAxesScaleTypeChange({ args, model, appName, updateModelData }); + }, + onAggregationConfigChange( + aggregationConfig: Partial, + ): void { + onAggregationConfigChange({ + aggregationConfig, + model, + appName, + updateModelData, + }); + }, + onAlignmentMetricChange(metric: string): Promise { + return onAlignmentMetricChange({ + metric, + model, + appName, + updateModelData, + setModelData, + }); + }, + onAlignmentTypeChange(type: AlignmentOptionsEnum): void { + onAlignmentTypeChange({ type, model, appName, updateModelData }); + }, + onChangeTooltip(tooltip: Partial): void { + onChangeTooltip({ + tooltip, + groupingNames: [ + GroupNameEnum.COLOR, + GroupNameEnum.STROKE, + GroupNameEnum.CHART, + ], + model, + appName, + }); + }, + onAxesScaleRangeChange(range: Partial): void { + onAxesScaleRangeChange({ range, model, appName }); + }, + onDensityTypeChange(type: DensityOptions): Promise { + return onDensityTypeChange({ type, model, appName, getMetricsData }); + }, + onLegendsChange(legends: Partial): void { + onLegendsChange({ legends, model, appName, updateModelData }); + }, + }); + } + if (components?.table) { + Object.assign(methods, { + onRowHeightChange(height: RowHeightSize): void { + onRowHeightChange({ height, model, appName }); + }, + onTableRowHover(rowKey?: string): void { + onTableRowHover({ rowKey, model }); + }, + onTableRowClick(rowKey?: string): void { + onTableRowClick({ rowKey, model }); + }, + onMetricVisibilityChange(metricsKeys: string[]): void { + onMetricVisibilityChange({ + metricsKeys, + model, + appName, + updateModelData, + }); + }, + onColumnsVisibilityChange(hiddenColumns: string[]): void { + onColumnsVisibilityChange({ + hiddenColumns, + model, + appName, + updateModelData, + }); + }, + onTableDiffShow(): void { + onTableDiffShow({ model, appName, updateModelData }); + }, + onColumnsOrderChange(columnsOrder: any): void { + onColumnsOrderChange({ + columnsOrder, + model, + appName, + updateModelData, + }); + }, + onTableResizeModeChange(mode: ResizeModeEnum): void { + onTableResizeModeChange({ mode, model, appName }); + }, + onTableResizeEnd(tableHeight: string): void { + onTableResizeEnd({ tableHeight, model, appName }); + }, + onSortReset(): void { + updateSortFields({ sortFields: [], model, appName, updateModelData }); + }, + updateColumnsWidths(key: string, width: number, isReset: boolean): void { + updateColumnsWidths({ + key, + width, + isReset, + model, + appName, + updateModelData, + }); + }, + onRowSelect({ + actionType, + data, + }: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + }): void { + return onRowSelect({ actionType, data, model }); + }, + onRowsVisibilityChange(metricKeys: string[]): void { + return onRowsVisibilityChange({ + metricKeys, + model, + appName, + updateModelData, + }); + }, + }); + } + + return methods; +} + +export default getMetricsAppModelMethods; diff --git a/src/src/services/models/explorer/paramsModelMethods.ts b/src/src/services/models/explorer/paramsModelMethods.ts new file mode 100644 index 00000000..b9eb97b2 --- /dev/null +++ b/src/src/services/models/explorer/paramsModelMethods.ts @@ -0,0 +1,1690 @@ +import moment from 'moment'; +import { saveAs } from 'file-saver'; +import _ from 'lodash-es'; + +import COLORS from 'config/colors/colors'; +import DASH_ARRAYS from 'config/dash-arrays/dashArrays'; +import { MetricsValueKeyEnum, ResizeModeEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_EXPORTING_FORMAT, TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { getSuggestionsByExplorer } from 'config/monacoConfig/monacoConfig'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + getParamsTableColumns, + paramsTableRowRenderer, +} from 'pages/Params/components/ParamsTableGrid/ParamsTableGrid'; + +import * as analytics from 'services/analytics'; +import runsService from 'services/api/runs/runsService'; +import LiveUpdateService from 'services/live-update/examples/LiveUpdateBridge.example'; +import projectsService from 'services/api/projects/projectsService'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { + IGroupingSelectOption, + IMetricsCollection, + IMetricTableRowData, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; +import { IParamTrace, IRun } from 'types/services/models/metrics/runModel'; +import { IModel } from 'types/services/models/model'; +import { + IParam, + IParamsAppModelState, +} from 'types/services/models/params/paramsAppModel'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { IDimensionsType } from 'types/utils/d3/drawParallelAxes'; +import { + IAppInitialConfig, + IAppModelConfig, + IAppModelState, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { ITagInfo, ITagProps } from 'types/pages/tags/Tags'; + +import exceptionHandler from 'utils/app/exceptionHandler'; +import getChartTitleData from 'utils/app/getChartTitleData'; +import { getFilteredGroupingOptions } from 'utils/app/getFilteredGroupingOptions'; +import getFilteredRow from 'utils/app/getFilteredRow'; +import { getGroupingPersistIndex } from 'utils/app/getGroupingPersistIndex'; +import getGroupingSelectOptions from 'utils/app/getGroupingSelectOptions'; +import getRunData from 'utils/app/getRunData'; +import onChangeTooltip from 'utils/app/onChangeTooltip'; +import onColorIndicatorChange from 'utils/app/onColorIndicatorChange'; +import onColumnsOrderChange from 'utils/app/onColumnsOrderChange'; +import onColumnsVisibilityChange from 'utils/app/onColumnsVisibilityChange'; +import onCurveInterpolationChange from 'utils/app/onCurveInterpolationChange'; +import onGroupingApplyChange from 'utils/app/onGroupingApplyChange'; +import onGroupingModeChange from 'utils/app/onGroupingModeChange'; +import onGroupingPaletteChange from 'utils/app/onGroupingPaletteChange'; +import onGroupingPersistenceChange from 'utils/app/onGroupingPersistenceChange'; +import onGroupingReset from 'utils/app/onGroupingReset'; +import onGroupingSelectChange from 'utils/app/onGroupingSelectChange'; +import onSelectOptionsChange from 'utils/app/onSelectOptionsChange'; +import onParamVisibilityChange from 'utils/app/onParamsVisibilityChange'; +import onRowHeightChange from 'utils/app/onRowHeightChange'; +import onRowVisibilityChange from 'utils/app/onRowVisibilityChange'; +import onSelectRunQueryChange from 'utils/app/onSelectRunQueryChange'; +import onSortFieldsChange from 'utils/app/onSortFieldsChange'; +import { onTableDiffShow } from 'utils/app/onTableDiffShow'; +import { onTableResizeEnd } from 'utils/app/onTableResizeEnd'; +import onTableResizeModeChange from 'utils/app/onTableResizeModeChange'; +import onTableRowClick from 'utils/app/onTableRowClick'; +import onTableRowHover from 'utils/app/onTableRowHover'; +import onTableSortChange from 'utils/app/onTableSortChange'; +import updateColumnsWidths from 'utils/app/updateColumnsWidths'; +import updateSortFields from 'utils/app/updateTableSortFields'; +import contextToString from 'utils/contextToString'; +import { ChartTypeEnum, ScaleEnum } from 'utils/d3'; +import { formatValue } from 'utils/formatValue'; +import getObjectPaths from 'utils/getObjectPaths'; +import JsonToCSV from 'utils/JsonToCSV'; +import { setItem } from 'utils/storage'; +import { encode } from 'utils/encoder/encoder'; +import onBookmarkCreate from 'utils/app/onBookmarkCreate'; +import onBookmarkUpdate from 'utils/app/onBookmarkUpdate'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import onResetConfigData from 'utils/app/onResetConfigData'; +import onShuffleChange from 'utils/app/onShuffleChange'; +import updateURL from 'utils/app/updateURL'; +import getValueByField from 'utils/getValueByField'; +import getTooltipContent from 'utils/getTooltipContent'; +import { getValue } from 'utils/helper'; +import onRowSelect from 'utils/app/onRowSelect'; +import { SortField } from 'utils/getSortedFields'; +import onAxisBrushExtentChange from 'utils/app/onAxisBrushExtentChange'; +import onRunsTagsChange from 'utils/app/onRunsTagsChange'; +import setRequestProgress from 'utils/app/setRequestProgress'; +import { minMaxOfArray } from 'utils/minMaxOfArray'; +import { processDurationTime } from 'utils/processDurationTime'; +import getSelectOptions from 'utils/app/getSelectOptions'; +import { getMetricsSelectOptions } from 'utils/app/getMetricsSelectOptions'; +import onRowsVisibilityChange from 'utils/app/onRowsVisibilityChange'; +import { getMetricsInitialRowData } from 'utils/app/getMetricsInitialRowData'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import { getMetricLabel } from 'utils/app/getMetricLabel'; + +import { InitialAppModelType } from './config'; + +import { AppNameEnum } from './index'; + +// ************ Params App Model Methods + +function getParamsModelMethods( + initialApp: InitialAppModelType, + appConfig: IAppInitialConfig, +) { + const { appName, grouping, components, selectForm } = appConfig; + const { + model, + getModelAppConfigData, + setModelDefaultAppConfigData, + getConfig, + } = initialApp; + + let runsRequestRef: { + call: ( + exceptionHandler: (detail: any) => void, + ) => Promise[]>>; + abort: () => void; + }; + let runsArchiveRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let runsDeleteRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let liveUpdateInstance: LiveUpdateService | null; + + function initialize(appId: string): void { + model.init(); + const state: Partial = {}; + if (grouping) { + state.groupingSelectOptions = []; + } + if (components?.table) { + state.refs = { + ...state.refs, + tableRef: { current: null }, + }; + } + if (components?.charts?.[0]) { + state.refs = { + ...state.refs, + chartPanelRef: { current: null }, + }; + } + projectsService + .getProjectParams(['metric']) + .call() + .then((data) => { + model.setState({ + selectFormData: { + options: getSelectOptions(data), + suggestions: getSuggestionsByExplorer(appName, data), + }, + }); + }); + model.setState({ ...state }); + if (!appId) { + setModelDefaultAppConfigData(); + } + const liveUpdateState = model.getState()?.config?.liveUpdate; + + if (liveUpdateState?.enabled) { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + liveUpdateState.delay, + ); + } + } + + function updateData(newData: IRun[]): void { + const configData = model.getState()?.config; + if (configData) { + setModelData(newData, configData); + } + } + + function abortRequest(): void { + if (runsRequestRef) { + runsRequestRef.abort(); + } + setRequestProgress(model); + model.setState({ + requestStatus: RequestStatusEnum.Ok, + }); + onModelNotificationAdd({ + id: Date.now(), + severity: 'info', + messages: ['Request has been cancelled'], + }); + } + + function getParamsData( + shouldUrlUpdate?: boolean, + shouldResetSelectedRows?: boolean, + queryString?: string, + ): { + call: () => Promise; + abort: () => void; + } { + if (runsRequestRef) { + runsRequestRef.abort(); + } + const configData = { ...model.getState()?.config }; + if (queryString) { + configData.select.query = queryString; + } + runsRequestRef = runsService.getRunsData(configData?.select?.query); + setRequestProgress(model); + return { + call: async () => { + if (_.isEmpty(configData?.select?.options)) { + resetModelState(configData, shouldResetSelectedRows!); + } else { + model.setState({ + requestStatus: RequestStatusEnum.Pending, + queryIsEmpty: false, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + }); + liveUpdateInstance?.stop().then(); + try { + const stream = await runsRequestRef.call((detail) => { + exceptionHandler({ detail, model }); + resetModelState(configData, shouldResetSelectedRows!); + }); + const runData = await getRunData(stream, (progress) => + setRequestProgress(model, progress), + ); + updateData(runData); + if (shouldUrlUpdate) { + updateURL({ configData, appName }); + } + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + // Abort Error + } else { + // eslint-disable-next-line no-console + console.log('Unhandled error: ', ex); + } + } + liveUpdateInstance?.start({ + q: configData?.select?.query, + }); + } + }, + abort: runsRequestRef.abort, + }; + } + + function resetModelState(configData: any, shouldResetSelectedRows: boolean) { + let state: Partial = {}; + if (components?.charts?.indexOf(ChartTypeEnum.HighPlot) !== -1) { + state.highPlotData = []; + } + if (components.table) { + state.tableData = []; + state.config = { + ...configData, + table: { + ...configData?.table, + resizeMode: ResizeModeEnum.Resizable, + }, + }; + } + + model.setState({ + queryIsEmpty: true, + rawData: [], + tableColumns: [], + selectFormData: { ...model.getState().selectFormData, error: null }, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + ...state, + }); + } + + function getDataAsTableRows( + processedData: IMetricsCollection[], + metricsColumns: any, + paramKeys: string[], + isRowData: boolean, + config: IAppModelConfig, + groupingSelectOptions: IGroupingSelectOption[], + ): { rows: IMetricTableRowData[] | any; sameValueColumns: string[] } { + if (!processedData) { + return { + rows: [], + sameValueColumns: [], + }; + } + + const rows: IMetricTableRowData[] | any = + processedData[0]?.config !== null ? {} : []; + + let rowIndex = 0; + const sameValueColumns: string[] = []; + const columnsFlattenValues: { [key: string]: Set } = {}; + + processedData.forEach((metricsCollection: IMetricsCollection) => { + const groupKey = metricsCollection.key; + const columnsValues: { [key: string]: string[] } = {}; + if (metricsCollection.config !== null) { + const groupConfigData: { [key: string]: unknown } = {}; + for (let key in metricsCollection.config) { + groupConfigData[getValueByField(groupingSelectOptions, key)] = + metricsCollection.config[key]; + } + const groupHeaderRow = { + meta: { + chartIndex: config?.grouping?.chart?.length + ? metricsCollection.chartIndex + 1 + : null, + //ToDo reverse mode + // config.grouping?.reverseMode?.chart + // ? metricsCollection.chartIndex + 1 + // : null, + color: metricsCollection.color, + dasharray: metricsCollection.dasharray, + itemsCount: metricsCollection.data.length, + config: groupConfigData, + }, + key: groupKey!, + groupRowsKeys: metricsCollection.data.map((metric) => metric.key), + color: metricsCollection.color, + dasharray: metricsCollection.dasharray, + experiment: '', + run: '', + hash: '', + description: '', + experiment_description: '', + date: '', + metric: '', + context: [], + children: [], + groups: groupConfigData, + }; + + rows[groupKey!] = { + data: groupHeaderRow, + items: [], + }; + } + + metricsCollection.data.forEach((metric: any) => { + const metricsRowValues = getMetricsInitialRowData(metricsColumns); + metric.run.traces.metric.forEach((trace: any) => { + const metricHash = getMetricHash(trace.name, trace.context); + metricsRowValues[metricHash] = formatValue(trace.values.last); + }); + const rowValues: any = { + rowMeta: { + color: metricsCollection.color ?? metric.color, + }, + key: metric.key, + selectKey: `${metric.run.hash}/${metric.key}`, + hash: metric.run.hash, + isHidden: metric.isHidden, + index: rowIndex, + color: metricsCollection.color ?? metric.color, + dasharray: metricsCollection.dasharray ?? metric.dasharray, + experiment: metric.run.props.experiment.name ?? 'default', + experimentId: metric.run.props.experiment.id ?? '', + experiment_description: + metric.run.props.experiment?.description ?? '-', + run: metric.run.props?.name ?? '-', + description: metric.run.props?.description ?? '-', + date: moment(metric.run.props.creation_time * 1000).format( + TABLE_DATE_FORMAT, + ), + tags: metric.run.props.tags.map((tag: ITagProps) => ({ + archived: false, + color: tag.color, + id: tag.id, + comment: tag.description, + name: tag.name, + run_count: 0, + })), + metric: metric.name, + duration: processDurationTime( + metric.run.props.creation_time * 1000, + metric.run.props.end_time + ? metric.run.props.end_time * 1000 + : Date.now(), + ), + active: metric.run.props.active, + ...metricsRowValues, + }; + rowIndex++; + + for (let key in metricsRowValues) { + columnsValues[key] = ['-']; + } + + [ + 'experiment', + 'run', + 'hash', + 'date', + 'duration', + 'description', + 'metric', + 'context', + 'step', + 'epoch', + 'time', + ].forEach((key) => { + if (columnsValues.hasOwnProperty(key)) { + if (!_.some(columnsValues[key], rowValues[key])) { + columnsValues[key].push(rowValues[key]); + } + } else { + columnsValues[key] = [rowValues[key]]; + } + }); + + paramKeys.forEach((paramKey) => { + const value = getValue(metric.run.params, paramKey, '-'); + rowValues[paramKey] = formatValue(value); + if (columnsValues.hasOwnProperty(paramKey)) { + if ( + _.findIndex(columnsValues[paramKey], (paramValue) => + _.isEqual(value, paramValue), + ) === -1 + ) { + columnsValues[paramKey].push(value); + } + } else { + columnsValues[paramKey] = [value]; + } + }); + + if (metricsCollection.config !== null) { + rows[groupKey!].items.push( + isRowData + ? rowValues + : paramsTableRowRenderer(rowValues, onModelRunsTagsChange, { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange({ + metricKey: rowValues.key, + model, + appName, + updateModelData, + }); + }, + }), + ); + } else { + rows.push( + isRowData + ? rowValues + : paramsTableRowRenderer(rowValues, onModelRunsTagsChange, { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange({ + metricKey: rowValues.key, + model, + appName, + updateModelData, + }); + }, + }), + ); + } + }); + + for (let columnKey in columnsValues) { + columnsFlattenValues[columnKey] = new Set([ + ...(columnsFlattenValues[columnKey] || []), + ...(columnsValues[columnKey] || []), + ]); + + if (metricsCollection.config !== null) { + rows[groupKey!].data[columnKey] = + columnsValues[columnKey].length === 1 + ? paramKeys.includes(columnKey) + ? formatValue(columnsValues[columnKey][0]) + : columnsValues[columnKey][0] + : columnsValues[columnKey]; + } + } + + if (metricsCollection.config !== null && !isRowData) { + rows[groupKey!].data = paramsTableRowRenderer( + rows[groupKey!].data, + onModelRunsTagsChange, + {}, + true, + ['groups'].concat(Object.keys(columnsValues)), + ); + } + }); + for (let columnKey in columnsFlattenValues) { + if (columnsFlattenValues[columnKey].size === 1) { + sameValueColumns.push(columnKey); + } + } + return { rows, sameValueColumns }; + } + + function getDataAsLines( + processedData: IMetricsCollection[], + configData = model.getState()?.config, + ): { dimensions: IDimensionsType; data: any }[] { + if (!processedData || _.isEmpty(configData.select.options)) { + return []; + } + const dimensionsObject: any = {}; + const lines = processedData.map( + ({ chartIndex, color, data, dasharray }: IMetricsCollection) => { + if (!dimensionsObject[chartIndex]) { + dimensionsObject[chartIndex] = {}; + } + + return data + .filter((run) => !run.isHidden) + .map((run: IParam) => { + const values: { [key: string]: string | number | null } = {}; + configData.select.options.forEach( + ({ type, label, value }: ISelectOption) => { + const dimension = dimensionsObject[chartIndex]; + if (!dimension[label] && type === 'params') { + dimension[label] = { + values: new Set(), + scaleType: ScaleEnum.Linear, + displayName: label, + dimensionType: 'param', + }; + } + if (type === 'metrics') { + run.run.traces.metric.forEach((trace: IParamTrace) => { + const metricHash = getMetricHash( + trace.name, + trace.context as any, + ); + const metricLabel = getMetricLabel( + trace.name, + trace.context as any, + ); + if ( + trace.name === value?.option_name && + _.isEqual(trace.context, value?.context) + ) { + values[metricHash] = trace.values.last; + if (dimension[metricHash]) { + dimension[metricHash].values.add(trace.values.last); + if (typeof trace.values.last === 'string') { + dimension[metricHash].scaleType = ScaleEnum.Point; + } + } else { + dimension[metricHash] = { + values: new Set().add(trace.values.last), + scaleType: ScaleEnum.Linear, + displayName: metricLabel, + dimensionType: 'metric', + }; + } + } + }); + } else { + const paramValue = getValue(run.run.params, label, '-'); + const formattedParam = formatValue(paramValue, '-'); + values[label] = paramValue; + if (formattedParam !== '-' && dimension[label]) { + if (typeof paramValue !== 'number') { + dimension[label].scaleType = ScaleEnum.Point; + values[label] = formattedParam; + } else if (isNaN(paramValue) || !isFinite(paramValue)) { + values[label] = formattedParam; + dimension[label].scaleType = ScaleEnum.Point; + } + dimension[label].values.add(values[label]); + } + } + }, + ); + + return { + values, + color: color ?? run.color, + dasharray: dasharray ?? run.dasharray, + chartIndex: chartIndex, + key: run.key, + }; + }); + }, + ); + + const flattedLines = lines.flat(); + const groupedByChartIndex = Object.values( + _.groupBy(flattedLines, 'chartIndex'), + ); + + return Object.keys(dimensionsObject) + .map((keyOfDimension, i) => { + const dimensions: IDimensionsType = {}; + Object.keys(dimensionsObject[keyOfDimension]).forEach((key: string) => { + if (dimensionsObject[keyOfDimension][key].scaleType === 'linear') { + const [minDomain, maxDomain] = minMaxOfArray([ + ...dimensionsObject[keyOfDimension][key].values, + ]); + + dimensions[key] = { + scaleType: dimensionsObject[keyOfDimension][key].scaleType, + domainData: [minDomain, maxDomain], + displayName: dimensionsObject[keyOfDimension][key].displayName, + dimensionType: + dimensionsObject[keyOfDimension][key].dimensionType, + }; + } else { + const numDomain: number[] = []; + const strDomain: string[] = []; + + [...dimensionsObject[keyOfDimension][key].values].forEach( + (data) => { + if (typeof data === 'number') { + numDomain.push(data); + } else { + strDomain.push(data); + } + }, + ); + + // sort domain data + numDomain.sort((a, b) => a - b); + strDomain.sort(); + + dimensions[key] = { + scaleType: dimensionsObject[keyOfDimension][key].scaleType, + domainData: numDomain.concat(strDomain as any[]), + displayName: dimensionsObject[keyOfDimension][key].displayName, + dimensionType: + dimensionsObject[keyOfDimension][key].dimensionType, + }; + } + }); + return { + dimensions, + data: groupedByChartIndex[i], + }; + }) + .filter((data) => !_.isEmpty(data.data) && !_.isEmpty(data.dimensions)); + } + + function setModelData( + rawData: IRun[], + configData: IAppModelConfig, + ): void { + const { + data, + runProps, + highLevelParams, + params, + metricsColumns, + selectedRows, + } = processData(rawData); + const modelState: IAppModelState = model.getState(); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + runProps, + }), + ]; + const metricsSelectOptions = getMetricsSelectOptions(metricsColumns, model); + const sortOptions = [...groupingSelectOptions, ...metricsSelectOptions]; + + const tableData = getDataAsTableRows( + data, + metricsColumns, + params, + false, + configData, + groupingSelectOptions, + ); + const sortFields = modelState?.config?.table.sortFields; + + const tableColumns = getParamsTableColumns( + sortOptions, + metricsColumns, + params, + data[0]?.config, + configData.table?.columnsOrder!, + configData.table?.hiddenColumns!, + configData.table?.metricsValueKey, + sortFields, + onSortChange, + configData.grouping as any, + onModelGroupingSelectChange, + AppNameEnum.PARAMS, + ); + + modelState?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + }); + + if (!_.isEmpty(configData.chart?.brushExtents)) { + const chart = { ...configData.chart }; + let brushExtents = { ...chart?.brushExtents }; + const resultBrushExtents: any = {}; + const selectOptionList = configData.select?.options.map( + (option: ISelectOption) => option.key, + ); + + const brushExtentsKeys = Object.keys(brushExtents); + brushExtentsKeys.forEach((chartIndex: string) => { + const chartBrushExtents = { ...brushExtents[chartIndex] }; + const chartBrushExtentsKeys = Object.keys(chartBrushExtents); + const omitKeys = chartBrushExtentsKeys.filter( + (key: string) => !selectOptionList?.includes(key), + ); + resultBrushExtents[chartIndex] = _.omit(chartBrushExtents, omitKeys); + }); + configData = { + ...configData, + chart: { ...configData.chart, brushExtents: resultBrushExtents }, + }; + } + + model.setState({ + requestStatus: RequestStatusEnum.Ok, + data, + highPlotData: getDataAsLines(data), + chartTitleData: getChartTitleData({ + processedData: data, + groupingSelectOptions, + model: model as IModel, + }), + selectFormData: { ...modelState.selectFormData, error: null }, + params, + selectedRows, + metricsColumns, + rawData, + config: configData, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + groupingSelectOptions, + sortOptions, + }); + } + + function groupData(data: IParam[]): IMetricsCollection[] { + const grouping = model.getState()!.config!.grouping; + const { paletteIndex } = grouping; + const groupByColor = getFilteredGroupingOptions({ + groupName: GroupNameEnum.COLOR, + model, + }); + const groupByStroke = getFilteredGroupingOptions({ + groupName: GroupNameEnum.STROKE, + model, + }); + const groupByChart = getFilteredGroupingOptions({ + groupName: GroupNameEnum.CHART, + model, + }); + if ( + groupByColor.length === 0 && + groupByStroke.length === 0 && + groupByChart.length === 0 + ) { + return [ + { + config: null, + color: null, + dasharray: null, + chartIndex: 0, + data, + }, + ]; + } + + const groupValues: { + [key: string]: IMetricsCollection | any; + } = {}; + + const groupingFields = _.uniq( + groupByColor.concat(groupByStroke).concat(groupByChart), + ); + + for (let i = 0; i < data.length; i++) { + const groupValue: { [key: string]: unknown } = {}; + groupingFields.forEach((field) => { + groupValue[field] = getValue(data[i], field); + }); + const groupKey = encode(groupValue); + if (groupValues.hasOwnProperty(groupKey)) { + groupValues[groupKey].data.push(data[i]); + } else { + groupValues[groupKey] = { + key: groupKey, + config: groupValue, + color: null, + dasharray: null, + chartIndex: 0, + data: [data[i]], + }; + } + } + + let colorIndex = 0; + let dasharrayIndex = 0; + let chartIndex = 0; + + const colorConfigsMap: { [key: string]: number } = {}; + const dasharrayConfigsMap: { [key: string]: number } = {}; + const chartIndexConfigsMap: { [key: string]: number } = {}; + + for (let groupKey in groupValues) { + const groupValue = groupValues[groupKey]; + + if (groupByColor.length > 0) { + const colorConfig = _.pick(groupValue.config, groupByColor); + const colorKey = encode(colorConfig); + + if (grouping.persistence.color && grouping.isApplied.color) { + let index = getGroupingPersistIndex({ + groupConfig: colorConfig, + grouping, + groupName: 'color', + }); + groupValue.color = + COLORS[paletteIndex][ + Number(index % BigInt(COLORS[paletteIndex].length)) + ]; + } else if (colorConfigsMap.hasOwnProperty(colorKey)) { + groupValue.color = + COLORS[paletteIndex][ + colorConfigsMap[colorKey] % COLORS[paletteIndex].length + ]; + } else { + colorConfigsMap[colorKey] = colorIndex; + groupValue.color = + COLORS[paletteIndex][colorIndex % COLORS[paletteIndex].length]; + colorIndex++; + } + } + + if (groupByStroke.length > 0) { + const dasharrayConfig = _.pick(groupValue.config, groupByStroke); + const dasharrayKey = encode(dasharrayConfig); + if (grouping.persistence.stroke && grouping.isApplied.stroke) { + let index = getGroupingPersistIndex({ + groupConfig: dasharrayConfig, + grouping, + groupName: 'stroke', + }); + groupValue.dasharray = + DASH_ARRAYS[Number(index % BigInt(DASH_ARRAYS.length))]; + } else if (dasharrayConfigsMap.hasOwnProperty(dasharrayKey)) { + groupValue.dasharray = + DASH_ARRAYS[dasharrayConfigsMap[dasharrayKey] % DASH_ARRAYS.length]; + } else { + dasharrayConfigsMap[dasharrayKey] = dasharrayIndex; + groupValue.dasharray = + DASH_ARRAYS[dasharrayIndex % DASH_ARRAYS.length]; + dasharrayIndex++; + } + } + + if (groupByChart.length > 0) { + const chartIndexConfig = _.pick(groupValue.config, groupByChart); + const chartIndexKey = encode(chartIndexConfig); + if (chartIndexConfigsMap.hasOwnProperty(chartIndexKey)) { + groupValue.chartIndex = chartIndexConfigsMap[chartIndexKey]; + } else { + chartIndexConfigsMap[chartIndexKey] = chartIndex; + groupValue.chartIndex = chartIndex; + chartIndex++; + } + } + } + return Object.values(groupValues); + } + + function processData(data: IRun[]): { + data: IMetricsCollection[]; + params: string[]; + runProps: string[]; + highLevelParams: string[]; + metricsColumns: any; + selectedRows: any; + } { + const configData = model.getState()?.config; + let selectedRows = model.getState()?.selectedRows; + const grouping = model.getState()?.config?.grouping; + let runs: IParam[] = []; + let params: string[] = []; + let runProps: string[] = []; + let highLevelParams: string[] = []; + const paletteIndex: number = grouping?.paletteIndex || 0; + const metricsColumns: any = {}; + + data?.forEach((run: IRun, index) => { + params = params.concat(getObjectPaths(run.params, run.params)); + runProps = runProps.concat(getObjectPaths(run.props, run.props)); + highLevelParams = highLevelParams.concat( + getObjectPaths(run.params, run.params, '', false, true), + ); + const metricsValues: Record< + string, + Record + > = {}; + run.traces.metric.forEach((trace) => { + metricsColumns[trace.name] = { + ...metricsColumns[trace.name], + [contextToString(trace.context) as string]: '-', + }; + const metricHash = getMetricHash(trace.name, trace.context as any); + metricsValues[metricHash] = { + min: trace.values.min, + max: trace.values.max, + last: trace.values.last, + first: trace.values.first, + }; + }); + const paramKey = encode({ runHash: run.hash }); + + runs.push({ + run, + isHidden: configData!.table.hiddenMetrics!.includes(paramKey), + color: COLORS[paletteIndex][index % COLORS[paletteIndex].length], + key: paramKey, + metricsValues, + dasharray: DASH_ARRAYS[0], + }); + }); + + let sortFields = configData?.table?.sortFields ?? []; + + if (sortFields?.length === 0) { + sortFields = [ + { + value: 'run.props.creation_time', + order: 'desc', + label: '', + group: '', + }, + ]; + } + + const processedData = groupData( + _.orderBy( + runs, + sortFields?.map( + (f: SortField) => + function (run: IParam) { + return getValue(run, f.value, ''); + }, + ), + sortFields?.map((f: SortField) => f.order), + ), + ); + const uniqProps = _.uniq(runProps).sort(); + const uniqParams = _.uniq(params).sort(); + const uniqHighLevelParams = _.uniq(highLevelParams).sort(); + + const mappedData: Record = {}; + + for (let run of runs) { + mappedData[run.run.hash] = { + runHash: run.run.hash, + ...run.run.props, + ...run, + }; + } + + let selected: Record = {}; + + if (selectedRows && !_.isEmpty(selectedRows)) { + for (let rowKey in selectedRows) { + const slicedKey = rowKey.slice(0, rowKey.indexOf('/')); + if (mappedData[slicedKey]) + selected[rowKey] = { + selectKey: rowKey, + ...mappedData[slicedKey], + }; + } + } + + selectedRows = selected; + + return { + data: processedData, + runProps: uniqProps, + params: uniqParams, + highLevelParams: uniqHighLevelParams, + metricsColumns, + selectedRows, + }; + } + + function onActivePointChange( + activePoint: IActivePoint, + focusedStateActive: boolean = false, + ): void { + const { refs, config, groupingSelectOptions, data } = model.getState(); + if (config.table.resizeMode !== ResizeModeEnum.Hide) { + const tableRef: any = refs?.tableRef; + if (tableRef) { + if (focusedStateActive) { + tableRef.current?.scrollToRow?.(activePoint.key); + tableRef.current?.setActiveRow?.( + focusedStateActive ? activePoint.key : null, + ); + } else { + tableRef.current?.setHoveredRow?.(activePoint.key); + } + } + } + let configData = config; + if (configData?.chart) { + // TODO remove this later + // remove unnecessary content prop from tooltip config + if (configData.chart.tooltip?.hasOwnProperty('content')) { + delete configData.chart.tooltip.content; + } + + configData = { + ...configData, + chart: { + ...configData.chart, + focusedState: { + active: focusedStateActive, + key: activePoint.key, + xValue: activePoint.xValue, + yValue: activePoint.yValue, + chartIndex: activePoint.chartIndex, + visId: activePoint.visId || `${activePoint.chartIndex}`, + }, + }, + }; + + if ( + config.chart.focusedState.active !== focusedStateActive || + (config.chart.focusedState.active && + (activePoint.key !== config.chart.focusedState.key || + activePoint.xValue !== config.chart.focusedState.xValue)) + ) { + updateURL({ configData, appName }); + } + } + + const tooltipData = { + ...configData?.chart?.tooltip, + content: getTooltipContent({ + groupingNames: [ + GroupNameEnum.COLOR, + GroupNameEnum.STROKE, + GroupNameEnum.CHART, + ], + groupingSelectOptions, + data, + configData, + activePointKey: configData.chart?.focusedState?.key, + selectedFields: configData.chart?.tooltip?.selectedFields, + }), + }; + model.setState({ config: configData, tooltip: tooltipData }); + } + + function onExportTableData(): void { + const { data, params, config, metricsColumns, groupingSelectOptions } = + model.getState() as IParamsAppModelState; + const tableData = getDataAsTableRows( + data, + metricsColumns, + params, + true, + config, + groupingSelectOptions, + ); + const metricsSelectOptions = getMetricsSelectOptions(metricsColumns, model); + const sortOptions = [...groupingSelectOptions, ...metricsSelectOptions]; + + const tableColumns: ITableColumn[] = getParamsTableColumns( + sortOptions, + metricsColumns, + params, + data[0]?.config, + config.table?.columnsOrder!, + config.table?.hiddenColumns!, + config.table?.metricsValueKey, + config.table?.sortFields, + onSortChange, + config.grouping as any, + onModelGroupingSelectChange, + AppNameEnum.PARAMS, + ); + + const excludedFields: string[] = ['#', 'actions']; + const filteredHeader: string[] = tableColumns.reduce( + (acc: string[], column: ITableColumn) => + acc.concat( + excludedFields.indexOf(column.key) === -1 && !column.isHidden + ? column.key + : [], + ), + [], + ); + + let emptyRow: { [key: string]: string } = {}; + filteredHeader.forEach((column: string) => { + emptyRow[column] = '--'; + }); + + const groupedRows: IMetricTableRowData[][] = + data.length > 1 + ? Object.keys(tableData.rows).map( + (groupedRowKey: string) => tableData.rows[groupedRowKey].items, + ) + : [ + Array.isArray(tableData.rows) + ? tableData.rows + : tableData.rows[Object.keys(tableData.rows)[0]].items, + ]; + const dataToExport: { [key: string]: string }[] = []; + groupedRows?.forEach( + (groupedRow: IMetricTableRowData[], groupedRowIndex: number) => { + groupedRow?.forEach((row: IMetricTableRowData) => { + const filteredRow = getFilteredRow({ + columnKeys: filteredHeader, + row, + }); + dataToExport.push(filteredRow); + }); + if (groupedRows?.length - 1 !== groupedRowIndex) { + dataToExport.push(emptyRow); + } + }, + ); + + const blob = new Blob([JsonToCSV(dataToExport)], { + type: 'text/csv;charset=utf-8;', + }); + saveAs(blob, `params-${moment().format(DATE_EXPORTING_FORMAT)}.csv`); + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.exports.csv); + } + + function updateModelData( + configData = model.getState()!.config!, + shouldURLUpdate?: boolean, + ): void { + const { + data, + params, + runProps, + highLevelParams, + metricsColumns, + selectedRows, + } = processData(model.getState()?.rawData as IRun[]); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + runProps, + }), + ]; + const metricsSelectOptions = getMetricsSelectOptions(metricsColumns, model); + const sortOptions = [...groupingSelectOptions, ...metricsSelectOptions]; + + const tableData = getDataAsTableRows( + data, + metricsColumns, + params, + false, + configData, + groupingSelectOptions, + ); + const tableColumns = getParamsTableColumns( + sortOptions, + metricsColumns, + params, + data[0]?.config, + configData.table?.columnsOrder!, + configData.table?.hiddenColumns!, + configData.table?.metricsValueKey, + configData.table?.sortFields, + onSortChange, + configData.grouping as any, + onModelGroupingSelectChange, + AppNameEnum.PARAMS, + ); + + model.getState()?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + hiddenColumns: configData.table?.hiddenColumns!, + }); + + if (shouldURLUpdate) { + updateURL({ configData, appName }); + } + + model.setState({ + config: configData, + data, + highPlotData: getDataAsLines(data), + chartTitleData: getChartTitleData({ + processedData: data, + groupingSelectOptions, + model: model as IModel, + }), + groupingSelectOptions, + sortOptions, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + selectedRows, + }); + } + + function onModelRunsTagsChange(runHash: string, tags: ITagInfo[]): void { + onRunsTagsChange({ runHash, tags, model, updateModelData }); + } + + function onModelGroupingSelectChange({ + groupName, + list, + }: IOnGroupingSelectChangeParams): void { + let configData = model.getState().config; + + onGroupingSelectChange({ + groupName, + list, + model, + appName, + updateModelData, + }); + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + brushExtents: {}, + }, + }; + } + + model.setState({ config: configData }); + } + + function onModelBookmarkCreate({ + name, + description, + }: { + name: string; + description: string; + }): Promise { + return onBookmarkCreate({ name, description, model, appName }); + } + + function onModelBookmarkUpdate(id: string): void { + onBookmarkUpdate({ id, model, appName }); + } + + function onModelNotificationDelete(id: number): void { + onNotificationDelete({ id, model }); + } + + function onModelNotificationAdd(notification: N & INotification): void { + onNotificationAdd({ notification, model }); + } + + function onModelResetConfigData(): void { + onResetConfigData({ model, getConfig, updateModelData }); + } + + function onSortChange({ + sortFields, + order, + index, + actionType, + field, + }: any): void { + onTableSortChange({ + sortFields, + order, + index, + field, + actionType, + model, + appName, + updateModelData, + }); + } + + function changeLiveUpdateConfig(config: { + enabled?: boolean; + delay?: number; + }): void { + const state = model.getState(); + const configData = state?.config; + const query = configData.select?.query; + const liveUpdateConfig = configData.liveUpdate; + if (!liveUpdateConfig?.enabled && config.enabled && query !== '()') { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + config?.delay || liveUpdateConfig?.delay, + ); + liveUpdateInstance?.start({ + q: query, + }); + } else { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; + } + + const newLiveUpdateConfig = { + ...liveUpdateConfig, + ...config, + }; + model.setState({ + config: { + ...configData, + liveUpdate: newLiveUpdateConfig, + }, + }); + + setItem('paramsLUConfig', encode(newLiveUpdateConfig)); + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].liveUpdate} ${ + config.enabled ? 'on' : 'off' + }`, + ); + } + + function destroy(): void { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; //@TODO check is this need or not + } + + function archiveRuns( + ids: string[], + archived: boolean, + ): { + call: () => Promise; + abort: () => void; + } { + runsArchiveRef = runsService.archiveRuns(ids, archived); + return { + call: async () => { + try { + await runsArchiveRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getParamsData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [ + `Runs are successfully ${ + archived ? 'archived' : 'unarchived' + } `, + ], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.archiveRunsBatch, + ); + } + }, + abort: runsArchiveRef.abort, + }; + } + + function deleteRuns(ids: string[]): { + call: () => Promise; + abort: () => void; + } { + runsDeleteRef = runsService.deleteRuns(ids); + return { + call: async () => { + try { + await runsDeleteRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getParamsData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: ['Runs are successfully deleted'], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.deleteRunsBatch, + ); + } + }, + abort: runsDeleteRef.abort, + }; + } + + const methods = { + initialize, + getAppConfigData: getModelAppConfigData, + getParamsData, + setDefaultAppConfigData: setModelDefaultAppConfigData, + abortRequest, + updateModelData, + onActivePointChange, + onExportTableData, + onBookmarkCreate: onModelBookmarkCreate, + onBookmarkUpdate: onModelBookmarkUpdate, + onNotificationAdd: onModelNotificationAdd, + onNotificationDelete: onModelNotificationDelete, + onResetConfigData: onModelResetConfigData, + onRunsTagsChange: onModelRunsTagsChange, + onSortChange, + destroy, + changeLiveUpdateConfig, + onShuffleChange, + deleteRuns, + archiveRuns, + }; + + if (grouping) { + Object.assign(methods, { + onGroupingSelectChange: onModelGroupingSelectChange, + onGroupingModeChange({ + groupName, + value, + }: IOnGroupingModeChangeParams): void { + let configData = model.getState().config; + + onGroupingModeChange({ + groupName, + value, + model, + appName, + updateModelData, + }); + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + brushExtents: {}, + }, + }; + } + + model.setState({ config: configData }); + }, + onGroupingPaletteChange(index: number): void { + onGroupingPaletteChange({ index, model, appName, updateModelData }); + }, + onGroupingReset(groupName: GroupNameEnum): void { + let configData = model.getState().config; + + onGroupingReset({ groupName, model, appName, updateModelData }); + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + brushExtents: {}, + }, + }; + } + + model.setState({ config: configData }); + }, + onGroupingApplyChange(groupName: GroupNameEnum): void { + let configData = model.getState().config; + + onGroupingApplyChange({ + groupName, + model, + appName, + updateModelData, + }); + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + brushExtents: {}, + }, + }; + } + + model.setState({ config: configData }); + }, + onGroupingPersistenceChange(groupName: GroupNameEnum): void { + onGroupingPersistenceChange({ + groupName, + model, + appName, + updateModelData, + }); + }, + onShuffleChange(name: 'color' | 'stroke'): void { + onShuffleChange({ name, model, updateModelData }); + }, + }); + } + if (selectForm) { + Object.assign(methods, { + onParamsSelectChange(data: D & Partial): void { + onSelectOptionsChange({ data, model }); + }, + onSelectRunQueryChange(query: string): void { + onSelectRunQueryChange({ query, model }); + }, + }); + } + if (components?.charts?.[0]) { + Object.assign(methods, { + onChangeTooltip(tooltip: Partial): void { + onChangeTooltip({ + tooltip, + groupingNames: [ + GroupNameEnum.COLOR, + GroupNameEnum.STROKE, + GroupNameEnum.CHART, + ], + model, + appName, + }); + }, + onColorIndicatorChange(): void { + onColorIndicatorChange({ model, appName, updateModelData }); + }, + onCurveInterpolationChange(): void { + onCurveInterpolationChange({ model, appName, updateModelData }); + }, + onAxisBrushExtentChange( + key: string, + extent: [number, number] | null, + chartIndex: number, + ): void { + onAxisBrushExtentChange({ + key, + extent, + chartIndex, + model, + updateModelData, + }); + }, + }); + } + if (components?.table) { + Object.assign(methods, { + onRowHeightChange(height: RowHeightSize): void { + onRowHeightChange({ height, model, appName }); + }, + onTableRowHover(rowKey?: string): void { + onTableRowHover({ rowKey, model }); + }, + onTableRowClick(rowKey?: string): void { + onTableRowClick({ rowKey, model }); + }, + onSortFieldsChange(sortFields: [string, any][]): void { + onSortFieldsChange({ sortFields, model, appName, updateModelData }); + }, + onParamVisibilityChange(metricsKeys: string[]): void { + onParamVisibilityChange({ + metricsKeys, + model, + appName, + updateModelData, + }); + }, + onColumnsOrderChange(columnsOrder: any): void { + onColumnsOrderChange({ + columnsOrder, + model, + appName, + updateModelData, + }); + }, + onColumnsVisibilityChange(hiddenColumns: string[]): void { + onColumnsVisibilityChange({ + hiddenColumns, + model, + appName, + updateModelData, + }); + }, + onTableResizeModeChange(mode: ResizeModeEnum): void { + onTableResizeModeChange({ mode, model, appName }); + }, + onTableDiffShow(): void { + onTableDiffShow({ model, appName, updateModelData }); + }, + onTableResizeEnd(tableHeight: string): void { + onTableResizeEnd({ tableHeight, model, appName }); + }, + onSortReset(): void { + updateSortFields({ + sortFields: [], + model, + appName, + updateModelData, + }); + }, + updateColumnsWidths(key: string, width: number, isReset: boolean): void { + updateColumnsWidths({ + key, + width, + isReset, + model, + appName, + updateModelData, + }); + }, + onRowSelect({ + actionType, + data, + }: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + }): void { + return onRowSelect({ actionType, data, model }); + }, + onRowsVisibilityChange(metricKeys: string[]): void { + return onRowsVisibilityChange({ + metricKeys, + model, + appName, + updateModelData, + }); + }, + }); + } + + return methods; +} + +export default getParamsModelMethods; diff --git a/src/src/services/models/explorer/runsModelMethods.ts b/src/src/services/models/explorer/runsModelMethods.ts new file mode 100644 index 00000000..45d85e7f --- /dev/null +++ b/src/src/services/models/explorer/runsModelMethods.ts @@ -0,0 +1,1187 @@ +import moment from 'moment'; +import { saveAs } from 'file-saver'; +import _ from 'lodash-es'; + +import COLORS from 'config/colors/colors'; +import DASH_ARRAYS from 'config/dash-arrays/dashArrays'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_EXPORTING_FORMAT, TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { getSuggestionsByExplorer } from 'config/monacoConfig/monacoConfig'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; +import { MetricsValueKeyEnum } from 'config/enums/tableEnums'; + +import { + getRunsTableColumns, + runsTableRowRenderer, +} from 'pages/Runs/components/RunsTableGrid/RunsTableGrid'; + +import * as analytics from 'services/analytics'; +import runsService from 'services/api/runs/runsService'; +import LiveUpdateService from 'services/live-update/examples/LiveUpdateBridge.example'; +import projectsService from 'services/api/projects/projectsService'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { IMetric } from 'types/services/models/metrics/metricModel'; +import { + IMetricsCollection, + IMetricTableRowData, +} from 'types/services/models/metrics/metricsAppModel'; +import { + IMetricTrace, + IParamTrace, + IRun, +} from 'types/services/models/metrics/runModel'; +import { IParam } from 'types/services/models/params/paramsAppModel'; +import { IRunsAppModelState } from 'types/services/models/runs/runsAppModel'; +import { + IAppInitialConfig, + IAppModelConfig, + IAppModelState, +} from 'types/services/models/explorer/createAppModel'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { aggregateGroupData } from 'utils/aggregateGroupData'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import { getFilteredGroupingOptions } from 'utils/app/getFilteredGroupingOptions'; +import getFilteredRow from 'utils/app/getFilteredRow'; +import { getGroupingPersistIndex } from 'utils/app/getGroupingPersistIndex'; +import onColumnsOrderChange from 'utils/app/onColumnsOrderChange'; +import onColumnsVisibilityChange from 'utils/app/onColumnsVisibilityChange'; +import onRowHeightChange from 'utils/app/onRowHeightChange'; +import onSelectRunQueryChange from 'utils/app/onSelectRunQueryChange'; +import { onTableDiffShow } from 'utils/app/onTableDiffShow'; +import updateColumnsWidths from 'utils/app/updateColumnsWidths'; +import updateSortFields from 'utils/app/updateTableSortFields'; +import contextToString from 'utils/contextToString'; +import { + decodeBufferPairs, + decodePathsVals, + iterFoldTree, +} from 'utils/encoder/streamEncoding'; +import { formatValue } from 'utils/formatValue'; +import getObjectPaths from 'utils/getObjectPaths'; +import JsonToCSV from 'utils/JsonToCSV'; +import { setItem } from 'utils/storage'; +import { encode } from 'utils/encoder/encoder'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import updateURL from 'utils/app/updateURL'; +import { getValue } from 'utils/helper'; +import onRowSelect from 'utils/app/onRowSelect'; +import onToggleColumnsColorScales from 'utils/app/onToggleColumnsColorScales'; +import onRunsTagsChange from 'utils/app/onRunsTagsChange'; +import setRequestProgress from 'utils/app/setRequestProgress'; +import { processDurationTime } from 'utils/processDurationTime'; +import { getMetricsInitialRowData } from 'utils/app/getMetricsInitialRowData'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import saveRecentSearches from 'utils/saveRecentSearches'; +import onMetricsValueKeyChange from 'utils/app/onMetricsValueKeyChange'; + +import { InitialAppModelType } from './config'; + +// ************ Runs App Model Methods ************ +function getRunsModelMethods( + initialApp: InitialAppModelType, + appConfig: IAppInitialConfig, +) { + const { appName, grouping, components, selectForm } = appConfig; + const { model, setModelDefaultAppConfigData } = initialApp; + + let runsRequestRef: { + call: ( + exceptionHandler: (detail: any) => void, + ) => Promise[]>>; + abort: () => void; + }; + let runsArchiveRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let runsDeleteRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let liveUpdateInstance: LiveUpdateService | null; + let updateTableTimeoutId: number; + + function initialize(appId: string = '') { + model.init(); + const state: Partial = {}; + if (grouping) { + state.groupingSelectOptions = []; + } + if (components?.table) { + state.refs = { + ...state.refs, + tableRef: { current: null }, + }; + } + if (components?.charts?.[0]) { + state.refs = { + ...state.refs, + chartPanelRef: { current: null }, + }; + } + model.setState({ ...state }); + if (!appId) { + setModelDefaultAppConfigData(); + } + + const liveUpdateState = model.getState()?.config.liveUpdate; + projectsService + .getProjectParams(['metric']) + .call() + .then((data) => { + model.setState({ + selectFormData: { + suggestions: getSuggestionsByExplorer(appName, data), + }, + }); + }); + if (liveUpdateState?.enabled) { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + liveUpdateState.delay, + ); + } + try { + getRunsData().call((detail) => { + exceptionHandler({ detail, model }); + }); + } catch (err: any) { + onNotificationAdd({ + model, + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + }); + } + } + + function abortRequest(): void { + if (runsRequestRef) { + runsRequestRef.abort(); + } + setRequestProgress(model); + model.setState({ + requestStatus: RequestStatusEnum.Ok, + }); + onModelNotificationAdd({ + id: Date.now(), + severity: 'info', + messages: ['Request has been cancelled'], + }); + } + + function onModelRunsTagsChange(runHash: string, tags: ITagInfo[]): void { + onRunsTagsChange({ runHash, tags, model, updateModelData }); + } + + function getRunsData( + shouldUrlUpdate?: boolean, + shouldResetSelectedRows?: boolean, + isInitial = true, + queryString?: string, + ): { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + } { + if (runsRequestRef) { + runsRequestRef.abort(); + } + // isInitial: true --> when search button clicked or data is loading at the first time + const modelState = prepareModelStateToCall(isInitial); + const configData = modelState?.config; + if (queryString) { + configData.select.query = queryString; + } + const query = configData?.select?.query || ''; + const pagination = configData?.pagination; + + liveUpdateInstance?.stop().then(); + + runsRequestRef = runsService.getRunsData(query, 45, pagination?.offset); + let limit = pagination.limit; + setRequestProgress(model); + return { + call: async () => { + try { + const stream = await runsRequestRef.call((detail) => { + exceptionHandler({ detail, model }); + }); + let bufferPairs = decodeBufferPairs(stream as ReadableStream); + let decodedPairs = decodePathsVals(bufferPairs); + let objects = iterFoldTree(decodedPairs, 1); + + const runsData: IRun[] = isInitial + ? [] + : modelState?.rawData; + let count = 0; + for await (let [keys, val] of objects) { + const data = { ...(val as any), hash: keys[0] }; + if (data.hash.startsWith('progress')) { + const { 0: checked, 1: trackedRuns } = data; + setRequestProgress(model, { + matched: runsData.length, + checked, + trackedRuns, + }); + } else { + if (isInitial) { + const runData: any = val; + runsData.push({ ...runData, hash: keys[0] } as any); + } else { + if (count >= 0) { + const runData: any = val; + runsData.push({ ...runData, hash: keys[0] } as any); + } + } + count++; + } + } + const { data, params, metricsColumns, selectedRows } = + processData(runsData); + const tableData = getDataAsTableRows(data, metricsColumns, params); + const tableColumns = getRunsTableColumns( + metricsColumns, + params, + model.getState()?.config?.table.columnsOrder!, + model.getState()?.config?.table.hiddenColumns!, + ); + updateTableData(tableData, tableColumns, configData); + + model.setState({ + data, + selectedRows: shouldResetSelectedRows + ? {} + : selectedRows ?? model.getState()?.selectedRows, + rawData: runsData, + infiniteIsPending: false, + tableColumns, + tableData: tableData.rows, + sameValueColumns: tableData.sameValueColumns, + config: { + ...modelState?.config, + pagination: { + ...modelState?.config.pagination, + isLatest: + !isInitial && count < modelState?.config.pagination.limit, + }, + }, + }); + saveRecentSearches(appName, query); + if (shouldUrlUpdate) { + updateURL({ configData, appName }); + } + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [`${ex.name}, ${ex.message}`], + }, + model, + }); + } + } + const rowDataLength = model.getState()?.tableData?.length || 0; + limit = rowDataLength >= 45 ? rowDataLength : 45; + liveUpdateInstance?.start({ + q: query, + limit, + }); + }, + abort: runsRequestRef.abort, + }; + } + + function updateModelData( + configData = model.getState()!.config!, + shouldURLUpdate?: boolean, + ): void { + const { data, params, metricsColumns, selectedRows } = processData( + model.getState()?.rawData, + ); + const tableData = getDataAsTableRows(data, metricsColumns, params); + const tableColumns: ITableColumn[] = getRunsTableColumns( + metricsColumns, + params, + configData?.table?.columnsOrder!, + configData?.table?.hiddenColumns!, + ); + model.setState({ + config: configData, + data, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + selectedRows, + }); + updateTableData(tableData, tableColumns, configData); + } + + function updateTableData( + tableData: { + rows: any; + sameValueColumns: string[]; + }, + tableColumns: ITableColumn[], + configData: IAppModelConfig | any, + ): void { + if (updateTableTimeoutId) { + clearTimeout(updateTableTimeoutId); + } + + updateTableTimeoutId = window.setTimeout(() => { + model.setState({ requestStatus: RequestStatusEnum.Ok }); + model.getState()?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + hiddenColumns: configData.table.hiddenColumns!, + }); + }, 0); + } + + function prepareModelStateToCall(isInitial: boolean): IRunsAppModelState { + const config = model.getState()?.config; + if (isInitial) { + model.setState({ + config: { + ...config, + pagination: { + limit: 45, + offset: null, + isLatest: false, + }, + }, + notifyData: [], + rawData: [], + tableColumns: [], + tableData: [], + data: [], + }); + } + + model.setState({ + requestStatus: isInitial + ? RequestStatusEnum.Pending + : RequestStatusEnum.Ok, + infiniteIsPending: !isInitial, + }); + + return model.getState(); + } + + function processData(data: any[]): { + data: any[]; + params: string[]; + runProps: string[]; + metricsColumns: any; + selectedRows: any; + runHashArray: string[]; + unselectedRowsCount: number; + } { + const grouping = model.getState()?.config?.grouping; + const paletteIndex: number = grouping?.paletteIndex || 0; + const metricsColumns: Record> = {}; + const runHashArray: string[] = []; + let selectedRows = model.getState()?.selectedRows; + let runs: IParam[] = []; + let params: string[] = []; + let runProps: string[] = []; + let unselectedRowsCount = 0; + data?.forEach((run: IRun, index) => { + params = params.concat(getObjectPaths(run.params, run.params)); + runProps = runProps.concat(getObjectPaths(run.props, run.props)); + const metricsValues: Record< + string, + Record + > = {}; + run.traces.metric.forEach((trace) => { + metricsColumns[trace.name] = { + ...metricsColumns[trace.name], + [contextToString(trace.context) as string]: '-', + }; + const metricHash = getMetricHash(trace.name, trace.context as any); + metricsValues[metricHash] = { + min: trace.values.min, + max: trace.values.max, + last: trace.values.last, + first: trace.values.first, + }; + }); + runHashArray.push(run.hash); + runs.push({ + run, + isHidden: false, + color: COLORS[paletteIndex][index % COLORS[paletteIndex].length], + key: encode({ runHash: run.hash }), + dasharray: DASH_ARRAYS[0], + metricsValues, + }); + }); + + const processedData = groupData(runs); + const uniqParams = _.uniq(params).sort(); + const uniqProps = _.uniq(runProps).sort(); + + const mappedData = + data?.reduce((acc: any, item: any) => { + acc[item.hash] = { runHash: item.hash, ...item.props }; + return acc; + }, {}) || {}; + if (selectedRows && !_.isEmpty(selectedRows)) { + selectedRows = Object.keys(selectedRows).reduce( + (acc: any, key: string) => { + const slicedKey = key.slice(0, key.indexOf('/')); + if (runHashArray.includes(slicedKey)) { + acc[key] = { + selectKey: key, + ...mappedData[slicedKey], + }; + } else { + unselectedRowsCount++; + } + return acc; + }, + {}, + ); + } + return { + data: processedData, + params: uniqParams, + runProps: uniqProps, + metricsColumns, + selectedRows, + runHashArray, + unselectedRowsCount, + }; + } + + function groupData(data: any): IMetricsCollection[] { + const configData = model.getState()!.config; + const grouping = configData!.grouping; + + const groupByColor = getFilteredGroupingOptions({ + groupName: GroupNameEnum.COLOR, + model, + }); + const groupByStroke = getFilteredGroupingOptions({ + groupName: GroupNameEnum.STROKE, + model, + }); + const groupByChart = getFilteredGroupingOptions({ + groupName: GroupNameEnum.CHART, + model, + }); + if ( + groupByColor.length === 0 && + groupByStroke.length === 0 && + groupByChart.length === 0 + ) { + return [ + { + config: null, + color: null, + dasharray: null, + chartIndex: 0, + data: data, + }, + ]; + } + const groupValues: { + [key: string]: IMetricsCollection; + } = {}; + + const groupingFields = _.uniq( + groupByColor.concat(groupByStroke).concat(groupByChart), + ); + + for (let i = 0; i < data.length; i++) { + const groupValue: { [key: string]: string } = {}; + groupingFields.forEach((field) => { + groupValue[field] = getValue(data[i], field); + }); + const groupKey = encode(groupValue); + if (groupValues.hasOwnProperty(groupKey)) { + groupValues[groupKey].data.push(data[i]); + } else { + groupValues[groupKey] = { + key: groupKey, + config: groupValue, + color: null, + dasharray: null, + chartIndex: 0, + data: [data[i]], + }; + } + } + + let colorIndex = 0; + let dasharrayIndex = 0; + let chartIndex = 0; + + const colorConfigsMap: { [key: string]: number } = {}; + const dasharrayConfigsMap: { [key: string]: number } = {}; + const chartIndexConfigsMap: { [key: string]: number } = {}; + const { paletteIndex = 0 } = grouping || {}; + + for (let groupKey in groupValues) { + const groupValue = groupValues[groupKey]; + + if (groupByColor.length > 0) { + const colorConfig = _.pick(groupValue.config, groupByColor); + const colorKey = encode(colorConfig); + + if (grouping.persistence.color && grouping.isApplied.color) { + let index = getGroupingPersistIndex({ + groupConfig: colorConfig, + grouping, + groupName: 'color', + }); + groupValue.color = + COLORS[paletteIndex][ + Number(index % BigInt(COLORS[paletteIndex].length)) + ]; + } else if (colorConfigsMap.hasOwnProperty(colorKey)) { + groupValue.color = + COLORS[paletteIndex][ + colorConfigsMap[colorKey] % COLORS[paletteIndex].length + ]; + } else { + colorConfigsMap[colorKey] = colorIndex; + groupValue.color = + COLORS[paletteIndex][colorIndex % COLORS[paletteIndex].length]; + colorIndex++; + } + } + + if (groupByStroke.length > 0) { + const dasharrayConfig = _.pick(groupValue.config, groupByStroke); + const dasharrayKey = encode(dasharrayConfig); + if (grouping.persistence.stroke && grouping.isApplied.stroke) { + let index = getGroupingPersistIndex({ + groupConfig: dasharrayConfig, + grouping, + groupName: 'stroke', + }); + groupValue.dasharray = + DASH_ARRAYS[Number(index % BigInt(DASH_ARRAYS.length))]; + } else if (dasharrayConfigsMap.hasOwnProperty(dasharrayKey)) { + groupValue.dasharray = + DASH_ARRAYS[dasharrayConfigsMap[dasharrayKey] % DASH_ARRAYS.length]; + } else { + dasharrayConfigsMap[dasharrayKey] = dasharrayIndex; + groupValue.dasharray = + DASH_ARRAYS[dasharrayIndex % DASH_ARRAYS.length]; + dasharrayIndex++; + } + } + + if (groupByChart.length > 0) { + const chartIndexConfig = _.pick(groupValue.config, groupByChart); + const chartIndexKey = encode(chartIndexConfig); + if (chartIndexConfigsMap.hasOwnProperty(chartIndexKey)) { + groupValue.chartIndex = chartIndexConfigsMap[chartIndexKey]; + } else { + chartIndexConfigsMap[chartIndexKey] = chartIndex; + groupValue.chartIndex = chartIndex; + chartIndex++; + } + } + } + + const groups = Object.values(groupValues); + const chartConfig = configData!.chart; + + return aggregateGroupData({ + groupData: groups, + methods: { + area: chartConfig.aggregationConfig.methods.area, + line: chartConfig.aggregationConfig.methods.line, + }, + scale: chartConfig.axesScaleType, + }); + } + + function getDataAsTableRows( + processedData: any, + metricsColumns: any, + paramKeys: string[], + isRawData?: boolean, + ): { rows: IMetricTableRowData[] | any; sameValueColumns: string[] } { + if (!processedData) { + return { + rows: [], + sameValueColumns: [], + }; + } + + const metricsValueKey = + model.getState()?.config?.table.metricsValueKey || + MetricsValueKeyEnum.LAST; + const rows: any = processedData[0]?.config !== null ? {} : []; + let rowIndex = 0; + const sameValueColumns: string[] = []; + const columnsFlattenValues: { [key: string]: Set } = {}; + processedData.forEach((metricsCollection: any) => { + const groupKey = metricsCollection.key; + const columnsValues: { [key: string]: string[] } = {}; + if (metricsCollection.config !== null) { + const groupHeaderRow = { + meta: { + chartIndex: metricsCollection.chartIndex + 1, + }, + key: groupKey!, + color: metricsCollection.color, + dasharray: metricsCollection.dasharray, + experiment: '', + hash: '', + run: '', + metric: '', + context: [], + children: [], + }; + rows[groupKey!] = { + data: groupHeaderRow, + items: [], + }; + } + metricsCollection.data.forEach((metric: any) => { + const metricsRowValues = getMetricsInitialRowData(metricsColumns); + metric.run.traces.metric.forEach((trace: any) => { + const metricHash = getMetricHash(trace.name, trace.context); + metricsRowValues[metricHash] = formatValue( + trace.values[metricsValueKey], + ); + }); + + const rowValues: any = { + key: metric.key, + selectKey: `${metric.run.hash}/${metric.key}`, + hash: metric.run.hash, + index: rowIndex, + color: metricsCollection.color ?? metric.color, + dasharray: metricsCollection.dasharray ?? metric.dasharray, + experiment: metric.run.props.experiment?.name ?? 'default', + experiment_description: + metric.run.props.experiment?.description ?? '-', + experimentId: metric.run.props.experiment?.id ?? '', + run: metric.run.props.name, + description: metric.run.props?.description ?? '-', + date: moment(metric.run.props.creation_time * 1000).format( + TABLE_DATE_FORMAT, + ), + duration: processDurationTime( + metric.run.props.creation_time * 1000, + metric.run.props.end_time + ? metric.run.props.end_time * 1000 + : Date.now(), + ), + active: metric.run.props.active, + metric: metric.name, + tags: metric.run.props.tags.map((tag: any) => ({ + archived: false, + color: tag.color, + id: tag.id, + comment: tag.description, + name: tag.name, + run_count: 0, + })), + ...metricsRowValues, + }; + rowIndex++; + [ + 'experiment', + 'run', + 'hash', + 'date', + 'duration', + 'description', + 'metric', + 'context', + 'step', + 'epoch', + 'time', + ].forEach((key) => { + if (columnsValues.hasOwnProperty(key)) { + if (!_.some(columnsValues[key], rowValues[key])) { + columnsValues[key].push(rowValues[key]); + } + } else { + columnsValues[key] = [rowValues[key]]; + } + }); + paramKeys.forEach((paramKey) => { + const value = getValue(metric.run.params, paramKey, '-'); + rowValues[paramKey] = formatValue(value); + if (columnsValues.hasOwnProperty(paramKey)) { + if ( + _.findIndex(columnsValues[paramKey], (paramValue) => + _.isEqual(value, paramValue), + ) === -1 + ) { + columnsValues[paramKey].push(value); + } + } else { + columnsValues[paramKey] = [value]; + } + }); + if (metricsCollection.config !== null) { + rows[groupKey!].items.push( + isRawData + ? rowValues + : runsTableRowRenderer(rowValues, onModelRunsTagsChange), + ); + } else { + rows.push( + isRawData + ? rowValues + : runsTableRowRenderer(rowValues, onModelRunsTagsChange), + ); + } + }); + + for (let columnKey in columnsValues) { + columnsFlattenValues[columnKey] = new Set([ + ...(columnsFlattenValues[columnKey] || []), + ...(columnsValues[columnKey] || []), + ]); + + if (metricsCollection.config !== null) { + rows[groupKey!].data[columnKey] = + columnsValues[columnKey].length === 1 + ? columnsValues[columnKey][0] + : columnsValues[columnKey]; + } + + if (metricsCollection.config !== null && !isRawData) { + rows[groupKey!].data = runsTableRowRenderer( + rows[groupKey!].data, + onModelRunsTagsChange, + true, + Object.keys(columnsValues), + ); + } + } + }); + for (let columnKey in columnsFlattenValues) { + if (columnsFlattenValues[columnKey].size === 1) { + sameValueColumns.push(columnKey); + } + } + return { rows, sameValueColumns }; + } + + function onModelNotificationAdd(notification: N & INotification): void { + onNotificationAdd({ notification, model }); + } + + function getLastRunsData( + lastRow: any, + ): + | { call: (exception: any) => Promise; abort: () => void } + | undefined { + const modelData: Partial = model.getState(); + const infiniteIsPending = modelData?.infiniteIsPending; + const isLatest = modelData?.config.pagination.isLatest; + + if (!infiniteIsPending && !isLatest) { + const lastRowKey = modelData?.rawData[modelData?.rawData.length - 1].hash; + model.setState({ + config: { + ...modelData?.config, + pagination: { + ...modelData?.config.pagination, + offset: lastRowKey, + }, + }, + }); + + return getRunsData(false, false, false); + } + } + + function onExportTableData(): void { + // @TODO need to get data and params from state not from processData + const { data, params, metricsColumns } = processData( + model.getState()?.rawData, + ); + const tableData = getDataAsTableRows(data, metricsColumns, params, true); + const configData = model.getState()?.config; + const tableColumns: ITableColumn[] = getRunsTableColumns( + metricsColumns, + params, + configData?.table.columnsOrder!, + configData?.table.hiddenColumns!, + ); + const excludedFields: string[] = ['#', 'actions']; + const filteredHeader: string[] = tableColumns.reduce( + (acc: string[], column: ITableColumn) => + acc.concat( + excludedFields.indexOf(column.key) === -1 && !column.isHidden + ? column.key + : [], + ), + [], + ); + + let emptyRow: { [key: string]: string } = {}; + filteredHeader.forEach((column: string) => { + emptyRow[column] = '--'; + }); + + const groupedRows: IMetricTableRowData[][] = + data.length > 1 + ? Object.keys(tableData.rows).map( + (groupedRowKey: string) => tableData.rows[groupedRowKey].items, + ) + : [ + Array.isArray(tableData.rows) + ? tableData.rows + : tableData.rows[Object.keys(tableData.rows)[0]].items, + ]; + + const dataToExport: { [key: string]: string }[] = []; + + groupedRows?.forEach( + (groupedRow: IMetricTableRowData[], groupedRowIndex: number) => { + groupedRow?.forEach((row: IMetricTableRowData) => { + const filteredRow = getFilteredRow({ + columnKeys: filteredHeader, + row, + }); + dataToExport.push(filteredRow); + }); + if (groupedRows?.length - 1 !== groupedRowIndex) { + dataToExport.push(emptyRow); + } + }, + ); + const blob = new Blob([JsonToCSV(dataToExport)], { + type: 'text/csv;charset=utf-8;', + }); + saveAs(blob, `runs-${moment().format(DATE_EXPORTING_FORMAT)}.csv`); + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.exports.csv); + } + + function onModelNotificationDelete(id: number): void { + onNotificationDelete({ id, model }); + } + + function updateData(newData: any): void { + const { data, params, metricsColumns, selectedRows, unselectedRowsCount } = + processData(newData); + if (unselectedRowsCount) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'info', + closeDelay: 5000, + messages: [ + 'Live update: runs have been updated.', + `${unselectedRowsCount} of selected runs have been left out of the table.`, + ], + }, + model, + }); + } + + const modelState = model.getState() as IRunsAppModelState; + const tableData = getDataAsTableRows(data, metricsColumns, params); + const tableColumns = getRunsTableColumns( + metricsColumns, + params, + model.getState()?.config?.table.columnsOrder!, + model.getState()?.config?.table.hiddenColumns!, + ); + const lastRowKey = newData[newData.length - 1].hash; + model.setState({ + requestStatus: RequestStatusEnum.Ok, + data, + rowData: newData, + infiniteIsPending: false, + tableColumns, + tableData: tableData.rows, + selectedRows, + sameValueColumns: tableData.sameValueColumns, + config: { + ...modelState?.config, + pagination: { + ...modelState?.config.pagination, + offset: lastRowKey, + isLatest: false, + }, + }, + }); + + model.getState()?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + hiddenColumns: modelState?.config.table.hiddenColumns!, + }); + } + + function destroy(): void { + runsRequestRef.abort(); + liveUpdateInstance?.clear(); + liveUpdateInstance = null; //@TODO check is this need or not + model.setState({ + ...model.getState(), + selectFormData: { + ...model.getState().selectFormData, + error: null, + }, + }); + } + + function changeLiveUpdateConfig(config: { + enabled?: boolean; + delay?: number; + }): void { + const state = model.getState() as IRunsAppModelState; + const configData = state?.config; + const liveUpdateConfig = configData.liveUpdate; + + if (!liveUpdateConfig?.enabled && config.enabled) { + const query = configData?.select?.query || ''; + const rowDataLength = model.getState()?.tableData?.length || 0; + const limit = rowDataLength >= 45 ? rowDataLength : 45; + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + config?.delay || liveUpdateConfig?.delay, + ); + liveUpdateInstance.start({ + q: query, + limit, + }); + } else { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; + } + const newLiveUpdateConfig = { + ...liveUpdateConfig, + ...config, + }; + model.setState({ + config: { + ...configData, + liveUpdate: newLiveUpdateConfig, + }, + }); + + setItem('runsLUConfig', encode(newLiveUpdateConfig)); + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].liveUpdate} ${ + config.enabled ? 'on' : 'off' + }`, + ); + } + + function archiveRuns( + ids: string[], + archived: boolean, + ): { + call: () => Promise; + abort: () => void; + } { + runsArchiveRef = runsService.archiveRuns(ids, archived); + return { + call: async () => { + try { + await runsArchiveRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getRunsData(false, true).call((detail: any) => { + exceptionHandler({ detail, model }); + }); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [ + `Runs are successfully ${ + archived ? 'archived' : 'unarchived' + } `, + ], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.runs.table.archiveRunsBatch, + ); + } + }, + abort: runsArchiveRef.abort, + }; + } + + function deleteRuns(ids: string[]): { + call: () => Promise; + abort: () => void; + } { + runsDeleteRef = runsService.deleteRuns(ids); + return { + call: async () => { + try { + await runsDeleteRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getRunsData(false, true).call((detail: any) => { + exceptionHandler({ detail, model }); + }); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: ['Runs are successfully deleted'], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.deleteRunsBatch, + ); + } + }, + abort: runsDeleteRef.abort, + }; + } + + const methods = { + destroy, + initialize, + getRunsData, + abortRequest, + updateModelData, + getLastRunsData, + onExportTableData, + onNotificationDelete: onModelNotificationDelete, + setDefaultAppConfigData: setModelDefaultAppConfigData, + onRunsTagsChange: onModelRunsTagsChange, + changeLiveUpdateConfig, + archiveRuns, + deleteRuns, + }; + + if (grouping) { + Object.assign(methods, {}); + } + if (selectForm) { + Object.assign(methods, { + onSelectRunQueryChange(query: string): void { + onSelectRunQueryChange({ query, model }); + }, + }); + } + if (components?.charts?.[0]) { + Object.assign(methods, {}); + } + if (components?.table) { + Object.assign(methods, { + onMetricsValueKeyChange(metricsValueKey: MetricsValueKeyEnum): void { + onMetricsValueKeyChange({ + metricsValueKey, + model, + appName, + updateModelData, + }); + }, + onRowHeightChange(height: RowHeightSize): void { + onRowHeightChange({ height, model, appName }); + }, + onColumnsOrderChange(columnsOrder: any): void { + onColumnsOrderChange({ + columnsOrder, + model, + appName, + updateModelData, + }); + }, + onColumnsVisibilityChange(hiddenColumns: string[]): void { + onColumnsVisibilityChange({ + hiddenColumns, + model, + appName, + updateModelData, + }); + }, + onTableDiffShow(): void { + onTableDiffShow({ model, appName, updateModelData }); + }, + onSortReset(): void { + updateSortFields({ + sortFields: [], + model, + appName, + updateModelData, + }); + }, + updateColumnsWidths(key: string, width: number, isReset: boolean): void { + updateColumnsWidths({ + key, + width, + isReset, + model, + appName, + updateModelData, + }); + }, + onRowSelect({ + actionType, + data, + }: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + }): void { + return onRowSelect({ actionType, data, model }); + }, + onToggleColumnsColorScales(colKey: string): void { + onToggleColumnsColorScales({ + colKey, + model, + appName, + updateModelData, + }); + }, + }); + } + + return methods; +} + +export default getRunsModelMethods; diff --git a/src/src/services/models/explorer/scattersModelMethods.ts b/src/src/services/models/explorer/scattersModelMethods.ts new file mode 100644 index 00000000..575d9e8c --- /dev/null +++ b/src/src/services/models/explorer/scattersModelMethods.ts @@ -0,0 +1,1606 @@ +import moment from 'moment'; +import { saveAs } from 'file-saver'; +import _ from 'lodash-es'; + +import { IPoint } from 'components/ScatterPlot'; + +import COLORS from 'config/colors/colors'; +import DASH_ARRAYS from 'config/dash-arrays/dashArrays'; +import { MetricsValueKeyEnum, ResizeModeEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_EXPORTING_FORMAT, TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { getSuggestionsByExplorer } from 'config/monacoConfig/monacoConfig'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + getParamsTableColumns, + paramsTableRowRenderer, +} from 'pages/Params/components/ParamsTableGrid/ParamsTableGrid'; + +import * as analytics from 'services/analytics'; +import runsService from 'services/api/runs/runsService'; +import LiveUpdateService from 'services/live-update/examples/LiveUpdateBridge.example'; +import projectsService from 'services/api/projects/projectsService'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { + IGroupingSelectOption, + IMetricsCollection, + IMetricTableRowData, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; +import { IParamTrace, IRun } from 'types/services/models/metrics/runModel'; +import { IModel } from 'types/services/models/model'; +import { + IParam, + IParamsAppModelState, +} from 'types/services/models/params/paramsAppModel'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { IDimensionType } from 'types/utils/d3/drawParallelAxes'; +import { + IAppInitialConfig, + IAppModelConfig, + IAppModelState, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { IProjectParamsMetrics } from 'types/services/models/projects/projectsModel'; +import { + IScatterAppModelState, + ITrendlineOptions, +} from 'types/services/models/scatter/scatterAppModel'; +import { ITagInfo, ITagProps } from 'types/pages/tags/Tags'; + +import exceptionHandler from 'utils/app/exceptionHandler'; +import getChartTitleData from 'utils/app/getChartTitleData'; +import { getFilteredGroupingOptions } from 'utils/app/getFilteredGroupingOptions'; +import getFilteredRow from 'utils/app/getFilteredRow'; +import { getGroupingPersistIndex } from 'utils/app/getGroupingPersistIndex'; +import getGroupingSelectOptions from 'utils/app/getGroupingSelectOptions'; +import getRunData from 'utils/app/getRunData'; +import onChangeTooltip from 'utils/app/onChangeTooltip'; +import onColumnsOrderChange from 'utils/app/onColumnsOrderChange'; +import onColumnsVisibilityChange from 'utils/app/onColumnsVisibilityChange'; +import onGroupingApplyChange from 'utils/app/onGroupingApplyChange'; +import onGroupingModeChange from 'utils/app/onGroupingModeChange'; +import onGroupingPaletteChange from 'utils/app/onGroupingPaletteChange'; +import onGroupingPersistenceChange from 'utils/app/onGroupingPersistenceChange'; +import onGroupingReset from 'utils/app/onGroupingReset'; +import onGroupingSelectChange from 'utils/app/onGroupingSelectChange'; +import onSelectOptionsChange from 'utils/app/onSelectOptionsChange'; +import onParamVisibilityChange from 'utils/app/onParamsVisibilityChange'; +import onRowHeightChange from 'utils/app/onRowHeightChange'; +import onRowVisibilityChange from 'utils/app/onRowVisibilityChange'; +import onSelectRunQueryChange from 'utils/app/onSelectRunQueryChange'; +import onSortFieldsChange from 'utils/app/onSortFieldsChange'; +import { onTableDiffShow } from 'utils/app/onTableDiffShow'; +import { onTableResizeEnd } from 'utils/app/onTableResizeEnd'; +import onTableResizeModeChange from 'utils/app/onTableResizeModeChange'; +import onTableRowClick from 'utils/app/onTableRowClick'; +import onTableRowHover from 'utils/app/onTableRowHover'; +import onTableSortChange from 'utils/app/onTableSortChange'; +import updateColumnsWidths from 'utils/app/updateColumnsWidths'; +import updateSortFields from 'utils/app/updateTableSortFields'; +import contextToString from 'utils/contextToString'; +import { ChartTypeEnum, ScaleEnum } from 'utils/d3'; +import { formatValue } from 'utils/formatValue'; +import getObjectPaths from 'utils/getObjectPaths'; +import JsonToCSV from 'utils/JsonToCSV'; +import { setItem } from 'utils/storage'; +import { encode } from 'utils/encoder/encoder'; +import onBookmarkCreate from 'utils/app/onBookmarkCreate'; +import onBookmarkUpdate from 'utils/app/onBookmarkUpdate'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import onResetConfigData from 'utils/app/onResetConfigData'; +import onShuffleChange from 'utils/app/onShuffleChange'; +import updateURL from 'utils/app/updateURL'; +import getValueByField from 'utils/getValueByField'; +import getTooltipContent from 'utils/getTooltipContent'; +import { getValue } from 'utils/helper'; +import onRowSelect from 'utils/app/onRowSelect'; +import { SortField } from 'utils/getSortedFields'; +import onChangeTrendlineOptions from 'utils/app/onChangeTrendlineOptions'; +import onRunsTagsChange from 'utils/app/onRunsTagsChange'; +import setRequestProgress from 'utils/app/setRequestProgress'; +import { minMaxOfArray } from 'utils/minMaxOfArray'; +import { processDurationTime } from 'utils/processDurationTime'; +import getSelectOptions from 'utils/app/getSelectOptions'; +import { getMetricsSelectOptions } from 'utils/app/getMetricsSelectOptions'; +import onRowsVisibilityChange from 'utils/app/onRowsVisibilityChange'; +import { getMetricsInitialRowData } from 'utils/app/getMetricsInitialRowData'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import { getMetricLabel } from 'utils/app/getMetricLabel'; + +import { InitialAppModelType } from './config'; + +import { AppNameEnum } from './index'; + +// ************ Scatters App Model Methods + +function getScattersModelMethods( + initialApp: InitialAppModelType, + appConfig: IAppInitialConfig, +) { + const { appName, grouping, components, selectForm } = appConfig; + const { + model, + getModelAppConfigData, + setModelDefaultAppConfigData, + getConfig, + } = initialApp; + + let runsRequestRef: { + call: ( + exceptionHandler: (detail: any) => void, + ) => Promise[]>>; + abort: () => void; + }; + let runsArchiveRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let runsDeleteRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let liveUpdateInstance: LiveUpdateService | null; + + function initialize(appId: string): void { + model.init(); + const state: Partial = {}; + if (grouping) { + state.groupingSelectOptions = []; + } + if (components?.table) { + state.refs = { + ...state.refs, + tableRef: { current: null }, + }; + } + if (components?.charts?.[0]) { + state.refs = { + ...state.refs, + chartPanelRef: { current: null }, + }; + } + model.setState({ ...state }); + if (!appId) { + setModelDefaultAppConfigData(); + } + const liveUpdateState = model.getState()?.config?.liveUpdate; + + projectsService + .getProjectParams(['metric']) + .call() + .then((data: IProjectParamsMetrics) => { + model.setState({ + selectFormData: { + options: getSelectOptions(data), + suggestions: getSuggestionsByExplorer(appName, data), + }, + }); + }); + + if (liveUpdateState?.enabled) { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + liveUpdateState.delay, + ); + } + } + + function updateData(newData: IRun[]): void { + const configData = model.getState()?.config; + if (configData) { + setModelData(newData, configData); + } + } + + function setModelData( + rawData: IRun[], + configData: IAppModelConfig, + ): void { + const { + data, + runProps, + highLevelParams, + params, + metricsColumns, + selectedRows, + } = processData(rawData); + const modelState: IAppModelState = model.getState(); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + runProps, + }), + ]; + const metricsSelectOptions = getMetricsSelectOptions(metricsColumns, model); + const sortOptions = [...groupingSelectOptions, ...metricsSelectOptions]; + + const tableData = getDataAsTableRows( + data, + metricsColumns, + params, + false, + configData, + groupingSelectOptions, + ); + const sortFields = modelState?.config?.table.sortFields; + + const tableColumns = getParamsTableColumns( + sortOptions, + metricsColumns, + params, + data[0]?.config, + configData.table?.columnsOrder!, + configData.table?.hiddenColumns!, + configData.table?.metricsValueKey, + sortFields, + onSortChange, + configData.grouping as any, + onModelGroupingSelectChange, + AppNameEnum.SCATTERS, + ); + + modelState?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + }); + + model.setState({ + requestStatus: RequestStatusEnum.Ok, + data, + chartData: getChartData(data), + chartTitleData: getChartTitleData({ + processedData: data, + groupingSelectOptions, + model: model as IModel, + }), + selectFormData: { ...modelState.selectFormData, error: null }, + params, + metricsColumns, + rawData, + config: configData, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + groupingSelectOptions, + sortOptions, + selectedRows, + }); + } + + function getChartData( + processedData: IMetricsCollection[], + configData = model.getState()?.config, + ): { + dimensions: IDimensionType[]; + data: IPoint[]; + }[] { + if (!processedData || _.isEmpty(configData.select.options)) { + return []; + } + const dimensionsByChartIndex: { + values: number[] | string[]; + scaleType: ScaleEnum; + displayName: string; + dimensionType: string; + }[][] = []; + + const chartData = processedData.map( + ({ chartIndex, color, data }: IMetricsCollection) => { + if (!dimensionsByChartIndex[chartIndex]) { + dimensionsByChartIndex[chartIndex] = []; + } + const dimension: any = dimensionsByChartIndex[chartIndex]; + return data + .filter((run) => !run.isHidden) + .map((run: IParam) => { + const values: any = []; + configData.select.options.forEach( + ({ type, label, value }: ISelectOption, i: number) => { + if (!dimension[i]) { + dimension[i] = { + values: [], + scaleType: ScaleEnum.Linear, + displayName: label, + dimensionType: 'param', + }; + } + if (type === 'metrics') { + run.run.traces.metric.forEach((trace: IParamTrace) => { + if ( + trace.name === value?.option_name && + _.isEqual(trace.context, value?.context) + ) { + let lastValue = trace.values.last; + const formattedLastValue = formatValue(lastValue, '-'); + values[i] = lastValue; + if (formattedLastValue !== '-') { + const metricLabel = getMetricLabel( + trace.name, + trace.context as any, + ); + dimension[i].dimensionType = 'metric'; + dimension[i].displayName = metricLabel; + if (typeof lastValue !== 'number') { + dimension[i].scaleType = ScaleEnum.Point; + values[i] = formattedLastValue; + } else if (isNaN(lastValue) || !isFinite(lastValue)) { + values[i] = formattedLastValue; + dimension[i].scaleType = ScaleEnum.Point; + } + dimension[i].values.push(values[i]); + } + } + }); + } else { + const paramValue = getValue(run.run.params, label, '-'); + const formattedParam = formatValue(paramValue, '-'); + values[i] = paramValue; + if (formattedParam !== '-') { + if (typeof paramValue !== 'number') { + dimension[i].scaleType = ScaleEnum.Point; + values[i] = formattedParam; + } else if (isNaN(paramValue) || !isFinite(paramValue)) { + values[i] = formattedParam; + dimension[i].scaleType = ScaleEnum.Point; + } + dimension[i].values.push(values[i]); + } + } + }, + ); + + return { + chartIndex, + key: run.key, + groupKey: run.key, + color: color ?? run.color, + data: { + yValues: [values[0] ?? '-'], + xValues: [values[1] ?? '-'], + }, + }; + }); + }, + ); + const flattedData = chartData.flat(); + const groupedByChartIndex = Object.values( + _.groupBy(flattedData, 'chartIndex'), + ); + + return dimensionsByChartIndex + .filter((dimension) => !_.isEmpty(dimension)) + .map((chartDimensions, i: number) => { + const dimensions: IDimensionType[] = []; + chartDimensions.forEach((dimension) => { + if (dimension.scaleType === ScaleEnum.Linear) { + const [minDomain = '-', maxDomain = '-'] = minMaxOfArray([ + ...((dimension.values as number[]) || []), + ]); + + dimensions.push({ + scaleType: dimension.scaleType, + domainData: [minDomain, maxDomain] as string[] | number[], + displayName: dimension.displayName, + dimensionType: dimension.dimensionType, + }); + } else { + const numDomain: number[] = []; + const strDomain: string[] = []; + + [...dimension.values].forEach((data) => { + if (typeof data === 'number') { + numDomain.push(data); + } else { + strDomain.push(data); + } + }); + + // sort domain data + numDomain.sort((a, b) => a - b); + strDomain.sort(); + + dimensions.push({ + scaleType: dimension.scaleType, + domainData: numDomain.concat(strDomain as any[]), + displayName: dimension.displayName, + dimensionType: dimension.dimensionType, + }); + } + }); + return { + dimensions, + data: groupedByChartIndex[i], + }; + }); + } + + function getDataAsTableRows( + processedData: IMetricsCollection[], + metricsColumns: any, + paramKeys: string[], + isRowData: boolean, + config: IAppModelConfig, + groupingSelectOptions: IGroupingSelectOption[], + ): { rows: IMetricTableRowData[] | any; sameValueColumns: string[] } { + if (!processedData) { + return { + rows: [], + sameValueColumns: [], + }; + } + + const rows: IMetricTableRowData[] | any = + processedData[0]?.config !== null ? {} : []; + + let rowIndex = 0; + const sameValueColumns: string[] = []; + const columnsFlattenValues: { [key: string]: Set } = {}; + + processedData.forEach((metricsCollection: IMetricsCollection) => { + const groupKey = metricsCollection.key; + const columnsValues: { [key: string]: string[] } = {}; + + if (metricsCollection.config !== null) { + const groupConfigData: { [key: string]: unknown } = {}; + for (let key in metricsCollection.config) { + groupConfigData[getValueByField(groupingSelectOptions, key)] = + metricsCollection.config[key]; + } + const groupHeaderRow = { + meta: { + chartIndex: config?.grouping?.chart?.length + ? metricsCollection.chartIndex + 1 + : null, + //ToDo reverse mode + // config.grouping?.reverseMode?.chart + // ? metricsCollection.chartIndex + 1 + // : null, + color: metricsCollection.color, + dasharray: metricsCollection.dasharray, + itemsCount: metricsCollection.data.length, + config: groupConfigData, + }, + key: groupKey!, + groupRowsKeys: metricsCollection.data.map((metric) => metric.key), + color: metricsCollection.color, + hash: '', + dasharray: metricsCollection.dasharray, + experiment: '', + run: '', + date: '', + description: '', + metric: '', + context: [], + children: [], + groups: groupConfigData, + }; + + rows[groupKey!] = { + data: groupHeaderRow, + items: [], + }; + } + + metricsCollection.data.forEach((metric: any) => { + const metricsRowValues = getMetricsInitialRowData(metricsColumns); + metric.run.traces.metric.forEach((trace: any) => { + const metricHash = getMetricHash(trace.name, trace.context as any); + metricsRowValues[metricHash] = formatValue(trace.values.last); + }); + const rowValues: any = { + rowMeta: { + color: metricsCollection.color ?? metric.color, + }, + key: metric.key, + selectKey: `${metric.run.hash}/${metric.key}`, + hash: metric.run.hash, + isHidden: metric.isHidden, + index: rowIndex, + color: metricsCollection.color ?? metric.color, + dasharray: metricsCollection.dasharray ?? metric.dasharray, + experiment: metric.run.props.experiment?.name ?? 'default', + experimentId: metric.run.props.experiment?.id ?? '', + experiment_description: + metric.run.props.experiment?.description ?? '-', + run: metric.run.props?.name ?? '-', + description: metric.run.props?.description ?? '-', + date: moment(metric.run.props.creation_time * 1000).format( + TABLE_DATE_FORMAT, + ), + tags: metric.run.props.tags.map((tag: ITagProps) => ({ + archived: false, + color: tag.color, + id: tag.id, + comment: tag.description, + name: tag.name, + run_count: 0, + })), + metric: metric.name, + duration: processDurationTime( + metric.run.props.creation_time * 1000, + metric.run.props.end_time + ? metric.run.props.end_time * 1000 + : Date.now(), + ), + active: metric.run.props.active, + ...metricsRowValues, + }; + rowIndex++; + + for (let key in metricsRowValues) { + columnsValues[key] = ['-']; + } + + [ + 'experiment', + 'run', + 'hash', + 'metric', + 'context', + 'date', + 'duration', + 'description', + 'step', + 'epoch', + 'time', + ].forEach((key) => { + if (columnsValues.hasOwnProperty(key)) { + if (!_.some(columnsValues[key], rowValues[key])) { + columnsValues[key].push(rowValues[key]); + } + } else { + columnsValues[key] = [rowValues[key]]; + } + }); + + paramKeys.forEach((paramKey) => { + const value = getValue(metric.run.params, paramKey, '-'); + rowValues[paramKey] = formatValue(value); + if (columnsValues.hasOwnProperty(paramKey)) { + if ( + _.findIndex(columnsValues[paramKey], (paramValue) => + _.isEqual(value, paramValue), + ) === -1 + ) { + columnsValues[paramKey].push(value); + } + } else { + columnsValues[paramKey] = [value]; + } + }); + + if (metricsCollection.config !== null) { + rows[groupKey!].items.push( + isRowData + ? rowValues + : paramsTableRowRenderer(rowValues, onModelRunsTagsChange, { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange({ + metricKey: rowValues.key, + model, + appName, + updateModelData, + }); + }, + }), + ); + } else { + rows.push( + isRowData + ? rowValues + : paramsTableRowRenderer(rowValues, onModelRunsTagsChange, { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange({ + metricKey: rowValues.key, + model, + appName, + updateModelData, + }); + }, + }), + ); + } + }); + + for (let columnKey in columnsValues) { + columnsFlattenValues[columnKey] = new Set([ + ...(columnsFlattenValues[columnKey] || []), + ...(columnsValues[columnKey] || []), + ]); + + if (metricsCollection.config !== null) { + rows[groupKey!].data[columnKey] = + columnsValues[columnKey].length === 1 + ? paramKeys.includes(columnKey) + ? formatValue(columnsValues[columnKey][0]) + : columnsValues[columnKey][0] + : columnsValues[columnKey]; + } + } + + if (metricsCollection.config !== null && !isRowData) { + rows[groupKey!].data = paramsTableRowRenderer( + rows[groupKey!].data, + onModelRunsTagsChange, + {}, + true, + ['groups'].concat(Object.keys(columnsValues)), + ); + } + }); + for (let columnKey in columnsFlattenValues) { + if (columnsFlattenValues[columnKey].size === 1) { + sameValueColumns.push(columnKey); + } + } + return { rows, sameValueColumns }; + } + + function processData(data: IRun[]): { + data: IMetricsCollection[]; + params: string[]; + highLevelParams: string[]; + runProps: string[]; + metricsColumns: any; + selectedRows: any; + } { + const configData = model.getState()?.config; + let selectedRows = model.getState()?.selectedRows; + const grouping = configData?.grouping; + let runs: IParam[] = []; + let params: string[] = []; + let runProps: string[] = []; + let highLevelParams: string[] = []; + const paletteIndex: number = grouping?.paletteIndex || 0; + const metricsColumns: any = {}; + + data?.forEach((run: IRun, index) => { + params = params.concat(getObjectPaths(run.params, run.params)); + runProps = runProps.concat(getObjectPaths(run.props, run.props)); + highLevelParams = highLevelParams.concat( + getObjectPaths(run.params, run.params, '', false, true), + ); + const metricsValues: Record< + string, + Record + > = {}; + + run.traces.metric.forEach((trace) => { + metricsColumns[trace.name] = { + ...metricsColumns[trace.name], + [contextToString(trace.context) as string]: '-', + }; + const metricHash = getMetricHash(trace.name, trace.context as any); + metricsValues[metricHash] = { + min: trace.values.min, + max: trace.values.max, + last: trace.values.last, + first: trace.values.first, + }; + }); + const paramKey = encode({ runHash: run.hash }); + runs.push({ + run, + isHidden: configData!.table.hiddenMetrics!.includes(paramKey), + color: COLORS[paletteIndex][index % COLORS[paletteIndex].length], + key: paramKey, + metricsValues, + dasharray: DASH_ARRAYS[0], + }); + }); + + let sortFields = configData?.table?.sortFields ?? []; + + if (sortFields?.length === 0) { + sortFields = [ + { + value: 'run.props.creation_time', + order: 'desc', + label: '', + group: '', + }, + ]; + } + + const processedData = groupData( + _.orderBy( + runs, + sortFields?.map( + (f: SortField) => + function (run: IParam) { + return getValue(run, f.value, ''); + }, + ), + sortFields?.map((f: SortField) => f.order), + ), + ); + + const uniqProps = _.uniq(runProps).sort(); + const uniqParams = _.uniq(params).sort(); + const uniqHighLevelParams = _.uniq(highLevelParams).sort(); + + const mappedData: Record = {}; + + for (let run of runs) { + mappedData[run.run.hash] = { + runHash: run.run.hash, + ...run.run.props, + ...run, + }; + } + + let selected: Record = {}; + + if (selectedRows && !_.isEmpty(selectedRows)) { + for (let rowKey in selectedRows) { + const slicedKey = rowKey.slice(0, rowKey.indexOf('/')); + if (mappedData[slicedKey]) + selected[rowKey] = { + selectKey: rowKey, + ...mappedData[slicedKey], + }; + } + } + + return { + data: processedData, + params: uniqParams, + highLevelParams: uniqHighLevelParams, + runProps: uniqProps, + metricsColumns, + selectedRows, + }; + } + + function groupData(data: IParam[]): IMetricsCollection[] { + const grouping = model.getState()!.config!.grouping; + const { paletteIndex } = grouping; + const groupByColor = getFilteredGroupingOptions({ + groupName: GroupNameEnum.COLOR, + model, + }); + const groupByStroke = getFilteredGroupingOptions({ + groupName: GroupNameEnum.STROKE, + model, + }); + const groupByChart = getFilteredGroupingOptions({ + groupName: GroupNameEnum.CHART, + model, + }); + if ( + groupByColor.length === 0 && + groupByStroke.length === 0 && + groupByChart.length === 0 + ) { + return [ + { + config: null, + color: null, + dasharray: null, + chartIndex: 0, + data, + }, + ]; + } + + const groupValues: { + [key: string]: IMetricsCollection | any; + } = {}; + + const groupingFields = _.uniq( + groupByColor.concat(groupByStroke).concat(groupByChart), + ); + + for (let i = 0; i < data.length; i++) { + const groupValue: { [key: string]: unknown } = {}; + groupingFields.forEach((field) => { + groupValue[field] = getValue(data[i], field); + }); + const groupKey = encode(groupValue); + if (groupValues.hasOwnProperty(groupKey)) { + groupValues[groupKey].data.push(data[i]); + } else { + groupValues[groupKey] = { + key: groupKey, + config: groupValue, + color: null, + dasharray: null, + chartIndex: 0, + data: [data[i]], + }; + } + } + + let colorIndex = 0; + let dasharrayIndex = 0; + let chartIndex = 0; + + const colorConfigsMap: { [key: string]: number } = {}; + const dasharrayConfigsMap: { [key: string]: number } = {}; + const chartIndexConfigsMap: { [key: string]: number } = {}; + + for (let groupKey in groupValues) { + const groupValue = groupValues[groupKey]; + + if (groupByColor.length > 0) { + const colorConfig = _.pick(groupValue.config, groupByColor); + const colorKey = encode(colorConfig); + + if (grouping.persistence.color && grouping.isApplied.color) { + let index = getGroupingPersistIndex({ + groupConfig: colorConfig, + grouping, + groupName: 'color', + }); + groupValue.color = + COLORS[paletteIndex][ + Number(index % BigInt(COLORS[paletteIndex].length)) + ]; + } else if (colorConfigsMap.hasOwnProperty(colorKey)) { + groupValue.color = + COLORS[paletteIndex][ + colorConfigsMap[colorKey] % COLORS[paletteIndex].length + ]; + } else { + colorConfigsMap[colorKey] = colorIndex; + groupValue.color = + COLORS[paletteIndex][colorIndex % COLORS[paletteIndex].length]; + colorIndex++; + } + } + + if (groupByStroke.length > 0) { + const dasharrayConfig = _.pick(groupValue.config, groupByStroke); + const dasharrayKey = encode(dasharrayConfig); + if (grouping.persistence.stroke && grouping.isApplied.stroke) { + let index = getGroupingPersistIndex({ + groupConfig: dasharrayConfig, + grouping, + groupName: 'stroke', + }); + groupValue.dasharray = + DASH_ARRAYS[Number(index % BigInt(DASH_ARRAYS.length))]; + } else if (dasharrayConfigsMap.hasOwnProperty(dasharrayKey)) { + groupValue.dasharray = + DASH_ARRAYS[dasharrayConfigsMap[dasharrayKey] % DASH_ARRAYS.length]; + } else { + dasharrayConfigsMap[dasharrayKey] = dasharrayIndex; + groupValue.dasharray = + DASH_ARRAYS[dasharrayIndex % DASH_ARRAYS.length]; + dasharrayIndex++; + } + } + + if (groupByChart.length > 0) { + const chartIndexConfig = _.pick(groupValue.config, groupByChart); + const chartIndexKey = encode(chartIndexConfig); + if (chartIndexConfigsMap.hasOwnProperty(chartIndexKey)) { + groupValue.chartIndex = chartIndexConfigsMap[chartIndexKey]; + } else { + chartIndexConfigsMap[chartIndexKey] = chartIndex; + groupValue.chartIndex = chartIndex; + chartIndex++; + } + } + } + return Object.values(groupValues); + } + + function updateModelData( + configData = model.getState()!.config!, + shouldURLUpdate?: boolean, + ): void { + const { + data, + params, + runProps, + highLevelParams, + metricsColumns, + selectedRows, + } = processData(model.getState()?.rawData as IRun[]); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + runProps, + }), + ]; + const metricsSelectOptions = getMetricsSelectOptions(metricsColumns, model); + const sortOptions = [...groupingSelectOptions, ...metricsSelectOptions]; + + const tableData = getDataAsTableRows( + data, + metricsColumns, + params, + false, + configData, + groupingSelectOptions, + ); + const tableColumns = getParamsTableColumns( + sortOptions, + metricsColumns, + params, + data[0]?.config, + configData.table?.columnsOrder!, + configData.table?.hiddenColumns!, + configData.table?.metricsValueKey, + configData.table?.sortFields, + onSortChange, + configData.grouping as any, + onModelGroupingSelectChange, + AppNameEnum.SCATTERS, + ); + + model.getState()?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + hiddenColumns: configData.table?.hiddenColumns!, + }); + + if (shouldURLUpdate) { + updateURL({ configData, appName }); + } + + model.setState({ + config: configData, + data, + chartData: getChartData(data), + chartTitleData: getChartTitleData({ + processedData: data, + groupingSelectOptions, + model: model as IModel, + }), + groupingSelectOptions, + sortOptions, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + selectedRows, + }); + } + + function abortRequest(): void { + if (runsRequestRef) { + runsRequestRef.abort(); + } + setRequestProgress(model); + model.setState({ + requestStatus: RequestStatusEnum.Ok, + }); + onModelNotificationAdd({ + id: Date.now(), + severity: 'info', + messages: ['Request has been cancelled'], + }); + } + + function getScattersData( + shouldUrlUpdate?: boolean, + shouldResetSelectedRows?: boolean, + ): { + call: () => Promise; + abort: () => void; + } { + if (runsRequestRef) { + runsRequestRef.abort(); + } + const configData = { ...model.getState()?.config }; + + runsRequestRef = runsService.getRunsData(configData?.select?.query); + setRequestProgress(model); + return { + call: async () => { + if (_.isEmpty(configData?.select?.options)) { + resetModelState(configData, shouldResetSelectedRows!); + } else { + model.setState({ + requestStatus: RequestStatusEnum.Pending, + queryIsEmpty: false, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + }); + liveUpdateInstance?.stop().then(); + try { + const stream = await runsRequestRef.call((detail) => { + exceptionHandler({ detail, model }); + resetModelState(configData, shouldResetSelectedRows!); + }); + const runData = await getRunData(stream, (progress) => + setRequestProgress(model, progress), + ); + updateData(runData); + if (shouldUrlUpdate) { + updateURL({ configData, appName }); + } + liveUpdateInstance?.start({ + q: configData?.select?.query, + }); + //Changed the layout/styles of the experiments and tags tables to look more like lists|| Extend the contributions section (add activity feed under the contributions) + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + messages: [ex.message], + id: Date.now(), + severity: 'error', + }, + model, + }); + } + } + } + }, + abort: runsRequestRef.abort, + }; + } + + function resetModelState( + configData: any, + shouldResetSelectedRows: boolean, + ): void { + let state: Partial = {}; + if (components?.charts?.indexOf(ChartTypeEnum.ScatterPlot) !== -1) { + state.chartData = []; + } + if (components.table) { + state.tableData = []; + state.config = { + ...configData, + table: { + ...configData?.table, + resizeMode: ResizeModeEnum.Resizable, + }, + }; + } + model.setState({ + queryIsEmpty: true, + rawData: [], + tableColumns: [], + selectFormData: { + ...model.getState().selectFormData, + error: null, + }, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + ...state, + }); + } + + function onExportTableData(): void { + const { data, params, config, metricsColumns, groupingSelectOptions } = + model.getState() as IParamsAppModelState; + const tableData = getDataAsTableRows( + data, + metricsColumns, + params, + true, + config, + groupingSelectOptions, + ); + const metricsSelectOptions = getMetricsSelectOptions(metricsColumns, model); + const sortOptions = [...groupingSelectOptions, ...metricsSelectOptions]; + + const tableColumns: ITableColumn[] = getParamsTableColumns( + sortOptions, + metricsColumns, + params, + data[0]?.config, + config.table?.columnsOrder!, + config.table?.hiddenColumns!, + config.table?.metricsValueKey, + config.table?.sortFields, + onSortChange, + config.grouping as any, + onModelGroupingSelectChange, + AppNameEnum.SCATTERS, + ); + + const excludedFields: string[] = ['#', 'actions']; + const filteredHeader: string[] = tableColumns.reduce( + (acc: string[], column: ITableColumn) => + acc.concat( + excludedFields.indexOf(column.key) === -1 && !column.isHidden + ? column.key + : [], + ), + [], + ); + + let emptyRow: { [key: string]: string } = {}; + filteredHeader.forEach((column: string) => { + emptyRow[column] = '--'; + }); + + const groupedRows: IMetricTableRowData[][] = + data.length > 1 + ? Object.keys(tableData.rows).map( + (groupedRowKey: string) => tableData.rows[groupedRowKey].items, + ) + : [ + Array.isArray(tableData.rows) + ? tableData.rows + : tableData.rows[Object.keys(tableData.rows)[0]].items, + ]; + + const dataToExport: { [key: string]: string }[] = []; + + groupedRows?.forEach( + (groupedRow: IMetricTableRowData[], groupedRowIndex: number) => { + groupedRow?.forEach((row: IMetricTableRowData) => { + const filteredRow = getFilteredRow({ + columnKeys: filteredHeader, + row, + }); + dataToExport.push(filteredRow); + }); + if (groupedRows?.length - 1 !== groupedRowIndex) { + dataToExport.push(emptyRow); + } + }, + ); + const blob = new Blob([JsonToCSV(dataToExport)], { + type: 'text/csv;charset=utf-8;', + }); + saveAs(blob, `${appName}-${moment().format(DATE_EXPORTING_FORMAT)}.csv`); + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.exports.csv); + } + + function onActivePointChange( + activePoint: IActivePoint, + focusedStateActive: boolean = false, + ): void { + const { data, refs, config, groupingSelectOptions } = model.getState(); + if (config.table.resizeMode !== ResizeModeEnum.Hide) { + const tableRef: any = refs?.tableRef; + if (tableRef) { + if (focusedStateActive) { + tableRef.current?.scrollToRow?.(activePoint.key); + tableRef.current?.setActiveRow?.( + focusedStateActive ? activePoint.key : null, + ); + } else { + tableRef.current?.setHoveredRow?.(activePoint.key); + } + } + } + let configData = config; + if (configData?.chart) { + // TODO remove this later + // remove unnecessary content prop from tooltip config + if (configData.chart.tooltip?.hasOwnProperty('content')) { + delete configData.chart.tooltip.content; + } + + configData = { + ...configData, + chart: { + ...configData.chart, + focusedState: { + active: focusedStateActive, + key: activePoint.key, + xValue: activePoint.xValue, + yValue: activePoint.yValue, + chartIndex: activePoint.chartIndex, + }, + }, + }; + + if ( + config.chart.focusedState.active !== focusedStateActive || + (config.chart.focusedState.active && + (activePoint.key !== config.chart.focusedState.key || + activePoint.xValue !== config.chart.focusedState.xValue)) + ) { + updateURL({ configData, appName }); + } + } + + const tooltipData = { + ...configData?.chart?.tooltip, + content: getTooltipContent({ + groupingNames: [GroupNameEnum.COLOR, GroupNameEnum.CHART], + groupingSelectOptions, + data, + configData, + activePointKey: configData.chart?.focusedState?.key, + selectedFields: configData.chart?.tooltip?.selectedFields, + }), + }; + model.setState({ config: configData, tooltip: tooltipData }); + } + + function onModelRunsTagsChange(runHash: string, tags: ITagInfo[]): void { + onRunsTagsChange({ runHash, tags, model, updateModelData }); + } + + function onModelGroupingSelectChange({ + groupName, + list, + }: IOnGroupingSelectChangeParams): void { + onGroupingSelectChange({ + groupName, + list, + model, + appName, + updateModelData, + }); + } + + function onSortChange({ + sortFields, + order, + index, + actionType, + field, + }: any): void { + onTableSortChange({ + sortFields, + order, + index, + field, + actionType, + model, + appName, + updateModelData, + }); + } + + function onModelBookmarkCreate({ + name, + description, + }: { + name: string; + description: string; + }): Promise { + return onBookmarkCreate({ name, description, model, appName }); + } + + function onModelBookmarkUpdate(id: string): void { + onBookmarkUpdate({ id, model, appName }); + } + + function onModelNotificationDelete(id: number): void { + onNotificationDelete({ id, model }); + } + + function onModelNotificationAdd(notification: N & INotification): void { + onNotificationAdd({ notification, model }); + } + + function onModelResetConfigData(): void { + onResetConfigData({ model, getConfig, updateModelData }); + } + + function changeLiveUpdateConfig(config: { + enabled?: boolean; + delay?: number; + }): void { + const state = model.getState(); + const configData = state?.config; + const query = configData.select?.query; + const liveUpdateConfig = configData.liveUpdate; + if (!liveUpdateConfig?.enabled && config.enabled && query !== '()') { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + config?.delay || liveUpdateConfig?.delay, + ); + liveUpdateInstance?.start({ + q: query, + }); + } else { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; + } + + const newLiveUpdateConfig = { + ...liveUpdateConfig, + ...config, + }; + model.setState({ + config: { + ...configData, + liveUpdate: newLiveUpdateConfig, + }, + }); + + setItem('scattersLUConfig', encode(newLiveUpdateConfig)); + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].liveUpdate} ${ + config.enabled ? 'on' : 'off' + }`, + ); + } + + function destroy(): void { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; //@TODO check is this need or not + } + + function archiveRuns( + ids: string[], + archived: boolean, + ): { + call: () => Promise; + abort: () => void; + } { + runsArchiveRef = runsService.archiveRuns(ids, archived); + return { + call: async () => { + try { + await runsArchiveRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getScattersData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [ + `Runs are successfully ${ + archived ? 'archived' : 'unarchived' + } `, + ], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.archiveRunsBatch, + ); + } + }, + abort: runsArchiveRef.abort, + }; + } + + function deleteRuns(ids: string[]): { + call: () => Promise; + abort: () => void; + } { + runsDeleteRef = runsService.deleteRuns(ids); + return { + call: async () => { + try { + await runsDeleteRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getScattersData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: ['Runs are successfully deleted'], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.deleteRunsBatch, + ); + } + }, + abort: runsDeleteRef.abort, + }; + } + + const methods = { + initialize, + getAppConfigData: getModelAppConfigData, + getScattersData, + abortRequest, + setDefaultAppConfigData: setModelDefaultAppConfigData, + updateModelData, + onActivePointChange, + onExportTableData, + onBookmarkCreate: onModelBookmarkCreate, + onBookmarkUpdate: onModelBookmarkUpdate, + onNotificationAdd: onModelNotificationAdd, + onNotificationDelete: onModelNotificationDelete, + onResetConfigData: onModelResetConfigData, + onRunsTagsChange: onModelRunsTagsChange, + onSortChange, + destroy, + changeLiveUpdateConfig, + archiveRuns, + deleteRuns, + }; + + if (grouping) { + Object.assign(methods, { + onGroupingSelectChange: onModelGroupingSelectChange, + onGroupingModeChange({ + groupName, + value, + }: IOnGroupingModeChangeParams): void { + onGroupingModeChange({ + groupName, + value, + model, + appName, + updateModelData, + }); + }, + onGroupingPaletteChange(index: number): void { + onGroupingPaletteChange({ index, model, appName, updateModelData }); + }, + onGroupingReset(groupName: GroupNameEnum): void { + onGroupingReset({ groupName, model, appName, updateModelData }); + }, + onGroupingApplyChange(groupName: GroupNameEnum): void { + onGroupingApplyChange({ + groupName, + model, + appName, + updateModelData, + }); + }, + onGroupingPersistenceChange(groupName: GroupNameEnum): void { + onGroupingPersistenceChange({ + groupName, + model, + appName, + updateModelData, + }); + }, + onShuffleChange(name: 'color' | 'stroke'): void { + onShuffleChange({ name, model, updateModelData }); + }, + }); + } + if (selectForm) { + Object.assign(methods, { + onSelectOptionsChange(data: D & Partial): void { + onSelectOptionsChange({ data, model }); + }, + onSelectRunQueryChange(query: string): void { + onSelectRunQueryChange({ query, model }); + }, + }); + } + if (components?.charts?.[0]) { + Object.assign(methods, { + onChangeTooltip(tooltip: Partial): void { + onChangeTooltip({ + tooltip, + groupingNames: [GroupNameEnum.COLOR, GroupNameEnum.CHART], + model, + appName, + }); + }, + onChangeTrendlineOptions( + trendlineOptions: Partial, + ): void { + onChangeTrendlineOptions({ trendlineOptions, model, appName }); + }, + }); + } + if (components?.table) { + Object.assign(methods, { + onRowHeightChange(height: RowHeightSize): void { + onRowHeightChange({ height, model, appName }); + }, + onTableRowHover(rowKey?: string): void { + onTableRowHover({ rowKey, model }); + }, + onTableRowClick(rowKey?: string): void { + onTableRowClick({ rowKey, model }); + }, + onSortFieldsChange(sortFields: [string, any][]): void { + onSortFieldsChange({ sortFields, model, appName, updateModelData }); + }, + onColumnsOrderChange(columnsOrder: any): void { + onColumnsOrderChange({ + columnsOrder, + model, + appName, + updateModelData, + }); + }, + onColumnsVisibilityChange(hiddenColumns: string[]): void { + onColumnsVisibilityChange({ + hiddenColumns, + model, + appName, + updateModelData, + }); + }, + onTableResizeModeChange(mode: ResizeModeEnum): void { + onTableResizeModeChange({ mode, model, appName }); + }, + onTableDiffShow(): void { + onTableDiffShow({ model, appName, updateModelData }); + }, + onTableResizeEnd(tableHeight: string): void { + onTableResizeEnd({ tableHeight, model, appName }); + }, + onSortReset(): void { + updateSortFields({ + sortFields: [], + model, + appName, + updateModelData, + }); + }, + updateColumnsWidths(key: string, width: number, isReset: boolean): void { + updateColumnsWidths({ + key, + width, + isReset, + model, + appName, + updateModelData, + }); + }, + onParamVisibilityChange(metricsKeys: string[]): void { + onParamVisibilityChange({ + metricsKeys, + model, + appName, + updateModelData, + }); + }, + onRowSelect({ + actionType, + data, + }: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + }): void { + return onRowSelect({ actionType, data, model }); + }, + onRowsVisibilityChange(metricKeys: string[]): void { + return onRowsVisibilityChange({ + metricKeys, + model, + appName, + updateModelData, + }); + }, + }); + } + + return methods; +} + +export default getScattersModelMethods; diff --git a/src/src/services/models/imagesExplore/imagesExploreAppModel.ts b/src/src/services/models/imagesExplore/imagesExploreAppModel.ts new file mode 100644 index 00000000..e4a8b3eb --- /dev/null +++ b/src/src/services/models/imagesExplore/imagesExploreAppModel.ts @@ -0,0 +1,2380 @@ +import React from 'react'; +import _ from 'lodash-es'; +import moment from 'moment'; +import { saveAs } from 'file-saver'; + +import { RowHeightSize } from 'config/table/tableConfigs'; +import { BookmarkNotificationsEnum } from 'config/notification-messages/notificationMessages'; +import { ResizeModeEnum, RowHeightEnum } from 'config/enums/tableEnums'; +import { IMAGE_SIZE_CHANGE_DELAY } from 'config/mediaConfigs/mediaConfigs'; +import { ImageRenderingEnum } from 'config/enums/imageEnums'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import COLORS from 'config/colors/colors'; +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_EXPORTING_FORMAT, TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { getSuggestionsByExplorer } from 'config/monacoConfig/monacoConfig'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + getImagesExploreTableColumns, + imagesExploreTableRowRenderer, +} from 'pages/ImagesExplore/components/ImagesExploreTableGrid/ImagesExploreTableGrid'; + +import * as analytics from 'services/analytics'; +import imagesExploreService from 'services/api/imagesExplore/imagesExploreService'; +import appsService from 'services/api/apps/appsService'; +import dashboardService from 'services/api/dashboard/dashboardService'; +import blobsURIModel from 'services/models/media/blobsURIModel'; +import projectsService from 'services/api/projects/projectsService'; +import runsService from 'services/api/runs/runsService'; + +import { + IAppData, + IDashboardData, + IGroupingSelectOption, + IMetricsCollection, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; +import { IMetricTrace, IRun } from 'types/services/models/metrics/runModel'; +import { IBookmarkFormState } from 'types/components/BookmarkForm/BookmarkForm'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { + IImageData, + IImageRunData, + IImagesExploreAppConfig, + IImagesExploreAppModelState, +} from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { + IAppModelState, + ISelectConfig, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { IProjectParamsMetrics } from 'types/services/models/projects/projectsModel'; +import { IModel } from 'types/services/models/model'; +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITagInfo, ITagProps } from 'types/pages/tags/Tags'; + +import getAppConfigDataMethod from 'utils/app/getAppConfigData'; +import onRowSelectAction from 'utils/app/onRowSelect'; +import { AIM64_ENCODING_PREFIX, encode } from 'utils/encoder/encoder'; +import getObjectPaths from 'utils/getObjectPaths'; +import getUrlWithParam from 'utils/getUrlWithParam'; +import getStateFromUrl from 'utils/getStateFromUrl'; +import { + decodeBufferPairs, + decodePathsVals, + iterFoldTree, +} from 'utils/encoder/streamEncoding'; +import { getItem, setItem } from 'utils/storage'; +import JsonToCSV from 'utils/JsonToCSV'; +import { formatValue } from 'utils/formatValue'; +import getValueByField from 'utils/getValueByField'; +import arrayBufferToBase64 from 'utils/arrayBufferToBase64'; +import { getDataAsMediaSetNestedObject } from 'utils/app/getDataAsMediaSetNestedObject'; +import { getCompatibleSelectConfig } from 'utils/app/getCompatibleSelectConfig'; +import { getSortedFields, SortField, SortFields } from 'utils/getSortedFields'; +import { getValue } from 'utils/helper'; +import contextToString from 'utils/contextToString'; +import alphabeticalSortComparator from 'utils/alphabeticalSortComparator'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import getGroupingSelectOptions from 'utils/app/getGroupingSelectOptions'; +import getAdvancedSuggestion from 'utils/getAdvancedSuggestions'; +import { processDurationTime } from 'utils/processDurationTime'; +import onVisibilityChange from 'utils/app/onColumnsVisibilityChange'; +import setRequestProgress from 'utils/app/setRequestProgress'; +import getRunData from 'utils/app/getRunData'; +import getTooltipContent from 'utils/getTooltipContent'; +import decodeWithBase58Checker from 'utils/decodeWithBase58Checker'; +import { onCopyToClipBoard } from 'utils/onCopyToClipBoard'; +import getFilteredRow from 'utils/app/getFilteredRow'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import onRunsTagsChange from 'utils/app/onRunsTagsChange'; +import saveRecentSearches from 'utils/saveRecentSearches'; + +import createModel from '../model'; +import { AppNameEnum } from '../explorer'; + +const model: IModel = createModel({ + requestStatus: RequestStatusEnum.NotRequested, + requestProgress: { + matched: 0, + checked: 0, + trackedRuns: 0, + }, + searchButtonDisabled: false, + applyButtonDisabled: true, + selectFormData: { + options: undefined, + suggestions: [], + error: null, + advancedError: null, + }, + config: getConfig(), +}); + +function getConfig(): IImagesExploreAppConfig { + return { + grouping: { + row: [], + reverseMode: { + row: false, + }, + isApplied: { + row: true, + }, + }, + select: { + options: [], + query: '', + advancedMode: false, + advancedQuery: '', + }, + images: { + indexDensity: '5', + recordDensity: '50', + tooltip: { + appearance: CONTROLS_DEFAULT_CONFIG.images.tooltip.appearance, + display: CONTROLS_DEFAULT_CONFIG.images.tooltip.display, + selectedFields: CONTROLS_DEFAULT_CONFIG.images.tooltip.selectedFields, + }, + additionalProperties: { + alignmentType: CONTROLS_DEFAULT_CONFIG.images.alignmentType, + mediaItemSize: CONTROLS_DEFAULT_CONFIG.images.mediaItemSize, + imageRendering: CONTROLS_DEFAULT_CONFIG.images.imageRendering, + stacking: CONTROLS_DEFAULT_CONFIG.images.stacking, + }, + focusedState: { + active: false, + key: null, + }, + sortFields: [], + sortFieldsDict: {}, + inputsValidations: {}, + }, + table: { + resizeMode: ResizeModeEnum.Resizable, + rowHeight: RowHeightSize.md, + sortFields: [], + hiddenMetrics: [], + hiddenColumns: [], + hideSystemMetrics: undefined, + columnsWidths: { tags: 300 }, + columnsOrder: { + left: [], + middle: [], + right: [], + }, + height: '0.5', + }, + }; +} + +let appRequestRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; +}; + +let runsArchiveRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; +}; +let runsDeleteRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; +}; + +function initialize(appId: string): void { + model.init(); + model.setState({ + refs: { + tableRef: { current: null }, + }, + groupingSelectOptions: [], + }); + if (!appId) { + setDefaultAppConfigData(); + } + projectsService + .getProjectParams(['images']) + .call() + .then((data: IProjectParamsMetrics) => { + const advancedSuggestions: Record = getAdvancedSuggestion( + data.images, + ); + model.setState({ + selectFormData: { + options: getSelectFormOptions(data), + suggestions: getSuggestionsByExplorer(AppNameEnum.IMAGES, data), + advancedSuggestions: { + ...getSuggestionsByExplorer(AppNameEnum.IMAGES, data), + images: { + name: '', + context: _.isEmpty(advancedSuggestions) + ? '' + : { ...advancedSuggestions }, + }, + }, + }, + }); + }); +} + +function setDefaultAppConfigData(recoverTableState: boolean = true) { + const defaultConfig: Partial = {}; + const searchParam = new URLSearchParams(window.location.search); + + const grouping: IImagesExploreAppConfig['grouping'] = + getStateFromUrl('grouping') ?? {}; + + defaultConfig.grouping = grouping; + + const compatibleSelectConfig = getCompatibleSelectConfig( + ['images'], + getStateFromUrl('select'), + ); + const select: ISelectConfig = compatibleSelectConfig ?? {}; + + defaultConfig.select = select; + + const images: IImagesExploreAppConfig['images'] = + getStateFromUrl('images') ?? {}; + + defaultConfig.images = images; + + if (recoverTableState) { + const tableConfigHash = + getItem('imagesTable') || getItem('imagesExploreTable'); + const table = tableConfigHash + ? JSON.parse( + decodeWithBase58Checker({ + value: tableConfigHash ?? '', + localStorageKey: getItem('imagesTable') + ? 'imagesTable' + : 'imagesExploreTable', + }), + ) + : getConfig().table; + + defaultConfig.table = table; + } + + const configData = _.mergeWith( + {}, + model.getState().config, + defaultConfig, + (objValue, srcValue) => { + if (_.isArray(objValue)) { + return srcValue; + } + }, + ); + if ( + (searchParam.get('grouping') && + !searchParam.get('grouping')?.startsWith(AIM64_ENCODING_PREFIX)) || + (searchParam.get('chart') && + !searchParam.get('chart')?.startsWith(AIM64_ENCODING_PREFIX)) || + (searchParam.get('select') && + !searchParam.get('select')?.startsWith(AIM64_ENCODING_PREFIX)) + ) { + updateURL(configData); + } + + model.setState({ config: configData }); +} + +let imagesRequestRef: { + call: ( + exceptionHandler: (detail: any) => void, + ) => Promise[]>>; + abort: () => void; +}; + +function getAppConfigData(appId: string) { + return getAppConfigDataMethod({ + appId, + appRequest: appRequestRef, + config: getConfig(), + model, + }); +} + +function resetModelState() { + model.setState({ + ...model.getState(), + data: [], + selectFormData: { + ...model.getState().selectFormData, + error: null, + advancedError: null, + }, + params: [], + imagesData: {}, + tableData: [], + tableColumns: [], + rawData: [], + }); +} + +function abortRequest(): void { + if (imagesRequestRef) { + imagesRequestRef.abort(); + } + setRequestProgress(model); + model.setState({ + requestStatus: RequestStatusEnum.Ok, + }); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'info', + messages: ['Request has been cancelled'], + }, + model, + }); +} + +function getImagesData( + shouldUrlUpdate?: boolean, + shouldResetSelectedRows?: boolean, + queryString?: string, +) { + if (imagesRequestRef) { + imagesRequestRef.abort(); + } + + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (queryString) { + if (configData?.select?.advancedMode) { + configData.select.advancedQuery = queryString; + } else { + configData!.select.query = queryString; + } + } + const recordSlice: number[] | undefined = configData?.images?.recordSlice as + | number[] + | undefined; + const indexSlice: number[] | undefined = configData?.images?.indexSlice as + | number[] + | undefined; + const recordDensity = configData?.images?.recordDensity; + const indexDensity = configData?.images?.indexDensity; + let query = getQueryStringFromSelect(configData!.select); + let imageDataBody: any = { + q: query !== '()' ? query : '', + }; + if (recordSlice) { + //TODO check values nullability + imageDataBody = { + ...imageDataBody, + record_range: + !_.isEmpty(recordSlice) && + !_.isNil(recordSlice?.[0]) && + !_.isNil(recordSlice[1]) + ? `${recordSlice[0]}:${recordSlice[1] + 1}` + : '', + index_range: + !_.isEmpty(indexSlice) && + !_.isNil(recordSlice?.[0]) && + !_.isNil(recordSlice[1]) + ? `${indexSlice?.[0]}:${(indexSlice?.[1] || 0) + 1}` + : '', + record_density: + !_.isNil(recordDensity) && +recordDensity > 0 ? recordDensity : '', + index_density: + !_.isNil(indexDensity) && +indexDensity > 0 ? indexDensity : '', + }; + } + imagesRequestRef = imagesExploreService.getImagesExploreData(imageDataBody); + setRequestProgress(model); + return { + call: async () => { + if (query !== '()') { + model.setState({ + requestStatus: RequestStatusEnum.Pending, + queryIsEmpty: false, + applyButtonDisabled: false, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + }); + blobsURIModel.init(); + try { + const stream = await imagesRequestRef.call((detail) => { + exceptionHandler({ detail, model }); + resetModelState(); + }); + const runData = await getRunData(stream, (progress) => + setRequestProgress(model, progress), + ); + + if (configData) { + setModelData(runData, configData); + } + if (shouldUrlUpdate) { + updateURL(configData); + } + saveRecentSearches(AppNameEnum.IMAGES, query!); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + // Abort Error + } else { + // eslint-disable-next-line no-console + console.log('Unhandled error: ', ex); + } + } + } else { + model.setState({ + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + queryIsEmpty: true, + imagesData: {}, + tableData: [], + images: { + tooltip: { + display: true, + selectedFields: [], + }, + focusedState: { + active: false, + key: null, + }, + }, + config: { + ...configData, + grouping: { ...getConfig().grouping }, + table: { + ...configData?.table, + resizeMode: ResizeModeEnum.Resizable, + }, + }, + }); + } + }, + abort: imagesRequestRef.abort, + }; +} + +function getSelectFormOptions(projectsData: IProjectParamsMetrics) { + let data: ISelectOption[] = []; + let index: number = 0; + if (projectsData?.images) { + for (let seqName in projectsData.images) { + data.push({ + label: seqName, + group: seqName, + color: COLORS[0][index % COLORS[0].length], + key: getMetricHash(seqName, {}), + + value: { + option_name: seqName, + context: null, + }, + }); + index++; + + for (let val of projectsData.images[seqName]) { + if (!_.isEmpty(val)) { + let label = contextToString(val); + data.push({ + label: `${seqName} ${label}`, + group: seqName, + color: COLORS[0][index % COLORS[0].length], + key: getMetricHash(seqName, val), + value: { + option_name: seqName, + context: val, + }, + }); + index++; + } + } + } + } + + return data.sort( + alphabeticalSortComparator({ orderBy: 'label' }), + ); +} + +function processData(data: any[]): { + data: IMetricsCollection[]; + params: string[]; + runProps: string[]; + highLevelParams: string[]; + contexts: string[]; + selectedRows: any; +} { + const configData = model.getState()?.config; + let selectedRows = model.getState()?.selectedRows; + let metrics: any[] = []; + let params: string[] = []; + let runProps: string[] = []; + let highLevelParams: string[] = []; + let contexts: string[] = []; + data?.forEach((run: IImageRunData) => { + params = params.concat(getObjectPaths(run.params, run.params)); + runProps = runProps.concat(getObjectPaths(run.props, run.props)); + highLevelParams = highLevelParams.concat( + getObjectPaths(run.params, run.params, '', false, true), + ); + run.traces.forEach((trace: any) => { + contexts = contexts.concat(getObjectPaths(trace.context, trace.context)); + trace.values.forEach((stepData: IImageData[], stepIndex: number) => { + stepData.forEach((image: IImageData) => { + const imageKey = encode({ + name: trace.name, + runHash: run.hash, + traceContext: trace.context, + index: image.index, + step: trace.iters[stepIndex], + caption: image.caption, + }); + const seqKey = encode({ + name: trace.name, + runHash: run.hash, + traceContext: trace.context, + }); + metrics.push({ + ...image, + name: trace.name, + step: trace.iters[stepIndex], + context: trace.context, + run: _.omit(run, 'traces'), + key: imageKey, + seqKey: seqKey, + }); + }); + }); + }); + }); + + let sortFields = configData?.table?.sortFields ?? []; + + if (sortFields?.length === 0) { + sortFields = [ + { + value: 'run.props.creation_time', + order: 'desc', + label: '', + group: '', + }, + ]; + } + + const processedData = groupData( + _.orderBy( + metrics, + sortFields?.map( + (f: SortField) => + function (metric: SortField) { + return getValue(metric, f.value, ''); + }, + ), + sortFields?.map((f: any) => f.order), + ), + ); + const uniqProps = _.uniq(runProps).sort(); + const uniqParams = _.uniq(params).sort(); + const uniqHighLevelParams = _.uniq(highLevelParams).sort(); + const uniqContexts = _.uniq(contexts).sort(); + + const mappedData = + data?.reduce((acc: any, item: any) => { + acc[item.hash] = { runHash: item.hash, ...item.props }; + return acc; + }, {}) || {}; + if (selectedRows && !_.isEmpty(selectedRows)) { + selectedRows = Object.keys(selectedRows).reduce((acc: any, key: string) => { + const slicedKey = key.slice(0, key.indexOf('/')); + acc[key] = { + selectKey: key, + ...mappedData[slicedKey], + }; + return acc; + }, {}); + } + return { + data: processedData, + runProps: uniqProps, + params: uniqParams, + highLevelParams: uniqHighLevelParams, + contexts: uniqContexts, + selectedRows, + }; +} + +function setModelData(rawData: any[], configData: IImagesExploreAppConfig) { + const modelState = model.getState(); + const sortFields = modelState?.config?.table.sortFields; + const { data, params, runProps, highLevelParams, contexts, selectedRows } = + processData(rawData); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + contexts, + runProps, + sequenceName: 'images', + }), + ]; + const { mediaSetData, orderedMap } = getDataAsMediaSetNestedObject({ + data, + groupingSelectOptions, + model, + }); + const ranges = rawData?.[0]?.ranges; + const tableData = getDataAsTableRows( + data, + params, + false, + configData, + groupingSelectOptions, + ); + const config = configData; + const recordSlice = [ + _.inRange( + ranges?.record_range_used[0], + ranges?.record_range_total[0] - 1, + ranges?.record_range_total[1] + 1, + ) + ? ranges?.record_range_used[0] + : ranges?.record_range_total[0], + _.inRange( + ranges?.record_range_used[1] - 1, + ranges?.record_range_total[0] - 1, + ranges?.record_range_total[1] + 1, + ) + ? ranges?.record_range_used[1] - 1 + : ranges?.record_range_total[1] - 1, + ]; + const indexSlice = [ + _.inRange( + ranges?.index_range_used[0], + ranges?.index_range_total[0] - 1, + ranges?.index_range_total[1] + 1, + ) + ? ranges?.index_range_used[0] + : ranges?.index_range_total[0], + _.inRange( + ranges?.index_range_used[1] - 1, + ranges?.index_range_total[0] - 1, + ranges?.index_range_total[1] + 1, + ) + ? ranges?.index_range_used[1] - 1 + : ranges?.index_range_total[1] - 1, + ]; + const recordRangeTotalCount = + ranges?.record_range_total[1] - 1 - ranges?.record_range_total[0]; + const indexRangeTotalCount = + ranges?.index_range_total[1] - 1 - ranges?.index_range_total[0]; + const recordDensity = + !config.images.recordDensity || + +config.images.recordDensity < ranges?.record_range_total[0] || + +config.images.recordDensity > recordRangeTotalCount + ? `${recordRangeTotalCount === 0 ? 1 : recordRangeTotalCount}` + : config.images.recordDensity; + const indexDensity = + !config.images.indexDensity || + +config.images.indexDensity < ranges?.index_range_total[0] || + +config.images.indexDensity > indexRangeTotalCount + ? `${indexRangeTotalCount === 0 ? 1 : indexRangeTotalCount}` + : config.images.indexDensity; + + config.images = { + ...config.images, + stepRange: !_.isEmpty(rawData) + ? [ranges?.record_range_total[0], ranges?.record_range_total[1] - 1] + : config.images.stepRange, + indexRange: !_.isEmpty(rawData) + ? [ranges?.index_range_total[0], ranges?.index_range_total[1] - 1] + : config.images.indexRange, + recordSlice, + indexSlice, + recordDensity, + indexDensity, + tooltip: config.images.tooltip || { + display: true, + selectedFields: [], + }, + focusedState: config.images.focusedState || { + active: false, + key: null, + }, + additionalProperties: config.images.additionalProperties, + }; + + const tableColumns = getImagesExploreTableColumns( + params, + groupingSelectOptions, + data[0]?.config, + configData.table.columnsOrder!, + configData.table.hiddenColumns!, + sortFields, + onTableSortChange, + config.grouping as any, + onGroupingSelectChange, + ); + + modelState?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + }); + + model.setState({ + requestStatus: RequestStatusEnum.Ok, + rawData, + config, + params, + selectFormData: { + ...modelState?.selectFormData, + [configData.select?.advancedMode ? 'advancedError' : 'error']: null, + }, + data, + selectedRows, + imagesData: mediaSetData, + orderedMap, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + groupingSelectOptions, + }); +} + +function updateModelData( + configData: IImagesExploreAppConfig = model.getState()!.config!, + shouldURLUpdate?: boolean, +): void { + const { data, params, runProps, highLevelParams, contexts, selectedRows } = + processData(model.getState()?.rawData as any[]); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + runProps, + contexts, + sequenceName: 'images', + }), + ]; + const { mediaSetData, orderedMap } = getDataAsMediaSetNestedObject({ + data, + groupingSelectOptions, + model, + }); + const tableData = getDataAsTableRows( + data, + params, + false, + configData, + groupingSelectOptions, + ); + const tableColumns = getImagesExploreTableColumns( + params, + groupingSelectOptions, + data[0]?.config, + configData.table.columnsOrder!, + configData.table.hiddenColumns!, + configData.table.sortFields, + onTableSortChange, + configData.grouping as any, + onGroupingSelectChange, + ); + + model.getState()?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + hiddenColumns: configData.table.hiddenColumns!, + }); + + if (shouldURLUpdate) { + updateURL(configData); + } + + model.setState({ + config: configData, + data, + imagesData: mediaSetData, + orderedMap, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + groupingSelectOptions, + selectedRows, + }); +} + +function getFilteredGroupingOptions( + grouping: IImagesExploreAppConfig['grouping'], +): string[] { + const { + // reverseMode, + isApplied, + } = grouping; + const groupingSelectOptions: + | IImagesExploreAppModelState['groupingSelectOptions'] + | undefined = model.getState()?.groupingSelectOptions; + if (groupingSelectOptions) { + // const filteredOptions = [...groupingSelectOptions] + // .filter((opt) => grouping['row'].indexOf(opt.value as never) === -1) + // .map((item) => item.value); + //ToDo reverse mode + // return isApplied['row'] + // ? reverseMode['row'] + // ? filteredOptions + // : grouping['row'] + // : []; + return isApplied['row'] ? grouping['row'] : []; + } else { + return []; + } +} + +function groupData(data: any[]): any { + const configData: IImagesExploreAppConfig | undefined = + model.getState()!.config; + const grouping = configData!.grouping; + const groupingFields = getFilteredGroupingOptions(grouping); + if (groupingFields.length === 0) { + return [ + { + config: null, + chartIndex: 0, + data: data, + }, + ]; + } + + const groupValues: { [key: string]: any } = {}; + + for (let i = 0; i < data.length; i++) { + const groupValue: { [key: string]: string } = {}; + groupingFields.forEach((field) => { + groupValue[field] = getValue(data[i], field); + }); + const groupKey = encode(groupValue); + if (groupValues.hasOwnProperty(groupKey)) { + groupValues[groupKey].data.push(data[i]); + } else { + groupValues[groupKey] = { + key: groupKey, + config: groupValue, + data: [data[i]], + }; + } + } + return Object.values(groupValues); +} + +function setComponentRefs( + refElement: React.MutableRefObject | object, +) { + const modelState = model.getState(); + if (modelState?.refs) { + modelState.refs = Object.assign(modelState.refs, refElement); + model.setState({ refs: modelState.refs }); + } +} + +function onGroupingSelectChange({ + groupName, + list, +}: IOnGroupingSelectChangeParams) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { ...configData.grouping, [groupName]: list }; + updateModelData(configData, true); + //ToDo reverse mode + // if ( + // configData.images?.additionalProperties?.stacking && + // (_.isEmpty(configData.grouping.row) || + // configData.grouping.reverseMode.row) + // ) { + // onStackingToggle(); + // } + if ( + configData.images?.additionalProperties?.stacking && + _.isEmpty(configData.grouping.row) + ) { + onStackingToggle(); + } + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS.images.groupings[groupName].select}`, + ); +} + +function onGroupingModeChange({ value }: IOnGroupingModeChangeParams): void { + const configData = model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { + ...configData.grouping, + reverseMode: { + ...configData.grouping.reverseMode, + row: value, + }, + }; + updateModelData(configData, true); + //ToDo reverse mode + // if ( + // configData.images?.additionalProperties?.stacking && + // (_.isEmpty(configData.grouping.row) || + // configData.grouping.reverseMode.row) + // ) { + // onStackingToggle(); + // } + if ( + configData.images?.additionalProperties?.stacking && + _.isEmpty(configData.grouping.row) + ) { + onStackingToggle(); + } + } + if (value) { + analytics.trackEvent( + // @ts-ignore + ANALYTICS_EVENT_KEYS.images.groupings.row.modeChange, + //@TODO change group to dynamic groupName when adding grouping type + ); + } +} + +function onGroupingReset(groupName: GroupNameEnum) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.grouping) { + const { reverseMode, isApplied } = configData.grouping; + configData.grouping = { + ...configData.grouping, + reverseMode: { ...reverseMode, [groupName]: false }, + [groupName]: [], + isApplied: { ...isApplied, [groupName]: true }, + }; + updateModelData(configData, true); + //ToDo reverse mode + // if ( + // configData.images?.additionalProperties?.stacking && + // (_.isEmpty(configData.grouping.row) || + // configData.grouping.reverseMode.row) + // ) { + // onStackingToggle(); + // } + if ( + configData.images?.additionalProperties?.stacking && + _.isEmpty(configData.grouping.row) + ) { + onStackingToggle(); + } + } +} + +function onGroupingApplyChange(): void { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { + ...configData.grouping, + isApplied: { + ...configData.grouping.isApplied, + row: !configData.grouping.isApplied['row'], + }, + }; + updateModelData(configData, true); + } +} + +/** + * function updateURL has 2 major functionalities: + * 1. Keeps URL in sync with the app config + * 2. Stores updated URL in localStorage if App is not in the bookmark state + * @param {IImagesExploreAppConfig} configData - the current state of the app config + */ +function updateURL( + configData: IImagesExploreAppConfig = model.getState()!.config!, +) { + const { grouping, select, images } = configData; + const url: string = getUrlWithParam({ + grouping: encode(grouping), + select: encode(select as {}), + images: encode(images), + }); + + if (url === `${window.location.pathname}${window.location.search}`) { + return; + } + + const appId: string = window.location.pathname.split('/')[2]; + if (!appId) { + setItem('imagesUrl', url); + } + + window.history.pushState(null, '', url); +} + +function onResetConfigData(): void { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData) { + configData.grouping = { + ...getConfig().grouping, + }; + updateModelData(configData, true); + } +} + +function getImagesBlobsData(uris: string[]) { + const request = imagesExploreService.getImagesByURIs(uris); + return { + abort: request.abort, + call: () => { + return request + .call((detail: any) => { + exceptionHandler({ detail, model }); + }) + .then(async (stream) => { + let bufferPairs = decodeBufferPairs(stream); + let decodedPairs = decodePathsVals(bufferPairs); + let objects = iterFoldTree(decodedPairs, 1); + + for await (let [keys, val] of objects) { + const URI = keys[0]; + blobsURIModel.emit(URI as string, { + [URI]: arrayBufferToBase64(val as ArrayBuffer) as string, + }); + } + }) + .catch((ex) => { + if (ex.name === 'AbortError') { + // Abort Error + } else { + // eslint-disable-next-line no-console + console.log('Unhandled error: '); + } + }); + }, + }; +} + +function getDataAsImageSet( + data: any[], + groupingSelectOptions: IGroupingSelectOption[], + defaultGroupFields?: string[], +) { + if (!_.isEmpty(data)) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + const imageSetData: object = {}; + const group: string[] = [...(configData?.grouping?.row || [])]; + //ToDo reverse mode + // const groupFields = + // defaultGroupFields || + // (configData?.grouping?.reverseMode?.row + // ? groupingSelectOptions + // .filter( + // (option: IGroupingSelectOption) => !group.includes(option.label), + // ) + // .map((option) => option.value) + // : group); + const groupFields = defaultGroupFields || group; + const imagesDataForOrdering = {}; + data.forEach((group: any) => { + const path = groupFields?.reduce( + (acc: string[], field: string, index: number) => { + const value = getValue(group.data[0], field); + _.set( + imagesDataForOrdering, + acc.concat(['ordering']), + new Set([ + ...(getValue(imagesDataForOrdering, acc.concat(['ordering'])) || + []), + value, + ]), + ); + _.set( + imagesDataForOrdering, + acc.concat(['key']), + getValueByField(groupingSelectOptions, field), + ); + acc.push( + `${getValueByField(groupingSelectOptions, field)} = ${formatValue( + value, + )}`, + ); + return acc; + }, + [], + ); + _.set( + imageSetData, + path, + _.sortBy(group.data, [ + ...groupFields, + ...groupingSelectOptions + .map((option: IGroupingSelectOption) => option.value) + .filter((field) => !groupFields.includes(field)), + 'caption', + ]), + ); + }); + + return { + imageSetData: _.isEmpty(imageSetData) ? data[0].data : imageSetData, + orderedMap: imagesDataForOrdering, + }; + } else { + return {}; + } +} + +function onActivePointChange( + activePoint: any, + focusedStateActive: boolean = false, +): void { + const { data, refs, config, groupingSelectOptions, tooltip } = + model.getState(); + + if (config?.table.resizeMode !== ResizeModeEnum.Hide) { + const tableRef: any = refs?.tableRef; + if (tableRef && activePoint.seqKey) { + tableRef.current?.setHoveredRow?.(activePoint.seqKey); + tableRef.current?.setActiveRow?.( + focusedStateActive ? activePoint.seqKey : null, + ); + if (focusedStateActive) { + tableRef.current?.scrollToRow?.(activePoint.seqKey); + } + } + } + let configData = config; + if (configData?.images) { + // TODO remove this later + // remove unnecessary content prop from tooltip config + if (configData.images.tooltip?.hasOwnProperty('content')) { + delete configData.images.tooltip.content; + } + + configData = { + ...configData, + images: { + ...configData.images, + focusedState: { + active: focusedStateActive, + key: activePoint.key, + }, + }, + }; + + if ( + config.images.focusedState.active !== focusedStateActive || + (config.images.focusedState.active && + activePoint.key !== config.images.focusedState.key) + ) { + updateURL(configData); + } + } + + const tooltipContent = configData.images?.focusedState?.key + ? getTooltipContent({ + groupingNames: [GroupNameEnum.ROW], + groupingSelectOptions, + data, + configData, + activePointKey: configData.images?.focusedState?.key, + selectedFields: configData.images?.tooltip?.selectedFields, + }) + : tooltip.content; + + model.setState({ + config: configData, + tooltip: { + ...configData?.images?.tooltip, + content: tooltipContent, + }, + }); +} + +function onChangeTooltip(tooltipObj: Partial): void { + let { + config: configData, + data, + groupingSelectOptions = [], + tooltip, + } = model.getState(); + + if (configData?.images) { + // TODO remove this later + // remove unnecessary content prop from tooltip config + if (configData.images.tooltip?.hasOwnProperty('content')) { + delete configData.images.tooltip.content; + } + + configData = { + ...configData, + images: { + ...configData.images, + tooltip: { + ...configData.images.tooltip, + ...tooltipObj, + }, + }, + }; + + const tooltipContent = configData.images?.focusedState?.key + ? getTooltipContent({ + groupingNames: [GroupNameEnum.ROW], + groupingSelectOptions, + data, + configData, + activePointKey: configData.images?.focusedState?.key, + selectedFields: configData.images?.tooltip?.selectedFields, + }) + : tooltip.content; + + model.setState({ + config: configData, + tooltip: { + ...configData?.images?.tooltip, + content: tooltipContent, + }, + }); + updateURL(configData); + } + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.images.imagesPanel.controls.tooltip + .changeTooltipContent, + ); +} + +function getDataAsTableRows( + processedData: IMetricsCollection[], + paramKeys: string[], + isRawData: boolean, + config: IImagesExploreAppConfig, + groupingSelectOptions: any, + dynamicUpdate?: boolean, +): { rows: any[] | any; sameValueColumns: string[] } { + if (!processedData) { + return { + rows: [], + sameValueColumns: [], + }; + } + + const rows: any[] | any = processedData[0]?.config !== null ? {} : []; + + let rowIndex = 0; + const sameValueColumns: string[] = []; + const columnsFlattenValues: { [key: string]: Set } = {}; + + const tableData = groupData( + Object.values( + _.groupBy( + Object.values(processedData) + .map((v) => v.data) + .flat(), + 'seqKey', + ), + ).map((v) => v[0]), + ); + tableData.forEach((metricsCollection: IMetricsCollection) => { + const groupKey = metricsCollection.key; + const columnsValues: { [key: string]: string[] } = {}; + + if (metricsCollection.config !== null) { + const groupConfigData: { [key: string]: unknown } = {}; + for (let key in metricsCollection.config) { + groupConfigData[getValueByField(groupingSelectOptions, key)] = + metricsCollection.config[key]; + } + const groupHeaderRow = { + meta: { + dasharray: null, + itemsCount: metricsCollection.data.length, + config: groupConfigData, + }, + key: groupKey!, + groupRowsKeys: metricsCollection.data.map( + (metric) => (metric as any).seqKey, + ), + experiment: '', + run: '', + date: '', + description: '', + metric: '', + context: [], + children: [], + groups: groupConfigData, + }; + + rows[groupKey!] = { + data: groupHeaderRow, + items: [], + }; + } + + Object.values(_.groupBy(metricsCollection.data, 'seqKey')) + .map((v) => v[0]) + .forEach((metric: any) => { + const rowValues: any = { + rowMeta: { + color: metricsCollection.color ?? metric.color, + }, + key: metric.seqKey, + selectKey: `${metric.run.hash}/${metric.seqKey}`, + hash: metric.run.hash, + isHidden: config?.table?.hiddenMetrics?.includes(metric.key), + index: rowIndex, + color: metricsCollection.color ?? metric.color, + dasharray: metricsCollection.dasharray ?? metric.dasharray, + experiment: metric.run.props.experiment?.name ?? 'default', + experimentId: metric.run.props.experiment?.id ?? '', + experiment_description: + metric.run.props.experiment?.description ?? '-', + run: metric.run.props?.name ?? '-', + description: metric.run.props?.description ?? '-', + date: moment(metric.run.props.creation_time * 1000).format( + TABLE_DATE_FORMAT, + ), + tags: metric.run.props.tags.map((tag: ITagProps) => ({ + archived: false, + color: tag.color, + id: tag.id, + comment: tag.description, + name: tag.name, + run_count: 0, + })), + duration: processDurationTime( + metric.run.props.creation_time * 1000, + metric.run.props.end_time + ? metric.run.props.end_time * 1000 + : Date.now(), + ), + name: metric.name, + context: Object.entries(metric.context).map((entry) => + entry.join(':'), + ), + parentId: groupKey, + }; + rowIndex++; + + [ + 'experiment', + 'run', + 'hash', + 'duration', + 'date', + 'metric', + 'context', + 'step', + 'epoch', + 'time', + 'name', + ].forEach((key) => { + if (columnsValues.hasOwnProperty(key)) { + if ( + _.findIndex(columnsValues[key], (value) => + _.isEqual(rowValues[key], value), + ) === -1 + ) { + columnsValues[key].push(rowValues[key]); + } + } else { + columnsValues[key] = [rowValues[key]]; + } + }); + + if (!dynamicUpdate) { + paramKeys.forEach((paramKey) => { + const value = getValue(metric.run.params, paramKey, '-'); + rowValues[paramKey] = formatValue(value); + if (columnsValues.hasOwnProperty(paramKey)) { + if ( + _.findIndex(columnsValues[paramKey], (paramValue) => + _.isEqual(value, paramValue), + ) === -1 + ) { + columnsValues[paramKey].push(value); + } + } else { + columnsValues[paramKey] = [value]; + } + }); + } + if (metricsCollection.config !== null) { + rows[groupKey!].items.push( + isRawData + ? rowValues + : imagesExploreTableRowRenderer( + rowValues, + onModelRunsTagsChange, + { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange(rowValues.key); + }, + }, + ), + ); + } else { + rows.push( + isRawData + ? rowValues + : imagesExploreTableRowRenderer( + rowValues, + onModelRunsTagsChange, + { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange(rowValues.key); + }, + }, + ), + ); + } + }); + + for (let columnKey in columnsValues) { + columnsFlattenValues[columnKey] = new Set([ + ...(columnsFlattenValues[columnKey] || []), + ...(columnsValues[columnKey] || []), + ]); + + if (metricsCollection.config !== null) { + rows[groupKey!].data[columnKey] = + columnsValues[columnKey].length === 1 + ? paramKeys.includes(columnKey) + ? formatValue(columnsValues[columnKey][0]) + : columnsValues[columnKey][0] + : columnsValues[columnKey]; + } + } + if (metricsCollection.config !== null && !isRawData) { + rows[groupKey!].data = imagesExploreTableRowRenderer( + rows[groupKey!].data, + onModelRunsTagsChange, + {}, + true, + ['value', 'name', 'groups'].concat(Object.keys(columnsValues)), + ); + } + }); + for (let columnKey in columnsFlattenValues) { + if (columnsFlattenValues[columnKey].size === 1) { + sameValueColumns.push(columnKey); + } + } + return { rows, sameValueColumns }; +} + +function onModelRunsTagsChange(runHash: string, tags: ITagInfo[]): void { + onRunsTagsChange({ runHash, tags, model, updateModelData }); +} + +async function onBookmarkCreate({ name, description }: IBookmarkFormState) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData) { + const app: IAppData | any = await appsService + .createApp({ state: configData, type: 'images' }) + .call((detail: any) => { + exceptionHandler({ detail, model }); + }); + if (app.id) { + const bookmark: IDashboardData = await dashboardService + .createDashboard({ app_id: app.id, name, description }) + .call((detail: any) => { + exceptionHandler({ detail, model }); + }); + if (bookmark.name) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [BookmarkNotificationsEnum.CREATE], + }, + model, + }); + } else { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [BookmarkNotificationsEnum.ERROR], + }, + model, + }); + } + } + } + analytics.trackEvent(ANALYTICS_EVENT_KEYS.images.createBookmark); +} + +function onBookmarkUpdate(id: string) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData) { + appsService + .updateApp(id, { state: configData, type: 'images' }) + .call((detail: any) => { + exceptionHandler({ detail, model }); + }) + .then((res: IDashboardData | any) => { + if (res.id) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [BookmarkNotificationsEnum.UPDATE], + }, + model, + }); + } + }); + } +} + +function updateColumnsWidths(key: string, width: number, isReset: boolean) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table && configData?.table?.columnsWidths) { + let columnsWidths = configData?.table?.columnsWidths; + if (isReset) { + columnsWidths = _.omit(columnsWidths, [key]); + } else { + columnsWidths = { ...columnsWidths, [key]: width }; + } + const table = { + ...configData.table, + columnsWidths, + }; + const config = { + ...configData, + table, + }; + model.setState({ + config, + }); + setItem('imagesTable', encode(table)); + updateModelData(config); + } +} + +// internal function to update config.table.sortFields and cache data +function updateTableSortFields(sortFields: SortFields) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + sortFields, + }; + const configUpdate = { + ...configData, + table, + }; + model.setState({ + config: configUpdate, + }); + + setItem('imagesTable', encode(table)); + updateModelData(configUpdate, true); + } + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.table.changeSorting} ${ + _.isEmpty(sortFields) ? 'Reset' : 'Apply' + }`, + ); +} +// internal function to update config.table.sortFields and cache data +function updateImagesSortFields(sortFields: SortFields, sortFieldsDict: any) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + const images = { + ...configData.images, + sortFields, + sortFieldsDict, + }; + const configUpdate = { + ...configData, + images, + }; + model.setState({ + config: configUpdate, + }); + + updateModelData(configUpdate, true); + } + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.imagesPanel.controls.changeSorting} ${ + _.isEmpty(sortFields) ? 'Reset' : 'Apply' + } images sorting by a key`, + ); +} + +// set empty array to config.table.sortFields +function onSortReset() { + updateTableSortFields([]); +} + +function onImagesSortReset() { + updateImagesSortFields([], {}); +} + +/** + * function onTableSortChange has 3 major functionalities + * 1. if only field param passed, the function will change sort option with the following cycle ('asc' -> 'desc' -> none -> 'asc) + * 2. if value param passed 'asc' or 'desc', the function will replace the sort option of the field in sortFields + * 3. if value param passed 'none', the function will delete the field from sortFields + * @param {String} field - the name of the field (i.e params.dataset.preproc) + * @param {'asc' | 'desc' | 'none'} value - 'asc' | 'desc' | 'none' + */ +function onTableSortChange({ + sortFields, + order, + index, + actionType, + field, +}: any) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + + updateTableSortFields( + getSortedFields({ + sortFields: sortFields || configData?.table.sortFields || [], + order, + index, + actionType, + field, + }), + ); +} + +function onImagesSortChange({ + sortFields, + order, + index, + actionType, + field, +}: any) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + const resultSortFields = getSortedFields({ + sortFields: sortFields || configData?.images.sortFields || [], + order, + index, + actionType, + field, + }); + updateImagesSortFields( + resultSortFields, + resultSortFields.reduce((acc: any, field: any) => { + acc[field.value] = field; + return acc; + }, {}), + ); +} + +function onExportTableData(e: React.ChangeEvent): void { + const { data, params, config, groupingSelectOptions } = + model.getState() as IImagesExploreAppModelState; + const tableData = getDataAsTableRows( + data, + params, + true, + config, + groupingSelectOptions, + ); + const tableColumns: ITableColumn[] = getImagesExploreTableColumns( + params, + groupingSelectOptions, + data[0]?.config, + config?.table.columnsOrder!, + config?.table.hiddenColumns!, + config?.table.sortFields, + onTableSortChange, + config.grouping as any, + onGroupingSelectChange, + ); + + const excludedFields: string[] = ['#', 'actions']; + const filteredHeader: string[] = tableColumns.reduce( + (acc: string[], column: ITableColumn) => + acc.concat( + excludedFields.indexOf(column.key) === -1 && !column.isHidden + ? column.key + : [], + ), + [], + ); + + let emptyRow: { [key: string]: string } = {}; + filteredHeader.forEach((column: string) => { + emptyRow[column] = '--'; + }); + + const groupedRows: any[][] = Object.keys(tableData.rows).map( + (groupedRowKey: string) => tableData.rows[groupedRowKey].items, + ); + + const dataToExport: { [key: string]: string }[] = []; + + groupedRows?.forEach((groupedRow: any[], groupedRowIndex: number) => { + groupedRow?.forEach((row: any) => { + const filteredRow: any = getFilteredRow({ + columnKeys: filteredHeader, + row, + }); + dataToExport.push(filteredRow); + }); + if (groupedRows?.length - 1 !== groupedRowIndex) { + dataToExport.push(emptyRow); + } + }); + + const blob = new Blob([JsonToCSV(dataToExport)], { + type: 'text/csv;charset=utf-8;', + }); + saveAs(blob, `images-${moment().format(DATE_EXPORTING_FORMAT)}.csv`); + analytics.trackEvent(ANALYTICS_EVENT_KEYS.images.table.exports.csv); +} + +function onRowVisibilityChange(metricKey: string) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + let hiddenMetrics = configData?.table?.hiddenMetrics || []; + if (hiddenMetrics?.includes(metricKey)) { + hiddenMetrics = hiddenMetrics.filter( + (hiddenMetric: any) => hiddenMetric !== metricKey, + ); + } else { + hiddenMetrics = [...hiddenMetrics, metricKey]; + } + const table = { + ...configData.table, + hiddenMetrics, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem('imagesTable', encode(table)); + updateModelData(config); + } +} + +function onTableResizeEnd(tableHeight: string) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + height: tableHeight, + }; + const config = { + ...configData, + table, + }; + model.setState({ + config, + }); + setItem('imagesTable', encode(table)); + } +} + +function onSelectRunQueryChange(query: string) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.select) { + const newConfig = { + ...configData, + select: { ...configData.select, query }, + images: { ...configData.images }, + }; + + model.setState({ + config: newConfig, + }); + } +} + +function onTableResizeModeChange(mode: ResizeModeEnum): void { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + resizeMode: mode, + }; + const config = { + ...configData, + table, + }; + model.setState({ + config, + }); + setItem('imagesTable', encode(table)); + } + analytics.trackEvent(ANALYTICS_EVENT_KEYS.images.table.changeResizeMode); +} + +function onSearchQueryCopy(): void { + const selectedMetricsData = model.getState()?.config?.select; + let query = getQueryStringFromSelect(selectedMetricsData as any); + if (query) { + onCopyToClipBoard(query, false, () => onNotificationAdd, { + notification: { + id: Date.now(), + severity: 'success', + messages: ['Run Expression Copied'], + }, + model, + }); + } +} + +function getQueryStringFromSelect( + selectData: IImagesExploreAppConfig['select'], + error?: ISyntaxErrorDetails, +) { + let query = '()'; + if (selectData === undefined) { + return query; + } + if (selectData.advancedMode) { + query = selectData.advancedQuery || ''; + } else { + const simpleInput = + selectData.query?.trim() && !error?.message + ? `(${selectData.query.trim()})` + : ''; + const selections = selectData.options?.length + ? `(${selectData.options + .map( + (option: ISelectOption) => + `(images.name == "${option.value?.option_name}"${ + option.value?.context === null + ? '' + : ' and ' + + Object.keys(option.value?.context) + .map( + (item) => + `images.context.${item} == ${formatValue( + (option.value?.context as any)[item], + )}`, + ) + .join(' and ') + })`, + ) + .join(' or ')})` + : ''; + + if (simpleInput && selections) { + query = `${simpleInput} and ${selections}`; + } else { + query = `${simpleInput}${selections}`; + } + } + return query.trim() || '()'; +} + +function onSelectAdvancedQueryChange(query: string) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.select) { + const newConfig = { + ...configData, + select: { ...configData.select, advancedQuery: query }, + images: { ...configData.images }, + }; + + model.setState({ + config: newConfig, + }); + } +} + +function onImagesExploreSelectChange(options: ISelectOption[]) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.select) { + const newConfig = { + ...configData, + select: { ...configData.select, options }, + images: { ...configData.images }, + }; + + model.setState({ + config: newConfig, + }); + } +} + +function toggleSelectAdvancedMode() { + const modelState: IImagesExploreAppModelState | any = model.getState(); + + if (modelState.config?.select) { + let query = + modelState.config.select.advancedQuery || + getQueryStringFromSelect( + modelState.config?.select, + modelState.selectFormData.error, + ); + if (query === '()') { + query = ''; + } + const newConfig = { + ...modelState.config, + select: { + ...modelState.config.select, + advancedQuery: query, + advancedMode: !modelState.config.select.advancedMode, + }, + }; + updateURL(newConfig); + + model.setState({ config: newConfig }); + } + + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.useAdvancedSearch} ${ + !modelState.config?.select.advancedMode ? 'on' : 'off' + }`, + ); +} + +function onColumnsOrderChange(columnsOrder: any) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + columnsOrder: columnsOrder, + }; + const config = { + ...configData, + table, + }; + + model.setState({ + config, + }); + setItem('imagesTable', encode(table)); + updateModelData(config); + } + analytics.trackEvent(ANALYTICS_EVENT_KEYS.images.table.changeColumnsOrder); +} + +function onColumnsVisibilityChange(hiddenColumns: string[] | string | any) { + onVisibilityChange({ + hiddenColumns, + model, + appName: AppNameEnum.IMAGES, + updateModelData, + }); +} + +function onTableDiffShow() { + const sameValueColumns = model.getState()?.sameValueColumns; + if (sameValueColumns) { + onColumnsVisibilityChange(sameValueColumns); + } + analytics.trackEvent(ANALYTICS_EVENT_KEYS.images.table.showDiff); +} + +function onRowHeightChange(height: RowHeightSize) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + rowHeight: height, + }; + const config = { + ...configData, + table, + }; + model.setState({ + config, + }); + setItem('imagesTable', encode(table)); + } + analytics.trackEvent( + `${ + ANALYTICS_EVENT_KEYS.images.table.changeTableRowHeight + } to "${RowHeightEnum[height].toLowerCase()}"`, + ); +} + +function onImageVisibilityChange(metricsKeys: string[]) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + const processedData = model.getState()?.data; + if (configData?.table && processedData) { + const table = { + ...configData.table, + hiddenMetrics: + metricsKeys[0] === 'all' + ? Object.values(processedData) + .map((metricCollection: any) => + metricCollection.data.map((metric: any) => metric.key), + ) + .flat() + : metricsKeys, + }; + const config = { + ...configData, + table, + }; + model.setState({ + config, + }); + setItem('imagesTable', encode(table)); + updateModelData(config); + } + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.table.metricVisibilityChange} ${ + metricsKeys[0] === 'all' + ? 'Visualize all hidden metrics from table' + : 'Hide all metrics from table' + }`, + ); +} + +function onSliceRangeChange(key: string, newValue: number[] | number) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.images) { + const images = { + ...configData.images, + [key]: newValue, + }; + const config = { + ...configData, + images, + }; + + model.setState({ + config, + }); + } +} + +function onDensityChange(name: string, value: number, metaData: any) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.images) { + const images = { + ...configData.images, + [name]: +value, + inputsValidations: { + ...configData.images?.inputsValidations, + [name]: metaData?.isValid, + }, + }; + const config = { + ...configData, + images, + }; + model.setState({ + config, + }); + } + applyBtnDisabledHandler(); +} + +function applyBtnDisabledHandler() { + const state = model.getState(); + const inputsValidations = state.config?.images?.inputsValidations || {}; + + const isInputsValid = + _.size( + Object.keys(inputsValidations).filter((key) => { + return inputsValidations[key] === false; + }), + ) <= 0; + + model.setState({ + ...state, + applyButtonDisabled: !isInputsValid, + }); +} + +const onImageSizeChange = _.throttle((value: number) => { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.images) { + const images = { + ...configData.images, + additionalProperties: { + ...configData.images.additionalProperties, + mediaItemSize: value, + }, + }; + const config = { + ...configData, + images, + }; + updateURL(config as IImagesExploreAppConfig); + model.setState({ + config, + }); + } + + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.imagesPanel.controls.changeImageProperties} / size`, + ); +}, IMAGE_SIZE_CHANGE_DELAY); + +function onImageRenderingChange(type: ImageRenderingEnum) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.images) { + const images = { + ...configData.images, + additionalProperties: { + ...configData.images.additionalProperties, + imageRendering: type, + }, + }; + const config = { + ...configData, + images, + }; + + updateURL(config as IImagesExploreAppConfig); + model.setState({ + config, + }); + } + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.imagesPanel.controls.changeImageProperties} / image rendering to ${type}`, + ); +} + +function onImageAlignmentChange( + option: { value: string; label: string } | null, +) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.images) { + const images = { + ...configData.images, + additionalProperties: { + ...configData.images.additionalProperties, + alignmentType: option?.value, + }, + }; + const config = { + ...configData, + images, + }; + updateURL(config as IImagesExploreAppConfig); + model.setState({ config }); + } + + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.imagesPanel.controls.changeImageProperties} / Alignment to ${option?.label}`, + ); +} + +function showRangePanel() { + return ( + model.getState().requestStatus !== RequestStatusEnum.Pending && + !model.getState().queryIsEmpty + ); +} + +function archiveRuns( + ids: string[], + archived: boolean, +): { + call: () => Promise; + abort: () => void; +} { + runsArchiveRef = runsService.archiveRuns(ids, archived); + return { + call: async () => { + try { + await runsArchiveRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getImagesData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [ + `Runs are successfully ${ + archived ? 'archived' : 'unarchived' + } `, + ], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.images.table.archiveRunsBatch, + ); + } + }, + abort: runsArchiveRef.abort, + }; +} + +function deleteRuns(ids: string[]): { + call: () => Promise; + abort: () => void; +} { + runsDeleteRef = runsService.deleteRuns(ids); + return { + call: async () => { + try { + await runsDeleteRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getImagesData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: ['Runs are successfully deleted'], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent(ANALYTICS_EVENT_KEYS.images.table.deleteRunsBatch); + } + }, + abort: runsDeleteRef.abort, + }; +} + +function onRowSelect({ + actionType, + data, +}: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; +}): void { + return onRowSelectAction({ actionType, data, model }); +} + +function onModelNotificationDelete(id: number): void { + onNotificationDelete({ id, model }); +} + +function onStackingToggle(): void { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.images) { + const images = { + ...configData.images, + additionalProperties: { + ...configData.images.additionalProperties, + stacking: !configData.images.additionalProperties.stacking, + }, + }; + const config = { ...configData, images }; + updateURL(config as IImagesExploreAppConfig); + model.setState({ config }); + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.imagesPanel.controls.groupStacking} to ${ + !configData.images.additionalProperties.stacking + ? 'Enabled' + : 'Disabled' + }`, + ); + } +} + +const imagesExploreAppModel = { + ...model, + initialize, + getImagesData, + abortRequest, + setComponentRefs, + onGroupingSelectChange, + onGroupingModeChange, + onGroupingReset, + onGroupingApplyChange, + onNotificationDelete: onModelNotificationDelete, + onNotificationAdd, + onResetConfigData, + updateURL, + updateModelData, + onBookmarkUpdate, + onBookmarkCreate, + getAppConfigData, + setDefaultAppConfigData, + updateColumnsWidths, + onTableSortChange, + onSortReset, + onExportTableData, + onRowVisibilityChange, + onTableResizeEnd, + onTableResizeModeChange, + onSearchQueryCopy, + getQueryStringFromSelect, + onSelectRunQueryChange, + onSelectAdvancedQueryChange, + onImagesExploreSelectChange, + toggleSelectAdvancedMode, + onColumnsOrderChange, + onColumnsVisibilityChange, + onTableDiffShow, + onRowHeightChange, + onImageVisibilityChange, + onSliceRangeChange, + onDensityChange, + getImagesBlobsData, + onChangeTooltip, + onActivePointChange, + onImageSizeChange, + onImageRenderingChange, + onImageAlignmentChange, + showRangePanel, + getDataAsImageSet, + onStackingToggle, + onImagesSortChange, + onImagesSortReset, + deleteRuns, + archiveRuns, + onRowSelect, + onRunsTagsChange: onModelRunsTagsChange, +}; + +export default imagesExploreAppModel; diff --git a/src/src/services/models/media/blobsURIModel.ts b/src/src/services/models/media/blobsURIModel.ts new file mode 100644 index 00000000..164b0669 --- /dev/null +++ b/src/src/services/models/media/blobsURIModel.ts @@ -0,0 +1,5 @@ +import createModel from '../model'; + +const blobsURIModel = createModel<{ [key: string]: string }>({}); + +export default blobsURIModel; diff --git a/src/src/services/models/metrics/metricModel.ts b/src/src/services/models/metrics/metricModel.ts new file mode 100644 index 00000000..e45842af --- /dev/null +++ b/src/src/services/models/metrics/metricModel.ts @@ -0,0 +1,7 @@ +import { IMetric } from 'types/services/models/metrics/metricModel'; + +function createMetricModel(metricData: IMetric): IMetric { + return metricData; +} + +export default createMetricModel; diff --git a/src/src/services/models/metrics/metricsAppModel.ts b/src/src/services/models/metrics/metricsAppModel.ts new file mode 100644 index 00000000..f64ad2e5 --- /dev/null +++ b/src/src/services/models/metrics/metricsAppModel.ts @@ -0,0 +1,5 @@ +import { appInitialConfig, createAppModel } from 'services/models/explorer'; + +const metricAppModel = createAppModel(appInitialConfig.METRICS) as any; + +export default metricAppModel; diff --git a/src/src/services/models/metrics/runModel.ts b/src/src/services/models/metrics/runModel.ts new file mode 100644 index 00000000..957fd57f --- /dev/null +++ b/src/src/services/models/metrics/runModel.ts @@ -0,0 +1,11 @@ +import { + IMetricTrace, + IParamTrace, + IRun, +} from 'types/services/models/metrics/runModel'; + +export function createRunModel( + runData: IRun, +): IRun { + return runData; +} diff --git a/src/src/services/models/model.ts b/src/src/services/models/model.ts new file mode 100644 index 00000000..e2fc3f83 --- /dev/null +++ b/src/src/services/models/model.ts @@ -0,0 +1,47 @@ +import { IModel } from 'types/services/models/model'; + +function createModel(initialState: StateType): IModel { + let state: StateType | null = { ...initialState }; + const subscriptions: { [key: string]: { (data: StateType): void }[] } = { + INIT: [], + UPDATE: [], + }; + + function emit(evt: string, stateUpdate: StateType) { + state = Object.assign(state, stateUpdate); + (subscriptions[evt] || []).forEach((fn) => fn(stateUpdate)); + } + + return { + // @TODO think to change model structure and remove init step from model lifecycle + init: () => { + state = Object.assign({}, initialState); + (subscriptions.INIT || []).forEach((fn) => fn(initialState)); + }, + destroy: () => { + subscriptions.INIT = []; + subscriptions.UPDATE = []; + state = { ...initialState }; + }, + getState: () => Object.assign({}, state), + setState: (stateUpdate: StateType) => { + emit('UPDATE', stateUpdate); + }, + emit, + subscribe: (evt: string, fn: (data: StateType) => void) => { + if (subscriptions.hasOwnProperty(evt)) { + subscriptions[evt].push(fn); + } else { + subscriptions[evt] = [fn]; + } + + return { + unsubscribe: () => { + subscriptions[evt].splice(subscriptions[evt].indexOf(fn) >>> 0, 1); + }, + }; + }, + }; +} + +export default createModel; diff --git a/src/src/services/models/notes/notesModel.ts b/src/src/services/models/notes/notesModel.ts new file mode 100644 index 00000000..71c3d9cc --- /dev/null +++ b/src/src/services/models/notes/notesModel.ts @@ -0,0 +1,190 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { NotesNotificationsEnum } from 'config/notification-messages/notificationMessages'; + +import notesService from 'services/api/notes/notesService'; +import * as analytics from 'services/analytics'; + +import { + INote, + INoteReqBody, + INotesAppModelState, + INotesList, +} from 'types/services/models/notes/notes'; +import { IApiRequest } from 'types/services/services'; + +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; + +import createModel from '../model'; + +const model = createModel>({ + isLoading: true, + noteData: undefined, + notifyData: [], +}); + +// Request references +let getNotesListRequestRef: IApiRequest; + +// Initializing model +function initialize(runId: string): void { + model.init(); + try { + getNotesListRequestRef = onNotesListFetch(runId); + getNotesListRequestRef.call(); + } catch (err: any) { + handleErrorNotification(err); + getNotesListRequestRef?.abort(); + model.setState({ isLoading: false }); + } +} + +// API CRUD functionality + +function onNotesListFetch(runId: string) { + const { call, abort } = notesService.getNotes(runId); + return { + call: async () => { + call((detail: any) => { + exceptionHandler({ detail, model }); + model.setState({ isLoading: false }); + }).then(async (data: INotesList) => { + model.setState({ + noteData: data[0], + isLoading: false, + }); + }); + }, + abort, + }; +} + +function onNoteCreate(runId: string, reqBody: INoteReqBody): void { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.runDetails.tabs.notes.clickSaveButton, + ); + const { call, abort } = notesService.createNote(runId, reqBody); + try { + model.setState({ isLoading: true }); + call((detail: any) => { + exceptionHandler({ detail, model }); + model.setState({ isLoading: false }); + }).then((noteData: INote) => { + model.setState({ + noteData: { + content: reqBody.content, + id: noteData.id, + created_at: noteData.created_at, + }, + isLoading: false, + }); + handleSuccessNotification(NotesNotificationsEnum.CREATE); + }); + } catch (err: any) { + abort(); + handleErrorNotification(err); + model.setState({ + isLoading: false, + }); + } +} + +function onNoteUpdate(runId: string, reqBody: INoteReqBody): void { + const { id, created_at } = model.getState().noteData!; + const { call, abort } = notesService.updateNote(runId, id, reqBody); + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.runDetails.tabs.notes.clickUpdateButton, + ); + try { + model.setState({ + isLoading: true, + }); + call((detail: any) => { + exceptionHandler({ detail, model }); + model.setState({ isLoading: false }); + }).then((noteData: INote) => { + model.setState({ + noteData: { ...noteData, created_at }, + isLoading: false, + }); + handleSuccessNotification(NotesNotificationsEnum.UPDATE); + }); + } catch (err: any) { + abort(); + handleErrorNotification(err); + model.setState({ isLoading: false }); + } +} + +function onNoteDelete(runId: string): void { + const { id } = model.getState().noteData!; + const { call, abort } = notesService.deleteNote(runId, id); + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.runDetails.tabs.notes.clickDeleteButton, + ); + try { + model.setState({ + isLoading: true, + }); + call((detail: any) => { + exceptionHandler({ detail, model }); + model.setState({ isLoading: false }); + }).then((response: { status: string }) => { + model.setState({ + noteData: null, + isLoading: false, + }); + handleSuccessNotification(NotesNotificationsEnum.DELETE); + }); + } catch (err: any) { + abort(); + handleErrorNotification(err); + model.setState({ isLoading: false }); + } +} + +// Notification Handlers +function handleErrorNotification(err: any): void { + onNotificationAdd({ + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + model, + }); +} + +function handleSuccessNotification(message: NotesNotificationsEnum): void { + onNotificationAdd({ + notification: { + id: Date.now(), + messages: [message], + severity: 'success', + }, + model, + }); +} + +function onNoteNotificationDelete(id: number): void { + onNotificationDelete({ id, model }); +} + +// Destroying model on component unmount +function destroy(): void { + getNotesListRequestRef?.abort(); + model.destroy(); +} + +const notesModel = { + ...model, + initialize, + destroy, + onNoteCreate, + onNoteUpdate, + onNoteDelete, + onNoteNotificationDelete, +}; + +export default notesModel; diff --git a/src/src/services/models/params/paramsAppModel.ts b/src/src/services/models/params/paramsAppModel.ts new file mode 100644 index 00000000..8a556963 --- /dev/null +++ b/src/src/services/models/params/paramsAppModel.ts @@ -0,0 +1,5 @@ +import { appInitialConfig, createAppModel } from 'services/models/explorer'; + +const paramsAppModel = createAppModel(appInitialConfig.PARAMS) as any; + +export default paramsAppModel; diff --git a/src/src/services/models/projects/projectsModel.ts b/src/src/services/models/projects/projectsModel.ts new file mode 100644 index 00000000..4422c903 --- /dev/null +++ b/src/src/services/models/projects/projectsModel.ts @@ -0,0 +1,110 @@ +import projectsService from 'services/api/projects/projectsService'; +import createModel from 'services/models/model'; + +import { + IPinnedSequencesResData, + IProject, + IProjectParamsMetrics, + IProjectsModelState, +} from 'types/services/models/projects/projectsModel'; + +import exceptionHandler from 'utils/app/exceptionHandler'; + +const model = createModel>({}); + +function getProjectsData() { + const { call, abort } = projectsService.getProjectsData(); + + model.init(); + + return { + call: () => + call((detail: any) => { + exceptionHandler({ detail, model }); + }).then((data: IProject) => { + //@ts-ignore + window.telemetry_enabled = data.telemetry_enabled; + model.setState({ + project: data, + }); + }), + abort, + }; +} + +function getProjectParams(sequences: string[] = ['metric']) { + const { call, abort } = projectsService.getProjectParams(sequences); + + return { + call: () => + call((detail: any) => { + exceptionHandler({ detail, model }); + }).then((data: IProjectParamsMetrics) => { + model.setState({ + metrics: data.metric, + images: data.images, + params: removeExampleTypes(data.params), + }); + }), + abort, + }; +} + +function removeExampleTypes(params: IProjectParamsMetrics['params']) { + for (let paramKey in params) { + const param = params[paramKey]; + if (typeof param === 'object') { + if (param.hasOwnProperty('__example_type__')) { + params[paramKey] = true; + } else { + removeExampleTypes(param); + } + } else { + params[paramKey] = true; + } + } + return params; +} + +function getPinnedSequences() { + const { call, abort } = projectsService.getPinnedSequences(); + + return { + call: () => + call((detail: IPinnedSequencesResData | Error) => { + exceptionHandler({ detail, model }); + }).then((data: IPinnedSequencesResData) => { + model.setState({ + pinnedSequences: data.sequences, + }); + }), + abort, + }; +} + +function setPinnedSequences( + pinnedSequences: IPinnedSequencesResData, + errorHandler: (detail: unknown) => void, +) { + const { call, abort } = projectsService.setPinnedSequences(pinnedSequences); + + return { + call: () => + call(errorHandler).then((data: IPinnedSequencesResData) => { + model.setState({ + pinnedSequences: data.sequences, + }); + }), + abort, + }; +} + +const projectsModel = { + ...model, + getProjectsData, + getProjectParams, + getPinnedSequences, + setPinnedSequences, +}; + +export default projectsModel; diff --git a/src/src/services/models/runs/runDetailAppModel.ts b/src/src/services/models/runs/runDetailAppModel.ts new file mode 100644 index 00000000..1a60db76 --- /dev/null +++ b/src/src/services/models/runs/runDetailAppModel.ts @@ -0,0 +1,403 @@ +import _ from 'lodash-es'; + +import { IRunBatch } from 'pages/RunDetail/types'; + +import runsService from 'services/api/runs/runsService'; +import * as analytics from 'services/analytics'; +import experimentsService from 'services/api/experiments/experimentsService'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { IApiRequest } from 'types/services/services'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import exceptionHandler from 'utils/app/exceptionHandler'; +import { encode } from 'utils/encoder/encoder'; +import contextToString from 'utils/contextToString'; +import alphabeticalSortComparator from 'utils/alphabeticalSortComparator'; +import { + decodeBufferPairs, + decodePathsVals, + iterFoldTree, +} from 'utils/encoder/streamEncoding'; +import { filterSingleRunMetricsData } from 'utils/app/filterMetricData'; + +import createModel from '../model'; + +const model = createModel>({ + isRunInfoLoading: true, + isExperimentsLoading: false, + isRunBatchLoading: false, + isRunsOfExperimentLoading: false, + isRunLogsLoading: false, + isLoadMoreButtonShown: true, +}); + +let getRunsInfoRequestRef: IApiRequest; +let getRunsBatchRequestRef: IApiRequest; +let getExperimentsDataRequestRef: IApiRequest; +let getRunsOfExperimentRequestRef: IApiRequest; +let getRunsLogsRequestRef: IApiRequest; + +function initialize() { + model.init(); +} + +function getExperimentsData() { + if (getExperimentsDataRequestRef) { + getExperimentsDataRequestRef.abort(); + } + getExperimentsDataRequestRef = runsService.getExperimentsData(); + return { + call: async () => { + model.setState({ isExperimentsLoading: true }); + const data = await getExperimentsDataRequestRef.call((detail: any) => { + exceptionHandler({ detail, model }); + }); + model.setState({ + isExperimentsLoading: false, + experimentsData: _.orderBy(data, ['name'], ['asc']), + }); + return data; + }, + abort: getExperimentsDataRequestRef.abort, + }; +} + +function getRunInfo(runHash: string): IApiRequest { + if (getRunsInfoRequestRef) { + getRunsInfoRequestRef.abort(); + } + getRunsInfoRequestRef = runsService.getRunInfo(runHash); + return { + call: async () => { + model.setState({ isRunInfoLoading: true }); + const data = await getRunsInfoRequestRef.call((detail: any) => { + exceptionHandler({ detail, model }); + }); + model.setState({ + runParams: data.params, + runTraces: data.traces, + runInfo: data.props, + runArtifacts: data.artifacts, + experimentId: data.props.experiment.id, + isRunInfoLoading: false, + }); + return data; + }, + abort: getRunsInfoRequestRef.abort, + }; +} + +function getRunsOfExperiment( + runHash: string, + params?: { limit: number; offset?: string }, + isLoadingMore?: boolean, +) { + if (getRunsOfExperimentRequestRef) { + getRunsOfExperimentRequestRef.abort(); + } + getRunsOfExperimentRequestRef = experimentsService.getRunsOfExperiment( + runHash, + params, + ); + return { + call: async () => { + model.setState({ isRunsOfExperimentLoading: true }); + const data = await getRunsOfExperimentRequestRef.call((detail: any) => { + exceptionHandler({ detail, model }); + }); + const runsOfExperiment = isLoadingMore + ? [...(model.getState().runsOfExperiment || []), ...data.runs] + : [...data.runs]; + model.setState({ + runsOfExperiment, + isRunsOfExperimentLoading: false, + experimentId: data.id, + isLoadMoreButtonShown: data.runs.length === 10, + }); + }, + abort: getRunsOfExperimentRequestRef.abort, + }; +} + +function processRunBatchData( + data: IRunBatch[], + metricsBatch: IRunBatch[], + systemBatch: IRunBatch[], +): { + runMetricsBatch: IRunBatch[]; + runSystemBatch: IRunBatch[]; +} { + const runMetricsBatch: IRunBatch[] = metricsBatch?.slice() ?? []; + const runSystemBatch: IRunBatch[] = systemBatch?.slice() ?? []; + + for (let run of data) { + const { values, iters } = filterSingleRunMetricsData(run); + const contextName = + contextToString(run.context) === '' + ? '' + : `_${contextToString(run.context)}`; + const metric = { + ...run, + values, + iters, + key: encode({ + name: run.name, + context: run.context, + }), + sortKey: `${run.name}${contextName}`, + }; + if (run.name.startsWith('__system__')) { + runSystemBatch.push(metric); + } else { + runMetricsBatch.push(metric); + } + } + + // sort run batch data + runMetricsBatch.sort(alphabeticalSortComparator({ orderBy: 'sortKey' })); + runSystemBatch.sort(alphabeticalSortComparator({ orderBy: 'sortKey' })); + + return { + runMetricsBatch: _.uniqBy(runMetricsBatch, 'sortKey'), + runSystemBatch: _.uniqBy(runSystemBatch, 'sortKey'), + }; +} + +function getRunMetricsBatch(body: any, runHash: string) { + if (getRunsBatchRequestRef) { + getRunsBatchRequestRef.abort(); + } + getRunsBatchRequestRef = runsService.getRunMetricsBatch(body, runHash); + return { + call: async () => { + try { + const data = await getRunsBatchRequestRef.call(); + const { runMetricsBatch, runSystemBatch } = processRunBatchData( + data, + model.getState().runMetricsBatch, + model.getState().runSystemBatch, + ); + + model.setState({ + ...model.getState(), + runMetricsBatch, + runSystemBatch, + isRunBatchLoading: false, + }); + } catch (ex: Error | any) { + if (ex.name !== 'AbortError') { + exceptionHandler({ detail: ex, model }); + } + } + }, + abort: getRunsBatchRequestRef.abort, + }; +} + +function getRunLogs({ + runHash, + record_range, + isLiveUpdate = false, + isLoadMore = false, +}: { + runHash: string; + record_range?: string; + isLiveUpdate?: boolean; + isLoadMore?: boolean; +}) { + if (getRunsLogsRequestRef) { + getRunsLogsRequestRef.abort(); + } + getRunsLogsRequestRef = runsService.getRunLogs(runHash, record_range); + return { + call: async () => { + const runLogs = model.getState()?.runLogs ?? {}; + if (!isLiveUpdate) { + model.setState({ isRunLogsLoading: true }); + } + + const stream = await getRunsLogsRequestRef.call((detail: any) => { + exceptionHandler({ detail, model }); + }); + let bufferPairs = decodeBufferPairs(stream); + let decodedPairs = decodePathsVals(bufferPairs); + let objects = iterFoldTree(decodedPairs, 1); + const runLogsData: { [key: string]: any } = {}; + for await (let [keys, val] of objects) { + runLogsData[keys[0]] = { index: +keys[0], value: val }; + } + const updatedLogsData: { [key: string]: any } = { + ...runLogs, + ...runLogsData, + }; + + model.setState({ + runLogs: updatedLogsData, + updatedLogsCount: + isLiveUpdate || isLoadMore + ? _.keys(updatedLogsData).length - _.keys(runLogs).length + : 0, + isRunLogsLoading: false, + }); + }, + abort: getRunsLogsRequestRef.abort, + }; +} + +function archiveRun(id: string, archived: boolean = false) { + const state = model.getState(); + runsService + .archiveRun(id, archived) + .call((detail) => { + exceptionHandler({ detail, model }); + }) + .then((res: any) => { + model.setState({ + ...state, + runInfo: { + ...state?.runInfo, + archived, + }, + }); + if (res.id) { + onNotificationAdd({ + id: Date.now(), + severity: 'success', + messages: [ + archived + ? 'Run successfully archived' + : 'Run successfully unarchived', + ], + }); + } else { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: ['Something went wrong'], + }); + } + analytics.trackEvent( + archived ? '[RunDetail] Archive Run' : '[RunDetail] Unarchive Run', + ); + }); +} + +function deleteRun(id: string, successCallback: () => void = _.noop) { + try { + runsService + .deleteRun(id) + .call((detail) => { + exceptionHandler({ model, detail }); + }) + .then((res: any) => { + if (res.id) { + successCallback(); + } else { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: ['Something went wrong'], + }); + } + }); + } catch (err: any) { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: [err.message], + }); + } +} + +function editRunNameAndDescription( + id: string, + name: string, + description: string, + archived: boolean, +) { + try { + runsService + .editRunNameAndDescription(id, name, description, archived) + .call((detail) => { + exceptionHandler({ model, detail }); + }) + .then((res: any) => { + const state = model.getState(); + + model.setState({ + ...state, + runInfo: { + ...state?.runInfo, + name, + description, + }, + }); + if (res.id) { + onNotificationAdd({ + id: Date.now(), + severity: 'success', + messages: ['Changes successfully saved'], + }); + } else { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: ['Something went wrong'], + }); + } + analytics.trackEvent('[RunDetail] Edit Run name and description'); + }); + } catch (err: any) { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: [err.message], + }); + } +} + +function editTags(tags: ITagInfo[]) { + const state = model.getState(); + + model.setState({ + ...state, + runInfo: { + ...state?.runInfo, + tags, + }, + }); +} + +function onNotificationDelete(id: number) { + let notifyData: INotification[] | [] = model.getState()?.notifyData || []; + notifyData = [...notifyData].filter((i) => i.id !== id); + model.setState({ notifyData }); +} + +function onNotificationAdd(notification: INotification) { + let notifyData: INotification[] | [] = model.getState()?.notifyData || []; + notifyData = [...notifyData, notification]; + model.setState({ notifyData }); + setTimeout(() => { + onNotificationDelete(notification.id); + }, 3000); +} + +const runDetailAppModel = { + ...model, + initialize, + getRunInfo, + getRunLogs, + getRunMetricsBatch, + getExperimentsData, + getRunsOfExperiment, + archiveRun, + deleteRun, + onNotificationAdd, + onNotificationDelete, + editRunNameAndDescription, + editTags, +}; + +export default runDetailAppModel; diff --git a/src/src/services/models/runs/runTracesModel.ts b/src/src/services/models/runs/runTracesModel.ts new file mode 100644 index 00000000..1682d21f --- /dev/null +++ b/src/src/services/models/runs/runTracesModel.ts @@ -0,0 +1,347 @@ +// eslint-disable-next-line react-hooks/exhaustive-deps +import _ from 'lodash-es'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import createModel from 'services/models/model'; +import runsService from 'services/api/runs/runsService'; +import { trackEvent } from 'services/analytics'; + +import { + decodeBufferPairs, + decodePathsVals, + iterFoldTree, +} from 'utils/encoder/streamEncoding'; + +import settings from './settings'; +import { + TraceResponseData, + TraceRawDataItem, + IRunTraceModel, + RangePanelItem, + TraceType, + QueryData, + IConfig, +} from './types'; +import { + getContextObjFromMenuActiveKey, + getMenuData, + reformatArrayQueries, + VisualizationMenuTitles, +} from './util'; + +// @TODO implement type +let getTraceBatchRequestRef: any = null; + +const model = createModel>({}); + +function getDefaultQueryAndConfigData(traceType: TraceType) { + const traceSettings = settings[traceType]; + const queryData: QueryData = { + sliders: {}, + inputs: {}, + inputsValidations: {}, + }; + const config: IConfig = { + rangePanel: [], + }; + + const inputKeys = Object.keys(traceSettings?.inputs); + + Object.keys(traceSettings.sliders).forEach((key, index) => { + const item = traceSettings.sliders[key]; + queryData.sliders[key] = item.defaultValue; + const correspondedInput = traceSettings.inputs[inputKeys[index]]; + // inject range panel data + const processedItem: RangePanelItem = { + sliderName: key, + inputName: inputKeys[index], + sliderTitle: item.title, + inputTitle: correspondedInput.title, + sliderTitleTooltip: item.tooltip, + inputTitleTooltip: correspondedInput.tooltip, + sliderType: item.sliderType, + inputValidationPatterns: traceSettings.inputValidation, + infoPropertyName: item?.infoPropertyName, + }; + + config.rangePanel.push(processedItem); + }); + Object.keys(traceSettings.inputs).forEach((key) => { + queryData.inputs[key] = traceSettings.inputs[key].defaultValue; + }); + + return { queryData, config }; +} + +function initialize( + run_id: string, + traceType: TraceType, + traces: TraceRawDataItem[], + runParams?: object, +) { + model.init(); + + const { data, availableIds, title, defaultActiveKey, defaultActiveName } = + getMenuData(traceType, traces); + + const { queryData, config } = getDefaultQueryAndConfigData(traceType); + + // setMenuData + model.setState({ + config, + queryData, + isApplyBtnDisabled: false, + traceType, + runHash: run_id, + isTraceBatchLoading: true, + runParams, + menu: { + title, + items: data, + defaultActiveItemKey: defaultActiveKey, + activeItemKey: defaultActiveKey, + availableKeys: availableIds, + activeItemName: defaultActiveName, + }, + batchRequestOptions: { + trace: getContextObjFromMenuActiveKey(defaultActiveKey, availableIds), + query: null, + }, + }); + + getRunTraceBatch(true).then().catch(); +} + +function changeActiveItemKey(key: string, name: string) { + const state = model.getState(); + const menuState = state.menu; + const batchRequestOptions = state.batchRequestOptions; + const traceType = state.traceType || 'distributions'; + + const batchRequestTrace = getContextObjFromMenuActiveKey( + key || '', + menuState?.availableKeys || [], + ); + + model.setState({ + ...state, + ...getDefaultQueryAndConfigData(traceType), + isTraceContextBatchLoading: true, + menu: { + ...menuState, + activeItemKey: key, + activeItemName: name, + }, + batchRequestOptions: { + ...batchRequestOptions, + trace: batchRequestTrace, + }, + }); + + getRunTraceBatch(true).then().catch(); + + trackEvent( + // @ts-ignore + ANALYTICS_EVENT_KEYS.runDetails.tabs[state.traceType].changeActiveItemKey, + ); +} + +function abortGetTraceBatchBatchRequest() { + if (getTraceBatchRequestRef) { + getTraceBatchRequestRef?.abort(); + getTraceBatchRequestRef = null; + } +} + +function getInitialSliderValues(processedData: any, sliderKeys: string[]) { + const values: Record = {}; + sliderKeys.forEach((key) => { + values[key] = processedData[key]; + }); + + return values; +} + +async function getRunTraceBatch(isInitial = false) { + abortGetTraceBatchBatchRequest(); + + const state = model.getState(); + const traceType = state.traceType || 'distributions'; + const requestOptions = state.batchRequestOptions; + const queryData = state.queryData; + + let paramsToApi = settings[traceType].paramsToApi; + + if (!paramsToApi) { + paramsToApi = (queryData?: QueryData) => { + return { + ...(!isInitial ? reformatArrayQueries(queryData?.sliders) : {}), + ...queryData?.inputs, + }; + }; + } + + if (traceType === 'figures') { + getTraceBatchRequestRef = runsService.getBatchByStep( + state.runHash || '', + traceType, + paramsToApi(queryData), + [requestOptions?.trace], + ); + } else { + getTraceBatchRequestRef = runsService.getBatch( + state.runHash || '', + traceType, + paramsToApi(queryData), + [requestOptions?.trace], + ); + } + try { + model.setState({ + ...state, + batchRequestOptions: { + ...requestOptions, + params: queryData, + }, + isTraceBatchLoading: true, + }); + const stream = await getTraceBatchRequestRef?.call((detail: any) => { + // @TODO add exception + // eslint-disable-next-line no-console + console.error(detail); + }); + + let bufferPairs = decodeBufferPairs(stream); + let decodedPairs = decodePathsVals(bufferPairs); + let objects = iterFoldTree(decodedPairs, 1); + + let data: Partial = {}; + for await (let [keys, val] of objects) { + data = { + ...data, + [keys[0]]: val, + }; + } + const parsed = settings[state.traceType || 'distributions'].dataProcessor( + data, + state?.runParams, + ); + if (isInitial) { + const sliders = getInitialSliderValues( + parsed, + Object.keys(queryData?.sliders || {}), + ); + if (queryData) { + queryData.sliders = sliders; + Object.keys(queryData.inputs).forEach((key: string) => { + const subKey = key.slice(0, key.indexOf('_')); + const range = parsed[`${subKey}_range`]; + if ( + parsed.processedDataType === VisualizationMenuTitles.figures && + (queryData.inputs[key] < range[0] || + queryData.inputs[key] > range[1]) + ) { + queryData.inputs[key] = range[1] ?? 1; + } else if ( + (parsed.processedDataType !== VisualizationMenuTitles.figures && + queryData.inputs[key] < 0) || + queryData.inputs[key] > range[1] + ) { + const rangeLength = _.range(range[0], range[1] + 1).length; + queryData.inputs[key] = rangeLength > 0 ? rangeLength : 1; + } else { + queryData.inputs[key] = queryData.inputs[key] ?? 1; + } + }); + } + } + model.setState({ + ...state, + data: parsed, + queryData, + isTraceBatchLoading: false, + isTraceContextBatchLoading: false, + }); + } catch (e) { + model.setState({ + ...state, + isTraceBatchLoading: false, + }); + // @TODO handle exception + throw e; + } +} + +function applyBtnDisabledHandler() { + const state = model.getState(); + const inputsValidations = state.queryData?.inputsValidations || {}; + + const isInputsValid = + _.size( + Object.keys(inputsValidations).filter((key) => !inputsValidations[key]), + ) <= 0; + + model.setState({ + ...state, + isApplyBtnDisabled: !isInputsValid, + }); +} + +function onInputChange(name: string, value: number, isValid: boolean = true) { + const state = model.getState(); + model.setState({ + ...state, + queryData: { + ...state.queryData, + inputs: { + ...state.queryData?.inputs, + [name]: value, + }, + inputsValidations: { + ...state.queryData?.inputsValidations, + [name]: isValid, + }, + }, + }); + + applyBtnDisabledHandler(); +} + +function onRangeChange(name: string, value: number | number[]) { + const state = model.getState(); + model.setState({ + ...state, + queryData: { + ...state.queryData, + sliders: { + ...state.queryData?.sliders, + [name]: value, + }, + }, + }); +} + +function onApply() { + const { traceType } = model.getState(); + getRunTraceBatch().then().catch(); + // @ts-ignore + trackEvent(ANALYTICS_EVENT_KEYS.runDetails.tabs[traceType].clickApplyButton); +} + +function destroy() { + model.destroy(); + abortGetTraceBatchBatchRequest(); +} + +const runTracesModel = { + ...model, + destroy, + onApply, + initialize, + onInputChange, + onRangeChange, + changeActiveItemKey, +}; + +export default runTracesModel; diff --git a/src/src/services/models/runs/runsAppModel.ts b/src/src/services/models/runs/runsAppModel.ts new file mode 100644 index 00000000..9ee6f8d8 --- /dev/null +++ b/src/src/services/models/runs/runsAppModel.ts @@ -0,0 +1,5 @@ +import { appInitialConfig, createAppModel } from 'services/models/explorer'; + +const runsAppModel = createAppModel(appInitialConfig.RUNS) as any; + +export default runsAppModel; diff --git a/src/src/services/models/runs/settings.ts b/src/src/services/models/runs/settings.ts new file mode 100644 index 00000000..f98d7e2b --- /dev/null +++ b/src/src/services/models/runs/settings.ts @@ -0,0 +1,187 @@ +import { IValidationPatterns } from 'components/kit/Input'; + +import { QueryData } from './types'; +import { + processDistributionsData, + processImagesData, + processTextsData, + processPlotlyData, + processAudiosData, +} from './util'; + +type InputItem = { + title: string; + defaultValue: number; + tooltip: string; +}; + +type SliderItem = { + title: string; + defaultValue: [number, number]; + tooltip: string; + sliderType: 'single' | 'range'; // This type is same as SliderWithInput component sliderType prop type. + infoPropertyName?: string; +}; + +type SettingItem = { + dataProcessor: Function; + sliders: Record; + inputs: Record; + paramsToApi?: (queryData?: QueryData) => Record; + inputValidation?: (...args: any) => IValidationPatterns; +}; + +const settings: Record = { + distributions: { + dataProcessor: processDistributionsData, + sliders: { + record_range: { + defaultValue: [0, 50], + title: 'Steps', + tooltip: 'Training step. Increments every time track() is called', + sliderType: 'range', + infoPropertyName: 'step', + }, + }, + inputs: { + record_density: { + defaultValue: 50, + title: 'Steps', + tooltip: 'Number of steps to display', + }, + }, + }, + images: { + dataProcessor: processImagesData, + sliders: { + record_range: { + defaultValue: [0, 50], + tooltip: 'Training step. Increments every time track() is called', + title: 'Steps', + sliderType: 'range', + infoPropertyName: 'step', + }, + index_range: { + defaultValue: [0, 50], + tooltip: 'Index in the list of images passed to track() call', + title: 'Indices', + sliderType: 'range', + infoPropertyName: 'index', + }, + }, + inputs: { + record_density: { + defaultValue: 50, + title: 'Steps count', + tooltip: 'Number of steps to display', + }, + index_density: { + defaultValue: 5, + title: 'Indices count', + tooltip: 'Number of images per step', + }, + }, + }, + audios: { + dataProcessor: processAudiosData, + sliders: { + record_range: { + defaultValue: [0, 50], + tooltip: 'Training step. Increments every time track() is called', + title: 'Steps', + sliderType: 'range', + infoPropertyName: 'step', + }, + index_range: { + defaultValue: [0, 50], + tooltip: 'Index in the list of audios passed to track() call', + title: 'Indices', + sliderType: 'range', + infoPropertyName: 'index', + }, + }, + inputs: { + record_density: { + defaultValue: 50, + title: 'Steps count', + tooltip: 'Number of steps to display', + }, + index_density: { + defaultValue: 5, + title: 'Indices count', + tooltip: 'Number of audios per step', + }, + }, + }, + texts: { + dataProcessor: processTextsData, + sliders: { + record_range: { + defaultValue: [0, 50], + tooltip: 'Training step. Increments every time track() is called', + title: 'Steps', + sliderType: 'range', + infoPropertyName: 'step', + }, + index_range: { + defaultValue: [0, 50], + tooltip: 'Index in the list of texts passed to track() call', + title: 'Indices', + sliderType: 'range', + infoPropertyName: 'index', + }, + }, + inputs: { + record_density: { + defaultValue: 50, + title: 'Steps count', + tooltip: 'Number of steps to display', + }, + index_density: { + defaultValue: 5, + title: 'Indices count', + tooltip: 'Number of texts per step', + }, + }, + }, + figures: { + dataProcessor: processPlotlyData, + paramsToApi: (queryData?: QueryData) => { + const record_step = queryData?.inputs?.record_range ?? -1; + return record_step !== -1 + ? { + record_step, + record_density: 1, + } + : { record_density: 1 }; + }, + inputValidation: (min: number | string, max: number | string) => [ + { + errorCondition: (value: string | number) => +value < min, + errorText: `Value should be equal or greater then ${min}`, + }, + { + errorCondition: (value: string | number) => +value > max, + errorText: `Value should be equal or smaller then ${max}`, + }, + ], + sliders: { + record_range: { + defaultValue: [0, 0], + tooltip: 'Training step. Increments every time track() is called', + title: 'Step', + sliderType: 'single', + infoPropertyName: 'step', + }, + }, + inputs: { + record_range: { + defaultValue: -1, + tooltip: 'Training step. To see figures tracked in the step.', + title: 'Step', + }, + }, + }, +}; + +export default settings; diff --git a/src/src/services/models/runs/types.d.ts b/src/src/services/models/runs/types.d.ts new file mode 100644 index 00000000..7ef0d945 --- /dev/null +++ b/src/src/services/models/runs/types.d.ts @@ -0,0 +1,138 @@ +import { IValidationPatterns } from 'components/kit/Input'; +import { IMenuItem } from 'components/kit/Menu'; + +export type IRunTraceModel = { + runHash: string; + traceType: TraceType; + isTraceBatchLoading: boolean; + isTraceContextBatchLoading: boolean; + menu: { + title: string; + items: IMenuItem[]; + activeItemKey: string; + activeItemName: string; + defaultActiveItemKey: string; + availableKeys: string[]; + }; + runParams?: object; + queryData: QueryData; + batchRequestOptions: { + trace: TraceRawDataItem; + params: {}; + }; + config: IConfig; + data: any; + isApplyBtnDisabled: boolean; +}; + +export type TraceType = + | 'distributions' + | 'images' + | 'audios' + | 'texts' + | 'videos' + | 'figures' + | 'metric'; + +/** + * The context of info Raw data + * It need to have | {} annotation as well, but it cause problems while working + * Checking its an empty object like this Object.key(context).length > 0 + */ +export type TraceContext = { [key: string]: string }; + +/** + * Raw data coming from run detail's info api call + */ +export type TraceRawDataItem = { + context: TraceContext; + name: string; +}; + +/** + * Distributions api response + */ +export interface DistributionsData extends TraceRawDataItem { + record_range_total: [number, number]; + values: DistributionValue[]; + iters: number[]; +} + +/** + * Images api response + * @TODO make compatible to images data + */ +export interface ImagesData extends DistributionsData { + context: object; + index_range_total: [number, number]; + values: any; +} + +/** + * Texts api response + * @TODO make compatible to texts data + */ +export interface TextsData extends ImagesData { + values: { data: string; index: number }[][]; +} + +/** + * Distributions api response value type + */ +export type DistributionValue = { + bin_count: number; + range: [number, number]; + data: { + blob: Uint8Array; + }; +}; + +/** + * Plotly api response + */ +export interface IPlotlyData extends TraceRawDataItem { + record_range_total: [number, number]; + values: PlotlyValue[]; + iters: number[]; +} + +/** + * Plotly api response value type + */ +export type IPlotlyValue = { + data: { + data: any[]; + layout: any; + }; +}; +export interface TraceProcessedData extends DistributionValue { + data: { + blob: TraceProcessedValue; + }; +} + +export type TraceProcessedValue = number[] | ArrayBuffer; + +export type TraceResponseData = DistributionsData | ImagesData; + +export type QueryData = { + sliders: Record; + inputs: Record; + inputsValidations: Record; +}; + +export type RangePanelItem = { + sliderName: string; + inputName: string; + sliderTitle: string; + inputTitle: string; + sliderTitleTooltip: string; + inputTitleTooltip: string; + sliderType: 'single' | 'range'; // This type is same as SliderWithInput component sliderType prop type. + inputValidationPatterns?: (...args: any) => IValidationPatterns; + infoPropertyName?: string; +}; + +export type IConfig = { + rangePanel: RangePanelItem[]; +}; diff --git a/src/src/services/models/runs/util.test.ts b/src/src/services/models/runs/util.test.ts new file mode 100644 index 00000000..81424ffe --- /dev/null +++ b/src/src/services/models/runs/util.test.ts @@ -0,0 +1,128 @@ +import { IMenuItem } from 'components/kit/Menu'; + +import { shouldMatchObject } from 'tests/utils'; + +import { TraceRawDataItem } from './types'; +import { getMenuItemFromRawInfo, getContextObjFromMenuActiveKey } from './util'; + +//@TODO: The next action on this may try to solve the testing issues by going further with the components used here. + +describe('first', () => { + it('should match object', () => {}); +}); +// describe('[getMenuItemFromRawInfo]', () => { +// it('should return the right data if context is empty', () => { +// const rawData: TraceRawDataItem[] = [ +// { +// context: {}, +// name: 'dist_test', +// }, +// { +// context: {}, +// name: 'dist_test', +// }, +// { +// context: {}, +// name: 'dist_test1', +// }, +// ]; + +// const actualResult = getMenuItemFromRawInfo(rawData); + +// const expectedMenuData: IMenuItem[] = [ +// { +// name: 'dist_test', +// id: 'dist_test', +// }, +// { +// name: 'dist_test1', +// id: 'dist_test1', +// }, +// ]; +// const availableIds = ['dist_test', 'dist_test1']; +// shouldMatchObject( +// { +// availableIds, +// data: expectedMenuData, +// }, +// actualResult, +// ); +// }); + +// it('should return the right data if context is not empty', () => { +// const rawData: TraceRawDataItem[] = [ +// { +// context: { subset: 'val', test: 'test' }, +// name: 'dist_test', +// }, +// { +// context: { subset: 'test', test1: 'test1' }, +// name: 'dist_test', +// }, +// ]; + +// const actualResult = getMenuItemFromRawInfo(rawData); + +// const expectedMenuData: IMenuItem[] = [ +// { +// name: 'dist_test', +// id: 'dist_test', +// children: [ +// { +// name: 'subset = val', +// id: 'subset=val', +// }, +// { +// name: 'test = test', +// id: 'test=test', +// }, +// { +// name: 'subset = test', +// id: 'subset=test', +// }, +// { +// name: 'test1 = test1', +// id: 'test1=test1', +// }, +// ], +// }, +// ]; +// const availableIds = ['dist_test']; + +// shouldMatchObject({ data: expectedMenuData, availableIds }, actualResult); +// }); +// }); + +// describe('[getContextObjFromMenuActiveKey]', () => { +// it('should return the right object', () => { +// const rawData: TraceRawDataItem[] = [ +// { +// context: { subset: 'val', test: 'test' }, +// name: 'dist_test', +// }, +// { +// context: { subset: 'test', test1: 'test1' }, +// name: 'dist_test', +// }, +// ]; + +// const { availableIds } = getMenuItemFromRawInfo(rawData); + +// const result1 = getContextObjFromMenuActiveKey( +// 'dist_test.subset=val', +// availableIds, +// ); +// const result2 = getContextObjFromMenuActiveKey( +// 'dist_test.test1=test1', +// availableIds, +// ); +// shouldMatchObject( +// { name: 'dist_test', context: { subset: 'val' } }, +// result1, +// ); +// shouldMatchObject( +// { name: 'dist_test', context: { test1: 'test1' } }, +// result2, +// ); +// }); +// }); diff --git a/src/src/services/models/runs/util.ts b/src/src/services/models/runs/util.ts new file mode 100644 index 00000000..cc85b646 --- /dev/null +++ b/src/src/services/models/runs/util.ts @@ -0,0 +1,464 @@ +import bs58check from 'bs58check'; +import _ from 'lodash-es'; + +import { IMenuItem } from 'components/kit/Menu'; + +import { + IImageData, + IProcessedImageData, +} from 'types/services/models/imagesExplore/imagesExploreAppModel'; + +import contextToString from 'utils/contextToString'; +import alphabeticalSortComparator from 'utils/alphabeticalSortComparator'; +import { encode } from 'utils/encoder/encoder'; +import getObjectPaths from 'utils/getObjectPaths'; +import { getDataAsMediaSetNestedObject } from 'utils/app/getDataAsMediaSetNestedObject'; +import { float64FromUint8, getValue } from 'utils/helper'; +import getGroupingSelectOptions from 'utils/app/getGroupingSelectOptions'; + +import { + DistributionsData, + DistributionValue, + ImagesData, + IPlotlyData, + TextsData, + TraceProcessedData, + TraceRawDataItem, + TraceType, +} from './types'; + +/** + * getMenuItemFromRawInfo + * --------- Complexity analyse ----------- + * The runtime is quadratic + * O(n) - Best case + * O(n * k) - Worst case where k is the maximum length of all children + * --------- Complexity analyse ----------- + * We assume info already has length + * @param info {TraceRawDataItem[]} - raw info data + * @param separator {string} - key value separator + * @returns - compatible Menu data, availableIds for the first layer + */ +export function getMenuItemFromRawInfo( + info: TraceRawDataItem[], + separator: string = '=', +): { + data: IMenuItem[]; + availableIds: string[]; +} { + // for checking duplications + const checkedItemIds: string[] = []; + + const data: IMenuItem[] = []; + + const sortOrder = alphabeticalSortComparator({ + orderBy: 'name', + additionalCompare: (name1: string, name2: string) => { + if (name2 === 'EMPTY CONTEXT') { + return 0; + } + + return null; + }, + }); + // doesn't destructuring item, because we are not sure it has context + info.forEach((item: TraceRawDataItem) => { + const id: string = bs58check.encode(Buffer.from(`${item.name}`)); + let menuItem: IMenuItem = { + name: item.name, + id, + }; + + // this check is for ensure raw data has context + if (item.context) { + const keys: string[] = Object.keys(item.context); + if (keys.length) { + const children: IMenuItem[] = []; + const child: IMenuItem = { + name: `${contextToString(item.context)}`, + id: bs58check.encode(Buffer.from(JSON.stringify(item.context))), + }; + children.push(child); + /*keys.forEach((key: string) => { + const childItem = { + name: `${key} ${separator} ${item.context[key]}`, + // remove whitespaces from id + id: `${key}${separator}${item.context[key]}`, + }; + children.push(childItem); + });*/ + + menuItem.children = children; + } else { + menuItem.children = [ + { + name: 'empty context', + id: bs58check.encode(Buffer.from(JSON.stringify({}))), + }, + ]; + } + } + /* Group children under the same id + * Currently this function supports only the first layer of the array + * To solve problem for nested items run recursively, not checked, that is not reliable right now + * Or iterate through the children and remove if duplicate + */ + if (checkedItemIds.includes(id)) { + data.forEach((it: IMenuItem, index: number) => { + if (it.id === id) { + const itemChildren = data[index].children || []; + const currentChildren = menuItem.children || []; + // spreading order will let to order "empty context" to the first of all + // cause if there empty context it will be in currentChildren + data[index].children = [...currentChildren, ...itemChildren].sort( + sortOrder, + ); + + // clear empty array + // @ts-ignore because we already set it minimum empty array + if (!data[index].children.length) { + delete data[index].children; + } + } + }); + } else { + data.push(menuItem); + checkedItemIds.push(id); + } + }); + + data.sort(sortOrder); + + return { + availableIds: checkedItemIds, + data, + }; +} + +/** + * Generates api call request compatible data from menu's active key + * 'dist_test.subset:value' -> { name: 'dist_test', context: { subset: 'val' } } + * @param key {String} - active key + * @param data {IMenuItem[]} - data + * @param separator {string} - key value separator + * @returns TraceRawDataItem - the object compatible to api call + */ +export function getContextObjFromMenuActiveKey( + key: string, + data: string[], + separator: string = '=', +): TraceRawDataItem { + let name = ''; + let contextKey = ''; + let context = {}; + + for (let i = 0; i < key.length; i++) { + // check includes to ensure we have not a wrong string + // It is the case when the actual name has '.' inside + if (!data.includes(name)) { + name += key[i]; + } else { + contextKey += key[i]; + } + } + + name = bs58check.decode(name).toString(); + if (contextKey) { + // remove contextKey[0] because it is '.' + context = JSON.parse( + bs58check.decode(contextKey.substring(1, contextKey.length)).toString(), + ); + // const keyValue: string[] = contextKey.split(separator); + // assumed there are separated string width "->" + // @TODO check if the actual string may have "separator" inside, it's very hard case + // @ts-ignore + } + + return { + name, + context, + }; +} + +export function getMenuData(traceType: TraceType, traces: TraceRawDataItem[]) { + let title = + VisualizationMenuTitles[traceType as Exclude]; + + let defaultActiveKey = ''; + let defaultActiveName = ''; + + const { data, availableIds } = getMenuItemFromRawInfo(traces); + + if (data[0].children && data[0].children.length) { + defaultActiveKey = data[0].id + '.' + data[0].children[0].id; + defaultActiveName = data[0].children[0].name; + } else { + defaultActiveKey = data[0].id + ''; // make string + defaultActiveName = data[0].name; + } + + return { data, defaultActiveKey, availableIds, title, defaultActiveName }; +} + +/** + * process distributions data + */ +export function processDistributionsData(data: Partial) { + const { record_range_total, iters, values } = data; + const processedValues: any[] = []; + const originalValues: TraceProcessedData[] = []; + + if (values) { + values.forEach((value: DistributionValue) => { + const parsedBlob: number[] = [...float64FromUint8(value.data.blob)]; + + const bin = []; + const xMin = value.range[0]; + const xMax = value.range[1]; + const binSize = (xMax - xMin) / value.bin_count; + for (let i = 0; i <= value.bin_count; i++) { + bin.push(xMin + i * binSize); + } + + processedValues.push([parsedBlob, bin]); + originalValues.push({ + ...value, + data: { + blob: parsedBlob, + }, + }); + }); + } + + return { + iters, + record_range: [record_range_total?.[0], (record_range_total?.[1] || 0) - 1], + processedValues, + originalValues, + processedDataType: VisualizationMenuTitles.distributions, + }; +} + +/** + * process texts data + */ +export function processTextsData(data: Partial) { + const { record_range_total, index_range_total, iters, values } = data; + const processedValues: any[] = []; + if (values) { + let count = 0; + values.forEach((stepValues, stepIndex) => { + stepValues.forEach((text) => { + processedValues.push({ + step: iters?.[stepIndex], + index: text.index, + text: text.data, + key: count, // Table row ID + }); + count++; + }); + }); + } + + return { + iters, + record_range: [record_range_total?.[0], (record_range_total?.[1] || 0) - 1], + index_range: [index_range_total?.[0], (index_range_total?.[1] || 0) - 1], + processedValues: _.orderBy(processedValues, ['step'], ['desc']), + processedDataType: VisualizationMenuTitles.texts, + }; +} + +/** + * process images data + */ +export function processImagesData( + data: Partial, + params?: { [key: string]: unknown }, +) { + const { + record_range_total, + iters, + values, + index_range_total, + context, + name, + } = data; + const groupingSelectOptions = params + ? getGroupingSelectOptions({ + params: getObjectPaths(params, params), + sequenceName: 'images', + }) + : []; + let images: IProcessedImageData[] = []; + values?.forEach((stepData: IImageData[], stepIndex: number) => { + stepData.forEach((image: IImageData) => { + const imageKey = encode({ + name, + traceContext: context, + index: image.index, + step: iters?.[stepIndex], + caption: image.caption, + }); + const seqKey = encode({ + name, + traceContext: context, + }); + images.push({ + ...image, + name, + step: iters?.[stepIndex], + context: context, + key: imageKey, + seqKey: seqKey, + }); + }); + }); + const { mediaSetData, orderedMap } = getDataAsMediaSetNestedObject({ + data: groupData(_.orderBy(images)), + groupingSelectOptions, + defaultGroupFields: ['step'], + }); + return { + imageSetData: mediaSetData, + orderedMap, + record_range: [record_range_total?.[0], (record_range_total?.[1] || 0) - 1], + index_range: [index_range_total?.[0], (index_range_total?.[1] || 0) - 1], + processedDataType: VisualizationMenuTitles.images, + }; +} + +export function processAudiosData( + data: Partial, + params?: { [key: string]: unknown }, +) { + const { + record_range_total, + iters, + values, + index_range_total, + context, + name, + } = data; + const groupingSelectOptions = params + ? getGroupingSelectOptions({ + params: getObjectPaths(params, params), + sequenceName: 'audios', + }) + : []; + let audiosSetData: any[] = []; + + values?.forEach((stepData: IImageData[], stepIndex: number) => { + stepData.forEach((audio: IImageData) => { + const audioKey = encode({ + name, + traceContext: context, + index: audio.index, + step: iters?.[stepIndex], + caption: audio.caption, + }); + const seqKey = encode({ + name, + traceContext: context, + }); + audiosSetData.push({ + ...audio, + audio_name: name, + step: iters?.[stepIndex], + context: context, + key: audioKey, + seqKey: seqKey, + }); + }); + }); + const { mediaSetData, orderedMap } = getDataAsMediaSetNestedObject({ + data: groupData(_.orderBy(audiosSetData)), + groupingSelectOptions, + defaultGroupFields: ['step'], + }); + return { + audiosSetData: mediaSetData, + orderedMap, + record_range: [record_range_total?.[0], (record_range_total?.[1] || 0) - 1], + index_range: [index_range_total?.[0], (index_range_total?.[1] || 0) - 1], + processedDataType: VisualizationMenuTitles.audios, + }; +} + +function groupData(data: IProcessedImageData[]): { + key: string; + config: { [key: string]: string }; + data: IProcessedImageData[]; +}[] { + const groupValues: { + [key: string]: { + key: string; + config: { [key: string]: string }; + data: IProcessedImageData[]; + }; + } = {}; + + for (let i = 0; i < data.length; i++) { + const groupValue: { [key: string]: string } = {}; + ['step'].forEach((field) => { + groupValue[field] = getValue(data[i], field); + }); + const groupKey = encode(groupValue); + if (groupValues.hasOwnProperty(groupKey)) { + groupValues[groupKey].data.push(data[i]); + } else { + groupValues[groupKey] = { + key: groupKey, + config: groupValue, + data: [data[i]], + }; + } + } + return Object.values(groupValues); +} + +export function reformatArrayQueries( + queryObj: Record = {}, +) { + const formattedQueryObject: Record = {}; + Object.keys(queryObj).forEach((key) => { + const item = queryObj[key]; + formattedQueryObject[key] = `${item[0]}:${item[1] + 1}`; + }); + + return formattedQueryObject; +} + +/** + * process plotly data + */ +export function processPlotlyData(data: Partial) { + const { record_range_total, iters, values } = data; + let processedValue = null; + let originalValues = null; + if (_.head(values)?.data) { + processedValue = JSON.parse(_.head(values)?.data); + originalValues = values; + processedValue.layout.autosize = true; + } else { + processedValue = {}; + originalValues = []; + } + + return { + iters, + record_range: [record_range_total?.[0], (record_range_total?.[1] || 0) - 1], + processedValue, + originalValues, + processedDataType: VisualizationMenuTitles.figures, + }; +} + +export const VisualizationMenuTitles = { + images: 'Images', + distributions: 'Distributions', + audios: 'Audios', + videos: 'Videos', + texts: 'Texts', + figures: 'Plotly', +}; diff --git a/src/src/services/models/scatters/mockData.ts b/src/src/services/models/scatters/mockData.ts new file mode 100644 index 00000000..21e931cf --- /dev/null +++ b/src/src/services/models/scatters/mockData.ts @@ -0,0 +1,17 @@ +import COLORS from 'config/colors/colors'; + +function getScattersMockData(count: number = 100) { + return new Array(count).fill('').map((v, i) => ({ + key: `${i}`, + data: { + xValues: [Math.random() * 1.5 + Math.random() * 5], + yValues: [Math.random() * 2.5 + Math.random() * 10], + }, + color: COLORS[0][i % COLORS[0].length], + selectors: [`${i}`], + groupKey: `${i}`, + chartIndex: 0, + })); +} + +export default getScattersMockData; diff --git a/src/src/services/models/scatters/scattersAppModel.ts b/src/src/services/models/scatters/scattersAppModel.ts new file mode 100644 index 00000000..aaf72466 --- /dev/null +++ b/src/src/services/models/scatters/scattersAppModel.ts @@ -0,0 +1,5 @@ +import { appInitialConfig, createAppModel } from 'services/models/explorer'; + +const scattersAppModel = createAppModel(appInitialConfig.SCATTERS) as any; + +export default scattersAppModel; diff --git a/src/src/services/models/tags/tagsAppModel.ts b/src/src/services/models/tags/tagsAppModel.ts new file mode 100644 index 00000000..306b3194 --- /dev/null +++ b/src/src/services/models/tags/tagsAppModel.ts @@ -0,0 +1,192 @@ +import tagsService from 'services/api/tags/tagsService'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITagProps } from 'types/pages/tags/Tags'; + +import createModel from '../model'; + +const model = createModel({ + isTagsDataLoading: false, + isRunsDataLoading: false, + isTagInfoDataLoading: false, + notifyData: [], +}); + +function initialize() { + model.init(); +} + +function getTagsData() { + const { call, abort } = tagsService.getTags(); + + return { + call: () => { + model.setState({ isTagsDataLoading: true }); + call().then((data: any) => { + model.setState({ tagsList: data, isTagsDataLoading: false }); + }); + }, + abort, + }; +} + +let getTagRunsRequestRef: { + call: () => Promise; + abort: () => void; +}; + +let getTagByIdRequestRef: { + call: () => Promise; + abort: () => void; +}; + +function onNotificationDelete(id: number) { + let notifyData: INotification[] | [] = model.getState()?.notifyData || []; + notifyData = [...notifyData].filter((i) => i.id !== id); + model.setState({ notifyData }); +} + +function onNotificationAdd(notification: INotification) { + let notifyData: INotification[] | [] = model.getState()?.notifyData || []; + notifyData = [...notifyData, notification]; + model.setState({ notifyData }); + setTimeout(() => { + onNotificationDelete(notification.id); + }, 3000); +} + +function getTagById(id: string) { + if (getTagByIdRequestRef) { + getTagByIdRequestRef?.abort(); + } + getTagByIdRequestRef = tagsService.getTagById(id); + + return { + call: async () => { + model.setState({ isTagInfoDataLoading: true }); + + const data = await getTagByIdRequestRef.call(); + model.setState({ tagInfo: data, isTagInfoDataLoading: false }); + }, + abort: getTagByIdRequestRef?.abort, + }; +} + +function getTagRuns(id: string) { + if (getTagRunsRequestRef) { + getTagRunsRequestRef?.abort(); + } + getTagRunsRequestRef = tagsService.getTagRuns(id); + + return { + call: async () => { + model.setState({ isRunsDataLoading: true }); + const data = await getTagRunsRequestRef.call(); + model.setState({ tagRuns: data.runs, isRunsDataLoading: false }); + }, + abort: getTagRunsRequestRef?.abort, + }; +} + +function archiveTag(id: string, archived: boolean = false) { + const state = model.getState(); + return tagsService + .hideTag(id, archived) + .call() + .then(() => { + model.setState({ + ...state, + tagInfo: { ...state?.tagInfo, archived }, + }); + onNotificationAdd({ + id: Date.now(), + severity: 'success', + messages: [ + archived + ? 'Tag successfully archived' + : 'Tag successfully unarchived', + ], + }); + }); +} + +function createTag(body: object) { + return tagsService + .createTag(body) + .call() + .then((res: any) => { + if (res.id) { + onNotificationAdd({ + id: Date.now(), + severity: 'success', + messages: ['Tag successfully created'], + }); + } else { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: [res.detail], + }); + } + return res; + }); +} + +function updateTag(body: object, id: string) { + return tagsService + .updateTag(body, id) + .call() + .then((res: any) => { + if (res.id) { + onNotificationAdd({ + id: Date.now(), + severity: 'success', + messages: ['Tag successfully updated'], + }); + } else { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: [res.detail], + }); + } + return res; + }); +} + +function deleteTag(id: string) { + return tagsService + .deleteTag(id) + .call() + .then(() => { + onNotificationAdd({ + id: Date.now(), + severity: 'success', + messages: ['Tag successfully deleted'], + }); + }); +} + +function updateTagInfo(tagInfo: ITagProps) { + const state = model.getState(); + model.setState({ + ...state, + tagInfo, + }); +} + +const tagsAppModel = { + ...model, + initialize, + getTagsData, + getTagRuns, + archiveTag, + getTagById, + updateTagInfo, + onNotificationDelete, + deleteTag, + createTag, + updateTag, +}; + +export default tagsAppModel; diff --git a/src/src/setupTests.ts b/src/src/setupTests.ts new file mode 100644 index 00000000..5dead2b4 --- /dev/null +++ b/src/src/setupTests.ts @@ -0,0 +1,7 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import 'jest-canvas-mock'; + +import '@testing-library/jest-dom'; diff --git a/src/src/stories/Badge.stories.tsx b/src/src/stories/Badge.stories.tsx new file mode 100644 index 00000000..7527fa59 --- /dev/null +++ b/src/src/stories/Badge.stories.tsx @@ -0,0 +1,30 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import BadgeComponent from 'components/kit_v2/Badge'; + +export default { + title: 'Kit/Data Display', + component: BadgeComponent, + argTypes: { + color: { + control: 'select', + }, + size: { + control: 'select', + }, + onDelete: { + control: 'string', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Badge = Template.bind({}); + +Badge.args = { + label: 'Badge', + onDelete: () => {}, +}; diff --git a/src/src/stories/Box.stories.tsx b/src/src/stories/Box.stories.tsx new file mode 100644 index 00000000..10deaf2c --- /dev/null +++ b/src/src/stories/Box.stories.tsx @@ -0,0 +1,26 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import BoxComponent from 'components/kit_v2/Box'; + +export default { + title: 'Kit/Data Display', + component: BoxComponent, + argTypes: {}, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Box = Template.bind({}); + +Box.args = { + children: 'Polymorphic Box component', + as: 'div', + css: { + bc: '$secondary20', + color: '$primary80', + p: '$4', + br: '$2', + }, +}; diff --git a/src/src/stories/Button.stories.tsx b/src/src/stories/Button.stories.tsx new file mode 100644 index 00000000..80df3c29 --- /dev/null +++ b/src/src/stories/Button.stories.tsx @@ -0,0 +1,48 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { IconSearch } from '@tabler/icons-react'; + +import Button from 'components/kit_v2/Button'; + +export default { + title: 'Kit/Inputs/Button', + component: Button, + argTypes: { + color: { + control: 'select', + }, + variant: { + control: 'select', + }, + size: { + control: 'select', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => + + Dialog Content + + + ); +}; + +export const UncontrolledDialog = Template.bind({}); +export const ControlledDialog = Template2.bind({}); + +UncontrolledDialog.args = { + description: 'Dialog description', + title: 'Dialog title', + trigger: , + titleIcon: } />, +}; + +ControlledDialog.args = { + description: 'Dialog description', + title: 'Dialog title', +}; diff --git a/src/src/stories/Icon.stories.tsx b/src/src/stories/Icon.stories.tsx new file mode 100644 index 00000000..0503c5e8 --- /dev/null +++ b/src/src/stories/Icon.stories.tsx @@ -0,0 +1,30 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { IconChartHistogram } from '@tabler/icons-react'; + +import IconComponent from 'components/kit_v2/Icon'; + +import { config } from 'config/stitches'; + +export default { + title: 'Kit/Data Display', + component: IconComponent, + argTypes: { + color: { + control: 'select', + options: Object.keys((config.theme as { colors: {} }).colors).map( + (key) => `$${key}`, + ), + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + } /> +); + +export const Icon = Template.bind({}); + +Icon.args = { + size: 'lg', + color: '$primary100', +}; diff --git a/src/src/stories/IconButton.stories.tsx b/src/src/stories/IconButton.stories.tsx new file mode 100644 index 00000000..5064ed5c --- /dev/null +++ b/src/src/stories/IconButton.stories.tsx @@ -0,0 +1,46 @@ +import { IconSearch } from '@tabler/icons-react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import IconButton from 'components/kit_v2/IconButton'; + +export default { + title: 'Kit/Inputs/IconButton', + component: IconButton, + argTypes: { + color: { + control: 'select', + }, + variant: { + control: 'select', + }, + size: { + control: 'select', + }, + disabled: { + control: 'boolean', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Contained = Template.bind({}); + +Contained.args = { + icon: , + variant: 'contained', +}; +export const Outlined = Template.bind({}); + +Outlined.args = { + icon: , + variant: 'outlined', +}; +export const Ghost = Template.bind({}); + +Ghost.args = { + icon: , + variant: 'ghost', +}; diff --git a/src/src/stories/Input.stories.tsx b/src/src/stories/Input.stories.tsx new file mode 100644 index 00000000..af50e575 --- /dev/null +++ b/src/src/stories/Input.stories.tsx @@ -0,0 +1,69 @@ +import { useFormik } from 'formik'; +import * as yup from 'yup'; + +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { IconSearch } from '@tabler/icons-react'; + +import Input from 'components/kit_v2/Input'; + +export default { + title: 'Kit/Inputs/Input', + component: Input, + argTypes: { + inputSize: { + control: 'select', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => { + const formik = useFormik({ + initialValues: { name: 'name' }, + onSubmit: () => {}, + validationSchema: yup.object({ + name: yup + .string() + .required('Required field') + .max(50, 'Must be 50 characters or fewer'), + comment: yup.string().max(100, 'Must be 100 characters or fewer'), + }), + }); + const { values, errors, setFieldValue } = formik; + + const { name } = values; + + function onChange(e: any) { + const { name, value } = e.target; + setFieldValue(name, value); + } + + return ( + + ); +}; + +export const Medium = Template.bind({}); + +Medium.args = { + inputSize: 'md', + value: 'Default Input', + leftIcon: , +}; +export const Large = Template.bind({}); + +Large.args = { + inputSize: 'lg', + value: 'Large Input', +}; +export const XLarge = Template.bind({}); + +XLarge.args = { + inputSize: 'xl', + value: 'xLarge Input', +}; diff --git a/src/src/stories/ListItem.stories.tsx b/src/src/stories/ListItem.stories.tsx new file mode 100644 index 00000000..2263e8ce --- /dev/null +++ b/src/src/stories/ListItem.stories.tsx @@ -0,0 +1,56 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import { Icon } from 'components/kit'; +import ListItemComponent from 'components/kit_v2/ListItem'; + +export default { + title: 'Kit/Data Display/ListItem', + component: ListItemComponent, + argTypes: { + size: { + control: 'select', + }, + }, +} as ComponentMeta; + +const IconNode = ( + +); +const Template1: ComponentStory = (args) => ( + List Item +); + +export const Default = Template1.bind({}); + +Default.args = { + size: 'md', +}; + +const Template2: ComponentStory = (args) => ( + + List Item + +); + +export const WithLeftNode = Template2.bind({ + size: 'lg', +}); + +const Template3: ComponentStory = (args) => ( + + List Item + +); + +export const WithRightNode = Template3.bind({ + size: 'xl', +}); diff --git a/src/src/stories/QueryBadge.stories.tsx b/src/src/stories/QueryBadge.stories.tsx new file mode 100644 index 00000000..4ac08c0c --- /dev/null +++ b/src/src/stories/QueryBadge.stories.tsx @@ -0,0 +1,26 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import QueryBadgeComponent from 'components/kit_v2/QueryBadge'; + +export default { + title: 'Kit/Inputs/QueryBadge', + component: QueryBadgeComponent, + argTypes: { + color: { + control: 'select', + }, + size: { + control: 'select', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const QueryBadge = Template.bind({}); + +QueryBadge.args = { + children: 'Contained Button', +}; diff --git a/src/src/stories/Radio.stories.tsx b/src/src/stories/Radio.stories.tsx new file mode 100644 index 00000000..2c86f3a0 --- /dev/null +++ b/src/src/stories/Radio.stories.tsx @@ -0,0 +1,76 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import { Text } from 'components/kit_v2'; +import RadioComponent, { + RadioGroup as Group, +} from 'components/kit_v2/Radio/Radio'; + +export default { + title: 'Kit/Inputs', + component: RadioComponent, + argTypes: { + name: { + control: { + type: 'text', + }, + description: + 'The name of the group. Submitted with its owning form as part of a name/value pair.', + }, + defaultValue: { + control: { + type: 'select', + options: ['1', '2'], + }, + description: + 'The value of the radio item that should be checked when initially rendered. Use when you do not need to control the state of the radio items.', + }, + value: { + control: { + type: 'select', + options: ['1', '2'], + }, + description: + 'The controlled value of the radio item to check. Should be used in conjunction with `onValueChange`.', + }, + disabled: { + control: { + type: 'boolean', + }, + description: 'Disables the radio group', + }, + onValueChange: { + control: { + type: 'text', + }, + description: 'Event handler called when the value changes.', + }, + dir: { + control: { + type: 'select', + options: ['ltr', 'rtl'], + }, + description: + 'The reading direction of the radio group. If omitted, inherits globally from `DirectionProvider` or assumes LTR (left-to-right) reading mode.', + }, + orientation: { + control: { + type: 'select', + options: ['horizontal', 'vertical'], + }, + description: 'The orientation of the component.', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + + + First + + + Second + + +); + +export const RadioGroup = Template.bind({}); diff --git a/src/src/stories/Select.stories.tsx b/src/src/stories/Select.stories.tsx new file mode 100644 index 00000000..2ab12f65 --- /dev/null +++ b/src/src/stories/Select.stories.tsx @@ -0,0 +1,113 @@ +import React from 'react'; + +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import SelectComponent from 'components/kit_v2/Select/Select'; +import Button from 'components/kit_v2/Button'; + +export default { + title: 'Kit/Inputs', + component: SelectComponent, + argTypes: {}, +} as ComponentMeta; + +const Template: ComponentStory = (args) => { + const [multipleValues, setMultipleValues] = React.useState([]); + const [singleValue, setSingleValue] = React.useState(''); + + const handleChange = (val: string) => { + if (args.multiple) { + if (multipleValues.indexOf(val) === -1) { + setMultipleValues([...multipleValues, val]); + } else { + const filteredValues = multipleValues.filter((v) => v !== val); + setMultipleValues(filteredValues); + } + } + setSingleValue(val); + }; + + return ( + Open Select} + /> + ); +}; + +export const Select = Template.bind({}); + +Select.args = { + multiple: true, + searchable: true, + options: [ + { + group: 'Group 1', + options: [ + { label: 'Option 1', value: 'option-1' }, + { + label: 'Option 2', + value: 'option-2', + }, + { + label: 'Option 3', + value: 'option-3', + }, + { + label: 'Option 4', + value: 'option-4', + }, + { + label: 'Option 5', + value: 'option-5', + }, + { label: 'Option 6', value: 'option-6' }, + { label: 'Option 7', value: 'option-7' }, + ], + }, + { + group: 'Group 2', + options: [ + { label: 'Option 1', value: 'option2-1' }, + { + label: 'Option 2', + value: 'option2-2', + }, + { + label: 'Option 3', + value: 'option2-3', + }, + ], + }, + { + group: 'Group 3', + options: [ + { label: 'Option 1', value: 'option3-1' }, + { + label: 'Option 2', + value: 'option3-2', + }, + { + label: 'Option 3', + value: 'option3-3', + }, + ], + }, + { + group: 'Group 4', + options: [ + { label: 'Option 1', value: 'option4-1' }, + { + label: 'Option 2', + value: 'option4-2', + }, + { + label: 'Option 3', + value: 'option4-3', + }, + ], + }, + ], +}; diff --git a/src/src/stories/Separator.stories.tsx b/src/src/stories/Separator.stories.tsx new file mode 100644 index 00000000..36064a4c --- /dev/null +++ b/src/src/stories/Separator.stories.tsx @@ -0,0 +1,52 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import SeparatorComponent from 'components/kit_v2/Separator'; +import Box from 'components/kit_v2/Box'; +import Text from 'components/kit_v2/Text'; + +import { config } from 'config/stitches'; + +export default { + title: 'Kit/Data Display/Separator', + component: SeparatorComponent, + argTypes: { + color: { + control: 'select', + options: Object.keys((config.theme as { colors: {} }).colors).map( + (key) => `$${key}`, + ), + }, + orientation: { + control: 'select', + options: ['horizontal', 'vertical'], + }, + margin: { + control: 'select', + options: Object.keys((config.theme as { space: {} }).space).map( + (key) => `$${key}`, + ), + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + + Aim Ui + + {args.orientation} separator + +); + +export const Horizontal = Template.bind({}); + +Horizontal.args = { + orientation: 'horizontal', + margin: '$4', +}; + +export const Vertical = Template.bind({}); + +Vertical.args = { + orientation: 'vertical', + margin: '$4', +}; diff --git a/src/src/stories/Slider.stories.tsx b/src/src/stories/Slider.stories.tsx new file mode 100644 index 00000000..ffeb62bc --- /dev/null +++ b/src/src/stories/Slider.stories.tsx @@ -0,0 +1,31 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import SliderComponent from 'components/kit_v2/Slider'; + +export default { + title: 'Kit/Inputs', + component: SliderComponent, + argTypes: {}, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Slider = Template.bind({}); + +Slider.args = {}; diff --git a/src/src/stories/Switch.stories.tsx b/src/src/stories/Switch.stories.tsx new file mode 100644 index 00000000..231cae6f --- /dev/null +++ b/src/src/stories/Switch.stories.tsx @@ -0,0 +1,21 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import SwitchComponent from 'components/kit_v2/Switch'; + +export default { + title: 'Kit/Inputs', + component: SwitchComponent, + argTypes: { + size: { + control: 'select', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Switch = Template.bind({}); + +Switch.args = {}; diff --git a/src/src/stories/Text.stories.tsx b/src/src/stories/Text.stories.tsx new file mode 100644 index 00000000..9eda4528 --- /dev/null +++ b/src/src/stories/Text.stories.tsx @@ -0,0 +1,43 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import TextComponent from 'components/kit_v2/Text'; + +import { config } from 'config/stitches'; + +export default { + title: 'Kit/Typography', + component: TextComponent, + argTypes: { + weight: { + control: 'select', + options: Object.keys( + (config.theme as { fontWeights: {} }).fontWeights, + ).map((key) => `$${key}`), + }, + size: { + control: 'select', + options: Object.keys((config.theme as { fontSizes: {} }).fontSizes).map( + (key) => `$${key}`, + ), + }, + color: { + control: 'select', + options: Object.keys((config.theme as { colors: {} }).colors).map( + (key) => `$${key}`, + ), + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Text = Template.bind({}); + +Text.args = { + children: 'Polymorphic Text component', + weight: '$2', + size: '$3', + color: '$textPrimary', +}; diff --git a/src/src/stories/Toast.stories.tsx b/src/src/stories/Toast.stories.tsx new file mode 100644 index 00000000..2f6a7e86 --- /dev/null +++ b/src/src/stories/Toast.stories.tsx @@ -0,0 +1,88 @@ +import React from 'react'; + +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { IconCheck } from '@tabler/icons-react'; + +import { + Toast as ToastComponent, + ToastProvider, +} from 'components/kit_v2/Toast'; +import Button from 'components/kit_v2/Button'; +import { IToastProps } from 'components/kit_v2/Toast/Toast.d'; + +export default { + title: 'Kit/Feedback', + component: ToastComponent, + argTypes: { + placement: { + control: 'radio', + options: ['topLeft', 'topRight', 'bottomLeft', 'bottomRight'], + }, + id: { + control: 'text', + }, + swipeDirection: { + control: 'radio', + options: ['left', 'right', 'up', 'down'], + }, + duration: { + control: 'number', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args: any) => { + const [notifications, setNotifications] = React.useState([]); + + function onAddToast() { + const id = Math.random().toString(36).substr(2, 9); + const notification = { + id, + icon: , + message: + args.message || + 'Aim is an open-source, self-hosted ML experiment tracking tool', + onDelete: () => { + setNotifications((notifications) => + notifications.filter((n) => n.id !== id), + ); + }, + onUndo: () => { + setNotifications((notifications) => + notifications.filter((n) => n.id !== id), + ); + }, + }; + setNotifications((list) => [...list, notification]); + } + + return ( +
+ + + {notifications.map((notification) => ( + { + if (!open && notification.onDelete) { + notification.onDelete(notification.id)!; + } + }} + {...notification} + /> + ))} + +
+ ); +}; + +export const Toast = Template.bind({}); + +Toast.args = { + duration: 5000, +}; diff --git a/src/src/stories/ToggleButton.stories.tsx b/src/src/stories/ToggleButton.stories.tsx new file mode 100644 index 00000000..1d9ee9f3 --- /dev/null +++ b/src/src/stories/ToggleButton.stories.tsx @@ -0,0 +1,23 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import ToggleComponent from 'components/kit_v2/ToggleButton'; + +export default { + title: 'Kit/Inputs', + component: ToggleComponent, + argTypes: {}, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const ToggleButton = Template.bind({}); + +ToggleButton.args = { + leftLabel: 'Left', + rightLabel: 'Right', + rightValue: 'right', + leftValue: 'left', + value: 'left', +}; diff --git a/src/src/stories/Tooltip.stories.tsx b/src/src/stories/Tooltip.stories.tsx new file mode 100644 index 00000000..dcbf10cf --- /dev/null +++ b/src/src/stories/Tooltip.stories.tsx @@ -0,0 +1,22 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import Button from 'components/kit_v2/Button'; +import TooltipComponent from 'components/kit_v2/Tooltip'; + +export default { + title: 'Kit/Data Display', + component: TooltipComponent, + argTypes: {}, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + + + +); + +export const Tooltip = Template.bind({}); + +Tooltip.args = { + content: 'Tooltip', +}; diff --git a/src/src/stories/Tree.stories.tsx b/src/src/stories/Tree.stories.tsx new file mode 100644 index 00000000..9032e3f0 --- /dev/null +++ b/src/src/stories/Tree.stories.tsx @@ -0,0 +1,64 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import Button from 'components/kit_v2/Button'; +import Popover from 'components/kit_v2/Popover'; +import TreeComponent from 'components/kit_v2/Tree'; + +export default { + title: 'Kit/Inputs', + component: TreeComponent, + argTypes: {}, +} as ComponentMeta; + +const treeData: any = [ + { + title: 0-0, + key: '0-0', + children: [ + { + title: '0-0-0', + key: '0-0-0', + children: [ + { title: '0-0-0-0', key: '0-0-0-0' }, + { title: '0-0-0-1', key: '0-0-0-1' }, + { title: '0-0-0-2', key: '0-0-0-2' }, + ], + }, + { + title: '0-0-1', + key: '0-0-1', + children: [ + { title: '0-0-1-0', key: '0-0-1-0' }, + { title: '0-0-1-1', key: '0-0-1-1' }, + { title: '0-0-1-2', key: '0-0-1-2' }, + ], + }, + { + title: '0-0-2', + key: '0-0-2', + }, + ], + }, + { + title: '0-1', + key: '0-1', + children: [ + { title: '0-1-0-0', key: '0-1-0-0' }, + { title: '0-1-0-1', key: '0-1-0-1' }, + { title: '0-1-0-2', key: '0-1-0-2' }, + ], + }, + { + title: '0-2', + key: '0-2', + }, +]; + +const Template: ComponentStory = (args: any) => ( + Open the Tree} + content={} + /> +); + +export const Tree = Template.bind({}); diff --git a/src/src/styles/_global.scss b/src/src/styles/_global.scss new file mode 100644 index 00000000..29959f9a --- /dev/null +++ b/src/src/styles/_global.scss @@ -0,0 +1,44 @@ +@use 'src/styles/abstracts' as *; +@import './utils'; + +.ScrollBar__hidden { + --ms-overflow-style: none; + --scrollbar-width: none; + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } +} + +.SelectForm__Popper { + z-index: 6; +} + +.container { + position: relative; + margin: 0 auto; + padding-right: 1rem; + padding-left: 1rem; + width: 100%; + height: 100%; + + @include mq(sm) { + max-width: $col-sm; + } + + @include mq(md) { + max-width: $col-md; + } + + @include mq(lg) { + max-width: $col-lg; + } + + @include mq(xl) { + max-width: $col-xl; + } + + @include mq(xxl) { + max-width: $col-xxl; + } +} diff --git a/src/src/styles/_utils.scss b/src/src/styles/_utils.scss new file mode 100644 index 00000000..2eff97a4 --- /dev/null +++ b/src/src/styles/_utils.scss @@ -0,0 +1,125 @@ +/** + * Common styles + */ +.flex { + display: flex; +} + +.iflex { + display: inline-flex; +} +.m0a { + margin: 0 auto; +} +.fac { + display: flex; + align-items: center; +} + +.fae { + align-items: flex-end; +} +.fjse { + display: flex; + justify-content: space-evenly; +} +.fjb { + display: flex; + justify-content: space-between; +} + +.fja { + justify-content: space-around; +} + +.fjc { + justify-content: center; +} + +.fdc { + display: flex; + flex-direction: column; +} + +.fwrap { + flex-wrap: wrap; +} +.fje { + justify-content: flex-end; +} +.fdr { + flex-direction: row; +} +.fdr-reverse { + flex-direction: row-reverse; +} + +.fdr-reverse { + flex-direction: column-reverse; +} + +.ttu { + text-transform: uppercase; +} + +.tac { + text-align: center; +} + +.taj { + text-align: justify; +} + +.tar { + text-align: right; +} + +.tal { + text-align: left; +} + +.posrel { + position: relative; +} + +.posabs { + position: absolute; +} + +.trans { + transition: all 0.3s; +} + +.transparent { + opacity: 0; +} + +.hidden { + display: none; +} + +.nodrag { + pointer-events: none; +} + +.c-pointer { + cursor: pointer; +} + +.h-full { + height: 100%; +} + +.raw-center { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} + +.col-center { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} diff --git a/src/src/styles/abstracts/_functions.scss b/src/src/styles/abstracts/_functions.scss new file mode 100644 index 00000000..eeb4d61b --- /dev/null +++ b/src/src/styles/abstracts/_functions.scss @@ -0,0 +1,35 @@ +@use "sass:math"; + +@function tint($color, $percentage) { + @return mix(transparent, $color, $percentage); +} + +@function shade($color, $percentage) { + @return mix(black, $color, $percentage); +} + +@function toRem($px) { + @return #{math.div($px, 16px)}rem; +} + +@function rgba-to-rgb($rgba, $opacity: 0, $background: #fff) { + @if $opacity > 0 { + @if $opacity < 1 { + $opacity: $opacity * 100; + } + @return mix( + mix( + rgb(red($rgba), green($rgba), blue($rgba)), + $background, + alpha($rgba) * 100% + ), + rgb(255, 255, 255), + $opacity + ); + } + @return mix( + rgb(red($rgba), green($rgba), blue($rgba)), + $background, + alpha($rgba) * 100% + ); +} diff --git a/src/src/styles/abstracts/_index.scss b/src/src/styles/abstracts/_index.scss new file mode 100644 index 00000000..4323594d --- /dev/null +++ b/src/src/styles/abstracts/_index.scss @@ -0,0 +1,3 @@ +@forward "./variables"; +@forward "./functions"; +@forward './mixins'; diff --git a/src/src/styles/abstracts/_mixins.scss b/src/src/styles/abstracts/_mixins.scss new file mode 100644 index 00000000..a5a5c1f7 --- /dev/null +++ b/src/src/styles/abstracts/_mixins.scss @@ -0,0 +1,21 @@ +@use './variables' as *; + +@mixin mq($breakpoint) { + @if map-has-key($breakpoints, $breakpoint) { + @media (min-width: #{map-get($breakpoints, $breakpoint)}) { + @content; + } + } +} + +@mixin backgroundColorOpacity($color, $opacity: 0.1) { + background-color: rgba($color, $opacity); +} + +@mixin monospaceFontFamily($font-size: 16) { + $min-font-width: 114; + $font-size-unit-width: 2; + font-family: 'Inconsolata', monospace; + font-variation-settings: 'wdth' $min-font-width - + ($font-size * $font-size-unit-width); +} diff --git a/src/src/styles/abstracts/_variables.scss b/src/src/styles/abstracts/_variables.scss new file mode 100644 index 00000000..458b4cac --- /dev/null +++ b/src/src/styles/abstracts/_variables.scss @@ -0,0 +1,172 @@ +@use "./functions" as *; + +$primary-color: #1473e6; +$error-color: #e64e48; +$success-color: #2bc784; +$warning-color: #ffcc00; +// colors +$blue: #4b9bff; +$orange: #ffb46e; +$red: #ff5f5f; +$teal: #50d2a0; +$pink: #ff73c3; +$green: #9be169; +$purple: #af78ff; +$yellow: #ffd76e; +$cyan: #5fc8ff; +$indigo: #7785ff; +$white: #ffffff; +$pico: #1c2852; +$grayish: #dee6f3; +$cuddle: #bdcee8; +$denim: $primary-color; +$black: #000000; +$transparent: transparent; + +$grey: #586069; + +$grey-darker: #24292e; +$grey-bg: #f7f7f7; +$grey-lighter: #e8e8e8; +$grey-light-xx: #d4d4d4; +$primary-dark: #243969; +$primary-darker: #142447; +$primary-bg: #f7faff; +$primary-lighter: #dfe6f7; +$primary-light: #7a94cc; + +// tinted colors +$primary-color-110: #1266cc; +$primary-color-90: #2c81e9; +$primary-color-80: #438feb; +$primary-color-70: #5b9dee; +$primary-color-60: #72abf0; +$primary-color-50: #89b9f2; +$primary-color-40: #a1c7f5; +$primary-color-30: #d0e3fa; +$primary-color-25: #c4dcf9; +$primary-color-20: #dceafb; +$primary-color-10: #e8f1fc; +$primary-color-5: #f3f8fe; + +$pico-100: #1c2852; +$pico-90: #2a355a; +$pico-80: #414b6d; +$pico-70: #606986; +$pico-60: #6b728b; +$pico-50: #83899e; +$pico-40: #a4a9ba; +$pico-30: #b5b9c5; +$pico-20: #d2d4dc; +$pico-10: #e8eaee; +$pico-5: #f4f4f6; +$pico-2: #fafafb; + +$cuddle-110: #90afda; +$cuddle-70: #d1ddef; +$cuddle-50: #dee6f3; +$cuddle-30: #ebf0f8; +$cuddle-20: #f2f5fa; +$cuddle-10: #f8fafd; + +$mark-color: #fffac1; + +$warning-color-80: #edc949; +$warning-color-50: #f4dd8d; +$warning-color-25: #fff2bf; +$warning-color-10: #fffae6; +$warning-color-5: #f7f7f3; + +$success-color-100: #2bc784; +$success-color-80: #55d29d; +$success-color-50: #95e3c2; +$success-color-25: #caf1e0; +$success-color-10: #eaf9f3; +$success-color-5: #eef7f8; + +$error-color-80: #eb716d; +$error-color-50: #f3a7a4; +$error-color-25: #f9d3d1; +$error-color-10: #fdeded; +$error-color-5: #f7f1f5; + +// border +$border-width-main: 0.0625rem solid; +$border-color-main: $primary-color-10; +$border-main: $border-width-main $border-color-main; +$border-separator: $border-width-main $primary-color-20; +$border-main-darker: $border-width-main $primary-color-40; +$border-main-active: $border-width-main $primary-color-50; +$border-grey: $border-width-main $cuddle-50; +$border-grey-light: $border-width-main $cuddle-30; +$border-grey-lighter: $border-width-main $cuddle-20; +$border-transparent: $border-width-main $transparent; +$border-dark: $border-width-main $pico-30; +$border-dark-lighter: $border-width-main $pico-20; +$border-radius-main: 0.375rem; +$radius-main: 0.375rem; + +$border-radius-xss: 0.125rem; +$border-radius-xs: 0.1875rem; +$border-radius-sm: 0.25rem; +$border-radius-md: 0.375rem; +$border-radius-lg: 0.5rem; +$border-radius-xl: 1rem; +$border-radius-circle: 50%; +// text +$text-color: $pico-80; +$text-color-50: $pico-50; +$text-xxxs: 0.5rem; +$text-xxs: 0.625rem; +$text-xs: 0.6875rem; +$text-sm: 0.75rem; +$text-md: 0.875rem; +$text-lg: 1rem; +$text-xl: 1.125rem; +$text-xxl: 1.5rem; +$text-xxxl: 2.25rem; +$xs: 23.5em; // 376px @media (max-width: $xs) {} +$sm: 36em; // (min-width: 576px) +$md: 48em; // (min-width: 768px) +$lg: 62em; // (min-width: 992px) +$gl: 64em; //! gap `lg - xl` (min-width: 1024px) +$xl: 75em; // (min-width: 1200px) +$xxl: 80em; // (min-width: 1280px) + +// font weight + +$font-300: 250; +$font-400: 350; +$font-500: 450; +$font-600: 550; +$font-700: 650; +$font-800: 750; +$font-900: 850; + +// space +$space-unit: 1rem; +$space-xxxxxs: $space-unit * 0.0625; +$space-xxxxs: $space-unit * 0.125; +$space-xxxs: $space-unit * 0.25; +$space-xxs: $space-unit * 0.375; +$space-xs: $space-unit * 0.5; +$space-sm: $space-unit * 0.75; +$space-md: $space-unit * 1.25; +$space-lg: $space-unit * 1.5; +// - to container +$col-sm: 540px; // (max-width: 540px) +$col-md: 720px; // (max-width: 720px) +$col-lg: 960px; // (max-width: 960px) +$col-xl: 1140px; // (max-width: 1140px) +$col-xxl: 1420px; // (max-width: 1420px) +$breakpoints: ( + sm: $sm, + md: $md, + lg: $lg, + xl: $xl, + xxl: $xxl, +); +$run-overview-sidebar-width: 20rem; +$container-max-width-without-paddings: 86.75rem; +$tooltip-max-height: 18.75rem; +$popover-opening-duration: 0.18s; diff --git a/src/src/styles/base/_reset.scss b/src/src/styles/base/_reset.scss new file mode 100644 index 00000000..ca5f828d --- /dev/null +++ b/src/src/styles/base/_reset.scss @@ -0,0 +1,25 @@ +@use 'src/styles/abstracts' as *; + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} +html { + height: 100%; + position: relative; + display: table; + width: 100%; +} +body { + font-size: 1em; + font-family: 'Inter', sans-serif; + font-weight: $font-500; + color: $text-color; + height: 100%; + max-width: 100vw; + overflow: hidden; +} +#root { + height: 100%; +} diff --git a/src/src/styles/components/_autocomplete.scss b/src/src/styles/components/_autocomplete.scss new file mode 100644 index 00000000..44f3661b --- /dev/null +++ b/src/src/styles/components/_autocomplete.scss @@ -0,0 +1,29 @@ +@use 'src/styles/abstracts' as *; + +.MuiAutocomplete-popperDisablePortal { + position: initial !important; +} + +.MuiAutocomplete-listbox { + .MuiAutocomplete-groupUl .MuiAutocomplete-option { + padding: 0.625rem 1rem; + + .MuiCheckbox-root { + padding: 0; + } + + .QueryForm__option, + .SelectForm__option, + .Metrics__SelectForm__option { + display: flex; + width: 100%; + overflow: hidden; + &__label { + margin-left: $space-xs; + max-width: 100%; + overflow: hidden; + word-break: break-all; + } + } + } +} diff --git a/src/src/styles/components/_inputs.scss b/src/src/styles/components/_inputs.scss new file mode 100644 index 00000000..87493792 --- /dev/null +++ b/src/src/styles/components/_inputs.scss @@ -0,0 +1,189 @@ +@use 'src/styles/abstracts' as *; + +body { + .MuiOutlinedInput-root { + border-radius: $border-radius-main; + &:hover { + .MuiOutlinedInput-notchedOutline { + border-color: $cuddle-110; + } + } + + .MuiOutlinedInput-notchedOutline { + border-color: $cuddle; + border-width: 0.0625rem !important; + } + } + + .Mui-disabled { + color: $text-color-50 !important; + .MuiOutlinedInput-notchedOutline { + border-color: $cuddle-70 !important; + } + } + .Mui-focused { + .MuiOutlinedInput-notchedOutline { + border-color: $cuddle-110 !important; + } + } +} + +.TextField { + .MuiOutlinedInput-notchedOutline { + border: 0.0625rem solid $cuddle-70 !important; + } + + &__OutLined { + &__Small { + .MuiInputLabel-outlined.MuiInputLabel-marginDense { + font-weight: $font-500; + font-size: $text-md; + color: $text-color; + transform: translate(14px, 8px) scale(1); + } + + .MuiInputLabel-outlined.MuiInputLabel-shrink { + transform: translate(14px, -6px) scale(0.75); + color: $primary-color; + } + + .MuiInputBase-root { + .MuiInputBase-input { + font-weight: $font-500; + font-size: $text-md; + color: $text-color; + padding: 0.375rem 1rem; + height: 1rem; + } + + .MuiOutlinedInput-notchedOutline { + border-color: #bdcee8; + } + + .PrivateNotchedOutline-legendLabelled-13 { + span { + padding-right: 0; + } + } + } + } + &__Medium { + .MuiInputLabel-outlined.MuiInputLabel-marginDense { + font-weight: $font-500; + font-size: $text-md; + color: $pico-50; + transform: translate(14px, 8px) scale(1); + } + + .MuiInputLabel-outlined.MuiInputLabel-shrink { + transform: translate(14px, -6px) scale(0.75); + color: $pico-80; + &.Mui-error { + color: #f44336 !important; + } + } + + .MuiInputBase-root { + &.Mui-error .MuiOutlinedInput-notchedOutline { + border-color: #f44336 !important; + } + .MuiInputBase-input { + font-weight: $font-500; + font-size: $text-md; + color: $text-color; + padding: 0.375rem 1rem; + height: 1.25rem; + } + + .MuiOutlinedInput-notchedOutline { + border-color: #bdcee8; + } + + .PrivateNotchedOutline-legendLabelled-13 { + span { + padding-right: 0; + } + } + } + } + &__Large { + .MuiInputBase-root { + .MuiInputBase-input { + font-weight: $font-500; + font-size: $text-md; + color: $text-color; + padding: 0.5625rem 1rem 0.625rem; + height: 1rem; + } + + .MuiOutlinedInput-notchedOutline { + border-color: #bdcee8; + } + + .PrivateNotchedOutline-legendLabelled-13 { + span { + padding-right: 0; + } + } + } + } + } + + &__TextArea { + &__OutLined { + &__Small { + min-height: 56px; + .MuiOutlinedInput-root.Mui-error .MuiOutlinedInput-notchedOutline { + border-color: #f44336 !important; + } + .MuiOutlinedInput-multiline { + padding: 10px 1em; + overflow: hidden; + height: 56px; + + .MuiOutlinedInput-inputMultiline { + height: 36px !important; + overflow-y: scroll !important; + } + } + + .MuiInputLabel-outlined { + transform: translate(14px, 14px) scale(1); + &.MuiInputLabel-shrink { + transform: translate(14px, -6px) scale(0.75); + font-size: $text-md; + color: $pico-80; + font-weight: $font-500; + } + } + + .MuiFormLabel-root { + color: $pico-50; + font-weight: $font-500; + font-size: $text-md; + &.Mui-error { + color: #f44336; + } + } + + .MuiInputBase-root { + .MuiInputBase-input { + font-weight: $font-500; + font-size: $text-md; + color: $text-color; + } + + .MuiOutlinedInput-notchedOutline { + border-color: #bdcee8; + } + + .PrivateNotchedOutline-legendLabelled-13 { + span { + padding-right: 0; + } + } + } + } + } + } +} diff --git a/src/src/styles/components/_tooltip.scss b/src/src/styles/components/_tooltip.scss new file mode 100644 index 00000000..720d27a1 --- /dev/null +++ b/src/src/styles/components/_tooltip.scss @@ -0,0 +1,16 @@ +@use 'src/styles/abstracts' as *; + +.MuiTooltip-tooltip { + max-height: $tooltip-max-height; + overflow: hidden; +} + +.MuiTooltip-tooltipPlacementTop, +.MuiTooltip-tooltipPlacementBottom { + margin: 6px 0; +} + +.MuiTooltip-tooltipPlacementLeft, +.MuiTooltip-tooltipPlacementRight { + margin: 0 6px; +} diff --git a/src/src/tests/hooks/model/createModel.test.ts b/src/src/tests/hooks/model/createModel.test.ts new file mode 100644 index 00000000..ea824dc6 --- /dev/null +++ b/src/src/tests/hooks/model/createModel.test.ts @@ -0,0 +1,60 @@ +import createModel from 'services/models/model'; + +import { shouldMatchObject } from 'tests/utils'; + +const initialState = { + test: { + hello: 'hello', + }, +}; + +describe('[function createModel]', () => { + test('should create model correctly width empty state', () => { + const model = createModel({}); + shouldMatchObject(model.getState(), {}); + }); + + test('should create model correctly width state', () => { + const model = createModel(initialState); + shouldMatchObject(model.getState(), initialState); + }); +}); + +describe("[model's methods]", () => { + let model: any; + beforeEach(() => { + model = createModel(initialState); + }); + + test('[setState method] should work properly', () => { + model.setState({ test: 'test' }); + shouldMatchObject({ test: 'test' }, model.getState()); + }); + + test('[subscribe/unsubscribe methods] should work properly', () => { + const mockSubscriber = jest.fn((res) => res); + const { unsubscribe } = model.subscribe('UPDATE', mockSubscriber); + + model.setState({ test: 'test' }); + expect(mockSubscriber).toHaveBeenCalledTimes(1); + + model.setState({ test: 'test2' }); + expect(mockSubscriber).toHaveBeenCalledTimes(2); + + unsubscribe(); + model.setState({ test: 'test3' }); + expect(mockSubscriber).not.toHaveBeenCalledTimes(3); + }); + + test('[destroy method] should re-init the state and remove subscriptions', () => { + const mockSubscriber = jest.fn((res) => res); + model.setState({ empty: true }); + model.subscribe('UPDATE', mockSubscriber); + + model.destroy(); + shouldMatchObject(initialState, model.getState()); + + model.setState({}); + expect(mockSubscriber).not.toHaveBeenCalled(); + }); +}); diff --git a/src/src/tests/hooks/model/useModel.test.ts b/src/src/tests/hooks/model/useModel.test.ts new file mode 100644 index 00000000..a6fb39d3 --- /dev/null +++ b/src/src/tests/hooks/model/useModel.test.ts @@ -0,0 +1,36 @@ +import { renderHook, act } from '@testing-library/react-hooks'; + +import useModel from 'hooks/useModel'; + +import createModel from 'services/models/model'; + +import { shouldMatchObject } from 'tests/utils'; + +import { IModel } from 'types/services/models/model'; + +const initialState = { forHook: true }; +let model: IModel; +beforeAll(() => { + model = createModel(initialState); +}); + +describe('[useModel]', () => { + test('state create/update works properly', () => { + const { result } = renderHook(() => useModel(model)); + act(() => { + model.setState({ test: 'test2' }); + }); + + shouldMatchObject({ ...initialState, test: 'test2' }, result.current); + }); + + test('should re-init the model once unmounting', () => { + const { result, unmount } = renderHook(() => useModel(model)); + act(() => { + model.setState({ test: 'test2' }); + unmount(); + }); + + shouldMatchObject(initialState, result.current); + }); +}); diff --git a/src/src/tests/utils/app/getFilteredSystemMetrics.test.ts b/src/src/tests/utils/app/getFilteredSystemMetrics.test.ts new file mode 100644 index 00000000..5a5ec5a0 --- /dev/null +++ b/src/src/tests/utils/app/getFilteredSystemMetrics.test.ts @@ -0,0 +1,54 @@ +import { toEqual } from 'tests/utils'; + +import getFilteredSystemMetrics from 'utils/app/getFilteredSystemMetrics'; + +describe('[Filter and get system metrics from table columns data]', () => { + it('correctly filtering and returning system metrics keys array', () => { + let columns = [ + 'Loss_type="mel_loss"', + 'Loss_type="duration_loss"', + '__system__cpu', + '__system__disk_percent', + '__system__p_memory_percent', + 'preprocess_config.dataset', + ]; + toEqual(getFilteredSystemMetrics(columns), [ + '__system__cpu', + '__system__disk_percent', + '__system__p_memory_percent', + ]); + }); + + it('correctly filtering and returning empty array', () => { + let columns = [ + 'train_config.path.result_path', + 'train_config.step.save_step', + 'train_config.step.synth_step', + ]; + toEqual(getFilteredSystemMetrics(columns), []); + }); + + it('correctly filtering and returning array without system metrics', () => { + let columns = [ + 'train_config.path.result_path', + 'train_config.step.save_step', + 'train_config.step.synth_step', + '__system__cpu', + '__system__disk_percent', + '__system__p_memory_percent', + ]; + toEqual(getFilteredSystemMetrics(columns, true), [ + 'train_config.path.result_path', + 'train_config.step.save_step', + 'train_config.step.synth_step', + ]); + }); + it('correctly filtering and returning empty array', () => { + let columns = [ + '__system__cpu', + '__system__disk_percent', + '__system__p_memory_percent', + ]; + toEqual(getFilteredSystemMetrics(columns, true), []); + }); +}); diff --git a/src/src/tests/utils/app/getSystemMetricsFromColumns.test.ts b/src/src/tests/utils/app/getSystemMetricsFromColumns.test.ts new file mode 100644 index 00000000..e4e2747c --- /dev/null +++ b/src/src/tests/utils/app/getSystemMetricsFromColumns.test.ts @@ -0,0 +1,148 @@ +import { toEqual } from 'tests/utils'; + +import getSystemMetricsFromColumns from 'utils/app/getSystemMetricsFromColumns'; + +describe('[Filter and get system metrics from table columns data]', () => { + it('correctly filtering and returning system metrics keys array', () => { + let columns = [ + { + key: 'Loss_type="mel_loss"', + content: { + key: null, + ref: null, + props: { + size: 'small', + color: '#3E72E7', + label: 'type="mel_loss"', + }, + }, + topHeader: 'Loss', + pin: null, + isHidden: false, + }, + { + key: 'Loss_type="duration_loss"', + content: { + key: null, + ref: null, + props: { + size: 'small', + color: '#3E72E7', + label: 'type="duration_loss"', + }, + }, + topHeader: 'Loss', + pin: null, + isHidden: false, + }, + { + key: '__system__cpu', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'CPU (%)', + }, + }, + topHeader: 'System Metrics', + pin: null, + isHidden: true, + }, + { + key: '__system__disk_percent', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'Disk (%)', + }, + }, + topHeader: 'System Metrics', + pin: null, + isHidden: true, + }, + { + key: '__system__p_memory_percent', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'Process Memory (%)', + }, + }, + topHeader: 'System Metrics', + pin: null, + isHidden: true, + }, + { + key: 'preprocess_config.dataset', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'preprocess_config.dataset', + }, + }, + topHeader: 'Params', + pin: null, + isHidden: false, + }, + ]; + toEqual( + ['__system__cpu', '__system__disk_percent', '__system__p_memory_percent'], + getSystemMetricsFromColumns(columns), + ); + }); + + it('correctly filtering and returning empty array', () => { + let columns = [ + { + key: 'train_config.path.result_path', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'train_config.path.result_path', + }, + }, + topHeader: 'Params', + pin: null, + isHidden: false, + }, + { + key: 'train_config.step.save_step', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'train_config.step.save_step', + }, + }, + topHeader: 'Params', + pin: null, + isHidden: false, + }, + { + key: 'train_config.step.synth_step', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'train_config.step.synth_step', + }, + }, + topHeader: 'Params', + pin: null, + isHidden: false, + }, + ]; + toEqual([], getSystemMetricsFromColumns(columns)); + }); +}); diff --git a/src/src/tests/utils/index.ts b/src/src/tests/utils/index.ts new file mode 100644 index 00000000..6118788a --- /dev/null +++ b/src/src/tests/utils/index.ts @@ -0,0 +1,48 @@ +export const shouldMatchObject = (expectedValue: any, actualValue: any) => { + expect(expectedValue).toMatchObject(actualValue); +}; + +/** + * [temp] for react-test-renderer + * @TODO delete this code later, after surely working with react testing library + */ +/* + export const getComponentTree = (Component: ReactComponentElement) => { + const component = renderer.create(Component); + return component.toJSON(); + }; + + + export const checkSnapshot = ( + testCase: string, + Component: ReactComponentElement, + ) => { + test(testCase, () => { + const tree = getComponentTree(Component); + expect(tree).toMatchSnapshot(); + }); + }; +*/ + +export const toEqual = (expectedValue: any, actualValue: any) => { + expect(expectedValue).toEqual(actualValue); +}; + +export const toBeGreaterThan = (expectedValue: any, actualValue: any) => { + expect(expectedValue).toBeGreaterThan(actualValue); +}; + +export const toBeLessThan = (expectedValue: any, actualValue: any) => { + expect(expectedValue).toBeLessThan(actualValue); +}; + +export const toBeGreaterThanOrEqual = ( + expectedValue: any, + actualValue: any, +) => { + expect(expectedValue).toBeGreaterThanOrEqual(actualValue); +}; + +export const toBeLessThanOrEqual = (expectedValue: any, actualValue: any) => { + expect(expectedValue).toBeLessThanOrEqual(actualValue); +}; diff --git a/src/src/types/components/AggregationPopover/AggregationPopover.d.ts b/src/src/types/components/AggregationPopover/AggregationPopover.d.ts new file mode 100644 index 00000000..72982fb3 --- /dev/null +++ b/src/src/types/components/AggregationPopover/AggregationPopover.d.ts @@ -0,0 +1,6 @@ +import { IAggregationConfig } from 'types/services/models/metrics/metricsAppModel'; + +export interface IAggregationPopoverProps { + aggregationConfig: IAggregationConfig; + onChange: (aggregationConfig: Partial) => void; +} diff --git a/src/src/types/components/AppBar/AppBar.d.ts b/src/src/types/components/AppBar/AppBar.d.ts new file mode 100644 index 00000000..8ecbc612 --- /dev/null +++ b/src/src/types/components/AppBar/AppBar.d.ts @@ -0,0 +1,8 @@ +import React from 'react'; + +export interface IAppBarProps { + title: string | ReactNode; + className?: string; + disabled?: boolean; + children?: React.ReactChildren | any; +} diff --git a/src/src/types/components/AttachedTagsList/AttachedTagsList.d.ts b/src/src/types/components/AttachedTagsList/AttachedTagsList.d.ts new file mode 100644 index 00000000..bf91c496 --- /dev/null +++ b/src/src/types/components/AttachedTagsList/AttachedTagsList.d.ts @@ -0,0 +1,14 @@ +import * as React from 'react'; + +import { ITagInfo } from 'types/pages/tags/Tags'; + +export interface IAttachedTagsListProps { + runHash: string; + initialTags?: ITagInfo[]; + tags?: ITagInfo[]; + addTagButtonSize?: 'small' | 'xSmall' | 'xxSmall'; + inlineAttachedTagsList?: boolean; + headerRenderer?: (tagsLength: number) => React.ReactNode; + onTagsChange?: (tags: ITagInfo[]) => void; + onRunsTagsChange?: (runHash: string, tags: ITagInfo[]) => void; +} diff --git a/src/src/types/components/AxesScalePopover/AxesScalePopover.d.ts b/src/src/types/components/AxesScalePopover/AxesScalePopover.d.ts new file mode 100644 index 00000000..b0fa2def --- /dev/null +++ b/src/src/types/components/AxesScalePopover/AxesScalePopover.d.ts @@ -0,0 +1,11 @@ +import { ScaleEnum } from 'utils/d3'; + +export interface IAxesScaleState { + xAxis: ScaleEnum; + yAxis: ScaleEnum; +} + +export interface IAxesScalePopoverProps { + onAxesScaleTypeChange: (params: IAxesScaleState) => void; + axesScaleType: IAxesScaleState; +} diff --git a/src/src/types/components/BookmarkForm/BookmarkForm.d.ts b/src/src/types/components/BookmarkForm/BookmarkForm.d.ts new file mode 100644 index 00000000..28f08417 --- /dev/null +++ b/src/src/types/components/BookmarkForm/BookmarkForm.d.ts @@ -0,0 +1,11 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; +export interface IBookmarkFormProps { + open: boolean; + onClose: () => void; + onBookmarkCreate: IMetricProps['onBookmarkCreate']; +} + +export interface IBookmarkFormState { + name: string; + description: string; +} diff --git a/src/src/types/components/BusyLoaderWrapper/BusyLoaderWrapper.d.ts b/src/src/types/components/BusyLoaderWrapper/BusyLoaderWrapper.d.ts new file mode 100644 index 00000000..05cc3062 --- /dev/null +++ b/src/src/types/components/BusyLoaderWrapper/BusyLoaderWrapper.d.ts @@ -0,0 +1,12 @@ +import React from 'react'; + +export interface IBusyLoaderWrapperProps { + isLoading: boolean; + className?: string; + children?: React.ReactElement | any; + loaderComponent?: React.ReactElement; + loaderType?: string; + loaderConfig?: object; + width?: string; + height?: string; +} diff --git a/src/src/types/components/ChartLoader/ChartLoader.d.ts b/src/src/types/components/ChartLoader/ChartLoader.d.ts new file mode 100644 index 00000000..30094af0 --- /dev/null +++ b/src/src/types/components/ChartLoader/ChartLoader.d.ts @@ -0,0 +1,3 @@ +export interface IChartLoaderProps { + controlsCount?: number; +} diff --git a/src/src/types/components/ChartPanel/ChartPanel.d.ts b/src/src/types/components/ChartPanel/ChartPanel.d.ts new file mode 100644 index 00000000..b43a91c2 --- /dev/null +++ b/src/src/types/components/ChartPanel/ChartPanel.d.ts @@ -0,0 +1,73 @@ +import React from 'react'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { ILine, ILineChartProps } from 'types/components/LineChart/LineChart'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { IProcessedData } from 'types/utils/d3/processLineChartData'; +import { + IAggregationConfig, + ITooltip, + IFocusedState, + IAlignmentConfig, + IChartZoom, + IGroupingSelectOption, + LegendsDataType, + LegendsConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { IHighPlotProps } from 'types/components/HighPlot/HighPlot'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { ChartTypeEnum } from 'utils/d3'; + +export interface IChartPanelProps { + chartType: ChartTypeEnum; + // TODO after line model definition change to HighPlot Line type + data: ILine[][] | any; + legendsData?: LegendsDataType; + panelResizing?: boolean; + focusedState: IFocusedState; + tooltip: ITooltip; + legends?: LegendsConfig; + aggregationConfig?: IAggregationConfig; + alignmentConfig?: IAlignmentConfig; + zoom?: Partial; + chartPanelOffsetHeight?: number; + // chartProps: Omit< + // ILineChartProps | IHighPlotProps, + // 'data' | 'index' | 'syncHoverState' + // >[]; + // TODO need to fix type later + chartProps: any[]; + controls: React.ReactNode; + onZoomChange?: (zoom: Partial) => void; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + onActivePointChange?: ( + activePoint: IActivePoint, + focusedStateActive?: boolean, + ) => void; + onChangeTooltip: (tooltip: ITooltip) => void; + onLegendsChange?: (legends: Partial) => void; + resizeMode?: ResizeModeEnum; + selectOptions: IGroupingSelectOption[]; +} + +export interface IChartPanelRef { + setActiveLineAndCircle?: ( + lineKey?: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => void; + updateLines: (data: IProcessedData[]) => void; +} + +export type IMemoizedForwardRefComponent = React.MemoExoticComponent< + React.ForwardRefExoticComponent> +>; + +export interface IChartTypeConfig { + [key: string]: + | IMemoizedForwardRefComponent + | IMemoizedForwardRefComponent + | IMemoizedForwardRefComponent; +} diff --git a/src/src/types/components/ChartPanel/ChartPopover.d.ts b/src/src/types/components/ChartPanel/ChartPopover.d.ts new file mode 100644 index 00000000..bb452195 --- /dev/null +++ b/src/src/types/components/ChartPanel/ChartPopover.d.ts @@ -0,0 +1,37 @@ +import React from 'react'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { + IAlignmentConfig, + IFocusedState, + ITooltip, + ITooltipContent, +} from 'types/services/models/metrics/metricsAppModel'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { ChartTypeEnum } from 'utils/d3'; + +export interface IChartPopover { + id?: string; + children?: React.ReactNode; + activePointRect: { + top: number; + bottom: number; + left: number; + right: number; + } | null; + open: boolean; + forceOpen?: boolean; + className?: string; + containerNode?: HTMLDivElement | null; + tooltipContent: ITooltipContent; + tooltipAppearance?: TooltipAppearanceEnum; + focusedState: IFocusedState; + chartType: ChartTypeEnum; + alignmentConfig?: IAlignmentConfig; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + selectOptions: IGroupingSelectOption[]; + onChangeTooltip: (tooltip: ITooltip) => void; +} diff --git a/src/src/types/components/ChartPanel/PopoverContent.d.ts b/src/src/types/components/ChartPanel/PopoverContent.d.ts new file mode 100644 index 00000000..ffc2066d --- /dev/null +++ b/src/src/types/components/ChartPanel/PopoverContent.d.ts @@ -0,0 +1,25 @@ +import { + ITooltipConfig, + TooltipAppearanceEnum, +} from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { + IAlignmentConfig, + IFocusedState, + IGroupingSelectOption, + ITooltipContent, +} from 'types/services/models/metrics/metricsAppModel'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { ChartTypeEnum } from 'utils/d3'; + +export interface IPopoverContentProps { + tooltipContent: ITooltipContent; + tooltipAppearance?: TooltipAppearanceEnum; + focusedState: IFocusedState; + chartType: ChartTypeEnum; + alignmentConfig?: IAlignmentConfig; + selectOptions: IGroupingSelectOption[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + onChangeTooltip?: (tooltip: Partial) => void; +} diff --git a/src/src/types/components/CodeBlock/CodeBlock.d.ts b/src/src/types/components/CodeBlock/CodeBlock.d.ts new file mode 100644 index 00000000..7b2de1d0 --- /dev/null +++ b/src/src/types/components/CodeBlock/CodeBlock.d.ts @@ -0,0 +1,5 @@ +export interface ICodeBlockProps { + code: string; + className?: string; + language?: string; +} diff --git a/src/src/types/components/ColorPopoverAdvanced/ColorPopoverAdvanced.d.ts b/src/src/types/components/ColorPopoverAdvanced/ColorPopoverAdvanced.d.ts new file mode 100644 index 00000000..1dcfbcfa --- /dev/null +++ b/src/src/types/components/ColorPopoverAdvanced/ColorPopoverAdvanced.d.ts @@ -0,0 +1,7 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +export interface IColorPopoverAdvancedProps { + persistence: boolean; + onPersistenceChange: IMetricProps['onGroupingPersistenceChange']; + onPaletteChange: (event: React.ChangeEvent) => void; +} diff --git a/src/src/types/components/ConfirmModal/ConfirmModal.d.ts b/src/src/types/components/ConfirmModal/ConfirmModal.d.ts new file mode 100644 index 00000000..80acf65c --- /dev/null +++ b/src/src/types/components/ConfirmModal/ConfirmModal.d.ts @@ -0,0 +1,15 @@ +import React from 'react'; + +export interface IConfirmModalProps { + open: boolean; + text?: string; + description?: string; + icon: React.ReactNode; + title?: string; + cancelBtnText?: string; + confirmBtnText?: string; + children?: React.ReactNode; + onSubmit: () => void; + onCancel: () => void; + statusType?: error | success | warning | info; +} diff --git a/src/src/types/components/ControlPopover/ControlPopover.d.ts b/src/src/types/components/ControlPopover/ControlPopover.d.ts new file mode 100644 index 00000000..6633eb84 --- /dev/null +++ b/src/src/types/components/ControlPopover/ControlPopover.d.ts @@ -0,0 +1,23 @@ +import React from 'react'; + +import { PopoverProps } from '@material-ui/core'; + +export default interface IControlPopoverProps extends Partial { + anchor: (params: { + onAnchorClick: (event: React.MouseEvent) => void; + opened?: boolean; + }) => React.FunctionComponentElement | HTMLElement | null; + component: + | ((params: { + handleClose?: () => void; + opened?: boolean; + }) => + | React.FunctionComponentElement + | HTMLElement + | null) + | React.FunctionComponentElement; + title?: string; + titleClassName?: string; + open?: boolean; + size?: 'small' | 'medium' | 'large'; +} diff --git a/src/src/types/components/CopyToClipBoard/CopyToClipBoard.d.ts b/src/src/types/components/CopyToClipBoard/CopyToClipBoard.d.ts new file mode 100644 index 00000000..ac0f883a --- /dev/null +++ b/src/src/types/components/CopyToClipBoard/CopyToClipBoard.d.ts @@ -0,0 +1,12 @@ +import React from 'react'; + +import { IButtonProps } from 'components/kit'; + +export interface ICopyToClipBoardProps { + contentRef?: React.RefObject; + showSuccessDelay?: number; + className?: string; + copyContent?: string | null; + iconSize?: IButtonProps['size']; + isURL?: bool | null; +} diff --git a/src/src/types/components/ErrorBoundary/ErrorBoundary.d.ts b/src/src/types/components/ErrorBoundary/ErrorBoundary.d.ts new file mode 100644 index 00000000..62926c44 --- /dev/null +++ b/src/src/types/components/ErrorBoundary/ErrorBoundary.d.ts @@ -0,0 +1,9 @@ +import React from 'react'; + +export interface IErrorBoundaryProps { + fallback?: React.ReactElement; +} + +export interface IErrorBoundaryState { + error: Error | null; +} diff --git a/src/src/types/components/GroupConfigPopover/GroupConfigPopover.d.ts b/src/src/types/components/GroupConfigPopover/GroupConfigPopover.d.ts new file mode 100644 index 00000000..be64a0b4 --- /dev/null +++ b/src/src/types/components/GroupConfigPopover/GroupConfigPopover.d.ts @@ -0,0 +1,3 @@ +export interface IGroupConfigPopoverProps { + configData: Array<{ name: string; value: string }>; +} diff --git a/src/src/types/components/GroupingPopover/GroupingPopover.d.ts b/src/src/types/components/GroupingPopover/GroupingPopover.d.ts new file mode 100644 index 00000000..e47d8c47 --- /dev/null +++ b/src/src/types/components/GroupingPopover/GroupingPopover.d.ts @@ -0,0 +1,28 @@ +import React from 'react'; + +import { IGroupingConfig } from 'services/models/explorer/createAppModel'; + +import { IMetricProps } from 'types/pages/metrics/Metrics'; +import { + GroupNameEnum, + IGroupingSelectOption, +} from 'types/services/models/metrics/metricsAppModel'; + +export interface IGroupingPopoverProps { + groupName: GroupNameEnum; + groupingData: IGroupingConfig; + advancedComponent?: React.FunctionComponentElement | null; + groupingSelectOptions: IGroupingSelectOption[]; + onSelect: IMetricProps['onGroupingSelectChange']; + onGroupingModeChange: IMetricProps['onGroupingModeChange']; + inputLabel?: string; +} + +export interface IGroupingPopoverAdvancedProps { + paletteIndex?: number; + persistence?: boolean; + groupingData: IGroupingConfig; + onPersistenceChange: IMetricProps['onGroupingPersistenceChange']; + onGroupingPaletteChange?: IMetricProps['onGroupingPaletteChange']; + onShuffleChange: IMetricProps['onShuffleChange']; +} diff --git a/src/src/types/components/HighPlot/HighPlot.d.ts b/src/src/types/components/HighPlot/HighPlot.d.ts new file mode 100644 index 00000000..11d5df72 --- /dev/null +++ b/src/src/types/components/HighPlot/HighPlot.d.ts @@ -0,0 +1,31 @@ +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { ISyncHoverStateArgs } from 'types/utils/d3/drawHoverAttributes'; +import { IChartTitle } from 'types/services/models/metrics/metricsAppModel'; + +import { CurveEnum } from 'utils/d3'; + +export interface IHighPlotProps { + index: number; + id?: string; + nameKey?: string; + brushExtents: { + [key: string]: { + [key: string]: [number, number] | [string, string]; + }; + }; + curveInterpolation: CurveEnum; + isVisibleColorIndicator: boolean; + syncHoverState: (args: ISyncHoverStateArgs) => void; + onAxisBrushExtentChange: ( + key: string, + extent: [number, number] | [string, string] | null, + chartIndex: number, + ) => void; + data: any; + chartTitle?: IChartTitle; + resizeMode?: ResizeModeEnum; + onMount?: () => void; + readOnly?: boolean; + margin?: { top: number; right: number; bottom: number; left: number }; +} diff --git a/src/src/types/components/HighlightModesPopover/HighlightModesPopover.d.ts b/src/src/types/components/HighlightModesPopover/HighlightModesPopover.d.ts new file mode 100644 index 00000000..b8155c9d --- /dev/null +++ b/src/src/types/components/HighlightModesPopover/HighlightModesPopover.d.ts @@ -0,0 +1,6 @@ +import { HighlightEnum } from 'utils/d3'; + +export interface IHighlightModesPopoverProps { + mode: HighlightEnum; + onChange: (mode: HighlightEnum) => void; +} diff --git a/src/src/types/components/IllustrationBlock/IllustrationBlock.d.ts b/src/src/types/components/IllustrationBlock/IllustrationBlock.d.ts new file mode 100644 index 00000000..b1e15149 --- /dev/null +++ b/src/src/types/components/IllustrationBlock/IllustrationBlock.d.ts @@ -0,0 +1,23 @@ +import React from 'react'; + +import { IllustrationsEnum } from 'config/illustrationConfig/illustrationConfig'; + +export interface IIllustrationBlockProps { + title?: string | React.ReactNode; + content?: string | React.ReactNode; + image?: React.FunctionComponentElement | HTMLImageElement; + className?: string; + page?: + | 'runs' + | 'metrics' + | 'params' + | 'image' + | 'audio' + | 'scatters' + | 'figures' + | 'bookmarks' + | 'tags'; + type?: IllustrationsEnum; + size?: 'small' | 'medium' | 'large' | 'xLarge'; + showImage?: boolean; +} diff --git a/src/src/types/components/LineChart/LineChart.d.ts b/src/src/types/components/LineChart/LineChart.d.ts new file mode 100644 index 00000000..bdbc9be6 --- /dev/null +++ b/src/src/types/components/LineChart/LineChart.d.ts @@ -0,0 +1,97 @@ +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { + IActivePoint, + INearestCircle, + ISyncHoverStateArgs, +} from 'types/utils/d3/drawHoverAttributes'; +import { IAxesScaleRange } from 'types/components/AxesPropsPopover/AxesPropsPopover'; +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; +import { + IAggregatedData, + IAggregationConfig, + IAlignmentConfig, + IChartTitle, + IChartZoom, + IFocusedState, +} from 'types/services/models/metrics/metricsAppModel'; +import { IRun } from 'types/services/models/metrics/runModel'; + +import { CurveEnum, HighlightEnum } from 'utils/d3'; + +export interface ILine { + key: string; + data: { + xValues: number[]; + yValues: number[]; + }; + color?: string; + dasharray?: string; + selectors?: string[]; + groupKey?: string; + run?: IRun; + chartIndex?: number; +} + +export interface ILineChartProps { + index?: number; + id?: string; + data: ILine[]; + nameKey?: string; + aggregatedData?: IAggregatedData[]; + alignmentConfig?: IAlignmentConfig; + ignoreOutliers?: boolean; + axesScaleRange?: IAxesScaleRange; + highlightMode?: HighlightEnum; + curveInterpolation?: CurveEnum; + syncHoverState?: (args: ISyncHoverStateArgs) => void; + aggregationConfig?: IAggregationConfig; + chartTitle?: IChartTitle; + zoom?: IChartZoom; + onZoomChange?: (zoom: Partial) => void; + resizeMode?: ResizeModeEnum; + onMount?: () => void; + axesScaleType?: IAxesScaleState; + readOnly?: boolean; + margin?: { top: number; right: number; bottom: number; left: number }; +} + +export interface ILineChartRef { + setActiveLineAndCircle: ( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => void; + updateHoverAttributes: (xValue: number, dataSelector?: string) => void; + clearHoverAttributes: () => void; + setFocusedState: (focusedState: IFocusedState) => void; +} + +export interface IUpdateFocusedChartArgs { + mousePos?: [number, number]; + focusedStateActive?: boolean; + force?: boolean; +} + +export interface IAttributesRef { + focusedState?: IFocusedState; + activePoint?: IActivePoint; + nearestCircles?: INearestCircle[]; + groupKey?: string; + currentXValue?: number | string; + scaledValues?: { x: number; y: number }[][]; + lineKey?: string; + dataSelector?: string; + xScale?: IAxisScale; + yScale?: IAxisScale; + updateScales?: (xScale: IAxisScale, yScale: IAxisScale) => void; + setActiveLineAndCircle?: ( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => void; + updateHoverAttributes?: (xValue: number, dataSelector?: string) => void; + updateFocusedChart?: (args?: IUpdateFocusedChartArgs) => void; + clearHoverAttributes?: () => void; +} diff --git a/src/src/types/components/MultiSelect/MultiSelect.d.ts b/src/src/types/components/MultiSelect/MultiSelect.d.ts new file mode 100644 index 00000000..f9d6a8de --- /dev/null +++ b/src/src/types/components/MultiSelect/MultiSelect.d.ts @@ -0,0 +1,23 @@ +import React from 'react'; + +import { SelectProps } from '@material-ui/core'; + +export default interface IMultiSelectProps extends SelectProps { + values: any[]; + label?: string | number | React.ReactNode; + labelId?: string; + options: any[]; + formClassName?: string; + id?: string; + menuListHeight?: number; + onSelect: + | (( + event: React.ChangeEvent<{ + name?: string | undefined; + value: unknown; + }>, + child: React.ReactNode, + ) => void) + | undefined; + renderValue: (selected) => any; +} diff --git a/src/src/types/components/NotificationContainer/NotificationContainer.d.ts b/src/src/types/components/NotificationContainer/NotificationContainer.d.ts new file mode 100644 index 00000000..392b0074 --- /dev/null +++ b/src/src/types/components/NotificationContainer/NotificationContainer.d.ts @@ -0,0 +1,25 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +export interface INotificationContainer { + data: INotification[]; + handleClose: IMetricProps['onNotificationDelete']; +} + +export interface INotification { + id: number; + messages: string[]; + closeDelay?: number; + severity: 'error' | 'info' | 'success' | 'warning'; +} + +export interface ISyntaxErrorDetail { + line: number; + offset: number; + end_offset?: number; + statement: string; +} + +export interface ISyntaxErrorDetails { + detail: ISyntaxErrorDetail; + message: string; +} diff --git a/src/src/types/components/ResizeModeActions/ResizeModeActions.d.ts b/src/src/types/components/ResizeModeActions/ResizeModeActions.d.ts new file mode 100644 index 00000000..0cb65b38 --- /dev/null +++ b/src/src/types/components/ResizeModeActions/ResizeModeActions.d.ts @@ -0,0 +1,7 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +export interface IResizeModeActions { + onTableResizeModeChange: IMetricProps['onTableResizeModeChange']; + resizeMode: IMetricProps['resizeMode']; + className?: string; +} diff --git a/src/src/types/components/ResizePanel/ResizePanel.d.ts b/src/src/types/components/ResizePanel/ResizePanel.d.ts new file mode 100644 index 00000000..92288e9d --- /dev/null +++ b/src/src/types/components/ResizePanel/ResizePanel.d.ts @@ -0,0 +1,9 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +export interface IResizePanelProps { + panelResizing: boolean; + resizeElemRef: IMetricProps['resizeElemRef']; + resizeMode: IMetricProps['resizeMode']; + onTableResizeModeChange: IMetricProps['onTableResizeModeChange']; + className?: string; +} diff --git a/src/src/types/components/SelectTag/SelectTag.d.ts b/src/src/types/components/SelectTag/SelectTag.d.ts new file mode 100644 index 00000000..71299961 --- /dev/null +++ b/src/src/types/components/SelectTag/SelectTag.d.ts @@ -0,0 +1,11 @@ +import { Dispatch, SetStateAction } from 'react'; + +import { ITagInfo } from 'types/pages/tags/Tags'; + +export interface ISelectTagProps { + runHash: string; + attachedTags: ITagInfo[]; + setAttachedTags: Dispatch>; + onRunsTagsChange?: (runHash: string, tags: ITagInfo[]) => void; + updatePopover?: (key: string) => void; +} diff --git a/src/src/types/components/SmoothingPopover/SmoothingPopover.d.ts b/src/src/types/components/SmoothingPopover/SmoothingPopover.d.ts new file mode 100644 index 00000000..27f7a55a --- /dev/null +++ b/src/src/types/components/SmoothingPopover/SmoothingPopover.d.ts @@ -0,0 +1,6 @@ +import { ISmoothing } from 'types/services/models/metrics/metricsAppModel'; + +export interface ISmoothingPopoverProps { + onSmoothingChange: (props: Partial) => void; + smoothing: ISmoothing; +} diff --git a/src/src/types/components/TabPanel/TabPanel.d.ts b/src/src/types/components/TabPanel/TabPanel.d.ts new file mode 100644 index 00000000..86ad3c1b --- /dev/null +++ b/src/src/types/components/TabPanel/TabPanel.d.ts @@ -0,0 +1,6 @@ +export interface ITabPanelProps { + children?: React.ReactNode; + index: number | string; + value: number | string; + className?: string; +} diff --git a/src/src/types/components/Table/Table.d.ts b/src/src/types/components/Table/Table.d.ts new file mode 100644 index 00000000..6aa49da4 --- /dev/null +++ b/src/src/types/components/Table/Table.d.ts @@ -0,0 +1,111 @@ +import React from 'react'; + +import { RowHeight, RowHeightSize } from 'config/table/tableConfigs'; +import { + MetricsValueKeyEnum, + ResizeModeEnum, + VisualizationElementEnum, +} from 'config/enums/tableEnums'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { IMetricProps } from 'types/pages/metrics/Metrics'; +import { IColumnsOrder } from 'types/services/models/explorer/createAppModel'; + +import { IIllustrationBlockProps } from '../IllustrationBlock/IllustrationBlock'; + +export interface ITableProps { + custom?: boolean; + groups?: boolean; + topHeader?: boolean; + data: any[] | null; + columns: any[]; + sameValueColumns?: string[] | []; + height?: string; + metricsValueKey?: MetricsValueKeyEnum; + rowHeight?: RowHeight; + estimatedRowHeight?: number; + onManageColumns?: (order: IColumnsOrderData) => void; + onColumnsVisibilityChange?: (hiddenColumns: string[] | string) => void; + hiddenChartRows?: boolean; + onTableDiffShow?: () => void; + onSort?: (field: string, value: 'asc' | 'desc' | 'none') => void; + onSortReset?: () => void; + onRowsChange?: (keys: string[]) => void; + onExport?: (e: React.ChangeEvent) => void; + onRowHeightChange?: (height: RowHeightSize) => void; + onMetricsValueKeyChange?: (key: MetricsValueKeyEnum) => void; + onTableResizeModeChange?: IMetricProps['onTableResizeModeChange']; + navBarItems?: { + name: string; + callBack: () => void; + }[]; + className?: string; + headerHeight?: number; + sortOptions?: GroupingSelectOptionType[]; + fixed?: boolean; + onRowHover?: (rowKey: string) => void; + onRowClick?: (rowKey?: string) => void; + hideHeaderActions?: boolean; + excludedFields?: string[]; + setExcludedFields?: (fields: string[]) => null; + alwaysVisibleColumns?: string[]; + rowHeightMode?: any; + columnsOrder?: IColumnsOrder; + hiddenColumns?: string[]; + hideSystemMetrics?: boolean; + updateColumns?: any; + columnsWidths?: any; + updateColumnsWidths?: any; + sortFields?: any; + hiddenRows?: string[]; + setSortFields?: any; + isLoading?: boolean; + infiniteLoadHandler?: (data: any) => void; + isInfiniteLoading?: boolean; + allowInfiniteLoading?: boolean; + showRowClickBehaviour?: boolean; + showResizeContainerActionBar?: boolean; + resizeMode?: ResizeModeEnum; + multiSelect?: boolean; + selectedRows?: any; + minHeight?: string; + onRowSelect?: any; + archiveRuns?: (ids: string[], archived: boolean) => void; + deleteRuns?: (ids: string[]) => void; + onRowsVisibilityChange?: (keys: string[]) => void; + onToggleColumnsColorScales?: (colKey: string) => void; + appName?: AppNameEnum; + focusedState?: any; + illustrationConfig?: IIllustrationConfig; + disableRowClick?: boolean; + columnsColorScales?: { [key: string]: boolean }; + visualizationElementType?: VisualizationElementEnum; + noColumnActions?: boolean; +} + +export interface ITableRef { + updateData: (params: { + newData?: any[]; + newColumns?: any[]; + hiddenColumns?: string[] | string; + }) => void; + setHoveredRow: (rowKey: string) => void; + setActiveRow: (rowKey: string) => void; + scrollToRow: (rowKey: string) => void; +} + +export interface IColumnsOrderData { + left: string[]; + middle: string[]; + right: string[]; +} + +export interface IIllustrationConfig { + size?: IIllustrationBlockProps['size']; + page?: IIllustrationBlockProps['page']; + type?: IIllustrationBlockProps['type']; + title?: IIllustrationBlockProps['title']; + content?: IIllustrationBlockProps['content']; + showImage?: IIllustrationBlockProps['showImage']; +} diff --git a/src/src/types/components/TagForm/TagForm.d.ts b/src/src/types/components/TagForm/TagForm.d.ts new file mode 100644 index 00000000..0ed621bb --- /dev/null +++ b/src/src/types/components/TagForm/TagForm.d.ts @@ -0,0 +1,12 @@ +export interface ITagFormProps { + tagData?: { + name: string; + color: string | null; + description: string | null; + archived: boolean; + }; + editMode?: boolean = false; + tagId?: string; + updateTagName?: (name: string) => void; + onCloseModal: () => void; +} diff --git a/src/src/types/components/Theme/Theme.d.ts b/src/src/types/components/Theme/Theme.d.ts new file mode 100644 index 00000000..ae79d768 --- /dev/null +++ b/src/src/types/components/Theme/Theme.d.ts @@ -0,0 +1,10 @@ +import React from 'react'; + +export interface IThemeProps { + children: React.ReactNode; +} + +export interface IThemeContextValues { + dark: boolean; + handleTheme: () => void; +} diff --git a/src/src/types/components/TooltipContentPopover/TooltipContentPopover.d.ts b/src/src/types/components/TooltipContentPopover/TooltipContentPopover.d.ts new file mode 100644 index 00000000..043bcde2 --- /dev/null +++ b/src/src/types/components/TooltipContentPopover/TooltipContentPopover.d.ts @@ -0,0 +1,14 @@ +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { + ITooltip, + IGroupingSelectOption, +} from 'types/services/models/metrics/metricsAppModel'; + +export interface ITooltipContentPopoverProps { + selectOptions: IGroupingSelectOption[]; + selectedFields?: string[]; + isTooltipDisplayed?: boolean; + tooltipAppearance?: TooltipAppearanceEnum; + onChangeTooltip: (tooltip: Partial) => void; +} diff --git a/src/src/types/components/ZoomInPopover/ZoomInPopover.d.ts b/src/src/types/components/ZoomInPopover/ZoomInPopover.d.ts new file mode 100644 index 00000000..6363a5b4 --- /dev/null +++ b/src/src/types/components/ZoomInPopover/ZoomInPopover.d.ts @@ -0,0 +1,8 @@ +import { IChartZoom } from 'types/services/models/metrics/metricsAppModel'; + +import { ZoomEnum } from 'utils/d3'; + +export interface IZoomInPopoverProps { + mode?: ZoomEnum; + onChange?: (zoom: Partial) => void; +} diff --git a/src/src/types/components/ZoomOutPopover/ZoomOutPopover.d.ts b/src/src/types/components/ZoomOutPopover/ZoomOutPopover.d.ts new file mode 100644 index 00000000..900dac2a --- /dev/null +++ b/src/src/types/components/ZoomOutPopover/ZoomOutPopover.d.ts @@ -0,0 +1,6 @@ +import { IChartZoom } from 'types/services/models/metrics/metricsAppModel'; + +export interface IZoomOutPopoverProps { + zoomHistory?: IChartZoom['history']; + onChange?: (zoom: Partial) => void; +} diff --git a/src/src/types/core/AimObjects/AimFlatObjectBase.d.ts b/src/src/types/core/AimObjects/AimFlatObjectBase.d.ts new file mode 100644 index 00000000..23075ff2 --- /dev/null +++ b/src/src/types/core/AimObjects/AimFlatObjectBase.d.ts @@ -0,0 +1,35 @@ +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { Record } from '../shared'; + +export interface AimFlatObjectBase { + key: string; + data: T; + record?: Record; + groups?: { + rows?: string[]; + columns?: string[]; + [key: string]: string[]; + }; + run?: AimFlatObjectBaseRun; + [key: string]: any; +} + +export interface AimFlatObjectBaseRun { + // run props + name: string; + description: string; + experiment: string; + tags: ITagInfo[]; + experimentId: string; + hash: string; + archived: boolean; + creation_time: number; + end_time: number; + active: boolean; + // run params + dataset: Record; + hparams: Record; + v2_params: Record; + [key: string]: any; +} diff --git a/src/src/types/core/AimObjects/Audio.d.ts b/src/src/types/core/AimObjects/Audio.d.ts new file mode 100644 index 00000000..31e9e52a --- /dev/null +++ b/src/src/types/core/AimObjects/Audio.d.ts @@ -0,0 +1,5 @@ +export interface Audio { + caption: string; + blob_uri: string; + index: number; +} diff --git a/src/src/types/core/AimObjects/CustomObject.d.ts b/src/src/types/core/AimObjects/CustomObject.d.ts new file mode 100644 index 00000000..f699bab3 --- /dev/null +++ b/src/src/types/core/AimObjects/CustomObject.d.ts @@ -0,0 +1,29 @@ +import { Tuple } from '../shared'; + +import { SequenceBaseView } from './Sequence'; +import { Params, RunProps } from './Run'; + +export interface BaseRangeInfo { + record_range_used: Tuple; + record_range_total: Tuple; + index_range_used: Tuple | null; + index_range_total: Tuple | null; +} + +export interface ObjectSequenceBase extends BaseRangeInfo, SequenceBaseView { + values: Array; +} + +export interface ObjectSequenceFullView extends SequenceBaseView { + values: Array; + iters: Array; + epochs: Array; + timestamps: Array; +} + +export interface ObjectSearchRunView { + params: Params; + traces: Array; + ranges: BaseRangeInfo; + props: RunProps; +} diff --git a/src/src/types/core/AimObjects/Distribution.d.ts b/src/src/types/core/AimObjects/Distribution.d.ts new file mode 100644 index 00000000..0b198172 --- /dev/null +++ b/src/src/types/core/AimObjects/Distribution.d.ts @@ -0,0 +1,7 @@ +import { EncodedNumpyArray } from '../shared'; + +export interface Distribution { + data: EncodedNumpyArray; + bin_count: number; + range: [number, number]; +} diff --git a/src/src/types/core/AimObjects/Figure.d.ts b/src/src/types/core/AimObjects/Figure.d.ts new file mode 100644 index 00000000..9e979ef2 --- /dev/null +++ b/src/src/types/core/AimObjects/Figure.d.ts @@ -0,0 +1,3 @@ +export interface Figure { + blob_uri: string; +} diff --git a/src/src/types/core/AimObjects/Image.d.ts b/src/src/types/core/AimObjects/Image.d.ts new file mode 100644 index 00000000..17d7c160 --- /dev/null +++ b/src/src/types/core/AimObjects/Image.d.ts @@ -0,0 +1,7 @@ +export interface Image { + caption: string; + width: number; + height: number; + blob_uri: string; + index: number; +} diff --git a/src/src/types/core/AimObjects/Metric.d.ts b/src/src/types/core/AimObjects/Metric.d.ts new file mode 100644 index 00000000..795e3c8c --- /dev/null +++ b/src/src/types/core/AimObjects/Metric.d.ts @@ -0,0 +1,8 @@ +import { SequenceFullView } from './Sequence'; +import { Params, RunProps } from './Run'; + +export interface MetricSearchRunView { + params: Params; + traces: Array; + props: RunProps; +} diff --git a/src/src/types/core/AimObjects/Run.d.ts b/src/src/types/core/AimObjects/Run.d.ts new file mode 100644 index 00000000..ea2c9af4 --- /dev/null +++ b/src/src/types/core/AimObjects/Run.d.ts @@ -0,0 +1,52 @@ +import { SequenceFullView, SequenceOverview } from './Sequence'; + +export type Params = Record; + +export interface Tag { + id: string; + name: string; + color: string; + description: string; +} + +export interface Experiment { + id: string; + name: string; +} + +export interface RunProps { + hash: string; + name: string | null; + description: string | null; + experiment: Experiment | null; + tags: Array | null; + creation_time: number; + end_time: number | null; +} + +export interface RunInfo { + params: Params; + traces: Record>; + props: RunProps; +} + +export interface IndexRanges { + index_range_total?: [number, number]; + index_range_used?: [number, number]; +} + +export interface RecordRanges { + record_range_total?: [number, number]; + record_range_used?: [number, number]; +} + +export interface RunSearchRunView { + hash: string; + values: Array; + params: Params; + traces: Array; + props: RunProps; + ranges?: IndexRanges & RecordRanges; +} + +export interface Container extends RunSearchRunView {} diff --git a/src/src/types/core/AimObjects/Sequence.d.ts b/src/src/types/core/AimObjects/Sequence.d.ts new file mode 100644 index 00000000..27dafda9 --- /dev/null +++ b/src/src/types/core/AimObjects/Sequence.d.ts @@ -0,0 +1,35 @@ +import { Context, EncodedNumpyArray } from '../shared'; + +export interface SequenceBase { + context: Context; + name: string; +} + +export interface SequenceOverview extends SequenceBase { + values: number; +} + +export interface SequenceBaseView extends SequenceBase { + iters: Array; +} + +export interface Sequence extends SequenceBase { + iters: Array; +} + +export interface MetricsBaseView extends SequenceBaseView { + values: Array; +} + +export interface SequenceAlignedView extends SequenceBase { + x_axis_values: EncodedNumpyArray | null; + x_axis_iters: EncodedNumpyArray | null; +} + +export interface SequenceFullView extends SequenceAlignedView { + slice: [number, number, number]; + values: EncodedNumpyArray; + epochs: EncodedNumpyArray; + iters: EncodedNumpyArray; + timestamps: EncodedNumpyArray; +} diff --git a/src/src/types/core/AimObjects/index.d.ts b/src/src/types/core/AimObjects/index.d.ts new file mode 100644 index 00000000..653eeaf1 --- /dev/null +++ b/src/src/types/core/AimObjects/index.d.ts @@ -0,0 +1,9 @@ +export * from './AimFlatObjectBase'; +export * from './CustomObject'; +export * from './Distribution'; +export * from './Sequence'; +export * from './Metric'; +export * from './Audio'; +export * from './Figure'; +export * from './Image'; +export * from './Run'; diff --git a/src/src/types/core/enums/index.ts b/src/src/types/core/enums/index.ts new file mode 100644 index 00000000..3e7b068d --- /dev/null +++ b/src/src/types/core/enums/index.ts @@ -0,0 +1,26 @@ +/** + * Defined sequence names + */ +export enum SequenceTypesEnum { + Distributions = 'distributions', + Figures = 'figures', + Images = 'images', + Audios = 'audios', + Metric = 'metric', + Texts = 'texts', +} + +/** + * Depths of data coming from api, from which level should get the actual value of visualization data + */ +export enum AimObjectDepths { + Container = 0, + Sequence = 1, + Step = 2, + Index = 3, +} + +/** + * Sequence names as union type + */ +export type SequenceTypesUnion = `${SequenceTypesEnum}`; diff --git a/src/src/types/core/shared/index.d.ts b/src/src/types/core/shared/index.d.ts new file mode 100644 index 00000000..123dc348 --- /dev/null +++ b/src/src/types/core/shared/index.d.ts @@ -0,0 +1,31 @@ +export interface EncodedNumpyArray { + type: string; + shape: number; + dtype: string; + blob: Uint8Array; +} + +export type Context = Record; + +export type Union = T | D; + +export type Tuple = [T, T]; + +export type Record = { + index?: number; + step: number; +}; + +export type AllKeys = T extends any ? keyof T : never; + +export type Pick> = NonNullable< + T extends { [key in K]: any } ? T[K] : null +>; + +type PickTypeOf = K extends AllKeys + ? Pick + : Pick>; + +export type MergeUnion = { + [keys in AllKeys]: PickTypeOf; +}; diff --git a/src/src/types/global.d.ts b/src/src/types/global.d.ts new file mode 100644 index 00000000..06dbb196 --- /dev/null +++ b/src/src/types/global.d.ts @@ -0,0 +1,3 @@ +declare global { + const __DEV__: boolean; +} diff --git a/src/src/types/pages/bookmarks/Bookmarks.d.ts b/src/src/types/pages/bookmarks/Bookmarks.d.ts new file mode 100644 index 00000000..82e427c4 --- /dev/null +++ b/src/src/types/pages/bookmarks/Bookmarks.d.ts @@ -0,0 +1,17 @@ +import { ISelectConfig } from 'services/models/explorer/createAppModel'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { IDashboardData } from 'types/services/models/metrics/metricsAppModel'; + +export interface IBookmarksProps { + data: IBookmarksData[]; + onBookmarkDelete: (id) => void; + isLoading: boolean; + notifyData: INotification[]; + onNotificationDelete: (id: number) => void; +} + +interface IBookmarksData extends IDashboardData { + select: ISelectConfig; + type: string; +} diff --git a/src/src/types/pages/bookmarks/components/BookmarkCard.d.ts b/src/src/types/pages/bookmarks/components/BookmarkCard.d.ts new file mode 100644 index 00000000..7e84f1ed --- /dev/null +++ b/src/src/types/pages/bookmarks/components/BookmarkCard.d.ts @@ -0,0 +1,5 @@ +import { IBookmarksData, IBookmarksProps } from '../Bookmarks'; + +export interface IBookmarkCardProps extends IBookmarksData { + onBookmarkDelete: IBookmarksProps['onBookmarkDelete']; +} diff --git a/src/src/types/pages/components/Grouping/Grouping.d.ts b/src/src/types/pages/components/Grouping/Grouping.d.ts new file mode 100644 index 00000000..3d246387 --- /dev/null +++ b/src/src/types/pages/components/Grouping/Grouping.d.ts @@ -0,0 +1,34 @@ +import React from 'react'; + +import { IGroupingPopoverAdvancedProps } from 'components/GroupingPopover/GroupingPopover'; + +import { IGroupingConfig } from 'services/models/explorer/createAppModel'; + +import { + GroupNameEnum, + IGroupingSelectOption, +} from 'types/services/models/metrics/metricsAppModel'; +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +export interface IGroupingProps { + groupingData: IGroupingConfig; + groupingSelectOptions: IGroupingSelectOption[]; + onGroupingSelectChange: IMetricProps['onGroupingSelectChange']; + onGroupingModeChange: IMetricProps['onGroupingModeChange']; + onGroupingPaletteChange: IMetricProps['onGroupingPaletteChange']; + onGroupingReset: IMetricProps['onGroupingReset']; + onGroupingApplyChange: IMetricProps['onGroupingApplyChange']; + onGroupingPersistenceChange: IMetricProps['onGroupingPersistenceChange']; + onShuffleChange: IMetricProps['onShuffleChange']; + groupingPopovers?: IGroupingPopovers[]; + isDisabled?: boolean; +} + +export interface IGroupingPopovers { + groupName: GroupNameEnum; + title: string; + inputLabel?: string; + AdvancedComponent?: ( + props: IGroupingPopoverAdvancedProps, + ) => React.FunctionComponentElement; +} diff --git a/src/src/types/pages/components/GroupingItem/GroupingItem.d.ts b/src/src/types/pages/components/GroupingItem/GroupingItem.d.ts new file mode 100644 index 00000000..e722cc12 --- /dev/null +++ b/src/src/types/pages/components/GroupingItem/GroupingItem.d.ts @@ -0,0 +1,19 @@ +import React from 'react'; + +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { IGroupingPopoverProps } from 'types/components/GroupingPopover/GroupingPopover'; +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; +import { IGroupingConfig } from 'types/services/models/explorer/createAppModel'; + +export interface IGroupingItemProps extends IGroupingPopoverProps { + title: string; + inputLabel?: string; + isDisabled: boolean; + groupName: GroupNameEnum; + groupingData: IGroupingConfig; + advancedComponent?: React.FunctionComponentElement; + groupingSelectOptions: IGroupingSelectOption[]; + onReset: () => void; + onVisibilityChange: () => void; +} diff --git a/src/src/types/pages/imagesExplore/components/Controls/Controls.d.ts b/src/src/types/pages/imagesExplore/components/Controls/Controls.d.ts new file mode 100644 index 00000000..1711ac88 --- /dev/null +++ b/src/src/types/pages/imagesExplore/components/Controls/Controls.d.ts @@ -0,0 +1,25 @@ +import { ImageRenderingEnum } from 'config/enums/imageEnums'; + +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { + ITooltip, + SortField, +} from 'types/services/models/metrics/metricsAppModel'; +import { IImagesExploreAppConfig } from 'types/services/models/imagesExplore/imagesExploreAppModel'; + +export interface IControlProps { + selectOptions: IGroupingSelectOption[]; + tooltip?: ITooltip; + orderedMap: { [key: string]: any }; + onChangeTooltip: (tooltip: Partial) => void; + additionalProperties: IImagesExploreAppConfig['images']['additionalProperties']; + onImageSizeChange: (newValue: number) => void; + onImageRenderingChange: (type: ImageRenderingEnum) => void; + onImageAlignmentChange: ( + value: { value: string; label: string } | null, + ) => void; + onStackingToggle: () => void; + onImagesSortReset: () => void; + onImagesSortChange: any; + sortFields: SortField[]; +} diff --git a/src/src/types/pages/imagesExplore/components/SelectForm/SelectForm.d.ts b/src/src/types/pages/imagesExplore/components/SelectForm/SelectForm.d.ts new file mode 100644 index 00000000..6284ac99 --- /dev/null +++ b/src/src/types/pages/imagesExplore/components/SelectForm/SelectForm.d.ts @@ -0,0 +1,22 @@ +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; +import { ISelectOption } from 'types/services/models/explorer/createAppModel'; + +export interface ISelectFormProps { + // selectedMetricsData: IMetricAppConfig['select']; + requestIsPending: boolean; + isDisabled?: boolean; + selectedImagesData: any; + selectFormData: { + options: ISelectOption[]; + suggestions: Record; + advancedSuggestions: Record; + error: ISyntaxErrorDetails; + advancedError: ISyntaxErrorDetails; + }; + onImagesExploreSelectChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; + onSelectAdvancedQueryChange: (query: string) => void; + toggleSelectAdvancedMode: () => void; + onSearchQueryCopy: () => void; + searchButtonDisabled: boolean; +} diff --git a/src/src/types/pages/metrics/Metrics.d.ts b/src/src/types/pages/metrics/Metrics.d.ts new file mode 100644 index 00000000..4a7d0517 --- /dev/null +++ b/src/src/types/pages/metrics/Metrics.d.ts @@ -0,0 +1,158 @@ +import React from 'react'; +import { RouteChildrenProps } from 'react-router-dom'; + +import { RowHeightSize } from 'config/table/tableConfigs'; +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { DensityOptions } from 'config/enums/densityEnum'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { + IGroupingConfig, + ISelectConfig, +} from 'services/models/explorer/createAppModel'; +import { ISelectOption } from 'services/models/explorer/createAppModel'; + +import { ITableRef } from 'types/components/Table/Table'; +import { + GroupNameEnum, + IMetricTableRowData, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, + IFocusedState, + IMetricAppModelState, + IAggregationConfig, + IAggregatedData, + IAlignmentConfig, + ITooltip, + IChartTitleData, + IGroupingSelectOption, + IChartZoom, + ISmoothing, + LegendsDataType, + LegendsConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { ITableColumn } from 'types/components/TableColumns/TableColumns'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { IBookmarkFormState } from 'types/components/BookmarkForm/BookmarkForm'; +import { + INotification, + ISyntaxErrorDetails, +} from 'types/components/NotificationContainer/NotificationContainer'; +import { ILine } from 'types/components/LineChart/LineChart'; +import { IAxesScaleRange } from 'types/components/AxesPropsPopover/AxesPropsPopover'; +import { IColumnsOrder } from 'types/services/models/explorer/createAppModel'; +import { ITagInfo } from 'types/tags/Tags'; + +import { HighlightEnum } from 'utils/d3'; +import { IRequestProgress } from 'utils/app/setRequestProgress'; + +export interface IMetricProps extends Partial { + tableRef: React.RefObject; + chartPanelRef: React.RefObject; + tableElemRef: React.RefObject; + chartElemRef: React.RefObject; + wrapperElemRef: React.RefObject; + resizeElemRef: React.RefObject; + chartPanelOffsetHeight?: number; + lineChartData: ILine[][]; + panelResizing: boolean; + chartTitleData: IChartTitleData; + legendsData: LegendsDataType; + tableData: IMetricTableRowData[]; + aggregatedData: IAggregatedData[]; + tableColumns: ITableColumn[]; + ignoreOutliers: boolean; + legends: LegendsConfig; + zoom: IChartZoom; + densityType: DensityOptions; + axesScaleType: IAxesScaleState; + axesScaleRange: IAxesScaleRange; + smoothing: ISmoothing; + focusedState: IFocusedState; + highlightMode: HighlightEnum; + groupingData: IGroupingConfig; + notifyData: IMetricAppModelState['notifyData']; + tooltip: ITooltip; + aggregationConfig: IAggregationConfig; + alignmentConfig: IAlignmentConfig; + selectedMetricsData: ISelectConfig; + tableRowHeight: RowHeightSize; + selectedRows: { [key: string]: any }; + sortFields: [string, 'asc' | 'desc' | boolean][]; + hiddenMetrics: string[]; + hiddenColumns: string[]; + hideSystemMetrics: boolean; + sameValueColumns?: string[] | []; + groupingSelectOptions: IGroupingSelectOption[]; + sortOptions: IGroupingSelectOption[]; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + resizeMode: ResizeModeEnum; + selectFormData: { + options: ISelectOption[]; + suggestions: string[]; + error: ISyntaxErrorDetails; + advancedError: ISyntaxErrorDetails; + }; + columnsOrder: IColumnsOrder; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + onChangeTooltip: (tooltip: Partial) => void; + onIgnoreOutliersChange: () => void; + onLegendsChange: (legends: Partial) => void; + onZoomChange: (zoom: Partial) => void; + onActivePointChange?: ( + activePoint: IActivePoint, + focusedStateActive?: boolean, + ) => void; + onHighlightModeChange: (mode: HighlightEnum) => void; + onSmoothingChange: (args: Partial) => void; + onTableRowHover: (rowKey?: string) => void; + onTableRowClick: (rowKey?: string) => void; + onAxesScaleTypeChange: (params: IAxesScaleState) => void; + onAxesScaleRangeChange: (range: Partial) => void; + onAggregationConfigChange: ( + aggregationConfig: Partial, + ) => void; + onGroupingSelectChange: (params: IOnGroupingSelectChangeParams) => void; + onGroupingModeChange: (params: IOnGroupingModeChangeParams) => void; + onGroupingPaletteChange: (index: number) => void; + onGroupingReset: (groupName: GroupNameEnum) => void; + onGroupingApplyChange: (groupName: GroupNameEnum) => void; + onGroupingPersistenceChange: (groupName: 'color' | 'stroke') => void; + onBookmarkCreate: (params: IBookmarkFormState) => void; + onBookmarkUpdate: (id: string) => void; + onNotificationAdd: (notification: INotification) => void; + onNotificationDelete: (id: number) => void; + onResetConfigData: () => void; + onAlignmentMetricChange: (metric: string) => void; + onAlignmentTypeChange: (type: XAlignmentEnum) => void; + onDensityTypeChange: (type: DensityOptions) => void; + onMetricsSelectChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; + onSelectAdvancedQueryChange: (query: string) => void; + onRowsVisibilityChange: (metricKeys: string[]) => void; + toggleSelectAdvancedMode: () => void; + onExportTableData: (e: React.ChangeEvent) => void; + onRowHeightChange: (height: RowHeightSize) => void; + onSortReset: () => void; + onSortChange?: (field: string, value?: 'asc' | 'desc' | 'none') => void; + onMetricVisibilityChange: (metricKeys: string[]) => void; + onColumnsOrderChange: (order: any) => void; + onColumnsVisibilityChange: (hiddenColumns: string[] | string) => void; + onTableDiffShow: () => void; + onTableResizeModeChange: (mode: ResizeModeEnum) => void; + updateColumnsWidths: (key: string, width: number, isReset: boolean) => void; + columnsWidths: { [key: string]: number }; + onShuffleChange: (name: 'stroke' | 'color') => void; + onSearchQueryCopy: () => void; + liveUpdateConfig: { delay: number; enabled: boolean }; + onLiveUpdateConfigChange: (config: { + delay?: number; + enabled?: boolean; + }) => void; + onRowSelect: any; + archiveRuns: (ids: string[], archived: boolean) => void; + deleteRuns: (ids: string[]) => void; +} diff --git a/src/src/types/pages/metrics/components/Controls/Controls.d.ts b/src/src/types/pages/metrics/components/Controls/Controls.d.ts new file mode 100644 index 00000000..d7fa8edd --- /dev/null +++ b/src/src/types/pages/metrics/components/Controls/Controls.d.ts @@ -0,0 +1,55 @@ +import { ILine } from 'components/LineChart/LineChart'; + +import { DensityOptions } from 'config/enums/densityEnum'; + +import { ISelectOption } from 'services/models/explorer/createAppModel'; + +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { IAxesScaleRange } from 'types/components/AxesPropsPopover/AxesPropsPopover'; +import { + IAggregationConfig, + IAlignmentConfig, + ITooltip, + IChartZoom, + IGroupingSelectOption, + ISmoothing, + LegendsDataType, + LegendsConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +import { ChartTypeEnum, HighlightEnum } from 'utils/d3'; + +export interface IControlProps { + chartProps: any[]; + chartType: ChartTypeEnum; + data: ILine[][] | any; + legendsData?: LegendsDataType; + selectOptions: IGroupingSelectOption[]; + tooltip?: ITooltip; + legends?: LegendsConfig; + ignoreOutliers: boolean; + zoom?: IChartZoom; + highlightMode: HighlightEnum; + aggregationConfig: IAggregationConfig; + axesScaleType: IAxesScaleState; + axesScaleRange: IAxesScaleRange; + smoothing: ISmoothing; + alignmentConfig: IAlignmentConfig; + densityType: DensityOptions; + selectFormOptions: ISelectOption[]; + onChangeTooltip: (tooltip: Partial) => void; + onIgnoreOutliersChange: () => void; + onLegendsChange: (legends: Partial) => void; + onHighlightModeChange: (mode: number) => void; + onDensityTypeChange: (type: DensityOptions) => void; + onSmoothingChange: (args: Partial) => void; + onAxesScaleTypeChange: (args: IAxesScaleState) => void; + onAggregationConfigChange: ( + aggregationConfig: Partial, + ) => void; + onZoomChange?: (zoom: Partial) => void; + onAlignmentTypeChange: IMetricProps['onAlignmentTypeChange']; + onAlignmentMetricChange: IMetricProps['onAlignmentMetricChange']; + onAxesScaleRangeChange: IMetricProps['onAxesScaleRangeChange']; +} diff --git a/src/src/types/pages/metrics/components/MetricsBar/MetricsBar.d.ts b/src/src/types/pages/metrics/components/MetricsBar/MetricsBar.d.ts new file mode 100644 index 00000000..6ac87851 --- /dev/null +++ b/src/src/types/pages/metrics/components/MetricsBar/MetricsBar.d.ts @@ -0,0 +1,15 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +export interface IMetricsBarProps { + onBookmarkCreate: IMetricProps['onBookmarkCreate']; + onBookmarkUpdate: IMetricProps['onBookmarkUpdate']; + onResetConfigData: IMetricProps['onResetConfigData']; + liveUpdateConfig: { delay: number; enabled: boolean }; + explorerName?: 'IMAGES' | 'PARAMS' | 'METRICS' | 'SCATTERS' | 'RUNS'; + disabled?: boolean; + onLiveUpdateConfigChange: (config: { + delay?: number; + enabled?: boolean; + }) => void; + title: string; +} diff --git a/src/src/types/pages/metrics/components/SelectForm/SelectForm.d.ts b/src/src/types/pages/metrics/components/SelectForm/SelectForm.d.ts new file mode 100644 index 00000000..84e2a519 --- /dev/null +++ b/src/src/types/pages/metrics/components/SelectForm/SelectForm.d.ts @@ -0,0 +1,22 @@ +import { ISelectOption } from 'services/models/explorer/createAppModel'; + +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export interface ISelectFormProps { + requestIsPending: boolean; + isDisabled?: boolean; + selectedMetricsData: IAppModelConfig['select']; + selectFormData: { + options: ISelectOption[]; + suggestions: Record; + advancedSuggestions?: Record; + error: ISyntaxErrorDetails; + advancedError: ISyntaxErrorDetails; + }; + onMetricsSelectChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; + onSelectAdvancedQueryChange: (query: string) => void; + toggleSelectAdvancedMode: () => void; + onSearchQueryCopy: () => void; +} diff --git a/src/src/types/pages/metrics/components/SortPopover/SortPopover.d.ts b/src/src/types/pages/metrics/components/SortPopover/SortPopover.d.ts new file mode 100644 index 00000000..92ecf99a --- /dev/null +++ b/src/src/types/pages/metrics/components/SortPopover/SortPopover.d.ts @@ -0,0 +1,20 @@ +import { AppNameEnum } from 'services/models/explorer'; + +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; + +import { SortFields } from 'utils/getSortedFields'; + +export interface ISortPopoverProps { + onSort: any; + onReset: () => void; + sortOptions: IGroupingSelectOption[]; + sortFields: SortFields; + readOnlyFieldsLabel?: string; + appName?: AppNameEnum; +} +export interface ISortPopoverListProps { + onSort: any; + sortFields: SortFields; + filteredSortFields: SortFields; + title?: string; +} diff --git a/src/src/types/pages/metrics/components/TableColumns/TableColumns.d.ts b/src/src/types/pages/metrics/components/TableColumns/TableColumns.d.ts new file mode 100644 index 00000000..75a73505 --- /dev/null +++ b/src/src/types/pages/metrics/components/TableColumns/TableColumns.d.ts @@ -0,0 +1,10 @@ +import React from 'react'; + +export interface ITableColumn { + key: string; + label?: string; + content: React.ReactNode | string; + topHeader: string; + pin?: string | null; + isHidden?: boolean; +} diff --git a/src/src/types/pages/params/Params.d.ts b/src/src/types/pages/params/Params.d.ts new file mode 100644 index 00000000..718c3ba0 --- /dev/null +++ b/src/src/types/pages/params/Params.d.ts @@ -0,0 +1,127 @@ +import React from 'react'; +import { RouteChildrenProps } from 'react-router-dom'; + +import { ITableRef } from 'components/Table/Table'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { + GroupNameEnum, + IChartTitleData, + ITooltip, + IFocusedState, + IGroupingSelectOption, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, +} from 'types/services/models/metrics/metricsAppModel'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { + INotification, + ISyntaxErrorDetails, +} from 'types/components/NotificationContainer/NotificationContainer'; +import { IBookmarkFormState } from 'types/components/BookmarkForm/BookmarkForm'; +import { + IColumnsOrder, + IGroupingConfig, + ISelectConfig, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; + +import { CurveEnum } from 'utils/d3'; +import { IRequestProgress } from 'utils/app/setRequestProgress'; + +export interface IParamsProps extends Partial { + chartElemRef: React.RefObject; + chartPanelRef: React.RefObject; + tableRef: React.RefObject; + tableElemRef: React.RefObject; + wrapperElemRef: React.RefObject; + resizeElemRef: React.RefObject; + chartPanelOffsetHeight?: number; + curveInterpolation: CurveEnum; + panelResizing: boolean; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + highPlotData: any; + groupingData: IGroupingConfig; + groupingSelectOptions: IGroupingSelectOption[]; + sortOptions: IGroupingSelectOption[]; + hiddenMetrics: string[]; + hideSystemMetrics: boolean; + sortFields: [string, 'asc' | 'desc' | boolean][]; + focusedState: IFocusedState; + isVisibleColorIndicator: boolean; + tooltip: ITooltip; + chartTitleData: IChartTitleData; + selectedParamsData: ISelectConfig; + onRowHeightChange: any; + onSortFieldsChange: any; + onParamVisibilityChange: any; + onColumnsOrderChange: any; + tableData: any; + selectedRows: { [key: string]: any }; + brushExtents: { + [key: string]: { + [key: string]: [number, number] | [string, string]; + }; + }; + onTableRowHover?: (rowKey?: string) => void; + onTableRowClick?: (rowKey?: string) => void; + tableColumns: any; + resizeMode: ResizeModeEnum; + notifyData: INotification[]; + tableRowHeight?: any; + hiddenColumns: any; + selectFormData: { + options: ISelectOption[]; + suggestions: string[]; + error: ISyntaxErrorDetails; + }; + columnsOrder: IColumnsOrder; + sameValueColumns: string[] | []; + onNotificationDelete: (id: number) => void; + onCurveInterpolationChange: () => void; + onActivePointChange: ( + activePoint: IActivePoint, + focusedStateActive: boolean = false, + ) => void; + onColorIndicatorChange: () => void; + onParamsSelectChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; + onGroupingSelectChange: (params: IOnGroupingSelectChangeParams) => void; + onGroupingModeChange: (params: IOnGroupingModeChangeParams) => void; + onGroupingPaletteChange: (index: number) => void; + onGroupingReset: (groupName: GroupNameEnum) => void; + onGroupingApplyChange: (groupName: GroupNameEnum) => void; + onGroupingPersistenceChange: (groupName: 'color' | 'stroke') => void; + onBookmarkCreate: (params: IBookmarkFormState) => void; + onBookmarkUpdate: (id: string) => void; + onNotificationAdd: (notification: INotification) => void; + onResetConfigData: () => void; + onChangeTooltip: (tooltip: Partial) => void; + onExportTableData: (e: React.ChangeEvent) => void; + onColumnsVisibilityChange: (order: any) => void; + onTableDiffShow: () => void; + onTableResizeModeChange: (mode: ResizeModeEnum) => void; + onSortReset: () => void; + updateColumnsWidths: (key: string, width: number, isReset: boolean) => void; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + onShuffleChange: (name: 'stroke' | 'color') => void; + onAxisBrushExtentChange: ( + key: string, + extent: [number, number] | [string, string] | null, + chartIndex: number, + ) => void; + columnsWidths: { [key: string]: number }; + liveUpdateConfig: { delay: number; enabled: boolean }; + onLiveUpdateConfigChange: (config: { + delay?: number; + enabled?: boolean; + }) => void; + onRowSelect: any; + archiveRuns: (ids: string[], archived: boolean) => void; + deleteRuns: (ids: string[]) => void; + onRowsVisibilityChange: (metricKeys: string[]) => void; +} diff --git a/src/src/types/pages/params/components/Controls/Controls.d.ts b/src/src/types/pages/params/components/Controls/Controls.d.ts new file mode 100644 index 00000000..1a189246 --- /dev/null +++ b/src/src/types/pages/params/components/Controls/Controls.d.ts @@ -0,0 +1,16 @@ +import { + IGroupingSelectOption, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; + +import { CurveEnum } from 'utils/d3'; + +export interface IControlProps { + curveInterpolation: CurveEnum; + isVisibleColorIndicator: boolean; + selectOptions: IGroupingSelectOption[]; + tooltip?: ITooltip; + onColorIndicatorChange: () => void; + onCurveInterpolationChange: () => void; + onChangeTooltip: (tooltip: Partial) => void; +} diff --git a/src/src/types/pages/params/components/SelectForm/SelectForm.d.ts b/src/src/types/pages/params/components/SelectForm/SelectForm.d.ts new file mode 100644 index 00000000..76eabddd --- /dev/null +++ b/src/src/types/pages/params/components/SelectForm/SelectForm.d.ts @@ -0,0 +1,17 @@ +import { ISelectOption } from 'services/models/explorer/createAppModel'; + +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export interface ISelectFormProps { + selectFormData: { + options: ISelectOption[]; + suggestions: Record; + error: ISyntaxErrorDetails; + }; + requestIsPending: boolean; + isDisabled?: boolean; + selectedParamsData: IAppModelConfig['select']; + onParamsSelectChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; +} diff --git a/src/src/types/pages/runs/Runs.d.ts b/src/src/types/pages/runs/Runs.d.ts new file mode 100644 index 00000000..5423bb66 --- /dev/null +++ b/src/src/types/pages/runs/Runs.d.ts @@ -0,0 +1,48 @@ +import React from 'react'; + +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { MetricsValueKeyEnum } from 'config/enums/tableEnums'; + +import { IColumnsOrder } from 'types/services/models/explorer/createAppModel'; +import { + IMetricTrace, + IParamTrace, + IRun, +} from 'types/services/models/metrics/runModel'; + +import { ITagProps } from '../tags/Tags'; + +export interface IRunsProps { + tableData: IRun[]; +} + +export interface IRunsTableProps { + columnsOrder: IColumnsOrder; + tableRef: React.RefObject; + runsList: ITagProps[]; + isInfiniteLoading: boolean; + hiddenColumns: string[]; + hideSystemMetrics: boolean; + columns: any; + metricsValueKey: MetricsValueKeyEnum; + tableRowHeight: number; + requestStatus: RequestStatusEnum; + sameValueColumns: string[] | []; + onExportTableData: () => void; + onManageColumns: () => void; + onColumnsVisibilityChange: (hiddenColumns: string[] | string) => void; + onTableDiffShow: () => void; + onMetricsValueKeyChange: (key: MetricsValueKeyEnum) => void; + onRowHeightChange: () => void; + getLastRunsData: (row: any) => any; + isLatest?: boolean; + data: any; + columnsWidths: { [key: string]: number }; + columnsColorScales: { [key: string]: boolean }; + updateColumnsWidths: (key: string, width: number, isReset: boolean) => void; + selectedRows: { [key: string]: any }; + onRowSelect: (key: string) => any; + archiveRuns: (ids: string[], archived: boolean) => void; + deleteRuns: (ids: string[]) => void; + onToggleColumnsColorScales: (colKey: string) => void; +} diff --git a/src/src/types/pages/scatters/Scatters.d.ts b/src/src/types/pages/scatters/Scatters.d.ts new file mode 100644 index 00000000..92857a05 --- /dev/null +++ b/src/src/types/pages/scatters/Scatters.d.ts @@ -0,0 +1,121 @@ +import React from 'react'; +import { RouteChildrenProps } from 'react-router-dom'; + +import { RowHeightSize } from 'config/table/tableConfigs'; +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { + ISelectConfig, + ISelectOption, + IGroupingConfig, + IColumnsOrder, +} from 'types/services/models/explorer/createAppModel'; +import { IScatterAppModelState } from 'types/services/models/scatter/scatterAppModel'; +import { ITableRef } from 'types/components/Table/Table'; +import { + GroupNameEnum, + IMetricTableRowData, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, + IFocusedState, + ITooltip, + IChartTitleData, + IGroupingSelectOption, +} from 'types/services/models/metrics/metricsAppModel'; +import { ITableColumn } from 'types/components/TableColumns/TableColumns'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { IBookmarkFormState } from 'types/components/BookmarkForm/BookmarkForm'; +import { + INotification, + ISyntaxErrorDetails, +} from 'types/components/NotificationContainer/NotificationContainer'; +import { IProjectParamsMetrics } from 'types/services/models/projects/projectsModel'; +import { ITrendlineOptions } from 'types/services/models/scatter/scatterAppModel'; + +import { IRequestProgress } from 'utils/app/setRequestProgress'; + +export interface IScattersProps extends Partial { + tableRef: React.RefObject; + chartPanelRef: React.RefObject; + tableElemRef: React.RefObject; + chartElemRef: React.RefObject; + wrapperElemRef: React.RefObject; + resizeElemRef: React.RefObject; + chartPanelOffsetHeight?: number; + scatterPlotData: any[]; + panelResizing: boolean; + chartTitleData: IChartTitleData; + tableData: IMetricTableRowData[]; + tableColumns: ITableColumn[]; + focusedState: IFocusedState; + groupingData: IGroupingConfig; + notifyData: IScatterAppModelState['notifyData']; + tooltip: ITooltip; + selectedOptionsData: ISelectConfig; + tableRowHeight: RowHeightSize; + sortFields: [string, 'asc' | 'desc' | boolean][]; + hiddenMetrics: string[]; + hiddenColumns: string[]; + hideSystemMetrics: boolean; + groupingSelectOptions: IGroupingSelectOption[]; + sortOptions: IGroupingSelectOption[]; + projectsDataMetrics: IProjectParamsMetrics['metrics']; + resizeMode: ResizeModeEnum; + selectFormData: { + options: ISelectOption[]; + suggestions: string[]; + error: ISyntaxErrorDetails; + }; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + trendlineOptions: ITrendlineOptions; + sameValueColumns?: string[] | []; + selectedRows: { [key: string]: any }; + columnsOrder: IColumnsOrder; + onChangeTooltip: (tooltip: Partial) => void; + onChangeTrendlineOptions: (options: Partial) => void; + onActivePointChange?: ( + activePoint: IActivePoint, + focusedStateActive?: boolean, + ) => void; + onTableRowHover: (rowKey?: string) => void; + onTableRowClick: (rowKey?: string) => void; + onGroupingSelectChange: (params: IOnGroupingSelectChangeParams) => void; + onGroupingModeChange: (params: IOnGroupingModeChangeParams) => void; + onGroupingPaletteChange: (index: number) => void; + onGroupingReset: (groupName: GroupNameEnum) => void; + onGroupingApplyChange: (groupName: GroupNameEnum) => void; + onGroupingPersistenceChange: (groupName: 'color' | 'stroke') => void; + onBookmarkCreate: (params: IBookmarkFormState) => void; + onBookmarkUpdate: (id: string) => void; + onNotificationAdd: (notification: INotification) => void; + onNotificationDelete: (id: number) => void; + onResetConfigData: () => void; + onSelectOptionsChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; + onExportTableData: (e: React.ChangeEvent) => void; + onRowHeightChange: (height: RowHeightSize) => void; + onSortReset: () => void; + onSortChange?: (field: string, value?: 'asc' | 'desc' | 'none') => void; + onParamVisibilityChange: (metricKeys: string[]) => void; + onColumnsOrderChange: (order: any) => void; + onColumnsVisibilityChange: (hiddenColumns: string[] | string) => void; + onTableDiffShow: () => void; + onTableResizeModeChange: (mode: ResizeModeEnum) => void; + updateColumnsWidths: (key: string, width: number, isReset: boolean) => void; + columnsWidths: { [key: string]: number }; + onShuffleChange: (name: 'stroke' | 'color') => void; + onSearchQueryCopy: () => void; + liveUpdateConfig: { delay: number; enabled: boolean }; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + onLiveUpdateConfigChange: (config: { + delay?: number; + enabled?: boolean; + }) => void; + onRowSelect: any; + archiveRuns: (ids: string[], archived: boolean) => void; + deleteRuns: (ids: string[]) => void; + onRowsVisibilityChange: (metricKeys: string[]) => void; +} diff --git a/src/src/types/pages/scatters/components/Controls/Controls.d.ts b/src/src/types/pages/scatters/components/Controls/Controls.d.ts new file mode 100644 index 00000000..b57c3481 --- /dev/null +++ b/src/src/types/pages/scatters/components/Controls/Controls.d.ts @@ -0,0 +1,21 @@ +import { + ITooltip, + IGroupingSelectOption, +} from 'types/services/models/metrics/metricsAppModel'; +import { IProjectParamsMetrics } from 'types/services/models/projects/projectsModel'; +import { ITrendlineOptions } from 'types/services/models/scatter/scatterAppModel'; +import { IScattersProps } from 'types/pages/scatters/Scatters'; + +import { ChartTypeEnum } from 'utils/d3'; + +export interface IControlProps { + chartProps: any[]; + chartType: ChartTypeEnum; + data: IScattersProps['scatterPlotData']; + selectOptions: IGroupingSelectOption[]; + tooltip?: ITooltip; + projectsDataMetrics: IProjectParamsMetrics['metrics']; + onChangeTooltip: (tooltip: Partial) => void; + trendlineOptions: ITrendlineOptions; + onChangeTrendlineOptions: (options: Partial) => void; +} diff --git a/src/src/types/pages/scatters/components/SelectForm/SelectForm.d.ts b/src/src/types/pages/scatters/components/SelectForm/SelectForm.d.ts new file mode 100644 index 00000000..ef55562e --- /dev/null +++ b/src/src/types/pages/scatters/components/SelectForm/SelectForm.d.ts @@ -0,0 +1,19 @@ +import { + ISelectOption, + ISelectConfig, +} from 'services/models/explorer/createAppModel'; + +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; + +export interface ISelectFormProps { + requestIsPending: boolean; + isDisabled?: boolean; + selectedOptionsData: ISelectConfig; + selectFormData: { + options: ISelectOption[]; + suggestions: string[]; + error: ISyntaxErrorDetails; + }; + onSelectOptionsChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; +} diff --git a/src/src/types/pages/tags/Tags.d.ts b/src/src/types/pages/tags/Tags.d.ts new file mode 100644 index 00000000..07d12b38 --- /dev/null +++ b/src/src/types/pages/tags/Tags.d.ts @@ -0,0 +1,84 @@ +export interface ITagsProps { + tagsListData: ITagProps[]; + isTagsDataLoading: boolean; + tagInfo: any; + tagRuns: any; + onNotificationDelete: any; + notifyData: any; + isTagsDataLoading: any; + isRunsDataLoading: any; + isTagInfoDataLoading: any; +} + +export interface ITagProps { + name: string; + color: string | null; + id: string; + description: string; + run_count: number; + archived: boolean; +} + +export interface ITagRunsProps { + tagHash: string; + tagRuns: ITagRun[]; +} + +export interface ITagSoftDeleteProps { + modalIsOpen: boolean; + tagHash: string; + tagInfo: ITagInfo; + onSoftDeleteModalToggle: () => void; + onTagDetailOverlayToggle: () => void; + isTagDetailOverLayOpened: boolean; +} + +export interface ITagRun { + creation_time: number; + end_time: number | null; + experiment: string | null; + name: string; + run_id: string; +} +export interface ITagInfo { + archived: boolean; + color: string; + id: string; + description: string; + name: string; + run_count: number; +} +export interface ITagInfoWithSelectedProperty extends ITagInfo { + selected: boolean; +} +export interface ITagDetailProps { + id: string; + onSoftDeleteModalToggle: () => void; + onUpdateModalToggle: () => void; + onDeleteModalToggle: () => void; + isTagInfoDataLoading: any; + tagInfo: any; + isRunsDataLoading: any; + tagRuns: any; +} + +export interface ITagsTableProps { + tableRef: React.RefObject; + tagsList: ITagProps[]; + hasSearchValue: boolean; + isTagsDataLoading: boolean; + onTableRunClick: (id: string) => void; + onSoftDeleteModalToggle: () => void; + onUpdateModalToggle: () => void; + onDeleteModalToggle: () => void; +} + +export interface ITagsListProps { + tagsList: ITagProps[]; + isHiddenTagsList?: boolean; + isTagsDataLoading: boolean; + tagInfo: any; + tagRuns: any; + isRunsDataLoading: boolean; + isTagInfoDataLoading: boolean; +} diff --git a/src/src/types/services/models/bookmarks/bookmarksAppModel.d.ts b/src/src/types/services/models/bookmarks/bookmarksAppModel.d.ts new file mode 100644 index 00000000..ff74ef32 --- /dev/null +++ b/src/src/types/services/models/bookmarks/bookmarksAppModel.d.ts @@ -0,0 +1,8 @@ +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { IBookmarksData } from 'types/pages/bookmarks/Bookmarks'; + +export interface IBookmarksAppModelState { + isLoading: boolean; + listData: IBookmarksData[]; + notifyData: INotification[]; +} diff --git a/src/src/types/services/models/explorer/createAppModel.d.ts b/src/src/types/services/models/explorer/createAppModel.d.ts new file mode 100644 index 00000000..0ad3b1d9 --- /dev/null +++ b/src/src/types/services/models/explorer/createAppModel.d.ts @@ -0,0 +1,176 @@ +import { MetricsValueKeyEnum, ResizeModeEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { DensityOptions } from 'config/enums/densityEnum'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { AppDataTypeEnum, AppNameEnum } from 'services/models/explorer'; + +import { IAxesScaleRange } from 'types/components/AxesPropsPopover/AxesPropsPopover'; +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { + IAggregationConfig, + IAlignmentConfig, + ITooltip, + IChartZoom, + IFocusedState, + IMetricAppModelState, + SortField, + ITooltipConfig, + ISmoothing, + LegendsConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { IParamsAppModelState } from 'types/services/models/params/paramsAppModel'; +import { IRunsAppModelState } from 'types/services/models/runs/runsAppModel'; +import { + IScatterAppModelState, + ITrendlineOptions, +} from 'types/services/models/scatter/scatterAppModel'; + +import { ChartTypeEnum, CurveEnum, HighlightEnum } from 'utils/d3'; + +import { IImagesExploreAppModelState } from '../imagesExplore/imagesExploreAppModel'; + +export interface IAppInitialConfig { + dataType: AppDataTypeEnum; + selectForm: AppNameEnum; + grouping: boolean; + appName: AppNameEnum; + components: { + table?: boolean; + charts?: ChartTypeEnum[]; + }; +} + +export type IAppModelState = + | IMetricAppModelState + | IParamsAppModelState + | IScatterAppModelState + | IRunsAppModelState + | IImagesExploreAppModelState; + +export interface IAppModelConfig { + grouping?: IGroupingConfig; + select?: ISelectConfig; + table?: ITableConfig; + pagination?: IPaginationConfig; + liveUpdate?: ILiveUpdateConfig; + chart?: Partial; +} + +export interface IChart + extends ILineChartConfig, + IHighPlotConfig, + IScatterPlotConfig { + trendlineOptions: ITrendlineOptions; +} + +export interface IGroupingConfig { + [GroupNameEnum.COLOR]?: string[]; + [GroupNameEnum.STROKE]?: string[]; + [GroupNameEnum.CHART]?: string[]; + [GroupNameEnum.ROW]?: string[]; + reverseMode?: { + color?: boolean; + stroke?: boolean; + chart?: boolean; + row?: boolean; + }; + isApplied?: { + color?: boolean; + stroke?: boolean; + chart?: boolean; + row?: boolean; + }; + persistence?: { + color: boolean; + stroke: boolean; + }; + seed?: { + color: number; + stroke: number; + }; + paletteIndex?: number; +} + +export interface ISelectOption { + label: string; + group: string; + color?: string; + key: string; + type?: string; + value?: { + option_name: string; + context: { [key: string]: unknown } | null | any; + }; +} + +export interface ISelectConfig { + options: ISelectOption[]; + query: string; + advancedMode?: boolean; + advancedQuery?: string; +} + +export interface ITableConfig { + metricsValueKey?: MetricsValueKeyEnum; + resizeMode?: ResizeModeEnum; + rowHeight: RowHeightSize; + sortFields?: SortField[]; + hiddenMetrics?: string[]; + hiddenColumns?: string[]; + hideSystemMetrics?: boolean; + columnsWidths?: { [key: string]: number }; + columnsOrder?: IColumnsOrder; + columnsColorScales?: { [key: string]: boolean }; + height?: string; + selectedRows?: any; +} + +interface IColumnsOrder { + left: string[]; + middle: string[]; + right: string[]; +} +export interface IPaginationConfig { + limit: number; + offset: null; + isLatest: boolean; +} + +export interface ILiveUpdateConfig { + delay: number; + enabled: boolean; +} + +export interface IHighPlotConfig { + curveInterpolation: CurveEnum; + isVisibleColorIndicator: boolean; + focusedState: IFocusedState; + tooltip: ITooltip; + brushExtents: { + [key: string]: { + [key: string]: [number, number] | [string, string]; + }; + }; +} + +export interface ILineChartConfig { + highlightMode: HighlightEnum; + ignoreOutliers: boolean; + zoom: IChartZoom; + axesScaleType: IAxesScaleState; + axesScaleRange: IAxesScaleRange; + smoothing: ISmoothing; + aggregationConfig: IAggregationConfig; + densityType: DensityOptions; + alignmentConfig: IAlignmentConfig; + focusedState: IFocusedState; + tooltip: ITooltipConfig; + legends: LegendsConfig; +} + +export interface IScatterPlotConfig { + highlightMode: HighlightEnum; + focusedState: IFocusedState; + tooltip: ITooltipConfig; +} diff --git a/src/src/types/services/models/imagesExplore/imagesExploreAppModel.d.ts b/src/src/types/services/models/imagesExplore/imagesExploreAppModel.d.ts new file mode 100644 index 00000000..633401a0 --- /dev/null +++ b/src/src/types/services/models/imagesExplore/imagesExploreAppModel.d.ts @@ -0,0 +1,144 @@ +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { ITableRef } from 'types/components/Table/Table'; +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { + ITooltip, + ITooltipConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { + IColumnsOrder, + ISelectConfig, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; + +import { SortFields } from 'utils/getSortedFields'; +import { IRequestProgress } from 'utils/app/setRequestProgress'; + +export interface IImagesExploreAppConfig { + grouping: { + row: string[]; + reverseMode: { + row: boolean; + }; + isApplied: { + row: boolean; + }; + }; + images: { + recordSlice?: number[] | number; + indexSlice?: number[] | number; + stepRange?: number[]; + indexRange?: number[]; + recordDensity?: string; + indexDensity?: string; + tooltip: ITooltipConfig; + focusedState: { + key: string | null; + active: boolean; + }; + additionalProperties: { + alignmentType: string; + mediaItemSize: number; + imageRendering: string; + stacking: boolean; + }; + sortFields?: SortFields; + sortFieldsDict: any; + inputsValidations: any; + }; + select: ISelectConfig; + table: { + resizeMode: ResizeModeEnum; + rowHeight: RowHeightSize; + sortFields?: SortFields; + hiddenMetrics?: string[]; + hiddenColumns?: string[]; + hideSystemMetrics?: undefined; + columnsWidths?: { [key: string]: number }; + columnsOrder?: IColumnsOrder; + height: string; + }; +} + +export interface IImagesExploreAppModelState { + refs: { + tableRef: { current: ITableRef | null }; + }; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + queryIsEmpty: boolean; + rawData: any[]; + config: IImagesExploreAppConfig; + data: any; + imagesData: any; + tooltip: ITooltip; + tableData: any[]; + tableColumns: ITableColumn[]; + sameValueColumns: string[]; + params: string[]; + notifyData: INotification[]; + groupingSelectOptions: IGroupingSelectOption[]; + searchButtonDisabled: boolean; + applyButtonDisabled: boolean; + selectFormData: { + options?: ISelectOption[]; + suggestions: string[]; + error: ISyntaxErrorDetails; + advancedError: ISyntaxErrorDetails; + }; + selectedRows: { [key: string]: any }; + liveUpdateConfig?: { + delay: number; + enabled: boolean; + }; +} + +export interface IGroupingSelectOption { + label: string; + group: string; + value: string; +} + +export interface IImageData { + blob_uri: string; + caption: string; + context: object; + format: string; + height: number; + index: number; + key: string; + seqKey: string; + name: string; + run: IImageRunData; + step: number; + width: number; +} + +export interface IProcessedImageData extends IImageData { + seqKey?: string; + name?: string; + step?: number; + context?: object; +} + +export interface IImageRunData { + hash: string; + params: { [key: string]: unknown }; + props: { + archived: 0 | 1; + creation_time: number; + end_time: number; + experiment: string; + name: string; + tags: any[]; + }; + ranges: { + index_range: number[]; + record_range: number[]; + }; + traces: any[]; +} diff --git a/src/src/types/services/models/metrics/metricModel.d.ts b/src/src/types/services/models/metrics/metricModel.d.ts new file mode 100644 index 00000000..74d5aa64 --- /dev/null +++ b/src/src/types/services/models/metrics/metricModel.d.ts @@ -0,0 +1,21 @@ +import { IMetricTrace, IRun } from './runModel'; + +export interface IMetric { + run: IRun; + key: string; + name: string; + context: { [key: string]: unknown }; + data: { + values: Float64Array; + epochs: Float64Array; + steps: Float64Array; + timestamps: Float64Array; + xValues: number[]; + yValues: number[]; + }; + color: string; + dasharray: string; + x_axis_iters?: Float64Array; + x_axis_values?: Float64Array; + isHidden: boolean; +} diff --git a/src/src/types/services/models/metrics/metricsAppModel.d.ts b/src/src/types/services/models/metrics/metricsAppModel.d.ts new file mode 100644 index 00000000..0d088e51 --- /dev/null +++ b/src/src/types/services/models/metrics/metricsAppModel.d.ts @@ -0,0 +1,275 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { + IAppModelConfig, + IGroupingConfig, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { IImagesExploreAppConfig } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { ILine } from 'types/components/LineChart/LineChart'; +import { ITableRef } from 'types/components/Table/Table'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { + INotification, + ISyntaxErrorDetails, +} from 'types/components/NotificationContainer/NotificationContainer'; + +import { + AggregationAreaMethods, + AggregationLineMethods, +} from 'utils/aggregateGroupData'; +import { + AlignmentOptionsEnum, + CurveEnum, + ZoomEnum, + LegendsModeEnum, +} from 'utils/d3'; +import { IRequestProgress } from 'utils/app/setRequestProgress'; +import { SmoothingAlgorithmEnum } from 'utils/smoothingData'; + +import { IMetric } from './metricModel'; +import { IMetricTrace, IRun, ISequence } from './runModel'; + +export interface IMetricAppModelState { + refs: { + tableRef?: { current: ITableRef | null }; + chartPanelRef?: { current: IChartPanelRef | null }; + }; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + queryIsEmpty: boolean; + rawData: ISequence[]; + config: IAppModelConfig; + data: IMetricsCollection[]; + lineChartData: ILine[][]; + chartTitleData: IChartTitleData; + aggregatedData: IAggregatedData[]; + legendsData: LegendsDataType; + tooltip: ITooltip; + tableData: any[]; + tableColumns: ITableColumn[]; + sameValueColumns: string[]; + params: string[]; + notifyData: INotification[]; + groupingSelectOptions: IGroupingSelectOption[]; + sortOptions: IGroupingSelectOption[]; + selectFormData?: { + options: ISelectOption[]; + suggestions: string[]; + error: ISyntaxErrorDetails; + advancedError: ISyntaxErrorDetails; + }; + liveUpdateConfig: { + delay: number; + enabled: boolean; + }; + selectedRows?: any; +} + +export interface IChartTitleData { + [key: string]: IChartTitle; +} + +export interface IChartTitle { + [key: string]: string; +} + +export interface IAggregatedData extends IAggregationData { + key?: string; + color: string; + dasharray: string; + chartIndex?: number; +} + +export interface ITooltipContent { + groupConfig?: Record; + name?: string; + context?: Record; + runHash?: string; + caption?: string; + step?: number | string; + index?: number; + images_name?: string; + selectedProps?: Record; + run?: IRun; +} + +export interface ITooltipConfig { + appearance: TooltipAppearanceEnum; + display: boolean; + selectedFields: string[]; +} + +export interface ITooltip extends Partial { + content?: ITooltipContent; +} + +export interface LegendsConfig { + display: boolean; + mode: LegendsModeEnum; +} + +export interface IMetricsCollection { + key?: string; + groupKey?: string; + config: Record | null; + color: string | null; + dasharray: string | null; + chartIndex: number; + data: T[]; + aggregation?: IAggregationData; +} + +export interface IAggregationData { + area: { + min: { + xValues: number[]; + yValues: number[]; + } | null; + max: { + xValues: number[]; + yValues: number[]; + } | null; + stdDevValue?: { + xValues: number[]; + yValues: number[]; + }; + stdErrValue?: { + xValues: number[]; + yValues: number[]; + }; + }; + line: { + xValues: number[]; + yValues: number[]; + } | null; +} + +export interface IChartZoom { + active: boolean; + mode: ZoomEnum; + history: { + id: string; + xValues: [number, number]; + yValues: [number, number]; + }[]; +} + +export interface IAlignmentConfig { + metric?: string; + type: AlignmentOptionsEnum; +} + +export interface IAggregationConfig { + methods: { + area: AggregationAreaMethods; + line: AggregationLineMethods; + }; + isApplied: boolean; + isEnabled?: boolean; +} + +export interface IFocusedState { + active: boolean; + key: string | null; + xValue?: number | string | null; + yValue?: number | string | null; + chartIndex?: number | null; + visId?: string | null; +} + +export interface IMetricTableRowData { + key: string; + dasharray: metric.dasharray; + color: metric.color; + experiment: metric.run.experiment_name; + run: metric.run.name; + metric: metric.metric_name; + context: string[]; + value: string; + step: string; + epoch: string; + time: number | null; + [key: string]: any; +} + +export interface IOnGroupingSelectChangeParams { + groupName: GroupNameEnum; + list: string[]; +} + +export interface IOnGroupingModeChangeParams { + groupName: GroupNameEnum; + value: boolean; + options?: any[] | null; +} + +export interface IGetGroupingPersistIndex { + groupConfig: {}; + grouping: IGroupingConfig; + groupName: 'color' | 'stroke'; +} + +export interface IGroupingSelectOption { + label: string; + group: string; + value: string; + readonly?: boolean; +} + +export interface IAppData { + created_at?: string; + id?: string; + updated_at?: string; + type?: string; + state?: Partial; +} + +export interface IDashboardRequestBody { + name: string; + description: string; + app_id?: string; +} + +export interface IDashboardData { + app_id: string; + created_at: string; + id: string; + name: string; + description: string; + updated_at: string; +} + +export interface IAlignMetricsDataParams { + align_by: string; + runs: { + run_id: string; + traces: { + context: { [key: string]: unknown }; + name: string; + slice: number[]; + }[]; + }[]; +} + +export interface ISmoothing { + algorithm: SmoothingAlgorithmEnum; + factor: number; + curveInterpolation: CurveEnum; + isApplied: boolean; +} + +export interface LegendColumnDataType { + color?: string; + dasharray?: string; + chartIndex?: number; + value: string; +} + +export interface LegendsDataType { + [key: string]: Record; +} diff --git a/src/src/types/services/models/metrics/runModel.d.ts b/src/src/types/services/models/metrics/runModel.d.ts new file mode 100644 index 00000000..356dc4c5 --- /dev/null +++ b/src/src/types/services/models/metrics/runModel.d.ts @@ -0,0 +1,67 @@ +import { ITagProps } from 'types/pages/tags/Tags'; + +export interface IRun { + params: IRunParams; + props: { + experiment: { name: string; id: string; description: string } | null; + name: string; + creation_time: number; + end_time: number; + description: string; + active: boolean; + tags: ITagProps[]; + }; + created_at: number; + traces: { metric: T[] }; + hash: string; +} + +export interface ISequence { + params: IRunParams; + props: { + experiment: { name: string; id: string } | null; + name: string; + creation_time: number; + end_time: number; + description: string; + }; + created_at: number; + traces: T[]; + hash: string; +} + +export interface IParamTrace { + name: string; + context: { [key: string]: unknown }; + values: { + last: number | string; + min: number | string; + max: number | string; + first: number | string; + first_step?: number | string; + }; +} + +export interface IMetricTrace { + name: string; + description: string; + context: { [key: string]: unknown }; + slice: [number, number, number]; + values: ITraceData; + iters: ITraceData; + epochs: ITraceData; + timestamps: ITraceData; + x_axis_values: ITraceData | null; + x_axis_iters: ITraceData | null; +} + +export interface IRunParams { + [key: string]: any; +} + +export interface ITraceData { + blob: Uint8Array; + dtype: string; + shape: number; + type: string; +} diff --git a/src/src/types/services/models/model.d.ts b/src/src/types/services/models/model.d.ts new file mode 100644 index 00000000..a577586f --- /dev/null +++ b/src/src/types/services/models/model.d.ts @@ -0,0 +1,35 @@ +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; + +import { IGroupingSelectOption, ITooltip } from './metrics/metricsAppModel'; + +export interface State { + config?: Record; + table?: Record; + groupingSelectOptions?: IGroupingSelectOption[]; + tableColumns?: ITableColumn[] | Record[]; + data?: Record[]; + rawData?: Record[]; + notifyData?: INotification[]; + refs?: Record; + params?: Record; + sameValueColumns?: string[]; + selectedRows?: any; + tooltip?: ITooltip; + selectFormData?: any; +} + +export interface IModel> { + init: () => void; + destroy: () => void; + getState: () => StateType; + setState: (data: Partial | StateType | unknown | any) => void; + emit: ( + evt: string, + data: Partial | StateType | unknown | any, + ) => void; + subscribe: ( + evt: string, + fn: (data: StateType) => void, + ) => { unsubscribe: () => void }; +} diff --git a/src/src/types/services/models/notes/notes.d.ts b/src/src/types/services/models/notes/notes.d.ts new file mode 100644 index 00000000..40aea7d0 --- /dev/null +++ b/src/src/types/services/models/notes/notes.d.ts @@ -0,0 +1,22 @@ +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; + +export interface INoteReqBody { + name: string; + content: string; +} + +export interface INote { + name: string; + content: string; + id: number; + created_at: string; + updated_at?: string; +} + +export interface INotesAppModelState { + isLoading: boolean; + noteData: INote; + notifyData: INotification[]; +} + +export type INotesList = INote[]; diff --git a/src/src/types/services/models/params/paramsAppModel.d.ts b/src/src/types/services/models/params/paramsAppModel.d.ts new file mode 100644 index 00000000..9330c636 --- /dev/null +++ b/src/src/types/services/models/params/paramsAppModel.d.ts @@ -0,0 +1,65 @@ +import { IGroupingSelectOption } from 'metrics/metricsAppModel'; + +import { ITableRef } from 'components/Table/Table'; +import { IChartPanelRef } from 'components/ChartPanel/ChartPanel'; +import { INotification } from 'components/NotificationContainer/NotificationContainer'; + +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { ITableColumn } from 'pages/metrics/components/TableColumns/TableColumns'; + +import { IParamTrace, IRun } from 'types/services/models/metrics/runModel'; +import { + IAppModelConfig, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; + +import { IDimensionsType } from 'utils/d3/drawParallelAxes'; +import { IRequestProgress } from 'utils/app/setRequestProgress'; + +import { + IChartTitleData, + IMetricsCollection, + ITooltip, +} from '../metrics/metricsAppModel'; + +export interface IParamsAppModelState { + refs: { + tableRef?: { current: ITableRef | null }; + chartPanelRef?: { current: IChartPanelRef | null }; + }; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + queryIsEmpty: boolean; + rawData: IRun[]; + config: IAppModelConfig; + data: IMetricsCollection[]; + highPlotData: { dimensions: IDimensionsType; data: any }[]; + tooltip: ITooltip; + chartTitleData: IChartTitleData; + tableData: any[]; + tableColumns: ITableColumn[]; + sameValueColumns: string[]; + params: string[]; + notifyData: INotification[]; + groupingSelectOptions: IGroupingSelectOption[]; + metricsColumns: any; + selectFormData: { options: ISelectOption[]; suggestions: string[] }; + selectedRows?: any; + liveUpdateConfig?: { + delay: number; + enabled: boolean; + }; +} + +export interface IParam { + run: IRun; + isHidden: boolean; + color: string; + key: string; + dasharray: string; + metricsValues?: Record< + string, + Record<'last' | 'min' | 'max' | 'first', number | string> + >; +} diff --git a/src/src/types/services/models/projects/projectsModel.d.ts b/src/src/types/services/models/projects/projectsModel.d.ts new file mode 100644 index 00000000..8ef5c487 --- /dev/null +++ b/src/src/types/services/models/projects/projectsModel.d.ts @@ -0,0 +1,30 @@ +export interface IProject { + branches?: string[]; + description?: string; + name?: string; + path?: string; + telemetry_enabled?: string | boolean; +} + +export interface IProjectParamsMetrics { + metric: { [key: string]: { [key: string]: string }[] }; + images: { [key: string]: { [key: string]: string }[] }; + params: { [key: string]: any }; +} + +export interface IProjectsModelState { + project?: IProject; + params?: IProjectParamsMetrics['params']; + images?: IProjectParamsMetrics['params']; + metrics?: IProjectParamsMetrics['metric']; + pinnedSequences: IPinnedSequence[]; +} + +export interface IPinnedSequence { + name: string; + context: { [key: string]: unknown }; +} + +export interface IPinnedSequencesResData { + sequences: IPinnedSequence[]; +} diff --git a/src/src/types/services/models/runs/runsAppModel.d.ts b/src/src/types/services/models/runs/runsAppModel.d.ts new file mode 100644 index 00000000..d5169043 --- /dev/null +++ b/src/src/types/services/models/runs/runsAppModel.d.ts @@ -0,0 +1,14 @@ +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { IRequestProgress } from 'utils/app/setRequestProgress'; + +export interface IRunsAppModelState { + selectedRows?: any; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + liveUpdateConfig?: { + delay: number; + enabled: boolean; + }; + [key: string]: any; +} diff --git a/src/src/types/services/models/scatter/scatterAppModel.d.ts b/src/src/types/services/models/scatter/scatterAppModel.d.ts new file mode 100644 index 00000000..e0721d46 --- /dev/null +++ b/src/src/types/services/models/scatter/scatterAppModel.d.ts @@ -0,0 +1,64 @@ +import { IPoint } from 'components/ScatterPlot'; + +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { ITableRef } from 'types/components/Table/Table'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { + IAppModelConfig, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { IDimensionType } from 'types/utils/d3/drawParallelAxes'; +import { IParam } from 'types/services/models/params/paramsAppModel'; +import { + IChartTitleData, + IGroupingSelectOption, + IMetricsCollection, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; + +import { IRequestProgress } from 'utils/app/setRequestProgress'; +import { TrendlineTypeEnum } from 'utils/d3'; + +import { IMetricTrace, IRun } from './runModel'; + +export interface IScatterAppModelState { + refs: { + tableRef?: { current: ITableRef | null }; + chartPanelRef?: { current: IChartPanelRef | null }; + }; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + queryIsEmpty: boolean; + rawData: IRun[]; + config: IAppModelConfig; + data: IMetricsCollection[]; + chartData: IScatterData[]; + tooltip: ITooltip; + chartTitleData: IChartTitleData; + tableData: any[]; + tableColumns: ITableColumn[]; + sameValueColumns: string[]; + selectedRows: { [key: string]: any }; + params: string[]; + notifyData: INotification[]; + groupingSelectOptions: IGroupingSelectOption[]; + selectFormData: { options: ISelectOption[]; suggestions: string[] }; + liveUpdateConfig?: { + delay: number; + enabled: boolean; + }; +} + +export interface IScatterData { + dimensions: IDimensionType; + data: IPoint[]; +} + +export interface ITrendlineOptions { + type: TrendlineTypeEnum; + bandwidth: number; + isApplied: boolean; +} diff --git a/src/src/types/services/services.d.ts b/src/src/types/services/services.d.ts new file mode 100644 index 00000000..4da4e550 --- /dev/null +++ b/src/src/types/services/services.d.ts @@ -0,0 +1,9 @@ +export interface IApiRequest { + call: (detail?: any) => Promise; + abort: () => void; +} + +export interface IApiRequestRef { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; +} diff --git a/src/src/types/utils/aggregateGroupData.d.ts b/src/src/types/utils/aggregateGroupData.d.ts new file mode 100644 index 00000000..e18e52f4 --- /dev/null +++ b/src/src/types/utils/aggregateGroupData.d.ts @@ -0,0 +1,20 @@ +import { IMetricsCollection } from 'types/services/models/metrics/metricsAppModel'; +import { IMetric } from 'types/services/models/metrics/metricModel'; + +import { ScaleEnum } from 'utils/d3'; +import { + AggregationAreaMethods, + AggregationLineMethods, +} from 'utils/aggregateGroupData'; + +export interface IAggregateGroupDataParams { + groupData: IMetricsCollection[]; + methods: { + area: AggregationAreaMethods; + line: AggregationLineMethods; + }; + scale: { + xAxis: ScaleEnum; + yAxis: ScaleEnum; + }; +} diff --git a/src/src/types/utils/common.d.ts b/src/src/types/utils/common.d.ts new file mode 100644 index 00000000..4d728055 --- /dev/null +++ b/src/src/types/utils/common.d.ts @@ -0,0 +1 @@ +export type Override = Omit & T2; diff --git a/src/src/types/utils/d3/clearArea.d.ts b/src/src/types/utils/d3/clearArea.d.ts new file mode 100644 index 00000000..07cb50db --- /dev/null +++ b/src/src/types/utils/d3/clearArea.d.ts @@ -0,0 +1,5 @@ +import React from 'react'; + +export interface IClearAreaProps { + visAreaRef: React.MutableRefObject<>; +} diff --git a/src/src/types/utils/d3/drawArea.d.ts b/src/src/types/utils/d3/drawArea.d.ts new file mode 100644 index 00000000..f2c168a2 --- /dev/null +++ b/src/src/types/utils/d3/drawArea.d.ts @@ -0,0 +1,20 @@ +import React from 'react'; + +import { IChartTitle } from 'types/services/models/metrics/metricsAppModel'; + +export interface IDrawAreaArgs { + index?: number; + id: string; + nameKey: string; + parentRef: React.MutableRefObject<>; + visAreaRef: React.MutableRefObject<>; + svgNodeRef: React.MutableRefObject<>; + bgRectNodeRef: React.MutableRefObject<>; + visBoxRef: React.MutableRefObject<>; + plotNodeRef: React.MutableRefObject<>; + axesNodeRef: React.MutableRefObject<>; + plotBoxRef: React.MutableRefObject<>; + linesNodeRef: React.MutableRefObject<>; + attributesNodeRef: React.MutableRefObject<>; + chartTitle?: IChartTitle; +} diff --git a/src/src/types/utils/d3/drawAxes.d.ts b/src/src/types/utils/d3/drawAxes.d.ts new file mode 100644 index 00000000..41f8564c --- /dev/null +++ b/src/src/types/utils/d3/drawAxes.d.ts @@ -0,0 +1,20 @@ +import React from 'react'; + +import { IAlignmentConfig } from 'types/services/models/metrics/metricsAppModel'; +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; + +import { IAxisScale } from './getAxisScale'; + +export interface IDrawAxesArgs { + svgNodeRef: React.MutableRefObject<>; + plotBoxRef: React.MutableRefObject<>; + axesNodeRef: React.MutableRefObject<>; + axesRef: React.MutableRefObject<>; + xScale: IAxisScale; + yScale: IAxisScale; + visBoxRef: React.MutableRefObject<>; + alignmentConfig?: IAlignmentConfig; + axesScaleType: IAxesScaleState; + humanizerConfigRef: React.MutableRefObject<{}>; + drawBgTickLines?: { x?: boolean; y?: boolean }; +} diff --git a/src/src/types/utils/d3/drawBrush.d.ts b/src/src/types/utils/d3/drawBrush.d.ts new file mode 100644 index 00000000..b76bb772 --- /dev/null +++ b/src/src/types/utils/d3/drawBrush.d.ts @@ -0,0 +1,23 @@ +import React from 'react'; + +import { IChartZoom } from 'types/services/models/metrics/metricsAppModel'; +import { IAttributesRef } from 'types/components/LineChart/LineChart'; +import { IAxesScaleRange } from 'types/components/AxesPropsPopover/AxesPropsPopover'; + +import { IGetAxesScaleProps } from './getAxisScale'; + +export interface IDrawBrushArgs extends IGetAxesScaleProps { + id: string; + plotBoxRef: React.MutableRefObject<>; + plotNodeRef: React.MutableRefObject<>; + visBoxRef: React.MutableRefObject<>; + axesRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject; + linesRef: React.MutableRefObject<>; + svgNodeRef: React.MutableRefObject<>; + zoom?: IChartZoom; + onZoomChange?: (zoom: Partial) => void; + readOnly: boolean; + axesScaleRange?: IAxesScaleRange; + unableToDrawConditions: Array<{ condition: boolean; text?: string }>; +} diff --git a/src/src/types/utils/d3/drawHoverAttributes.d.ts b/src/src/types/utils/d3/drawHoverAttributes.d.ts new file mode 100644 index 00000000..84dfae07 --- /dev/null +++ b/src/src/types/utils/d3/drawHoverAttributes.d.ts @@ -0,0 +1,98 @@ +import React from 'react'; + +import { IPoint } from 'components/ScatterPlot'; + +import { ILine, IAttributesRef } from 'types/components/LineChart/LineChart'; +import { + IAggregationConfig, + IAlignmentConfig, + IFocusedState, +} from 'types/services/models/metrics/metricsAppModel'; + +import { ScaleEnum, HighlightEnum } from 'utils/d3'; + +import { IAxisScale } from './getAxisScale'; +import { IProcessedData } from './processLineChartData'; + +export type HoverAttrData = ILine | IPoint; + +export interface IDrawHoverAttributesArgs { + index?: number; + id: string; + nameKey: string; + data: HoverAttrData[]; + processedData?: IProcessedData[]; + axesScaleType: { xAxis: ScaleEnum; yAxis: ScaleEnum }; + visAreaRef: React.MutableRefObject<>; + attributesNodeRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject; + plotBoxRef: React.MutableRefObject<>; + visBoxRef: React.MutableRefObject<>; + svgNodeRef: React.MutableRefObject<>; + bgRectNodeRef: React.MutableRefObject<>; + xAxisLabelNodeRef?: React.MutableRefObject<>; + yAxisLabelNodeRef?: React.MutableRefObject<>; + linesNodeRef: React.MutableRefObject<>; + syncHoverState?: (params: ISyncHoverStateParams) => void; + highlightedNodeRef: React.MutableRefObject<>; + highlightMode?: HighlightEnum; + aggregationConfig?: IAggregationConfig; + alignmentConfig?: IAlignmentConfig; + drawAxisLines?: { x: Boolean; y: Boolean }; + drawAxisLabels?: { x: Boolean; y: Boolean }; +} + +export interface ISyncHoverStateArgs { + activePoint: IActivePoint | null; + dataSelector?: string; + focusedState?: IFocusedState; +} + +export type IAxisLineData = { x1: number; y1: number; x2: number; y2: number }; + +export interface IGetCoordinates { + mouseX: number; + mouseY: number; +} + +export interface IGetCoordinatesArgs { + mouse: [number, number]; + margin: { left: number; top: number }; + xScale: IAxisScale; + yScale: IAxisScale; +} + +export interface INearestCircle { + x: number; + y: number; + key: string; + color: string; + inProgress?: boolean; +} + +export interface IActivePoint { + key: string; + xValue: number | string; + yValue: number | string; + xPos: number; + yPos: number; + chartIndex: number; + visId: string; + inProgress?: boolean; + pointRect: IActivePointRect | null; + rect: IActiveElementRect; +} + +export interface IActivePointRect { + top: number; + bottom: number; + left: number; + right: number; +} + +export interface IActiveElementRect { + top: number; + bottom: number; + left: number; + right: number; +} diff --git a/src/src/types/utils/d3/drawLines.d.ts b/src/src/types/utils/d3/drawLines.d.ts new file mode 100644 index 00000000..5907ae2d --- /dev/null +++ b/src/src/types/utils/d3/drawLines.d.ts @@ -0,0 +1,23 @@ +import React from 'react'; + +import { IAggregationConfig } from 'types/services/models/metrics/metricsAppModel'; + +import { CurveEnum, HighlightEnum } from 'utils/d3'; + +import { IDrawAxesArgs } from './drawAxes'; +import { IProcessedAggrData, IProcessedData } from './processLineChartData'; + +export interface IDrawLinesArgs { + id: string; + nameKey: string; + linesRef: React.MutableRefObject<>; + linesNodeRef: React.MutableRefObject<>; + processedData: IProcessedData[]; + xScale: IDrawAxesArgs['xScale']; + yScale: IDrawAxesArgs['yScale']; + highlightMode: HighlightEnum; + curveInterpolation: CurveEnum; + aggregationConfig?: IAggregationConfig; + processedAggrData?: IProcessedAggrData[]; + readOnly?: boolean; +} diff --git a/src/src/types/utils/d3/drawParallelAxes.d.ts b/src/src/types/utils/d3/drawParallelAxes.d.ts new file mode 100644 index 00000000..3483522b --- /dev/null +++ b/src/src/types/utils/d3/drawParallelAxes.d.ts @@ -0,0 +1,29 @@ +import React from 'react'; + +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { ScaleEnum } from 'utils/d3'; + +export interface IDimensionType { + scaleType: ScaleEnum; + domainData: number[] | string[]; + displayName: string; + dimensionType: string; +} + +export interface YScaleType { + [key: string]: IAxisScale; +} + +export interface IDimensionsType { + [key: string]: IDimensionType; +} + +export interface IDrawParallelAxesProps { + axesNodeRef: React.MutableRefObject<>; + visBoxRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject<>; + axesRef: React.MutableRefObject<>; + dimensions: IDimensionsType; + plotBoxRef: React.MutableRefObject<>; +} diff --git a/src/src/types/utils/d3/drawParallelAxesBrush.d.ts b/src/src/types/utils/d3/drawParallelAxesBrush.d.ts new file mode 100644 index 00000000..06aa1d67 --- /dev/null +++ b/src/src/types/utils/d3/drawParallelAxesBrush.d.ts @@ -0,0 +1,37 @@ +import React from 'react'; + +import { ILineDataType } from './drawParallelLines'; +import { IDimensionsType } from './drawParallelAxes'; + +export interface IDrawParallelAxesBrushBrushArgs { + plotBoxRef: React.MutableRefObject<>; + plotNodeRef: React.MutableRefObject<>; + brushRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject<>; + visBoxRef: React.MutableRefObject<>; + linesRef: React.MutableRefObject<>; + onAxisBrushExtentChange: ( + key: string, + extent: [number, number] | [string, string] | null, + chartIndex: number, + ) => void; + brushExtents: { + [key: string]: { + [key: string]: [number, number] | [string, string]; + }; + }; + data: ILineDataType[]; + dimensions: IDimensionsType; + index: number; +} + +export type DomainsDataType = { + [key: string]: number[] | string[]; +}; + +export interface IFilterDataByBrushedScaleProps { + line: ILineDataType; + domainsData: DomainsDataType; + dimensions: IDimensionsType; + attributesRef: React.MutableRefObject<>; +} diff --git a/src/src/types/utils/d3/drawParallelColorIndicator.d.ts b/src/src/types/utils/d3/drawParallelColorIndicator.d.ts new file mode 100644 index 00000000..2a9efb17 --- /dev/null +++ b/src/src/types/utils/d3/drawParallelColorIndicator.d.ts @@ -0,0 +1,5 @@ +export interface IDrawParallelColorIndicator { + index: number; + plotBoxRef: React.MutableRefObject<>; + plotNodeRef: React.MutableRefObject<>; +} diff --git a/src/src/types/utils/d3/drawParallelHoverAttributes.d.ts b/src/src/types/utils/d3/drawParallelHoverAttributes.d.ts new file mode 100644 index 00000000..9f7928b1 --- /dev/null +++ b/src/src/types/utils/d3/drawParallelHoverAttributes.d.ts @@ -0,0 +1,69 @@ +import React from 'react'; + +import { IFocusedState } from 'types/services/models/metrics/metricsAppModel'; + +import { IAxisScale } from './getAxisScale'; +import { ILineValuesDataType } from './drawParallelLines'; +import { IDimensionsType } from './drawParallelAxes'; +import { + ISyncHoverStateParams, + INearestCircle, + IActivePoint, +} from './drawHoverAttributes'; + +export interface IDrawParallelHoverAttributesArgs { + index: number; + id: string; + nameKey: string; + dimensions: IDimensionsType; + visAreaRef: React.MutableRefObject<>; + linesRef: React.MutableRefObject<>; + visBoxRef: React.MutableRefObject<>; + bgRectNodeRef: React.MutableRefObject<>; + axesNodeRef: React.MutableRefObject<>; + svgNodeRef: React.MutableRefObject<>; + attributesNodeRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject<{ + xScale?: IAxisScale; + yScale?: IAxisScale; + x: number; + y: number; + updateScales?: (xScale: IAxisScale, yScale: IAxisScale) => void; + updateHoverAttributes?: (mousePosition: [number, number]) => void; + yColorIndicatorScale: d3.ScaleSequential; + mousePosition: number[]; + activePoint?: IActivePoint; + lineKey?: string; + focusedState?: IFocusedState; + updateFocusedChart: (params: IUpdateParallelFocusedChartProps) => void; + clearHoverAttributes: () => void; + setActiveLineAndCircle?: ( + lineKey: string, + focusedStateActive: boolean, + force: boolean, + ) => void; + }>; + syncHoverState: (params: ISyncHoverStateParams) => void; + linesNodeRef: React.MutableRefObject<>; + highlightedNodeRef: React.MutableRefObject<>; + isVisibleColorIndicator: boolean; +} + +export interface IParallelClosestCircle { + key: string; + r: number | null; + x: number; + y: number; + values: ILineValuesDataType; + color: string; +} +export interface IUpdateParallelFocusedChartProps { + mousePos?: [number, number]; + focusedStateActive?: boolean; + force?: boolean; +} + +export interface IParallelNearestCircle extends INearestCircle { + lastYScalePos?: number; + values?: ILineValuesDataType; +} diff --git a/src/src/types/utils/d3/drawParallelLines.d.ts b/src/src/types/utils/d3/drawParallelLines.d.ts new file mode 100644 index 00000000..8dee15de --- /dev/null +++ b/src/src/types/utils/d3/drawParallelLines.d.ts @@ -0,0 +1,70 @@ +import React from 'react'; + +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { CurveEnum } from 'utils/d3'; + +import { IDimensionsType } from './drawParallelAxes'; + +interface ILineValuesDataType { + [key: string]: number | string | null; +} + +export interface ILineDataType { + values: ILineValuesDataType; + key: string; + color: string; + dasharray: string; +} + +export type InitialPathDataType = { + dimensionList: string[]; + lineData: ILineValuesDataType; + isEmpty: boolean; + isDotted: boolean; +}; + +export interface IDrawParallelLinesArgs { + index: number; + nameKey: string; + linesNodeRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject<>; + attributesNodeRef: React.MutableRefObject<>; + curveInterpolation: CurveEnum; + isVisibleColorIndicator: boolean; + linesRef: React.MutableRefObject<>; + dimensions: IDimensionsType; + data: ILineDataType[]; +} + +export interface IDrawParallelLineArgs { + index: number; + nameKey: string; + linesNodeRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject<>; + dasharray: string; + dimensionList: string[]; + curveInterpolation: CurveEnum; + lineData: ILineValuesDataType; + isDotted: boolean; + key: number | string; + color: string; +} + +export interface ILineRendererArgs { + index: number; + nameKey: string; + linesNodeRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject<>; + curveInterpolation: CurveEnum; + keysOfDimensions: string[]; + isVisibleColorIndicator: boolean; + data: ILineDataType[]; +} + +export interface IGetColorIndicatorScaleValueArgs { + line: ILineValuesDataType; + keysOfDimensions: string[]; + yColorIndicatorScale: d3.ScaleSequential; + yScale: IAxisScale; +} diff --git a/src/src/types/utils/d3/drawPoints.d.ts b/src/src/types/utils/d3/drawPoints.d.ts new file mode 100644 index 00000000..18d7255e --- /dev/null +++ b/src/src/types/utils/d3/drawPoints.d.ts @@ -0,0 +1,15 @@ +import React from 'react'; + +import { IPoint } from 'components/ScatterPlot'; + +import { IAxisScale } from './getAxisScale'; + +export interface IDrawPointsArgs { + index: number; + nameKey: string; + pointsRef: React.MutableRefObject<>; + pointsNodeRef: React.MutableRefObject<>; + data: IPoint[]; + xScale: IAxisScale; + yScale: IAxisScale; +} diff --git a/src/src/types/utils/d3/getAxisScale.d.ts b/src/src/types/utils/d3/getAxisScale.d.ts new file mode 100644 index 00000000..03a3a07c --- /dev/null +++ b/src/src/types/utils/d3/getAxisScale.d.ts @@ -0,0 +1,21 @@ +import * as d3 from 'd3'; +import React from 'react'; + +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; + +import { ScaleEnum } from 'utils/d3'; + +export interface IGetAxesScaleProps { + visBoxRef: React.MutableRefObject<>; + axesScaleType: IAxesScaleState; + min: { x: number; y: number }; + max: { x: number; y: number }; +} + +export type IAxisScale = d3.ScaleLogarithmic | d3.ScaleLinear | d3.ScalePoint; + +export interface IGetAxisScaleProps { + scaleType: ScaleEnum; + domainData: string[] | number[]; + rangeData: number[]; +} diff --git a/src/src/types/utils/d3/processLineChartData.d.ts b/src/src/types/utils/d3/processLineChartData.d.ts new file mode 100644 index 00000000..5a89fd1f --- /dev/null +++ b/src/src/types/utils/d3/processLineChartData.d.ts @@ -0,0 +1,66 @@ +import React from 'react'; + +import { IPoint } from 'components/ScatterPlot'; + +import { Override } from 'types/utils/common'; +import { + IAggregatedData, + IAggregationConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { ILine } from 'types/components/LineChart/LineChart'; +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { IAxesScaleRange } from 'types/components/AxesPropsPopover/AxesPropsPopover'; + +export interface IProcessedData extends ILine, IPoint { + color: string; + dasharray: string; + data: [number, number][]; +} + +export type IProcessedAggrData = Override< + IAggregatedData, + { + area: [number, number, number, number][]; + line: [number, number][]; + } +>; + +export interface IProcessLineChartData { + min: { x: number; y: number }; + max: { x: number; y: number }; + processedData: IProcessedData[]; + processedAggrData?: IProcessedAggrData[]; + allXValues: number[]; + allYValues: number[]; +} + +export interface IProcessLineChartDataArgs { + data: ILine[]; + ignoreOutliers?: boolean; + visBoxRef: React.MutableRefObject; + attributesRef: React.MutableRefObject; + axesScaleType: IAxesScaleState; + axesScaleRange?: IAxesScaleRange; + aggregatedData?: IAggregatedData[]; + aggregationConfig?: IAggregationConfig; + unableToDrawConditions: Array<{ condition: boolean; text?: string }>; +} + +export interface ICalculateLineValues { + values: [number, number][]; + xMin: number; + xMax: number; + minEdge: number; + maxEdge: number; + axesScaleType: IAxesScaleState; +} + +export interface IGetValueInLine { + x1: number; + x2: number; + y1: number; + y2: number; + x?: number; + y?: number; + axesScaleType: IAxesScaleState; +} diff --git a/src/src/types/utils/formatSystemMetricName.d.ts b/src/src/types/utils/formatSystemMetricName.d.ts new file mode 100644 index 00000000..e28f266b --- /dev/null +++ b/src/src/types/utils/formatSystemMetricName.d.ts @@ -0,0 +1,10 @@ +export type systemMetricsDictType = { + __system__cpu: string; + __system__p_memory_percent: string; + __system__memory_percent: string; + __system__disk_percent: string; + __system__gpu: string; + __system__gpu_memory_percent: string; + __system__gpu_power_watts: string; + __system__gpu_temp: string; +}; diff --git a/src/src/types/utils/getImageBoxSize.d.ts b/src/src/types/utils/getImageBoxSize.d.ts new file mode 100644 index 00000000..7e475d5f --- /dev/null +++ b/src/src/types/utils/getImageBoxSize.d.ts @@ -0,0 +1,7 @@ +export interface IGetImageBoxSizeProps { + data: { [key: string]: any }; + index?: number; + additionalProperties: { [key: string]: any }; + wrapperOffsetWidth: number; + wrapperOffsetHeight?: number; +} diff --git a/src/src/types/utils/getImageMediaListHeight.d.ts b/src/src/types/utils/getImageMediaListHeight.d.ts new file mode 100644 index 00000000..ae92f2bf --- /dev/null +++ b/src/src/types/utils/getImageMediaListHeight.d.ts @@ -0,0 +1,10 @@ +import { MediaItemAlignmentEnum } from 'config/enums/imageEnums'; + +export interface IGetImageMediaListHeightProps { + alignmentType: MediaItemAlignmentEnum; + maxHeight: number; + maxWidth: number; + wrapperOffsetWidth: number; + mediaItemSize: number; + mediaItemHeight: number; +} diff --git a/src/src/types/utils/getImageMediaSetSize.d.ts b/src/src/types/utils/getImageMediaSetSize.d.ts new file mode 100644 index 00000000..36789506 --- /dev/null +++ b/src/src/types/utils/getImageMediaSetSize.d.ts @@ -0,0 +1,11 @@ +import { MediaItemAlignmentEnum } from 'config/enums/imageEnums'; + +export interface IGetImageMediaSetSizeProps { + maxHeight: number; + maxWidth: number; + mediaItemHeight: number; + alignmentType: MediaItemAlignmentEnum; + wrapperOffsetWidth: number; + mediaItemSize: number; + stacking: boolean; +} diff --git a/src/src/utils/JsonToCSV.ts b/src/src/utils/JsonToCSV.ts new file mode 100644 index 00000000..2ccb63a4 --- /dev/null +++ b/src/src/utils/JsonToCSV.ts @@ -0,0 +1,27 @@ +function JsonToCSV(objArray: { [key: string]: string }[] | string): string { + // If the `objArray` is stringified array we need to parse to regular array + const array = Array.isArray(objArray) ? objArray : JSON.parse(objArray); + let str = ''; + let line = ''; + // header + for (let index in array[0]) { + let value = index + ''; + line += '"' + value.replace(/"/g, '""') + '",'; + } + line = line.slice(0, -1); + str += line + '\r\n'; + + // data + for (let i = 0; i < array.length; i++) { + let line = ''; + for (let index in array[i]) { + const value = array[i][index] + ''; + line += '"' + value.replace(/"/g, '""') + '",'; + } + line = line.slice(0, -1); + str += line + '\r\n'; + } + return str; +} + +export default JsonToCSV; diff --git a/src/src/utils/aggregateGroupData.ts b/src/src/utils/aggregateGroupData.ts new file mode 100644 index 00000000..5efd7211 --- /dev/null +++ b/src/src/utils/aggregateGroupData.ts @@ -0,0 +1,255 @@ +import _ from 'lodash-es'; + +import { + IAggregationData, + IMetricsCollection, +} from 'types/services/models/metrics/metricsAppModel'; +import { IAggregateGroupDataParams } from 'types/utils/aggregateGroupData'; +import { IMetric } from 'types/services/models/metrics/metricModel'; + +import { ScaleEnum } from './d3'; +import { getValuesMedian } from './getValuesMedian'; + +export enum AggregationAreaMethods { + NONE = 0, + MIN_MAX = 1, + STD_DEV = 2, + STD_ERR = 3, + CONF_INT = 4, +} + +export enum AggregationLineMethods { + MEAN = 0, + MEDIAN = 1, + MIN = 2, + MAX = 3, +} + +export function aggregateGroupData({ + groupData, + methods, + scale = { xAxis: ScaleEnum.Linear, yAxis: ScaleEnum.Linear }, +}: IAggregateGroupDataParams): IMetricsCollection[] { + const groupsWithAggregation = []; + + const groupedByChart = _.groupBy(groupData, 'chartIndex'); + + const xValuesPerChart: { [key: string]: number[] } = {}; + + // Get all X axis values for each chart + for (let chartIndex in groupedByChart) { + const groupsData = _.map(groupedByChart[chartIndex], (group) => group.data); + xValuesPerChart[chartIndex] = _.uniq( + groupsData + .flat() + .map((item) => item.data.xValues) + .flat() + .sort((a, b) => a - b), + ); + } + + for (let group of groupData) { + const chartIndex = group.chartIndex; + const chartXValues = xValuesPerChart[chartIndex]; + const yValuesPerX: { [key: string]: number[] } = {}; + const data = group.data; + + for (let i = 0; i < data.length; i++) { + if (!data[i].isHidden) { + const trace = data[i].data; + + // Calculate line value (y) for each X axis value in chart + // Even for case when line does not have corresponding x value + for (let j = 0; j < trace.xValues.length - 1; j++) { + const step = trace.xValues[j]; + const point = trace.yValues[j]; + const nextStep = trace.xValues[j + 1]; + const nextPoint = trace.yValues[j + 1]; + + const stepsInBetween = nextStep - step; + + for (let value of chartXValues.slice( + chartXValues.indexOf(step), + chartXValues.indexOf(nextStep) + 1, + )) { + let y; + let x0 = value - step; + let x2 = stepsInBetween; + let point1 = point; + let point2 = nextPoint; + + if (x0 === 0) { + y = point1; + } else if (x0 === x2) { + y = point2; + } else { + if (scale.xAxis === ScaleEnum.Log) { + x0 = Math.log(value) - Math.log(step); + x2 = Math.log(nextStep) - Math.log(step); + } + if (scale.yAxis === ScaleEnum.Log) { + point1 = Math.log(point1); + point2 = Math.log(point2); + } + if (point1 > point2) { + y = point1 - ((point1 - point2) * x0) / x2; + } else { + y = ((point2 - point1) * x0) / x2 + point1; + } + if (scale.yAxis === ScaleEnum.Log) { + y = Math.exp(y); + } + } + if ( + (scale.xAxis === ScaleEnum.Linear || + (value !== 0 && step !== 0 && nextStep !== 0)) && + (scale.yAxis === ScaleEnum.Linear || y > 0) + ) { + if (yValuesPerX.hasOwnProperty(value)) { + if (!yValuesPerX[value].includes(y)) { + yValuesPerX[value].push(y); + } + } else { + yValuesPerX[value] = [y]; + } + } + } + } + } + } + + const xValues = Object.keys(yValuesPerX) + .map((x) => +x) + .sort((a: number, b: number) => a - b); + + const area: IAggregationData['area'] = { + min: null, + max: null, + }; + + let line: IAggregationData['line'] = null; + + switch (methods.line) { + case AggregationLineMethods.MIN: + line = { + xValues: xValues, + yValues: xValues.map((x) => _.min(yValuesPerX[x])) as number[], + }; + break; + case AggregationLineMethods.MAX: + line = { + xValues: xValues, + yValues: xValues.map((x) => _.max(yValuesPerX[x])) as number[], + }; + break; + case AggregationLineMethods.MEAN: + line = { + xValues: xValues, + yValues: xValues.map( + (x) => _.sum(yValuesPerX[x]) / yValuesPerX[x].length, + ) as number[], + }; + break; + case AggregationLineMethods.MEDIAN: + line = { + xValues: xValues, + yValues: xValues.map((x) => + getValuesMedian(yValuesPerX[x]), + ) as number[], + }; + break; + default: + } + + switch (methods.area) { + case AggregationAreaMethods.MIN_MAX: + area.min = { + xValues: xValues, + yValues: xValues.map((x) => _.min(yValuesPerX[x])) as number[], + }; + area.max = { + xValues: xValues, + yValues: xValues.map((x) => _.max(yValuesPerX[x])) as number[], + }; + break; + case AggregationAreaMethods.STD_DEV: + case AggregationAreaMethods.STD_ERR: + case AggregationAreaMethods.CONF_INT: + let stepValues: { + [key: number]: { + min: number; + max: number; + stdDevValue?: number; + stdErrValue?: number; + }; + } = {}; + xValues.forEach((x) => { + const mean = _.sum(yValuesPerX[x]) / yValuesPerX[x].length; + + const distancesFromAvg = yValuesPerX[x].map((value) => + Math.pow(mean - value, 2), + ); + const sum = _.sum(distancesFromAvg); + const stdDevValue = Math.sqrt(sum / (yValuesPerX[x].length - 1 || 1)); + + if (methods.area === AggregationAreaMethods.STD_DEV) { + stepValues[x] = { + min: mean - stdDevValue, + max: mean + stdDevValue, + stdDevValue, + }; + } else if (methods.area === AggregationAreaMethods.STD_ERR) { + const stdErrValue = stdDevValue / Math.sqrt(yValuesPerX[x].length); + stepValues[x] = { + min: mean - stdErrValue, + max: mean + stdErrValue, + stdErrValue, + }; + } else if (methods.area === AggregationAreaMethods.CONF_INT) { + const zValue = 1.96; // for 95% confidence level + const CI = + zValue * (stdDevValue / Math.sqrt(yValuesPerX[x].length)); + stepValues[x] = { + min: mean - CI, + max: mean + CI, + }; + } + }); + + area.min = { + xValues: xValues, + yValues: xValues.map((x) => stepValues[x].min) as number[], + }; + area.max = { + xValues: xValues, + yValues: xValues.map((x) => stepValues[x].max) as number[], + }; + + if (methods.area === AggregationAreaMethods.STD_DEV) { + area.stdDevValue = { + xValues: xValues, + yValues: xValues.map((x) => stepValues[x].stdDevValue) as number[], + }; + } + + if (methods.area === AggregationAreaMethods.STD_ERR) { + area.stdErrValue = { + xValues: xValues, + yValues: xValues.map((x) => stepValues[x].stdErrValue) as number[], + }; + } + break; + default: + } + + groupsWithAggregation.push({ + ...group, + aggregation: { + line, + area, + }, + }); + } + + return groupsWithAggregation; +} diff --git a/src/src/utils/alphabeticalSortComparator.ts b/src/src/utils/alphabeticalSortComparator.ts new file mode 100644 index 00000000..a2d354bd --- /dev/null +++ b/src/src/utils/alphabeticalSortComparator.ts @@ -0,0 +1,53 @@ +/** + * alphabeticalSortComparator options + */ +type Options = { + /** + * the key get the value from the object + */ + orderBy: string; + /** + * increasing or decreasing + */ + order?: 'asc' | 'desc'; + /** + * once you need an additional case, i.e. you have a pref. + * string which need to always be at the beginning of the list + */ + additionalCompare?: (str1: string, str2: string) => 1 | -1 | 0 | null; +}; + +/** + * alphabeticalSortComparator + * @Closure return actual compare function to pass to Array.sort asa parameter + * @param {Options} options - options + */ +function alphabeticalSortComparator>( + options: Options, +): (a: T, b: T) => number { + const { orderBy, order = 'asc' } = options; + return (a: T, b: T) => { + const str1 = a[orderBy].toUpperCase(); + const str2 = b[orderBy].toUpperCase(); + + if (options.additionalCompare) { + const result = options.additionalCompare(str1, str2); + if (result !== null) { + // return the result based on additional compare logic, and don't continue the base logic + return result; + } + // otherwise continue the base logic + } + + if (str1 < str2) { + return order === 'asc' ? -1 : 1; + } + if (str1 > str2) { + return order === 'asc' ? 1 : -1; + } + + return 0; + }; +} + +export default alphabeticalSortComparator; diff --git a/src/src/utils/app/alignMetricData.ts b/src/src/utils/app/alignMetricData.ts new file mode 100644 index 00000000..89129a17 --- /dev/null +++ b/src/src/utils/app/alignMetricData.ts @@ -0,0 +1,226 @@ +import { AlignmentNotificationsEnum } from 'config/notification-messages/notificationMessages'; + +import { IMetricsCollection } from 'types/services/models/metrics/metricsAppModel'; +import { IMetric } from 'types/services/models/metrics/metricModel'; +import { IModel } from 'types/services/models/model'; +import { IAppModelState } from 'types/services/models/explorer/createAppModel'; + +import { filterArrayByIndexes } from '../filterArrayByIndexes'; +import { AlignmentOptionsEnum } from '../d3'; + +import sortDependingArrays from './sortDependingArrays'; +import onNotificationAdd from './onNotificationAdd'; + +export function alignByStep( + data: IMetricsCollection[], +): IMetricsCollection[] { + for (let i = 0; i < data.length; i++) { + const metricCollection = data[i]; + for (let j = 0; j < metricCollection.data.length; j++) { + const metric = metricCollection.data[j]; + metric.data = { + ...metric.data, + xValues: [...metric.data.steps], + yValues: [...metric.data.values], + }; + } + } + return data; +} + +export function alignByEpoch( + data: IMetricsCollection[], +): IMetricsCollection[] { + for (let i = 0; i < data.length; i++) { + const metricCollection = data[i]; + for (let j = 0; j < metricCollection.data.length; j++) { + const metric = metricCollection.data[j]; + const epochs: { [key: number]: number[] } = {}; + + metric.data.epochs.forEach((epoch, i) => { + if (epochs.hasOwnProperty(epoch)) { + epochs[epoch].push(metric.data.steps[i]); + } else { + epochs[epoch] = [metric.data.steps[i]]; + } + }); + + metric.data = { + ...metric.data, + xValues: [ + ...metric.data.epochs.map((epoch, i) => { + return ( + epoch + + (epochs[epoch].length > 1 + ? (0.99 / epochs[epoch].length) * + epochs[epoch].indexOf(metric.data.steps[i]) + : 0) + ); + }), + ], + yValues: [...metric.data.values], + }; + } + } + return data; +} + +export function alignByRelativeTime( + data: IMetricsCollection[], +): IMetricsCollection[] { + for (let i = 0; i < data.length; i++) { + const metricCollection = data[i]; + for (let j = 0; j < metricCollection.data.length; j++) { + const metric = metricCollection.data[j]; + const firstDate = metric.data.timestamps[0]; + const timestamps: { [key: number]: number[] } = {}; + metric.data.timestamps.forEach((timestamp, i) => { + if (timestamps.hasOwnProperty(timestamp)) { + timestamps[timestamp].push(metric.data.steps[i]); + } else { + timestamps[timestamp] = [metric.data.steps[i]]; + } + }); + metric.data = { + ...metric.data, + xValues: [ + ...metric.data.timestamps.map( + (timestamp, i) => + timestamp - + firstDate + + (timestamps[timestamp].length > 1 + ? (0.99 / timestamps[timestamp].length) * + timestamps[timestamp].indexOf(metric.data.steps[i]) + : 0), + ), + ], + yValues: [...metric.data.values], + }; + } + } + return data; +} + +export function alignByAbsoluteTime( + data: IMetricsCollection[], +): IMetricsCollection[] { + for (let i = 0; i < data.length; i++) { + const metricCollection = data[i]; + for (let j = 0; j < metricCollection.data.length; j++) { + const metric = metricCollection.data[j]; + metric.data = { + ...metric.data, + xValues: [...metric.data.timestamps], + yValues: [...metric.data.values], + }; + } + } + return data; +} + +export function alignByCustomMetric( + data: IMetricsCollection[], + model?: IModel, +): IMetricsCollection[] { + let missingTraces = false; + for (let i = 0; i < data.length; i++) { + const metricCollection = data[i]; + for (let j = 0; j < metricCollection.data.length; j++) { + const metric = metricCollection.data[j]; + const missingIndexes: number[] = []; + if (metric.x_axis_iters && metric.x_axis_values) { + const { x_axis_iters: xAxisIters, x_axis_values: xAxisValues } = metric; + if (xAxisValues.length === metric.data.values.length) { + const { sortedXValues, sortedArrays } = sortDependingArrays( + [...xAxisValues], + { + yValues: [...metric.data.values], + epochs: [...metric.data.epochs], + steps: [...metric.data.steps], + timestamps: [...metric.data.timestamps], + values: [...metric.data.values], + }, + ); + + metric.data = { + ...metric.data, + ...sortedArrays, + xValues: sortedXValues, + }; + } else { + metric.data.steps.forEach((step, index) => { + if (xAxisIters.indexOf(step) === -1) { + missingIndexes.push(index); + } + }); + const epochs = filterArrayByIndexes( + missingIndexes, + metric.data.epochs, + ); + const steps = filterArrayByIndexes(missingIndexes, metric.data.steps); + const timestamps = filterArrayByIndexes( + missingIndexes, + metric.data.timestamps, + ); + const values = filterArrayByIndexes( + missingIndexes, + metric.data.values, + ); + const yValues = filterArrayByIndexes( + missingIndexes, + metric.data.yValues, + ); + + const { sortedXValues, sortedArrays } = sortDependingArrays( + [...xAxisValues], + { + yValues: [...yValues], + epochs: [...epochs], + steps: [...steps], + timestamps: [...timestamps], + values: [...values], + }, + ); + + metric.data = { + ...metric.data, + ...sortedArrays, + xValues: sortedXValues, + }; + } + } else { + missingTraces = true; + } + } + } + if (missingTraces && model) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [AlignmentNotificationsEnum.NOT_ALL_ALIGNED], + }, + model, + }); + } + return data; +} + +export function alignData( + data: IMetricsCollection[], + type: AlignmentOptionsEnum = AlignmentOptionsEnum.STEP, + model?: IModel, +): IMetricsCollection[] { + const alignmentObj: Record = { + [AlignmentOptionsEnum.STEP]: alignByStep, + [AlignmentOptionsEnum.EPOCH]: alignByEpoch, + [AlignmentOptionsEnum.RELATIVE_TIME]: alignByRelativeTime, + [AlignmentOptionsEnum.ABSOLUTE_TIME]: alignByAbsoluteTime, + [AlignmentOptionsEnum.CUSTOM_METRIC]: alignByCustomMetric, + default: () => { + throw new Error('Unknown value for X axis alignment'); + }, + }; + const alignment = alignmentObj[type] || alignmentObj.default; + return alignment(data, model); +} diff --git a/src/src/utils/app/exceptionHandler.ts b/src/src/utils/app/exceptionHandler.ts new file mode 100644 index 00000000..41f2cdf1 --- /dev/null +++ b/src/src/utils/app/exceptionHandler.ts @@ -0,0 +1,60 @@ +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { IModel, State } from 'types/services/models/model'; + +import onNotificationAdd from './onNotificationAdd'; + +export default function exceptionHandler({ + detail, + model, +}: { + detail: any; + model: IModel; +}) { + let message = ''; + let state: Record = { + requestStatus: RequestStatusEnum.BadRequest, + }; + const modelState: any = model.getState(); + if (detail.message === 'SyntaxError' && modelState) { + const advancedMode: boolean = modelState.config?.select.advancedMode; + const OffsetDiff: number = advancedMode ? 1 : 2; + + detail.detail.offset = detail.detail.offset - OffsetDiff; + if (detail.detail.end_offset) { + detail.detail.end_offset = detail.detail.end_offset - OffsetDiff; + } + message = `Query syntax error at line (${detail.detail.line}, ${ + detail.detail.offset + }${ + detail.detail?.end_offset && + detail.detail.end_offset !== detail.detail.offset + ? `-${detail.detail.end_offset.end_offset}` + : '' + })`; + state = { + ...state, + selectFormData: { + ...modelState.selectFormData, + [advancedMode ? 'advancedError' : 'error']: { + ...detail, + message, + }, + }, + }; + model.setState(state); + return; + } else { + message = detail.message || 'Something went wrong'; + } + + model.setState(state); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [message], + }, + model, + }); +} diff --git a/src/src/utils/app/filterMetricData.ts b/src/src/utils/app/filterMetricData.ts new file mode 100644 index 00000000..3e5241ce --- /dev/null +++ b/src/src/utils/app/filterMetricData.ts @@ -0,0 +1,140 @@ +import { IRunBatch } from 'pages/RunDetail/types'; + +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { SequenceFullView } from 'types/core/AimObjects'; + +import { AlignmentOptionsEnum, ScaleEnum } from 'utils/d3'; +import { float64FromUint8 } from 'utils/helper'; + +function isInvalidMetricValue( + v: number, + scaleType: ScaleEnum = ScaleEnum.Linear, +): boolean { + return ( + (!v && v !== 0) || + !isFinite(v) || + isNaN(v) || + (scaleType === ScaleEnum.Log && v < 0) + ); +} + +function getFilteredMetricValues(args: { + data: T; + invalidIndicesArray: number[][]; +}): T { + const { data, invalidIndicesArray } = args; + // @ts-ignore + return data.filter((v: number, i: number) => + invalidIndicesArray.every( + (invalidIndices) => invalidIndices.indexOf(i) === -1, + ), + ); +} + +function getInvalidIndices( + values: T, + scaleType?: ScaleEnum, +): number[] { + // @ts-ignore + return values.reduce((acc: number[], v: number, i: number) => { + if (isInvalidMetricValue(v, scaleType)) { + acc = acc.concat([i]); + } + return acc; + }, []); +} + +export function filterMetricsData( + sequence: SequenceFullView, + alignmentType: AlignmentOptionsEnum = AlignmentOptionsEnum.STEP, + axesScaleType?: IAxesScaleState, +) { + const values = float64FromUint8(sequence.values?.blob); + const steps = float64FromUint8(sequence.iters?.blob); + const epochs = float64FromUint8(sequence.epochs?.blob); + const timestamps = float64FromUint8(sequence.timestamps?.blob); + const x_axis_iters = float64FromUint8(sequence.x_axis_iters?.blob); + const x_axis_values = float64FromUint8(sequence.x_axis_values?.blob); + + const { xAxis, yAxis } = axesScaleType || {}; + + const invalidIndices = { + values: getInvalidIndices(values, yAxis), + steps: getInvalidIndices(steps, xAxis), + epochs: getInvalidIndices(epochs, xAxis), + timestamps: getInvalidIndices(timestamps, xAxis), + x_axis_iters: getInvalidIndices(x_axis_iters, xAxis), + x_axis_values: getInvalidIndices(x_axis_values, xAxis), + }; + + const invalidXIndicesObj = { + [AlignmentOptionsEnum.STEP]: [invalidIndices.steps], + [AlignmentOptionsEnum.EPOCH]: [invalidIndices.epochs], + [AlignmentOptionsEnum.RELATIVE_TIME]: [invalidIndices.timestamps], + [AlignmentOptionsEnum.ABSOLUTE_TIME]: [invalidIndices.timestamps], + [AlignmentOptionsEnum.CUSTOM_METRIC]: [ + invalidIndices.x_axis_iters, + invalidIndices.x_axis_values, + ], + }; + + return { + values: getFilteredMetricValues({ + data: values, + invalidIndicesArray: [ + ...invalidXIndicesObj[alignmentType], + invalidIndices.values, + ], + }), + steps: getFilteredMetricValues({ + data: steps, + invalidIndicesArray: [invalidIndices.steps, invalidIndices.values], + }), + epochs: getFilteredMetricValues({ + data: epochs, + invalidIndicesArray: [invalidIndices.epochs, invalidIndices.values], + }), + timestamps: getFilteredMetricValues({ + data: timestamps, + invalidIndicesArray: [invalidIndices.timestamps, invalidIndices.values], + }).map((timestamp: number) => Math.round(timestamp * 1000)), + x_axis_values: getFilteredMetricValues({ + data: x_axis_values, + invalidIndicesArray: [ + invalidIndices.x_axis_iters, + invalidIndices.x_axis_values, + ], + }), + x_axis_iters: getFilteredMetricValues({ + data: x_axis_iters, + invalidIndicesArray: [ + invalidIndices.x_axis_iters, + invalidIndices.x_axis_values, + ], + }), + }; +} + +export function filterSingleRunMetricsData(run: IRunBatch) { + if (!run?.values?.length || !run?.iters?.length) { + return { + values: [], + iters: [], + }; + } + const { values, iters } = run; + const invalidIndices = { + values: getInvalidIndices(values), + iters: getInvalidIndices(iters), + }; + return { + values: getFilteredMetricValues({ + data: values, + invalidIndicesArray: [invalidIndices.iters, invalidIndices.values], + }), + iters: getFilteredMetricValues({ + data: iters, + invalidIndicesArray: [invalidIndices.iters, invalidIndices.values], + }), + }; +} diff --git a/src/src/utils/app/getAggregatedData.ts b/src/src/utils/app/getAggregatedData.ts new file mode 100644 index 00000000..1e4b17be --- /dev/null +++ b/src/src/utils/app/getAggregatedData.ts @@ -0,0 +1,43 @@ +import COLORS from 'config/colors/colors'; + +import { IMetric } from 'types/services/models/metrics/metricModel'; +import { + IAggregatedData, + IMetricsCollection, +} from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +export default function getAggregatedData({ + processedData, + model, +}: { + processedData: IMetricsCollection[]; + model: IModel; +}): IAggregatedData[] { + if (!processedData) { + return []; + } + + const paletteIndex: number = + model.getState()?.config?.grouping?.paletteIndex || 0; + + let aggregatedData: IAggregatedData[] = []; + + processedData.forEach((metricsCollection, index) => { + aggregatedData.push({ + key: metricsCollection.key, + area: { + min: metricsCollection.aggregation?.area.min || null, + max: metricsCollection.aggregation?.area.max || null, + }, + line: metricsCollection.aggregation?.line || null, + chartIndex: metricsCollection.chartIndex || 0, + color: + metricsCollection.color || + COLORS[paletteIndex][index % COLORS[paletteIndex].length], + dasharray: metricsCollection.dasharray || 'none', + }); + }); + + return aggregatedData; +} diff --git a/src/src/utils/app/getAppConfigData.ts b/src/src/utils/app/getAppConfigData.ts new file mode 100644 index 00000000..c793f34f --- /dev/null +++ b/src/src/utils/app/getAppConfigData.ts @@ -0,0 +1,62 @@ +import _ from 'lodash-es'; + +import appsService from 'services/api/apps/appsService'; + +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; +import { IModel, State } from 'types/services/models/model'; +import { IAppData } from 'types/services/models/metrics/metricsAppModel'; +import { IApiRequest } from 'types/services/services'; + +import { getCompatibleSelectConfig } from './getCompatibleSelectConfig'; +import exceptionHandler from './exceptionHandler'; +import { getCompatibleChartConfig } from './getCompatibleChartConfig'; + +export default function getAppConfigData({ + appId, + appRequest, + config, + model, +}: { + appId: string; + appRequest: IApiRequest; + config: IAppModelConfig; + model: IModel; +}): IApiRequest { + if (appRequest) { + appRequest.abort(); + } + appRequest = appsService.fetchApp(appId); + return { + call: async () => { + const appData = await appRequest.call((detail: any) => { + exceptionHandler({ detail, model }); + }); + let select = appData?.state?.select; + if (select) { + const compatibleSelectConfig = getCompatibleSelectConfig( + ['metrics', 'params', 'images'], + select, + ); + appData.state = { + ...appData.state, + select: { + ...compatibleSelectConfig, + }, + }; + } + let chart = appData?.state?.chart; + if (chart) { + const compatibleChartConfig = getCompatibleChartConfig(chart); + appData.state = { + ...appData.state, + chart: { + ...compatibleChartConfig, + }, + }; + } + const configData = _.merge(config, appData.state); + model.setState({ config: configData }); + }, + abort: appRequest.abort, + }; +} diff --git a/src/src/utils/app/getChartTitleData.ts b/src/src/utils/app/getChartTitleData.ts new file mode 100644 index 00000000..67c40e58 --- /dev/null +++ b/src/src/utils/app/getChartTitleData.ts @@ -0,0 +1,59 @@ +import _ from 'lodash-es'; +import moment from 'moment'; + +import { DATE_WITH_SECONDS } from 'config/dates/dates'; + +import { + IChartTitle, + IChartTitleData, + IGroupingSelectOption, + IMetricsCollection, +} from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import { formatValue } from '../formatValue'; +import getValueByField from '../getValueByField'; + +export default function getChartTitleData({ + processedData, + groupingSelectOptions, + model, +}: { + processedData: IMetricsCollection[]; + groupingSelectOptions: IGroupingSelectOption[]; + model: IModel; +}): IChartTitleData { + if (!processedData) { + return {}; + } + const groupData = model.getState()?.config?.grouping; + let chartTitleData: IChartTitleData = {}; + processedData.forEach((metricsCollection) => { + if (!chartTitleData[metricsCollection.chartIndex]) { + chartTitleData[metricsCollection.chartIndex] = groupData.chart.reduce( + (acc: IChartTitle, groupItemKey: string) => { + if (metricsCollection.config?.hasOwnProperty(groupItemKey)) { + const value = metricsCollection.config[groupItemKey]; + if ( + groupItemKey === 'run.props.creation_time' || + groupItemKey === 'run.props.end_time' + ) { + acc[getValueByField(groupingSelectOptions || [], groupItemKey)] = + formatValue( + !_.isNil(value) && typeof value === 'number' + ? moment(value * 1000).format(DATE_WITH_SECONDS) + : value, + ); + } else { + acc[getValueByField(groupingSelectOptions || [], groupItemKey)] = + formatValue(value); + } + } + return acc; + }, + {}, + ); + } + }); + return chartTitleData; +} diff --git a/src/src/utils/app/getCompatibleChartConfig.ts b/src/src/utils/app/getCompatibleChartConfig.ts new file mode 100644 index 00000000..086c6c71 --- /dev/null +++ b/src/src/utils/app/getCompatibleChartConfig.ts @@ -0,0 +1,50 @@ +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import { IChart } from 'types/services/models/explorer/createAppModel'; + +import { SmoothingAlgorithmEnum } from 'utils/smoothingData'; +import { AlignmentOptionsEnum } from 'utils/d3'; + +const CompatibleAlignmentOptions = [...Object.values(AlignmentOptionsEnum)]; + +export function getCompatibleChartConfig(chart: any): IChart { + if (chart) { + if (typeof chart.alignmentConfig?.type === 'number') { + makeAlignmentConfigCompatible(chart); + } + if ( + chart.hasOwnProperty('smoothingAlgorithm') && + chart.hasOwnProperty('smoothingFactor') && + chart.hasOwnProperty('curveInterpolation') + ) { + makeSmoothingConfigCompatible(chart); + } + } + return chart; +} + +function makeAlignmentConfigCompatible(chart: any) { + chart.alignmentConfig.type = + CompatibleAlignmentOptions[chart.alignmentConfig.type]; +} + +function makeSmoothingConfigCompatible(chart: any): void { + if (!chart.smoothing) { + chart.smoothing = CONTROLS_DEFAULT_CONFIG.metrics.smoothing; + } + if ( + (chart.smoothingAlgorithm === SmoothingAlgorithmEnum.EMA && + chart.smoothingFactor !== 0) || + (chart.smoothingAlgorithm === SmoothingAlgorithmEnum.CMA && + chart.smoothingFactor !== 1) + ) { + chart.smoothing.isApplied = true; + } + + chart.smoothing.factor = chart.smoothingFactor; + chart.smoothing.algorithm = chart.smoothingAlgorithm; + chart.smoothing.curveInterpolation = chart.curveInterpolation; + delete chart.smoothingFactor; + delete chart.smoothingAlgorithm; + delete chart.curveInterpolation; +} diff --git a/src/src/utils/app/getCompatibleSelectConfig.ts b/src/src/utils/app/getCompatibleSelectConfig.ts new file mode 100644 index 00000000..b8643440 --- /dev/null +++ b/src/src/utils/app/getCompatibleSelectConfig.ts @@ -0,0 +1,56 @@ +import _ from 'lodash-es'; + +import { ISelectConfig } from 'types/services/models/explorer/createAppModel'; + +import { getMetricHash } from './getMetricHash'; +import { getMetricLabel } from './getMetricLabel'; + +export function getCompatibleSelectConfig( + keys: string[] = [], + select: ISelectConfig, +): ISelectConfig { + if (select) { + let selectConfig: any = _.cloneDeep(select); + keys?.forEach((key: string) => { + if (selectConfig?.hasOwnProperty(key)) { + const selectOptions = selectConfig[key]; + if (Array.isArray(selectOptions)) { + selectOptions.forEach((option) => { + if (option?.value && typeof option.value === 'object') { + ['metric_name', 'param_name'].forEach((valueNameKey) => { + if (option.value?.hasOwnProperty(valueNameKey)) { + option.value.option_name = option.value[valueNameKey]; + delete option.value[valueNameKey]; + } + }); + } + }); + } + + selectConfig = { + ...selectConfig, + options: [ + ...(selectConfig[key] || []), + ...(selectConfig.options || []), + ], + }; + delete selectConfig[key]; + } + }); + selectConfig.options = selectConfig.options?.map((option: any) => { + if (!option.key) { + if (option.value) { + const { option_name, context } = option.value; + const metricHash = getMetricHash(option_name, context); + const metricLabel = getMetricLabel(option_name, context); + return { ...option, label: metricLabel, key: metricHash }; + } else { + return { ...option, key: option.label }; + } + } + return option; + }); + return selectConfig; + } + return select; +} diff --git a/src/src/utils/app/getDataAsMediaSetNestedObject.ts b/src/src/utils/app/getDataAsMediaSetNestedObject.ts new file mode 100644 index 00000000..65f458e8 --- /dev/null +++ b/src/src/utils/app/getDataAsMediaSetNestedObject.ts @@ -0,0 +1,84 @@ +import _ from 'lodash-es'; + +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import { formatValue } from 'utils/formatValue'; +import getValueByField from 'utils/getValueByField'; + +export function getDataAsMediaSetNestedObject({ + data, + groupingSelectOptions, + model, + defaultGroupFields, +}: { + data: any[]; + groupingSelectOptions: IGroupingSelectOption[]; + model?: IModel; + defaultGroupFields?: string[]; +}) { + if (!_.isEmpty(data)) { + const modelState = model?.getState(); + const configData = modelState?.config; + const grouping = configData?.grouping; + const mediaSetData: object = {}; + const group: string[] = [...(grouping?.row || [])]; + //ToDo reverse mode + // const groupFields = + // defaultGroupFields || + // (grouping?.reverseMode?.row + // ? groupingSelectOptions + // .filter( + // (option: IGroupingSelectOption) => !group.includes(option.label), + // ) + // .map((option) => option.value) + // : group); + const groupFields = defaultGroupFields || group; + const orderedMap = {}; + + data.forEach((group: any) => { + const path = groupFields?.reduce( + (acc: string[], field: string, index: number) => { + const value = _.get(group.data[0], field); + _.set( + orderedMap, + acc.concat(['ordering']), + new Set([ + ...(_.get(orderedMap, acc.concat(['ordering'])) || []), + value, + ]), + ); + _.set( + orderedMap, + acc.concat(['key']), + getValueByField(groupingSelectOptions, field), + ); + _.set(orderedMap, acc.concat(['orderKey']), field); + acc.push( + `${getValueByField(groupingSelectOptions, field)} = ${formatValue( + value, + )}`, + ); + return acc; + }, + [], + ); + _.set( + mediaSetData, + path, + _.sortBy(group.data, [ + ...groupFields, + ...groupingSelectOptions + .map((option: IGroupingSelectOption) => option.value) + .filter((field) => !groupFields.includes(field)), + 'caption', + ]), + ); + }); + return { + mediaSetData: _.isEmpty(mediaSetData) ? data[0].data : mediaSetData, + orderedMap, + }; + } + return {}; +} diff --git a/src/src/utils/app/getFilteredGroupingOptions.ts b/src/src/utils/app/getFilteredGroupingOptions.ts new file mode 100644 index 00000000..f4fbe30d --- /dev/null +++ b/src/src/utils/app/getFilteredGroupingOptions.ts @@ -0,0 +1,36 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { IModel, State } from 'types/services/models/model'; + +export function getFilteredGroupingOptions({ + groupName, + model, +}: { + groupName: GroupNameEnum; + model: IModel; +}): string[] { + const modelState = model.getState(); + const grouping = modelState?.config?.grouping; + if (grouping) { + const { + // reverseMode, + isApplied, + } = grouping; + const groupingSelectOptions = model.getState()?.groupingSelectOptions; + if (groupingSelectOptions) { + //ToDo reverse mode + // const filteredOptions = [...groupingSelectOptions] + // .filter((opt) => grouping[groupName].indexOf(opt.value) === -1) + // .map((item) => item.value); + //ToDo reverse mode + // return isApplied[groupName] + // ? reverseMode[groupName] + // ? filteredOptions + // : grouping[groupName] + // : []; + return isApplied[groupName] ? grouping[groupName] : []; + } + return []; + } + return []; +} diff --git a/src/src/utils/app/getFilteredRow.ts b/src/src/utils/app/getFilteredRow.ts new file mode 100644 index 00000000..4ad059d0 --- /dev/null +++ b/src/src/utils/app/getFilteredRow.ts @@ -0,0 +1,36 @@ +import { decode } from 'utils/encoder/encoder'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { isMetricHash } from 'utils/isMetricHash'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +export default function getFilteredRow>({ + columnKeys, + row, +}: { + columnKeys: string[]; + row: R; +}): { [key: string]: string } { + return columnKeys.reduce((acc: { [key: string]: string }, column: string) => { + let columnKey = column; + if (isMetricHash(column)) { + const { metricName, contextName } = JSON.parse(decode(column)); + columnKey = `${metricName}${contextName ? `${contextName} ` : ''}`; + } else if (isSystemMetric(column)) { + columnKey = formatSystemMetricName(column); + } + let value = row[column]; + if (Array.isArray(value)) { + value = value.join(', '); + } else if (typeof value !== 'string') { + value = value || value === 0 ? JSON.stringify(value) : '-'; + } + + if (columnKey.startsWith('params.')) { + acc[columnKey.replace('params.', '')] = value; + } else { + acc[columnKey] = value; + } + + return acc; + }, {}); +} diff --git a/src/src/utils/app/getFilteredSystemMetrics.ts b/src/src/utils/app/getFilteredSystemMetrics.ts new file mode 100644 index 00000000..a4bb9fec --- /dev/null +++ b/src/src/utils/app/getFilteredSystemMetrics.ts @@ -0,0 +1,28 @@ +import { isSystemMetric } from 'utils/isSystemMetric'; + +/** + * @param {string[]} array an array of strings, + * like `['Loss_type="duration_loss"','__system__cpu']` + * @param {boolean} isExclude exclude system metrics vise versa, + * + * @returns {Array} Array containing system metric keys or empty array + * @example + * getFilteredSystemMetrics(['Loss_type="duration_loss','__system__cpu']); // => ['__system__cpu'] + * getFilteredSystemMetrics(['Loss_type="duration_loss','__system__cpu'], true); // => ['Loss_type="duration_loss'] + */ + +export default function getFilteredSystemMetrics( + array: string[], + isExclude?: boolean, +): string[] | [] { + let filtered: string[] = []; + if (Array.isArray(array)) { + array.forEach((val) => { + if (isExclude ? !isSystemMetric(val) : isSystemMetric(val)) { + filtered.push(val); + } + }); + } + + return filtered; +} diff --git a/src/src/utils/app/getGroupConfig.ts b/src/src/utils/app/getGroupConfig.ts new file mode 100644 index 00000000..cd867c9a --- /dev/null +++ b/src/src/utils/app/getGroupConfig.ts @@ -0,0 +1,41 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + IGroupingSelectOption, + IMetricsCollection, +} from 'types/services/models/metrics/metricsAppModel'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { getValue } from 'utils/helper'; + +import getValueByField from '../getValueByField'; + +export default function getGroupConfig({ + collection, + groupingSelectOptions, + groupingNames = [], + configData, +}: { + collection: IMetricsCollection; + groupingSelectOptions: IGroupingSelectOption[]; + groupingNames: GroupNameEnum[]; + configData: IAppModelConfig; +}) { + let groupConfig: Record = {}; + + for (let groupName of groupingNames) { + const groupItem: string[] = configData?.grouping?.[groupName] || []; + if (groupItem.length) { + groupConfig[groupName] = groupItem.reduce((acc, paramKey) => { + Object.assign(acc, { + [getValueByField(groupingSelectOptions || [], paramKey)]: getValue( + collection.config, + paramKey, + ), + }); + return acc; + }, {}); + } + } + return groupConfig; +} diff --git a/src/src/utils/app/getGroupingPersistIndex.ts b/src/src/utils/app/getGroupingPersistIndex.ts new file mode 100644 index 00000000..1cf07f3b --- /dev/null +++ b/src/src/utils/app/getGroupingPersistIndex.ts @@ -0,0 +1,29 @@ +import { IGetGroupingPersistIndex } from 'types/services/models/metrics/metricsAppModel'; + +import { encode } from '../encoder/encoder'; + +export function getGroupingPersistIndex({ + groupConfig, + grouping, + groupName, +}: IGetGroupingPersistIndex) { + const configHash = encode(groupConfig as {}, true); + let index = BigInt(0); + if (grouping?.seed) { + for (let i = 0; i < configHash.length; i++) { + const charCode = configHash.charCodeAt(i); + if (charCode > 47 && charCode < 58) { + index += BigInt( + (charCode - 48) * + Math.ceil(Math.pow(16, i) / grouping?.seed[groupName]), + ); + } else if (charCode > 96 && charCode < 103) { + index += BigInt( + (charCode - 87) * + Math.ceil(Math.pow(16, i) / grouping?.seed[groupName]), + ); + } + } + } + return index; +} diff --git a/src/src/utils/app/getGroupingSelectOptions.ts b/src/src/utils/app/getGroupingSelectOptions.ts new file mode 100644 index 00000000..04be28e0 --- /dev/null +++ b/src/src/utils/app/getGroupingSelectOptions.ts @@ -0,0 +1,94 @@ +import _ from 'lodash-es'; + +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; + +export default function getGroupingSelectOptions({ + params, + runProps = [], + contexts = [], + sequenceName = null, +}: { + params: string[]; + runProps?: string[]; + contexts?: string[]; + sequenceName?: null | 'metric' | 'images' | 'audios'; +}): IGroupingSelectOption[] { + let options = [ + { + group: 'run', + label: 'run.hash', + value: 'run.hash', + }, + ]; + + if (runProps?.length) { + const filterPropsOptions = ['notes', 'tags', 'experiment.id']; + const replacePropsLabel: { [key: string]: string } = { + 'experiment.name': 'experiment', + }; + const propsOptions: IGroupingSelectOption[] = runProps + .filter((runProp: string) => filterPropsOptions.indexOf(runProp) === -1) + .map((runProp: string) => { + let propLabel = runProp; + if (replacePropsLabel.hasOwnProperty(runProp)) { + propLabel = replacePropsLabel[runProp]; + } + return { + group: 'run', + label: `run.${propLabel}`, + value: `run.props.${runProp}`, + }; + }); + + options = options.concat(propsOptions); + } + + if (params?.length) { + const paramsOptions: IGroupingSelectOption[] = params.map((param) => ({ + group: 'run', + label: param[0] === '[' ? `run${param}` : `run.${param}`, + value: param[0] === '[' ? `run.params${param}` : `run.params.${param}`, + })); + + options = options.concat(paramsOptions); + } + + if (sequenceName) { + let contextOptions = contexts.map((context) => ({ + group: sequenceName, + label: `${sequenceName}.context.${context}`, + value: `context.${context}`, + })); + let nameOption = { + group: sequenceName, + label: `${sequenceName}.name`, + value: 'name', + }; + let contextOption = { + group: sequenceName, + label: `${sequenceName}.context`, + value: 'context', + }; + options = !_.isEmpty(contexts) + ? options.concat(nameOption, contextOption, contextOptions) + : options.concat(nameOption); + } + + if (sequenceName === 'images' || sequenceName === 'audios') { + const recordOptions = [ + { + group: 'record', + label: 'record.step', + value: 'step', + }, + { + group: 'record', + label: 'record.index', + value: 'index', + }, + ]; + options = options.concat(recordOptions); + } + + return options; +} diff --git a/src/src/utils/app/getLegendsData.tsx b/src/src/utils/app/getLegendsData.tsx new file mode 100644 index 00000000..e9d2f5e8 --- /dev/null +++ b/src/src/utils/app/getLegendsData.tsx @@ -0,0 +1,78 @@ +import { + LegendColumnDataType, + LegendsDataType, +} from 'components/VisualizationLegends'; + +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + IGroupingSelectOption, + IMetricsCollection, +} from 'types/services/models/metrics/metricsAppModel'; +import { IGroupingConfig } from 'types/services/models/explorer/createAppModel'; + +import getValueByField from '../getValueByField'; +import { encode } from '../encoder/encoder'; +import { formatValue } from '../formatValue'; + +const groupingPropKeys: Record< + GroupNameEnum, + keyof IMetricsCollection +> = { + [GroupNameEnum.COLOR]: 'color', + [GroupNameEnum.STROKE]: 'dasharray', + [GroupNameEnum.CHART]: 'chartIndex', + [GroupNameEnum.ROW]: 'key', +}; + +function getLegendsData( + processedData: IMetricsCollection[] = [], + groupingSelectOptions: IGroupingSelectOption[] = [], + groupingConfig: IGroupingConfig = {}, + groupingNames: GroupNameEnum[] = [], +): LegendsDataType { + const legendsData: LegendsDataType = {}; + + for (let groupName of groupingNames) { + const legendRowData: Record = {}; + const groupPropKey = groupingPropKeys[groupName]; + const groupedItemPropKeys = groupingConfig[groupName] || []; + + if (groupedItemPropKeys.length > 0) { + for (const item of processedData) { + const config: Record = {}; + for (const propKey of groupedItemPropKeys) { + const key = getValueByField(groupingSelectOptions, propKey); + const value = item.config?.[propKey]; + config[key] = formatValue(value); + } + const legendRow = { + [groupPropKey]: item[groupPropKey], + config, + }; + const hashed = encode(legendRow); + if (!legendRowData[hashed]) { + legendRowData[hashed] = legendRow; + } + } + const keys = groupedItemPropKeys.map((item) => + getValueByField(groupingSelectOptions, item), + ); + const uniqueRows = Object.values(legendRowData); + const groupedByColumns: Record = {}; + for (let key of keys) { + groupedByColumns[key] = uniqueRows.map((row) => ({ + value: row.config[key], + color: row.color, + dasharray: row.dasharray, + chartIndex: row.chartIndex, + })); + } + + legendsData[groupName] = groupedByColumns; + } + } + return legendsData; +} + +export default getLegendsData; diff --git a/src/src/utils/app/getMetricHash.ts b/src/src/utils/app/getMetricHash.ts new file mode 100644 index 00000000..a512a460 --- /dev/null +++ b/src/src/utils/app/getMetricHash.ts @@ -0,0 +1,21 @@ +import _ from 'lodash-es'; + +import contextToString from 'utils/contextToString'; +import { encode } from 'utils/encoder/encoder'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +export function getMetricHash( + metricKey: string, + context: { [key: string]: string } | string, +): string { + const contextName = !_.isEmpty(context) + ? ` ${typeof context === 'string' ? context : contextToString(context)}` + : ''; + const metricName = isSystemMetric(metricKey) + ? formatSystemMetricName(metricKey) + : metricKey; + return isSystemMetric(metricKey) + ? metricKey + : encode({ metricName, contextName }); +} diff --git a/src/src/utils/app/getMetricLabel.ts b/src/src/utils/app/getMetricLabel.ts new file mode 100644 index 00000000..f47f0e0a --- /dev/null +++ b/src/src/utils/app/getMetricLabel.ts @@ -0,0 +1,18 @@ +import _ from 'lodash-es'; + +import contextToString from 'utils/contextToString'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +export function getMetricLabel( + metricKey: string, + context: { [key: string]: string } | string, +): string { + const contextName = !_.isEmpty(context) + ? ` ${typeof context === 'string' ? context : contextToString(context)}` + : ''; + const metricName = isSystemMetric(metricKey) + ? formatSystemMetricName(metricKey) + : metricKey; + return metricName + contextName; +} diff --git a/src/src/utils/app/getMetricsInitialRowData.ts b/src/src/utils/app/getMetricsInitialRowData.ts new file mode 100644 index 00000000..50273b5f --- /dev/null +++ b/src/src/utils/app/getMetricsInitialRowData.ts @@ -0,0 +1,20 @@ +import { getMetricHash } from './getMetricHash'; + +export function getMetricsInitialRowData( + metricsColumns: Record, +): Record { + return Object.keys(metricsColumns).reduce( + (acc: Record, metricName: string) => { + const groupByMetricName: Record = {}; + Object.keys(metricsColumns[metricName]).forEach( + (metricContext: string) => { + const metricHash = getMetricHash(metricName, metricContext); + groupByMetricName[metricHash] = '-'; + }, + ); + acc = { ...acc, ...groupByMetricName }; + return acc; + }, + {}, + ); +} diff --git a/src/src/utils/app/getMetricsSelectOptions.ts b/src/src/utils/app/getMetricsSelectOptions.ts new file mode 100644 index 00000000..ae02ab7a --- /dev/null +++ b/src/src/utils/app/getMetricsSelectOptions.ts @@ -0,0 +1,39 @@ +import _ from 'lodash-es'; + +import { MetricsValueKeyEnum } from 'config/enums/tableEnums'; + +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import { isSystemMetric } from 'utils/isSystemMetric'; + +import { getMetricHash } from './getMetricHash'; +import { getMetricLabel } from './getMetricLabel'; + +export function getMetricsSelectOptions( + metricsColumns: Record, + model: IModel, +): IGroupingSelectOption[] { + const metricsValueKey = + model.getState()?.config?.table.metricsValueKey || MetricsValueKeyEnum.LAST; + const metrics: IGroupingSelectOption[] = []; + const systemMetrics: IGroupingSelectOption[] = []; + Object.keys(metricsColumns).forEach((metricName: string) => { + Object.keys(metricsColumns[metricName]).forEach((metricContext: string) => { + const metricHash = getMetricHash(metricName, metricContext); + const metricLabel = getMetricLabel(metricName, metricContext); + const sortOption = { + group: 'metrics', + value: `metricsValues.${metricHash}.${metricsValueKey}`, + label: metricLabel, + }; + if (isSystemMetric(metricName)) { + systemMetrics.push(sortOption); + } else { + metrics.push(sortOption); + } + }); + }); + + return [..._.sortBy(metrics, 'label'), ..._.sortBy(systemMetrics, 'label')]; +} diff --git a/src/src/utils/app/getParamsSuggestions.ts b/src/src/utils/app/getParamsSuggestions.ts new file mode 100644 index 00000000..cccec21c --- /dev/null +++ b/src/src/utils/app/getParamsSuggestions.ts @@ -0,0 +1,24 @@ +import { IProjectsModelState } from 'types/services/models/projects/projectsModel'; + +/** + * @returns memoized params suggestions from projectsData + */ + +export function getParamsSuggestions(data: IProjectsModelState) { + let list: string[] = []; + if (data?.params) { + Object.keys(data?.params).forEach((option: any) => { + if (option) { + list.push(`run.${option}`); + if (data.params) { + if (data?.params[option]) { + Object.keys(data?.params[option]).forEach((subOption) => { + list.push(`run.${option}.${subOption}`); + }); + } + } + } + }); + } + return list; +} diff --git a/src/src/utils/app/getQueryStringFromSelect.ts b/src/src/utils/app/getQueryStringFromSelect.ts new file mode 100644 index 00000000..6c429bb2 --- /dev/null +++ b/src/src/utils/app/getQueryStringFromSelect.ts @@ -0,0 +1,54 @@ +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; +import { ISelectConfig } from 'types/services/models/explorer/createAppModel'; + +import { jsValidVariableRegex } from 'utils/getObjectPaths'; + +import { formatValue } from '../formatValue'; + +export default function getQueryStringFromSelect( + selectData: ISelectConfig, + error?: ISyntaxErrorDetails, +) { + let query = '()'; + if (selectData === undefined) { + return query; + } + if (selectData.advancedMode) { + query = selectData.advancedQuery || ''; + } else { + const simpleInput = + selectData.query?.trim() && !error?.message + ? `(${selectData.query.trim()})` + : ''; + const selections = selectData.options?.length + ? `(${selectData.options + .map((option) => { + const metricName = option.value?.option_name.replaceAll('"', '\\"'); + return `(metric.name == "${metricName}"${ + option.value?.context === null + ? '' + : ' and ' + + Object.keys(option.value?.context) + .map((item) => { + const contextName = !jsValidVariableRegex.test(item) + ? `['${item.replaceAll('"', '\\"')}']` + : `.${item}`; + const value = (option.value?.context as any)[item]; + return `metric.context${contextName} == ${formatValue( + value, + )}`; + }) + .join(' and ') + })`; + }) + .join(' or ')})` + : ''; + + if (simpleInput && selections) { + query = `${simpleInput} and ${selections}`; + } else { + query = `${simpleInput}${selections}`; + } + } + return query.trim() || '()'; +} diff --git a/src/src/utils/app/getRunData.ts b/src/src/utils/app/getRunData.ts new file mode 100644 index 00000000..0a3ca933 --- /dev/null +++ b/src/src/utils/app/getRunData.ts @@ -0,0 +1,39 @@ +import { + IMetricTrace, + IParamTrace, + IRun, +} from 'types/services/models/metrics/runModel'; + +import { + decodePathsVals, + decodeBufferPairs, + iterFoldTree, +} from 'utils/encoder/streamEncoding'; + +import { IRequestProgress } from './setRequestProgress'; + +export default async function getRunData< + S extends ReadableStream[]>, +>(stream: S, setProgress?: (progress: IRequestProgress) => void) { + let bufferPairs = decodeBufferPairs(stream); + let decodedPairs = decodePathsVals(bufferPairs); + let objects = iterFoldTree(decodedPairs, 1); + + const runData = []; + + for await (let [keys, val] of objects) { + const data = { ...(val as any), hash: keys[0] }; + if (data.hash.startsWith('progress')) { + const { 0: checked, 1: trackedRuns } = data; + setProgress?.({ + matched: runData.length, + checked, + trackedRuns, + }); + } else { + runData.push(data); + } + } + + return runData; +} diff --git a/src/src/utils/app/getSelectOptions.ts b/src/src/utils/app/getSelectOptions.ts new file mode 100644 index 00000000..b3bb34c1 --- /dev/null +++ b/src/src/utils/app/getSelectOptions.ts @@ -0,0 +1,98 @@ +import _ from 'lodash-es'; + +import COLORS from 'config/colors/colors'; + +import { ISelectOption } from 'types/services/models/explorer/createAppModel'; +import { IProjectParamsMetrics } from 'types/services/models/projects/projectsModel'; + +import alphabeticalSortComparator from 'utils/alphabeticalSortComparator'; +import getObjectPaths from 'utils/getObjectPaths'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +import { getMetricHash } from './getMetricHash'; +import { getMetricLabel } from './getMetricLabel'; + +export default function getSelectOptions( + projectsData: IProjectParamsMetrics, + addHighLevelMetrics: boolean = false, +): ISelectOption[] { + const comparator = alphabeticalSortComparator({ + orderBy: 'label', + }); + let systemOptions: ISelectOption[] = []; + let params: ISelectOption[] = []; + let metrics: ISelectOption[] = []; + + if (projectsData?.metric) { + for (let metricName in projectsData.metric) { + const isSystem = isSystemMetric(metricName); + if (addHighLevelMetrics) { + const metricHash = getMetricHash(metricName, {}); + const metricLabel = getMetricLabel(metricName, {}); + let index: number = metrics.length; + let option: ISelectOption = { + label: metricLabel, + group: isSystem ? 'System' : metricName, + type: 'metrics', + color: COLORS[0][index % COLORS[0].length], + key: metricHash, + value: { + option_name: metricName, + context: null, + }, + }; + if (isSystem) { + systemOptions.push(option); + } else { + metrics.push(option); + } + } + for (let val of projectsData.metric[metricName]) { + if ((addHighLevelMetrics && !_.isEmpty(val)) || !addHighLevelMetrics) { + const metricHash = getMetricHash(metricName, val); + const metricLabel = getMetricLabel(metricName, val); + let index: number = metrics.length; + let option: ISelectOption = { + label: metricLabel, + group: isSystem ? 'System' : metricName, + type: 'metrics', + color: COLORS[0][index % COLORS[0].length], + key: metricHash, + value: { + option_name: metricName, + context: val, + }, + }; + if (isSystem) { + systemOptions.push(option); + } else { + metrics.push(option); + } + } + } + } + } + if (projectsData?.params && !addHighLevelMetrics) { + const paramPaths = getObjectPaths(projectsData.params, projectsData.params); + paramPaths.forEach((paramPath, index) => { + const indexOf = + paramPath.indexOf('.__example_type__') !== -1 || + paramPath[paramPath.length - 1] === '.' + ? paramPath.indexOf('.__example_type__') + : paramPath.length; + params.push({ + label: paramPath.slice(0, indexOf), + key: paramPath.slice(0, indexOf), + group: 'Params', + type: 'params', + color: COLORS[0][index % COLORS[0].length], + }); + }); + } + + params = params.sort(comparator); + metrics = metrics.sort(comparator); + systemOptions = systemOptions.sort(comparator); + + return [...metrics, ...params, ...systemOptions]; +} diff --git a/src/src/utils/app/getSystemMetricsFromColumns.ts b/src/src/utils/app/getSystemMetricsFromColumns.ts new file mode 100644 index 00000000..b398c884 --- /dev/null +++ b/src/src/utils/app/getSystemMetricsFromColumns.ts @@ -0,0 +1,78 @@ +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; + +import { isSystemMetric } from 'utils/isSystemMetric'; + +/** + * @param {ITableColumn[]} tableColumns an array of table columns, + * like `[{ + key: 'Loss_type="duration_loss"', + content: { + key: null, + ref: null, + props: { + size: 'small', + color: '#3E72E7', + label: 'type="duration_loss"', + }, + }, + topHeader: 'Loss', + pin: null, + isHidden: false, + }, + { + key: '__system__cpu', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'CPU (%)', + }, + }, + topHeader: 'System Metrics', + pin: null, + isHidden: true, + }]` + * @returns {Array} Array containing system metric keys or empty array + * @example + * getSystemMetricsFromColumns([{ + key: 'Loss_type="duration_loss"', + content: { + key: null, + ref: null, + props: { + size: 'small', + color: '#3E72E7', + label: 'type="duration_loss"', + }, + }, + topHeader: 'Loss', + pin: null, + isHidden: false, + }, { + key: '__system__cpu', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'CPU (%)', + }, + }, + topHeader: 'System Metrics', + pin: null, + isHidden: true, + }]); // => ['__system__cpu'] + */ + +export default function getSystemMetricsFromColumns( + tableColumns: ITableColumn[], +): string[] | [] { + let arr: string[] = []; + tableColumns?.forEach(({ key }) => { + if (isSystemMetric(key)) { + arr.push(key); + } + }); + return arr; +} diff --git a/src/src/utils/app/isGroupingApplied.ts b/src/src/utils/app/isGroupingApplied.ts new file mode 100644 index 00000000..b81fca15 --- /dev/null +++ b/src/src/utils/app/isGroupingApplied.ts @@ -0,0 +1,30 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { IModel, State } from 'types/services/models/model'; + +import { getFilteredGroupingOptions } from './getFilteredGroupingOptions'; + +export default function isGroupingApplied( + model: IModel, +): boolean { + const groupByColor = getFilteredGroupingOptions({ + groupName: GroupNameEnum.COLOR, + model, + }); + const groupByStroke = getFilteredGroupingOptions({ + groupName: GroupNameEnum.STROKE, + model, + }); + const groupByChart = getFilteredGroupingOptions({ + groupName: GroupNameEnum.CHART, + model, + }); + if ( + groupByColor.length === 0 && + groupByStroke.length === 0 && + groupByChart.length === 0 + ) { + return false; + } + return true; +} diff --git a/src/src/utils/app/manageSystemMetricColumns.ts b/src/src/utils/app/manageSystemMetricColumns.ts new file mode 100644 index 00000000..aea04f37 --- /dev/null +++ b/src/src/utils/app/manageSystemMetricColumns.ts @@ -0,0 +1,29 @@ +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { IModel, State } from 'types/services/models/model'; + +import getSystemMetricsFromColumns from './getSystemMetricsFromColumns'; + +export default function manageSystemMetricColumns( + model: IModel | any, +) { + const modelState = model.getState(); + const systemMetrics: string[] = getSystemMetricsFromColumns( + modelState?.tableColumns! as ITableColumn[], + ); + let hiddenColumns: string[] = [...modelState!.config!.table.hiddenColumns!]; + if ( + hiddenColumns.length === 0 && + systemMetrics.length > 0 && + modelState!.config!.table.hideSystemMetrics + ) { + hiddenColumns = systemMetrics; + + model.updateModelData({ + ...modelState.config, + table: { + ...modelState.config!.table, + hiddenColumns, + }, + }); + } +} diff --git a/src/src/utils/app/onAggregationConfigChange.ts b/src/src/utils/app/onAggregationConfigChange.ts new file mode 100644 index 00000000..be044da6 --- /dev/null +++ b/src/src/utils/app/onAggregationConfigChange.ts @@ -0,0 +1,63 @@ +import _ from 'lodash-es'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IAggregationConfig } from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { AggregationAreaMethods } from 'utils/aggregateGroupData'; + +export default function onAggregationConfigChange({ + aggregationConfig, + model, + appName, + updateModelData, +}: { + aggregationConfig: Partial; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.chart && !_.isEmpty(aggregationConfig)) { + configData.chart = { + ...configData.chart, + aggregationConfig: { + ...configData.chart.aggregationConfig, + ...aggregationConfig, + }, + }; + updateModelData(configData, true); + } + if (aggregationConfig.methods) { + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeAggregationMethod + } area to "${AggregationAreaMethods[ + aggregationConfig.methods.area + ].toLowerCase()}"`, + ); + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeAggregationMethod + } line to "${AggregationAreaMethods[ + aggregationConfig.methods.line + ].toLowerCase()}"`, + ); + } else { + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeAggregation + } to ${aggregationConfig.isApplied ? 'Enable' : 'Disable'}`, + ); + } +} diff --git a/src/src/utils/app/onAlignmentMetricChange.ts b/src/src/utils/app/onAlignmentMetricChange.ts new file mode 100644 index 00000000..ce153c5b --- /dev/null +++ b/src/src/utils/app/onAlignmentMetricChange.ts @@ -0,0 +1,129 @@ +import { AlignmentNotificationsEnum } from 'config/notification-messages/notificationMessages'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import * as analytics from 'services/analytics'; +import metricsService from 'services/api/metrics/metricsService'; + +import { IAlignMetricsDataParams } from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { AlignmentOptionsEnum } from '../d3'; + +import getRunData from './getRunData'; +import onNotificationAdd from './onNotificationAdd'; +import updateURL from './updateURL'; +import setRequestProgress from './setRequestProgress'; + +export default async function onAlignmentMetricChange({ + metric, + model, + appName, + updateModelData, + setModelData, +}: { + metric: string; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setModelData: any; +}) { + const modelState = model.getState(); + const configData = modelState?.config; + if (configData?.chart) { + configData.chart = { + ...configData.chart, + alignmentConfig: { metric, type: AlignmentOptionsEnum.CUSTOM_METRIC }, + axesScaleRange: CONTROLS_DEFAULT_CONFIG.metrics.axesScaleRange, + zoom: { ...configData.chart.zoom, history: [] }, + }; + + model.setState({ config: configData }); + updateURL({ configData, appName }); + } + if (modelState?.rawData && configData) { + model.setState({ requestStatus: RequestStatusEnum.Pending }); + const runs: Array<{ run_id: string; traces: any }> = + modelState.rawData?.map((item) => { + const traces = item.traces.map(({ context, name, slice }: any) => ({ + context, + name, + slice, + })); + return { + run_id: item.hash, + traces, + }; + }); + + const reqBody: IAlignMetricsDataParams = { + align_by: metric, + runs, + }; + try { + const stream = await metricsService + .fetchAlignedMetricsData(reqBody) + .call(); + const runData = await getRunData(stream, (progress) => + setRequestProgress(model, progress), + ); + let missingTraces = false; + const rawData: any = model.getState()?.rawData?.map((item, index) => { + return { + ...item, + traces: item.traces.map((trace: any, ind: number) => { + let x_axis_iters = runData[index]?.[ind]?.x_axis_iters || null; + let x_axis_values = runData[index]?.[ind]?.x_axis_iters || null; + if (!x_axis_iters || !x_axis_values) { + missingTraces = true; + } + let data = { + ...trace, + ...runData[index][ind], + }; + return data; + }), + }; + }); + if (missingTraces) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [AlignmentNotificationsEnum.NOT_ALL_ALIGNED], + }, + model, + }); + configData.chart = { + ...configData.chart, + alignmentConfig: { metric: '', type: AlignmentOptionsEnum.STEP }, + }; + model.setState({ requestStatus: RequestStatusEnum.BadRequest }); + } + setModelData(rawData, configData); + } catch (ex: any) { + if (ex.name === 'AbortError') { + // Abort Error + } else { + configData.chart = { + ...configData.chart, + alignmentConfig: { + metric, + type: AlignmentOptionsEnum.STEP, + }, + }; + model.setState({ requestStatus: RequestStatusEnum.BadRequest }); + updateModelData(configData, true); + } + } + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.changeXAxisProperties}, Align X axis by another metric`, + ); +} diff --git a/src/src/utils/app/onAlignmentTypeChange.ts b/src/src/utils/app/onAlignmentTypeChange.ts new file mode 100644 index 00000000..294c74c3 --- /dev/null +++ b/src/src/utils/app/onAlignmentTypeChange.ts @@ -0,0 +1,46 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { AlignmentOptionsEnum } from '../d3'; + +export default function onAlignmentTypeChange({ + type, + model, + appName, + updateModelData, +}: { + type: AlignmentOptionsEnum; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.chart) { + const alignmentConfig = { ...configData.chart.alignmentConfig, type }; + + if (type !== AlignmentOptionsEnum.CUSTOM_METRIC) { + alignmentConfig.metric = ''; + } + configData.chart = { + ...configData.chart, + alignmentConfig, + axesScaleRange: CONTROLS_DEFAULT_CONFIG.metrics.axesScaleRange, + zoom: { ...configData.chart.zoom, history: [] }, + }; + updateModelData(configData, true); + } + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeXAxisProperties + }, Align X axis by "${type.toLowerCase()}"`, + ); +} diff --git a/src/src/utils/app/onAxesScaleRangeChange.ts b/src/src/utils/app/onAxesScaleRangeChange.ts new file mode 100644 index 00000000..dcf4a203 --- /dev/null +++ b/src/src/utils/app/onAxesScaleRangeChange.ts @@ -0,0 +1,48 @@ +import { IAxesScaleRange } from 'components/AxesPropsPopover'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; + +import updateURL from './updateURL'; + +const onAxesScaleRangeChange = ({ + range, + model, + appName, +}: { + range: Partial; + model: IModel; + appName: string; +}): void => { + let configData = model?.getState()?.config; + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + axesScaleRange: { + ...configData.chart.axesScaleRange, + yAxis: { + ...configData.chart.axesScaleRange.yAxis, + ...(range.yAxis || {}), + }, + xAxis: { + ...configData.chart.axesScaleRange.xAxis, + ...(range.xAxis || {}), + }, + }, + }, + }; + model.setState({ config: configData }); + updateURL({ configData, appName }); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.changeAxesScaleRange} to "${range.yAxis}"`, + ); +}; + +export default onAxesScaleRangeChange; diff --git a/src/src/utils/app/onAxesScaleTypeChange.ts b/src/src/utils/app/onAxesScaleTypeChange.ts new file mode 100644 index 00000000..20af8d2e --- /dev/null +++ b/src/src/utils/app/onAxesScaleTypeChange.ts @@ -0,0 +1,43 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onAxesScaleTypeChange({ + args, + model, + appName, + updateModelData, +}: { + args: IAxesScaleState; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + let configData = model?.getState()?.config; + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + axesScaleType: args, + }, + }; + model.setState({ config: configData }); + updateModelData(configData, true); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.changeAxesScale} to "${args.xAxis}"`, + ); + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.changeAxesScale} to "${args.yAxis}"`, + ); +} diff --git a/src/src/utils/app/onAxisBrushExtentChange.ts b/src/src/utils/app/onAxisBrushExtentChange.ts new file mode 100644 index 00000000..1d7547ae --- /dev/null +++ b/src/src/utils/app/onAxisBrushExtentChange.ts @@ -0,0 +1,55 @@ +import _ from 'lodash-es'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onAxisBrushExtentChange({ + key, + extent, + chartIndex, + model, + updateModelData, +}: { + key: string; + extent: [number, number] | [string, string] | null; + chartIndex: number; + model: IModel; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.chart) { + let brushExtents: { + [key: string]: { + [key: string]: [number, number] | [string, string]; + }; + } = { + ...configData.chart.brushExtents, + }; + if (_.isNil(extent)) { + const chartBrushExtents = _.omit(brushExtents[chartIndex], key); + if (_.isEmpty(chartBrushExtents)) { + brushExtents = _.omit(brushExtents, chartIndex); + } else { + brushExtents = { + ...brushExtents, + [chartIndex]: chartBrushExtents, + }; + } + } else { + brushExtents = { + ...brushExtents, + [chartIndex]: { + ...brushExtents[chartIndex], + [key]: extent, + }, + }; + } + + configData.chart.brushExtents = brushExtents; + + updateModelData({ ...configData, chart: { ...configData?.chart } }, true); + } +} diff --git a/src/src/utils/app/onBookmarkCreate.ts b/src/src/utils/app/onBookmarkCreate.ts new file mode 100644 index 00000000..f36230e5 --- /dev/null +++ b/src/src/utils/app/onBookmarkCreate.ts @@ -0,0 +1,78 @@ +import { BookmarkNotificationsEnum } from 'config/notification-messages/notificationMessages'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; +import appsService from 'services/api/apps/appsService'; +import dashboardService from 'services/api/dashboard/dashboardService'; + +import { + IAppData, + IDashboardData, +} from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import exceptionHandler from './exceptionHandler'; +import onNotificationAdd from './onNotificationAdd'; + +export default async function onBookmarkCreate({ + name, + description, + model, + appName, +}: { + name: string; + description: string; + model: IModel; + appName: string; +}): Promise { + const configData = model?.getState()?.config; + try { + if (configData) { + const app: IAppData | any = await appsService + .createApp({ + state: configData, + type: appName.toLowerCase(), + }) + .call((detail: any) => { + exceptionHandler({ detail, model }); + }); + if (app.id) { + const bookmark: IDashboardData = await dashboardService + .createDashboard({ app_id: app.id, name, description }) + .call((detail: any) => { + exceptionHandler({ detail, model }); + }); + if (bookmark.name) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [BookmarkNotificationsEnum.CREATE], + }, + model, + }); + } else { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [BookmarkNotificationsEnum.ERROR], + }, + model, + }); + } + } + } + } catch (err: any) { + onNotificationAdd({ + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + model, + }); + } + // @ts-ignore + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].createBookmark); +} diff --git a/src/src/utils/app/onBookmarkUpdate.ts b/src/src/utils/app/onBookmarkUpdate.ts new file mode 100644 index 00000000..6a936ec7 --- /dev/null +++ b/src/src/utils/app/onBookmarkUpdate.ts @@ -0,0 +1,51 @@ +import { BookmarkNotificationsEnum } from 'config/notification-messages/notificationMessages'; + +import appsService from 'services/api/apps/appsService'; + +import { IDashboardData } from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import exceptionHandler from './exceptionHandler'; +import onNotificationAdd from './onNotificationAdd'; + +export default function onBookmarkUpdate({ + id, + model, + appName, +}: { + id: string; + model: IModel; + appName: string; +}): void { + const configData = model.getState()?.config; + if (configData) { + try { + appsService + .updateApp(id, { state: configData, type: appName.toLowerCase() }) + .call((detail: any) => { + exceptionHandler({ detail, model }); + }) + .then((res: IDashboardData | any) => { + if (res.id) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [BookmarkNotificationsEnum.UPDATE], + }, + model, + }); + } + }); + } catch (err: any) { + onNotificationAdd({ + model, + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + }); + } + } +} diff --git a/src/src/utils/app/onChangeTooltip.ts b/src/src/utils/app/onChangeTooltip.ts new file mode 100644 index 00000000..e0689ff0 --- /dev/null +++ b/src/src/utils/app/onChangeTooltip.ts @@ -0,0 +1,82 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import * as analytics from 'services/analytics'; + +import { + IMetricsCollection, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import getTooltipContent from 'utils/getTooltipContent'; + +import updateURL from './updateURL'; + +export default function onChangeTooltip({ + tooltip, + groupingNames, + model, + appName, +}: { + tooltip: Partial; + groupingNames: GroupNameEnum[]; + model: IModel; + appName: string; +}): void { + let { + config: configData, + data, + groupingSelectOptions = [], + } = model.getState(); + + if (configData?.chart) { + // TODO remove this later + // remove unnecessary content prop from tooltip config + if (configData.chart.tooltip?.hasOwnProperty('content')) { + delete configData.chart.tooltip.content; + } + + configData = { + ...configData, + chart: { + ...configData.chart, + tooltip: { + ...configData.chart.tooltip, + ...tooltip, + }, + }, + }; + + const tooltipData = { + ...configData?.chart?.tooltip, + content: getTooltipContent({ + groupingNames, + groupingSelectOptions, + data: data as IMetricsCollection[], + configData, + activePointKey: configData.chart?.focusedState?.key, + selectedFields: configData.chart?.tooltip?.selectedFields, + }), + }; + model.setState({ config: configData, tooltip: tooltipData }); + updateURL({ configData, appName }); + if (tooltip.appearance) { + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.tooltip.appearance} ${tooltip.appearance}`, + ); + } else if (tooltip.selectedFields) { + analytics.trackEvent( + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.tooltip + .changeTooltipDisplay, + ); + } else if (tooltip.hasOwnProperty('display')) { + analytics.trackEvent( + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.tooltip.display, + ); + } + } +} diff --git a/src/src/utils/app/onChangeTrendlineOptions.ts b/src/src/utils/app/onChangeTrendlineOptions.ts new file mode 100644 index 00000000..40d2c50d --- /dev/null +++ b/src/src/utils/app/onChangeTrendlineOptions.ts @@ -0,0 +1,40 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { ITrendlineOptions } from 'types/services/models/scatter/scatterAppModel'; + +import updateURL from './updateURL'; + +export default function onChangeTrendlineOptions({ + trendlineOptions, + model, + appName, +}: { + trendlineOptions: Partial; + model: IModel; + appName: string; +}): void { + let configData = model.getState()?.config; + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + trendlineOptions: { + ...configData.chart.trendlineOptions, + ...trendlineOptions, + }, + }, + }; + + model.setState({ config: configData }); + updateURL({ configData, appName }); + } + + analytics.trackEvent( + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeTrendlineOptions, + ); +} diff --git a/src/src/utils/app/onColorIndicatorChange.ts b/src/src/utils/app/onColorIndicatorChange.ts new file mode 100644 index 00000000..49233ae8 --- /dev/null +++ b/src/src/utils/app/onColorIndicatorChange.ts @@ -0,0 +1,34 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onColorIndicatorChange({ + model, + appName, + updateModelData, +}: { + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.chart) { + const chart = { ...configData.chart }; + chart.isVisibleColorIndicator = !configData.chart.isVisibleColorIndicator; + updateModelData({ ...configData, chart }, true); + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeColorIndicatorMode + } to ${ + configData.chart.isVisibleColorIndicator ? 'Disable' : 'Enable' + } color indicator`, + ); + } +} diff --git a/src/src/utils/app/onColumnsOrderChange.ts b/src/src/utils/app/onColumnsOrderChange.ts new file mode 100644 index 00000000..5785b95c --- /dev/null +++ b/src/src/utils/app/onColumnsOrderChange.ts @@ -0,0 +1,45 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onColumnsOrderChange({ + columnsOrder, + model, + appName, + updateModelData, +}: { + columnsOrder: any; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + columnsOrder: columnsOrder, + }; + const config = { + ...configData, + table, + }; + + model.setState({ + config, + }); + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } + + // @ts-ignore + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.changeColumnOrder); +} diff --git a/src/src/utils/app/onColumnsVisibilityChange.ts b/src/src/utils/app/onColumnsVisibilityChange.ts new file mode 100644 index 00000000..8f8c8fcc --- /dev/null +++ b/src/src/utils/app/onColumnsVisibilityChange.ts @@ -0,0 +1,89 @@ +import _ from 'lodash-es'; + +import { HideColumnsEnum } from 'config/enums/tableEnums'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { AVOID_COLUMNS_TO_HIDE_LIST } from 'config/table/tableConfigs'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +import getSystemMetricsFromColumns from './getSystemMetricsFromColumns'; +import getFilteredSystemMetrics from './getFilteredSystemMetrics'; + +export default function onColumnsVisibilityChange({ + hiddenColumns, + model, + appName, + updateModelData, +}: { + hiddenColumns: string[] | string; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + const columnsData = model.getState()!.tableColumns!; + const systemMetrics: string[] = getSystemMetricsFromColumns( + columnsData as ITableColumn[], + ); + + let columnKeys: string[] = Array.isArray(hiddenColumns) + ? [...hiddenColumns] + : []; + let hideSystemMetrics: boolean | undefined = + configData?.table.hideSystemMetrics; + + if (configData?.table) { + const filteredFromSystem = getFilteredSystemMetrics( + configData?.table?.hiddenColumns, + true, + ); + if (hiddenColumns === HideColumnsEnum.HideSystemMetrics) { + columnKeys = [...filteredFromSystem, ...systemMetrics]; + } + if (hiddenColumns === HideColumnsEnum.ShowSystemMetrics) { + columnKeys = [...filteredFromSystem]; + } + + if (hideSystemMetrics !== undefined) { + hideSystemMetrics = + getFilteredSystemMetrics(columnKeys).length === systemMetrics.length; + } + columnKeys = + hiddenColumns === HideColumnsEnum.All + ? columnsData.map( + (col) => !AVOID_COLUMNS_TO_HIDE_LIST.has(col.key) && col.key, + ) + : columnKeys; + + const table = { + ...configData.table, + hiddenColumns: columnKeys, + hideSystemMetrics, + }; + + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } + if (hiddenColumns[0] === 'all') { + // @ts-ignore + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.showAllColumns); + } else if (_.isEmpty(hiddenColumns)) { + // @ts-ignore + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.hideAllColumns); + } +} diff --git a/src/src/utils/app/onCurveInterpolationChange.ts b/src/src/utils/app/onCurveInterpolationChange.ts new file mode 100644 index 00000000..a854de58 --- /dev/null +++ b/src/src/utils/app/onCurveInterpolationChange.ts @@ -0,0 +1,44 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { CurveEnum } from 'utils/d3'; + +export default function onCurveInterpolationChange({ + model, + appName, + updateModelData, +}: { + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.chart) { + const chart = { ...configData.chart }; + chart.curveInterpolation = + configData.chart.curveInterpolation === CurveEnum.Linear + ? CurveEnum.MonotoneX + : CurveEnum.Linear; + + updateModelData({ ...configData, chart }, true); + + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls + .changeCurveInterpolationMode + } to "${ + configData.chart.curveInterpolation === CurveEnum.Linear + ? 'cubic' + : 'linear' + }"`, + ); + } +} diff --git a/src/src/utils/app/onDensityTypeChange.ts b/src/src/utils/app/onDensityTypeChange.ts new file mode 100644 index 00000000..cb895fdc --- /dev/null +++ b/src/src/utils/app/onDensityTypeChange.ts @@ -0,0 +1,45 @@ +import { DensityOptions } from 'config/enums/densityEnum'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; + +import exceptionHandler from './exceptionHandler'; + +export default async function onDensityTypeChange({ + type, + model, + appName, + getMetricsData, +}: { + type: DensityOptions; + model: IModel; + appName: string; + getMetricsData: (shouldUrlUpdate?: boolean) => { + call: (detail: any) => Promise; + abort: () => void; + }; +}): Promise { + const modelState = model.getState(); + let configData = modelState?.config; + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + densityType: type, + }, + }; + model.setState({ config: configData }); + } + getMetricsData(true).call((detail: any) => { + exceptionHandler({ model, detail }); + }); + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeXAxisProperties + }, Set point density to "${DensityOptions[type].toLowerCase()}"`, + ); +} diff --git a/src/src/utils/app/onGroupingApplyChange.ts b/src/src/utils/app/onGroupingApplyChange.ts new file mode 100644 index 00000000..6c72f838 --- /dev/null +++ b/src/src/utils/app/onGroupingApplyChange.ts @@ -0,0 +1,36 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onGroupingApplyChange({ + groupName, + model, + appName, + updateModelData, + setAggregationEnabled, +}: { + groupName: GroupNameEnum; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setAggregationEnabled?: any; +}): void { + const configData = model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { + ...configData.grouping, + isApplied: { + ...configData.grouping.isApplied, + [groupName]: !configData.grouping.isApplied[groupName], + }, + }; + if (typeof setAggregationEnabled === 'function') { + setAggregationEnabled({ model, appName }); + } + updateModelData(configData, true); + } +} diff --git a/src/src/utils/app/onGroupingModeChange.ts b/src/src/utils/app/onGroupingModeChange.ts new file mode 100644 index 00000000..6bcd32bf --- /dev/null +++ b/src/src/utils/app/onGroupingModeChange.ts @@ -0,0 +1,49 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import resetChartZoom from './resetChartZoom'; + +export default function onGroupingModeChange({ + groupName, + value, + model, + appName, + updateModelData, + setAggregationEnabled, +}: { + groupName: GroupNameEnum; + value: boolean; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setAggregationEnabled?: any; +}): void { + const configData = model?.getState()?.config; + if (configData?.grouping) { + configData.grouping.reverseMode = { + ...configData.grouping.reverseMode, + [groupName]: value, + }; + if (groupName === 'chart') { + resetChartZoom({ configData, appName }); + } + if (typeof setAggregationEnabled === 'function') { + setAggregationEnabled({ model, appName }); + } + updateModelData(configData, true); + } + if (value) { + analytics.trackEvent( + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].groupings[groupName].modeChange, + ); + } +} diff --git a/src/src/utils/app/onGroupingPaletteChange.ts b/src/src/utils/app/onGroupingPaletteChange.ts new file mode 100644 index 00000000..ac77c2e3 --- /dev/null +++ b/src/src/utils/app/onGroupingPaletteChange.ts @@ -0,0 +1,41 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onGroupingPaletteChange({ + index, + model, + appName, + updateModelData, + setAggregationEnabled, +}: { + index: number; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setAggregationEnabled?: any; +}): void { + const configData = model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { + ...configData.grouping, + paletteIndex: index, + }; + if (typeof setAggregationEnabled === 'function') { + setAggregationEnabled({ model, appName }); + } + updateModelData(configData, true); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].groupings.color.paletteChange} to "${ + index === 0 ? '8 distinct colors' : '24 colors' + }"`, + ); +} diff --git a/src/src/utils/app/onGroupingPersistenceChange.ts b/src/src/utils/app/onGroupingPersistenceChange.ts new file mode 100644 index 00000000..ce160b15 --- /dev/null +++ b/src/src/utils/app/onGroupingPersistenceChange.ts @@ -0,0 +1,47 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onGroupingPersistenceChange({ + groupName, + model, + appName, + updateModelData, + setAggregationEnabled, +}: { + groupName: GroupNameEnum; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setAggregationEnabled?: any; +}): void { + const configData = model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { + ...configData.grouping, + persistence: { + ...configData.grouping.persistence, + [groupName]: !configData.grouping.persistence[groupName], + }, + }; + if (typeof setAggregationEnabled === 'function') { + setAggregationEnabled({ model, appName }); + } + updateModelData(configData, true); + } + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].groupings[groupName].persistenceChange + } to ${ + !configData?.grouping.persistence[groupName] ? 'Disable' : 'Enable' + }`, + ); +} diff --git a/src/src/utils/app/onGroupingReset.ts b/src/src/utils/app/onGroupingReset.ts new file mode 100644 index 00000000..6c0e3a3c --- /dev/null +++ b/src/src/utils/app/onGroupingReset.ts @@ -0,0 +1,39 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onGroupingReset({ + groupName, + model, + appName, + updateModelData, + setAggregationEnabled, +}: { + groupName: GroupNameEnum; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setAggregationEnabled?: any; +}) { + const configData = model.getState()?.config; + if (configData?.grouping) { + const { reverseMode, paletteIndex, isApplied, persistence } = + configData.grouping; + configData.grouping = { + ...configData.grouping, + reverseMode: { ...reverseMode, [groupName]: false }, + [groupName]: [], + paletteIndex: groupName === 'color' ? 0 : paletteIndex, + persistence: { ...persistence, [groupName]: false }, + isApplied: { ...isApplied, [groupName]: true }, + }; + if (typeof setAggregationEnabled === 'function') { + setAggregationEnabled({ model, appName }); + } + updateModelData(configData, true); + } +} diff --git a/src/src/utils/app/onGroupingSelectChange.ts b/src/src/utils/app/onGroupingSelectChange.ts new file mode 100644 index 00000000..92f6f8c5 --- /dev/null +++ b/src/src/utils/app/onGroupingSelectChange.ts @@ -0,0 +1,39 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import resetChartZoom from './resetChartZoom'; + +export default function onGroupingSelectChange({ + groupName, + list, + model, + appName, + updateModelData, + setAggregationEnabled, +}: { + groupName: GroupNameEnum; + list: string[]; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setAggregationEnabled?: any; +}) { + let configData = model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { ...configData.grouping, [groupName]: list }; + configData = resetChartZoom({ configData, appName }); + if (typeof setAggregationEnabled === 'function') { + setAggregationEnabled({ model, appName }); + } + updateModelData(configData, true); + } + analytics.trackEvent(`[${appName}Explorer] Group by ${groupName}`); + // doesnt need additional key for tracking, just didnt removed this line +} diff --git a/src/src/utils/app/onHighlightModeChange.ts b/src/src/utils/app/onHighlightModeChange.ts new file mode 100644 index 00000000..f909d0e7 --- /dev/null +++ b/src/src/utils/app/onHighlightModeChange.ts @@ -0,0 +1,39 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; + +import { HighlightEnum } from 'utils/d3'; + +import updateURL from './updateURL'; + +export default function onHighlightModeChange({ + mode, + model, + appName, +}: { + mode: HighlightEnum; + model: IModel; + appName: string; +}): void { + const config = model.getState()?.config; + if (config?.chart) { + const configData = { + ...config, + chart: { + ...config.chart, + highlightMode: mode, + }, + }; + model.setState({ config: configData }); + + updateURL({ configData, appName }); + } + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeHighlightMode + } to "${HighlightEnum[mode].toLowerCase()}"`, + ); +} diff --git a/src/src/utils/app/onIgnoreOutliersChange.ts b/src/src/utils/app/onIgnoreOutliersChange.ts new file mode 100644 index 00000000..8dc210b3 --- /dev/null +++ b/src/src/utils/app/onIgnoreOutliersChange.ts @@ -0,0 +1,37 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +/** + * + * @param {IModel} model - instance of createModel + */ + +export default function onIgnoreOutliersChange({ + model, + updateModelData, + appName, +}: { + model: IModel; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + appName: string; +}): void { + const configData = model.getState()?.config; + if (configData?.chart) { + configData.chart.ignoreOutliers = !configData?.chart.ignoreOutliers; + updateModelData(configData, true); + model.setState({ config: configData }); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.changeOutliers} to ${ + !configData?.chart.ignoreOutliers ? 'Ignore' : 'Display' + }`, + ); +} diff --git a/src/src/utils/app/onLegendsChange.ts b/src/src/utils/app/onLegendsChange.ts new file mode 100644 index 00000000..a92ed22f --- /dev/null +++ b/src/src/utils/app/onLegendsChange.ts @@ -0,0 +1,58 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { LegendsConfig } from 'types/services/models/metrics/metricsAppModel'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +/** + * onLegendsChange - handler for legends config change + * + * @param {IModel} model - instance of createModel + * @param {LegendsConfig} legends - legends config + * @param {string} appName - name of the app model + */ + +export default function onLegendsChange({ + model, + legends, + updateModelData, + appName, +}: { + model: IModel; + legends: Partial; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.chart) { + configData.chart = { + ...configData.chart, + legends: { + ...configData.chart.legends, + ...legends, + }, + }; + updateModelData(configData, true); + model.setState({ config: configData }); + } + if (legends?.mode) { + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.legends.mode} to ${configData?.chart.legends.mode}`, + ); + } + + if (legends?.display) { + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.legends.display} to ${ + configData?.chart.legends.display ? 'visible' : 'hidden' + }`, + ); + } +} diff --git a/src/src/utils/app/onMetricsValueKeyChange.ts b/src/src/utils/app/onMetricsValueKeyChange.ts new file mode 100644 index 00000000..bd9e4820 --- /dev/null +++ b/src/src/utils/app/onMetricsValueKeyChange.ts @@ -0,0 +1,46 @@ +import { MetricsValueKeyEnum } from 'config/enums/tableEnums'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onMetricsValueKeyChange({ + metricsValueKey, + model, + appName, + updateModelData, +}: { + metricsValueKey: MetricsValueKeyEnum; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + metricsValueKey, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].table.changeMetricsValueKey + } to "${metricsValueKey}"`, + ); +} diff --git a/src/src/utils/app/onMetricsVisibilityChange.ts b/src/src/utils/app/onMetricsVisibilityChange.ts new file mode 100644 index 00000000..c4825e0e --- /dev/null +++ b/src/src/utils/app/onMetricsVisibilityChange.ts @@ -0,0 +1,57 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onMetricVisibilityChange({ + metricsKeys, + model, + appName, + updateModelData, +}: { + metricsKeys: string[]; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + const processedData = model.getState()?.data; + if (configData?.table && processedData) { + const table = { + ...configData.table, + hiddenMetrics: + metricsKeys[0] === 'all' + ? Object.values(processedData) + .map((metricCollection) => + metricCollection.data.map( + (metric: Record) => metric.key, + ), + ) + .flat() + : metricsKeys, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].table.metricVisibilityChange} / ${ + metricsKeys[0] === 'all' + ? 'Visualize all hidden metrics from table' + : 'Hide all metrics from table' + }`, + ); +} diff --git a/src/src/utils/app/onNotificationAdd.ts b/src/src/utils/app/onNotificationAdd.ts new file mode 100644 index 00000000..3a807daa --- /dev/null +++ b/src/src/utils/app/onNotificationAdd.ts @@ -0,0 +1,16 @@ +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { IModel, State } from 'types/services/models/model'; + +import onNotificationDelete from './onNotificationDelete'; + +export default function onNotificationAdd< + M extends State, + N extends INotification, +>({ notification, model }: { notification: N; model: IModel }): void { + let notifyData: INotification[] | [] = model.getState()?.notifyData || []; + notifyData = [...notifyData, notification]; + model.setState({ notifyData }); + setTimeout(() => { + onNotificationDelete({ id: notification.id, model }); + }, notification.closeDelay ?? 3000); +} diff --git a/src/src/utils/app/onNotificationDelete.ts b/src/src/utils/app/onNotificationDelete.ts new file mode 100644 index 00000000..a0b18345 --- /dev/null +++ b/src/src/utils/app/onNotificationDelete.ts @@ -0,0 +1,14 @@ +import { IModel, State } from 'types/services/models/model'; +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; + +export default function onNotificationDelete({ + id, + model, +}: { + id: number; + model: IModel; +}): void { + let notifyData: INotification[] | [] = model.getState()?.notifyData || []; + notifyData = [...notifyData].filter((i) => i.id !== id); + model.setState({ notifyData }); +} diff --git a/src/src/utils/app/onParamsVisibilityChange.ts b/src/src/utils/app/onParamsVisibilityChange.ts new file mode 100644 index 00000000..b8e93ec8 --- /dev/null +++ b/src/src/utils/app/onParamsVisibilityChange.ts @@ -0,0 +1,52 @@ +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onParamVisibilityChange({ + metricsKeys, + model, + appName, + updateModelData, +}: { + metricsKeys: string[]; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig, + shouldURLUpdate?: boolean, + ) => void; +}) { + const configData = model.getState()?.config; + const processedData = model.getState()?.data; + if (configData?.table && processedData) { + const table = { + ...configData.table, + hiddenMetrics: + metricsKeys[0] === 'all' + ? Object.values(processedData) + .map((metricCollection) => + metricCollection.data.map((metric: any) => metric.key), + ) + .flat() + : metricsKeys, + }; + const configUpdate = { + ...configData, + table, + }; + model.setState({ config: configUpdate }); + setItem(`${appName.toLowerCase()}Table`, encode(table)); + updateModelData(configUpdate); + } + analytics.trackEvent( + `[${appName}Explorer][Table] ${ + metricsKeys[0] === 'all' + ? 'Visualize all hidden metrics from table' + : 'Hide all metrics from table' + }`, + ); +} diff --git a/src/src/utils/app/onResetConfigData.ts b/src/src/utils/app/onResetConfigData.ts new file mode 100644 index 00000000..b69798c5 --- /dev/null +++ b/src/src/utils/app/onResetConfigData.ts @@ -0,0 +1,24 @@ +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onResetConfigData({ + model, + getConfig, + updateModelData, +}: { + model: IModel; + getConfig: () => any; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData) { + configData.grouping = { + ...getConfig().grouping, + }; + configData.chart = { ...getConfig().chart }; + updateModelData(configData, true); + } +} diff --git a/src/src/utils/app/onRowHeightChange.ts b/src/src/utils/app/onRowHeightChange.ts new file mode 100644 index 00000000..331c39c7 --- /dev/null +++ b/src/src/utils/app/onRowHeightChange.ts @@ -0,0 +1,40 @@ +import { RowHeightEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onRowHeightChange({ + height, + model, + appName, +}: { + height: RowHeightSize; + model: IModel; + appName: string; +}): void { + const configData = model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + rowHeight: height, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + } + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].table.changeTableRowHeight + } to "${RowHeightEnum[height].toLowerCase()}"`, + ); +} diff --git a/src/src/utils/app/onRowSelect.ts b/src/src/utils/app/onRowSelect.ts new file mode 100644 index 00000000..e6f98c19 --- /dev/null +++ b/src/src/utils/app/onRowSelect.ts @@ -0,0 +1,100 @@ +import _ from 'lodash-es'; + +import { IModel, State } from 'types/services/models/model'; + +/** + * + * @param {string} key - key of table column + * @param {any} data - nested data + * @param {string} actionType - action type name + * @param {IModel} model - instance of create model + */ + +export interface IRowSelectProps { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + model: IModel; +} + +export default function onRowSelect({ + actionType, + data, + model, +}: IRowSelectProps): any { + let selectedRows = model.getState()?.selectedRows || {}; + let rawData = + model.getState()?.rawData?.reduce((acc: any, item: any) => { + acc[item.hash] = { + runHash: item.hash, + ...item.props, + }; + return acc; + }, {}) || {}; + switch (actionType) { + case 'single': + if (selectedRows[data.selectKey]) { + selectedRows = _.omit(selectedRows, [data.selectKey]); + } else { + selectedRows[data.selectKey] = { + selectKey: data.selectKey, + isHidden: data.isHidden, + key: data.key, + ...rawData[sliceRunHash(data.selectKey)], + }; + } + break; + case 'selectAll': + if (Array.isArray(data)) { + data.forEach((item: any) => { + if (!selectedRows[item.selectKey]) { + selectedRows[item.selectKey] = { + selectKey: item.selectKey, + isHidden: item.isHidden, + key: item.key, + ...rawData[sliceRunHash(item.selectKey)], + }; + } + }); + } else { + Object.values(data) + .reduce((acc: any[], value: any) => { + return acc.concat(value.items); + }, []) + .forEach((item: any) => { + if (!selectedRows[item.selectKey]) { + selectedRows[item.selectKey] = { + selectKey: item.selectKey, + isHidden: item.isHidden, + key: item.key, + ...rawData[sliceRunHash(item.selectKey)], + }; + } + }); + } + + break; + case 'removeAll': + if (Array.isArray(data)) { + const hashArray: string[] = data.map((item: any) => item.selectKey); + selectedRows = _.omit(selectedRows, hashArray); + } else { + const hashArray: string[] = Object.values(data) + .reduce((acc: any[], value: any) => { + return acc.concat(value.items); + }, []) + .map((item: any) => item.selectKey); + selectedRows = _.omit(selectedRows, hashArray); + } + + break; + } + + model.setState({ + selectedRows: { ...selectedRows }, + }); + return selectedRows; +} + +function sliceRunHash(key: string): string { + return key.slice(0, key.indexOf('/')); +} diff --git a/src/src/utils/app/onRowVisibilityChange.ts b/src/src/utils/app/onRowVisibilityChange.ts new file mode 100644 index 00000000..c6fc6a03 --- /dev/null +++ b/src/src/utils/app/onRowVisibilityChange.ts @@ -0,0 +1,43 @@ +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onRowVisibilityChange({ + metricKey, + model, + appName, + updateModelData, +}: { + metricKey: string; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}) { + const configData = model.getState()?.config; + if (configData?.table) { + let hiddenMetrics = configData?.table?.hiddenMetrics || []; + if (hiddenMetrics?.includes(metricKey)) { + hiddenMetrics = hiddenMetrics.filter( + (hiddenMetric: string) => hiddenMetric !== metricKey, + ); + } else { + hiddenMetrics = [...hiddenMetrics, metricKey]; + } + const table = { + ...configData.table, + hiddenMetrics, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } +} diff --git a/src/src/utils/app/onRowsVisibilityChange.ts b/src/src/utils/app/onRowsVisibilityChange.ts new file mode 100644 index 00000000..18d462b9 --- /dev/null +++ b/src/src/utils/app/onRowsVisibilityChange.ts @@ -0,0 +1,45 @@ +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onRowVisibilityChange({ + metricKeys, + model, + appName, + updateModelData, +}: { + metricKeys: string[]; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}) { + const configData = model.getState()?.config; + if (configData?.table) { + let hiddenMetrics = [...configData?.table?.hiddenMetrics] || []; + metricKeys.forEach((metricKey) => { + if (hiddenMetrics?.includes(metricKey)) { + hiddenMetrics = hiddenMetrics.filter( + (hiddenMetric: string) => hiddenMetric !== metricKey, + ); + } else { + hiddenMetrics = [...hiddenMetrics, metricKey]; + } + }); + const table = { + ...configData.table, + hiddenMetrics, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } +} diff --git a/src/src/utils/app/onRunsTagsChange.ts b/src/src/utils/app/onRunsTagsChange.ts new file mode 100644 index 00000000..369bcb9b --- /dev/null +++ b/src/src/utils/app/onRunsTagsChange.ts @@ -0,0 +1,34 @@ +import { ITagInfo } from 'types/pages/tags/Tags'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; +import { IModel, State } from 'types/services/models/model'; + +export default function onRunsTagsChange({ + tags, + runHash, + model, + updateModelData, +}: { + tags: ITagInfo[]; + runHash: string; + model: IModel; + updateModelData: ( + configData?: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}) { + const data = model.getState()?.rawData; + const resultData = data?.map((item: any) => { + if (item.hash === runHash) { + return { + ...item, + props: { + ...item.props, + tags, + }, + }; + } + return item; + }); + model.setState({ rawData: resultData }); + updateModelData(); +} diff --git a/src/src/utils/app/onSearchQueryCopy.ts b/src/src/utils/app/onSearchQueryCopy.ts new file mode 100644 index 00000000..c8cb3a7c --- /dev/null +++ b/src/src/utils/app/onSearchQueryCopy.ts @@ -0,0 +1,21 @@ +import { IModel, State } from 'types/services/models/model'; + +import { onCopyToClipBoard } from 'utils/onCopyToClipBoard'; + +import onNotificationAdd from './onNotificationAdd'; +import getQueryStringFromSelect from './getQueryStringFromSelect'; + +function onSearchQueryCopy(model: IModel): void { + const selectedMetricsData = model.getState()?.config?.select; + let query = getQueryStringFromSelect(selectedMetricsData); + onCopyToClipBoard(query, false, () => onNotificationAdd, { + notification: { + id: Date.now(), + severity: 'success', + messages: ['Run Expression Copied'], + }, + model, + }); +} + +export default onSearchQueryCopy; diff --git a/src/src/utils/app/onSelectAdvancedQueryChange.ts b/src/src/utils/app/onSelectAdvancedQueryChange.ts new file mode 100644 index 00000000..5f644099 --- /dev/null +++ b/src/src/utils/app/onSelectAdvancedQueryChange.ts @@ -0,0 +1,19 @@ +import { IModel, State } from 'types/services/models/model'; + +export default function onSelectAdvancedQueryChange({ + query, + model, +}: { + query: string; + model: IModel; +}) { + const configData = model.getState()?.config; + if (configData?.select) { + const newConfig = { + ...configData, + select: { ...configData.select, advancedQuery: query }, + }; + + model.setState({ config: newConfig }); + } +} diff --git a/src/src/utils/app/onSelectOptionsChange.ts b/src/src/utils/app/onSelectOptionsChange.ts new file mode 100644 index 00000000..59e9e9a3 --- /dev/null +++ b/src/src/utils/app/onSelectOptionsChange.ts @@ -0,0 +1,17 @@ +import { IModel, State } from 'types/services/models/model'; +import { ISelectOption } from 'types/services/models/explorer/createAppModel'; + +export default function onSelectOptionsChange< + M extends State, + D extends Partial, +>({ data, model }: { data: D; model: IModel }) { + const configData = model.getState()?.config; + if (configData?.select) { + const newConfig = { + ...configData, + select: { ...configData.select, options: data }, + }; + + model.setState({ config: newConfig }); + } +} diff --git a/src/src/utils/app/onSelectRunQueryChange.ts b/src/src/utils/app/onSelectRunQueryChange.ts new file mode 100644 index 00000000..bbf785c7 --- /dev/null +++ b/src/src/utils/app/onSelectRunQueryChange.ts @@ -0,0 +1,19 @@ +import { IModel, State } from 'types/services/models/model'; + +export default function onSelectRunQueryChange({ + query, + model, +}: { + query: string; + model: IModel; +}) { + const configData = model.getState()?.config; + if (configData?.select) { + const newConfig = { + ...configData, + select: { ...configData.select, query }, + }; + + model.setState({ config: newConfig }); + } +} diff --git a/src/src/utils/app/onShuffleChange.ts b/src/src/utils/app/onShuffleChange.ts new file mode 100644 index 00000000..9076451b --- /dev/null +++ b/src/src/utils/app/onShuffleChange.ts @@ -0,0 +1,27 @@ +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onShuffleChange({ + name, + model, + updateModelData, +}: { + name: 'color' | 'stroke'; + model: IModel; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}) { + const configData = model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { + ...configData.grouping, + seed: { + ...configData.grouping.seed, + [name]: configData.grouping.seed[name] + 1, + }, + }; + updateModelData(configData, true); + } +} diff --git a/src/src/utils/app/onSmoothingChange.ts b/src/src/utils/app/onSmoothingChange.ts new file mode 100644 index 00000000..449dbed0 --- /dev/null +++ b/src/src/utils/app/onSmoothingChange.ts @@ -0,0 +1,53 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; +import { ISmoothing } from 'types/services/models/metrics/metricsAppModel'; + +import { CurveEnum } from 'utils/d3'; + +export default function onSmoothingChange({ + args, + model, + appName, + updateModelData, +}: { + args: Partial; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model?.getState()?.config; + if (configData?.chart) { + configData.chart = { + ...configData.chart, + smoothing: { + ...configData.chart.smoothing, + ...args, + }, + }; + updateModelData(configData, true); + } + if (args.curveInterpolation) { + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls + .changeCurveInterpolationMode + } to "${ + args.curveInterpolation === CurveEnum.Linear ? 'linear' : 'cubic' + }"`, + ); + } else { + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.selectSmoothingOptions} to "${configData?.chart.smoothing.algorithm}"`, + { smoothingFactor: configData?.chart.smoothing.factor }, + ); + } +} diff --git a/src/src/utils/app/onSortFieldsChange.ts b/src/src/utils/app/onSortFieldsChange.ts new file mode 100644 index 00000000..8902991d --- /dev/null +++ b/src/src/utils/app/onSortFieldsChange.ts @@ -0,0 +1,42 @@ +import { isEmpty } from 'lodash-es'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onSortFieldsChange({ + sortFields, + model, + appName, + updateModelData, +}: { + sortFields: [string, any][]; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}) { + const configData = model.getState()?.config; + if (configData?.table) { + const configUpdate = { + ...configData, + table: { + ...configData.table, + sortFields: sortFields, + }, + }; + model.setState({ config: configUpdate }); + updateModelData(configUpdate); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].table.changeSorting} ${ + isEmpty(sortFields) ? 'Reset' : 'Apply' + } table sorting by a key`, + ); +} diff --git a/src/src/utils/app/onTableDiffShow.ts b/src/src/utils/app/onTableDiffShow.ts new file mode 100644 index 00000000..a75ac019 --- /dev/null +++ b/src/src/utils/app/onTableDiffShow.ts @@ -0,0 +1,33 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import onColumnsVisibilityChange from './onColumnsVisibilityChange'; + +export function onTableDiffShow({ + model, + appName, + updateModelData, +}: { + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const sameValueColumns = model.getState()?.sameValueColumns; + if (sameValueColumns && typeof onColumnsVisibilityChange === 'function') { + onColumnsVisibilityChange({ + hiddenColumns: sameValueColumns, + model, + appName, + updateModelData, + }); + } + // @ts-ignore + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.showDiff); +} diff --git a/src/src/utils/app/onTableResizeEnd.ts b/src/src/utils/app/onTableResizeEnd.ts new file mode 100644 index 00000000..deed7f31 --- /dev/null +++ b/src/src/utils/app/onTableResizeEnd.ts @@ -0,0 +1,28 @@ +import { IModel, State } from 'types/services/models/model'; + +import { setItem } from 'utils/storage'; +import { encode } from 'utils/encoder/encoder'; + +export function onTableResizeEnd({ + tableHeight, + model, + appName, +}: { + tableHeight: string; + model: IModel; + appName: string; +}): void { + const configData = model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + height: tableHeight, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + } +} diff --git a/src/src/utils/app/onTableResizeModeChange.ts b/src/src/utils/app/onTableResizeModeChange.ts new file mode 100644 index 00000000..a3a16a32 --- /dev/null +++ b/src/src/utils/app/onTableResizeModeChange.ts @@ -0,0 +1,36 @@ +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; + +import { setItem } from '../storage'; +import { encode } from '../encoder/encoder'; + +export default function onTableResizeModeChange({ + mode, + model, + appName, +}: { + mode: ResizeModeEnum; + model: IModel; + appName: string; +}): void { + const configData = model?.getState()?.config; + + if (configData?.table) { + const table = { + ...configData.table, + resizeMode: mode, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + } + // @ts-ignore + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.changeResizeMode); +} diff --git a/src/src/utils/app/onTableRowClick.ts b/src/src/utils/app/onTableRowClick.ts new file mode 100644 index 00000000..c1216189 --- /dev/null +++ b/src/src/utils/app/onTableRowClick.ts @@ -0,0 +1,24 @@ +import { IModel, State } from 'types/services/models/model'; + +export default function onTableRowClick({ + rowKey, + model, +}: { + rowKey?: string; + model: IModel; +}): void { + const configData = model?.getState()!.config!; + const chartPanelRef: any = model?.getState()?.refs?.chartPanelRef; + let focusedStateActive = !!rowKey; + if ( + configData.chart.focusedState.active && + configData.chart.focusedState.key === rowKey + ) { + focusedStateActive = false; + } + chartPanelRef?.current?.setActiveLineAndCircle( + rowKey || configData?.chart?.focusedState?.key, + focusedStateActive, + true, + ); +} diff --git a/src/src/utils/app/onTableRowHover.ts b/src/src/utils/app/onTableRowHover.ts new file mode 100644 index 00000000..5afb497f --- /dev/null +++ b/src/src/utils/app/onTableRowHover.ts @@ -0,0 +1,17 @@ +import { IModel, State } from 'types/services/models/model'; + +export default function onTableRowHover({ + rowKey, + model, +}: { + rowKey?: string; + model: IModel; +}): void { + const configData = model?.getState()?.config; + if (configData?.chart) { + const chartPanelRef: any = model?.getState()?.refs?.chartPanelRef; + if (chartPanelRef && !configData.chart.focusedState.active) { + chartPanelRef.current?.setActiveLineAndCircle(rowKey); + } + } +} diff --git a/src/src/utils/app/onTableSortChange.ts b/src/src/utils/app/onTableSortChange.ts new file mode 100644 index 00000000..4ac149b0 --- /dev/null +++ b/src/src/utils/app/onTableSortChange.ts @@ -0,0 +1,51 @@ +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import updateTableSortFields from 'utils/app/updateTableSortFields'; +import { getSortedFields, SortField, SortFields } from 'utils/getSortedFields'; +/** + * function onSortChange has 3 major functionalities + * 1. if only field param passed, the function will change sort option with the following cycle ('asc' -> 'desc' -> none -> 'asc) + * 2. if value param passed 'asc' or 'desc', the function will replace the sort option of the field in sortFields + * 3. if value param passed 'none', the function will delete the field from sortFields + * @param {String} field - the name of the field (i.e params.dataset.preproc) + * @param {'asc' | 'desc' | 'none'} order - 'asc' | 'desc' | 'none' + * @param {String} actionType - the type of the action (i.e DELETE) + */ + +export default function onTableSortChange({ + sortFields, + order, + index, + actionType, + field, + model, + appName, + updateModelData, +}: { + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + order?: 'asc' | 'desc'; + actionType: string; + field?: SortField; + index: number; + sortFields: SortFields; +}) { + const configData: any | undefined = model.getState()?.config; + updateTableSortFields({ + sortFields: getSortedFields({ + sortFields: sortFields || configData?.table.sortFields || [], + order, + index, + actionType, + field, + }), + model, + appName, + updateModelData, + }); +} diff --git a/src/src/utils/app/onToggleColumnsColorScales.ts b/src/src/utils/app/onToggleColumnsColorScales.ts new file mode 100644 index 00000000..2af7f49b --- /dev/null +++ b/src/src/utils/app/onToggleColumnsColorScales.ts @@ -0,0 +1,45 @@ +import _ from 'lodash-es'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { setItem } from 'utils/storage'; +import { encode } from 'utils/encoder/encoder'; + +/** + * @param {String} colKey - column name + */ + +export default function onToggleColumnsColorScales({ + colKey, + model, + appName, + updateModelData, +}: { + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + colKey: string; +}) { + const state = model.getState(); + const configData = state?.config; + let columnsColorScales = configData?.table?.columnsColorScales || {}; + const table = { + ...configData?.table, + columnsColorScales: columnsColorScales[colKey] + ? { ..._.omit(columnsColorScales, colKey) } + : { ...columnsColorScales, [colKey]: true }, + }; + const config = { + ...configData, + table, + }; + model.setState({ + config, + }); + setItem(`${appName.toLowerCase()}Table`, encode(table)); + updateModelData(config); +} diff --git a/src/src/utils/app/onZoomChange.ts b/src/src/utils/app/onZoomChange.ts new file mode 100644 index 00000000..9e6980a7 --- /dev/null +++ b/src/src/utils/app/onZoomChange.ts @@ -0,0 +1,45 @@ +import _ from 'lodash-es'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IChartZoom } from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import updateURL from './updateURL'; + +export default function onZoomChange({ + zoom, + model, + appName, +}: { + zoom: Partial; + model: IModel; + appName: string; +}): void { + const config = model.getState()?.config; + if (config?.chart) { + const configData = { + ...config, + chart: { + ...config.chart, + zoom: { + ...config.chart.zoom, + ...zoom, + }, + }, + }; + model.setState({ config: configData }); + + updateURL({ configData, appName }); + } + if (!_.isNil(zoom.mode)) { + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.changeZoomMode} to "${ + zoom.mode === 0 ? 'single' : 'multiple' + }"`, + ); + } +} diff --git a/src/src/utils/app/resetChartZoom.ts b/src/src/utils/app/resetChartZoom.ts new file mode 100644 index 00000000..c2741061 --- /dev/null +++ b/src/src/utils/app/resetChartZoom.ts @@ -0,0 +1,24 @@ +import { + IAppModelConfig, + ILineChartConfig, +} from 'types/services/models/explorer/createAppModel'; + +export default function resetChartZoom({ + configData, + appName, +}: { + configData: IAppModelConfig; + appName: string; +}): IAppModelConfig { + if (configData.chart) { + configData.chart = { + ...configData.chart, + zoom: { + ...(configData.chart as ILineChartConfig).zoom, + active: false, + history: [], + }, + }; + } + return configData; +} diff --git a/src/src/utils/app/resetModelOnError.ts b/src/src/utils/app/resetModelOnError.ts new file mode 100644 index 00000000..ea0f9742 --- /dev/null +++ b/src/src/utils/app/resetModelOnError.ts @@ -0,0 +1,32 @@ +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { IModel, State } from 'types/services/models/model'; + +export default function resetModelOnError({ + detail, + model, +}: { + detail?: any; + model?: IModel; +}) { + // TODO set state correctly for any app model state + model?.setState({ + data: [], + params: [], + lineChartData: [], + aggregatedData: [], + tableData: [], + tableColumns: [], + requestStatus: RequestStatusEnum.BadRequest, + }); + + setTimeout(() => { + const tableRef: any = model?.getState()?.refs?.tableRef; + if (tableRef?.current) { + tableRef?.current?.updateData({ + newData: [], + newColumns: [], + }); + } + }, 0); +} diff --git a/src/src/utils/app/setAggregationEnabled.ts b/src/src/utils/app/setAggregationEnabled.ts new file mode 100644 index 00000000..e6b0ca2b --- /dev/null +++ b/src/src/utils/app/setAggregationEnabled.ts @@ -0,0 +1,20 @@ +import { IModel, State } from 'types/services/models/model'; + +import isGroupingApplied from './isGroupingApplied'; + +export default function setAggregationEnabled({ + model, + appName, +}: { + model: IModel; + appName: string; +}): void { + const configData = model.getState().config; + const isAppliedGrouping = isGroupingApplied>(model); + if (configData) { + configData.chart.aggregationConfig.isEnabled = isAppliedGrouping; + if (!isAppliedGrouping) { + configData.chart.aggregationConfig.isApplied = false; + } + } +} diff --git a/src/src/utils/app/setComponentRefs.ts b/src/src/utils/app/setComponentRefs.ts new file mode 100644 index 00000000..be6a6b41 --- /dev/null +++ b/src/src/utils/app/setComponentRefs.ts @@ -0,0 +1,20 @@ +import { IModel, State } from 'types/services/models/model'; + +/** + * + * @param {ISetComponentRefsParams} + */ + +export default function setComponentRefs({ + refElement, + model, +}: { + refElement: any; + model: IModel; +}): void { + const modelState = model.getState(); + if (modelState?.refs) { + modelState.refs = Object.assign(modelState.refs, refElement); + model.setState({ refs: modelState.refs }); + } +} diff --git a/src/src/utils/app/setDefaultAppConfigData.ts b/src/src/utils/app/setDefaultAppConfigData.ts new file mode 100644 index 00000000..1c3d2243 --- /dev/null +++ b/src/src/utils/app/setDefaultAppConfigData.ts @@ -0,0 +1,101 @@ +import _ from 'lodash-es'; + +import { IModel, State } from 'types/services/models/model'; +import { + IAppInitialConfig, + IAppModelConfig, +} from 'types/services/models/explorer/createAppModel'; + +import { getItem, setItem } from 'utils/storage'; +import { AIM64_ENCODING_PREFIX, encode } from 'utils/encoder/encoder'; +import getStateFromUrl from 'utils/getStateFromUrl'; +import { getCompatibleSelectConfig } from 'utils/app/getCompatibleSelectConfig'; +import { getCompatibleChartConfig } from 'utils/app/getCompatibleChartConfig'; +import decodeWithBase58Checker from 'utils/decodeWithBase58Checker'; + +import updateURL from './updateURL'; + +export default function setDefaultAppConfigData({ + config, + appInitialConfig, + model, + recoverTableState = true, +}: { + config: IAppModelConfig; + appInitialConfig: IAppInitialConfig; + model: IModel; + recoverTableState: boolean; +}): void { + const { grouping, selectForm, components, appName } = appInitialConfig; + const searchParam = new URLSearchParams(window.location.search); + + const liveUpdateConfigHash = getItem(`${appName}LUConfig`); + const luConfig = liveUpdateConfigHash + ? JSON.parse( + decodeWithBase58Checker({ + value: liveUpdateConfigHash, + localStorageKey: `${appName}LUConfig`, + }), + ) + : config?.liveUpdate; + + // Backward compatibility, update users storage data if code has change in delay + // @ts-ignore + if (luConfig.delay !== config?.liveUpdate.delay) { + // @ts-ignore + luConfig.delay = config?.liveUpdate.delay; + setItem(`${appName}LuConfig`, encode(luConfig)); + } + /// + + const defaultConfig: IAppModelConfig = { liveUpdate: luConfig }; + + if (grouping) { + defaultConfig.grouping = getStateFromUrl('grouping') ?? {}; + } + if (selectForm) { + const compatibleSelectConfig = getCompatibleSelectConfig( + ['metrics', 'params', 'images'], + getStateFromUrl('select'), + ); + defaultConfig.select = compatibleSelectConfig ?? {}; + } + if (components.charts) { + const compatibleChartConfig = getCompatibleChartConfig( + getStateFromUrl('chart'), + ); + defaultConfig.chart = compatibleChartConfig ?? {}; + } + if (recoverTableState && components.table) { + const tableConfigHash = getItem(`${appName}Table`); + defaultConfig.table = tableConfigHash + ? JSON.parse( + decodeWithBase58Checker({ + value: tableConfigHash, + localStorageKey: `${appName}Table`, + }), + ) + : config?.table; + } + const configData: IAppModelConfig = _.mergeWith( + {}, + model.getState().config, + defaultConfig, + (objValue, srcValue) => { + if (_.isArray(objValue)) { + return srcValue; + } + }, + ); + if ( + (searchParam.get('grouping') && + !searchParam.get('grouping')?.startsWith(AIM64_ENCODING_PREFIX)) || + (searchParam.get('chart') && + !searchParam.get('chart')?.startsWith(AIM64_ENCODING_PREFIX)) || + (searchParam.get('select') && + !searchParam.get('select')?.startsWith(AIM64_ENCODING_PREFIX)) + ) { + updateURL({ configData, appName }); + } + model.setState({ config: configData }); +} diff --git a/src/src/utils/app/setRequestProgress.ts b/src/src/utils/app/setRequestProgress.ts new file mode 100644 index 00000000..fc55e703 --- /dev/null +++ b/src/src/utils/app/setRequestProgress.ts @@ -0,0 +1,22 @@ +import { IModel, State } from 'types/services/models/model'; + +export interface IRequestProgress { + matched: number; + checked: number; + trackedRuns: number; + percent?: number; +} + +export default function setRequestProgress( + model: IModel, + progress: Partial = {}, +) { + const { checked = 0, trackedRuns = 0 } = progress; + + model.setState({ + requestProgress: { + ...progress, + percent: trackedRuns ? Math.ceil((checked / trackedRuns) * 100) : 0, + }, + }); +} diff --git a/src/src/utils/app/setRequestStatus.ts b/src/src/utils/app/setRequestStatus.ts new file mode 100644 index 00000000..633b571c --- /dev/null +++ b/src/src/utils/app/setRequestStatus.ts @@ -0,0 +1,22 @@ +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { IModel, State } from 'types/services/models/model'; + +let timeoutId: number = 0; + +export default function setRequestStatus( + model: IModel, + status: RequestStatusEnum, + delay?: number, +): void { + if (delay || delay === 0) { + if (timeoutId) { + window.clearTimeout(timeoutId); + } + timeoutId = window.setTimeout(() => { + model.setState({ requestStatus: status }); + }, delay); + } else { + model.setState({ requestStatus: status }); + } +} diff --git a/src/src/utils/app/sortDependingArrays.ts b/src/src/utils/app/sortDependingArrays.ts new file mode 100644 index 00000000..1eb27cf2 --- /dev/null +++ b/src/src/utils/app/sortDependingArrays.ts @@ -0,0 +1,34 @@ +/** + * Sort X-axis values in ascending order + * Sort rest arrays values based on corresponding X-axis value order + * + * @property {number[]} xValues - X-axis values + * @property {{key: number[]}} restArrays - object of arrays + * */ +function sortDependingArrays( + xValues: number[], + restArrays: { [key: string]: number[] } = {}, +): { + sortedXValues: number[]; + sortedArrays: { [key: string]: number[] }; +} { + const sortedXValues: number[] = []; + const sortedArrays: { [key: string]: number[] } = {}; + const restArraysKeys = Object.keys(restArrays); + for (let arrKey of restArraysKeys) { + sortedArrays[arrKey] = []; + } + + xValues + .map((value, i) => ({ i, value })) + .sort((a, b) => a.value - b.value) + .forEach((xObj, i) => { + sortedXValues[i] = xValues[xObj.i]; + for (let arrKey of restArraysKeys) { + sortedArrays[arrKey][i] = restArrays[arrKey][xObj.i]; + } + }); + return { sortedXValues, sortedArrays }; +} + +export default sortDependingArrays; diff --git a/src/src/utils/app/toggleSelectAdvancedMode.ts b/src/src/utils/app/toggleSelectAdvancedMode.ts new file mode 100644 index 00000000..6860d4e1 --- /dev/null +++ b/src/src/utils/app/toggleSelectAdvancedMode.ts @@ -0,0 +1,41 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; + +import getQueryStringFromSelect from './getQueryStringFromSelect'; + +export default function toggleSelectAdvancedMode({ + model, + appName, +}: { + model: IModel; + appName: string; +}): void { + const { config, selectFormData } = model.getState(); + if (config) { + let query = + config.select.advancedQuery || + getQueryStringFromSelect(config?.select, selectFormData.error); + if (query === '()') { + query = ''; + } + const newConfig = { + ...config, + select: { + ...config.select, + advancedQuery: query, + advancedMode: !config.select.advancedMode, + }, + }; + + model.setState({ config: newConfig }); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].useAdvancedSearch} ${ + !config?.select.advancedMode ? 'on' : 'off' + }`, + ); +} diff --git a/src/src/utils/app/updateColumnsWidths.ts b/src/src/utils/app/updateColumnsWidths.ts new file mode 100644 index 00000000..53c19a44 --- /dev/null +++ b/src/src/utils/app/updateColumnsWidths.ts @@ -0,0 +1,55 @@ +import _ from 'lodash-es'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +/** + * + * @param {string} key - key of table column + * @param {number} width - width of table column + * @param {boolean} isReset - checking if in columns should be reset + * @param {IModel} model - instance of create model + */ + +export default function updateColumnsWidths({ + key, + width, + isReset, + model, + appName, + updateModelData, +}: { + key: string; + width: number; + isReset: boolean; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.table && configData?.table?.columnsWidths) { + let columnsWidths = configData?.table?.columnsWidths; + if (isReset) { + columnsWidths = _.omit(columnsWidths, [key]); + } else { + columnsWidths = { ...columnsWidths, [key]: width }; + } + const table = { + ...configData.table, + columnsWidths, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName.toLowerCase()}Table`, encode(table)); + updateModelData(config); + } +} diff --git a/src/src/utils/app/updateTableSortFields.ts b/src/src/utils/app/updateTableSortFields.ts new file mode 100644 index 00000000..4f513937 --- /dev/null +++ b/src/src/utils/app/updateTableSortFields.ts @@ -0,0 +1,49 @@ +import { isEmpty } from 'lodash-es'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; +import { SortFields } from 'utils/getSortedFields'; + +export default function updateSortFields({ + sortFields, + model, + appName, + updateModelData, +}: { + sortFields: SortFields; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + sortFields, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].table.changeSorting} ${ + isEmpty(sortFields) ? 'Reset' : 'Apply' + }`, + ); +} diff --git a/src/src/utils/app/updateURL.ts b/src/src/utils/app/updateURL.ts new file mode 100644 index 00000000..dd787d38 --- /dev/null +++ b/src/src/utils/app/updateURL.ts @@ -0,0 +1,28 @@ +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from '../encoder/encoder'; + +import updateUrlParam from './updateUrlParam'; + +export default function updateURL({ + configData, + appName, +}: { + configData: IAppModelConfig; + appName: string; +}) { + const { grouping, chart, select } = configData || {}; + const encodedParams: { [key: string]: string } = {}; + + if (grouping) { + encodedParams.grouping = encode(grouping as {}); + } + if (chart) { + encodedParams.chart = encode(chart as {}); + } + if (select) { + encodedParams.select = encode(select as {}); + } + + updateUrlParam({ data: encodedParams, appName }); +} diff --git a/src/src/utils/app/updateUrlParam.ts b/src/src/utils/app/updateUrlParam.ts new file mode 100644 index 00000000..ac491cbc --- /dev/null +++ b/src/src/utils/app/updateUrlParam.ts @@ -0,0 +1,41 @@ +import getUrlWithParam from 'utils/getUrlWithParam'; +import { setItem } from 'utils/storage'; + +/** + * function updateURL has 2 major functionalities: + * 1. Keeps URL in sync with the incoming argument "data" + * 2. Stores updated URL in localStorage if App is not in the bookmark state + * @data ex. {IAppConfig} configData - the current state of the app config + */ + +export default function updateUrlParam({ + data, + appName, +}: { + data: { [key: string]: string }; + appName: string; +}): void { + const url: string = getUrlWithParam(data); + + if (url === `${window.location.pathname}${window.location.search}`) { + return; + } + + const isExistBasePath = (window as any).API_BASE_PATH !== '{{ base_path }}'; + + const appId: string = + window.location.pathname.split('/')[isExistBasePath ? 3 : 2]; + if (!appId) { + let fullURL = url; + + if (isExistBasePath) { + fullURL = fullURL.replace((window as any).API_BASE_PATH, ''); + } + + if (fullURL.startsWith(`/${appName}?`)) { + setItem(`${appName}Url`, fullURL); + } + } + + window.history.pushState(null, '', url); +} diff --git a/src/src/utils/arrayBufferToBase64.ts b/src/src/utils/arrayBufferToBase64.ts new file mode 100644 index 00000000..f5e031d3 --- /dev/null +++ b/src/src/utils/arrayBufferToBase64.ts @@ -0,0 +1,9 @@ +export default function arrayBufferToBase64(buffer: ArrayBuffer) { + let binary = ''; + const bytes = new Uint8Array(buffer); + const len = bytes.byteLength; + for (let i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return window.btoa(binary); +} diff --git a/src/src/utils/changeDasharraySize.ts b/src/src/utils/changeDasharraySize.ts new file mode 100644 index 00000000..ed21db6d --- /dev/null +++ b/src/src/utils/changeDasharraySize.ts @@ -0,0 +1,13 @@ +function changeDasharraySize( + dasharray: string = 'none', + multiplier: number = 1, +): string { + if (dasharray === 'none') return dasharray; + + return dasharray + .split(' ') + .map((elem) => parseInt(elem) * multiplier) + .join(' '); +} + +export default changeDasharraySize; diff --git a/src/src/utils/contextToString.ts b/src/src/utils/contextToString.ts new file mode 100644 index 00000000..c96c35bd --- /dev/null +++ b/src/src/utils/contextToString.ts @@ -0,0 +1,21 @@ +import { formatValue } from './formatValue'; + +function contextToString( + obj: { [key: string]: unknown }, + mode?: string, +): string | null { + return obj + ? Object.keys(obj) + .map((key) => { + switch (mode) { + case 'keyHash': + return `${key}-${obj[key]}`; + default: + return `${key}=${formatValue(obj[key])}`; + } + }) + .join(mode === 'keyHash' ? '' : ', ') + : null; +} + +export default contextToString; diff --git a/src/src/utils/d3/areaGenerator.ts b/src/src/utils/d3/areaGenerator.ts new file mode 100644 index 00000000..d0ea4b9e --- /dev/null +++ b/src/src/utils/d3/areaGenerator.ts @@ -0,0 +1,15 @@ +import * as d3 from 'd3'; + +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { CurveEnum } from './'; + +export default function areaGenerator(xScale: IAxisScale, yScale: IAxisScale) { + return d3 + .area() + .x0((d: any) => xScale(d[0])) + .y0((d: any) => yScale(d[1])) + .x1((d: any) => xScale(d[2])) + .y1((d: any) => yScale(d[3])) + .curve(d3[CurveEnum.Linear]); +} diff --git a/src/src/utils/d3/clearArea.ts b/src/src/utils/d3/clearArea.ts new file mode 100644 index 00000000..f58b4eb0 --- /dev/null +++ b/src/src/utils/d3/clearArea.ts @@ -0,0 +1,17 @@ +import * as d3 from 'd3'; + +import { IClearAreaProps } from 'types/utils/d3/clearArea'; + +function clearArea(props: IClearAreaProps): void { + if (!props.visAreaRef?.current) { + return; + } + + const area = d3.select(props.visAreaRef.current); + if (area) { + area.selectAll('*').remove(); + area.attr('style', null); + } +} + +export default clearArea; diff --git a/src/src/utils/d3/drawArea.ts b/src/src/utils/d3/drawArea.ts new file mode 100644 index 00000000..08e09821 --- /dev/null +++ b/src/src/utils/d3/drawArea.ts @@ -0,0 +1,171 @@ +import * as d3 from 'd3'; + +import { IDrawAreaArgs } from 'types/utils/d3/drawArea'; + +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { toTextEllipsis } from 'utils/helper'; + +import { CircleEnum } from './index'; + +function drawArea(args: IDrawAreaArgs): void { + const { + index, + id, + nameKey, + parentRef, + visAreaRef, + svgNodeRef, + bgRectNodeRef, + visBoxRef, + plotNodeRef, + axesNodeRef, + plotBoxRef, + linesNodeRef, + attributesNodeRef, + chartTitle = {}, + } = args; + + if (!parentRef?.current || !visAreaRef?.current) { + return; + } + + const parent = d3.select(parentRef.current); + const visArea = d3.select(visAreaRef.current); + + const parentRect = parent.node().getBoundingClientRect(); + + const { width, height } = parentRect; + const { margin } = visBoxRef.current; + + // set visual box dimensions + visBoxRef.current = { + ...visBoxRef.current, + width, + height, + }; + + // set plot box dimensions + plotBoxRef.current = { + ...plotBoxRef.current, + width: width - margin.left - margin.right, + height: height - margin.top - margin.bottom, + }; + + const offsetWidth = + width - margin.left - margin.right >= 0 + ? width - margin.left - margin.right + : 0; + + const offsetHeight = + height - margin.top - margin.bottom >= 0 + ? height - margin.top - margin.bottom + : 0; + + visArea.style('width', `${width}px`).style('height', `${height}px`); + + svgNodeRef.current = visArea + .append('svg') + .attr('class', 'Visualization') + .attr('id', `${nameKey}-svg-area-${id}`) + .attr('width', `${width}px`) + .attr('height', `${height}px`) + .attr('xmlns', 'http://www.w3.org/2000/svg') + .style('fill', 'transparent'); + + bgRectNodeRef.current = svgNodeRef.current + .append('rect') + .attr('x', margin.left) + .attr('y', margin.top) + .attr('class', 'backgroundRect') + .attr('width', offsetWidth) + .attr('height', offsetHeight) + .style('fill', 'transparent'); + + plotNodeRef.current = svgNodeRef.current + .append('g') + .attr('transform', `translate(${margin.left}, ${margin.top})`); + + axesNodeRef.current = plotNodeRef.current.append('g').attr('class', 'Axes'); + linesNodeRef.current = plotNodeRef.current.append('g').attr('class', 'Lines'); + + linesNodeRef.current + .append('clipPath') + .attr('id', `${nameKey}-lines-rect-clip-${id}`) + .append('rect') + .attr('x', 0) + .attr('y', 0) + .attr('width', offsetWidth) + .attr('height', offsetHeight); + + attributesNodeRef.current = plotNodeRef.current + .append('g') + .attr('class', 'Attributes'); + + attributesNodeRef.current + .append('clipPath') + .attr('id', `${nameKey}-circles-rect-clip-${id}`) + .append('rect') + .attr('x', -CircleEnum.Radius) + .attr('y', -CircleEnum.Radius) + .attr('width', offsetWidth + 2 * CircleEnum.Radius) + .attr('height', offsetHeight + 2 * CircleEnum.Radius); + + const titleText = Object.entries(chartTitle || {}) + .map( + ([key, value]) => + `${key}=${ + isSystemMetric(value) ? formatSystemMetricName(value) : value + }`, + ) + .join(', '); + + const title = { + x: margin.left / 6, + fontSize: 11, + fontFamily: 'Inter, sans-serif', + fontWeight: 400, + chartIndex: { + fontFamily: 'Inconsolata, monospace', + }, + }; + const textEllipsis = toTextEllipsis({ + text: titleText, + width: title.x + offsetWidth, + fontSize: `${title.fontSize}px`, + fontFamily: title.fontFamily, + fontWeight: title.fontWeight, + }); + if (titleText) { + const titleGroup = svgNodeRef.current + .append('g') + .attr('transform', `translate(${title.x}, 3)`) + .attr('font-size', `${title.fontSize}px`) + .attr('font-weight', title.fontWeight) + .attr('font-family', title.fontFamily); + + if (index || index === 0) { + titleGroup + .append('text') + .attr('x', 0) + .attr('y', 12) + .attr('fill', '#484f56') + .style('outline', '1px solid #dee6f3') + .style('border-radius', '1px') + .style('white-space', 'pre') + .text(` ${index + 1} `) + .style('font-family', title.chartIndex.fontFamily); + } + + titleGroup + .append('text') + .attr('x', title.x + 39) + .attr('y', 12) + .attr('fill', '#484f56') + .text(textEllipsis) + .append('svg:title') + .text(titleText); + } +} + +export default drawArea; diff --git a/src/src/utils/d3/drawAxes.ts b/src/src/utils/d3/drawAxes.ts new file mode 100644 index 00000000..2302c9f0 --- /dev/null +++ b/src/src/utils/d3/drawAxes.ts @@ -0,0 +1,350 @@ +import * as d3 from 'd3'; +import _ from 'lodash-es'; +import moment from 'moment'; + +import { DATE_CHART_TICK } from 'config/dates/dates'; + +import { IDrawAxesArgs } from 'types/utils/d3/drawAxes'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { + formatValueByAlignment, + getKeyByAlignment, +} from 'utils/formatByAlignment'; + +import shortEnglishHumanizer from '../shortEnglishHumanizer'; + +import { + formatXAxisByDefault, + formatYAxisByDefault, + IFormatAxis, +} from './tickFormatting'; + +import { AlignmentOptionsEnum, ScaleEnum } from './index'; + +function drawAxes(args: IDrawAxesArgs): void { + const { + svgNodeRef, + axesNodeRef, + axesRef, + plotBoxRef, + xScale, + yScale, + visBoxRef, + alignmentConfig, + axesScaleType, + humanizerConfigRef, + drawBgTickLines = { + x: false, + y: false, + }, + } = args; + + if ( + !axesNodeRef?.current || + !axesRef?.current || + !svgNodeRef?.current || + !visBoxRef?.current + ) { + return; + } + + const { width, height, margin } = visBoxRef.current; + + function formatByStep(args: IFormatAxis) { + const { xAxis } = formatXAxisByDefault(args); + return { + xAxis, + xAxisTitle: _.capitalize(getKeyByAlignment(alignmentConfig)) + 's', + }; + } + + function formatByEpoch(args: IFormatAxis) { + const { xAxis, ticksCount } = formatXAxisByDefault({ + ...args, + tickAdditionalConfig: { + minCount: 3, + }, + }); + + const { scale } = args; + + const domain = scale.domain(); + const first = domain[0] as number; + const last = domain[domain.length - 1] as number; + const distance = Math.ceil((last - first) / (ticksCount - 1)); + const tickValues: number[] = []; + for (let i = 0; i < ticksCount; i++) { + const current = Math.floor(first + i * distance); + if ( + current >= first && + current <= last && + tickValues.indexOf(current) === -1 + ) { + tickValues.push(current); + } + } + + xAxis.tickValues(tickValues); + + return { + xAxis, + xAxisTitle: _.capitalize(getKeyByAlignment(alignmentConfig)) + 's', + }; + } + + function formatByRelativeTime(args: IFormatAxis) { + let { xAxis, ticksCount, tickConfig, tickValues } = formatXAxisByDefault({ + ...args, + tickAdditionalConfig: { + distance: 120, + }, + }); + + const { scale } = args; + + const sec = 1; + const minute = 60 * sec; + const hour = 60 * minute; + const day = 24 * hour; + const week = 7 * day; + + const domain = scale.domain(); + const first = domain[0] as number; + const last = domain[domain.length - 1] as number; + + const diff = Math.ceil((last - first) / 1000); + let formatUnit: string; + if (diff / week > 4) { + formatUnit = 'w'; + } else if (diff / day > 3) { + formatUnit = 'd'; + } else if (diff / hour > 3) { + formatUnit = 'h'; + } else if (diff / minute > 4) { + formatUnit = 'm'; + } else if (diff / sec > 4) { + formatUnit = 's'; + } else { + formatUnit = 'ms'; + } + + humanizerConfigRef.current = { + units: [formatUnit], + maxDecimalPoints: 4, + }; + + if (axesScaleType.xAxis === ScaleEnum.Log) { + xAxis.tickValues(tickValues).tickFormat((d, i) => + _.truncate( + shortEnglishHumanizer(d as number, humanizerConfigRef.current), + { + length: tickConfig.maxLength, + }, + ), + ); + } else { + xAxis.ticks(ticksCount).tickFormat((d, i) => + _.truncate( + shortEnglishHumanizer(d as number, humanizerConfigRef.current), + { + length: tickConfig.maxLength, + }, + ), + ); + } + + return { + xAxis, + xAxisTitle: _.capitalize(getKeyByAlignment(alignmentConfig)), + }; + } + + function formatByAbsoluteTime(args: IFormatAxis) { + const { xAxis, ticksCount, tickConfig } = formatXAxisByDefault({ + ...args, + tickAdditionalConfig: { + distance: 180, + maxLength: 20, + }, + }); + + const { scale } = args; + + const domain = scale.domain(); + const first = domain[0] as number; + const last = domain[domain.length - 1] as number; + const distance = Math.ceil((last - first) / (ticksCount - 1)); + const tickValues: number[] = []; + for (let i = 0; i < ticksCount; i++) { + const lastRounded = Math.ceil(last); + const current = Math.floor(first + i * distance); + if (i === ticksCount - 1 && tickValues.indexOf(lastRounded) === -1) { + tickValues.push(lastRounded); + } else if (current < last) { + tickValues.push(current); + } + } + + xAxis + .ticks(ticksCount) + .tickValues(tickValues) + .tickFormat((d, i) => + _.truncate(moment(+d).format(DATE_CHART_TICK), { + length: tickConfig.maxLength, + }), + ); + + return { + xAxis, + xAxisTitle: _.capitalize(getKeyByAlignment(alignmentConfig)), + }; + } + + function formatByCustomMetric(args: IFormatAxis) { + const { xAxis } = formatXAxisByDefault(args); + return { + xAxis, + xAxisTitle: getKeyByAlignment(alignmentConfig), + }; + } + + function getFormattedXAxis(scale: d3.AxisScale) { + const formatters: { [key: string]: Function } = { + [AlignmentOptionsEnum.STEP]: formatByStep, + [AlignmentOptionsEnum.EPOCH]: formatByEpoch, + [AlignmentOptionsEnum.RELATIVE_TIME]: formatByRelativeTime, + [AlignmentOptionsEnum.ABSOLUTE_TIME]: formatByAbsoluteTime, + [AlignmentOptionsEnum.CUSTOM_METRIC]: formatByCustomMetric, + default: formatXAxisByDefault, + }; + const formatter = formatters[alignmentConfig?.type || 'default']; + return formatter({ + scale, + drawTickLines: { + ...drawBgTickLines, + tickSize: -height + (margin.top + margin.bottom), + }, + plotBoxRef, + scaleType: axesScaleType, + }); + } + + function getFormattedYAxis(scale: d3.AxisScale) { + const { yAxis } = formatYAxisByDefault({ + scale, + drawTickLines: { + ...drawBgTickLines, + tickSize: -width + (margin.left + margin.right), + }, + plotBoxRef, + scaleType: axesScaleType, + }); + return yAxis; + } + + function drawYAxis(scale: IAxisScale): void { + axesNodeRef.current?.select('.yAxis')?.remove(); + + const yAxis = getFormattedYAxis(scale); + const tickFontSize = 10; + + axesRef.current.yAxis = axesNodeRef.current + ?.append('g') + .attr('class', 'yAxis') + .attr('stroke-width', 0.2) + .attr('color', '#414b6d') + .attr('fill', 'none') + .call(yAxis) + .attr('font-size', tickFontSize); + + axesRef.current.yAxis + .select('.domain') + .attr('stroke', '#414b6d') + .attr('stroke-width', 0.4); + + const ticks = axesRef.current.yAxis.selectAll('.tick'); + + ticks?.append('svg:title').text((d: string | number) => d); + + ticks?.select('line').attr('stroke', '#8E9BAE').attr('x1', '-6'); + + if (!drawBgTickLines.y) { + ticks + ?.select('line') + .attr('stroke', '#414b6d') + .attr('stroke-width', 0.4) + .attr('y2', '0.5'); + } + } + + function drawXAxis(scale: IAxisScale): void { + axesNodeRef.current?.select('.xAxis')?.remove(); + + const { xAxisTitle, xAxis } = getFormattedXAxis(scale); + const tickFontSize = 10; + + axesRef.current.xAxis = axesNodeRef.current + ?.append('g') + .attr('class', 'xAxis') + .attr('stroke-width', 0.2) + .attr('color', '#414b6d') + .attr('fill', 'none') + .attr('transform', `translate(0, ${plotBoxRef.current.height})`) + .call(xAxis) + .attr('font-size', tickFontSize); + + axesRef.current.xAxis + .select('.domain') + .attr('stroke', '#414b6d') + .attr('stroke-width', 0.4); + + const ticks = axesRef.current.xAxis.selectAll('.tick'); + + ticks?.append('svg:title').text((d: number) => + formatValueByAlignment({ + xAxisTickValue: d ?? null, + type: alignmentConfig?.type, + }), + ); + + ticks?.select('line').attr('stroke', '#8E9BAE').attr('y1', '6'); + + if (!drawBgTickLines.x) { + ticks + ?.select('line') + .attr('stroke', '#414b6d') + .attr('stroke-width', 0.4) + .attr('y2', '0.5'); + } + + axesRef.current.xAxis + .append('text') + .attr( + 'transform', + `translate(${width - margin.left - margin.right - 20},-5)`, + ) + .attr('text-anchor', 'end') + .attr('alignment-baseline', 'ideographic') + .style('font-size', '1.1em') + .style('fill', '#586069') + .text(xAxisTitle); + } + + drawYAxis(yScale); + drawXAxis(xScale); + + axesRef.current.updateXAxis = function ( + xScaleUpdate: d3.AxisScale, + ) { + drawXAxis(xScaleUpdate); + }; + + axesRef.current.updateYAxis = function ( + yScaleUpdate: d3.AxisScale, + ) { + drawYAxis(yScaleUpdate); + }; +} + +export default drawAxes; diff --git a/src/src/utils/d3/drawBrush.ts b/src/src/utils/d3/drawBrush.ts new file mode 100644 index 00000000..2c374699 --- /dev/null +++ b/src/src/utils/d3/drawBrush.ts @@ -0,0 +1,199 @@ +import * as d3 from 'd3'; +import _ from 'lodash-es'; + +import { IDrawBrushArgs } from 'types/utils/d3/drawBrush'; + +import { ZoomEnum } from 'utils/d3'; + +import getAxisScale from './getAxisScale'; + +function drawBrush(args: IDrawBrushArgs): void { + const { + id, + plotBoxRef, + plotNodeRef, + visBoxRef, + axesRef, + attributesRef, + linesRef, + svgNodeRef, + axesScaleType, + axesScaleRange, + min, + max, + zoom, + onZoomChange, + readOnly, + unableToDrawConditions, + } = args; + + if (!plotNodeRef.current) { + return; + } + + const brush = d3 + .brush() + .extent([ + [0, 0], + [plotBoxRef.current.width, plotBoxRef.current.height], + ]) + .on('end', handleBrushChange); + + if (zoom?.active && !readOnly) { + plotNodeRef.current.append('g').call(brush).attr('class', 'brush'); + } + + function handleZoomIn( + brushXValuesDomain: [number, number], + brushYValuesDomain: [number, number], + ): void { + const { width, height, margin } = visBoxRef.current; + + let [xMin, xMax] = brushXValuesDomain; + let [yMin, yMax] = brushYValuesDomain; + + if (axesScaleRange?.xAxis && !_.isEmpty(axesScaleRange?.xAxis)) { + xMin = xMin < min.x ? min.x : xMin; + xMax = xMax < max.x ? xMax : max.x; + unableToDrawConditions.unshift({ + condition: xMin > xMax, + text: 'Unable to draw lines with the current x-axis range. Please adjust the x-axis range.', + }); + } + + if (axesScaleRange?.yAxis && !_.isEmpty(axesScaleRange?.yAxis)) { + yMin = yMin < min.y ? min.y : yMin; + yMax = yMax < max.y ? yMax : max.y; + unableToDrawConditions.unshift({ + condition: yMin > yMax, + text: 'Unable to draw lines with the current y-axis range. Please adjust the y-axis range.', + }); + } + + // updating Scales domain + attributesRef.current.xScale + .domain([xMin, xMax]) + .range([0, width - margin.left - margin.right]); + + attributesRef.current.yScale + .domain([yMin, yMax]) + .range([height - margin.top - margin.bottom, 0]); + + // updating axes with new Scales + axesRef.current.updateXAxis(attributesRef.current.xScale); + axesRef.current.updateYAxis(attributesRef.current.yScale); + + linesRef.current.updateScales?.( + attributesRef.current.xScale, + attributesRef.current.yScale, + ); + + linesRef.current.updateAggregatedAreasScales?.( + attributesRef.current.xScale, + attributesRef.current.yScale, + ); + + linesRef.current.updateAggregatedLinesScales?.( + attributesRef.current.xScale, + attributesRef.current.yScale, + ); + + attributesRef.current.updateScales?.( + attributesRef.current.xScale, + attributesRef.current.yScale, + ); + } + + // This remove the grey brush area as soon as the selection has been done + function removeBrush() { + plotNodeRef.current.select('.brush').call(brush.move, null); + } + + // This event firing after brush selection ends + function handleBrushChange(event: d3.D3BrushEvent): void { + const extent: d3.BrushSelection | any = event.selection; + if (!extent) { + return; + } else if ( + extent[1][0] - extent[0][0] < 5 || + extent[1][1] - extent[0][1] < 5 + ) { + removeBrush(); + } else { + // inverting pixels to x,y values + const left: number = attributesRef.current.xScale.invert(extent[0][0]); + const right: number = attributesRef.current.xScale.invert(extent[1][0]); + + const top: number = attributesRef.current.yScale.invert(extent[0][1]); + const bottom: number = attributesRef.current.yScale.invert(extent[1][1]); + + const [xMin, xMax]: number[] = attributesRef.current.xScale.domain(); + const [yMin, yMax]: number[] = attributesRef.current.yScale.domain(); + + const xValues: [number, number] | null = + extent[1][0] - extent[0][0] < 5 + ? null + : [left < xMin ? xMin : left, right > xMax ? xMax : right]; + + const yValues: [number, number] | null = + extent[1][1] - extent[0][1] < 5 + ? null + : [bottom < yMin ? yMin : bottom, top > yMax ? yMax : top]; + + if (xValues && yValues) { + handleZoomIn?.(xValues, yValues); + if (typeof onZoomChange === 'function' && zoom) { + onZoomChange({ + active: zoom.mode !== ZoomEnum.SINGLE, + history: [ + ...zoom.history, + { + id, + xValues, + yValues, + }, + ], + }); + } + } + } + svgNodeRef.current.on('dblclick', handleZoomOut); + removeBrush(); + } + + function handleZoomOut(event: Event): void { + const { width, height, margin } = visBoxRef.current; + + const xScale = getAxisScale({ + domainData: [min.x, max.x], + rangeData: [0, width - margin.left - margin.right], + scaleType: axesScaleType.xAxis, + }); + const yScale = getAxisScale({ + domainData: [min.y, max.y], + rangeData: [height - margin.top - margin.bottom, 0], + scaleType: axesScaleType.yAxis, + }); + // setting axes to initial state + axesRef.current.updateXAxis(xScale); + axesRef.current.updateYAxis(yScale); + + // setting scales and lines to initial state + linesRef.current.updateScales?.(xScale, yScale); + linesRef.current.updateAggregatedAreasScales?.(xScale, yScale); + linesRef.current.updateAggregatedLinesScales?.(xScale, yScale); + + attributesRef.current.updateScales?.(xScale, yScale); + attributesRef.current.updateFocusedChart?.(); + } + + if (zoom?.history?.length) { + const chartZoomHistory = zoom.history.filter((item) => item.id === id); + const lastHistoryDomain = chartZoomHistory[chartZoomHistory.length - 1]; + if (lastHistoryDomain) { + handleZoomIn(lastHistoryDomain.xValues, lastHistoryDomain.yValues); + } + } +} + +export default drawBrush; diff --git a/src/src/utils/d3/drawHoverAttributes.ts b/src/src/utils/d3/drawHoverAttributes.ts new file mode 100644 index 00000000..d6c1b587 --- /dev/null +++ b/src/src/utils/d3/drawHoverAttributes.ts @@ -0,0 +1,976 @@ +import * as d3 from 'd3'; +import _ from 'lodash-es'; + +import { + HoverAttrData, + IActivePoint, + IAxisLineData, + IDrawHoverAttributesArgs, + INearestCircle, + ISyncHoverStateArgs, +} from 'types/utils/d3/drawHoverAttributes'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; +import { IUpdateFocusedChartArgs } from 'types/components/LineChart/LineChart'; +import { IProcessedData } from 'types/utils/d3/processLineChartData'; +import { IFocusedState } from 'types/services/models/metrics/metricsAppModel'; + +import { AggregationAreaMethods } from 'utils/aggregateGroupData'; +import getRoundedValue from 'utils/roundValue'; + +import { formatValueByAlignment } from '../formatByAlignment'; + +import { getDimensionValue } from './getDimensionValue'; + +import { CircleEnum, HighlightEnum, ScaleEnum } from './index'; + +function drawHoverAttributes(args: IDrawHoverAttributesArgs): void { + const { + index, + id, + nameKey, + data, + processedData = [], + axesScaleType, + alignmentConfig, + plotBoxRef, + visAreaRef, + visBoxRef, + svgNodeRef, + bgRectNodeRef, + xAxisLabelNodeRef, + yAxisLabelNodeRef, + linesNodeRef, + highlightedNodeRef, + attributesNodeRef: attrNodeRef, + attributesRef: attrRef, + highlightMode = HighlightEnum.Off, + syncHoverState, + aggregationConfig, + drawAxisLines = { + x: true, + y: true, + }, + drawAxisLabels = { + x: true, + y: true, + }, + } = args; + + if (!svgNodeRef?.current || !bgRectNodeRef?.current) { + return; + } + + let rafID = 0; + + const { margin, width, height } = visBoxRef.current; + + function isMouseInVisArea(x: number, y: number): boolean { + const padding = 5; + return ( + x > margin.left - padding && + x < width - margin.right + padding && + y > margin.top - padding && + y < height - margin.bottom + padding + ); + } + + function getClosestCircle( + mouseX: number, + mouseY: number, + data: HoverAttrData[], + ): INearestCircle | null { + const { scaledValues } = attrRef.current; + if (!scaledValues) { + return null; + } + // find active point + let closestCircles: INearestCircle[] = []; + let minDistance: number = Infinity; + for (let i = 0; i < data.length; i++) { + const item = data[i]; + for (let j = 0; j < scaledValues[i].length; j++) { + const scaledValue = scaledValues[i][j]; + const rX = Math.abs(scaledValue.x - mouseX); + const rY = Math.abs(scaledValue.y - mouseY); + const r = Math.sqrt(rX * rX + rY * rY); + if (r <= minDistance) { + const isLastCircle = + item.data.xValues.length > 0 && j === item.data.xValues.length - 1; + const circle = { + key: item.key, + color: item.color || '#000', + inProgress: isLastCircle && !!item?.run?.props?.active, + ...scaledValue, + }; + if (r === minDistance) { + // Circle coordinates can be equal + // To show only one circle on hover we need to keep array of closest circles + closestCircles.push(circle); + } else { + minDistance = r; + closestCircles = [circle]; + } + } + } + } + + closestCircles.sort((a, b) => (a.key > b.key ? 1 : -1)); + return closestCircles.length ? closestCircles[0] : null; + } + + function getNearestCircles(mouseX: number): INearestCircle[] { + const nearestCircles: INearestCircle[] = []; + // Closest xValue for mouseX + const xValue = getInvertedValue( + axesScaleType.xAxis, + mouseX, + attrRef.current.xScale, + false, + ); + for (let i = 0; i < data.length; i++) { + const item = data[i]; + let index = 0; + if (axesScaleType.xAxis !== ScaleEnum.Point) { + index = d3.bisectCenter( + item.data.xValues as number[], + xValue as number, + ); + while ( + index && + getRoundedValue((item.data.xValues as number[])[index]) > xValue + ) { + index--; + } + } + const x = item.data.xValues[index]; + const y = item.data.yValues[index]; + if ((x || x === 0) && x !== '-' && (y || y === 0) && y !== '-') { + const isLastCircle = + item.data.xValues.length > 0 && + index === item.data.xValues.length - 1; + + nearestCircles.push({ + key: item.key, + color: item.color || '#000', + x: attrRef.current.xScale(x) || 0, + y: attrRef.current.yScale(y) || 0, + inProgress: isLastCircle && !!item?.run?.props?.active, + }); + } + } + return nearestCircles; + } + + function drawXAxisLabel(xValue: string | number): void { + if (xAxisLabelNodeRef && drawAxisLabels.x) { + const visArea = d3.select(visAreaRef.current); + if (visArea?.empty()) return; + let xAxisValueText = xValue; + if (typeof xValue === 'number') { + xAxisValueText = formatValueByAlignment({ + xAxisTickValue: xValue ?? null, + type: alignmentConfig?.type, + }); + } + if (xValue || xValue === 0) { + // X Axis Label + const axisLeftEdge = margin.left - 1; + const axisRightEdge = width - margin.right + 1; + let xAxisValueWidth = + xAxisLabelNodeRef.current?.node()?.offsetWidth || 0; + if (xAxisValueWidth > plotBoxRef.current.width) { + xAxisValueWidth = plotBoxRef.current.width; + } + + const x = attrRef.current.xScale(xValue); + const left = + x - xAxisValueWidth / 2 < 0 + ? axisLeftEdge + xAxisValueWidth / 2 + : x + axisLeftEdge + xAxisValueWidth / 2 > axisRightEdge + ? axisRightEdge - xAxisValueWidth / 2 + : x + axisLeftEdge; + const top = height - margin.bottom + 1; + + if (xAxisLabelNodeRef.current && xAxisValueWidth) { + // update x-axis label + xAxisLabelNodeRef.current + .attr('title', xAxisValueText) + .style('top', `${top}px`) + .style('left', `${left}px`) + .style('min-width', '24px') + .style('max-width', '150px') + .text(xAxisValueText); + } else { + // create x-axis label + xAxisLabelNodeRef.current = visArea + .append('div') + .attr('class', 'ChartMouseValue ChartMouseValueXAxis') + .attr('title', xAxisValueText) + .style('top', `${top}px`) + .style('left', `${left}px`) + .style('min-width', '24px') + .style('max-width', '150px') + .text(xAxisValueText); + } + } + } + } + + function clearYAxisLabel(): void { + if (yAxisLabelNodeRef?.current) { + yAxisLabelNodeRef.current.remove(); + yAxisLabelNodeRef.current = null; + } + } + + function drawYAxisLabel(yValue: string | number): void { + if (yAxisLabelNodeRef && drawAxisLabels.y) { + const visArea = d3.select(visAreaRef.current); + if (visArea?.empty()) return; + + if (yValue || yValue === 0) { + // Y Axis Label + const axisTopEdge = margin.top - 1; + const axisBottomEdge = height - margin.top; + const yAxisValueHeight = + yAxisLabelNodeRef.current?.node()?.offsetHeight || 0; + const y = attrRef.current.yScale(yValue); + const top = + y - yAxisValueHeight / 2 < 0 + ? axisTopEdge + yAxisValueHeight / 2 + : y + axisTopEdge + yAxisValueHeight / 2 > axisBottomEdge + ? axisBottomEdge - yAxisValueHeight / 2 + : y + axisTopEdge; + + const right = width - margin.left; + const maxWidth = margin.left - 5; + + if (yAxisLabelNodeRef.current && yAxisValueHeight) { + // update y-axis label + yAxisLabelNodeRef.current + .attr('title', yValue) + .style('top', `${top}px`) + .style('right', `${right}px`) + .style('max-width', `${maxWidth}px`) + .text(yValue); + } else { + // create y-axis label + yAxisLabelNodeRef.current = visArea + .append('div') + .attr('class', 'ChartMouseValue ChartMouseValueYAxis') + .attr('title', yValue) + .style('top', `${top}px`) + .style('right', `${right}px`) + .style('max-width', `${maxWidth}px`) + .text(yValue); + } + } + } + } + + function drawHighlightedLines(dataSelector?: string): void { + if (dataSelector && highlightMode !== HighlightEnum.Off) { + highlightedNodeRef.current + ?.classed('highlighted', false) + .classed('active', false); + + highlightedNodeRef.current = linesNodeRef.current + .selectAll(`[data-selector=${dataSelector}]`) + .classed('highlighted', true) + .raise(); + } + } + + function drawActiveLine(key: string): void { + if (attrRef.current.lineKey) { + linesNodeRef.current + .select(`[id=Line-${attrRef.current.lineKey}]`) + .classed('active', false); + } + + const newActiveLine = linesNodeRef.current.select(`[id=Line-${key}]`); + if (!newActiveLine.empty()) { + const dataSelector = newActiveLine.attr('data-selector'); + drawHighlightedLines(dataSelector); + // set active line + newActiveLine.classed('active', true).raise(); + if (aggregationConfig?.isApplied) { + const groupKey = newActiveLine.attr('groupKey'); + drawActiveAggrLine(groupKey); + if (aggregationConfig.methods.area !== AggregationAreaMethods.NONE) { + drawActiveAggrArea(groupKey); + } + } + + attrRef.current.lineKey = key; + attrRef.current.dataSelector = dataSelector; + } + } + + function drawActiveAggrLine( + nextGroupKey: string, + prevGroupKey = attrRef.current.groupKey, + ): void { + if (prevGroupKey) { + linesNodeRef.current + .select(`[id=AggrLine-${attrRef.current.groupKey}]`) + .classed('highlighted', false); + } + linesNodeRef.current + .select(`[id=AggrLine-${nextGroupKey}]`) + .classed('highlighted', true) + .raise(); + } + + function drawActiveAggrArea( + nextGroupKey: string, + prevGroupKey = attrRef.current.groupKey, + ): void { + if (prevGroupKey) { + linesNodeRef.current + .select(`[id=AggrArea-${attrRef.current.groupKey}]`) + .classed('highlighted', false); + } + + linesNodeRef.current + .select(`[id=AggrArea-${nextGroupKey}]`) + .classed('highlighted', true) + .raise(); + + attrRef.current.groupKey = nextGroupKey; + } + + function drawVerticalAxisLine(x: number): void { + if (drawAxisLines.y && plotBoxRef.current) { + const { height, width } = plotBoxRef.current; + + const boundedHoverLineX = x < 0 ? 0 : x > width ? width : x; + + const axisLineData: IAxisLineData = { + // hoverLine-y projection + x1: boundedHoverLineX, + y1: 0, + x2: boundedHoverLineX, + y2: height, + }; + + const hoverLineY = attrNodeRef.current.select('#HoverLine-y'); + + // Draw vertical axis line + if (!hoverLineY.empty()) { + // update vertical hoverLine + hoverLineY + .attr('x1', axisLineData.x1.toFixed(2)) + .attr('y1', axisLineData.y1.toFixed(2)) + .attr('x2', axisLineData.x2.toFixed(2)) + .attr('y2', axisLineData.y2.toFixed(2)); + } else { + // create vertical hoverLine + attrNodeRef.current + .append('line') + .attr('id', 'HoverLine-y') + .attr('class', 'HoverLine') + .style('stroke', '#94999f') + .style('stroke-width', 1) + .style('stroke-dasharray', '4 2') + .style('fill', 'none') + .style('pointer-events', 'none') + .attr('x1', axisLineData.x1.toFixed(2)) + .attr('y1', axisLineData.y1.toFixed(2)) + .attr('x2', axisLineData.x2.toFixed(2)) + .attr('y2', axisLineData.y2.toFixed(2)) + .lower(); + } + } + } + + function clearHorizontalAxisLine(): void { + attrNodeRef.current.select('#HoverLine-x').remove(); + } + + function drawHorizontalAxisLine(y: number): void { + if (drawAxisLines.x) { + const { height, width } = plotBoxRef.current; + const boundedHoverLineY = y < 0 ? 0 : y > height ? height : y; + + const axisLineData: IAxisLineData = { + // hoverLine-x projection + x1: 0, + y1: boundedHoverLineY, + x2: width, + y2: boundedHoverLineY, + }; + + const hoverLineX = attrNodeRef.current.select('#HoverLine-x'); + + // Draw horizontal axis line + if (!hoverLineX.empty()) { + // update horizontal hoverLine + hoverLineX + .attr('x1', axisLineData.x1) + .attr('y1', axisLineData.y1) + .attr('x2', axisLineData.x2) + .attr('y2', axisLineData.y2); + } else { + // create horizontal hoverLine + attrNodeRef.current + .append('line') + .attr('id', 'HoverLine-x') + .attr('class', 'HoverLine') + .style('stroke', '#94999f') + .style('stroke-width', 1) + .style('stroke-dasharray', '4 2') + .style('fill', 'none') + .style('pointer-events', 'none') + .attr('x1', axisLineData.x1) + .attr('y1', axisLineData.y1) + .attr('x2', axisLineData.x2) + .attr('y2', axisLineData.y2) + .lower(); + } + } + } + + function drawActiveCircle(key: string, inProgress: boolean = false): void { + attrNodeRef.current + .select(`[id=Circle-${key}]`) + .attr('r', CircleEnum.ActiveRadius) + .classed('active', true) + .classed('inProgressLineIndicator', inProgress) + .raise(); + } + + function drawFocusedCircle(key: string, inProgress: boolean = false): void { + attrNodeRef.current + .selectAll('.HoverCircle') + .attr('r', CircleEnum.Radius) + .classed('active', false) + .classed('focus', false); + + attrNodeRef.current.select('.focus__shadow')?.remove(); + + const newFocusedPoint = attrNodeRef.current.select(`[id=Circle-${key}]`); + newFocusedPoint + .classed('focus', true) + .classed('inProgressLineIndicator', inProgress) + .attr('r', CircleEnum.ActiveRadius) + .raise(); + + attrNodeRef.current + .append('circle') + .classed('HoverCircle focus focus__shadow', true) + .attr('r', CircleEnum.ActiveRadius) + .attr('cx', newFocusedPoint.attr('cx')) + .attr('cy', newFocusedPoint.attr('cy')) + .attr('stroke', newFocusedPoint.attr('stroke')) + .attr('stroke-opacity', 0.4) + .lower(); + } + + function drawCircles(nearestCircles: INearestCircle[]): void { + attrNodeRef.current + .selectAll('.HoverCircle') + .data( + nearestCircles.filter( + (circle) => + !( + (axesScaleType.xAxis === ScaleEnum.Log && circle.x === 0) || + (axesScaleType.yAxis === ScaleEnum.Log && circle.y === 0) + ), + ), + ) + .join('circle') + .attr('class', 'HoverCircle') + .attr('id', (d: INearestCircle) => `Circle-${d.key}`) + .attr('clip-path', `url(#${nameKey}-circles-rect-clip-${id})`) + .attr('cx', (d: INearestCircle) => d.x.toFixed(2)) + .attr('cy', (d: INearestCircle) => d.y.toFixed(2)) + .attr('r', CircleEnum.Radius) + .attr('stroke', (d: INearestCircle) => d.color) + .attr('fill', (d: INearestCircle) => d.color) + .attr('stroke-opacity', 1) + .on('click', handlePointClick); + + updateActiveRunsIndicators(); + } + + function drawActiveRunsIndicators(data: IProcessedData[]): void { + const activeRuns = data?.filter((d) => d?.run?.props?.active) || []; + + attrNodeRef.current + ?.selectAll('.inProgressLineIndicator') + .data(activeRuns) + .join('circle') + .attr('id', (d: IProcessedData) => `inProgressLineIndicator-${d.key}`) + .attr('clip-path', `url(#${nameKey}-circles-rect-clip-${id})`) + .attr('class', 'inProgressLineIndicator') + .style('stroke', (d: IProcessedData) => d.color) + .style('fill', (d: IProcessedData) => d.color) + .attr('cx', (d: IProcessedData) => { + if (d.data.length > 0) { + const lastPoint = d.data[d.data.length - 1]; + return attrRef.current.xScale(lastPoint[0]).toFixed(2); + } + }) + .attr('cy', (d: IProcessedData) => { + if (d.data.length > 0) { + const lastPoint = d.data[d.data.length - 1]; + return attrRef.current.yScale(lastPoint[1]).toFixed(2); + } + }) + .attr('r', CircleEnum.InProgress) + .on('click', handlePointClick); + } + + function updateActiveRunsIndicators(): void { + attrNodeRef.current + ?.selectAll('.inProgressLineIndicator') + .attr('cx', (d: IProcessedData) => { + if (d.data?.length > 0) { + const lastPoint = d.data[d.data.length - 1]; + return attrRef.current.xScale(lastPoint[0]).toFixed(2); + } + }) + .attr('cy', (d: IProcessedData) => { + if (d.data?.length > 0) { + const lastPoint = d.data[d.data.length - 1]; + return attrRef.current.yScale(lastPoint[1]).toFixed(2); + } + }) + .raise(); + } + + function setLinesHighlightMode(): void { + linesNodeRef.current.classed( + 'highlight', + highlightMode !== HighlightEnum.Off, + ); + } + + function setCirclesHighlightMode(): void { + attrNodeRef.current.classed( + 'highlight', + highlightMode !== HighlightEnum.Off, + ); + } + + function getBoundedPosition( + xPos: number, + yPos: number, + ): { + boundedX: number; + boundedY: number; + } { + const [yMax, yMin] = attrRef.current.yScale.range(); + const [xMin, xMax] = attrRef.current.xScale.range(); + + return { + boundedY: yPos > yMax ? yMax : yPos < yMin ? yMin : yPos, + boundedX: xPos > xMax ? xMax : xPos < xMin ? xMin : xPos, + }; + } + + function getInvertedValue( + scaleType: ScaleEnum, + pos: number, + axisScale: IAxisScale, + reverse: boolean = false, // need to reverse domain for inverting Y axis value + rounded: boolean = true, + ): number | string { + if (scaleType === ScaleEnum.Point) { + return getDimensionValue({ + pos, + domainData: reverse ? axisScale.domain().reverse() : axisScale.domain(), + axisScale, + }); + } else { + return rounded + ? getRoundedValue(axisScale.invert(pos)) + : axisScale.invert(pos); + } + } + + function getActivePoint( + circle: INearestCircle, + xValue: string | number, + yValue: string | number, + ): IActivePoint { + const xPos = circle.x; + const yPos = circle.y; + const { boundedX, boundedY } = getBoundedPosition(xPos, yPos); + + const chartRect: DOMRect = + visAreaRef.current?.getBoundingClientRect() || {}; + + const rect = { + top: +(margin.top + boundedY - CircleEnum.ActiveRadius).toFixed(2), + bottom: +(margin.top + boundedY + CircleEnum.ActiveRadius).toFixed(2), + left: +(margin.left + boundedX - CircleEnum.ActiveRadius).toFixed(2), + right: +(margin.left + boundedX + CircleEnum.ActiveRadius).toFixed(2), + }; + // @TODO - remove "pointRect" after refactoring (removing old metrics explorer) + const pointRect = { + top: +(chartRect.top + rect.top).toFixed(2), + bottom: +(chartRect.top + rect.bottom).toFixed(2), + left: +(chartRect.left + rect.left).toFixed(2), + right: +(chartRect.left + rect.right).toFixed(2), + }; + return { + key: circle.key, + xValue, + yValue, + xPos, + yPos, + inProgress: !!circle.inProgress, + chartIndex: index || 0, + visId: id, + pointRect, + rect, + }; + } + + function updateHoverAttributes(xValue: number, dataSelector?: string): void { + const mouseX = attrRef.current.xScale(xValue) || 0; + const nearestCircles = getNearestCircles(mouseX); + + drawHighlightedLines(dataSelector); + + setLinesHighlightMode(); + setCirclesHighlightMode(); + + clearHorizontalAxisLine(); + clearYAxisLabel(); + + drawVerticalAxisLine(mouseX); + drawCircles(nearestCircles); + + const newXValue = getInvertedValue( + axesScaleType.xAxis, + mouseX, + attrRef.current.xScale, + ); + + drawXAxisLabel(newXValue); + attrRef.current.currentXValue = newXValue; + attrRef.current.dataSelector = dataSelector; + attrRef.current.nearestCircles = nearestCircles; + } + + function clearHoverAttributes(): void { + attrRef.current.activePoint = undefined; + attrRef.current.lineKey = undefined; + attrRef.current.dataSelector = undefined; + + linesNodeRef.current.classed('highlight', false); + attrNodeRef.current.classed('highlight', false); + + linesNodeRef.current + .selectAll('path') + .classed('highlighted', false) + .classed('active', false); + + attrNodeRef.current + .selectAll('.HoverCircle') + .attr('r', CircleEnum.Radius) + .classed('active', false) + .classed('focus', false); + + clearHorizontalAxisLine(); + clearYAxisLabel(); + } + + function drawAttributes( + circle: INearestCircle, + nearestCircles: INearestCircle[], + force: boolean = false, + ): IActivePoint { + // hover line changed case + if (force || circle.key !== attrRef.current.lineKey) { + setLinesHighlightMode(); + drawActiveLine(circle.key); + } + + const xValue: number | string = getInvertedValue( + axesScaleType.xAxis, + circle.x, + attrRef.current.xScale, + ); + const yValue: number | string = getInvertedValue( + axesScaleType.yAxis, + circle.y, + attrRef.current.yScale, + true, + ); + + // hover circle changed case + if ( + force || + circle.key !== attrRef.current.activePoint?.key || + circle.x !== attrRef.current.activePoint?.xPos || + circle.y !== attrRef.current.activePoint?.yPos || + !_.isEqual(attrRef.current.nearestCircles, nearestCircles) + ) { + setCirclesHighlightMode(); + drawVerticalAxisLine(circle.x); + drawHorizontalAxisLine(circle.y); + drawXAxisLabel(xValue); + drawYAxisLabel(yValue); + drawCircles(nearestCircles); + drawActiveCircle(circle.key, circle.inProgress); + } + + const activePoint = getActivePoint(circle, xValue, yValue); + attrRef.current.currentXValue = activePoint.xValue; + attrRef.current.activePoint = activePoint; + attrRef.current.nearestCircles = nearestCircles; + return activePoint; + } + + function updateFocusedChart(args: IUpdateFocusedChartArgs = {}): void { + const { xScale, yScale, focusedState, activePoint, dataSelector } = + attrRef.current; + + const { + mousePos, + focusedStateActive = focusedState?.active || false, + force = false, + } = args; + + let mousePosition: [number, number] | [] = []; + if (mousePos) { + mousePosition = mousePos; + } else if (focusedState?.active && focusedState.visId === id) { + mousePosition = [ + xScale(focusedState.xValue), + yScale(focusedState.yValue), + ]; + } else if (activePoint?.xValue && activePoint.yValue) { + mousePosition = [xScale(activePoint.xValue), yScale(activePoint.yValue)]; + } + + if (mousePosition?.length) { + const [mouseX, mouseY] = mousePosition; + const closestCircle = getClosestCircle(mouseX, mouseY, data); + if (closestCircle) { + const nearestCircles = getNearestCircles(closestCircle.x); + let activePoint = drawAttributes(closestCircle, nearestCircles, force); + if (focusedStateActive) { + drawFocusedCircle(activePoint.key, activePoint.inProgress); + } + const focusedState = getFocusedState(activePoint, focusedStateActive); + attrRef.current.focusedState = focusedState; + + safeSyncHoverState({ activePoint, focusedState, dataSelector }); + } + } else { + drawInitialAttributes(); + } + } + + function drawInitialAttributes() { + const { + xScale, + focusedState, + currentXValue = xScale.domain()[1], + } = attrRef.current; + + const xValue = focusedState?.active ? focusedState.xValue : currentXValue; + const mouseX = xScale(xValue); + + if (isNaN(xValue) || isNaN(mouseX)) return; + + const nearestCircles = getNearestCircles(mouseX); + clearHorizontalAxisLine(); + clearYAxisLabel(); + + if (focusedState?.active) { + setLinesHighlightMode(); + setCirclesHighlightMode(); + } + + drawVerticalAxisLine(mouseX); + drawCircles(nearestCircles); + + const newXValue = getInvertedValue( + axesScaleType.xAxis, + mouseX, + attrRef.current.xScale, + ); + drawXAxisLabel(newXValue); + attrRef.current.currentXValue = newXValue; + } + + function setActiveLineAndCircle( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ): void { + const { xScale, currentXValue, dataSelector } = attrRef.current; + if (currentXValue || currentXValue === 0) { + const mouseX = xScale(currentXValue); + const closestCircle = getNearestCircles(mouseX).find( + (c) => c.key === lineKey, + ); + if (closestCircle) { + safeSyncHoverState({ activePoint: null }); + // get nearestCircles depends on closestCircle.x position + const nearestCircles = getNearestCircles(closestCircle.x); + const activePoint = drawAttributes( + closestCircle, + nearestCircles, + force, + ); + if (focusedStateActive) { + drawFocusedCircle(activePoint.key, activePoint.inProgress); + } + const focusedState = getFocusedState(activePoint, focusedStateActive); + attrRef.current.focusedState = focusedState; + + safeSyncHoverState({ activePoint, focusedState, dataSelector }); + } + } + } + + function updateScales(xScale: IAxisScale, yScale: IAxisScale): void { + attrRef.current.xScale = xScale; + attrRef.current.yScale = yScale; + setScaledValues(data); + } + + // Interactions + function safeSyncHoverState(args: ISyncHoverStateArgs): void { + if (typeof syncHoverState === 'function') { + syncHoverState(args); + } + } + + function handlePointClick(this: SVGElement, event: MouseEvent): void { + if (attrRef.current.focusedState?.visId !== id) { + safeSyncHoverState({ activePoint: null }); + } + const mousePos = d3.pointer(event); + const [mouseX, mouseY] = mousePos; + const closestCircle = getClosestCircle(mouseX, mouseY, data); + if (closestCircle) { + const nearestCircles = getNearestCircles(closestCircle.x); + let activePoint = drawAttributes(closestCircle, nearestCircles, true); + const focusedState = getFocusedState(activePoint, true); + attrRef.current.focusedState = focusedState; + + drawFocusedCircle(activePoint.key, activePoint.inProgress); + safeSyncHoverState({ + activePoint, + focusedState, + dataSelector: attrRef.current.dataSelector, + }); + } + } + + function getFocusedState( + activePoint: IActivePoint, + focusedStateActive: boolean = false, + ): IFocusedState { + return { + active: focusedStateActive, + key: activePoint.key, + xValue: activePoint.xValue, + yValue: activePoint.yValue, + chartIndex: activePoint.chartIndex, + visId: activePoint.visId, + }; + } + + function handleLineClick(this: SVGElement, event: MouseEvent): void { + if (attrRef.current.focusedState?.visId !== id) { + safeSyncHoverState({ activePoint: null }); + } + const mousePos = d3.pointer(event); + updateFocusedChart({ mousePos, focusedStateActive: false, force: true }); + } + + function handleLeaveFocusedPoint(event: MouseEvent): void { + if (attrRef.current.focusedState?.visId !== id) { + safeSyncHoverState({ activePoint: null }); + } + const mousePos = d3.pointer(event); + updateFocusedChart({ + mousePos: [ + Math.floor(mousePos[0]) - margin.left, + Math.floor(mousePos[1]) - margin.top, + ], + force: true, + focusedStateActive: false, + }); + } + + function handleMouseMove(event: MouseEvent): void { + if (attrRef.current.focusedState?.active) { + return; + } + const mousePos = d3.pointer(event); + if (isMouseInVisArea(mousePos[0], mousePos[1])) { + rafID = window.requestAnimationFrame(() => { + updateFocusedChart({ + mousePos: [ + Math.floor(mousePos[0]) - margin.left, + Math.floor(mousePos[1]) - margin.top, + ], + focusedStateActive: false, + }); + }); + } + } + + function handleMouseLeave(event: MouseEvent): void { + if (attrRef.current.focusedState?.active) { + return; + } + const mousePos = d3.pointer(event); + if (!isMouseInVisArea(mousePos[0], mousePos[1])) { + if (rafID) { + window.cancelAnimationFrame(rafID); + } + clearHoverAttributes(); + safeSyncHoverState({ activePoint: null }); + } + } + + function setScaledValues( + data: HoverAttrData[], + xScale = attrRef.current?.xScale, + yScale = attrRef.current?.yScale, + ): void { + if (attrRef.current && xScale && yScale) { + attrRef.current.scaledValues = []; + for (let i = 0; i < data.length; i++) { + attrRef.current.scaledValues.push( + data[i].data.xValues.map((xValue, index) => ({ + x: xScale(xValue) as number, + y: yScale(data[i].data.yValues[index]) as number, + })), + ); + } + } + } + + attrRef.current.updateScales = updateScales; + attrRef.current.setActiveLineAndCircle = setActiveLineAndCircle; + attrRef.current.updateHoverAttributes = updateHoverAttributes; + attrRef.current.updateFocusedChart = updateFocusedChart; + attrRef.current.clearHoverAttributes = clearHoverAttributes; + + svgNodeRef.current?.on('mousemove', handleMouseMove); + svgNodeRef.current?.on('mouseleave', handleMouseLeave); + linesNodeRef.current?.on('click', handleLineClick); + bgRectNodeRef.current?.on('click', handleLeaveFocusedPoint); + + // call on every render + setScaledValues(data); + drawActiveRunsIndicators(processedData); + if (attrRef.current.focusedState?.key) { + updateFocusedChart({ force: true }); + } else { + drawInitialAttributes(); + } +} +export default drawHoverAttributes; diff --git a/src/src/utils/d3/drawLegends.ts b/src/src/utils/d3/drawLegends.ts new file mode 100644 index 00000000..12349a8e --- /dev/null +++ b/src/src/utils/d3/drawLegends.ts @@ -0,0 +1,441 @@ +import * as d3 from 'd3'; +import _ from 'lodash-es'; + +import { + LegendsDataType, + LegendColumnDataType, +} from 'components/VisualizationLegends'; + +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import changeDasharraySize from '../changeDasharraySize'; +import shortenRunPropLabel from '../shortenRunPropLabel'; +import { GroupType } from '../../modules/core/pipeline'; + +interface DrawLegendsArgs { + data?: LegendsDataType; + containerNode: HTMLDivElement | null; + readOnly?: boolean; +} +interface GroupLegendProp { + title: string; + label: { + key: string; + element: string; + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => void; + }; +} + +const config = { + margin: { top: 8, right: 8, bottom: 8, left: 8 }, + groupsGap: 20, + groupTitle: { + marginTop: 10, + fontSize: '12px', + fontFamily: 'Inter, sans-serif', + fontWeight: 600, + }, + cellTitle: { + height: 20, + fontWeight: 600, + margin: 20, + maxWidth: 100, + }, + cell: { + height: 20, + fontSize: '11px', + fontFamily: 'Inter, sans-serif', + fontWeight: 400, + }, + columnGap: 15, + label: { + width: 25, + fontFamily: 'Inconsolata, monospace', + }, + defaultColor: '#484f56', +}; + +const getGroupLegendProps: Record GroupLegendProp> = + { + [GroupNameEnum.CHART]: (title = 'Charts') => ({ + title, + label: { + key: '#', + element: 'text', + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => { + const y = + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height; + + element + ?.attr('y', y) + .attr('fill', '#484f56') + .style('outline', '1px solid #dee6f3') + .style('border-radius', '1px') + .style('padding', '2px') + .style('white-space', 'pre') + .text(` ${(cell.chartIndex || 0) + 1} `) + .style('font-family', config.label.fontFamily); + }, + }, + }), + [GroupType.COLOR]: (title = 'Colors') => ({ + title, + label: { + key: '', + element: 'line', + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => { + const y = + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height; + + element + ?.attr('stroke', cell.color || config.defaultColor) + .attr('stroke-dasharray', 'none') + .attr('stroke-width', 2) + .attr('x1', 0) + .attr('x2', config.label.width) + .attr('y1', y - 4) + .attr('y2', y - 4); + }, + }, + }), + [GroupType.STROKE]: (title = 'Stroke styles') => ({ + title, + label: { + key: '', + element: 'line', + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => { + const y = + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height; + + element + ?.attr('stroke', config.defaultColor) + .attr( + 'stroke-dasharray', + changeDasharraySize(cell.dasharray, 3 / 5), + ) + .attr('stroke-width', 2) + .attr('x1', 0) + .attr('x2', config.label.width) + .attr('y1', y - 4) + .attr('y2', y - 4) + .attr('font-family', config.cell.fontFamily); + }, + }, + }), + [GroupType.ROW]: (title = 'Rows') => ({ + title, + label: { + key: '#', + element: 'text', + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => { + const y = + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height; + + element + ?.attr('y', y) + .attr('fill', '#484f56') + .style('outline', '1px solid #dee6f3') + .style('border-radius', '1px') + .style('padding', '2px') + .style('white-space', 'pre') + .text(` ${(cell.order || 0) + 1} `) + .style('font-family', config.label.fontFamily); + }, + }, + }), + [GroupType.COLUMN]: (title = 'Columns') => ({ + title, + label: { + key: '#', + element: 'text', + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => { + const y = + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height; + + element + ?.attr('y', y) + .attr('fill', '#484f56') + .style('outline', '1px solid #dee6f3') + .style('border-radius', '1px') + .style('padding', '2px') + .style('white-space', 'pre') + .text(` ${(cell.order || 0) + 1} `) + .style('font-family', config.label.fontFamily); + }, + }, + }), + default: (title: string = '') => ({ + title, + label: { + key: '', + element: 'text', + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => { + const y = + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height; + + element?.attr('y', y); + }, + }, + }), + }; + +function drawLegends({ + data = {}, + containerNode, + readOnly, +}: DrawLegendsArgs): void { + if (!containerNode || _.isEmpty(data)) { + return; + } + const { svgWrapper, bgRect, groupsWrapper } = drawLegendArea( + containerNode, + readOnly, + ); + const { margin, groupsGap } = config; + let currentGroupHeight = 0; + for (const [legendName, legend] of Object.entries(data)) { + const groupElement = drawLegend( + legendName, + legend, + groupsWrapper, + currentGroupHeight, + ); + if (groupElement) { + currentGroupHeight += groupElement.node()?.getBBox().height || 0; + currentGroupHeight += groupsGap; + } + } + const { width: groupsWrapperWidth = 0, height: groupsWrapperHeight = 0 } = + groupsWrapper.node()?.getBBox() || {}; + + const svgWidth = margin.left + margin.right + groupsWrapperWidth; + const svgHeight = margin.top + margin.bottom + groupsWrapperHeight; + + bgRect.attr('height', svgHeight).attr('width', svgWidth); + svgWrapper.attr('height', svgHeight).attr('width', svgWidth); +} + +function drawLegendArea( + containerNode: HTMLDivElement | null, + readOnly: boolean = false, +) { + const container = d3.select(containerNode); + container.select('*')?.remove(); + + const { margin, defaultColor } = config; + + const svgWrapper = container + .append('svg') + .attr('xmlns', 'http://www.w3.org/2000/svg') + .attr('class', 'Legends') + .style('fill', 'transparent') + .raise(); + + const bgRect = svgWrapper + .append('rect') + .attr('x', 0) + .attr('y', 0) + .attr('class', 'Legends-bgRect') + .style('fill', 'transparent'); + + if (readOnly) { + bgRect.style('stroke-width', 1).style('stroke', '#bdcee8'); + } + + const groupsWrapper = svgWrapper + .append('g') + .attr('class', 'Legend-groups-wrapper') + .attr('transform', `translate(${margin.left}, ${margin.top})`) + .style('fill', defaultColor); + + return { svgWrapper, groupsWrapper, bgRect }; +} + +function drawLegend( + legendName: string, + legend: Record, + wrapperGroup: d3.Selection, + currentGroupHeight: number, +) { + if (_.isEmpty(legend)) { + return; + } + + const groupElement = wrapperGroup + .append('g') + .attr('id', `Legend-group-${legendName}`) + .attr('transform', `translate(${0}, ${currentGroupHeight})`); + + const cb = getGroupLegendProps[legendName] || getGroupLegendProps.default; + const groupLegendProp = cb(); + + // group title + groupElement + .append('text') + .text(groupLegendProp.title) + .attr('font-size', config.groupTitle.fontSize) + .attr('font-weight', config.groupTitle.fontWeight) + .attr('font-family', config.groupTitle.fontFamily) + .attr('y', config.groupTitle.marginTop) + .style('text-transform', 'uppercase'); + + drawLegendColumns( + legendName, + Object.entries(legend), + groupElement, + config.groupTitle.marginTop, + groupLegendProp, + ); + + return groupElement; +} + +function drawLegendColumns( + legendName: string, + columns: [string, LegendColumnDataType[]][] = [], + wrapperGroup: d3.Selection, + groupYPos: number, + groupLegendProp: GroupLegendProp, +) { + if (columns.length === 0) { + return; + } + + const labelColumnCells = columns[0][1]; + // column labels + drawLegendColumn( + legendName, + groupLegendProp.label.key, + labelColumnCells, + wrapperGroup, + { x: 0, y: groupYPos }, + groupLegendProp.label, + ); + + let currentColumnWidth = config.label.width + config.columnGap; + + for (let [columnKey, columnCells] of columns) { + const columnWrapper = drawLegendColumn( + legendName, + columnKey, + columnCells, + wrapperGroup, + { + x: currentColumnWidth, + y: groupYPos, + }, + ); + + if (columnWrapper) { + currentColumnWidth += columnWrapper.node()?.getBBox().width || 0; + currentColumnWidth += config.columnGap; + } + } +} + +function drawLegendColumn( + legendName: string, + columnKey: string, + columnCells: LegendColumnDataType[] = [], + wrapperGroup: d3.Selection, + groupPos: { x: number; y: number }, + label?: GroupLegendProp['label'], +) { + if (columnCells.length === 0) { + return; + } + + const columnGroup = wrapperGroup + .append('g') + .attr('class', `Legend-${legendName}-column`) + .attr('font-size', config.cell.fontSize) + .attr('font-family', config.cell.fontFamily) + .attr('font-weight', config.cell.fontWeight) + .attr('transform', `translate(${groupPos.x}, ${groupPos.y})`); + + const { shortenValue } = shortenRunPropLabel( + columnKey, + config.cellTitle.maxWidth, + ); + + // column title + columnGroup + .append('text') + .text(shortenValue) + .attr('font-weight', config.cellTitle.fontWeight) + .attr('x', 0) + .attr('y', config.cellTitle.height) + .append('svg:title') + .text(columnKey); + + if (label) { + // column label + columnGroup + .selectAll('.Legend-label') + .data(columnCells) + .join(label.element) + .attr('class', 'Legend-label') + .each((d, i, nodes) => label.setAttr(d, d3.select(nodes[i]), i)); + } else { + // column cells + columnGroup + .selectAll('.Legend-cell') + .data(columnCells) + .join('text') + .attr('class', 'Legend-cell') + .text((cell) => cell.value) + .attr('fill', (cell) => cell.color || config.defaultColor) + .attr('x', 0) + .attr( + 'y', + (cell, cellIndex) => + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height, + ); + } + + return columnGroup; +} + +export default drawLegends; diff --git a/src/src/utils/d3/drawLines.ts b/src/src/utils/d3/drawLines.ts new file mode 100644 index 00000000..0ac04876 --- /dev/null +++ b/src/src/utils/d3/drawLines.ts @@ -0,0 +1,129 @@ +import { IDrawLinesArgs } from 'types/utils/d3/drawLines'; +import { + IProcessedAggrData, + IProcessedData, +} from 'types/utils/d3/processLineChartData'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { AggregationAreaMethods } from 'utils/aggregateGroupData'; +import { CurveEnum, HighlightEnum } from 'utils/d3'; + +import lineGenerator from './lineGenerator'; +import areaGenerator from './areaGenerator'; + +function drawLines(args: IDrawLinesArgs): void { + const { + id, + nameKey, + xScale, + yScale, + linesRef, + linesNodeRef, + curveInterpolation, + highlightMode, + aggregationConfig, + processedData, + processedAggrData, + } = args; + + if (!linesNodeRef?.current) { + return; + } + + linesRef.current.updateScales = function ( + xScale: IAxisScale, + yScale: IAxisScale, + curve?: CurveEnum, + ): void { + linesNodeRef.current + .selectAll('.Line') + .attr('d', lineGenerator(xScale, yScale, curve)); + }; + + linesRef.current.updateLines = function (data: IProcessedData[]): void { + linesNodeRef.current + ?.selectAll('.Line') + .data(data) + .join('path') + .attr('class', `Line ${aggregationConfig?.isApplied ? 'aggregated' : ''}`) + .attr('id', (d: IProcessedData) => `Line-${d.key}`) + .attr('clip-path', `url(#${nameKey}-lines-rect-clip-${id})`) + .attr('groupKey', (d: IProcessedData) => d.groupKey) + .attr( + 'data-selector', + (d: IProcessedData) => + `Line-Sel-${highlightMode}-${d.selectors?.[highlightMode]}`, + ) + .style('fill', 'none') + .style('stroke', (d: IProcessedData) => d.color) + .style('stroke-dasharray', (d: IProcessedData) => d.dasharray) + .data(data.map((d: IProcessedData) => d.data)) + .attr('d', lineGenerator(xScale, yScale, curveInterpolation)); + }; + + linesRef.current.updateAggregatedAreasScales = function ( + xScale: IAxisScale, + yScale: IAxisScale, + ): void { + linesNodeRef.current + .selectAll('.AggrArea') + .attr('d', areaGenerator(xScale, yScale)); + }; + + linesRef.current.updateAggregatedAreas = function ( + data: IProcessedAggrData[], + ): void { + linesNodeRef.current + .selectAll('.AggrArea') + .data(data) + .join('path') + .attr('class', 'AggrArea') + .attr('id', (d: IProcessedAggrData) => `AggrArea-${d.key}`) + .attr('clip-path', `url(#${nameKey}-lines-rect-clip-${id})`) + .attr('fill', (d: IProcessedAggrData) => d.color) + .attr('fill-opacity', '0.3') + .data(data.map((d: IProcessedAggrData) => d?.area || [])) + .attr('d', areaGenerator(xScale, yScale)); + }; + + linesRef.current.updateAggregatedLinesScales = function ( + xScale: IAxisScale, + yScale: IAxisScale, + curve?: CurveEnum, + ): void { + linesNodeRef.current + .selectAll('.AggrLine') + .attr('d', lineGenerator(xScale, yScale, curve)); + }; + + linesRef.current.updateAggregatedLines = function ( + data: IProcessedAggrData[], + ): void { + linesNodeRef.current + .selectAll('.AggrLine') + .data(data) + .join('path') + .attr('class', 'AggrLine') + .attr('id', (d: IProcessedAggrData) => `AggrLine-${d.key}`) + .attr('clip-path', `url(#${nameKey}-lines-rect-clip-${id})`) + .style('fill', 'none') + .style('stroke', (d: IProcessedAggrData) => d.color) + .style('stroke-dasharray', (d: IProcessedAggrData) => d.dasharray) + .data(data.map((d: IProcessedAggrData) => d.line || [])) + .attr('d', lineGenerator(xScale, yScale, curveInterpolation)); + }; + + if (aggregationConfig?.isApplied) { + if (aggregationConfig.methods.area !== AggregationAreaMethods.NONE) { + linesRef.current.updateAggregatedAreas(processedAggrData); + } + linesRef.current.updateAggregatedLines(processedAggrData); + if (highlightMode !== HighlightEnum.Off) { + linesRef.current.updateLines(processedData); + } + } else { + linesRef.current.updateLines(processedData); + } +} + +export default drawLines; diff --git a/src/src/utils/d3/drawParallelAxes.ts b/src/src/utils/d3/drawParallelAxes.ts new file mode 100644 index 00000000..d5c883a1 --- /dev/null +++ b/src/src/utils/d3/drawParallelAxes.ts @@ -0,0 +1,137 @@ +import _ from 'lodash-es'; +import * as d3 from 'd3'; + +import { + IDrawParallelAxesProps, + YScaleType, +} from 'types/utils/d3/drawParallelAxes'; + +import { getAxisScale, ScaleEnum } from 'utils/d3'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +import getColorFromRange from './getColorFromRange'; +import { formatYAxisByDefault } from './tickFormatting'; + +function drawParallelAxes({ + axesNodeRef, + visBoxRef, + attributesRef, + axesRef, + dimensions, + plotBoxRef, +}: IDrawParallelAxesProps): void { + if (!axesNodeRef?.current && !dimensions && _.isEmpty(dimensions)) { + return; + } + const keysOfDimensions = Object.keys(dimensions); + const { width, height, margin } = visBoxRef.current; + const xScale = getAxisScale({ + domainData: keysOfDimensions, + rangeData: [0, width - margin.left - margin.right], + scaleType: ScaleEnum.Point, + }); + axesRef.current.yAxes = {}; + + const yScale: YScaleType = {}; + + function getFormattedYAxis(scale: d3.AxisScale) { + const { yAxis } = formatYAxisByDefault({ + scale, + tickAdditionalConfig: { + distance: 30, + }, + drawTickLines: { + tickSize: -width + (margin.left + margin.right), + }, + plotBoxRef, + scaleType: ScaleEnum.Point, + }); + return yAxis; + } + + keysOfDimensions.forEach((keyOfDimension: string, i: number) => { + const { domainData, scaleType, displayName, dimensionType } = + dimensions[keyOfDimension]; + const first = 0; + const last = keysOfDimensions.length - 1; + + const tmpYScale = getAxisScale({ + domainData, + scaleType, + rangeData: [height - margin.top - margin.bottom, 0], + }); + yScale[keyOfDimension] = tmpYScale; + const tickWidth = i === first ? 40 : plotBoxRef.current.width / last - 20; + const titleWidth = plotBoxRef.current.width / last; + + const yAxis = getFormattedYAxis(tmpYScale); + const axes = axesNodeRef.current + ?.append('g') + .attr('class', 'Axis') + .data([keyOfDimension]) + .attr('stroke-width', 0.6) + .attr('transform', `translate(${xScale(keyOfDimension)})`) + .call(yAxis); + + axes + ?.selectAll('.tick') + .append('foreignObject') + .attr('x', -tickWidth - 10) + .attr('y', -8) + .attr('height', 12) + .attr('width', tickWidth) + .html( + (d: string) => + `
${d}
`, + ); + + const dimensionTitleWidth = + i === first || i === last ? titleWidth : titleWidth * 2; + + axes + ?.append('foreignObject') + .attr('width', dimensionTitleWidth) + .attr('height', 20) + .attr( + 'transform', + `translate(${ + i === first + ? 0 + : i === last + ? -dimensionTitleWidth + : -dimensionTitleWidth / 2 + }, ${i % 2 === 0 ? -25 : -40})`, + ) + .html(() => { + let [label1, label2 = ''] = displayName.split(' '); + const styledLabel2 = label2 + ? `${label2}` + : ''; + let label = isSystemMetric(label1) + ? formatSystemMetricName(label1) + : label1; + return ` +
+
${label} ${styledLabel2}
+
+ `; + }); + + axesRef.current.yAxes[keyOfDimension] = axes; + }); + + attributesRef.current.xScale = xScale; + attributesRef.current.yScale = yScale; + const lastYScale = + attributesRef.current.yScale[keysOfDimensions[keysOfDimensions.length - 1]]; + const range = lastYScale?.range(); + if (range) { + attributesRef.current.yColorIndicatorScale = getColorFromRange(range); + } +} + +export default drawParallelAxes; diff --git a/src/src/utils/d3/drawParallelAxesBrush.ts b/src/src/utils/d3/drawParallelAxesBrush.ts new file mode 100644 index 00000000..e01b8748 --- /dev/null +++ b/src/src/utils/d3/drawParallelAxesBrush.ts @@ -0,0 +1,206 @@ +import * as d3 from 'd3'; +import _ from 'lodash-es'; + +import { ILineDataType } from 'types/utils/d3/drawParallelLines'; +import { + IDrawParallelAxesBrushBrushArgs, + IFilterDataByBrushedScaleProps, + DomainsDataType, +} from 'types/utils/d3/drawParallelAxesBrush'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +function drawParallelAxesBrush({ + brushRef, + plotBoxRef, + plotNodeRef, + dimensions, + data, + visBoxRef, + linesRef, + brushExtents, + onAxisBrushExtentChange, + attributesRef, + index, +}: IDrawParallelAxesBrushBrushArgs): void { + if (!brushRef.current.domainsData) { + brushRef.current.xScale = attributesRef.current.xScale; + brushRef.current.yScale = { ...attributesRef.current.yScale }; + brushRef.current.updateLinesAndHoverAttributes = + updateLinesAndHoverAttributes; + brushRef.current.domainsData = Object.keys(dimensions).reduce( + (acc: DomainsDataType, keyOfDimension: string) => { + acc[keyOfDimension] = dimensions[keyOfDimension].domainData; + return acc; + }, + {}, + ); + } + + function handleBrushChange( + event: d3.D3BrushEvent, + keyOfDimension: string, + ): void { + if (brushRef.current.yScale[keyOfDimension]) { + brushRef.current.yScale = { + ...attributesRef.current.yScale, + ...brushRef.current.yScale, + }; + } + const extent: d3.BrushSelection | any = event.selection; + let brushPosition: [number, number] | [string, string] | null = null; + if (!_.isNil(extent) && brushRef.current?.yScale?.[keyOfDimension]) { + if (dimensions[keyOfDimension].scaleType === 'point') { + const domainData = scalePointDomainData( + brushRef.current.yScale[keyOfDimension], + extent, + ); + brushRef.current.domainsData[keyOfDimension] = domainData; + brushPosition = [domainData[0], _.last(domainData)] as [string, string]; + } else { + const top: number = brushRef.current.yScale[keyOfDimension].invert( + extent[0], + ); + const bottom: number = brushRef.current.yScale[keyOfDimension].invert( + extent[1], + ); + brushRef.current.domainsData[keyOfDimension] = [bottom, top]; + brushPosition = [bottom, top]; + } + } else { + brushRef.current.domainsData[keyOfDimension] = + dimensions[keyOfDimension].domainData; + } + if (event.type === 'end') { + onAxisBrushExtentChange(keyOfDimension, brushPosition, index); + } + updateLinesAndHoverAttributes({ keyOfDimension }); + } + + function updateLinesAndHoverAttributes({ + keyOfDimension, + mouse, + }: { + keyOfDimension?: string; + mouse?: number[]; + }) { + const filteredData = data.filter((line: ILineDataType) => + filterDataByBrushedScale({ + line, + domainsData: brushRef.current.domainsData, + dimensions, + attributesRef, + }), + ); + linesRef.current.updateLines(filteredData); + linesRef.current.data = filteredData; + + if ( + (!_.isNil(attributesRef.current.focusedState?.yValue) && + !_.isNil(keyOfDimension)) || + mouse + ) { + attributesRef.current.updateFocusedChart({ + mouse: mouse ?? [ + brushRef.current?.xScale?.(keyOfDimension) ?? 0, + brushRef.current?.yScale?.[keyOfDimension ?? 0]?.( + attributesRef.current.focusedState?.yValue, + ) + visBoxRef.current.margin.top, + ], + force: true, + }); + } + } + + function handleBrushStart(event: d3.D3BrushEvent): void { + event?.sourceEvent?.stopPropagation(); + } + const brushHeight = plotBoxRef.current.height; + plotNodeRef.current + .selectAll('.Axis') + .append('g') + .attr('class', 'axisBrush') + .each(function (this: any, keyOfDimension: string) { + const brushExtent = brushExtents?.[index]?.[keyOfDimension]; + d3.select(this).call( + d3 + .brushY() + .extent([ + [-15, 0], + [15, brushHeight], + ]) + .handleSize(4) + .on('start', handleBrushStart) + .on('brush', (event) => handleBrushChange(event, keyOfDimension)) + .on('end', (event) => handleBrushChange(event, keyOfDimension)), + ); + if (brushExtent) { + const yScale = brushRef.current.yScale[keyOfDimension]; + const extent = [yScale(brushExtent[1]), yScale(brushExtent[0])]; + if (!_.isNil(extent[0]) && !_.isNil(extent[1])) { + d3.select(this).call(d3.brush().handleSize(4).move, [ + [-15, extent[0]], + [15, extent[1]], + ]); + handleBrushChange( + { + selection: extent, + } as any, + keyOfDimension, + ); + } else { + onAxisBrushExtentChange(keyOfDimension, null, index); + } + } + }); +} + +function scalePointDomainData(yScale: IAxisScale, extent: number[]): string[] { + const domain: string[] = yScale.domain(); + const resultDomainData: string[] = []; + domain.forEach((item: string) => { + const yPosOfDomain = yScale(item); + if (yPosOfDomain >= extent[0] && yPosOfDomain <= extent[1]) { + resultDomainData.push(item); + } + }); + + return resultDomainData; +} + +function filterDataByBrushedScale({ + line, + domainsData, + dimensions, + attributesRef, +}: IFilterDataByBrushedScaleProps) { + const keysOfDimension: string[] = Object.keys(dimensions); + if ( + attributesRef?.current?.focusedState?.active && + attributesRef.current.focusedState.key === line.key + ) { + return true; + } + + const { values } = line; + for (let i = 0; i < keysOfDimension.length; i++) { + const keyOfDimension = keysOfDimension[i]; + const value: string | number | null = values[keyOfDimension]; + const domainData: Array = + domainsData[keyOfDimension] ?? dimensions?.[keyOfDimension]?.domainData; + const { scaleType } = dimensions[keyOfDimension]; + + if ( + value !== null && + ((scaleType === 'point' && !domainData?.includes(value)) || + (scaleType !== 'point' && + !_.isNil(domainData) && + (domainData[0] > value || domainData[1] < value))) + ) { + return false; + } + } + + return true; +} + +export default drawParallelAxesBrush; diff --git a/src/src/utils/d3/drawParallelColorIndicator.ts b/src/src/utils/d3/drawParallelColorIndicator.ts new file mode 100644 index 00000000..6e621a85 --- /dev/null +++ b/src/src/utils/d3/drawParallelColorIndicator.ts @@ -0,0 +1,43 @@ +import { IDrawParallelColorIndicator } from 'types/utils/d3/drawParallelColorIndicator'; + +import { gradientStartColor, gradientEndColor } from './index'; + +function drawParallelColorIndicator({ + index, + plotBoxRef, + plotNodeRef, +}: IDrawParallelColorIndicator): void { + const linearGradientNode = plotNodeRef.current + .append('linearGradient') + .attr('id', `ParCoordsGradient-${index}`) + .attr('class', 'ParCoordsGradient') + .attr('x1', 0) + .attr('x2', 0) + .attr('y1', 0) + .attr('y2', 1) + .lower(); + + linearGradientNode + .append('stop') + .attr('offset', '0%') + .attr('stop-color', gradientEndColor); + + linearGradientNode + .append('stop') + .attr('offset', '100%') + .attr('stop-color', gradientStartColor); + + plotNodeRef.current + .append('rect') + .attr('class', 'ParCoordsGradient__rect') + .attr('x', plotBoxRef.current.width + 1) + .attr('y', 0) + .attr('width', 15) + .attr('height', plotBoxRef.current.height) + .attr('stroke', '#777') + .attr('stroke-width', 1) + .attr('fill', `url(#ParCoordsGradient-${index})`) + .lower(); +} + +export default drawParallelColorIndicator; diff --git a/src/src/utils/d3/drawParallelHoverAttributes.ts b/src/src/utils/d3/drawParallelHoverAttributes.ts new file mode 100644 index 00000000..dc2e14f2 --- /dev/null +++ b/src/src/utils/d3/drawParallelHoverAttributes.ts @@ -0,0 +1,559 @@ +import * as d3 from 'd3'; +import _ from 'lodash-es'; + +import { + IActivePoint, + ISyncHoverStateArgs, +} from 'types/utils/d3/drawHoverAttributes'; +import { + IDrawParallelHoverAttributesArgs, + IParallelNearestCircle, + IUpdateParallelFocusedChartProps, +} from 'types/utils/d3/drawParallelHoverAttributes'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; +import { ILineDataType } from 'types/utils/d3/drawParallelLines'; +import { IFocusedState } from 'types/services/models/metrics/metricsAppModel'; + +import getRoundedValue from 'utils/roundValue'; + +import { CircleEnum, ScaleEnum } from './'; + +const drawParallelHoverAttributes = ({ + dimensions, + index, + id, + nameKey, + attributesNodeRef: attrNodeRef, + attributesRef: attrRef, + linesRef, + visAreaRef, + visBoxRef, + bgRectNodeRef, + isVisibleColorIndicator, + syncHoverState, + linesNodeRef, + highlightedNodeRef, + axesNodeRef, + svgNodeRef, +}: IDrawParallelHoverAttributesArgs) => { + let rafID = 0; + + const { margin, width, height } = visBoxRef.current; + + function isMouseInVisArea(x: number, y: number): boolean { + const padding = 5; + return ( + x > margin.left - padding && + x < width - margin.right + padding && + y > margin.top - padding && + y < height - margin.bottom + padding + ); + } + + const keysOfDimensions = Object.keys(dimensions); + + function getNearestCircles(mouseX: number): IParallelNearestCircle[] { + const { xScale, yScale } = attrRef.current; + const nearestCircles: IParallelNearestCircle[] = []; + for (const line of linesRef.current.data) { + const xAxesValues = keysOfDimensions.map((d: string) => xScale(d)); + const index = d3.bisectCenter(xAxesValues, mouseX); + const closestXPixel = xScale(keysOfDimensions[index]); + const closestYPixel = yScale[keysOfDimensions[index]]( + line.values[keysOfDimensions[index]], + ); + if (!_.isNil(closestYPixel)) { + nearestCircles.push({ + x: closestXPixel, + y: closestYPixel, + lastYScalePos: getColorIndicatorYPixel(line), + key: line.key, + values: line.values, + color: line.color, + }); + } + } + + return nearestCircles; + } + + function getClosestCircle( + nearestCircles: IParallelNearestCircle[], + mouseX: number, + mouseY: number, + ): IParallelNearestCircle { + let closestCircles: IParallelNearestCircle[] = []; + let minRadius = null; + // Find closest circles + for (let circle of nearestCircles) { + const rX = Math.abs(circle.x - mouseX); + const rY = Math.abs(circle.y - mouseY); + const r = Math.sqrt(Math.pow(rX, 2) + Math.pow(rY, 2)); + if (minRadius === null || r <= minRadius) { + if (r === minRadius) { + // Circle coordinates can be equal, to show only one circle on hover + // we need to keep array of closest circles + closestCircles.push(circle); + } else { + minRadius = r; + closestCircles = [circle]; + } + } + } + closestCircles.sort((a, b) => (a.key > b.key ? 1 : -1)); + return closestCircles[0]; + } + + function getLineCirclesOfClosestCircle( + closestCircle: IParallelNearestCircle, + nearestCircles: IParallelNearestCircle[], + ): IParallelNearestCircle[] { + const { xScale, yScale } = attrRef.current; + const lineCirclesOfClosestCircle: IParallelNearestCircle[] = []; + + keysOfDimensions.forEach((dimension: string) => { + const closestXPixel = xScale(dimension); + const closestYPixel = yScale[dimension]( + closestCircle.values && closestCircle.values[dimension], + ); + if (nearestCircles[0]?.x !== closestXPixel && !_.isNil(closestYPixel)) { + lineCirclesOfClosestCircle.push({ + x: closestXPixel, + y: closestYPixel, + lastYScalePos: closestCircle.lastYScalePos, + key: closestCircle.key + 'line', + color: closestCircle.color, + }); + } + }); + return lineCirclesOfClosestCircle; + } + + function getColorIndicatorYPixel(line: ILineDataType) { + const { yScale } = attrRef.current; + let colorIndicatorYPixel: number = 0; + if (isVisibleColorIndicator) { + const lastKeyOfDimension: string = + keysOfDimensions[keysOfDimensions.length - 1]; + const lastYScale: IAxisScale = yScale[lastKeyOfDimension]; + colorIndicatorYPixel = lastYScale(line.values[lastKeyOfDimension]) || 0; + } + + return colorIndicatorYPixel; + } + + function getActivePoint(circle: IParallelNearestCircle): IActivePoint { + const dimensionLabel = scalePointValue(attrRef.current.xScale, circle.x); + let yValue: number = 0; + + if (dimensions[dimensionLabel].scaleType === ScaleEnum.Point) { + yValue = scalePointValue( + attrRef.current.yScale[dimensionLabel], + circle.y, + true, + ); + } else { + yValue = getRoundedValue( + attrRef.current.yScale[dimensionLabel].invert(circle.y), + ); + } + + const chartRect: DOMRect = + visAreaRef.current?.getBoundingClientRect() || {}; + + const rect = { + top: +(margin.top + circle.y - CircleEnum.ActiveRadius).toFixed(2), + bottom: +(margin.top + circle.y + CircleEnum.ActiveRadius).toFixed(2), + left: +(margin.left + circle.x - CircleEnum.ActiveRadius).toFixed(2), + right: +(margin.left + circle.x + CircleEnum.ActiveRadius).toFixed(2), + }; + // @TODO - remove "pointRect" after refactoring (removing old params explorer) + const pointRect = { + top: +(chartRect.top + rect.top).toFixed(2), + bottom: +(chartRect.top + rect.bottom).toFixed(2), + left: +(chartRect.left + rect.left).toFixed(2), + right: +(chartRect.left + rect.right).toFixed(2), + }; + + return { + key: circle.key, + xValue: dimensionLabel, + yValue, + xPos: circle.x, + yPos: circle.y, + chartIndex: index, + visId: id, + pointRect, + rect, + }; + } + + function getFocusedState( + activePoint: IActivePoint, + focusedStateActive: boolean = false, + ): IFocusedState { + return { + active: focusedStateActive, + key: activePoint.key, + xValue: activePoint.xValue, + yValue: activePoint.yValue, + chartIndex: activePoint.chartIndex, + visId: activePoint.visId, + }; + } + + function updateFocusedChart(args: IUpdateParallelFocusedChartProps = {}) { + const { xScale, yScale, focusedState, activePoint } = attrRef.current; + + const { + mousePos, + focusedStateActive = focusedState?.active || false, + force = false, + } = args; + + let mousePosition: [number, number] | [] = []; + let dimensionLabel = ''; + if (mousePos) { + dimensionLabel = scalePointValue(xScale, mousePos[0]); + mousePosition = mousePos; + } else if (focusedState?.active && focusedState.visId === id) { + const xPos = xScale(focusedState.xValue); + dimensionLabel = scalePointValue(xScale, xPos); + mousePosition = [xPos, yScale[dimensionLabel]?.(focusedState.yValue)]; + } else if (activePoint?.xValue && activePoint.yValue) { + const xPos = xScale(activePoint.xValue); + dimensionLabel = scalePointValue(xScale, xPos); + mousePosition = [ + xScale(activePoint.xValue), + yScale[dimensionLabel]?.(activePoint.yValue), + ]; + } + if (dimensionLabel && mousePosition.length === 2) { + const [mouseX, mouseY] = mousePosition; + const nearestCircles = getNearestCircles(mouseX); + const closestCircle = getClosestCircle(nearestCircles, mouseX, mouseY); + const lineCirclesOfClosestCircle = closestCircle + ? getLineCirclesOfClosestCircle(closestCircle, nearestCircles) + : []; + + // hover Line Changed case + if (closestCircle?.key !== attrRef.current?.lineKey || force) { + linesNodeRef.current.classed('highlight', false); + // previous line + clearActiveLine(attrRef.current.lineKey); + // new line + drawActiveLine(closestCircle?.key); + if (closestCircle) { + const activePoint = getActivePoint(closestCircle); + drawParallelCircles( + nearestCircles, + lineCirclesOfClosestCircle, + closestCircle, + ); + if (focusedStateActive) { + drawFocusedCircle(activePoint.key); + } + const focusedState = getFocusedState(activePoint, focusedStateActive); + attrRef.current.focusedState = focusedState; + safeSyncHoverState({ activePoint, focusedState }); + attrRef.current.activePoint = activePoint; + attrRef.current.lineKey = closestCircle.key; + attrRef.current.x = closestCircle.x; + attrRef.current.y = closestCircle.y; + } + } + } + } + + function drawActiveCircle(key: string) { + d3.selectAll(`[id=Circle-${key}]`) + .attr('r', CircleEnum.ActiveRadius) + .classed('active', true) + .raise(); + d3.selectAll(`[id=Circle-${key}line]`) + .attr('r', CircleEnum.ActiveRadius) + .classed('active', true) + .raise(); + } + + function drawActiveLine(key: string): void { + // new line + const newActiveLine = linesNodeRef.current.selectAll(`[id=Line-${key}]`); + + if (!_.isEmpty(newActiveLine.nodes())) { + const linesSelectorToHighlight = newActiveLine.attr('data-selector'); + // set highlighted lines + highlightedNodeRef.current = linesNodeRef.current + .selectAll(`[data-selector=${linesSelectorToHighlight}]`) + .classed('highlighted', true) + .raise(); + // set active line + newActiveLine?.classed('active', true).raise(); + } + + attrRef.current.lineKey = key; + } + + function clearActiveLine(key?: string): void { + // previous line + if (key) { + linesNodeRef.current + .selectAll(`[id=Line-${key}]`) + .classed('active', false); + highlightedNodeRef.current.classed('highlighted', false); + } + } + + function drawFocusedCircle(key: string): void { + if (!attrNodeRef.current) return; + + attrNodeRef.current + .selectAll('circle') + .attr('r', CircleEnum.Radius) + .classed('active', false) + .classed('focus', false); + + attrNodeRef.current.select('.focus__shadow')?.remove(); + + const newFocusedPoint = attrNodeRef.current.select(`[id=Circle-${key}]`); + + newFocusedPoint + .classed('focus', true) + .attr('r', CircleEnum.ActiveRadius) + .raise(); + + attrNodeRef.current + .append('circle') + .classed('HoverCircle focus focus__shadow', true) + .attr('r', CircleEnum.ActiveRadius) + .attr('cx', newFocusedPoint.attr('cx')) + .attr('cy', newFocusedPoint.attr('cy')) + .attr('stroke', newFocusedPoint.attr('stroke')) + .attr('stroke-opacity', 0.4) + .lower(); + } + + function drawParallelCircles( + nearestCircles: IParallelNearestCircle[], + lineCirclesOfClosestCircle: IParallelNearestCircle[], + closestCircle: IParallelNearestCircle, + ) { + attrNodeRef.current.classed('highlight', false); + attrNodeRef.current + .selectAll('circle') + .data([...nearestCircles, ...lineCirclesOfClosestCircle]) + .join('circle') + .raise() + .attr('class', 'HoverCircle') + .attr('id', (d: IParallelNearestCircle) => `Circle-${d.key}`) + .attr('data-key', (d: IParallelNearestCircle) => d.key) + .attr('clip-path', `url(#${nameKey}-circles-rect-clip-${index})`) + .attr('cx', (d: IParallelNearestCircle) => d.x.toFixed(2)) + .attr('cy', (d: IParallelNearestCircle) => d.y.toFixed(2)) + .attr('r', CircleEnum.Radius) + .attr('stroke', (d: IParallelNearestCircle) => + isVisibleColorIndicator + ? attrRef.current.yColorIndicatorScale(d.lastYScalePos) + : d.color, + ) + .attr('stroke-opacity', 1) + .on('click', handlePointClick); + // set active circle + drawActiveCircle(closestCircle?.key); + } + + // Interactions + function handlePointClick(this: SVGElement, event: MouseEvent): void { + if (attrRef.current.focusedState?.visId !== id) { + safeSyncHoverState({ activePoint: null }); + } + const mousePos = d3.pointer(event); + updateFocusedChart({ mousePos, focusedStateActive: true, force: true }); + } + + function handleLineClick(this: SVGElement, event: MouseEvent): void { + if (attrRef.current.focusedState?.visId !== id) { + safeSyncHoverState({ activePoint: null }); + } + const mousePos = d3.pointer(event); + updateFocusedChart({ mousePos, focusedStateActive: false, force: true }); + } + + function setActiveLineAndCircle( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ): void { + let xPos = 0; + const xStep = attrRef.current.xScale.step(); + let closestCircle; + let nearestCircles; + while (xPos <= attrRef.current.xScale.range()[1]) { + nearestCircles = getNearestCircles(xPos); + closestCircle = nearestCircles.find((c) => c.key === lineKey); + if (closestCircle) { + break; + } + xPos += xStep; + } + + if (closestCircle?.key !== attrRef.current?.lineKey || force) { + const lineCirclesOfClosestCircle = closestCircle + ? //@ts-ignore + getLineCirclesOfClosestCircle(closestCircle, nearestCircles) + : []; + linesNodeRef.current.classed('highlight', false); + // previous line + clearActiveLine(attrRef.current.lineKey); + // new line + //@ts-ignore + drawActiveLine(closestCircle?.key); + if (closestCircle) { + const activePoint = getActivePoint(closestCircle); + drawParallelCircles( + //@ts-ignore + nearestCircles, + lineCirclesOfClosestCircle, + closestCircle, + ); + if (focusedStateActive) { + drawFocusedCircle(closestCircle?.key); + } + const focusedState = getFocusedState(activePoint, focusedStateActive); + attrRef.current.focusedState = focusedState; + safeSyncHoverState({ activePoint, focusedState }); + attrRef.current.activePoint = activePoint; + attrRef.current.lineKey = closestCircle.key; + attrRef.current.x = closestCircle.x + margin.left; + attrRef.current.y = closestCircle.y + margin.top; + } + } + } + + function handleMouseMove(event: MouseEvent): void { + if (attrRef.current.focusedState?.active) { + return; + } + const mousePos = d3.pointer(event); + if (isMouseInVisArea(mousePos[0], mousePos[1])) { + rafID = window.requestAnimationFrame(() => { + updateFocusedChart({ + mousePos: [ + Math.floor(mousePos[0]) - margin.left, + Math.floor(mousePos[1]) - margin.top, + ], + focusedStateActive: false, + }); + }); + } + } + + function handleMouseLeave() { + if (attrRef.current.focusedState?.active) { + return; + } + if (attrRef.current?.lineKey) { + linesNodeRef.current.classed('highlight', false); + + linesNodeRef.current + .selectAll(`[id=Line-${attrRef.current?.lineKey}]`) + .classed('active', false); + + attrNodeRef.current.classed('highlight', false); + + attrNodeRef.current + .selectAll(`[id=Circle-${attrRef.current?.lineKey}]`) + .attr('r', CircleEnum.Radius) + .classed('active', false); + + attrNodeRef.current + .selectAll(`[id=Circle-${attrRef.current?.lineKey}line]`) + .remove(); + + if (rafID) { + window.cancelAnimationFrame(rafID); + } + clearHoverAttributes(); + safeSyncHoverState({ activePoint: null }); + } + } + + function handleLeaveFocusedPoint( + event: MouseEvent, + type: 'axes' | 'bg', + ): void { + if (attrRef.current.focusedState?.visId !== id) { + safeSyncHoverState({ activePoint: null }); + } + const mousePos = d3.pointer(event); + updateFocusedChart({ + mousePos: + type === 'axes' + ? mousePos + : [ + Math.floor(mousePos[0]) - margin.left, + Math.floor(mousePos[1]) - margin.top, + ], + force: true, + focusedStateActive: false, + }); + } + + function clearHoverAttributes(): void { + attrRef.current.activePoint = undefined; + attrRef.current.lineKey = undefined; + + linesNodeRef.current.classed('highlight', false); + attrNodeRef.current.classed('highlight', false); + + linesNodeRef.current + .selectAll('path') + .classed('highlighted', false) + .classed('active', false); + + attrNodeRef.current.selectAll('circle').remove(); + } + + function safeSyncHoverState(args: ISyncHoverStateArgs): void { + if (typeof syncHoverState === 'function') { + syncHoverState(args); + } + } + + attrRef.current.updateFocusedChart = updateFocusedChart; + attrRef.current.setActiveLineAndCircle = setActiveLineAndCircle; + attrRef.current.clearHoverAttributes = clearHoverAttributes; + + svgNodeRef.current?.on('mousemove', handleMouseMove); + svgNodeRef.current?.on('mouseleave', handleMouseLeave); + linesNodeRef.current?.on('click', handleLineClick); + bgRectNodeRef.current?.on('click', (e: MouseEvent) => + handleLeaveFocusedPoint(e, 'bg'), + ); + axesNodeRef.current?.on('click', (e: MouseEvent) => + handleLeaveFocusedPoint(e, 'axes'), + ); + + // call on every render + if (attrRef.current.focusedState) { + updateFocusedChart({ force: true }); + } +}; + +function scalePointValue( + xScale: IAxisScale, + xPos: number, + rangeReversed: boolean = false, +) { + const domain = rangeReversed ? xScale.domain().reverse() : xScale.domain(); + const range = rangeReversed ? xScale.range().reverse() : xScale.range(); + const rangePoints = d3.range( + range[0], + range[1], + xScale.step && xScale.step() - 1, + ); + + return domain[d3.bisect(rangePoints, xPos) - 1]; +} + +export default drawParallelHoverAttributes; diff --git a/src/src/utils/d3/drawParallelLines.ts b/src/src/utils/d3/drawParallelLines.ts new file mode 100644 index 00000000..19203502 --- /dev/null +++ b/src/src/utils/d3/drawParallelLines.ts @@ -0,0 +1,207 @@ +import _ from 'lodash-es'; + +import { + IDrawParallelLinesArgs, + InitialPathDataType, + ILineDataType, + ILineRendererArgs, + IGetColorIndicatorScaleValueArgs, + IDrawParallelLineArgs, +} from 'types/utils/d3/drawParallelLines'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import lineGenerator from './lineGenerator'; + +const initialPathData: InitialPathDataType = { + dimensionList: [], + lineData: {}, + isEmpty: true, + isDotted: false, +}; + +function drawParallelLines({ + index, + nameKey, + linesNodeRef, + attributesRef, + dimensions, + curveInterpolation, + linesRef, + data, + attributesNodeRef, + isVisibleColorIndicator, +}: IDrawParallelLinesArgs) { + if (!linesNodeRef?.current || !linesRef?.current || !attributesRef?.current) { + return; + } + const keysOfDimensions: string[] = Object.keys(dimensions); + + linesRenderer({ + index, + nameKey, + data, + keysOfDimensions, + curveInterpolation, + linesNodeRef, + attributesRef, + isVisibleColorIndicator, + }); + + linesRef.current.updateLines = function (updatedData: ILineDataType[]) { + linesNodeRef.current?.selectAll('*')?.remove(); + attributesNodeRef.current?.selectAll('*')?.remove(); + linesRenderer({ + index, + nameKey, + data: updatedData, + keysOfDimensions, + curveInterpolation, + linesNodeRef, + attributesRef, + isVisibleColorIndicator, + }); + }; +} + +function linesRenderer({ + index, + nameKey, + data, + keysOfDimensions, + curveInterpolation, + linesNodeRef, + attributesRef, + isVisibleColorIndicator, +}: ILineRendererArgs) { + data.forEach(({ values: line, key, color, dasharray }: ILineDataType) => { + const arrayOfPathData: InitialPathDataType[] = [ + _.cloneDeep(initialPathData), + ]; + let pathDataArrayIndex: number = 0; + for (let i = 0; i < keysOfDimensions.length; i++) { + const keyOfDimension: string = keysOfDimensions[i]; + if (_.isNil(line[keyOfDimension])) { + if (i === 0) continue; + let nextStep: number = 1; + while ( + keysOfDimensions[i + nextStep] && + _.isNil(line[keysOfDimensions[i + nextStep]]) + ) { + nextStep++; + } + if ( + nextStep + i < keysOfDimensions.length && + line[keysOfDimensions[i - 1]] && + line[keysOfDimensions[i + nextStep]] + ) { + arrayOfPathData[pathDataArrayIndex + 1] = { + dimensionList: [ + keysOfDimensions[i - 1], + keysOfDimensions[i + nextStep], + ], + lineData: { + [keysOfDimensions[i - 1]]: line[keysOfDimensions[i - 1]], + [keysOfDimensions[i + nextStep]]: + line[keysOfDimensions[i + nextStep]], + }, + isEmpty: false, + isDotted: true, + }; + arrayOfPathData[pathDataArrayIndex + 2] = + _.cloneDeep(initialPathData); + pathDataArrayIndex = pathDataArrayIndex + 2; + } + i = i + nextStep - 1; + } else { + arrayOfPathData[pathDataArrayIndex].isEmpty = false; + arrayOfPathData[pathDataArrayIndex].dimensionList.push(keyOfDimension); + arrayOfPathData[pathDataArrayIndex].lineData[keyOfDimension] = + line[keyOfDimension]; + } + } + + arrayOfPathData.forEach((pathData) => { + if (!pathData.isEmpty) { + drawParallelLine({ + index, + nameKey, + linesNodeRef, + attributesRef, + curveInterpolation, + dimensionList: pathData.dimensionList, + lineData: pathData.lineData, + isDotted: pathData.isDotted, + dasharray, + key, + color: isVisibleColorIndicator + ? getColorIndicatorScaleValue({ + line, + keysOfDimensions, + yColorIndicatorScale: + attributesRef.current.yColorIndicatorScale, + yScale: attributesRef.current.yScale, + }) + : color, + }); + } + }); + }); +} + +function drawParallelLine({ + index, + nameKey, + linesNodeRef, + attributesRef, + dimensionList, + curveInterpolation, + lineData, + dasharray, + isDotted, + color, + key, +}: IDrawParallelLineArgs) { + if (!linesNodeRef.current) { + return; + } + + linesNodeRef.current + .append('path') + .lower() + .data([ + dimensionList.map((dimension: number | string, i: number) => [ + dimension, + lineData[dimensionList[i]], + ]), + ]) + .attr('id', `Line-${key}`) + .attr('clip-path', `url(#${nameKey}-lines-rect-clip-${index})`) + .attr( + 'd', + lineGenerator( + attributesRef.current.xScale, + attributesRef.current.yScale, + curveInterpolation, + ), + ) + .attr('class', 'Line') + .style('fill', 'none') + .style('stroke', isDotted ? '#9c9292' : color) + .style('stroke-opacity', 1) + .style('stroke-dasharray', isDotted ? '4 1' : dasharray); +} + +function getColorIndicatorScaleValue({ + line, + keysOfDimensions, + yColorIndicatorScale, + yScale, +}: IGetColorIndicatorScaleValueArgs) { + const lastKeyOfDimension: string = + keysOfDimensions[keysOfDimensions.length - 1]; + const lastYScale: IAxisScale = yScale[lastKeyOfDimension]; + + return yColorIndicatorScale(lastYScale(line[lastKeyOfDimension]) || 0); +} + +export default drawParallelLines; diff --git a/src/src/utils/d3/drawPoints.ts b/src/src/utils/d3/drawPoints.ts new file mode 100644 index 00000000..9d35593f --- /dev/null +++ b/src/src/utils/d3/drawPoints.ts @@ -0,0 +1,51 @@ +import { IPoint } from 'components/ScatterPlot'; + +import { IDrawPointsArgs } from 'types/utils/d3/drawPoints'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { CircleEnum } from './index'; + +function drawPoints(args: IDrawPointsArgs): void { + const { index, nameKey, data, xScale, yScale, pointsRef, pointsNodeRef } = + args; + + if (!pointsNodeRef?.current) { + return; + } + + pointsRef.current.updateScales = function ( + xScale: IAxisScale, + yScale: IAxisScale, + ): void { + pointsNodeRef.current + .selectAll('.Circle') + .attr('cx', (p: IPoint) => xScale(p.data.xValues[0]).toFixed(2)) + .attr('cy', (p: IPoint) => yScale(p.data.yValues[0]).toFixed(2)) + .attr('r', CircleEnum.Radius); + }; + + pointsRef.current.updatePoints = function (pointData: IPoint[]): void { + pointsNodeRef.current + ?.selectAll('.Circle') + .data( + pointData.filter( + (p: IPoint) => p.data.yValues[0] !== '-' && p.data.xValues[0] !== '-', + ), + ) + .join('circle') + .attr('class', 'Circle') + .attr('id', (p: IPoint) => `Circle-${p.key}`) + .attr('clip-path', `url(#${nameKey}-lines-rect-clip-${index})`) + .attr('groupKey', (p: IPoint) => p.groupKey) + .attr('cx', (p: IPoint) => xScale(p.data.xValues[0]).toFixed(2)) + .attr('cy', (p: IPoint) => yScale(p.data.yValues[0]).toFixed(2)) + .attr('r', CircleEnum.Radius) + .attr('fill', (p: IPoint) => p.color) + .attr('stroke', (d: IPoint) => d.color) + .attr('color', (d: IPoint) => d.color); + }; + + pointsRef.current.updatePoints(data); +} + +export default drawPoints; diff --git a/src/src/utils/d3/drawScatterTrendline.ts b/src/src/utils/d3/drawScatterTrendline.ts new file mode 100644 index 00000000..67f5d129 --- /dev/null +++ b/src/src/utils/d3/drawScatterTrendline.ts @@ -0,0 +1,67 @@ +import * as d3 from 'd3'; + +import { IPoint } from 'components/ScatterPlot'; + +import { + linearRegression, + linearRegressionLine, +} from 'utils/regression/linearRegression'; +import loess from 'utils/regression/loess'; + +import { TrendlineTypeEnum } from '.'; + +/** + * Given the params with the type for trendline + * respectively, draws a line on the ScatterPlot + */ +function drawScatterTrendline({ + index, + nameKey, + data, + type, + xScale, + yScale, + bandwidth, + targetRef, +}: any): void { + if (!targetRef?.current) { + return; + } + + const points = data + .map((d: IPoint) => [xScale(d.data.xValues[0]), yScale(d.data.yValues[0])]) + .filter((d: [number, number]) => d[0] !== undefined && d[1] !== undefined) + .sort((a: [number, number], b: [number, number]) => a[0] - b[0]); + + let regressionPoints; + + if (type === TrendlineTypeEnum.SLR) { + const slr = linearRegression(points); + const slrLine = linearRegressionLine(slr); + + const firstX = points[0][0]; + const lastX = points[points.length - 1][0]; + const xCoordinates = [firstX, lastX]; + + regressionPoints = xCoordinates.map((d) => [d, slrLine(d as number)]); + } else { + regressionPoints = loess(points, bandwidth ?? 0.66); + } + + const line = d3 + .line() + .x((d) => d[0]) + .y((d) => d[1]); + + targetRef.current + .append('path') + .datum(regressionPoints) + .classed('RegressionLine', true) + .attr('clip-path', `url(#${nameKey}-lines-rect-clip-${index})`) + .attr('d', line) + .attr('stroke-width', 2.2) + .attr('fill', 'none') + .attr('stroke', '#E64E48FF'); // error-color +} + +export default drawScatterTrendline; diff --git a/src/src/utils/d3/drawUnableToRender.ts b/src/src/utils/d3/drawUnableToRender.ts new file mode 100644 index 00000000..19a39377 --- /dev/null +++ b/src/src/utils/d3/drawUnableToRender.ts @@ -0,0 +1,37 @@ +import React from 'react'; +import * as d3 from 'd3'; + +import { ISyncHoverStateArgs } from 'types/utils/d3/drawHoverAttributes'; + +function drawUnableToRender({ + renderArr = [], + visAreaRef, + attributesRef, + readOnly = false, + syncHoverState, +}: { + renderArr: { condition: boolean; text?: string }[]; + attributesRef: React.MutableRefObject; + visAreaRef: React.MutableRefObject; + readOnly?: boolean; + syncHoverState?: (args: ISyncHoverStateArgs) => void; +}) { + const renderItem = renderArr.find((item) => item.condition); + + if (renderItem?.condition && visAreaRef.current && !readOnly) { + const visArea = d3.select(visAreaRef.current); + visArea.selectAll('*').remove(); + visArea + .append('text') + .classed('unableToDrawText', true) + .text(renderItem.text || ''); + + if (attributesRef.current?.clearHoverAttributes) { + attributesRef.current.clearHoverAttributes(); + } + attributesRef.current = {}; + syncHoverState?.({ activePoint: null }); + } +} + +export default drawUnableToRender; diff --git a/src/src/utils/d3/getAxisScale.ts b/src/src/utils/d3/getAxisScale.ts new file mode 100644 index 00000000..4dee7998 --- /dev/null +++ b/src/src/utils/d3/getAxisScale.ts @@ -0,0 +1,30 @@ +import * as d3 from 'd3'; + +import { IAxisScale, IGetAxisScaleProps } from 'types/utils/d3/getAxisScale'; + +import { ScaleEnum } from './index'; + +function getScaleBaseFor(scaleType?: ScaleEnum) { + switch (scaleType) { + case ScaleEnum.Log: + return d3.scaleLog(); + case ScaleEnum.Linear: + return d3.scaleLinear(); + case ScaleEnum.Point: + return d3.scalePoint(); + default: + return d3.scaleLinear(); + } +} + +function getAxisScale({ + scaleType, + domainData, + rangeData, +}: IGetAxisScaleProps): IAxisScale { + const scaleBase = getScaleBaseFor(scaleType); + //@ts-ignore + return scaleBase.domain(domainData).range(rangeData); +} + +export default getAxisScale; diff --git a/src/src/utils/d3/getColorFromRange.ts b/src/src/utils/d3/getColorFromRange.ts new file mode 100644 index 00000000..4a96ddb7 --- /dev/null +++ b/src/src/utils/d3/getColorFromRange.ts @@ -0,0 +1,18 @@ +import * as d3 from 'd3'; + +import { gradientStartColor, gradientEndColor } from 'utils/d3'; + +function getColorFromRange( + range: [number, number], + startColor: string = gradientStartColor, + endColor: string = gradientEndColor, +) { + return range + ? d3 + .scaleSequential() + .domain(range) + .interpolator(d3.interpolateRgb(startColor, endColor)) + : null; +} + +export default getColorFromRange; diff --git a/src/src/utils/d3/getCoordinates.ts b/src/src/utils/d3/getCoordinates.ts new file mode 100644 index 00000000..b910b7ac --- /dev/null +++ b/src/src/utils/d3/getCoordinates.ts @@ -0,0 +1,21 @@ +import { + IGetCoordinates, + IGetCoordinatesArgs, +} from 'types/utils/d3/drawHoverAttributes'; + +export default function getCoordinates({ + mouse, + margin, + xScale, + yScale, +}: IGetCoordinatesArgs): IGetCoordinates { + const xPixel = Math.floor(mouse[0]) - margin.left; + const yPixel = Math.floor(mouse[1]) - margin.top; + const [xMin, xMax] = xScale.range(); + const [yMax, yMin] = yScale.range(); + + return { + mouseX: xPixel < xMin ? xMin : xPixel > xMax ? xMax : xPixel, + mouseY: yPixel < yMin ? yMin : yPixel > yMax ? yMax : yPixel, + }; +} diff --git a/src/src/utils/d3/getDimensionValue.ts b/src/src/utils/d3/getDimensionValue.ts new file mode 100644 index 00000000..a4b12958 --- /dev/null +++ b/src/src/utils/d3/getDimensionValue.ts @@ -0,0 +1,18 @@ +import * as d3 from 'd3'; + +import { IDimensionType } from 'types/utils/d3/drawParallelAxes'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +export function getDimensionValue({ + pos, + domainData, + axisScale, +}: { + pos: number; + domainData: IDimensionType['domainData']; + axisScale: IAxisScale; +}) { + const axisValues = (domainData as string[]).map((d: string) => axisScale(d)); + const index = d3.bisectCenter(axisValues, pos); + return domainData[index]; +} diff --git a/src/src/utils/d3/index.ts b/src/src/utils/d3/index.ts new file mode 100644 index 00000000..9d322fac --- /dev/null +++ b/src/src/utils/d3/index.ts @@ -0,0 +1,131 @@ +import clearArea from './clearArea'; +import drawArea from './drawArea'; +import drawAxes from './drawAxes'; +import drawLines from './drawLines'; +import processLineChartData from './processLineChartData'; +import getAxisScale from './getAxisScale'; +import drawBrush from './drawBrush'; +import drawHoverAttributes from './drawHoverAttributes'; +import drawParallelAxes from './drawParallelAxes'; +import drawParallelLines from './drawParallelLines'; +import drawParallelHoverAttributes from './drawParallelHoverAttributes'; +import drawParallelAxesBrush from './drawParallelAxesBrush'; +import drawParallelColorIndicator from './drawParallelColorIndicator'; +import getCoordinates from './getCoordinates'; +import drawPoints from './drawPoints'; +import drawScatterTrendline from './drawScatterTrendline'; +import drawUnableToRender from './drawUnableToRender'; +import drawLegends from './drawLegends'; + +const gradientStartColor = '#2980B9'; +const gradientEndColor = '#E74C3C'; + +enum AlignmentOptionsEnum { + STEP = 'step', + EPOCH = 'epoch', + RELATIVE_TIME = 'relative_time', + ABSOLUTE_TIME = 'absolute_time', + CUSTOM_METRIC = 'custom', +} + +enum CircleEnum { + Radius = 2, + ActiveRadius = 4.6, + InProgress = 1.6, +} + +enum HighlightEnum { + Off = 0, + Metric = 1, + Run = 2, + Custom = 3, +} + +enum ZoomEnum { + SINGLE = 0, + MULTIPLE = 1, +} + +enum LegendsModeEnum { + PINNED = 'pinned', + UNPINNED = 'unpinned', +} + +enum CurveEnum { + Linear = 'curveLinear', + Basis = 'curveBasis', + Bundle = 'curveBundle', + Cardinal = 'curveCardinal', + CatmullRom = 'curveCatmullRom', + MonotoneX = 'curveMonotoneX', + MonotoneY = 'curveMonotoneY', + Natural = 'curveNatural', + Step = 'curveStep', + StepAfter = 'curveStepAfter', + StepBefore = 'curveStepBefore', + BasisClosed = 'curveBasisClosed', +} + +enum ScaleEnum { + Log = 'log', + Linear = 'linear', + Point = 'point', +} + +enum ChartTypeEnum { + LineChart = 'LineChart', + HighPlot = 'HighPlot', + ScatterPlot = 'ScatterPlot', + ImageSet = 'ImageSet', +} + +enum PointSymbolEnum { + CIRCLE = 'symbolCircle', + CROSS = 'symbolCross', + DIAMOND = 'symbolDiamond', + SQUARE = 'symbolSquare', + STAR = 'symbolStar', + TRIANGLE = 'symbolTriangle', + WYE = 'symbolWye', +} + +enum TrendlineTypeEnum { + SLR = 'slr', + LOESS = 'loess', +} + +const MIN_LOG_VALUE = 1e-8; + +export { + CircleEnum, + CurveEnum, + ScaleEnum, + ChartTypeEnum, + AlignmentOptionsEnum, + PointSymbolEnum, + TrendlineTypeEnum, + HighlightEnum, + ZoomEnum, + LegendsModeEnum, + clearArea, + drawArea, + drawAxes, + drawLines, + getCoordinates, + drawParallelColorIndicator, + processLineChartData, + getAxisScale, + drawBrush, + drawHoverAttributes, + drawParallelAxes, + drawParallelLines, + drawParallelHoverAttributes, + drawParallelAxesBrush, + drawPoints, + drawScatterTrendline, + drawUnableToRender, + drawLegends, + gradientStartColor, + gradientEndColor, + MIN_LOG_VALUE, +}; diff --git a/src/src/utils/d3/lineGenerator.ts b/src/src/utils/d3/lineGenerator.ts new file mode 100644 index 00000000..afccda2b --- /dev/null +++ b/src/src/utils/d3/lineGenerator.ts @@ -0,0 +1,24 @@ +import * as d3 from 'd3'; + +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { CurveEnum } from './'; + +export default function lineGenerator( + xScaleValues: IAxisScale, + yScaleValues: IAxisScale | { [key: string]: IAxisScale }, + curve: CurveEnum = CurveEnum.Linear, +) { + if (!xScaleValues) { + return; + } + return d3 + .line() + .x((d) => xScaleValues(d[0])) + .y((d) => + typeof yScaleValues === 'object' + ? yScaleValues[d[0]](d[1]) + : yScaleValues(d[1]), + ) + .curve(d3[curve]); +} diff --git a/src/src/utils/d3/processLineChartData.ts b/src/src/utils/d3/processLineChartData.ts new file mode 100644 index 00000000..47d6a14b --- /dev/null +++ b/src/src/utils/d3/processLineChartData.ts @@ -0,0 +1,498 @@ +import _ from 'lodash-es'; + +import { + ICalculateLineValues, + IGetValueInLine, + IProcessedAggrData, + IProcessedData, + IProcessLineChartData, + IProcessLineChartDataArgs, +} from 'types/utils/d3/processLineChartData'; +import { ILine } from 'types/components/LineChart/LineChart'; + +import { minMaxOfArray } from 'utils/minMaxOfArray'; +import { removeOutliers } from 'utils/removeOutliers'; + +import { toQuadrupleData, toTupleData } from '../toFormatData'; +import getRoundedValue from '../roundValue'; + +import { getAxisScale, MIN_LOG_VALUE, ScaleEnum } from './index'; + +function processLineChartData({ + data, + ignoreOutliers = false, + visBoxRef, + axesScaleType, + axesScaleRange, + aggregatedData, + aggregationConfig, + unableToDrawConditions, + attributesRef, +}: IProcessLineChartDataArgs): IProcessLineChartData { + let allXValues: number[] = []; + let allYValues: number[] = []; + let tupleLineChartData: IProcessedData[] = []; + let quadrupleAggrData: IProcessedAggrData[] = []; + let yBounds: number[] = []; + + for (let i = 0; i < data.length; i++) { + const line: ILine = data[i]; + let { xValues, yValues } = line.data; + + if (xValues.length === 0 || yValues.length === 0) { + continue; + } + + if (axesScaleType.yAxis === ScaleEnum.Log) { + yValues = yValues.map((val) => (val <= 0 ? MIN_LOG_VALUE : val)); + } + if (axesScaleType.xAxis === ScaleEnum.Log) { + xValues = xValues.map((val) => (val <= 0 ? MIN_LOG_VALUE : val)); + } + + const tupleData = toTupleData(xValues, yValues, (x, y) => { + // supposed received x values are sorted by ascending order (y values are sorted by x) + allXValues.push(x); + allYValues.push(y); + }); + + // find y bounds for lines to ignore "acceptable" outliers + if (ignoreOutliers) { + yBounds = yBounds.concat(minMaxOfArray(removeOutliers(yValues, 4))); + } + + tupleLineChartData.push({ + color: '#000', + dasharray: 'none', + ...line, + data: tupleData, + }); + } + + unableToDrawConditions.unshift({ + condition: !allXValues.length || !allYValues.length, + text: 'Unable to draw lines with the current config. Please adjust the controls.', + }); + + if (aggregationConfig?.isApplied && aggregatedData) { + for (let i = 0; i < aggregatedData.length; i++) { + const aggrData = aggregatedData[i]; + quadrupleAggrData.push({ + ...aggrData, + area: toQuadrupleData( + aggrData.area.max?.xValues || [], + aggrData.area.max?.yValues || [], + aggrData.area.min?.xValues || [], + aggrData.area.min?.yValues || [], + ), + line: toTupleData( + aggrData.line?.xValues || [], + aggrData.line?.yValues || [], + ), + }); + } + } + + let [yMin, yMax] = minMaxOfArray( + ignoreOutliers ? yBounds : _.uniq(allYValues), + ); + let [xMin, xMax] = minMaxOfArray(_.uniq(allXValues)); + + // add y-axis scale range manually + if (axesScaleRange?.yAxis && !_.isEmpty(axesScaleRange?.yAxis)) { + if (axesScaleRange.yAxis.min !== undefined) { + yMin = axesScaleRange.yAxis.min; + } + if (axesScaleRange.yAxis.max !== undefined) { + yMax = axesScaleRange.yAxis.max; + } + unableToDrawConditions.unshift({ + condition: yMin > yMax, + text: 'Unable to draw lines with the current y-axis range. Please adjust the y-axis range.', + }); + } + // add x-axis scale range manually + if (axesScaleRange?.xAxis && !_.isEmpty(axesScaleRange?.xAxis)) { + if (axesScaleRange.xAxis.min !== undefined) { + xMin = axesScaleRange.xAxis.min; + } + if (axesScaleRange.xAxis.max !== undefined) { + xMax = axesScaleRange.xAxis.max; + } + unableToDrawConditions.unshift({ + condition: xMin > xMax, + text: 'Unable to draw lines with the current x-axis range. Please adjust the x-axis range.', + }); + } + + if (axesScaleType.xAxis === ScaleEnum.Log) { + if (xMin <= 0) { + xMin = MIN_LOG_VALUE; + } + if (xMax <= 0) { + xMax = MIN_LOG_VALUE; + } + } + + if (axesScaleType.yAxis === ScaleEnum.Log) { + if (yMin <= 0) { + yMin = MIN_LOG_VALUE; + } + if (yMax <= 0) { + yMax = MIN_LOG_VALUE; + } + } + + // ADD margin for y-dimension + const diff = yMax - yMin; + const portion = 0.05; + const yMargin = yMax !== yMin ? diff * portion : 1; + yMax += yMargin; + yMin -= yMin <= yMargin ? 0 : yMargin; + + const { width, height, margin } = visBoxRef.current; + + // create axes scale functions + const xScale = getAxisScale({ + domainData: [xMin, xMax], + rangeData: [0, width - margin.left - margin.right], + scaleType: axesScaleType.xAxis, + }); + const yScale = getAxisScale({ + domainData: [yMin, yMax], + rangeData: [height - margin.top - margin.bottom, 0], + scaleType: axesScaleType.yAxis, + }); + + let processedData = tupleLineChartData; + let processedAggrData = quadrupleAggrData; + + if (ignoreOutliers) { + const offsetScaled = 20; + const minEdge = getRoundedValue(yScale.invert(yScale(yMin) + offsetScaled)); + const maxEdge = getRoundedValue(yScale.invert(yScale(yMax) - offsetScaled)); + + processedData = tupleLineChartData.map((line) => ({ + ...line, + data: calculateLineValues({ + values: line.data, + xMin, + xMax, + minEdge, + maxEdge, + axesScaleType, + }), + })); + + processedAggrData = quadrupleAggrData.map((aggrData) => { + let min: [number, number][] = []; + let max: [number, number][] = []; + + aggrData.area.forEach(([x0, y0, x1, y1]) => { + max.push([x0, y0]); + min.push([x1, y1]); + }); + + const area = { + min: calculateLineValues({ + values: min, + xMin, + xMax, + minEdge, + maxEdge, + axesScaleType, + }), + max: calculateLineValues({ + values: max, + xMin, + xMax, + minEdge, + maxEdge, + axesScaleType, + }), + }; + const line = calculateLineValues({ + values: aggrData.line, + xMin, + xMax, + minEdge, + maxEdge, + axesScaleType, + }); + + // Calculated area's (min/max arrays) can have different length + // need to fill them (to equal their length) to draw aggregated area's correctly + const [longArea, shortArea] = + area.max.length > area.min.length + ? [area.max, area.min] + : [area.min, area.max]; + + let prev: number[]; + const filledAreaData = longArea + .map(([x1, y1], i: number) => { + let x, y; + if (shortArea[i]) { + let [x2, y2] = shortArea[i]; + x = x2; + y = y2; + } else { + if (prev) { + x = prev[0]; + y = getValueInLine({ + x1: x, + x2: x1, + y1: prev[1], + y2: y1, + x: x, + axesScaleType, + }); + } else { + x = x1; + let [nextX, nextY] = shortArea[i + 1] || []; + y = getValueInLine({ + x1, + x2: nextX, + y1, + y2: nextY, + x: x1, + axesScaleType, + }); + } + } + prev = [x, y]; + return [x1, y1, x, y]; + }) + .sort((a, b) => a[0] - b[0]); + + return { + ...aggrData, + area: filledAreaData, + line, + } as IProcessedAggrData; + }); + } + + attributesRef.current.xScale = xScale; + attributesRef.current.yScale = yScale; + + return { + min: { x: xMin, y: yMin }, + max: { x: xMax, y: yMax }, + processedData, + processedAggrData, + allXValues: _.uniq(allXValues), + allYValues: _.uniq(allYValues), + }; +} + +export default processLineChartData; + +// get cropped lines for having an ability to draw large scale lines in browser +function calculateLineValues({ + values, + xMin, + xMax, + minEdge, + maxEdge, + axesScaleType, +}: ICalculateLineValues) { + let leftEdgeIndex = _.findLastIndex(values, (v: number[]) => v[0] <= xMin); + let rightEdgeIndex = _.findIndex(values, (v: number[]) => v[0] >= xMax); + if (leftEdgeIndex === -1) { + leftEdgeIndex = 0; + } + if (rightEdgeIndex === -1) { + rightEdgeIndex = values.length - 1; + } + const visibleValues = values.slice(leftEdgeIndex, rightEdgeIndex + 1); + + let prevValue: number[] = []; + + let result = visibleValues + .map(([xValue, yValue]: number[], i: number) => { + let x = xValue; + let y = _.clamp(yValue, minEdge, maxEdge); + let value: number[][] | number[] = [x, y]; + if (y === yValue) { + prevValue = [x, y]; + } else { + let [nextX, nextYValue] = visibleValues[i + 1] || []; + const nextY = _.clamp(nextYValue, minEdge, maxEdge); + if (i === 0) { + if (visibleValues.length > 1) { + let x2 = getValueInLine({ + x1: x, + x2: nextX, + y1: yValue, + y2: nextY, + y: y, + axesScaleType, + }); + value = [ + [x, y], + [x2, y], + ]; + prevValue = [x2, y]; + } else { + prevValue = [x, y]; + value = [x, y]; + } + } else { + x = getValueInLine({ + x1: prevValue[0], + x2: xValue, + y1: prevValue[1], + y2: yValue, + y: y, + axesScaleType, + }); + if (i !== visibleValues.length - 1) { + let x2 = getValueInLine({ + x1: xValue, + x2: nextX, + y1: yValue, + y2: nextY, + y: y, + axesScaleType, + }); + value = [ + [x, y], + [x2, y], + ]; + prevValue = [x2, y]; + } else { + value = [x, y]; + } + } + } + + return (Array.isArray(value[0]) ? value : [value]) as [number, number][]; + }) + .flat() + .sort((a, b) => a[0] - b[0]); + + let minIndex = -1; + let maxIndex = result.length; + + for (let i = 0; i < result.length; i++) { + const [x] = result[i]; + if (x < xMin && i > minIndex) { + minIndex = i; + } + if (x > xMax && i < maxIndex) { + maxIndex = i; + } + } + + if (minIndex >= maxIndex) { + result = []; + } else { + if (minIndex > -1 && minIndex < result.length - 1) { + result[minIndex] = [ + xMin, + getValueInLine({ + x1: result[minIndex][0], + x2: result[minIndex + 1][0], + y1: result[minIndex][1], + y2: result[minIndex + 1][1], + x: xMin, + axesScaleType, + }), + ]; + } + if (maxIndex < result.length && maxIndex > 0) { + result[maxIndex] = [ + xMax, + getValueInLine({ + x1: result[maxIndex - 1][0], + x2: result[maxIndex][0], + y1: result[maxIndex - 1][1], + y2: result[maxIndex][1], + x: xMax, + axesScaleType, + }), + ]; + } + } + + return result.slice(minIndex > -1 ? minIndex : 0, maxIndex + 1); +} + +// get [x or y] value in line depending on [x1,y1] and [x2, y2] and [y or x] +function getValueInLine({ + x1, + x2, + y1, + y2, + x, + y, + axesScaleType, +}: IGetValueInLine): number { + let value = 0; + if (x === undefined && y) { + let dx1; + let dx2; + let dy1; + let dy2; + if (x1 === x2) { + value = x1; + } else { + if (axesScaleType.xAxis === ScaleEnum.Linear) { + dx1 = x1; + dx2 = x2; + } else { + dx1 = Math.log(x1); + dx2 = Math.log(x2); + } + if (axesScaleType.yAxis === ScaleEnum.Linear) { + dy1 = y - y1; + dy2 = y2 - y1; + } else { + dy1 = Math.log(y) - Math.log(y1); + dy2 = Math.log(y2) - Math.log(y1); + } + if (dx1 > dx2) { + value = dx1 - ((dx1 - dx2) * dy1) / dy2; + } else { + value = ((dx2 - dx1) * dy1) / dy2 + dx1; + } + if (axesScaleType.xAxis === ScaleEnum.Log) { + value = Math.exp(value); + } + } + } else if (y === undefined && x) { + let dx1; + let dx2; + let dy1; + let dy2; + if (x1 === x2 || x === x1) { + value = y1; + } else if (x === x2) { + value = y2; + } else { + if (axesScaleType.xAxis === ScaleEnum.Linear) { + dx1 = x - x1; + dx2 = x2 - x1; + } else { + dx1 = Math.log(x) - Math.log(x1); + dx2 = Math.log(x2) - Math.log(x1); + } + if (axesScaleType.yAxis === ScaleEnum.Linear) { + dy1 = y1; + dy2 = y2; + } else { + dy1 = Math.log(y1); + dy2 = Math.log(y2); + } + if (dy1 > dy2) { + value = dy1 - ((dy1 - dy2) * dx1) / dx2; + } else { + value = ((dy2 - dy1) * dx1) / dx2 + dy1; + } + if (axesScaleType.yAxis === ScaleEnum.Log) { + value = Math.exp(value); + } + } + } + return getRoundedValue(value); +} diff --git a/src/src/utils/d3/symbolGenerator.ts b/src/src/utils/d3/symbolGenerator.ts new file mode 100644 index 00000000..100fa423 --- /dev/null +++ b/src/src/utils/d3/symbolGenerator.ts @@ -0,0 +1,10 @@ +import * as d3 from 'd3'; + +import { PointSymbolEnum } from './index'; + +export default function symbolGenerator( + symbol: PointSymbolEnum = PointSymbolEnum.CIRCLE, + size: number = 40, +) { + return d3.symbol().type(d3[symbol]).size(size); +} diff --git a/src/src/utils/d3/tickFormatting.ts b/src/src/utils/d3/tickFormatting.ts new file mode 100644 index 00000000..35fd5fa3 --- /dev/null +++ b/src/src/utils/d3/tickFormatting.ts @@ -0,0 +1,208 @@ +import React from 'react'; +import * as d3 from 'd3'; +import _ from 'lodash-es'; + +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { ScaleEnum } from './index'; + +export function getLogScaleAttributes( + scale: d3.AxisScale, + ticksCount: number = 10, + precision: number = 2, +) { + const domain = scale.domain() as number[]; + const logScale = d3.scaleLog().domain(domain); + const format = logScale.tickFormat(10); + let ticks = logScale.ticks(ticksCount).filter(format); + if (ticks.length > ticksCount) { + ticks = ticks.filter((v, i, arr) => { + if (i === 0 || i === arr.length - 1) { + return true; + } + const interval = Math.floor((arr.length - 2) / (ticksCount - 2)); + return i % interval === 0 && arr.length - interval > i; + }); + } + + const specifier = d3.formatSpecifier('.' + precision + '~g'); + return { ticks, specifier }; +} + +export function customFormatting( + value: d3.AxisDomain, + tickConfig: { + defaultFormatMaxLength: number; + precision: number; + maxLength: number; + omission: string; + }, +) { + let tick = value.toString(); + if ( + typeof value === 'number' && + tick.length > tickConfig.defaultFormatMaxLength + ) { + const specifier = '.' + tickConfig.precision + '~g'; + tick = d3.format(specifier)(value); + } + return _.truncate(tick, { + length: tickConfig.maxLength, + omission: tickConfig.omission, + }); +} + +export interface IFormatAxis { + scale: d3.AxisScale; + tickAdditionalConfig?: {}; + drawTickLines: { x?: boolean; y?: boolean; tickSize: number }; + plotBoxRef: React.MutableRefObject; + scaleType: IAxisScale; +} + +export function formatXAxisByDefault({ + scale, + tickAdditionalConfig = {}, + drawTickLines = { x: false, y: false, tickSize: 0 }, + plotBoxRef, + scaleType, +}: IFormatAxis) { + const tickConfig = { + distance: 90, + minCount: 2, + maxCount: 20, + precision: { log: 4, linear: 3 }, + maxLength: 14, + omission: '..', + defaultFormatMaxLength: 6, + padding: 10, + tickSizeInner: 0, + ...tickAdditionalConfig, + }; + + const xAxis = d3 + .axisBottom(scale) + .tickPadding(tickConfig.padding) + .tickSizeInner(tickConfig.tickSizeInner); + + if (drawTickLines.x) { + const tickSizeOuter = 0; + xAxis.tickSize(drawTickLines.tickSize).tickSizeOuter(tickSizeOuter); + } + + let ticksCount = _.clamp( + Math.floor(plotBoxRef.current.width / tickConfig.distance), + tickConfig.minCount, + tickConfig.maxCount, + ); + + let tickValues: d3.AxisDomain[] = []; + if (scaleType.xAxis === ScaleEnum.Log) { + const { ticks, specifier } = getLogScaleAttributes( + scale, + ticksCount, + tickConfig.precision.log, + ); + tickValues = ticks; + xAxis + .ticks(ticksCount, specifier) + .tickValues(tickValues) + .tickFormat((d) => { + return customFormatting(d, { + ...tickConfig, + precision: tickConfig.precision.log, + }); + }); + } else { + xAxis.ticks(ticksCount).tickFormat((d) => { + return customFormatting(d, { + ...tickConfig, + precision: tickConfig.precision.linear, + }); + }); + const domainData = scale.domain(); + if (domainData.length > ticksCount) { + tickValues = domainData.filter( + (v, i, arr) => i % Math.ceil(arr.length / ticksCount) === 0, + ); + xAxis.tickValues(tickValues); + } + } + + return { + xAxis, + ticksCount, + tickValues, + tickConfig, + }; +} + +export function formatYAxisByDefault({ + scale, + tickAdditionalConfig = {}, + drawTickLines = { x: false, y: false, tickSize: 0 }, + plotBoxRef, + scaleType, +}: IFormatAxis) { + const tickConfig = { + distance: 40, + minCount: 3, + maxCount: 20, + precision: { log: 7, linear: 3 }, + maxLength: 9, + omission: '..', + defaultFormatMaxLength: 6, + padding: 8, + tickSizeInner: 0, + ...tickAdditionalConfig, + }; + + const yAxis = d3 + .axisLeft(scale) + .tickPadding(tickConfig.padding) + .tickSizeInner(tickConfig.tickSizeInner); + + if (drawTickLines.y) { + const tickSizeOuter = 0; + yAxis.tickSize(drawTickLines.tickSize).tickSizeOuter(tickSizeOuter); + } + + const ticksCount = _.clamp( + Math.floor(plotBoxRef.current.height / tickConfig.distance), + tickConfig.minCount, + tickConfig.maxCount, + ); + + if (scaleType.yAxis === ScaleEnum.Log) { + const { ticks: tickValues, specifier } = getLogScaleAttributes( + scale, + ticksCount, + tickConfig.precision.log, + ); + yAxis + .ticks(ticksCount, specifier) + .tickValues(tickValues) + .tickFormat((d) => { + return customFormatting(d, { + ...tickConfig, + precision: tickConfig.precision.log, + }); + }); + } else { + yAxis.ticks(ticksCount).tickFormat((d) => { + return customFormatting(d, { + ...tickConfig, + precision: tickConfig.precision.linear, + }); + }); + const domainData = scale.domain(); + if (domainData.length > ticksCount) { + const tickValues = domainData.filter( + (v, i, arr) => i % Math.ceil(arr.length / ticksCount) === 0, + ); + yAxis.tickValues(tickValues); + } + } + + return { yAxis }; +} diff --git a/src/src/utils/decodeWithBase58Checker.ts b/src/src/utils/decodeWithBase58Checker.ts new file mode 100644 index 00000000..3bdd2185 --- /dev/null +++ b/src/src/utils/decodeWithBase58Checker.ts @@ -0,0 +1,21 @@ +import { setItem } from 'utils/storage'; + +import { AIM64_ENCODING_PREFIX, decode, encode } from './encoder/encoder'; + +export default function decodeWithBase58Checker({ + value, + localStorageKey, +}: { + value: string; + localStorageKey?: string; +}) { + const decodedValue: string = decode(value); + if (!value.startsWith(AIM64_ENCODING_PREFIX)) { + const encodedValue: string = encode(JSON.parse(decodedValue)); + if (localStorageKey) { + setItem(localStorageKey, encodedValue); + } + } + + return decodedValue; +} diff --git a/src/src/utils/document/documentTitle.ts b/src/src/utils/document/documentTitle.ts new file mode 100644 index 00000000..cd4e0fb2 --- /dev/null +++ b/src/src/utils/document/documentTitle.ts @@ -0,0 +1,19 @@ +import _ from 'lodash-es'; + +export function getDocumentTitle(pathname: string): { + title: string; + withPrefix: boolean; +} { + const paths = pathname.slice(1).split('/'); + if (paths[0]) { + return { title: _.capitalize(paths[0]), withPrefix: true }; + } + return { title: 'Aim', withPrefix: false }; +} + +export function setDocumentTitle( + title: string = 'Aim', + withPrefix: boolean = false, +): void { + document.title = title + (withPrefix ? ' | Aim' : ''); +} diff --git a/src/src/utils/encoder/encoder.ts b/src/src/utils/encoder/encoder.ts new file mode 100644 index 00000000..dece84be --- /dev/null +++ b/src/src/utils/encoder/encoder.ts @@ -0,0 +1,65 @@ +import bs58check from 'bs58check'; +import md5 from 'md5'; + +const BS64_REPLACE_CHARACTERS = { + ENCODING: [ + { searchValue: '=', replaceValue: '' }, + { searchValue: '+', replaceValue: '-' }, + { searchValue: '/', replaceValue: '_' }, + ], + DECODING: [ + { searchValue: '_', replaceValue: '/' }, + { searchValue: '-', replaceValue: '+' }, + ], +}; +// replace URL and CSS selectors, vulnerable characters '+', '/', '=', + +const BS64_ENCODING_PADDING = ['', '===', '==', '=']; + +export const AIM64_ENCODING_PREFIX = 'O-'; +// `O` - is a character which cannot exist in the base58-encoded data, +// ability to resolve backward compatibility issue + +export function aim64encode(value: Record) { + const json_encoded = JSON.stringify(value); + let aim64_encoded = btoa(encodeURI(json_encoded)); + for (let { searchValue, replaceValue } of BS64_REPLACE_CHARACTERS.ENCODING) { + aim64_encoded = aim64_encoded.replaceAll(searchValue, replaceValue); + } + return AIM64_ENCODING_PREFIX + aim64_encoded; +} + +export function aim64decode(aim64_encoded: string) { + if (!aim64_encoded.startsWith(AIM64_ENCODING_PREFIX)) { + throw Error('Aim64 encoding magic bytes not found!'); + } + let bs64_encoded = aim64_encoded.slice(2); + for (let { searchValue, replaceValue } of BS64_REPLACE_CHARACTERS.DECODING) { + bs64_encoded = bs64_encoded.replaceAll(searchValue, replaceValue); + } + // add padding `=` characters back to make the encoded string length a multiple of 4 + bs64_encoded += BS64_ENCODING_PADDING[bs64_encoded.length % 4]; + return decodeURI(atob(bs64_encoded)); +} + +export function encode( + value: Record, + oneWayHashing?: boolean, +): string { + if (oneWayHashing) { + return md5(JSON.stringify(value)); + } + return aim64encode(value); +} + +export function decode(value: string): string { + try { + if (value.startsWith(AIM64_ENCODING_PREFIX)) { + return aim64decode(value); + } + // `base58Decoded` version for backward compatibility + return bs58check.decode(value)?.toString(); + } catch (ex) { + return '{}'; + } +} diff --git a/src/src/utils/encoder/format_bytes.ts b/src/src/utils/encoder/format_bytes.ts new file mode 100644 index 00000000..d90769f9 --- /dev/null +++ b/src/src/utils/encoder/format_bytes.ts @@ -0,0 +1,31 @@ +const HEXDIGITS = '0123456789abcdef'; + +// python 'bytes' representation +export function format_bytes(arr: Uint8Array, quote?: string): string { + if (!quote) { + quote = '"'; + } + let tokens = []; + tokens.push('b'); + tokens.push(quote); + for (let c of arr) { + if (c === quote.charCodeAt(0) || c === 92) { + tokens.push('\\'); + tokens.push(String.fromCharCode(c)); + } else if (c === 9) { + tokens.push('\\t'); + } else if (c === 10) { + tokens.push('\\n'); + } else if (c === 13) { + tokens.push('\\r'); + } else if (c < 32 || c > 0x7f) { + tokens.push('\\x'); + tokens.push(HEXDIGITS[(c & 0xf0) >> 4]); + tokens.push(HEXDIGITS[c & 0x0f]); + } else { + tokens.push(String.fromCharCode(c)); + } + } + tokens.push(quote); + return tokens.join(''); +} diff --git a/src/src/utils/encoder/streamEncoding.ts b/src/src/utils/encoder/streamEncoding.ts new file mode 100644 index 00000000..255c19cf --- /dev/null +++ b/src/src/utils/encoder/streamEncoding.ts @@ -0,0 +1,509 @@ +// @ts-nocheck + +import { isEqual } from 'lodash-es'; + +import struct from '@aksel/structjs'; + +import { IRunProgress } from 'services/api/base-explorer/runsApi'; + +const PATH_SENTINEL = 0xfe; +// const SIZE_T = 'q'; + +const NONE = 0; +const BOOL = 1; +const INT = 2; // Stored as 64-bit Long Long +const FLOAT = 3; // Stored as 64-bit Double +const STRING = 4; +const BYTES = 5; +const ARRAY = 6; +const OBJECT = 7; + +class AimObjectFlag { + private flagType: string; + constructor(flagType: string) { + this.flagType = flagType; + } + + toString() { + return `<${this.flagType}>`; + } +} +const ArrayFlag = new AimObjectFlag('ARRAY_FLAG'); +const ObjectFlag = new AimObjectFlag('OBJECT_FLAG'); + +let utf8decoder = new TextDecoder('utf-8'); + +function decodeNone(buffer: ArrayBuffer) { + return null; +} + +function decodeBool(buffer: ArrayBuffer) { + return struct(', + level: number = 0, +): AsyncGenerator<[AimObjectPath, AimObject | undefined]> { + const stack: AimObject[] = []; + const path: AimObjectPath = []; + + let item: IteratorResult< + [AimObjectPath, AimObjectPrimitive | AimObjectFlag], + void + >; + + item = await pathsVals.next(); + if (item.done) { + if (level > 0) { + return; + } + + yield [[], undefined]; + return; + } + let first_records = item.value; + if (!first_records.length) { + if (level > 0) { + return; + } + yield [[], undefined]; + return; + } + let [keys, val] = first_records.shift(); + if (keys.length) { + return; + } + + let node = valToNode(val); + stack.push(node); + for await (let records of pathsVals) { + if (first_records.length) { + records = [...first_records, ...records]; + first_records = []; + } + for (let [keys, val] of records) { + while (!isEqual(path, keys.slice(0, path.length))) { + let lastState = stack.pop(); + if (stack.length === level) { + yield [path.slice(), lastState]; + } + path.pop(); + } + + node = valToNode(val); + + if (keys.length !== path.length + 1) { + throw new Error('Assertion Error'); + } + let keyToAdd: AimObjectKey = keys[keys.length - 1]; + path.push(keyToAdd); + + if (stack.length === 0) { + throw new Error('Assertion Error'); + } + + let lastState = stack[stack.length - 1] as AimObjectNode; + + if (Array.isArray(lastState)) { + while (lastState.length !== (keyToAdd as number)) { + lastState.push(null); + } + lastState.push(node); + } else { + lastState[keyToAdd] = node; + } + + stack.push(node); + } + } + if (level < stack.length) { + yield [path.slice(0, level), stack[level]]; + } +} + +export async function* decodeBufferPairs( + stream: ReadableStream, +): AsyncGenerator<[Uint8Array, Uint8Array][]> { + let buffer = new Uint8Array(new ArrayBuffer()); + let reader = stream.getReader(); + + let p = reader.read(); + + function merge(a, b) { + const mergedArray = new Uint8Array(a.length + b.length); + mergedArray.set(a); + mergedArray.set(b, a.length); + return mergedArray; + } + + function needs_async_fetch(requested_size) { + return requested_size > buffer.byteLength; + } + + async function do_async_fetch(requested_size) { + // get value and ask to fetch next chunk in background + let item = await p; + if (item.done) { + return false; + } + p = reader.read(); + let chunk = item.value; + buffer = merge(buffer, chunk); + return true; + } + + function get_next(requested_size) { + let response = buffer.subarray(0, requested_size); + buffer = buffer.subarray(requested_size); + return response; + } + + let item; + let records = []; + let done = false; + + asyncLoop: while (true) { + let record = [null, null]; + for (let idx of [0, 1]) { + while (needs_async_fetch(4) && !done) { + let promise = do_async_fetch(4); + yield records; + records = []; + done = !(await promise); + } + if (done) { + break asyncLoop; + } + item = get_next(4); + + let buffer_len = + (item[0] << 0) + (item[1] << 8) + (item[2] << 16) + (item[3] << 24); + + while (needs_async_fetch(buffer_len) && !done) { + let promise = do_async_fetch(buffer_len); + yield records; + records = []; + done = !(await promise); + } + if (done) { + throw new Error('Corrupted stream'); + } + item = get_next(buffer_len); + record[idx] = item; + } + records.push(record); + } + yield records; +} + +function areEqual(a, b) { + if (Number.isInteger(a)) { + if (Number.isInteger(b)) { + return a === b; + } else { + return false; + } + } else { + if (Number.isInteger(a)) { + return false; + } + } + if (a.length !== b.length) { + return false; + } + for (let i = 0; i < a.length; ++i) { + if (a[i] !== b[i]) { + return false; + } + } + return true; +} + +function decodePiece(piece) { + if (Number.isInteger(piece)) { + return piece; + } + return decodeString(piece); +} + +export async function* decodePathsVals( + pathsVals: AsyncGenerator<[Uint8Array, Uint8Array][]>, +): AsyncGenerator<[AimObjectPath, AimObjectPrimitive | AimObjectFlag][]> { + let pieces_state = null; + let path_state = null; + for await (let records of pathsVals) { + let to_yield = []; + for (let [encodedPath, encodedVal] of records) { + let pieces = splitPath(encodedPath); + let val = decodeValue(encodedVal); + if (pieces_state === null) { + if (pieces.length) { + to_yield.push([[], ObjectFlag]); + } + pieces_state = []; + path_state = []; + } + let prefix_len; + for ( + prefix_len = 0; + prefix_len < pieces.length && prefix_len < pieces_state.length; + ++prefix_len + ) { + if (!areEqual(pieces[prefix_len], pieces_state[prefix_len])) { + break; + } + } + while (pieces_state.length > prefix_len) { + path_state.pop(); + pieces_state.pop(); + } + while (pieces_state.length !== pieces.length) { + let piece = pieces[pieces_state.length]; + pieces_state.push(piece); + let key = decodePiece(piece); + path_state.push(key); + if (pieces_state.length !== pieces.length) { + to_yield.push([[...path_state], ObjectFlag]); + } + } + to_yield.push([[...path_state], val]); + } + if (to_yield.length) { + yield to_yield; + } + } + yield []; +} + +/** + * async function parseStream + * This function uses 3 core functions to decode storage data + * decodeBufferPairs + * decodePathsVals + * iterFoldTree + * Receives generic T type to indicate the returned data type + * @param stream + * @param options - the callback functions to send streaming progress + */ +export async function parseStream( + stream: ReadableStream, + options?: { + progressCallback?: (progress: IRunProgress) => void | null; + callback?: (item: any) => void; + dataProcessor?: (keys: any, value: any) => any; + }, +): Promise { + let buffer_pairs = decodeBufferPairs(stream); + let decodedPairs = decodePathsVals(buffer_pairs); + let objects = iterFoldTree(decodedPairs, 1); + if (options?.dataProcessor) { + return options.dataProcessor(objects); + } else { + const data: T = []; + + try { + for await (let [keys, val] of objects) { + const object: T = { ...(val as any), hash: keys[0] }; + if (object.hash?.startsWith?.('progress')) { + // maybe typeof progressCallback === 'function' + if (options?.progressCallback) { + options.progressCallback(object as IRunProgress); + const { 0: checked, 1: trackedRuns } = object; + + options.progressCallback({ + matched: data.length, + checked, + trackedRuns, + }); + } + } else { + if (options?.callback) { + options.callback({ value: val, hash: keys[0] }); + } + data.push(object); + } + } + } catch (e) { + // if (__DEV__) { + // eslint-disable-next-line no-console + console.error(e); + // } + throw e; + } + + return data; + } +} diff --git a/src/src/utils/filterArrayByIndexes.ts b/src/src/utils/filterArrayByIndexes.ts new file mode 100644 index 00000000..fcc67e49 --- /dev/null +++ b/src/src/utils/filterArrayByIndexes.ts @@ -0,0 +1,8 @@ +export function filterArrayByIndexes( + missingIndexes: number[], + array: number[] | Float64Array, +): Float64Array { + return new Float64Array( + array.filter((item, index) => missingIndexes.indexOf(index) === -1), + ); +} diff --git a/src/src/utils/formatAnsiToHtml.ts b/src/src/utils/formatAnsiToHtml.ts new file mode 100644 index 00000000..356bc66b --- /dev/null +++ b/src/src/utils/formatAnsiToHtml.ts @@ -0,0 +1,494 @@ +// Adapted from ansi-to-html by Rob Burns +// License: https://github.com/rburns/ansi-to-html/blob/master/LICENSE-MIT.txt +import _ from 'lodash-es'; + +interface Options { + /** The default foreground color used when reset color codes are encountered. */ + fg?: string; + /** The default background color used when reset color codes are encountered. */ + bg?: string; + /** Convert newline characters to `
`. */ + newline?: boolean; + /** Can override specific colors or the entire ANSI palette. */ + colors?: string[] | { [code: number]: string }; +} + +type Stack = string[]; + +const defaults: Options = { + fg: '#FFF', + bg: '#000', + newline: false, + colors: getDefaultColors(), +}; + +function getDefaultColors(): Record { + const colors: Record = { + 0: '#000', + 1: '#A00', + 2: '#0A0', + 3: '#A50', + 4: '#00A', + 5: '#A0A', + 6: '#0AA', + 7: '#AAA', + 8: '#555', + 9: '#F55', + 10: '#5F5', + 11: '#FF5', + 12: '#55F', + 13: '#F5F', + 14: '#5FF', + 15: '#FFF', + }; + + _.range(0, 6).forEach((red: number) => { + _.range(0, 6).forEach((green: number) => { + _.range(0, 6).forEach((blue: number) => + setStyleColor(red, green, blue, colors), + ); + }); + }); + + _.range(0, 24).forEach((gray: number) => { + const c = gray + 232; + const l = toHexString(gray * 10 + 8); + + colors[c] = '#' + l + l + l; + }); + + return colors; +} + +/** + * @param {number} red + * @param {number} green + * @param {number} blue + * @param {Record} colors + */ +function setStyleColor( + red: number, + green: number, + blue: number, + colors: Record, +): void { + const c = 16 + red * 36 + green * 6 + blue; + const r = red > 0 ? red * 40 + 55 : 0; + const g = green > 0 ? green * 40 + 55 : 0; + const b = blue > 0 ? blue * 40 + 55 : 0; + + colors[c] = toColorHexString([r, g, b]); +} + +/** + * Converts from a number like 15 to a hex string like 'F' + * @param {number} num + * @returns {string} + */ +function toHexString(num: number): string { + let str = num.toString(16); + + while (str.length < 2) { + str = '0' + str; + } + + return str; +} + +/** + * Converts from an array of numbers like [15, 15, 15] to a hex string like 'FFF' + * @param {[red, green, blue]} ref + * @returns {string} + */ +function toColorHexString(ref: number[]): string { + const results = []; + + for (const r of ref) { + results.push(toHexString(r)); + } + + return '#' + results.join(''); +} + +/** + * @param {Stack} stack + * @param {string} token + * @param {string} data + * @param {Options} options + */ +function generateOutput( + stack: Stack, + token: string, + data: string, + options: Options, +) { + let result; + if (token === 'text') { + result = data; + } else if (token === 'display') { + result = handleDisplay(stack, +data, options); + } else if (token === 'xterm256Foreground') { + result = pushForegroundColor(stack, options?.colors?.[+data] as string); + } else if (token === 'xterm256Background') { + result = pushBackgroundColor(stack, options?.colors?.[+data] as string); + } else if (token === 'rgb') { + result = handleRgb(stack, data); + } + + return result; +} + +/** + * @param {Stack} stack + * @param {string} data + * @returns {string} + */ +function handleRgb(stack: Stack, data: string): string { + data = data.substring(2).slice(0, -1); + const operation = +data.substr(0, 2); + + const color = data.substring(5).split(';'); + const rgb = color + .map(function (value) { + return ('0' + Number(value).toString(16)).substring(-2); + }) + .join(''); + + return pushStyle( + stack, + (operation === 38 ? 'color:#' : 'background-color:#') + rgb, + ); +} + +/** + * @param {Stack} stack + * @param {string} code + * @param {Options} options + * @returns {string | number | void } + */ +function handleDisplay( + stack: Stack, + code: number, + options: Options, +): string | number | void { + code = parseInt(`${code}`, 10); + + const codeMap: Record void> = { + '-1': () => '
', + 0: () => stack.length && resetStyles(stack), + 1: () => pushTag(stack, 'b'), + 3: () => pushTag(stack, 'i'), + 4: () => pushTag(stack, 'u'), + 8: () => pushStyle(stack, 'display:none'), + 9: () => pushTag(stack, 'strike'), + 22: () => + pushStyle( + stack, + 'font-weight:normal;text-decoration:none;font-style:normal', + ), + 23: () => closeTag(stack, 'i'), + 24: () => closeTag(stack, 'u'), + 39: () => pushForegroundColor(stack, options.fg as string), + 49: () => pushBackgroundColor(stack, options.bg as string), + 53: () => pushStyle(stack, 'text-decoration:overline'), + }; + + if (codeMap[code]) { + return codeMap[code](); + } else if (4 < code && code < 7) { + return pushTag(stack, 'blink'); + } else if (29 < code && code < 38) { + return pushForegroundColor(stack, options?.colors?.[code - 30] as string); + } else if (39 < code && code < 48) { + return pushBackgroundColor(stack, options?.colors?.[code - 40] as string); + } else if (89 < code && code < 98) { + return pushForegroundColor( + stack, + options?.colors?.[8 + (code - 90)] as string, + ); + } else if (99 < code && code < 108) { + return pushBackgroundColor( + stack, + options?.colors?.[8 + (code - 100)] as string, + ); + } +} + +/** + * Clear all the styles + * @param {Stack} stack + * @returns {string} + */ +function resetStyles(stack: Stack): string { + const stackClone = stack.slice(0); + + stack.length = 0; + + return stackClone + .reverse() + .map(function (tag) { + return ''; + }) + .join(''); +} + +/** + * @param {Stack} stack + * @param {string} tag + * @param {string} [style=''] + * @returns {string} + */ +function pushTag(stack: Stack, tag: string, style?: string): string { + if (!style) { + style = ''; + } + + stack.push(tag); + + return `<${tag}${style ? ` style="${style}"` : ''}>`; +} + +/** + * @param {Stack} stack + * @param {string} style + * @returns {string} + */ +function pushStyle(stack: Stack, style: string): string { + return pushTag(stack, 'span', style); +} + +function pushForegroundColor(stack: Stack, color: string) { + return pushTag(stack, 'span', 'color:' + color); +} + +function pushBackgroundColor(stack: Stack, color: string) { + return pushTag(stack, 'span', 'background-color:' + color); +} + +/** + * @param {Stack} stack + * @param {string} style + * @returns {string | undefined} + */ +function closeTag(stack: Stack, style: string): string | undefined { + let last; + + if (stack.slice(-1)[0] === style) { + last = stack.pop(); + } + + if (last) { + return ''; + } +} + +/** + * @param {string} text + * @param {Options} options + * @param {function} callback + * @returns {Array} + */ +function tokenize( + text: string, + options: Options, + callback: (token: string, data: string | number) => void, +) { + let ansiMatch = false; + const ansiHandler = 3; + + function remove() { + return ''; + } + + function removeXterm256Foreground(z: string, g1: string) { + callback('xterm256Foreground', g1); + return ''; + } + + function removeXterm256Background(m: string, g1: string) { + callback('xterm256Background', g1); + return ''; + } + + function newline(m: string) { + if (options.newline) { + callback('display', -1); + } else { + callback('text', m); + } + + return ''; + } + + function ansiMess(m: string, g1: string) { + ansiMatch = true; + if (g1.trim().length === 0) { + g1 = '0'; + } + + const g2 = g1.trimRight().split(';'); + + for (const g of g2) { + callback('display', g); + } + + return ''; + } + + function realText(m: string) { + callback('text', m); + + return ''; + } + + function rgb(m: string) { + callback('rgb', m); + + return ''; + } + + /* eslint no-control-regex:0 */ + const tokens = [ + { + pattern: /^\x08+/, + sub: remove, + }, + { + pattern: /^\x1b\[[012]?K/, + sub: remove, + }, + { + pattern: /^\x1b\[\(B/, + sub: remove, + }, + { + pattern: /^\x1b\[[34]8;2;\d+;\d+;\d+m/, + sub: rgb, + }, + { + pattern: /^\x1b\[38;5;(\d+)m/, + sub: removeXterm256Foreground, + }, + { + pattern: /^\x1b\[48;5;(\d+)m/, + sub: removeXterm256Background, + }, + { + pattern: /^\n/, + sub: newline, + }, + { + pattern: /^\r+\n/, + sub: newline, + }, + { + pattern: /^\r/, + sub: newline, + }, + { + pattern: /^\x1b\[((?:\d{1,3};?)+|)m/, + sub: ansiMess, + }, + { + // CSI n J + // ED - Erase in Display Clears part of the screen. + // If n is 0 (or missing), clear from cursor to end of screen. + // If n is 1, clear from cursor to beginning of the screen. + // If n is 2, clear entire screen (and moves cursor to upper left on DOS ANSI.SYS). + // If n is 3, clear entire screen and delete all lines saved in the scrollback buffer + // (this feature was added for xterm and is supported by other terminal applications). + pattern: /^\x1b\[\d?J/, + sub: remove, + }, + { + // CSI n ; m f + // HVP - Horizontal Vertical Position Same as CUP + pattern: /^\x1b\[\d{0,3};\d{0,3}f/, + sub: remove, + }, + { + // catch-all for CSI sequences? + pattern: /^\x1b\[?[\d;]{0,3}/, + sub: remove, + }, + { + /** + * extracts real text - not containing: + * - `\x1b' - ESC - escape (Ascii 27) + * - '\x08' - BS - backspace (Ascii 8) + * - `\n` - Newline - linefeed (LF) (ascii 10) + * - `\r` - Windows Carriage Return (CR) + */ + pattern: /^(([^\x1b\x08\r\n])+)/, + sub: realText, + }, + ]; + + function process( + handler: { + pattern: string | RegExp; + sub: (m: string, g1: string) => string; + }, + i: number, + ) { + if (i > ansiHandler && ansiMatch) { + return; + } + + ansiMatch = false; + + text = text.replace(handler.pattern, handler.sub); + } + + const results1 = []; + let { length } = text; + + outer: while (length > 0) { + for (let i = 0, o = 0, len = tokens.length; o < len; i = ++o) { + const handler = tokens[i]; + process(handler, i); + + if (text.length !== length) { + // We matched a token and removed it from the text. We need to + // start matching *all* tokens against the new text. + length = text.length; + continue outer; + } + } + + if (text.length === length) { + break; + } + results1.push(0); + + length = text.length; + } + + return results1; +} + +const formatAnsiToHtml = function ( + input: string | string[], + options?: Options, +) { + input = typeof input === 'string' ? [input] : input; + + let optionsA: Options = Object.assign({}, defaults, options); + let stack: Stack = []; + const buf = []; + + tokenize(input.join(''), optionsA, (token: string, data: string | number) => { + const output = generateOutput(stack, token, `${data}`, optionsA); + + if (output) { + buf.push(output); + } + }); + + if (stack.length) { + buf.push(resetStyles(stack)); + } + return buf.join(''); +}; + +export default formatAnsiToHtml; diff --git a/src/src/utils/formatByAlignment.ts b/src/src/utils/formatByAlignment.ts new file mode 100644 index 00000000..8b93a306 --- /dev/null +++ b/src/src/utils/formatByAlignment.ts @@ -0,0 +1,59 @@ +import moment from 'moment'; + +import { DATE_CHART_TICK } from 'config/dates/dates'; + +import { IAlignmentConfig } from 'types/services/models/metrics/metricsAppModel'; + +import shortEnglishHumanizer from 'utils/shortEnglishHumanizer'; + +import { AlignmentOptionsEnum } from './d3'; +import { formatValue } from './formatValue'; + +function formatValueByAlignment({ + xAxisTickValue, + type, + humanizerConfig = {}, +}: { + xAxisTickValue: number | null; + type?: AlignmentOptionsEnum; + humanizerConfig?: {}; +}) { + let formatted: string | number | null = xAxisTickValue; + + if (xAxisTickValue || xAxisTickValue === 0) { + switch (type) { + case AlignmentOptionsEnum.EPOCH: + formatted = Math.floor(xAxisTickValue); + break; + case AlignmentOptionsEnum.RELATIVE_TIME: + formatted = shortEnglishHumanizer(Math.round(xAxisTickValue), { + ...humanizerConfig, + maxDecimalPoints: 2, + }); + break; + case AlignmentOptionsEnum.ABSOLUTE_TIME: + formatted = moment(xAxisTickValue).format(DATE_CHART_TICK); + break; + default: + formatted = xAxisTickValue; + } + } + return formatValue(formatted); +} + +function getKeyByAlignment(alignmentConfig?: IAlignmentConfig): string { + switch (alignmentConfig?.type) { + case AlignmentOptionsEnum.STEP: + case AlignmentOptionsEnum.EPOCH: + return alignmentConfig?.type; + case AlignmentOptionsEnum.ABSOLUTE_TIME: + case AlignmentOptionsEnum.RELATIVE_TIME: + return alignmentConfig?.type.replace('_', ' '); + case AlignmentOptionsEnum.CUSTOM_METRIC: + return alignmentConfig?.metric || ''; + default: + return AlignmentOptionsEnum.STEP; + } +} + +export { formatValueByAlignment, getKeyByAlignment }; diff --git a/src/src/utils/formatSystemMetricName.ts b/src/src/utils/formatSystemMetricName.ts new file mode 100644 index 00000000..0e370123 --- /dev/null +++ b/src/src/utils/formatSystemMetricName.ts @@ -0,0 +1,7 @@ +import { systemMetricsDict } from 'config/systemMetrics/systemMetrics'; + +import { systemMetricsDictType } from 'types/utils/formatSystemMetricName'; + +export function formatSystemMetricName(metric: string): string { + return systemMetricsDict[metric as keyof systemMetricsDictType] || metric; +} diff --git a/src/src/utils/formatToPositiveNumber.ts b/src/src/utils/formatToPositiveNumber.ts new file mode 100644 index 00000000..4d519517 --- /dev/null +++ b/src/src/utils/formatToPositiveNumber.ts @@ -0,0 +1,9 @@ +export function formatToPositiveNumber(value: number): string { + const formattedToString = `${value}`; + if (value <= 0) { + return '0'; + } else if (+formattedToString[0] === 0 && formattedToString.length > 1) { + return formattedToString.slice(1, formattedToString.length - 1); + } + return formattedToString; +} diff --git a/src/src/utils/formatValue.ts b/src/src/utils/formatValue.ts new file mode 100644 index 00000000..f328dafa --- /dev/null +++ b/src/src/utils/formatValue.ts @@ -0,0 +1,89 @@ +import { format_bytes } from './encoder/format_bytes'; + +const NUMBER_PRECISION = 8; +const UNDEFINED_VALUE = '--'; + +const FORMATTERS: Record = { + undefined: format_undefined, + number: format_number, + string: format_str, + boolean: format_bool, + object: format_object, +}; + +function format_undefined( + value: undefined, + undefinedValue: string = UNDEFINED_VALUE, +): string { + return undefinedValue; +} + +function format_number(value: number): string { + if (isNaN(value)) { + return 'NaN'; + } + if (!isFinite(value)) { + return value > 0 ? 'Inf' : '-Inf'; + } + + return JSON.stringify(parseFloat(value.toFixed(NUMBER_PRECISION))); +} + +function format_str(value: string): string { + return JSON.stringify(value); +} + +function format_bool(value: boolean): string { + return value ? 'True' : 'False'; +} + +function format_list( + value: unknown[], + undefinedValue: string = UNDEFINED_VALUE, +): string { + const pieces = []; + for (let i = 0; i < value.length; i++) { + const piece = formatValue(value[i], undefinedValue); + pieces.push(piece); + } + return '[' + pieces.join(', ') + ']'; +} + +function format_dict( + value: Record, + undefinedValue: string = UNDEFINED_VALUE, +): string { + const pieces = []; + const keys = Object.keys(value); + for (let i = 0; i < keys.length; i++) { + const piece = `${format_str(keys[i])}: ${formatValue( + value[keys[i]], + undefinedValue, + )}`; + pieces.push(piece); + } + return '{' + pieces.join(', ') + '}'; +} + +function format_object( + value: Record, + undefinedValue: string = UNDEFINED_VALUE, +): string { + if (value === null) { + return 'None'; + } else if (value instanceof ArrayBuffer) { + return format_bytes(new Uint8Array(value), "'"); + } else if (Array.isArray(value)) { + return format_list(value, undefinedValue); + } else { + return format_dict(value, undefinedValue); + } +} + +export function formatValue( + value: unknown, + undefinedValue: string = UNDEFINED_VALUE, +): string { + let formatter = FORMATTERS[typeof value]; + return formatter(value, undefinedValue); +} diff --git a/src/src/utils/getAdvancedSuggestions.ts b/src/src/utils/getAdvancedSuggestions.ts new file mode 100644 index 00000000..8295b584 --- /dev/null +++ b/src/src/utils/getAdvancedSuggestions.ts @@ -0,0 +1,17 @@ +import * as dot from 'dot-object'; + +function getAdvancedSuggestion(data: Record): Record { + let obj = {}; + let contextKeys: Record = {}; + Object.keys(data).forEach((key: string) => { + data[key]?.forEach((element: any) => { + obj = { ...obj, ...dot.dot(element) }; + }); + }); + Object.keys(obj).forEach((key) => { + contextKeys[key] = ''; + }); + return dot.object(contextKeys); +} + +export default getAdvancedSuggestion; diff --git a/src/src/utils/getBiggestImageFromList.ts b/src/src/utils/getBiggestImageFromList.ts new file mode 100644 index 00000000..488b3796 --- /dev/null +++ b/src/src/utils/getBiggestImageFromList.ts @@ -0,0 +1,11 @@ +export default function getBiggestImageFromList(list: Array<{}>) { + let maxHeight = 0; + let maxWidth = 0; + list.forEach((item: any) => { + if (maxHeight < item.height) { + maxHeight = item.height; + maxWidth = item.width; + } + }); + return { maxHeight, maxWidth }; +} diff --git a/src/src/utils/getCaretPosition.ts b/src/src/utils/getCaretPosition.ts new file mode 100644 index 00000000..a3760330 --- /dev/null +++ b/src/src/utils/getCaretPosition.ts @@ -0,0 +1,124 @@ +let properties = [ + 'direction', // RTL support + 'boxSizing', + 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does + 'height', + 'overflowX', + 'overflowY', // copy the scrollbar for IE + + 'borderTopWidth', + 'borderRightWidth', + 'borderBottomWidth', + 'borderLeftWidth', + 'borderStyle', + + 'paddingTop', + 'paddingRight', + 'paddingBottom', + 'paddingLeft', + + // https://developer.mozilla.org/en-US/docs/Web/CSS/font + 'fontStyle', + 'fontVariant', + 'fontWeight', + 'fontStretch', + 'fontSize', + 'fontSizeAdjust', + 'lineHeight', + 'fontFamily', + + 'textAlign', + 'textTransform', + 'textIndent', + 'textDecoration', // might not make a difference, but better be safe + + 'letterSpacing', + 'wordSpacing', + + 'tabSize', + 'MozTabSize', +]; + +let isFirefox = (window as any).mozInnerScreenX != null; + +function getCaretCoordinates(element: any, position: any) { + // The mirror div will replicate the textarea's style + let div: any = document.createElement('div'); + div.id = 'input-textarea-caret-position-mirror-div'; + div.style.visibility = 'hidden'; + div.style.height = '0px'; + document.body.appendChild(div); + + let style = div.style; + let computed = window.getComputedStyle + ? window.getComputedStyle(element) + : element.currentStyle; // currentStyle for IE < 9 + let isInput = element.nodeName === 'INPUT'; + + // Default textarea styles + style.whiteSpace = 'pre-wrap'; + if (!isInput) style.wordWrap = 'break-word'; // only for textarea-s + + // Position off-screen + style.position = 'absolute'; // required to return coordinates properly + // if (!debug) style.visibility = 'hidden'; // not 'display: none' because we want rendering + + // Transfer the element's properties to the div + properties.forEach(function (prop) { + if (isInput && prop === 'lineHeight') { + // Special case for s because text is rendered centered and line height may be != height + if (computed.boxSizing === 'border-box') { + let height = parseInt(computed.height); + let outerHeight = + parseInt(computed.paddingTop) + + parseInt(computed.paddingBottom) + + parseInt(computed.borderTopWidth) + + parseInt(computed.borderBottomWidth); + let targetHeight = outerHeight + parseInt(computed.lineHeight); + if (height > targetHeight) { + style.lineHeight = height - outerHeight + 'px'; + } else if (height === targetHeight) { + style.lineHeight = computed.lineHeight; + } else { + style.lineHeight = 0; + } + } else { + style.lineHeight = computed.height; + } + } else { + style[prop] = computed[prop]; + } + }); + + if (isFirefox) { + // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275 + if (element.scrollHeight > parseInt(computed.height)) + style.overflowY = 'scroll'; + } else { + style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll' + } + + div.textContent = element.value.substring(0, position); + // The second special handling for input type="text" vs textarea: + // spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037 + if (isInput) div.textContent = div.textContent.replace(/\s/g, '\u00a0'); + + let span = document.createElement('span'); + // Wrapping must be replicated *exactly*, including when a long word gets + // onto the next line, with whitespace at the end of the line before (#7). + // The *only* reliable way to do that is to copy the *entire* rest of the + // textarea's content into the created at the caret position. + // For inputs, just '.' would be enough, but no need to bother. + span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all + div.appendChild(span); + + let coordinates = { + top: span.offsetTop + parseInt(computed['borderTopWidth']), + left: span.offsetLeft + parseInt(computed['borderLeftWidth']), + height: parseInt(computed['lineHeight']), + }; + document.body.removeChild(div); + return coordinates; +} + +export default getCaretCoordinates; diff --git a/src/src/utils/getClosestValue.ts b/src/src/utils/getClosestValue.ts new file mode 100644 index 00000000..90315aba --- /dev/null +++ b/src/src/utils/getClosestValue.ts @@ -0,0 +1,20 @@ +function getClosestValue( + array: number[], + num: number, +): { value: number; index: number } { + let minDiff = Infinity; + let index = 0; + for (let i = 0; i < array.length; i++) { + let diff = Math.abs(num - array[i]); + if (diff < minDiff) { + minDiff = diff; + index = i; + } + } + return { + value: array[index], + index, + }; +} + +export default getClosestValue; diff --git a/src/src/utils/getColumnOptions.ts b/src/src/utils/getColumnOptions.ts new file mode 100644 index 00000000..34d06c51 --- /dev/null +++ b/src/src/utils/getColumnOptions.ts @@ -0,0 +1,42 @@ +import { AppNameEnum } from 'services/models/explorer'; + +import { IOnGroupingSelectChangeParams } from 'types/services/models/metrics/metricsAppModel'; + +const icons: { [key: string]: string } = { + color: 'coloring', + stroke: 'line-style', + chart: 'chart-group', + group: 'image-group', +}; + +const groupList: any = { + images: ['group'], + metrics: ['color', 'stroke', 'chart'], + params: ['color', 'stroke', 'chart'], + scatters: ['color', 'chart'], +}; +function getColumnOptions( + grouping: { [key: string]: string[] }, + onGroupingToggle: (params: IOnGroupingSelectChangeParams) => void, + appName: AppNameEnum, + field: string, +) { + return groupList[appName].map((groupName: string) => ({ + value: `${ + grouping?.[groupName]?.includes(field) ? 'un' : '' + }group by ${groupName}`, + onClick: () => { + if (onGroupingToggle) { + onGroupingToggle({ + groupName, + list: grouping?.[groupName]?.includes(field) + ? grouping?.[groupName].filter((item) => item !== field) + : grouping?.[groupName].concat([field]), + } as IOnGroupingSelectChangeParams); + } + }, + icon: icons[groupName], + })); +} + +export default getColumnOptions; diff --git a/src/src/utils/getMinAndMaxBetweenArrays.ts b/src/src/utils/getMinAndMaxBetweenArrays.ts new file mode 100644 index 00000000..b87a1b50 --- /dev/null +++ b/src/src/utils/getMinAndMaxBetweenArrays.ts @@ -0,0 +1,19 @@ +function getMinAndMaxBetweenArrays(compArr: number[], arr?: number[]) { + if (!arr && !compArr) { + return []; + } + + let resultArr = []; + if (!compArr) { + return arr; + } + if (arr) { + resultArr[0] = arr[0] < compArr[0] ? compArr[0] : arr[0]; + resultArr[1] = arr[1] > compArr[1] ? compArr[1] : arr[1]; + } else { + resultArr = compArr; + } + return resultArr; +} + +export default getMinAndMaxBetweenArrays; diff --git a/src/src/utils/getObjectPaths.ts b/src/src/utils/getObjectPaths.ts new file mode 100644 index 00000000..9cc5b7b9 --- /dev/null +++ b/src/src/utils/getObjectPaths.ts @@ -0,0 +1,72 @@ +import _ from 'lodash-es'; + +import { getValue } from 'utils/helper'; + +import { formatValue } from './formatValue'; +export const jsValidVariableRegex = new RegExp('^[a-zA-Z_][a-zA-Z0-9d_]*$'); + +function getObjectPaths( + obj: { [key: string]: unknown }, + rootObject: { [key: string]: unknown }, + prefix: string = '', + includeRoot: boolean = false, + withoutLeaves = false, +): string[] { + if (obj === null) { + return []; + } + let rootKeys = Object.keys(obj).map((key) => { + let prefixedKey = ''; + if (prefix) { + prefixedKey = !jsValidVariableRegex.test(key) + ? `${prefix}[${formatValue(key)}]` + : `${prefix}.${key}`; + } else { + prefixedKey = !jsValidVariableRegex.test(key) + ? `[${formatValue(key)}]` + : key; + } + + return { prefixedKey, key }; + }); + let paths: string[] = includeRoot + ? rootKeys.reduce((acc: string[], { prefixedKey, key }) => { + const val: any = getValue(rootObject, prefixedKey); + if (typeof val !== 'object' || _.isNil(val) || _.isArray(val)) { + if (withoutLeaves) { + const indexOfPrefixedKey = prefixedKey.indexOf(`.${key}`); + acc.push( + prefixedKey.slice( + 0, + indexOfPrefixedKey === -1 + ? prefixedKey.length + : indexOfPrefixedKey, + ), + ); + } else { + acc.push(prefixedKey); + } + } + return acc; + }, []) + : Object.keys(obj) + .filter( + (key) => + !_.isObject(obj[key]) || _.isNil(obj[key]) || _.isArray(obj[key]), + ) + .map((key) => { + return key; + }); + rootKeys.forEach(({ prefixedKey }) => { + const val: any = getValue(rootObject, prefixedKey); + if (typeof val === 'object' && !_.isNil(val) && !Array.isArray(val)) { + paths = paths.concat( + getObjectPaths(val, rootObject, prefixedKey, true, withoutLeaves), + ); + } + }); + + return paths; +} + +export default getObjectPaths; diff --git a/src/src/utils/getPositionBasedOnOverflow.ts b/src/src/utils/getPositionBasedOnOverflow.ts new file mode 100644 index 00000000..1043d0b7 --- /dev/null +++ b/src/src/utils/getPositionBasedOnOverflow.ts @@ -0,0 +1,79 @@ +import { TooltipAppearanceEnum } from '../modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +function getPositionBasedOnOverflow( + posRect: { top: number; bottom: number; left: number; right: number }, + popoverRect: DOMRect, + containerRect: DOMRect, + isPopoverPinned: boolean, + tooltipAppearance: TooltipAppearanceEnum, +): { top: number; left: number } { + if (!containerRect || !popoverRect) { + return { + top: posRect.top, + left: posRect.left, + }; + } + let left; + let top; + + const gap = 10; + + if (isPopoverPinned) { + const anchorWidth = posRect.right - posRect.left; + const anchorCenter = posRect.right - anchorWidth / 2; + if (anchorCenter - popoverRect.width / 2 - gap < containerRect.left) { + // left bound case + left = posRect.right - (posRect.right - containerRect.left) + gap; + } else if (anchorCenter + popoverRect.width / 2 > containerRect.right) { + left = + posRect.left - popoverRect.width + (containerRect.right - posRect.left); + } else { + left = anchorCenter - popoverRect.width / 2; + } + + if (tooltipAppearance === TooltipAppearanceEnum.Top) { + top = containerRect.top - (popoverRect.height - 30); + } else { + const pageBottom = document.body.getBoundingClientRect().bottom ?? 0; + const topPosition = containerRect.bottom - 30; + if (pageBottom < containerRect.bottom + popoverRect.height - 40) { + top = pageBottom - popoverRect.height - gap; + } else { + top = topPosition; + } + } + } else { + if (posRect.left < containerRect.left) { + // left bound case + left = + (posRect.right < containerRect.left + ? containerRect.left + : posRect.right) + gap; + } else if ( + posRect.right + 2 * gap + popoverRect.width >= + containerRect.right + ) { + // right bound case + left = posRect.left - popoverRect.width - gap; + } else { + left = posRect.right + gap; + } + + if (posRect.top < containerRect.top) { + // top bound case + top = containerRect.top + gap; + } else if (posRect.top + popoverRect.height > containerRect.bottom) { + // bottom bound case + top = containerRect.bottom - popoverRect.height - gap; + } else { + top = posRect.top + gap; + } + } + + return { + left, + top, + }; +} + +export default getPositionBasedOnOverflow; diff --git a/src/src/utils/getSmoothenedData.ts b/src/src/utils/getSmoothenedData.ts new file mode 100644 index 00000000..2e780308 --- /dev/null +++ b/src/src/utils/getSmoothenedData.ts @@ -0,0 +1,22 @@ +import { + calculateCentralMovingAverage, + calculateExponentialMovingAverage, + SmoothingAlgorithmEnum, +} from './smoothingData'; + +export default function getSmoothenedData({ + smoothingAlgorithm, + smoothingFactor, + data, +}: { + smoothingAlgorithm: SmoothingAlgorithmEnum; + smoothingFactor: number; + data: number[]; +}): number[] { + return smoothingAlgorithm === SmoothingAlgorithmEnum.EMA + ? (calculateExponentialMovingAverage( + data as number[], + smoothingFactor, + ) as any) + : calculateCentralMovingAverage(data as number[], smoothingFactor); +} diff --git a/src/src/utils/getSortedFields.ts b/src/src/utils/getSortedFields.ts new file mode 100644 index 00000000..d1726ef3 --- /dev/null +++ b/src/src/utils/getSortedFields.ts @@ -0,0 +1,67 @@ +import _ from 'lodash-es'; + +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; + +export interface SortField extends IGroupingSelectOption { + readonly?: boolean; + order: 'asc' | 'desc'; +} +export type SortFields = SortField[]; + +export const SortActionTypes = { + DELETE: 'DELETE', + CHANGE: 'CHANGE', + ORDER_CHANGE: 'ORDER_CHANGE', + ORDER_TABLE_TRIGGER: 'ORDER_TABLE_TRIGGER', +}; + +export interface IGetSortedFieldsProps { + sortFields: SortFields; + index?: number; + order?: 'asc' | 'desc'; + actionType: string; + field?: SortField; +} + +export function getSortedFields({ + sortFields, + index, + order, + actionType, + field, +}: IGetSortedFieldsProps) { + switch (actionType) { + case SortActionTypes.DELETE: { + if (!_.isNil(field)) { + return sortFields.filter( + (sortField: SortField) => sortField.value !== field.value, + ); + } + return [...sortFields]; + } + case SortActionTypes.CHANGE: { + return [...sortFields]; + } + case SortActionTypes.ORDER_CHANGE: { + if (!_.isNil(index)) { + sortFields[index].order = order || 'asc'; + } + return [...sortFields]; + } + case SortActionTypes.ORDER_TABLE_TRIGGER: { + if (index === -1) { + sortFields.push({ + ...field, + order: 'asc', + readonly: false, + } as SortField); + } else { + sortFields[index as number].order = + sortFields[index as number].order === 'asc' ? 'desc' : 'asc'; + } + return [...sortFields]; + } + default: + return sortFields; + } +} diff --git a/src/src/utils/getStateFromLocalStorage.ts b/src/src/utils/getStateFromLocalStorage.ts new file mode 100644 index 00000000..66b763e5 --- /dev/null +++ b/src/src/utils/getStateFromLocalStorage.ts @@ -0,0 +1,9 @@ +import { decode } from './encoder/encoder'; + +export default function getStateFromLocalStorage(key: string) { + const data: any = localStorage.getItem(key); + if (data) { + return JSON.parse(decode(data)); + } + return null; +} diff --git a/src/src/utils/getStateFromUrl.ts b/src/src/utils/getStateFromUrl.ts new file mode 100644 index 00000000..f17f6662 --- /dev/null +++ b/src/src/utils/getStateFromUrl.ts @@ -0,0 +1,10 @@ +import { decode } from './encoder/encoder'; + +export default function getStateFromUrl(paramName: string) { + const searchParam = new URLSearchParams(window.location.search); + const url: string = searchParam.get(paramName) || ''; + if (url) { + return JSON.parse(decode(url)); + } + return null; +} diff --git a/src/src/utils/getTooltipContent.ts b/src/src/utils/getTooltipContent.ts new file mode 100644 index 00000000..2c28d90f --- /dev/null +++ b/src/src/utils/getTooltipContent.ts @@ -0,0 +1,81 @@ +import moment from 'moment'; +import _ from 'lodash-es'; + +import { DATE_WITH_SECONDS } from 'config/dates/dates'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + IGroupingSelectOption, + IMetricsCollection, + ITooltipContent, +} from 'types/services/models/metrics/metricsAppModel'; +import { IParam } from 'types/services/models/params/paramsAppModel'; +import { IMetric } from 'types/services/models/metrics/metricModel'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { getValue } from './helper'; +import getGroupConfig from './app/getGroupConfig'; + +function getTooltipContent({ + groupingNames = [], + groupingSelectOptions = [], + data = [], + configData, + activePointKey = null, + selectedFields = [], +}: { + groupingNames: GroupNameEnum[]; + groupingSelectOptions: IGroupingSelectOption[]; + data: IMetricsCollection[]; + configData: IAppModelConfig; + activePointKey?: string | null; + selectedFields?: string[]; +}) { + let tooltipContent: ITooltipContent = {}; + + for (let collection of data) { + const groupConfig = getGroupConfig({ + collection, + groupingSelectOptions, + groupingNames, + configData, + }); + + const item = collection.data.find((item) => item.key === activePointKey); + + if (item) { + tooltipContent = { + name: item.name, + context: item.context, + step: item.step, + index: item.index, + caption: item.caption, + images_name: item.name, + groupConfig, + run: item.run, + }; + } + } + + const selectedProps: ITooltipContent['selectedProps'] = selectedFields.reduce( + (acc: { [key: string]: string }, param: string) => { + const value: string | number = getValue(tooltipContent, param); + if ( + param === 'run.props.creation_time' || + param === 'run.props.end_time' + ) { + acc[param] = !_.isNil(value) + ? moment((value as number) * 1000).format(DATE_WITH_SECONDS) + : value; + } else { + acc[param] = value as string; + } + return acc; + }, + {}, + ); + + return { ...tooltipContent, selectedProps }; +} + +export default getTooltipContent; diff --git a/src/src/utils/getUrlWithParam.ts b/src/src/utils/getUrlWithParam.ts new file mode 100644 index 00000000..a84ef1fa --- /dev/null +++ b/src/src/utils/getUrlWithParam.ts @@ -0,0 +1,20 @@ +/** + * function getUrlWithParam constructs and returns URL with encoded state values + * @params {[key: string]: string} params - Object properties to store in URL's search object + * ex. params = { grouping: 'some string' } + */ +export default function getUrlWithParam(params: { + [key: string]: string; +}): string { + const paramsKeys: string[] = Object.keys(params); + + const searchParams: URLSearchParams = new URLSearchParams( + window.location.search, + ); + + paramsKeys?.forEach((key: string) => { + searchParams.set(key, params[key]); + }); + + return `${window.location.pathname}?${searchParams.toString()}`; +} diff --git a/src/src/utils/getValueByField.ts b/src/src/utils/getValueByField.ts new file mode 100644 index 00000000..756d4b13 --- /dev/null +++ b/src/src/utils/getValueByField.ts @@ -0,0 +1,13 @@ +import _ from 'lodash-es'; + +export default function getValueByField( + list: Array, + value: any, + comparisonFieldName: string = 'value', + returnFiled: string = 'label', +) { + const foundItem = list.find((listItem) => + _.isEqual(listItem[comparisonFieldName], value), + ); + return foundItem ? foundItem[returnFiled] : ''; +} diff --git a/src/src/utils/getValuesMedian.ts b/src/src/utils/getValuesMedian.ts new file mode 100644 index 00000000..890c5369 --- /dev/null +++ b/src/src/utils/getValuesMedian.ts @@ -0,0 +1,9 @@ +export function getValuesMedian(values: number[] | Float64Array): number { + values.sort((a, b) => a - b); + const length = values.length; + if (length % 2 === 0) { + return (values[length / 2] + values[length / 2 - 1]) / 2; + } + + return values[(length - 1) / 2]; +} diff --git a/src/src/utils/helper/downloadLink/downloadLink.ts b/src/src/utils/helper/downloadLink/downloadLink.ts new file mode 100644 index 00000000..a77096b4 --- /dev/null +++ b/src/src/utils/helper/downloadLink/downloadLink.ts @@ -0,0 +1,20 @@ +/** + * [Download file] + * + * Usage: downloadLink(href, fileName) + * + * @param {string} href a link to file which needs to be downloaded, + * @param {string} fileName a name of file which needs to be downloaded, + * @returns {void} + */ +function downloadLink(href: string, fileName: string = 'file'): void { + let link = document.createElement('a'); + link.download = fileName; + link.style.opacity = '0'; + document.body.append(link); + link.href = href; + link.click(); + link.remove(); +} + +export default downloadLink; diff --git a/src/src/utils/helper/float64FromUint8/float64FromUint8.ts b/src/src/utils/helper/float64FromUint8/float64FromUint8.ts new file mode 100644 index 00000000..33893d60 --- /dev/null +++ b/src/src/utils/helper/float64FromUint8/float64FromUint8.ts @@ -0,0 +1,13 @@ +/** + * [Parse Uint8Array to Float64Array] + * + * Usage: float64FromUint8(buffer) + * + * @param {Uint8Array} uint8 Uint8Array to be parsed to Float64Array, + * @returns {Float64Array} + */ +function float64FromUint8(uint8: Uint8Array = new Uint8Array()): Float64Array { + return new Float64Array(uint8.slice().buffer); +} + +export default float64FromUint8; diff --git a/src/src/utils/helper/getPathSegments/getPathSegments.test.ts b/src/src/utils/helper/getPathSegments/getPathSegments.test.ts new file mode 100644 index 00000000..f16670f1 --- /dev/null +++ b/src/src/utils/helper/getPathSegments/getPathSegments.test.ts @@ -0,0 +1,25 @@ +import { toEqual } from 'tests/utils'; + +import getPathSegments from './getPathSegments'; + +describe('[getPathSegments]', () => { + it('should return object type', () => { + const pathSegments = getPathSegments('run.creation_time'); + toEqual('object', typeof pathSegments); + }); + + it('should equal to', () => { + const pathSegments = getPathSegments('objectWrapper.run.creation_time'); + toEqual(['objectWrapper', 'run', 'creation_time'], pathSegments); + }); + + it('should equal to', () => { + const pathSegments = getPathSegments(''); + toEqual([], pathSegments); + }); + + it('should equal to', () => { + const pathSegments = getPathSegments(false as any); + toEqual([], pathSegments); + }); +}); diff --git a/src/src/utils/helper/getPathSegments/getPathSegments.ts b/src/src/utils/helper/getPathSegments/getPathSegments.ts new file mode 100644 index 00000000..a059f2ab --- /dev/null +++ b/src/src/utils/helper/getPathSegments/getPathSegments.ts @@ -0,0 +1,28 @@ +/** + * [Get segments from path] + * + * Usage: getPathSegments(path) + * + * @param {string} path - full path to object property + * @return {string[]} parts - segments of path + */ +function getPathSegments(path: string): string[] { + if (typeof path !== 'string' || path === '') return []; + const parts = []; + const pathArray = path.split('.'); + + for (let i = 0; i < pathArray.length; i++) { + let p = pathArray[i]; + + while (p[p.length - 1] === '\\' && pathArray[i + 1] !== undefined) { + p = p.slice(0, -1) + '.'; + p += pathArray[++i]; + } + + parts.push(p); + } + + return parts; +} + +export default getPathSegments; diff --git a/src/src/utils/helper/getSVGString/getSVGString.test.ts b/src/src/utils/helper/getSVGString/getSVGString.test.ts new file mode 100644 index 00000000..bfd8b379 --- /dev/null +++ b/src/src/utils/helper/getSVGString/getSVGString.test.ts @@ -0,0 +1,14 @@ +import { toEqual } from 'tests/utils'; + +import getSVGString from './getSVGString'; + +describe('[getSVGString]', () => { + it('should return string type value', () => { + let svgNode: SVGSVGElement = document.createElementNS( + 'http://www.w3.org/2000/svg', + 'svg', + ); + const svgString = getSVGString(svgNode); + toEqual('string', typeof svgString); + }); +}); diff --git a/src/src/utils/helper/getSVGString/getSVGString.ts b/src/src/utils/helper/getSVGString/getSVGString.ts new file mode 100644 index 00000000..60645a8f --- /dev/null +++ b/src/src/utils/helper/getSVGString/getSVGString.ts @@ -0,0 +1,76 @@ +/** + * [Svg node element to serialized string](http://bl.ocks.org/Rokotyan/0556f8facbaf344507cdc45dc3622177) + * + * Usage: getSVGString(svgNode) + * + * @param {SVGSVGElement} svgNode a node element, + * @returns {string} serialized svg by using XMLSerializer(https://developer.mozilla.org/en-US/docs/Web/API/XMLSerializer) + */ +function getSVGString(svgNode: SVGSVGElement): string { + svgNode.setAttribute('xlink', 'http://www.w3.org/1999/xlink'); + const cssStyleText = getCSSStyles(svgNode); + appendCSS(cssStyleText, svgNode); + + const serializer = new XMLSerializer(); + let svgString = serializer.serializeToString(svgNode); + svgString = svgString.replace(/(\w+)?:?xlink=/g, 'xmlns:xlink='); // Fix root xlink without namespace + svgString = svgString.replace(/NS\d+:href/g, 'xlink:href'); // Safari NS namespace fix + return svgString; +} + +function getCSSStyles(parentElement: SVGSVGElement): string { + const selectorTextArr = []; + + // Add Parent element Id and Classes to the list + selectorTextArr.push('#' + parentElement.id); + for (let c = 0; c < parentElement.classList.length; c++) + if (!contains('.' + parentElement.classList[c], selectorTextArr)) + selectorTextArr.push('.' + parentElement.classList[c]); + + // Add Children element Ids and Classes to the list + const nodes = parentElement.getElementsByTagName('*'); + for (let i = 0; i < nodes.length; i++) { + const id = nodes[i].id; + if (!contains('#' + id, selectorTextArr)) selectorTextArr.push('#' + id); + + const classes = nodes[i].classList; + for (let c = 0; c < classes.length; c++) + if (!contains('.' + classes[c], selectorTextArr)) + selectorTextArr.push('.' + classes[c]); + } + + // Extract CSS Rules + let extractedCSSText = ''; + for (let i = 0; i < document.styleSheets.length; i++) { + const s = document.styleSheets[i]; + + try { + if (!s.cssRules) continue; + } catch (e) { + if (e.name !== 'SecurityError') throw e; // for Firefox + continue; + } + + const cssRules = s.cssRules; + for (let r = 0; r < cssRules.length; r++) { + if (contains((cssRules[r] as any).selectorText, selectorTextArr)) + extractedCSSText += cssRules[r].cssText; + } + } + + return extractedCSSText; + + function contains(str: string, arr: string[]) { + return arr.indexOf(str) === -1 ? false : true; + } +} + +function appendCSS(cssText: string, element: SVGSVGElement): void { + let styleElement = document.createElement('style'); + styleElement.setAttribute('type', 'text/css'); + styleElement.innerHTML = cssText; + let refNode = element.hasChildNodes() ? element.children[0] : null; + element.insertBefore(styleElement, refNode); +} + +export default getSVGString; diff --git a/src/src/utils/helper/getValue/getValue.test.ts b/src/src/utils/helper/getValue/getValue.test.ts new file mode 100644 index 00000000..f98c84ec --- /dev/null +++ b/src/src/utils/helper/getValue/getValue.test.ts @@ -0,0 +1,37 @@ +import { toEqual } from 'tests/utils'; + +import getValue from './getValue'; + +describe('[getValue]', () => { + const obj = { + a: { + b: { + length: { + valueOf: { + name: 'nested prop', + }, + }, + }, + }, + }; + + it('should equal to', () => { + const value = getValue(obj, 'a.b.length.valueOf.name'); + toEqual('nested prop', value); + }); + + it('should equal to', () => { + const value = getValue(obj.a.b, 'length.valueOf'); + toEqual({ name: 'nested prop' }, value); + }); + + it('should equal to', () => { + const value = getValue(obj.a.b, ['length', 'valueOf']); + toEqual({ name: 'nested prop' }, value); + }); + + it('should equal to', () => { + const value = getValue(null, ['length', 'valueOf'], 'defaultValue'); + toEqual('defaultValue', value); + }); +}); diff --git a/src/src/utils/helper/getValue/getValue.ts b/src/src/utils/helper/getValue/getValue.ts new file mode 100644 index 00000000..5027d0a8 --- /dev/null +++ b/src/src/utils/helper/getValue/getValue.ts @@ -0,0 +1,55 @@ +import stringToPath from 'utils/stringToPath'; +/** + * [Get value from nested object by passed path](https://github.com/sindresorhus/dot-prop/blob/master/index.js) + * + * Usage: getValue(object, path, defaultValue) + * + * @param {Record|null} object - nested object + * @param {string|string[]} path - key, to nested object property value + * @param {any} defaultValue - default value, if there is no corresponding key + * @return value - nested object property value or default value + */ +export function getValue( + object: Record | null, + path: string | string[], + defaultValue?: any, +) { + if ( + object === null || + typeof object !== 'object' || + !(typeof path === 'string' || Array.isArray(path)) + ) { + return defaultValue; + } + + let pathArray; + if (typeof path === 'string' && object.propertyIsEnumerable(path)) { + pathArray = [path]; + } else if (Array.isArray(path)) { + pathArray = path; + } else { + pathArray = stringToPath(path); + } + + for (let i = 0; i < pathArray.length; i++) { + if ( + typeof object !== 'object' || + !object.propertyIsEnumerable(pathArray[i]) + ) { + return defaultValue; + } + + object = object[pathArray[i]]; + + if (object === undefined || object === null) { + if (i !== pathArray.length - 1) { + return defaultValue; + } + break; + } + } + + return object; +} + +export default getValue; diff --git a/src/src/utils/helper/imgSource2Image/imgSource2Image.ts b/src/src/utils/helper/imgSource2Image/imgSource2Image.ts new file mode 100644 index 00000000..3fa1ac4c --- /dev/null +++ b/src/src/utils/helper/imgSource2Image/imgSource2Image.ts @@ -0,0 +1,52 @@ +import { FORMAT_ENUM } from 'components/ExportPreview/config'; +/** + * [Convert image source to the image by specifying format and dimension] + * + * Usage: imgSource2Image({ imgSrc, width, height, format, callback }) + * + * @param {string} imgSrc valid html image source, + * @param {number} width width of the converted image, + * @param {number} height height of the converted image, + * @param {FORMAT_ENUM} format of the converted image, + * @param {(blob: Blob) => void;} callback of the image conversion, + * @returns {void} + */ +function imgSource2Image({ + imgSrc, + width, + height, + format = FORMAT_ENUM.JPEG, + callback, +}: { + imgSrc: string; + width: number; + height: number; + format: Omit; + callback: (blob: Blob) => void; +}): void { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + if (canvas && context) { + canvas.width = width; + canvas.height = height; + const image = new Image(); + image.onload = function () { + if (context) { + context.clearRect(0, 0, width, height); + context.drawImage(image, 0, 0, width, height); + canvas.toBlob( + (blob) => { + if (blob && callback) { + callback(blob); + } + }, + 'image/' + format, + 1, + ); + } + }; + image.src = imgSrc; + } +} + +export default imgSource2Image; diff --git a/src/src/utils/helper/inIframe/inIframe.ts b/src/src/utils/helper/inIframe/inIframe.ts new file mode 100644 index 00000000..05424c75 --- /dev/null +++ b/src/src/utils/helper/inIframe/inIframe.ts @@ -0,0 +1,9 @@ +function inIframe() { + try { + return window.self !== window.top; + } catch (e) { + return true; + } +} + +export default inIframe; diff --git a/src/src/utils/helper/index.ts b/src/src/utils/helper/index.ts new file mode 100644 index 00000000..3a2470da --- /dev/null +++ b/src/src/utils/helper/index.ts @@ -0,0 +1,21 @@ +import getValue from './getValue/getValue'; +import getPathSegments from './getPathSegments/getPathSegments'; +import inIframe from './inIframe/inIframe'; +import imgSource2Image from './imgSource2Image/imgSource2Image'; +import getSVGString from './getSVGString/getSVGString'; +import downloadLink from './downloadLink/downloadLink'; +import measureTextWidth from './measureTextWidth/measureTextWidth'; +import toTextEllipsis from './toTextEllipsis/toTextEllipsis'; +import float64FromUint8 from './float64FromUint8/float64FromUint8'; + +export { + getPathSegments, + getValue, + inIframe, + imgSource2Image, + getSVGString, + downloadLink, + measureTextWidth, + toTextEllipsis, + float64FromUint8, +}; diff --git a/src/src/utils/helper/measureTextWidth/measureTextWidth.test.ts b/src/src/utils/helper/measureTextWidth/measureTextWidth.test.ts new file mode 100644 index 00000000..d6011f42 --- /dev/null +++ b/src/src/utils/helper/measureTextWidth/measureTextWidth.test.ts @@ -0,0 +1,15 @@ +import { toBeLessThanOrEqual, toEqual } from 'tests/utils'; + +import { measureTextWidth } from 'utils/helper'; + +describe('[measureTextWidth]', () => { + it('should return number type value', () => { + const measuredTextWidth = measureTextWidth({ text: 'test text' }); + toEqual('number', typeof measuredTextWidth); + }); + + it('should return positive number', () => { + const measuredTextWidth = measureTextWidth({ text: 'test text' }); + toBeLessThanOrEqual(0, measuredTextWidth); + }); +}); diff --git a/src/src/utils/helper/measureTextWidth/measureTextWidth.ts b/src/src/utils/helper/measureTextWidth/measureTextWidth.ts new file mode 100644 index 00000000..72d33bb7 --- /dev/null +++ b/src/src/utils/helper/measureTextWidth/measureTextWidth.ts @@ -0,0 +1,36 @@ +/** + * [Measure text width] + * measure the size taken to render the supplied text + * you can supply additional style information too if you have it + * + * Usage: measureTextWidth({ text, fontSize, fontFamily, fontWeight }) + * + * @param {string} text which size needs to measure, + * @param {string} fontSize font size of the measured text, + * @param {string} fontFamily font family of the measured text, + * @param {number} fontWeight font weight of the measured text, + * @returns {number} represents the width of a piece of text in the canvas + */ +const canvas = document.createElement('canvas'); +const context = canvas.getContext('2d'); + +function measureTextWidth({ + text, + fontSize = '16px', + fontFamily = 'Inter, sans-serif', + fontWeight = 400, +}: { + text: string; + fontSize?: string; + fontFamily?: string; + fontWeight?: number; +}): number { + if (canvas && context) { + context.font = `${fontWeight} ${fontSize} ${fontFamily}`; + const textMetrics = context.measureText(text); + return textMetrics?.width || 0; + } + return 0; +} + +export default measureTextWidth; diff --git a/src/src/utils/helper/toTextEllipsis/toTextEllipsis.test.ts b/src/src/utils/helper/toTextEllipsis/toTextEllipsis.test.ts new file mode 100644 index 00000000..7c959481 --- /dev/null +++ b/src/src/utils/helper/toTextEllipsis/toTextEllipsis.test.ts @@ -0,0 +1,16 @@ +import { toBeGreaterThanOrEqual, toEqual } from 'tests/utils'; + +import toTextEllipsis from './toTextEllipsis'; + +describe('[toTextEllipsis]', () => { + it('should return string type value', () => { + const textEllipsis = toTextEllipsis({ text: 'test text', width: 20 }); + toEqual('string', typeof textEllipsis); + }); + + it('should return text which length is smaller or equal to received text length', () => { + const text = 'test text'; + const textEllipsis = toTextEllipsis({ text, width: 20 }); + toBeGreaterThanOrEqual(text.length, textEllipsis.length); + }); +}); diff --git a/src/src/utils/helper/toTextEllipsis/toTextEllipsis.ts b/src/src/utils/helper/toTextEllipsis/toTextEllipsis.ts new file mode 100644 index 00000000..957c8e82 --- /dev/null +++ b/src/src/utils/helper/toTextEllipsis/toTextEllipsis.ts @@ -0,0 +1,52 @@ +import { measureTextWidth } from 'utils/helper'; +/** + * [Display the text by specified width] + * Cut text and display ellipsis if text width is more than specified width + * + * Usage: toTextEllipsis({ text, width, fontSize, fontFamily, fontWeight }) + * + * @param {string} text which needs to display by specified width, + * @param {number} width maximum width of the text, + * @param {string} fontSize font size of the measured text, + * @param {string} fontFamily font family of the measured text, + * @param {number} fontWeight font weight of the measured text, + * @returns {string} ellipsis text + */ +function toTextEllipsis({ + text, + width, + fontSize = '16px', + fontFamily = 'Inter, sans-serif', + fontWeight = 400, + recourseIndex = 0, +}: { + text: string; + width: number; + fontSize?: string; + fontFamily?: string; + fontWeight?: number; + recourseIndex?: number; +}): string { + const currentTextWidth = measureTextWidth({ + text, + fontSize, + fontFamily, + fontWeight, + }); + + if (recourseIndex === 0 && width > currentTextWidth) { + return text; + } else if (currentTextWidth > width) { + return toTextEllipsis({ + text: text.slice(0, -1), + width, + fontSize, + fontFamily, + fontWeight, + recourseIndex: ++recourseIndex, + }); + } + return text.slice(0, -3) + '...'; +} + +export default toTextEllipsis; diff --git a/src/src/utils/hexToRgbA.ts b/src/src/utils/hexToRgbA.ts new file mode 100644 index 00000000..c623927b --- /dev/null +++ b/src/src/utils/hexToRgbA.ts @@ -0,0 +1,22 @@ +function hexToRgbA(hex: string, opacity: number): string { + let hexCode = hex?.substring(1).split(''); + if (hexCode.length === 3) { + hexCode = [ + hexCode[0], + hexCode[0], + hexCode[1], + hexCode[1], + hexCode[2], + hexCode[2], + ]; + } + const tmpHex = +('0x' + hexCode.join('')); + return ( + 'rgba(' + + [(tmpHex >> 16) & 255, (tmpHex >> 8) & 255, tmpHex & 255].join(',') + + ',' + + opacity || 1 + ')' + ); +} + +export default hexToRgbA; diff --git a/src/src/utils/isMetricHash.ts b/src/src/utils/isMetricHash.ts new file mode 100644 index 00000000..4b1380b3 --- /dev/null +++ b/src/src/utils/isMetricHash.ts @@ -0,0 +1,8 @@ +import { AIM64_ENCODING_PREFIX, decode } from './encoder/encoder'; + +export function isMetricHash(key: string) { + return ( + key?.startsWith(AIM64_ENCODING_PREFIX) && + JSON.parse(decode(key)).hasOwnProperty('metricName') + ); +} diff --git a/src/src/utils/isSystemMetric.ts b/src/src/utils/isSystemMetric.ts new file mode 100644 index 00000000..5bd4b5df --- /dev/null +++ b/src/src/utils/isSystemMetric.ts @@ -0,0 +1,7 @@ +import { systemMetricsDict } from 'config/systemMetrics/systemMetrics'; + +import { systemMetricsDictType } from 'types/utils/formatSystemMetricName'; + +export function isSystemMetric(metric: string): boolean { + return !!systemMetricsDict[metric as keyof systemMetricsDictType]; +} diff --git a/src/src/utils/jsonParse.ts b/src/src/utils/jsonParse.ts new file mode 100644 index 00000000..1ee22617 --- /dev/null +++ b/src/src/utils/jsonParse.ts @@ -0,0 +1,8 @@ +export function jsonParse(value: string) { + try { + JSON.parse(value); + } catch (e) { + return false; + } + return JSON.parse(value); +} diff --git a/src/src/utils/minMaxOfArray.ts b/src/src/utils/minMaxOfArray.ts new file mode 100644 index 00000000..97e84c05 --- /dev/null +++ b/src/src/utils/minMaxOfArray.ts @@ -0,0 +1,16 @@ +export function minMaxOfArray(arr: number[]): number[] { + if (arr.length === 0) { + return []; + } + let max: number = arr[0]; + let min: number = arr[0]; + for (let i = 1; i < arr.length; i++) { + if (arr[i] > max) { + max = arr[i]; + } + if (min > arr[i]) { + min = arr[i]; + } + } + return [min, max]; +} diff --git a/src/src/utils/object/getObjectPaths.ts b/src/src/utils/object/getObjectPaths.ts new file mode 100644 index 00000000..b7f84af8 --- /dev/null +++ b/src/src/utils/object/getObjectPaths.ts @@ -0,0 +1,38 @@ +import traverseTree from './traverseTree'; + +/** + * function getObjectPaths + * input - { a: 1, b: 1, c: [], d: { e: { f: 1} } + * trail - '123' + * delimiter - '.' + * output- [ + * '123.a', + * '123.b', + * '123.c', + * '123.d', + * '123.d.e', + * '123.d.e.f' + * ] + * @param {Record} obj - target object + * @param {string} prefix - the prefix should be concatenated at the start of all paths, aka root node value + * @param {string} delimiter - delimiter to connect paths + * @returns {Array} - returns an array of all paths + */ +function getObjectPaths( + obj: Record, + prefix: string = '', + delimiter: string = '.', +): Array { + let arr: Array = []; + traverseTree( + obj, + (...args: any[]) => { + let key = args[2] ? `${args[2]}${delimiter}${args[0]}` : args[0]; + arr.push(key); + }, + prefix, + ); + return arr; +} + +export default getObjectPaths; diff --git a/src/src/utils/object/traverseTree.ts b/src/src/utils/object/traverseTree.ts new file mode 100644 index 00000000..73fcee99 --- /dev/null +++ b/src/src/utils/object/traverseTree.ts @@ -0,0 +1,29 @@ +import _ from 'lodash-es'; + +type Callback = (key: string, value: any, trail: string) => void; + +/** + * function traverseTree + * This function traverses through object keys as tree + * @param {Record} obj - an object should be traversed + * @param {Callback} callback - this callback gets current key, value, and generated trail for the iteration + * this function has context which is the actual object passed to traverseTree method, it means you can use this inside the callback + * @param trail - prefix to add at the start of path + */ +function traverseTree( + obj: Record, + callback: Callback, + trail: string = '', +): void { + Object.keys(obj).forEach((key: string) => { + let value = obj[key]; + callback.call(obj, key, value, trail); + + if (_.isObject(value)) { + const k = trail ? `${trail}.${key}` : key; + traverseTree(value, callback, k); + } + }); +} + +export default traverseTree; diff --git a/src/src/utils/onCopyToClipBoard.ts b/src/src/utils/onCopyToClipBoard.ts new file mode 100644 index 00000000..81e6cb61 --- /dev/null +++ b/src/src/utils/onCopyToClipBoard.ts @@ -0,0 +1,58 @@ +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { IModel } from 'types/services/models/model'; + +export function onCopyToClipBoard( + text: string, + isCopied?: boolean, + notificationCallBack?: ({ + notification, + model, + }: { + notification: INotification; + model: IModel; + }) => void, + notificationBody?: { notification: INotification; model: IModel }, +) { + if (text && !isCopied) { + if (navigator.clipboard && window.isSecureContext) { + navigator.clipboard + ?.writeText(text) + ?.then(() => { + if (notificationCallBack && notificationBody) { + notificationCallBack(notificationBody); + } + }) + .catch(() => { + if (notificationCallBack && notificationBody) { + notificationBody.notification.severity = 'error'; + notificationBody.notification.messages = ["Content isn't copied"]; + notificationCallBack(notificationBody); + } + }); + } else { + const textArea: HTMLTextAreaElement = document.createElement('textarea'); + textArea.value = text; + + // make the textarea out of viewport + textArea.style.position = 'fixed'; + textArea.style.left = '-400vw'; + textArea.style.top = '-400vh'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + try { + document.execCommand('copy'); + textArea.remove(); + if (notificationCallBack && notificationBody) { + notificationCallBack(notificationBody); + } + } catch (err) { + if (notificationCallBack && notificationBody) { + notificationBody.notification.severity = 'error'; + notificationBody.notification.messages = ["Content isn't copied"]; + notificationCallBack(notificationBody); + } + } + } + } +} diff --git a/src/src/utils/processDurationTime.ts b/src/src/utils/processDurationTime.ts new file mode 100644 index 00000000..67d63860 --- /dev/null +++ b/src/src/utils/processDurationTime.ts @@ -0,0 +1,14 @@ +import moment from 'moment'; + +import shortEnglishHumanizer from './shortEnglishHumanizer'; + +export function processDurationTime( + startTime: number, + endTime: number, +): string { + const duration = moment(startTime).diff(moment(endTime)); + + return shortEnglishHumanizer(duration, { + maxDecimalPoints: 2, + }); +} diff --git a/src/src/utils/regression/linearRegression.test.ts b/src/src/utils/regression/linearRegression.test.ts new file mode 100644 index 00000000..f496b8d3 --- /dev/null +++ b/src/src/utils/regression/linearRegression.test.ts @@ -0,0 +1,64 @@ +import { toEqual } from 'tests/utils'; + +import { linearRegression, linearRegressionLine } from './linearRegression'; + +describe('[linearRegression calculation]', () => { + it('correctly generates a line for a 0, 0 to 1, 1 dataset', () => { + const l = linearRegressionLine( + linearRegression([ + [0, 0], + [1, 1], + ]), + ); + toEqual(l(0), 0); + toEqual(l(0.5), 0.5); + toEqual(l(1), 1); + }); + + it('correctly generates a line for a 0, 0 to 1, 0 dataset', () => { + const l = linearRegressionLine( + linearRegression([ + [0, 0], + [1, 0], + ]), + ); + toEqual(l(0), 0); + toEqual(l(0.5), 0); + toEqual(l(1), 0); + }); + + it('handles a single-point sample', () => { + const l = linearRegressionLine(linearRegression([[0, 0]])); + toEqual(l(10), 0); + }); + + it('a straight line will have a slope of 0', () => { + toEqual( + linearRegression([ + [0, 0], + [1, 0], + ]), + { m: 0, b: 0 }, + ); + }); + + it('a line at 50% grade', () => { + toEqual( + linearRegression([ + [0, 0], + [1, 0.5], + ]), + { m: 0.5, b: 0 }, + ); + }); + + it('a line with a high y-intercept', () => { + toEqual( + linearRegression([ + [0, 20], + [1, 10], + ]), + { m: -10, b: 20 }, + ); + }); +}); diff --git a/src/src/utils/regression/linearRegression.ts b/src/src/utils/regression/linearRegression.ts new file mode 100644 index 00000000..dd22225a --- /dev/null +++ b/src/src/utils/regression/linearRegression.ts @@ -0,0 +1,98 @@ +/** + * [Simple linear regression](http://en.wikipedia.org/wiki/Simple_linear_regression) + * is a simple way to find a fitted line + * between a set of coordinates. This algorithm finds the slope and y-intercept of a regression line + * using the least sum of squares. + * + * @param {Array>} data an array of two-element of arrays, + * like `[[0, 1], [2, 3]]` + * @returns {Object} object containing slope and intersect of regression line + * @example + * linearRegression([[0, 0], [1, 1]]); // => { m: 1, b: 0 } + */ +export function linearRegression(data: [number, number][]): { + m: number; + b: number; +} { + let m; + let b; + + // Store data length in a local variable to reduce + // repeated object property lookups + const dataLength = data.length; + + //if there's only one point, arbitrarily choose a slope of 0 + //and a y-intercept of whatever the y of the initial point is + if (dataLength === 1) { + m = 0; + b = data[0][1]; + } else { + // Initialize our sums and scope the `m` and `b` + // variables that define the line. + let sumX = 0; + let sumY = 0; + let sumXX = 0; + let sumXY = 0; + + // Use local variables to grab point values + // with minimal object property lookups + let point; + let x; + let y; + + // Gather the sum of all x values, the sum of all + // y values, and the sum of x^2 and (x*y) for each + // value. + // + // In math notation, these would be SS_x, SS_y, SS_xx, and SS_xy + for (let i = 0; i < dataLength; i++) { + point = data[i]; + x = point[0]; + y = point[1]; + + sumX += x; + sumY += y; + + sumXX += x * x; + sumXY += x * y; + } + + // `m` is the slope of the regression line + m = (dataLength * sumXY - sumX * sumY) / (dataLength * sumXX - sumX * sumX); + + // `b` is the y-intercept of the line. + b = sumY / dataLength - (m * sumX) / dataLength; + } + + // Return both values as an object. + return { + m: m, + b: b, + }; +} + +/** + * Given the output of `linearRegression`: an object + * with `m` and `b` values indicating slope and intercept, + * respectively, generate a line function that translates + * x values into y values. + * + * @param {Object} mb object with `m` and `b` members, representing + * slope and intersect of desired line + * @returns {Function} method that computes y-value at any given + * x-value on the line. + * @example + * var l = linearRegressionLine(linearRegression([[0, 0], [1, 1]])); + * l(0) // = 0 + * l(2) // = 2 + * linearRegressionLine({ b: 0, m: 1 })(1); // => 1 + * linearRegressionLine({ b: 1, m: 1 })(1); // => 2 + */ +export function linearRegressionLine(mb: { b: number; m: number }) { + // Return a function that computes a `y` value for each + // x value it is given, based on the values of `b` and `a` + // that we just computed. + return function (x: number): number { + return mb.b + mb.m * x; + }; +} diff --git a/src/src/utils/regression/loess.test.ts b/src/src/utils/regression/loess.test.ts new file mode 100644 index 00000000..3dc48e23 --- /dev/null +++ b/src/src/utils/regression/loess.test.ts @@ -0,0 +1,266 @@ +import { toEqual } from 'tests/utils'; + +import loess from './loess'; + +const data: [number, number][] = [ + [1900, 57.5605], + [1901, 57.3214], + [1902, 56.2134], + [1903, 56.317], + [1904, 57.4467], + [1905, 57.1332], + [1906, 57.2392], + [1907, 56.5545], + [1908, 56.2721], + [1909, 56.2912], + [1910, 57.7532], + [1911, 55.474], + [1912, 55.5628], + [1913, 56.5263], + [1914, 57.4455], + [1915, 56.8189], + [1916, 55.5932], + [1917, 56.6997], + [1918, 56.9079], + [1919, 56.3611], + [1920, 56.1257], + [1921, 57.3778], + [1922, 56.1452], + [1923, 56.4466], + [1924, 57.1546], + [1925, 57.206], + [1926, 58.8471], + [1927, 56.94], + [1928, 57.7148], + [1929, 57.3422], + [1930, 56.9745], + [1931, 58.3638], + [1932, 56.9607], + [1933, 56.8247], + [1934, 59.7805], + [1935, 56.8945], + [1936, 58.6637], + [1937, 57.2449], + [1938, 57.3329], + [1939, 58.4247], + [1940, 58.8798], + [1941, 57.1222], + [1942, 57.1411], + [1943, 57.894], + [1944, 56.2842], + [1945, 57.1573], + [1946, 56.8022], + [1947, 57.6003], + [1948, 55.6891], + [1949, 56.2792], + [1950, 58.1899], + [1951, 57.2899], + [1952, 56.8036], + [1953, 57.2433], + [1954, 57.6142], + [1955, 56.3011], + [1956, 57.0172], + [1957, 57.1288], + [1958, 58.9603], + [1959, 59.0416], + [1960, 58.0866], + [1961, 57.8652], + [1962, 57.4384], + [1963, 57.1077], + [1964, 56.6202], + [1965, 56.774], + [1966, 58.0992], + [1967, 57.5668], + [1968, 57.5989], + [1969, 57.5899], + [1970, 57.8767], + [1971, 56.2718], + [1972, 57.2934], + [1973, 57.3641], + [1974, 57.7036], + [1975, 56.3447], + [1976, 57.5107], + [1977, 58.0088], + [1978, 57.6893], + [1979, 57.7485], + [1980, 58.1052], + [1981, 59.3551], + [1982, 56.4003], + [1983, 57.6184], + [1984, 58.2609], + [1985, 57.3929], + [1986, 58.9427], + [1987, 58.3293], + [1988, 58.7852], + [1989, 58.1885], + [1990, 58.0488], + [1991, 58.16], + [1992, 59.2918], + [1993, 57.7408], + [1994, 58.1055], + [1995, 58.9677], + [1996, 59.594], + [1997, 59.1923], + [1998, 56.7942], + [1999, 58.0356], + [2000, 58.8363], + [2001, 59.2216], + [2002, 58.8964], + [2003, 59.529], + [2004, 58.9128], + [2005, 58.6833], + [2006, 58.6975], + [2007, 58.9929], + [2008, 58.9459], + [2009, 58.917], + [2010, 57.7926], + [2011, 57.5186], + [2012, 59.5448], + [2013, 59.3921], + [2014, 61.5208], + [2015, 60.7992], + [2016, 60.1429], + [2017, 60.4208], +]; + +describe('[loess calculation]', () => { + it('loess(data, bandwidth) calculates the LOESS regression', () => { + function shuffle(arr: [number, number][]) { + let m = arr.length, + t, + i; + while (m) { + i = Math.floor(Math.random() * m--); + t = arr[m]; + arr[m] = arr[i]; + arr[i] = t; + } + return arr; + } + + const r = loess(shuffle(data), 0.3); + + const output = [ + [1900, 56.842036038120746], + [1901, 56.82388042072633], + [1902, 56.8070189828568], + [1903, 56.791439968282916], + [1904, 56.777183782649004], + [1905, 56.76433479172034], + [1906, 56.75292962790576], + [1907, 56.74294889153739], + [1908, 56.73431787165204], + [1909, 56.72695170364497], + [1910, 56.72078756696423], + [1911, 56.71576021371101], + [1912, 56.711699920350995], + [1913, 56.708473636333565], + [1914, 56.7060880931565], + [1915, 56.70480534893961], + [1916, 56.70576431788093], + [1917, 56.71232026149931], + [1918, 56.747900012306594], + [1919, 56.789420693808246], + [1920, 56.83748213534298], + [1921, 56.89225052264274], + [1922, 56.95199450220717], + [1923, 57.014438615650704], + [1924, 57.07859385148974], + [1925, 57.14473392742243], + [1926, 57.21214134229593], + [1927, 57.27901032976046], + [1928, 57.343086401323646], + [1929, 57.40283047680427], + [1930, 57.45672812128807], + [1931, 57.50254743337572], + [1932, 57.5382672855882], + [1933, 57.561956392439235], + [1934, 57.57327443318934], + [1935, 57.57348137525841], + [1936, 57.56400274816263], + [1937, 57.54670946886326], + [1938, 57.52367643827728], + [1939, 57.49687396721632], + [1940, 57.46813369606984], + [1941, 57.43860331605789], + [1942, 57.40872244047538], + [1943, 57.37987901554629], + [1944, 57.35366139781617], + [1945, 57.331848081812225], + [1946, 57.315396344090935], + [1947, 57.30449888731605], + [1948, 57.29847592437323], + [1949, 57.2955374044323], + [1950, 57.29521879323507], + [1951, 57.298018542818255], + [1952, 57.303440826136594], + [1953, 57.31226477763196], + [1954, 57.32510063614931], + [1955, 57.34264762617605], + [1956, 57.363678118397104], + [1957, 57.38591358081206], + [1958, 57.40755388563386], + [1959, 57.42815511755062], + [1960, 57.44632106674749], + [1961, 57.46071240516167], + [1962, 57.471416346181], + [1963, 57.478388358377934], + [1964, 57.48179755794645], + [1965, 57.48281654883124], + [1966, 57.4843219223156], + [1967, 57.48668592399354], + [1968, 57.488693587174154], + [1969, 57.490265177390114], + [1970, 57.49205947840186], + [1971, 57.49573834430299], + [1972, 57.503546856084725], + [1973, 57.518706091853566], + [1974, 57.54298958003794], + [1975, 57.575914537813304], + [1976, 57.61500221122251], + [1977, 57.65826392696781], + [1978, 57.703917579810366], + [1979, 57.7507160415611], + [1980, 57.79897718774289], + [1981, 57.85045711635498], + [1982, 57.90635482156091], + [1983, 57.96475127434016], + [1984, 58.022715613240194], + [1985, 58.07845598392329], + [1986, 58.1311956998041], + [1987, 58.18085072813873], + [1988, 58.22812103454775], + [1989, 58.27418703914001], + [1990, 58.31918578044981], + [1991, 58.36292543303682], + [1992, 58.40569657511456], + [1993, 58.44831291989403], + [1994, 58.490331693451246], + [1995, 58.53005874798704], + [1996, 58.565725371856644], + [1997, 58.59657656710402], + [1998, 58.62266138294421], + [1999, 58.64611783088632], + [2000, 58.67140622932588], + [2001, 58.71065577244432], + [2002, 58.762536824661204], + [2003, 58.820539956595965], + [2004, 58.88112858108126], + [2005, 58.94258080709306], + [2006, 59.00406425615884], + [2007, 59.0652053660954], + [2008, 59.125872778795475], + [2009, 59.18605858797359], + [2010, 59.24583648641658], + [2011, 59.30536787973602], + [2012, 59.36498198843687], + [2013, 59.425152996051466], + [2014, 59.4863324246197], + [2015, 59.54888991301135], + [2016, 59.61298575584295], + [2017, 59.67862753979371], + ]; + + toEqual(r, output); + }); +}); diff --git a/src/src/utils/regression/loess.ts b/src/src/utils/regression/loess.ts new file mode 100644 index 00000000..5257c77c --- /dev/null +++ b/src/src/utils/regression/loess.ts @@ -0,0 +1,187 @@ +// Adapted from d3-regression by Harry Stevens +// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE +// Adapted from science.js by Jason Davies +// License: https://github.com/jasondavies/science.js/blob/master/LICENSE +// Source: https://github.com/jasondavies/science.js/blob/master/src/stats/loess.js +// Adapted from vega-statistics by Jeffrey Heer +// License: https://github.com/vega/vega/blob/f058b099decad9db78301405dd0d2e9d8ba3d51a/LICENSE +// Source: https://github.com/vega/vega/blob/f21cb8792b4e0cbe2b1a3fd44b0f5db370dbaadb/packages/vega-statistics/src/regression/loess.js + +import { getValuesMedian } from 'utils/getValuesMedian'; + +const maxiters = 2; +const epsilon = 1e-12; +let x = (d: [number, number]) => d[0]; +let y = (d: [number, number]) => d[1]; + +export default function loess( + data: [number, number][], + bandwidth: number = 0.66, +) { + const [xv, yv, ux, uy] = points(data, x, y, true); + const n = xv.length; + const bw = Math.max(2, ~~(bandwidth * n)); // # nearest neighbors + const yhat = new Float64Array(n); + const residuals = new Float64Array(n); + const robustWeights = new Float64Array(n).fill(1); + + for (let iter = -1; ++iter <= maxiters; ) { + const interval: [number, number] = [0, bw - 1]; + + for (let i = 0; i < n; ++i) { + const dx = xv[i]; + const i0 = interval[0]; + const i1 = interval[1]; + const edge = dx - xv[i0] > xv[i1] - dx ? i0 : i1; + + let W = 0; + let X = 0; + let Y = 0; + let XY = 0; + let X2 = 0; + let denom = 1 / Math.abs(xv[edge] - dx || 1); // Avoid singularity + + for (let k = i0; k <= i1; ++k) { + const xk = xv[k]; + const yk = yv[k]; + const w = tricube(Math.abs(dx - xk) * denom) * robustWeights[k]; + const xkw = xk * w; + + W += w; + X += xkw; + Y += yk * w; + XY += yk * xkw; + X2 += xk * xkw; + } + + // Linear regression fit + const [a, b] = ols(X / W, Y / W, XY / W, X2 / W); + yhat[i] = a + b * dx; + residuals[i] = Math.abs(yv[i] - yhat[i]); + + updateInterval(xv, i + 1, interval); + } + + if (iter === maxiters) { + break; + } + + const medianResidual = getValuesMedian(residuals); + if (Math.abs(medianResidual) < epsilon) break; + + for (let i = 0, arg, w; i < n; ++i) { + arg = residuals[i] / (6 * medianResidual); + // Default to epsilon (rather than zero) for large deviations + // Keeping weights tiny but non-zero prevents singularites + robustWeights[i] = arg >= 1 ? epsilon : (w = 1 - arg * arg) * w; + } + } + + return output(xv, yhat, ux, uy); +} + +// Weighting kernel for local regression +function tricube(x: number) { + return (x = 1 - x * x * x) * x * x; +} + +// Advance sliding window interval of nearest neighbors +function updateInterval( + xv: Float64Array, + i: number, + interval: [number, number], +) { + let val = xv[i]; + let left = interval[0]; + let right = interval[1] + 1; + + if (right >= xv.length) return; + + // Step right if distance to new right edge is <= distance to old left edge + // Step when distance is equal to ensure movement over duplicate x values + while (i > left && xv[right] - val <= val - xv[left]) { + interval[0] = ++left; + interval[1] = right; + ++right; + } +} + +// Generate smoothed output points +// Average points with repeated x values +function output(xv: Float64Array, yhat: Float64Array, ux: number, uy: number) { + const n = xv.length; + const out = []; + let i = 0; + let cnt = 0; + let prev: number[] = []; + let v: number; + + for (; i < n; ++i) { + v = xv[i] + ux; + if (prev[0] === v) { + // Average output values + prev[1] += (yhat[i] - prev[1]) / ++cnt; + } else { + // Add new output point + cnt = 0; + prev[1] += uy; + prev = [v, yhat[i]]; + out.push(prev); + } + } + prev[1] += uy; + + return out; +} + +function points( + data: [number, number][], + x: (d: [number, number]) => number, + y: (d: [number, number]) => number, + sort: boolean, +): [Float64Array, Float64Array, number, number] { + data = data.filter((d: [number, number]) => { + let u = x(d); + let v = y(d); + return u !== null && isFinite(u) && v !== null && isFinite(v); + }); + + if (sort) { + data.sort((a: [number, number], b: [number, number]) => x(a) - x(b)); + } + + const n = data.length; + const X = new Float64Array(n); + const Y = new Float64Array(n); + + // extract values, calculate means + let ux = 0; + let uy = 0; + let xv; + let yv; + let d; + for (let i = 0; i < n; ) { + d = data[i]; + X[i] = xv = +x(d); + Y[i] = yv = +y(d); + ++i; + ux += (xv - ux) / i; + uy += (yv - uy) / i; + } + + // mean center the data + for (let i = 0; i < n; ++i) { + X[i] -= ux; + Y[i] -= uy; + } + + return [X, Y, ux, uy]; +} + +function ols(uX: number, uY: number, uXY: number, uX2: number) { + const delta = uX2 - uX * uX; + const slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta; + const intercept = uY - slope * uX; + + return [intercept, slope]; +} diff --git a/src/src/utils/removeOutliers.ts b/src/src/utils/removeOutliers.ts new file mode 100644 index 00000000..07bf64a5 --- /dev/null +++ b/src/src/utils/removeOutliers.ts @@ -0,0 +1,23 @@ +export function removeOutliers(values: number[], t = 2): number[] { + let filtered: number[] = [...values].sort((a: number, b: number) => a - b); + + while (true) { + const first = filtered[0]; + const last = filtered[filtered.length - 1]; + if (!filtered.length || first === last) { + break; + } + const q1: number = filtered[Math.floor(filtered.length / 4)]; + const q3: number = filtered[Math.ceil(filtered.length * (3 / 4))]; + const iqr = q3 - q1; // Inter-quartile range + const mean = filtered.reduce((pv, cv) => pv + cv, 0) / filtered.length; + const furthest = mean - first > last - mean ? first : last; + if (Math.abs(furthest - mean) > t * iqr) { + filtered = filtered.filter((elem: number) => elem !== furthest); + } else { + break; + } + } + + return filtered; +} diff --git a/src/src/utils/removeSyntaxErrBrackets.ts b/src/src/utils/removeSyntaxErrBrackets.ts new file mode 100644 index 00000000..16fd1418 --- /dev/null +++ b/src/src/utils/removeSyntaxErrBrackets.ts @@ -0,0 +1,25 @@ +import { ISyntaxErrorDetail } from 'types/components/NotificationContainer/NotificationContainer'; + +/** + * @function removeSyntaxErrBrackets - remove unused brackets from syntax error message + * @param detail {ISyntaxErrorDetail} - syntax error detail + * @param advancedModeOn {boolean} - advanced mode on/off + * + * @return syntaxErrDetail - processed syntax error detail + */ +function removeSyntaxErrBrackets( + detail: ISyntaxErrorDetail, + advancedModeOn: boolean, +): ISyntaxErrorDetail { + const offsetDiff = advancedModeOn ? 1 : 2; + const syntaxErrDetail: ISyntaxErrorDetail = { + ...detail, + offset: detail.offset - offsetDiff, + }; + if (detail.end_offset) { + syntaxErrDetail.end_offset = detail.end_offset - offsetDiff; + } + return syntaxErrDetail; +} + +export default removeSyntaxErrBrackets; diff --git a/src/src/utils/roundValue.ts b/src/src/utils/roundValue.ts new file mode 100644 index 00000000..8a90283f --- /dev/null +++ b/src/src/utils/roundValue.ts @@ -0,0 +1,17 @@ +/** + * [Round Value] + * + * The method used instead of toFixed (toFixed - returns string type) + * + * Usage: getRoundedValue(number, digits) + * + * @param {number} value the number which needs to be rounded, + * @param {number} digits the number of digits to appear after the decimal point, + * @returns {number} - formatted number + */ +function getRoundedValue(value: number, digits: number = 10): number { + let roundBy = 10 ** digits; + return Math.round(value * roundBy) / roundBy; +} + +export default getRoundedValue; diff --git a/src/src/utils/saveRecentSearches.ts b/src/src/utils/saveRecentSearches.ts new file mode 100644 index 00000000..a4e814c2 --- /dev/null +++ b/src/src/utils/saveRecentSearches.ts @@ -0,0 +1,35 @@ +import { getItem, setItem } from './storage'; + +/** + * Save last 3 successful searches to local storage + * @param appName - name of the explorer + * @param query - search query + * @example saveRecentSearches("metrics", "(run.active == False) and ((metric.name == "best_loss") or (metric.name == "bleu"))") + * @returns void + */ +function saveRecentSearches(appName: string, query: string): void { + if (query) { + // get recent searches from local storage + const recentSearches = JSON.parse(getItem('recentSearches') || '[]'); + + // find if search already exists + const searchIndex: number = recentSearches.findIndex( + (search: { explorer: string; query: string }) => + search.explorer === appName && search.query === query, + ); + + // skip adding search if it already exists + if (searchIndex !== -1) { + recentSearches.splice(searchIndex, 1); + } else if (recentSearches.length === 3) { + // remove last element if array length is 3 + recentSearches.pop(); + } + // push new search to the start of array + recentSearches.unshift({ explorer: appName, query }); + // save recent searches to local storage + setItem('recentSearches', JSON.stringify(recentSearches)); + } +} + +export default saveRecentSearches; diff --git a/src/src/utils/shortEnglishHumanizer.ts b/src/src/utils/shortEnglishHumanizer.ts new file mode 100644 index 00000000..51acec5f --- /dev/null +++ b/src/src/utils/shortEnglishHumanizer.ts @@ -0,0 +1,23 @@ +import humanizeDuration from 'humanize-duration'; + +const shortEnglishHumanizer = humanizeDuration.humanizer({ + language: 'shortEn', + languages: { + shortEn: { + y: () => 'year', + mo: () => 'mon', + w: () => 'week', + d: () => 'day', + h: () => 'hrs', + m: () => 'min', + s: () => 'sec', + ms: () => 'ms', + }, + }, + units: ['d', 'h', 'm', 's', 'ms'], + spacer: '', + delimiter: ' ', + largest: 2, +}); + +export default shortEnglishHumanizer; diff --git a/src/src/utils/shortenRunPropLabel.ts b/src/src/utils/shortenRunPropLabel.ts new file mode 100644 index 00000000..247920d5 --- /dev/null +++ b/src/src/utils/shortenRunPropLabel.ts @@ -0,0 +1,21 @@ +function shortenRunPropLabel( + text: string, + textWidth: number = 0, + charSize: number = 6, +) { + const maxChars = textWidth / charSize; + const splitVal = text.split('.'); + let isFits = true; + + if (splitVal.length > 2) { + isFits = maxChars >= text.length; + } + return { + shortenValue: isFits + ? text + : `${splitVal[0]}.~.${splitVal[splitVal.length - 1]}`, + isFits, + }; +} + +export default shortenRunPropLabel; diff --git a/src/src/utils/showAutocompletion.ts b/src/src/utils/showAutocompletion.ts new file mode 100644 index 00000000..6d99395f --- /dev/null +++ b/src/src/utils/showAutocompletion.ts @@ -0,0 +1,209 @@ +import _ from 'lodash-es'; + +import { Monaco } from '@monaco-editor/react'; + +import getObjectPaths, { jsValidVariableRegex } from './getObjectPaths'; +import getValue from './helper/getValue/getValue'; + +function showAutocompletion(monaco: Monaco, options: Record) { + // Register object that will return autocomplete items + return monaco?.languages.registerCompletionItemProvider( + 'python', + getSuggestions(monaco, options), + ); +} + +const specialCharactersForWordSplitting = ['(', '=']; + +function getDetailType(detail: any): { + type: string; + hasExampleType: boolean; +} { + const hasExampleType = detail?.hasOwnProperty('__example_type__'); + let type: string = ''; + if (hasExampleType) { + let sliced = detail.__example_type__.slice( + 7, + detail.__example_type__.length - 1, + ); + switch (sliced) { + case "'str'": + type = 'str'; + break; + case "'int'": + type = 'int'; + break; + case "'bool'": + type = 'bool'; + break; + case "'list'": + type = 'list'; + break; + case "'float'": + type = 'float'; + break; + case "'bytes'": + type = 'bytes'; + break; + //TODO: Add datetime type + default: + type = 'unknown'; + break; + } + } else { + switch (typeof detail) { + case 'object': + type = 'dict'; + break; + case 'string': + type = 'str'; + break; + case 'boolean': + type = 'bool'; + break; + case 'number': + type = 'int'; + break; + } + } + return { type, hasExampleType }; +} + +// Helper function to return the monaco completion item type of a thing +function getType(monaco: Monaco, maybe: any, isMember = false) { + switch ((typeof maybe).toLowerCase()) { + case 'object': + return monaco.languages.CompletionItemKind.Class; + + // Now we don't have such autocompletion scenario, + // but we may support showing possible methods with their docstrings in the future + case 'function': + return isMember + ? monaco.languages.CompletionItemKind.Method + : monaco.languages.CompletionItemKind.Function; + default: + return isMember + ? monaco.languages.CompletionItemKind.Property + : monaco.languages.CompletionItemKind.Variable; + } +} + +function getSuggestions(monaco: Monaco, options: Record) { + /* eslint-disable */ + // NOTE: this code segment was taken(modified) from the following git gist + // https://gist.github.com/mwrouse/05d8c11cd3872c19c684bd1904a2202e + return { + //TODO: Maybe support manual trigger such as [Ctrl + Space] + triggerCharacters: ['.'], + + // Function to generate autocompletion results + provideCompletionItems(model: any, position: any) { + // Split everything the user has typed on the current line up at each space, and only look at the last word + const lastChars = model.getValueInRange({ + startLineNumber: position.lineNumber, + startColumn: 1, + endLineNumber: position.lineNumber, + endColumn: position.column, + }); + const words = lastChars.replace('\t', '').split(' '); + let activeTyping: any = _.last(words); // What the user is currently typing (everything after the last space) + + specialCharactersForWordSplitting.forEach((char) => { + if (activeTyping.includes(char)) { + activeTyping = _.last(activeTyping.split(char)); + } + }); + + if (!Object.keys(options).some((key) => activeTyping.startsWith(key))) { + // Here, we are interested only in these cases where the active typing starts + // with one of the first level keys of "options" object. + // For example, the common "options" object for NodeEditor will look like this: + // { context: { user: { id: ..., name: ..., email: ... }, classes: { ... }, ... } } + // In this particular case, we are interested only in the case where activeTyping starts with the word + // "context". In all other cases, we return "null" to force the monaco to fall back to the next suggest provider + // read more about this issue here - https://github.com/microsoft/monaco-editor/issues/2646 + return null; + } + // flatten strings of array of accessible options paths without example type + const filteredOptions = getObjectPaths(options, options).map((option) => { + const indexOf = + option.indexOf('.__example_type__') !== -1 || + option[option.length - 1] === '.' + ? option.indexOf('.__example_type__') + : option.length; + return option.slice(0, indexOf); + }); + // If the last character typed is a period then we need to look at member objects of the `options` object + const isMember = activeTyping.charAt(activeTyping.length - 1) === '.'; + + let isIncluded: boolean = false; + // Array of autocompletion results + const suggestions: any = []; + + //Checking is the word included in options list + for (let option of filteredOptions) { + if ( + option.split(activeTyping)[0] === '' || + (isMember && + option.split(activeTyping.slice(0, activeTyping.length - 2))[0] === + '') + ) { + isIncluded = true; + break; + } + } + // Used for generic handling between member and non-member objects + let lastToken: any = options; + let prefix = activeTyping; + if (isMember && isIncluded) { + // Is a member, get a list of all members, and the prefix + lastToken = getValue(options, prefix.substring(0, prefix.length - 1)); + } + + const word = model.getWordUntilPosition(position); + const range = { + startLineNumber: position.lineNumber, + endLineNumber: position.lineNumber, + startColumn: word.startColumn, + endColumn: word.endColumn, + }; + + // Get all the child properties of the last token + for (const prop in lastToken) { + // Do not show properites that begin with "__" + if (lastToken.hasOwnProperty(prop) && !prop.startsWith('__')) { + // Create completion object + + const key = !jsValidVariableRegex.test(prop) ? `["${prop}"]` : prop; + + let detailType = getDetailType(getValue(options, prefix + key)); + const completionItem = { + label: key, + kind: getType( + monaco, + detailType.hasExampleType ? detailType.type : lastToken[prop], + isMember, + ), + insertText: key, + detail: detailType.type, + range, + }; + // Change insertText for functions + if ( + completionItem.kind === + monaco.languages.CompletionItemKind.Function || + completionItem.kind === monaco.languages.CompletionItemKind.Method + ) { + completionItem.insertText += '('; + } + + // Add to final suggestionss + suggestions.push(completionItem); + } + } + return { suggestions: isIncluded ? suggestions : [] }; + }, + }; +} + +export { showAutocompletion }; diff --git a/src/src/utils/smoothingData.ts b/src/src/utils/smoothingData.ts new file mode 100644 index 00000000..159a806c --- /dev/null +++ b/src/src/utils/smoothingData.ts @@ -0,0 +1,41 @@ +import _ from 'lodash-es'; + +export enum SmoothingAlgorithmEnum { + EMA = 'EXPONENTIAL_MOVING_AVERAGE', + CMA = 'CENTRED_MOVING_AVERAGE', +} + +export function calculateExponentialMovingAverage( + data: number[], + smoothFactor: number, +): number[] { + const smoothedData = data.length ? [data[0]] : []; + for (let i = 1; i < data.length; i++) { + smoothedData.push( + smoothedData[i - 1] * smoothFactor + data[i] * (1 - smoothFactor), + ); + } + return smoothedData; +} + +export function calculateCentralMovingAverage( + data: number[], + smoothFactor: number, +): number[] { + const smoothedData = []; + const len = data.length; + const windowSize = (smoothFactor - 1) / 2; + + for (let i = 0; i < len; i++) { + const start = i - windowSize; + const end = i + windowSize + 1; + const currentWindow = data.slice( + start < 0 ? 0 : start, + end > len + 1 ? len + 1 : end, + ); + const windowAverage = _.sum(currentWindow) / currentWindow.length; + smoothedData.push(windowAverage); + } + + return smoothedData; +} diff --git a/src/src/utils/stopPropagation.ts b/src/src/utils/stopPropagation.ts new file mode 100644 index 00000000..e3206264 --- /dev/null +++ b/src/src/utils/stopPropagation.ts @@ -0,0 +1,11 @@ +/** + * @property {React.ChangeEvent} event - stopping propagate event to parent + */ + +function stopPropagation(event: React.ChangeEvent) { + event.stopPropagation(); +} + +stopPropagation.displayName = 'stopPropagation'; + +export default stopPropagation; diff --git a/src/src/utils/storage.ts b/src/src/utils/storage.ts new file mode 100644 index 00000000..0d87b57f --- /dev/null +++ b/src/src/utils/storage.ts @@ -0,0 +1,25 @@ +export function setItem(key: string, value: any) { + try { + localStorage.setItem(key, value); + } catch (error) {} +} + +export function getItem(key: string) { + try { + return localStorage.getItem(key); + } catch (error) { + return null; + } +} + +export function removeItem(key: string) { + try { + localStorage.removeItem(key); + } catch (error) {} +} + +export function clear() { + try { + localStorage.clear(); + } catch (error) {} +} diff --git a/src/src/utils/store/createSlice.ts b/src/src/utils/store/createSlice.ts new file mode 100644 index 00000000..9daaef33 --- /dev/null +++ b/src/src/utils/store/createSlice.ts @@ -0,0 +1,33 @@ +export type GetState = () => T; + +export type SetState = (state: (state: T) => T) => T; + +export interface SliceMethods { + update: (newValue: Partial) => void; + reset: () => void; +} + +export type StateSelector = (store: TStore) => TState; + +/** + * Creates a zustand store slice with name + */ +function createSlice( + initialState: IState, + generateMethods: (set: SetState, get: GetState) => IMethods, +): (set: SetState, get: GetState) => IState & IMethods { + // @ts-ignore + return ( + set: SetState, + get: GetState, + ): (IState & IMethods) | Record => { + const methods = generateMethods(set, get); + + return { + ...initialState, + ...methods, + }; + }; +} + +export default createSlice; diff --git a/src/src/utils/stringToPath.ts b/src/src/utils/stringToPath.ts new file mode 100644 index 00000000..7b04cd9d --- /dev/null +++ b/src/src/utils/stringToPath.ts @@ -0,0 +1,55 @@ +const charCodeOfDot = '.'.charCodeAt(0); +const reEscapeChar = /\\(\\)?/g; +const firstCaptureGroup = '$1'; +const rePropName = RegExp( + // Match anything that isn't a dot or bracket. + '[^.[\\]]+' + + '|' + + // Or match property names within brackets. + '\\[(?:' + + // Match a non-string expression. + '([^"\'][^[]*)' + + '|' + + // Or match strings (supports escaping characters). + '(["\'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2' + + ')\\]' + + '|' + + // Or match "" as the space between consecutive dots or empty brackets. + '(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))', + 'g', +); + +/** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ +function stringToPath(string: string) { + const result = []; + if (string.charCodeAt(0) === charCodeOfDot) { + result.push(''); + } + string.replace( + rePropName, + ( + match: string, + expression: string, + quote: boolean, + subString: string, + ): string => { + let key = match; + if (quote) { + key = subString.replace(reEscapeChar, firstCaptureGroup); + } else if (expression) { + key = expression.trim(); + } + result.push(key); + return key; + }, + ); + return result; +} + +export default stringToPath; diff --git a/src/src/utils/toFormatData.ts b/src/src/utils/toFormatData.ts new file mode 100644 index 00000000..42532d21 --- /dev/null +++ b/src/src/utils/toFormatData.ts @@ -0,0 +1,21 @@ +export const toTupleData = ( + x: number[], + y: number[], + cb?: (x: number, y: number) => void, +): [number, number][] => { + let tupleData: [number, number][] = []; + for (let i = 0; i < x.length; i++) { + tupleData.push([x[i], y[i]]); + cb?.(x[i], y[i]); + } + return tupleData; +}; + +export const toQuadrupleData = ( + x0: number[], + y0: number[], + x1: number[], + y1: number[], +): [number, number, number, number][] => { + return x0.map((v: number, i: number) => [v, y0[i], x1[i], y1[i]]); +}; diff --git a/src/src/utils/valueToType/valueToType.test.ts b/src/src/utils/valueToType/valueToType.test.ts new file mode 100644 index 00000000..0e07320f --- /dev/null +++ b/src/src/utils/valueToType/valueToType.test.ts @@ -0,0 +1,27 @@ +import { toEqual } from 'tests/utils'; + +import { toType, typeToColor } from './valueToType'; + +describe('[returns value type and gets its color code]', () => { + it('correctly returns value type', () => { + toEqual(toType(5), 'int'); + toEqual(toType(1.2), 'float'); + toEqual(toType(true), 'bool'); + toEqual(toType({}), 'object'); + toEqual(toType([]), 'array'); + toEqual(toType(null), ''); + toEqual(toType(undefined), ''); + toEqual(toType('lorem'), 'string'); + }); + + it('correctly returns color code for a given type', () => { + toEqual(typeToColor(toType(5)), 'rgb(175, 85, 45)'); + toEqual(typeToColor(toType(1.2)), 'rgb(92, 129, 21)'); + toEqual(typeToColor(toType(true)), 'rgb(169, 87, 153)'); + toEqual(typeToColor(toType({})), 'rgb(73, 72, 73)'); + toEqual(typeToColor(toType([])), 'rgb(73, 72, 73)'); + toEqual(typeToColor(toType(null)), 'rgb(148, 148, 148)'); + toEqual(typeToColor(toType(undefined)), 'rgb(148, 148, 148)'); + toEqual(typeToColor(toType('lorem')), 'rgb(246, 103, 30)'); + }); +}); diff --git a/src/src/utils/valueToType/valueToType.ts b/src/src/utils/valueToType/valueToType.ts new file mode 100644 index 00000000..606bb24f --- /dev/null +++ b/src/src/utils/valueToType/valueToType.ts @@ -0,0 +1,39 @@ +// Adapted from react-json-view by Mac Gainor +// License: https://github.com/mac-s-g/react-json-view/blob/master/LICENSE + +import { COLOR_BY_VALUE_TYPE } from 'config/colors/colors'; + +// Returns a string "type" of input object +export function toType(obj: any) { + let type = getType(obj); + if (type === 'number') { + // some extra disambiguation for numbers + if (isNaN(obj)) { + type = 'nan'; + } else if ((obj | 0) !== obj) { + // bitwise OR produces integers + type = 'float'; + } else { + type = 'int'; + } + } else if (type === 'boolean') { + type = 'bool'; + } else if (type === 'undefined' || type === 'null') { + type = ''; + } + + return type; +} + +// Source: http://stackoverflow.com/questions/7390426/better-way-to-get-type-of-a-javascript-variable/7390612#7390612 +function getType(obj: any) { + return ({} as any).toString + .call(obj) + .match(/\s([a-zA-Z]+)/)[1] + .toLowerCase(); +} + +// Returns color code base on value type +export function typeToColor(item: string) { + return COLOR_BY_VALUE_TYPE[item] ?? 'rgb(20, 115, 230)'; +} diff --git a/src/tasks/bundle-analyzer.js b/src/tasks/bundle-analyzer.js new file mode 100644 index 00000000..865c9fa5 --- /dev/null +++ b/src/tasks/bundle-analyzer.js @@ -0,0 +1,27 @@ +// set env mode to production +// to check sizes for production chunked bundles +process.env.NODE_ENV = 'production'; + +// eslint-disable-next-line import/no-extraneous-dependencies +const webpack = require('webpack'); +const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); +const ProgressBarPlugin = require('progress-bar-webpack-plugin'); + +const webpackConfig = require('react-scripts/config/webpack.config')( + 'production', +); + +// optional plugins +webpackConfig.plugins.push(new BundleAnalyzerPlugin()); +webpackConfig.plugins.push( + new ProgressBarPlugin({ + format: `${'analyzing...'} ${'[:bar]'}${'[:percent]'}${'[:elapsed seconds]'} - :msg`, + }), +); + +// run webpack +webpack(webpackConfig, (err, stats) => { + if (err || stats.hasErrors()) { + console.error(err); + } +}); diff --git a/src/tasks/cli/README.md b/src/tasks/cli/README.md new file mode 100644 index 00000000..7ca7d968 --- /dev/null +++ b/src/tasks/cli/README.md @@ -0,0 +1,16 @@ +# aim-ui/cli + +### Supported commands +- create-component + + > $ node cli/index.js create-component `--name=` `--path=` `--lint` + +__NOTES__: + + _Created two scripts inside `ui` project_ + >$ npm run crc-kit -- `` + + Will create a component named `ComponentName` in `./src/components/kit` folder, and will run lint to fix formatting + > $ npm run crc -- `` + + Will create a component named `ComponentName` in `./src/components/` folder, and will run lint to fix formatting diff --git a/src/tasks/cli/commands/createComponent.js b/src/tasks/cli/commands/createComponent.js new file mode 100644 index 00000000..37700649 --- /dev/null +++ b/src/tasks/cli/commands/createComponent.js @@ -0,0 +1,100 @@ +/* eslint-disable no-console */ +// npm run create-component -- --name=ComponentName --path=/path/where/component/shouldBeCreated +// @TODO enhance cli options, to have full support of two styles i.e. --lint, -l, and use yargs config + +const fs = require('fs'); +const { execSync } = require('child_process'); + +const yargs = require('yargs/yargs'); + +const { + getTypesBaseCode, + getStylesBaseCode, + getComponentBaseCode, + getExportsBaseCode, +} = require('../src/componentData'); + +const messages = { + ERROR_NAME: "error: Component's name missing.", + ERROR_PATH: 'error: Wrong Path.', + ERROR_DUPLICATE_NAME: 'error: Component with this name already exists.', + SUCCESS: 'Component Successfully Created!', + LINT_SUCCESS: 'Code Style Successfully formatted!', +}; + +const exitWithMessage = (message) => { + console.error(message); + process.exit(1); +}; + +const getDetails = () => { + let { name, path: folderPath, lint } = yargs(process.argv.slice(2)).argv; + if (!name) { + exitWithMessage(messages.ERROR_NAME); + } + if (!folderPath) { + folderPath = process.env.INIT_CWD; + } + return [name, folderPath, lint]; +}; + +const checkPath = (path) => { + if (!fs.existsSync(path)) { + exitWithMessage(messages.ERROR_PATH); + } +}; + +const createFolder = (path, name) => { + const fullPath = path + '/' + name; + if (!fs.existsSync(fullPath)) { + fs.mkdirSync(fullPath); + } else { + exitWithMessage(messages.ERROR_DUPLICATE_NAME); + } +}; + +const createFiles = (path, name) => { + console.warn('Creating files ...'); + const fullPath = path + '/' + name; + try { + fs.writeFileSync(fullPath + `/${name}.d.ts`, getTypesBaseCode(name)); + fs.writeFileSync(fullPath + `/${name}.scss`, getStylesBaseCode(name)); + fs.writeFileSync( + fullPath + '/' + name + '.tsx', + getComponentBaseCode(name), + ); + fs.writeFileSync(fullPath + '/index.tsx', getExportsBaseCode(name)); + } catch (err) { + exitWithMessage(err); + } +}; + +const lintFix = (name, path) => { + const cmd = `npx eslint ./${name}/*.{ts,tsx} --quiet --fix`; + console.warn('Formatting code style ... '); + console.warn(`Executing $${cmd} ...`); + try { + // execSync(`eslint ${path}/*.{ts,tsx} --quiet --fix`); + execSync(cmd, { + cwd: path, + stdio: 'inherit', + }); + + console.log(messages.LINT_SUCCESS); + } catch (err) { + exitWithMessage("Error - Couldn't fix formatting"); + exitWithMessage(`Original error message - ${err.message}`); + } +}; +const [componentName, folderPath, lint] = getDetails(); + +checkPath(folderPath); +createFolder(folderPath, componentName); +createFiles(folderPath, componentName); + +console.log(messages.SUCCESS); + +// fix lint +if (lint) { + lintFix(componentName, folderPath); +} diff --git a/src/tasks/cli/index.js b/src/tasks/cli/index.js new file mode 100644 index 00000000..837356f9 --- /dev/null +++ b/src/tasks/cli/index.js @@ -0,0 +1,9 @@ +const yargs = require('yargs/yargs'); + +const commands = { + 'create-component': './commands/createComponent', +}; + +const command = yargs(process.argv.slice(2)).argv._[0]; + +require(commands[command]); diff --git a/src/tasks/cli/src/componentData.js b/src/tasks/cli/src/componentData.js new file mode 100644 index 00000000..966d717d --- /dev/null +++ b/src/tasks/cli/src/componentData.js @@ -0,0 +1,53 @@ +const getTypesBaseCode = (name) => ` + export interface I${name}Props { + title: string; + }; +`; + +const getComponentBaseCode = (name) => ` + import React from 'react'; + import { Text } from 'components/kit'; + import { I${name}Props } from './${name}.d'; + + import './${name}.scss'; + + function ${name}({ + title, + }: I${name}Props): React.FunctionComponentElement { + return ( +
+ {title} +
+ ); + } + + ${name}.displayName = '${name}'; + + export default React.memo(${name}); +`; + +const getExportsBaseCode = (name) => ` + import ${name} from './${name}'; + + export * from './${name}.d'; + + export default ${name}; +`; + +const getStylesBaseCode = (name) => { + return `@use 'src/styles/abstracts' as *; + +.${name} { + display: flex; + justify-content: center; + align-items: center; +} + `; +}; + +module.exports = { + getTypesBaseCode, + getStylesBaseCode, + getComponentBaseCode, + getExportsBaseCode, +}; diff --git a/src/tasks/index-html-template-generator.js b/src/tasks/index-html-template-generator.js new file mode 100644 index 00000000..3424e665 --- /dev/null +++ b/src/tasks/index-html-template-generator.js @@ -0,0 +1,14 @@ +const fs = require('fs').promises; + +const buildDirectoryPath = `${__dirname}/../build/`; +const staticFilesKey = '/static-files/'; +const basePathKey = `{{ base_path }}${staticFilesKey}`; + +(async () => { + const HTML = await fs.readFile(`${buildDirectoryPath}index.html`, 'utf8'); + const replacedHTML = HTML.replaceAll(staticFilesKey, basePathKey); + + await fs.writeFile(`${buildDirectoryPath}index-template.html`, replacedHTML); + + console.log('index-template.html file is generated'); +})(); diff --git a/src/tsconfig.json b/src/tsconfig.json new file mode 100644 index 00000000..589c1def --- /dev/null +++ b/src/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": "src", + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "downlevelIteration": true + }, + "include": [ + "src", + "node_modules/immer/src/types/globals.d.ts" + ] +}